texlive[50622] Build/source/utils: asy 2.48 sources

commits+karl at tug.org commits+karl at tug.org
Wed Mar 27 23:27:58 CET 2019


Revision: 50622
          http://tug.org/svn/texlive?view=revision&revision=50622
Author:   karl
Date:     2019-03-27 23:27:57 +0100 (Wed, 27 Mar 2019)
Log Message:
-----------
asy 2.48 sources

Modified Paths:
--------------
    trunk/Build/source/utils/README
    trunk/Build/source/utils/asymptote/ChangeLog
    trunk/Build/source/utils/asymptote/GUI/icons_rc.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/custMatTransform.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/labelTextEditor.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/setCustomAnchor.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addLabel.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addPolyOpt.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_editBezier.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/widgetPointEditor.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/window1.py
    trunk/Build/source/utils/asymptote/Makefile.in
    trunk/Build/source/utils/asymptote/README
    trunk/Build/source/utils/asymptote/ReleaseNotes
    trunk/Build/source/utils/asymptote/TODO
    trunk/Build/source/utils/asymptote/asy-keywords.el
    trunk/Build/source/utils/asymptote/asy.list
    trunk/Build/source/utils/asymptote/asymptote.spec
    trunk/Build/source/utils/asymptote/base/plain_prethree.asy
    trunk/Build/source/utils/asymptote/base/rational.asy
    trunk/Build/source/utils/asymptote/base/rationalSimplex.asy
    trunk/Build/source/utils/asymptote/base/simplex.asy
    trunk/Build/source/utils/asymptote/base/three.asy
    trunk/Build/source/utils/asymptote/base/three_light.asy
    trunk/Build/source/utils/asymptote/base/three_surface.asy
    trunk/Build/source/utils/asymptote/bbox.h
    trunk/Build/source/utils/asymptote/beziercurve.cc
    trunk/Build/source/utils/asymptote/beziercurve.h
    trunk/Build/source/utils/asymptote/bezierpatch.cc
    trunk/Build/source/utils/asymptote/bezierpatch.h
    trunk/Build/source/utils/asymptote/build-scripts/HOWTO-MSWindows
    trunk/Build/source/utils/asymptote/build-scripts/build-asymptote
    trunk/Build/source/utils/asymptote/build-scripts/build-asymptote.dos
    trunk/Build/source/utils/asymptote/camp.tab.cc
    trunk/Build/source/utils/asymptote/camp.tab.h
    trunk/Build/source/utils/asymptote/common.h
    trunk/Build/source/utils/asymptote/config.guess
    trunk/Build/source/utils/asymptote/config.h.in
    trunk/Build/source/utils/asymptote/configure
    trunk/Build/source/utils/asymptote/configure.ac
    trunk/Build/source/utils/asymptote/doc/CAD.pdf
    trunk/Build/source/utils/asymptote/doc/FAQ/asy-faq.info
    trunk/Build/source/utils/asymptote/doc/TeXShopAndAsymptote.pdf
    trunk/Build/source/utils/asymptote/doc/asy-latex.dtx
    trunk/Build/source/utils/asymptote/doc/asy-latex.pdf
    trunk/Build/source/utils/asymptote/doc/asy.1
    trunk/Build/source/utils/asymptote/doc/asyRefCard.pdf
    trunk/Build/source/utils/asymptote/doc/asymptote.pdf
    trunk/Build/source/utils/asymptote/doc/asymptote.sty
    trunk/Build/source/utils/asymptote/doc/asymptote.texi
    trunk/Build/source/utils/asymptote/doc/latexmkrc
    trunk/Build/source/utils/asymptote/doc/png/asymptote.info
    trunk/Build/source/utils/asymptote/drawelement.h
    trunk/Build/source/utils/asymptote/drawfill.cc
    trunk/Build/source/utils/asymptote/drawlabel.cc
    trunk/Build/source/utils/asymptote/drawpath3.cc
    trunk/Build/source/utils/asymptote/drawpath3.h
    trunk/Build/source/utils/asymptote/drawsurface.cc
    trunk/Build/source/utils/asymptote/drawsurface.h
    trunk/Build/source/utils/asymptote/examples/Sierpinski.asy
    trunk/Build/source/utils/asymptote/examples/arrows3.asy
    trunk/Build/source/utils/asymptote/examples/randompath3.asy
    trunk/Build/source/utils/asymptote/examples/threeviews.asy
    trunk/Build/source/utils/asymptote/examples/triangles.asy
    trunk/Build/source/utils/asymptote/fpu.h
    trunk/Build/source/utils/asymptote/glrender.cc
    trunk/Build/source/utils/asymptote/glrender.h
    trunk/Build/source/utils/asymptote/lex.yy.cc
    trunk/Build/source/utils/asymptote/main.cc
    trunk/Build/source/utils/asymptote/memory.h
    trunk/Build/source/utils/asymptote/patches/README
    trunk/Build/source/utils/asymptote/path.cc
    trunk/Build/source/utils/asymptote/path3.cc
    trunk/Build/source/utils/asymptote/pen.cc
    trunk/Build/source/utils/asymptote/pen.h
    trunk/Build/source/utils/asymptote/picture.cc
    trunk/Build/source/utils/asymptote/picture.h
    trunk/Build/source/utils/asymptote/pipestream.cc
    trunk/Build/source/utils/asymptote/process.cc
    trunk/Build/source/utils/asymptote/psfile.h
    trunk/Build/source/utils/asymptote/revision.cc
    trunk/Build/source/utils/asymptote/runarray.cc
    trunk/Build/source/utils/asymptote/runarray.in
    trunk/Build/source/utils/asymptote/runpicture.cc
    trunk/Build/source/utils/asymptote/runpicture.in
    trunk/Build/source/utils/asymptote/settings.cc
    trunk/Build/source/utils/asymptote/settings.h
    trunk/Build/source/utils/asymptote/texfile.cc
    trunk/Build/source/utils/asymptote/texfile.h
    trunk/Build/source/utils/asymptote/tr.cc

Added Paths:
-----------
    trunk/Build/source/utils/asymptote/base/shaders/
    trunk/Build/source/utils/asymptote/base/shaders/fragment.glsl
    trunk/Build/source/utils/asymptote/base/shaders/vertex.glsl
    trunk/Build/source/utils/asymptote/gc-8.0.2.tar.gz
    trunk/Build/source/utils/asymptote/libatomic_ops-7.6.8.tar.gz
    trunk/Build/source/utils/asymptote/material.h
    trunk/Build/source/utils/asymptote/patches/cygwin_freeglut-3.0.0.patch
    trunk/Build/source/utils/asymptote/shaders.cc
    trunk/Build/source/utils/asymptote/shaders.h
    trunk/Build/source/utils/asymptote/webgl/
    trunk/Build/source/utils/asymptote/webgl/WebGLfooter.html
    trunk/Build/source/utils/asymptote/webgl/WebGLheader.html
    trunk/Build/source/utils/asymptote/webgl/arcball-0.01.js
    trunk/Build/source/utils/asymptote/webgl/arcball.js
    trunk/Build/source/utils/asymptote/webgl/gl-0.01.js
    trunk/Build/source/utils/asymptote/webgl/gl-matrix-min-2.3.2.js
    trunk/Build/source/utils/asymptote/webgl/gl.js
    trunk/Build/source/utils/asymptote/webgl/glm-js-min-2.2.2.js

Modified: trunk/Build/source/utils/README
===================================================================
--- trunk/Build/source/utils/README	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/README	2019-03-27 22:27:57 UTC (rev 50622)
@@ -4,7 +4,7 @@
 Extra utilities we (optionally) compile for TeX Live.
 See comments in ../texk/README.
 
-asymptote 2.47 - checked 10jan19
+asymptote 2.48 - checked 27mar19
   update to TL from CTAN, to include prebuilt doc.
   see http://tug.org/texlive/build.html#asymptote
   and tlpkg/bin/tl-update-asy

Modified: trunk/Build/source/utils/asymptote/ChangeLog
===================================================================
--- trunk/Build/source/utils/asymptote/ChangeLog	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/ChangeLog	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1,3 +1,835 @@
+commit 54570f91bb95d024cd1ba37e46593f909edf0c62
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Mar 27 00:35:12 2019 -0600
+
+    Update examples.
+
+commit 7250a9576345bf7c1abac146871a18e1eaf9b06d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Mar 27 00:28:18 2019 -0600
+
+    Fix fuzz usage.
+
+commit cc5346e91bbfa7f81178e04d22d9771157ed189b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Mar 26 22:11:24 2019 -0600
+
+    Apply further workaround for broken MSWindows drivers for Intel GPU.
+
+commit f66446d81dd2aa529ed8eb8a8c164e7f7ad4a478
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Mar 26 20:34:57 2019 -0600
+
+    Fix portability issues.
+
+commit 8f8011e03b60829a75a5aff6fe0348a07cb318ed
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Mar 25 02:27:16 2019 -0600
+
+    Fix Makefile.
+
+commit 78eb88e287cb9e7897146c259920ac3832553612
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Mar 24 15:43:55 2019 -0600
+
+    Support --disable-gc again.
+
+commit fd5b45ad85d63886f3b72540997acb8bf05f99a5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Mar 24 15:30:48 2019 -0600
+
+    Document material buffer sizes.
+
+commit 26a677733ff91348219775e89542c65130cdf200
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Mar 24 15:16:17 2019 -0600
+
+    Reduce number of shader recompilations.
+
+commit 6539c75e327241401bcd532be89250d96179a47b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Mar 24 15:09:55 2019 -0600
+
+    Rename shader files.
+
+commit 1833dcf8a1e8c80c27c64a975a23f9b06278105d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Mar 24 12:22:50 2019 -0600
+
+    Fix lighting and material limits.
+
+commit 92ab2cf7bbf55e16c4e64cf0c67bb5bd12bff3f9
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Mar 23 10:38:42 2019 -0600
+
+    Fix segmentation fault.
+
+commit 5ccc69edaae8b06db323a7db5d4812d89310ed1f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Mar 22 16:43:38 2019 -0600
+
+    Improve example.
+
+commit 6e2f7c547a6a0c634e55f7508b4ea4d5325aab72
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Mar 21 16:52:13 2019 -0600
+
+    Fix bug in f82e7672184f0b0ff91efd57a74a60269cd43ca2: update fuzz-dependent quantities.
+
+commit 4997b77e6d00dda91adef3741574b7bb41e09d87
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Feb 24 11:37:54 2019 -0700
+
+    Simplify code.
+
+commit 1cf5fcb7316084d1d71d12719d75364a0474bc9b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Feb 8 23:15:37 2019 -0700
+
+    Fix deletion of artifical variables; always use Bland's rule.
+
+commit a30061c913e099879a1c5250bc65cd7e718bcbce
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Feb 5 06:36:35 2019 +1100
+
+    Workaround broken MSWindows drivers for Intel GPU.
+
+commit 126a405dccfa51e6c1f1158c2f0084d54013ddc2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Feb 5 06:33:02 2019 +1100
+
+    Fix drawpath3.
+
+commit 649ae913c25ee87dc0ce6226146e063703ddfc9f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Feb 5 02:02:40 2019 +1100
+
+    Place temporary cap on Nmaterials.
+
+commit d306a51bb1732cc420b9f1bdea0bc5a75ce820e5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Feb 3 19:25:24 2019 -0700
+
+    Fix MSDOS configuration.
+
+commit f8f4c113dd5ea56c1a3b47b3ad8926fda1792dd6
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Feb 3 00:26:23 2019 -0700
+
+    Implement maxvertices for working around OpenGL queueing limitations.
+
+commit b644f8df7bf867991fba1b4bfea3460db564affb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Feb 2 12:01:17 2019 -0700
+
+    Simplify code.
+
+commit fe761482993f4c6e0dc22e68a8bb5e8cea553f23
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Feb 2 11:39:15 2019 -0700
+
+    Simplify code.
+
+commit f82e7672184f0b0ff91efd57a74a60269cd43ca2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Jan 27 22:08:40 2019 -0700
+
+    Speed up min, max, minratio, maxratio, and intersection calculations by increasing fuzz as depth decreases.
+
+commit e4283310b3fc84b838f233ee06b0c2b301264cc4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Jan 27 20:45:15 2019 -0700
+
+    Fix Nmaterials.
+
+commit f8cd7d09dd1d3b6a0215338a71909deac4deecc2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Jan 27 14:52:01 2019 -0700
+
+    Clear material buffer before it reaches GL_MAX_UNIFORM_BLOCK_SIZE.
+
+commit 0d057d35cb30d52f33db9f155c880ed8f8a1d7d2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Jan 27 14:49:57 2019 -0700
+
+    Suppress spurious SIGTERM.
+
+commit 8a2f965e64db8d2368abdb9ccd0a176b657b0c76
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 26 21:21:36 2019 -0700
+
+    Restore examples.
+
+commit 2a69ec434b6924ef42b2338563b391e763b13ff0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 26 21:17:54 2019 -0700
+
+    Fix tiling.
+
+commit e7519239b74773e1757acf277df9a4f00c50880a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 26 20:48:41 2019 -0700
+
+    Integrate tesselation into batch drawing routine.
+
+commit 6673503f8b31a7d0ae9d840176d9a5dbe6dc7248
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 26 17:22:40 2019 -0700
+
+    Sort and draw transparent triangles in one batch.
+
+commit 20dd8537d4a48b966c3b81367beaf098e2ce277e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 26 14:13:57 2019 -0700
+
+    Pack explicit shader colors.
+
+commit ce1afeef0b1b6ce824ab81a50c1d3a6679fd5285
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 26 08:51:28 2019 -0700
+
+    Implement material index.
+
+commit 4fd60c4218faca42ae38fab86b50d56a0ff021a0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 23 23:48:50 2019 -0700
+
+    Simplify code.
+
+commit d27ff2af8eabf82418005a24d5f07fffb502355b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 23 23:38:25 2019 -0700
+
+    Remove hard-coded number of lights.
+
+commit a0f18816ee21a814ef8b16e0b0f717c72a37f327
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 23 22:15:21 2019 -0700
+
+    Remove GL_ARB_gpu_shader5 requirement.
+
+commit 786f615ea087e0f542f9697c20ad460d5a0fac5b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 23 20:46:19 2019 -0700
+
+    Downgrade to GLSL 1.30.
+
+commit 8506a29977e9437851759a59087b433a39f1c44a
+Merge: 1eb6fd84 f106987c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 23 19:30:40 2019 -0700
+
+    Merge branch 'master' into gl330.
+
+commit f106987c917bcb2f8b34cfc912fee88112b09bfd
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 23 19:25:23 2019 -0700
+
+    Port to MSDOS.
+
+commit da5f9d09aa48aabc16ac3aa9c3b5c5632805339d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jan 22 20:19:13 2019 -0700
+
+    Require OpenGL 4.30.
+
+commit 1eb6fd84f009dc32af52802d0445a4442a54a709
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jan 22 13:02:50 2019 -0700
+
+    Backport to OpenGL 3.3.
+
+commit a56ab24fb1fd8092bd67aaf03b29763045bfc19e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jan 21 22:35:22 2019 -0700
+
+    Update build-asymptote.dos.
+
+commit 26e6e567dd6a6d56538e76a1bc426f33ed29d20c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jan 21 22:11:51 2019 -0700
+
+    Add CYGWIN freeglut-3.0.0 patch.
+
+commit f66a3427010389d31135ef0e12a2c11f90952c7e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jan 21 21:34:47 2019 -0700
+
+    Install and check for shaders.
+
+commit fdaeeb5d054b9c9faca7718fd5f695c1baeec722
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jan 21 06:40:16 2019 -0700
+
+    Port shader to MSDOS.
+
+commit 8393599bed33a1063411b9eeffb63b91898a468a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jan 21 00:03:42 2019 -0700
+
+    Port to MSDOS.
+
+commit 8b7207a65f759e98d9b6001aab3660e6670099ec
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Jan 20 23:01:52 2019 -0500
+
+    Port to MSDOS.
+
+commit 59d7b37b61e628a9daa33dc9d79a74cceee40193
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 19 10:33:58 2019 -0700
+
+    Check for GLEW library during configuration.
+
+commit 37943204fdbbcefc995d7d6340e0bd17a3681c84
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jan 15 22:45:01 2019 -0700
+
+    More portability fixes.
+
+commit 652fb33c5c603caf77c9003d7badab95398e30dc
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jan 15 21:47:06 2019 -0700
+
+    Require only c++-11.
+
+commit 45edbf3b4a7fcece700576a00f5c46d275154c34
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jan 15 17:51:58 2019 -0700
+
+    Remove unused code.
+
+commit b2b77e004ab3784e6ecc6dbefdeffa50eccb55e3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jan 15 17:40:51 2019 -0700
+
+    Remove unused code.
+
+commit c9a6a08e1821480670fd8748b91f827c87af2e75
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jan 15 17:36:24 2019 -0700
+
+    Remove unused include.
+
+commit 6ee6e8a6640158b7c85da16ea82e852e0fccebc5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jan 15 15:26:45 2019 -0700
+
+    Update asymptote.spec.
+
+commit 9b1407e65518be9e8493dfe1a802b18d3052bfdb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jan 15 13:17:24 2019 -0700
+
+    Update build scripts to Boehm gc 8.0.2.
+
+commit 12b3a085dc52b79da46fa9cd6fb7b843980a4a32
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jan 15 13:14:02 2019 -0700
+
+    Update to Boehm gc 8.0.2.
+
+commit abd3f7616ff00e5cc19fb9ebee0ed7f11d4c4367
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Jan 13 22:00:48 2019 -0700
+
+    Use static attributes.
+
+commit b7c3a5ec50cf30be6edfc87bfafd1815fd7f16f4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Jan 13 21:40:47 2019 -0700
+
+    Fix lighting model. Specify all lights in viewport frame. Remove unused code.
+
+commit a2fb848f5944c8acca7a3425a5c14d1eaf3526fe
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Jan 13 14:50:08 2019 -0700
+
+    Remove dependence on deprecated GLU library.
+
+commit ca9a12aac5107ffb21901569289a4e45fa8ff6c7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Jan 13 11:13:31 2019 -0700
+
+    Implement tesellation (many triangles) in new shader.
+
+commit cf60d572922a9708443683b8ffa610063bbca800
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 12 20:43:02 2019 -0700
+
+    Move lighting code out of setUniforms.
+
+commit 5126dd3e6eb1432ba0b60214b4a26de7f379e69e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 12 19:55:08 2019 -0700
+
+    Simplify code.
+
+commit 16213b13921e57381a87fd2f047c7e1c59458387
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 12 19:41:29 2019 -0700
+
+    Simplify code.
+
+commit c95d3ea1deed86a9b0af8db7b9ff81facab00d4c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 12 19:09:35 2019 -0700
+
+    Remove arbitrary limit on number of lights.
+
+commit 2caa67789a014fd206bc55fab2587be538f739e0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jan 10 21:06:14 2019 -0700
+
+    Fix pixel object.
+
+commit 52267dc8b614bbb8138ae6195efb4ceeba1e2e66
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 9 23:38:04 2019 -0700
+
+    Port pixel to new shader.
+
+commit 8eacd6dc8b15fe1db7d1fb914f80d6887d9a74df
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 9 21:26:13 2019 -0700
+
+    Fix segmentation fault.
+
+commit 626521dbed9479d9db083a0b6671acf8c8418282
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 9 21:16:58 2019 -0700
+
+    Move pixel code to drawpath3.
+
+commit db3a151d0b71d26c7134b604d972b095ff28adfb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 9 20:20:23 2019 -0700
+
+    Delete buffers on clear.
+
+commit 079c558a1f93f6cbff44fe80dfe57b1f4b7e4750
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 9 15:56:48 2019 -0700
+
+    Fix transparency.
+
+commit 9d9a790b03f5f276c5241503f2644942e6bc24b9
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jan 7 21:22:31 2019 -0700
+
+    Remove unused code.
+
+commit 0f58cdd6947cffce536a1aa2a96160baf3ea3aca
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jan 7 21:17:07 2019 -0700
+
+    Simplify code.
+
+commit e26920c6ac62d6f335daae081428ff334a720c4f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jan 7 21:11:49 2019 -0700
+
+    Remove unused code.
+
+commit 1048f4d87638aaca0793bb8a5c20be1cd630de54
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jan 7 20:41:23 2019 -0700
+
+    Simplify code.
+
+commit ddeca77682ea6ef4da0fddbe7295c11e26b5286b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 5 22:53:28 2019 -0700
+
+    Use Phong-Blinn lighting model in shader.
+
+commit 0f43602199fca48d353477504f881acfdb1f426e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 5 22:52:07 2019 -0700
+
+    Update documentation.
+
+commit 29f0d3ccfbbbf8d7b0bc1bf81aa95859593288cf
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 5 16:34:20 2019 -0700
+
+    Remove unused code.
+
+commit 9671ef6f9c6d2ad6f78dc2c0e276fe5012c9509d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jan 4 20:11:00 2019 -0700
+
+    Remove menu due to incompatibility with new shader.
+
+commit d4048f9224de194a6587908b2fb3f01912e0d8ad
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jan 4 18:49:55 2019 -0700
+
+    Port Bezier curves to new shader.
+
+commit e13aa6c6c840e6cd45b2e39dace8bba8528a7714
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jan 4 12:37:38 2019 -0700
+
+    Reinstate sorting of transparent triangles.
+
+commit eb8fe25a71efa3ec8cba807bfd1d30078bdc85c1
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jan 4 08:44:26 2019 -0700
+
+    Update documentation.
+
+commit 28bfc3a3b786de71c0e93069f0d2f3c18d2e7324
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jan 4 07:26:00 2019 -0700
+
+    Fix tiling.
+
+commit 7b1fe1f3f4c173029f1759a5b1c337540e85437f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jan 4 07:00:07 2019 -0700
+
+    Remove remaining GL_MODELVIEW_MATRIX usages.
+
+commit 67873c000568b82a1caa4df5c748dc57bafa878b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jan 3 21:04:43 2019 -0700
+
+    Remove unused code.
+
+commit 6836efe332e30b94c8c41e63899fac3a319a2f16
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jan 3 20:57:21 2019 -0700
+
+    Do camera calculations in double precision.
+
+commit 60d2c0e07174e2050af00236e286bdfac9c191ca
+Merge: 6d6a6535 aa08fb34
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jan 1 21:32:41 2019 -0700
+
+    Merge branch 'master' into glupdate.
+
+commit aa08fb34573824b7fa939cfaeddce802d8990e03
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jan 1 21:27:40 2019 -0700
+
+    Disable experimental offscreen rendering by default due to NVIDIA conflicts.
+
+commit 44f31905cdaafd6cd64d94be4a487eb4d24b401c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 28 02:20:16 2018 -0700
+
+    Fix ghostscript arguments.
+
+commit 60acb54ca61ba808d64aa0e28c1c64c853380083
+Merge: d98f3793 5fb1fecb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 28 01:40:44 2018 -0700
+
+    Merge branch 'master' of github.com:vectorgraphics/asymptote.
+
+commit d98f3793c4df96dcae238312aac889502912872d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 28 01:40:11 2018 -0700
+
+    Implement workaround for Ghostscript transparency extension -dSAFER bug.
+
+commit 5fb1fecb5fa11508c216d2fa39cf4eac247f5254
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Dec 24 16:44:56 2018 -0700
+
+    Add EOL marker.
+
+commit 6d6a65354125d6beef1e7115b4f9127f09ee559c
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Dec 21 15:45:15 2018 -0700
+
+    Fix last commit on struct data.
+
+commit 5655f851d3762a80c559078bba9c9899c37f9c90
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Dec 21 15:44:52 2018 -0700
+
+    Centralize render data exchange.
+
+commit 25ccee4d0fb257c223f786bfd151583a32c1aa2b
+Merge: 25668b72 924bd6b1
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Dec 21 15:15:25 2018 -0700
+
+    Merge branch 'glupdate' of github.com:vectorgraphics/asymptote into glupdate
+
+commit 25668b728a8b77c54fa428fb23ceec106e6c2562
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Dec 21 15:15:21 2018 -0700
+
+    Update modelViewMatrix linkage.
+
+commit 924bd6b1d9586ff8c2ce15a070826c20a1660be4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 21 13:12:43 2018 -0700
+
+    Use standard asy search path to locate shaders.
+
+commit 0a42fbde8f86592dc888ecc58abf37c4c4d3bc3b
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Dec 20 17:03:58 2018 -0700
+
+    Fix ModelView Matrix.
+
+commit d1fbe2c9df2b00d7556309a8fd53866fa75a9e8d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 20 16:15:00 2018 -0700
+
+    Fix dual simplex exit conditions.
+
+commit 32b00922c75c6c4221b58ed91ff50a2f7ae1cbd0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 15 19:10:04 2018 -0700
+
+    Add missing dual argument.
+
+commit 4da31b4727444458a041c36e9e36ad772614b87c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 15 19:09:09 2018 -0700
+
+    Fix phase1=false and dual modes.
+
+commit 634f7476ea373a8dac95c537436fbcf73c7cfdbd
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 15 10:32:46 2018 -0700
+
+    Fix phase1=false optimization. Add support for dual simplex method.
+
+commit 64f568fe2ef00b8873ff06405d708502a6273d19
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 13 20:31:27 2018 -0700
+
+    Improve diagnostics.
+
+commit 3c6736096056c8c26d092c5d71d0987a17b66b41
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 13 15:38:20 2018 -0700
+
+    Fix position of diagnostic.
+
+commit 280d717c9c870cf66f01f324472d2de1424aeeab
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 14 07:52:02 2018 +1100
+
+    Drive artificial variables out of basis.
+
+commit 2113adb6f8ba236eb7ce08d76a464f52e3b3bb3b
+Merge: 494cf1d0 f3da29c7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Dec 4 15:58:18 2018 -0700
+
+    Merge branch 'glupdate' of github.com:vectorgraphics/asymptote into glupdate
+
+commit f3da29c7a4ab507d998fdb2977956ecdb764c22f
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Dec 4 15:49:49 2018 -0700
+
+    Remove glext.h and add GLEW library.
+
+commit ffabb72fdf2df5753e9d60535a9eb13fe23534f8
+Merge: 0dbed3fc 632607db
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sun Dec 2 14:17:53 2018 -0700
+
+    Merge branch 'master' into glupdate.
+
+commit 494cf1d0dc9f567d758377a1dab6f93617d63d10
+Merge: 0dbed3fc c69fb7d6
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Nov 27 14:12:14 2018 -0700
+
+    Merge branch 'master' into glupdate.
+
+commit 0dbed3fc839e868febbecc278ef0d4672aa92314
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Nov 22 17:18:40 2018 -0700
+
+    Reinstate Rotate matrix.
+
+commit c69fb7d6f4f9d058c18996b5fb4c6d9f3212b94c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Nov 14 13:30:52 2018 -0700
+
+    Add pivot diagnostics support in rationalSimplex.asy.
+
+commit 632607db0ce948d3502d75274e8a12014f0e8aa1
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Nov 6 10:46:11 2018 -0700
+
+    Add diagnostics to rationalSimplex; use Bland's rule.
+
+commit 85000d2ee926bae8dbfd79d6b2daa11231fd112f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Nov 4 09:17:42 2018 -0700
+
+    Fix phase1=false for standard-form interface.
+
+commit 4867651a75934de3a664acf4ffe14b34d4ee19e4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Nov 4 00:48:37 2018 -0600
+
+    Update documentation.
+
+commit 8e109fe1136926bc48f81a6ea3f44b96e9602967
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Nov 4 00:46:18 2018 -0600
+
+    Fix and re-enable phase1 optimization; add missing rational operators.
+
+commit 38a59370dc5ac720c29e1424614a10f7384b943f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Oct 3 07:24:39 2018 -0600
+
+    Port to gc-7.6.8.
+
+commit 743dcbd36624b682958c6e6fa5de808b0c871bd7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 27 17:16:32 2018 -0600
+
+    Fix stroke=true bug.
+
+commit 5379d0cec0d774b532bd389c6268711adf2067a5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 27 16:25:36 2018 -0600
+
+    Minor documentation edits.
+
+commit d9ee7b4bfe23f5355f9d62701599af00b242bc79
+Merge: c172ffeb 1b22b181
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 26 08:12:35 2018 -0600
+
+    Merge branch 'master' of github.com:vectorgraphics/asymptote
+
+commit c172ffeb32e1dad161688bac45fd96fe927dafa5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 26 08:12:24 2018 -0600
+
+    Handle zero counts.
+
+commit 1b22b1813f11bb9f9a2a9de7b70ad61eaffd136b
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Sep 12 22:09:19 2018 -0600
+
+    Fix latexmkrc for Windows and add author's name.
+
+commit e86ee4696b6fb87c3e2cb8da76138867da789409
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sat Sep 8 17:39:14 2018 -0600
+
+    Fix latexmkrc URL.
+
+commit c2e37f99ab05001964c0271c9e693ac86fe88f54
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Sep 3 19:42:14 2018 -0600
+
+    Remove transformations from light direction.
+
+commit cf3f4d1e199cd8a9a460f9614446d2675b7fcbbe
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Sep 3 19:20:22 2018 -0600
+
+    Add basic blinn/phong model.
+
+commit c0640d76ee67f3266a2347e5b2f2bf142a4705e3
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Sep 3 16:53:03 2018 -0600
+
+    Pass in material to GLSL.
+
+commit 427ff0d076dbc3f2edd6755d7b667c266a48d35b
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sun Sep 2 19:35:08 2018 -0600
+
+    Add material struct.
+
+commit f52101d84f23e7111fc104f77f4e39213ce3a27c
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sun Sep 2 18:47:27 2018 -0600
+
+    Fix trace ignore.
+
+commit b335d897196d24aaccdde3e99723e8d212c0d356
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sat Sep 1 22:26:17 2018 -0600
+
+    Finally add VAO as a requirement.
+
+commit d2996cbcac12ed9f5299e25f317d968c0c6e2e3e
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sat Sep 1 21:27:38 2018 -0600
+
+    Fix VBO/EBO binding.
+
+commit 1fd9c7d384475bec22098a8e9fac39cb77e43f56
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sat Sep 1 17:16:25 2018 -0600
+
+    Allow for proper buffer data transfer.
+
+commit adbb32fdd380304839cb401c76ea2ab662edfe65
+Merge: 23c4bd2d df015058
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 31 17:57:46 2018 -0600
+
+    Merge branch 'webgl'.
+
+commit df015058a329bc2c50898673fb77ab63cb684239
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 31 17:56:58 2018 -0600
+
+    Rename webgl files.
+
+commit 23c4bd2d53cdc577eeed0cac28d73439eb4f3e84
+Merge: c41bc347 48fc03cf
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 31 17:33:40 2018 -0600
+
+    Merge branch 'webgl'.
+
+commit c41bc347ba6303190d0f5293507640eff7cc7a62
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 31 17:28:21 2018 -0600
+
+    Create index.html
+
+commit 48fc03cf2cd9bb8d12de45fdc414daf9dc1e0ca0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 31 17:20:41 2018 -0600
+
+    Add WebGL files.
+
+commit a08121dc7deeda1a1cd3cbacbe52f95deba69ce0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 31 12:23:44 2018 -0600
+
+    Work around dvisvgm bound box lower threshold.
+
+commit fd66ec5e916f1c750ef7cfa7c40fda372fd1ab53
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Aug 30 17:50:24 2018 -0600
+
+    Make rotation use glm::matx.
+
+commit 28ea1444cbe53b6e8be16597cb424f76b8a7d131
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Aug 30 00:35:00 2018 -0600
+
+    Get basic shader working.
+
+commit 1753e2fcf110add939514c4a743b7612045827bc
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jul 31 00:47:07 2018 +0200
+
+    Increment version to 2.48.
+
 commit 67f0c4b2d24adc346d7b616b13298903433c5910
 Author: John Bowman <bowman at ualberta.ca>
 Date:   Mon Jul 30 23:23:47 2018 +0200

Modified: trunk/Build/source/utils/asymptote/GUI/icons_rc.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/icons_rc.py	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/GUI/icons_rc.py	2019-03-27 22:27:57 UTC (rev 50622)
@@ -2,7 +2,7 @@
 
 # Resource object code
 #
-# Created by: The Resource Compiler for PyQt5 (Qt v5.10.1)
+# Created by: The Resource Compiler for PyQt5 (Qt v5.11.3)
 #
 # WARNING! All changes made in this file will be lost!
 
@@ -9,8 +9,55 @@
 from PyQt5 import QtCore
 
 qt_resource_data = b"\
-\x00\x00\x04\x10\
+\x00\x00\x02\xc9\
 \x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
+\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
+\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
+\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
+\x0a\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\
+\x3d\x22\x34\x38\x30\x2c\x32\x35\x36\x20\x33\x38\x34\x2c\x31\x36\
+\x30\x20\x33\x38\x34\x2c\x32\x33\x36\x20\x32\x37\x36\x2c\x32\x33\
+\x36\x20\x32\x37\x36\x2c\x31\x32\x38\x20\x33\x35\x32\x2c\x31\x32\
+\x38\x20\x32\x35\x36\x2c\x33\x32\x20\x31\x36\x30\x2c\x31\x32\x38\
+\x20\x32\x33\x36\x2c\x31\x32\x38\x20\x32\x33\x36\x2c\x32\x33\x36\
+\x20\x31\x32\x38\x2c\x32\x33\x36\x20\x31\x32\x38\x2c\x31\x36\x30\
+\x20\x33\x32\x2c\x32\x35\x36\x20\x31\x32\x38\x2c\x33\x35\x32\x20\
+\x0d\x0a\x09\x31\x32\x38\x2c\x32\x37\x36\x20\x32\x33\x36\x2c\x32\
+\x37\x36\x20\x32\x33\x36\x2c\x33\x38\x34\x20\x31\x36\x30\x2c\x33\
+\x38\x34\x20\x32\x35\x36\x2c\x34\x38\x30\x20\x33\x35\x32\x2c\x33\
+\x38\x34\x20\x32\x37\x35\x2e\x38\x2c\x33\x38\x34\x20\x32\x37\x35\
+\x2e\x34\x2c\x32\x37\x35\x2e\x35\x20\x33\x38\x34\x2c\x32\x37\x35\
+\x2e\x38\x20\x33\x38\x34\x2c\x33\x35\x32\x20\x22\x2f\x3e\x0d\x0a\
+\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x03\x65\
+\x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
 \x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
 \x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
@@ -51,37 +98,68 @@
 \x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\
 \x36\x34\x20\x36\x35\x2e\x37\x38\x34\x34\x20\x36\x33\x2e\x32\x33\
 \x33\x33\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\
-\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x20\x2d\x30\x4c\x20\x38\x2e\
-\x36\x35\x37\x33\x34\x20\x30\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\
-\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\
-\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\
-\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\
-\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\
-\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\
-\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\
-\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x31\
-\x2e\x35\x30\x35\x36\x32\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\
-\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\
-\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\
-\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x35\x2e\x37\x38\x34\
-\x34\x20\x36\x33\x2e\x32\x33\x33\x33\x29\x27\x3e\x0a\x3c\x70\x61\
-\x74\x68\x20\x64\x3d\x27\x4d\x20\x30\x20\x38\x2e\x36\x35\x37\x33\
-\x34\x4c\x20\x30\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x27\x20\x66\
-\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\
-\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\
-\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\
-\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\
-\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\
-\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\
-\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\
-\x64\x74\x68\x3d\x27\x31\x2e\x35\x30\x35\x36\x32\x27\x2f\x3e\x0a\
-\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
-\x00\x00\x02\xc9\
+\x20\x34\x2e\x33\x32\x38\x36\x37\x20\x30\x43\x20\x34\x2e\x33\x32\
+\x38\x36\x37\x20\x2d\x32\x2e\x33\x39\x30\x36\x36\x20\x32\x2e\x33\
+\x39\x30\x36\x36\x20\x2d\x34\x2e\x33\x32\x38\x36\x37\x20\x30\x20\
+\x2d\x34\x2e\x33\x32\x38\x36\x37\x43\x20\x2d\x32\x2e\x33\x39\x30\
+\x36\x36\x20\x2d\x34\x2e\x33\x32\x38\x36\x37\x20\x2d\x34\x2e\x33\
+\x32\x38\x36\x37\x20\x2d\x32\x2e\x33\x39\x30\x36\x36\x20\x2d\x34\
+\x2e\x33\x32\x38\x36\x37\x20\x2d\x30\x43\x20\x2d\x34\x2e\x33\x32\
+\x38\x36\x37\x20\x32\x2e\x33\x39\x30\x36\x36\x20\x2d\x32\x2e\x33\
+\x39\x30\x36\x36\x20\x34\x2e\x33\x32\x38\x36\x37\x20\x30\x20\x34\
+\x2e\x33\x32\x38\x36\x37\x43\x20\x32\x2e\x33\x39\x30\x36\x36\x20\
+\x34\x2e\x33\x32\x38\x36\x37\x20\x34\x2e\x33\x32\x38\x36\x37\x20\
+\x32\x2e\x33\x39\x30\x36\x36\x20\x34\x2e\x33\x32\x38\x36\x37\x20\
+\x30\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\
+\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\
+\x73\x76\x67\x3e\
+\x00\x00\x02\x6c\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
 \x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
 \x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x53\x61\x76\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\
+\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\
+\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
+\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\
+\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\
+\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\x61\
+\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\
+\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x78\
+\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
+\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\
+\x31\x35\x2e\x31\x37\x33\x2c\x32\x48\x34\x43\x32\x2e\x38\x39\x39\
+\x2c\x32\x2c\x32\x2c\x32\x2e\x39\x2c\x32\x2c\x34\x76\x31\x32\x63\
+\x30\x2c\x31\x2e\x31\x2c\x30\x2e\x38\x39\x39\x2c\x32\x2c\x32\x2c\
+\x32\x68\x31\x32\x63\x31\x2e\x31\x30\x31\x2c\x30\x2c\x32\x2d\x30\
+\x2e\x39\x2c\x32\x2d\x32\x56\x35\x2e\x31\x32\x37\x4c\x31\x35\x2e\
+\x31\x37\x33\x2c\x32\x7a\x20\x4d\x31\x34\x2c\x38\x63\x30\x2c\x30\
+\x2e\x35\x34\x39\x2d\x30\x2e\x34\x35\x2c\x31\x2d\x31\x2c\x31\x48\
+\x37\x0d\x0a\x09\x43\x36\x2e\x34\x35\x2c\x39\x2c\x36\x2c\x38\x2e\
+\x35\x34\x39\x2c\x36\x2c\x38\x56\x33\x68\x38\x56\x38\x7a\x20\x4d\
+\x31\x33\x2c\x34\x68\x2d\x32\x76\x34\x68\x32\x56\x34\x7a\x22\x2f\
+\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x03\x52\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
 \x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
 \x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
 \x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
@@ -103,33 +181,42 @@
 \x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
 \x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
 \x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
-\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
-\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
-\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
-\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
-\x0a\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\
-\x3d\x22\x34\x38\x30\x2c\x32\x35\x36\x20\x33\x38\x34\x2c\x31\x36\
-\x30\x20\x33\x38\x34\x2c\x32\x33\x36\x20\x32\x37\x36\x2c\x32\x33\
-\x36\x20\x32\x37\x36\x2c\x31\x32\x38\x20\x33\x35\x32\x2c\x31\x32\
-\x38\x20\x32\x35\x36\x2c\x33\x32\x20\x31\x36\x30\x2c\x31\x32\x38\
-\x20\x32\x33\x36\x2c\x31\x32\x38\x20\x32\x33\x36\x2c\x32\x33\x36\
-\x20\x31\x32\x38\x2c\x32\x33\x36\x20\x31\x32\x38\x2c\x31\x36\x30\
-\x20\x33\x32\x2c\x32\x35\x36\x20\x31\x32\x38\x2c\x33\x35\x32\x20\
-\x0d\x0a\x09\x31\x32\x38\x2c\x32\x37\x36\x20\x32\x33\x36\x2c\x32\
-\x37\x36\x20\x32\x33\x36\x2c\x33\x38\x34\x20\x31\x36\x30\x2c\x33\
-\x38\x34\x20\x32\x35\x36\x2c\x34\x38\x30\x20\x33\x35\x32\x2c\x33\
-\x38\x34\x20\x32\x37\x35\x2e\x38\x2c\x33\x38\x34\x20\x32\x37\x35\
-\x2e\x34\x2c\x32\x37\x35\x2e\x35\x20\x33\x38\x34\x2c\x32\x37\x35\
-\x2e\x38\x20\x33\x38\x34\x2c\x33\x35\x32\x20\x22\x2f\x3e\x0d\x0a\
-\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x03\x93\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\
+\x64\x3d\x22\x4d\x34\x33\x37\x2e\x33\x33\x34\x2c\x31\x34\x34\x48\
+\x32\x35\x36\x2e\x30\x30\x36\x6c\x2d\x34\x32\x2e\x36\x36\x38\x2d\
+\x34\x38\x48\x37\x34\x2e\x36\x36\x36\x43\x35\x31\x2e\x31\x39\x37\
+\x2c\x39\x36\x2c\x33\x32\x2c\x31\x31\x35\x2e\x31\x39\x38\x2c\x33\
+\x32\x2c\x31\x33\x38\x2e\x36\x36\x37\x76\x32\x33\x34\x2e\x36\x36\
+\x36\x43\x33\x32\x2c\x33\x39\x36\x2e\x38\x30\x32\x2c\x35\x31\x2e\
+\x31\x39\x37\x2c\x34\x31\x36\x2c\x37\x34\x2e\x36\x36\x36\x2c\x34\
+\x31\x36\x68\x33\x36\x32\x2e\x36\x36\x38\x0d\x0a\x09\x43\x34\x36\
+\x30\x2e\x38\x30\x33\x2c\x34\x31\x36\x2c\x34\x38\x30\x2c\x33\x39\
+\x36\x2e\x38\x30\x32\x2c\x34\x38\x30\x2c\x33\x37\x33\x2e\x33\x33\
+\x33\x56\x31\x38\x36\x2e\x36\x36\x37\x43\x34\x38\x30\x2c\x31\x36\
+\x33\x2e\x31\x39\x38\x2c\x34\x36\x30\x2e\x38\x30\x33\x2c\x31\x34\
+\x34\x2c\x34\x33\x37\x2e\x33\x33\x34\x2c\x31\x34\x34\x7a\x20\x4d\
+\x34\x34\x38\x2c\x33\x37\x33\x2e\x33\x33\x33\x0d\x0a\x09\x63\x30\
+\x2c\x35\x2e\x37\x38\x32\x2d\x34\x2e\x38\x38\x35\x2c\x31\x30\x2e\
+\x36\x36\x37\x2d\x31\x30\x2e\x36\x36\x36\x2c\x31\x30\x2e\x36\x36\
+\x37\x48\x37\x34\x2e\x36\x36\x36\x43\x36\x38\x2e\x38\x38\x34\x2c\
+\x33\x38\x34\x2c\x36\x34\x2c\x33\x37\x39\x2e\x31\x31\x35\x2c\x36\
+\x34\x2c\x33\x37\x33\x2e\x33\x33\x33\x56\x31\x37\x36\x68\x33\x37\
+\x33\x2e\x33\x33\x34\x63\x35\x2e\x37\x38\x31\x2c\x30\x2c\x31\x30\
+\x2e\x36\x36\x36\x2c\x34\x2e\x38\x38\x35\x2c\x31\x30\x2e\x36\x36\
+\x36\x2c\x31\x30\x2e\x36\x36\x37\x0d\x0a\x09\x56\x33\x37\x33\x2e\
+\x33\x33\x33\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
+\x0a\
+\x00\x00\x03\x22\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
 \x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
 \x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
 \x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
 \x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
 \x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
@@ -141,49 +228,42 @@
 \x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
 \x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
 \x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4d\x61\x67\x6e\x69\x66\x79\x69\x6e\x67\x5f\x67\x6c\x61\
-\x73\x73\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
-\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
-\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
-\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
-\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x79\x3d\x22\
-\x30\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\
-\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\x61\x62\x6c\x65\x2d\
-\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\
-\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x78\x6d\x6c\x3a\x73\
-\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\
-\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x37\x2e\x35\
-\x34\x35\x2c\x31\x35\x2e\x34\x36\x37\x6c\x2d\x33\x2e\x37\x37\x39\
-\x2d\x33\x2e\x37\x37\x39\x63\x30\x2e\x35\x37\x2d\x30\x2e\x39\x33\
-\x35\x2c\x30\x2e\x38\x39\x38\x2d\x32\x2e\x30\x33\x35\x2c\x30\x2e\
-\x38\x39\x38\x2d\x33\x2e\x32\x31\x63\x30\x2d\x33\x2e\x34\x31\x37\
-\x2d\x32\x2e\x39\x36\x31\x2d\x36\x2e\x33\x37\x37\x2d\x36\x2e\x33\
-\x37\x38\x2d\x36\x2e\x33\x37\x37\x0d\x0a\x09\x43\x34\x2e\x38\x36\
-\x39\x2c\x32\x2e\x31\x2c\x32\x2e\x31\x2c\x34\x2e\x38\x37\x2c\x32\
-\x2e\x31\x2c\x38\x2e\x32\x38\x37\x63\x30\x2c\x33\x2e\x34\x31\x36\
-\x2c\x32\x2e\x39\x36\x31\x2c\x36\x2e\x33\x37\x37\x2c\x36\x2e\x33\
-\x37\x37\x2c\x36\x2e\x33\x37\x37\x63\x31\x2e\x31\x33\x37\x2c\x30\
-\x2c\x32\x2e\x32\x2d\x30\x2e\x33\x30\x39\x2c\x33\x2e\x31\x31\x35\
-\x2d\x30\x2e\x38\x34\x34\x6c\x33\x2e\x37\x39\x39\x2c\x33\x2e\x38\
-\x30\x31\x0d\x0a\x09\x63\x30\x2e\x33\x37\x32\x2c\x30\x2e\x33\x37\
-\x31\x2c\x30\x2e\x39\x37\x35\x2c\x30\x2e\x33\x37\x31\x2c\x31\x2e\
-\x33\x34\x36\x2c\x30\x6c\x30\x2e\x39\x34\x33\x2d\x30\x2e\x39\x34\
-\x33\x43\x31\x38\x2e\x30\x35\x31\x2c\x31\x36\x2e\x33\x30\x37\x2c\
-\x31\x37\x2e\x39\x31\x36\x2c\x31\x35\x2e\x38\x33\x38\x2c\x31\x37\
-\x2e\x35\x34\x35\x2c\x31\x35\x2e\x34\x36\x37\x7a\x20\x4d\x34\x2e\
-\x30\x30\x34\x2c\x38\x2e\x32\x38\x37\x0d\x0a\x09\x63\x30\x2d\x32\
-\x2e\x33\x36\x36\x2c\x31\x2e\x39\x31\x37\x2d\x34\x2e\x32\x38\x33\
-\x2c\x34\x2e\x32\x38\x32\x2d\x34\x2e\x32\x38\x33\x63\x32\x2e\x33\
-\x36\x36\x2c\x30\x2c\x34\x2e\x34\x37\x34\x2c\x32\x2e\x31\x30\x37\
-\x2c\x34\x2e\x34\x37\x34\x2c\x34\x2e\x34\x37\x34\x63\x30\x2c\x32\
-\x2e\x33\x36\x35\x2d\x31\x2e\x39\x31\x38\x2c\x34\x2e\x32\x38\x33\
-\x2d\x34\x2e\x32\x38\x33\x2c\x34\x2e\x32\x38\x33\x0d\x0a\x09\x43\
-\x36\x2e\x31\x31\x31\x2c\x31\x32\x2e\x37\x36\x2c\x34\x2e\x30\x30\
-\x34\x2c\x31\x30\x2e\x36\x35\x32\x2c\x34\x2e\x30\x30\x34\x2c\x38\
-\x2e\x32\x38\x37\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\
-\x0d\x0a\
-\x00\x00\x03\x46\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
+\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x22\x32\x35\x36\x22\
+\x20\x63\x79\x3d\x22\x32\x38\x30\x22\x20\x72\x3d\x22\x36\x33\x22\
+\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\
+\x34\x30\x2c\x39\x36\x68\x2d\x38\x38\x6c\x2d\x33\x32\x2d\x33\x32\
+\x48\x31\x39\x32\x6c\x2d\x33\x32\x2c\x33\x32\x48\x37\x32\x63\x2d\
+\x32\x32\x2e\x30\x39\x32\x2c\x30\x2d\x34\x30\x2c\x31\x37\x2e\x39\
+\x30\x38\x2d\x34\x30\x2c\x34\x30\x76\x32\x37\x32\x63\x30\x2c\x32\
+\x32\x2e\x30\x39\x32\x2c\x31\x37\x2e\x39\x30\x38\x2c\x34\x30\x2c\
+\x34\x30\x2c\x34\x30\x68\x33\x36\x38\x63\x32\x32\x2e\x30\x39\x32\
+\x2c\x30\x2c\x34\x30\x2d\x31\x37\x2e\x39\x30\x38\x2c\x34\x30\x2d\
+\x34\x30\x0d\x0a\x09\x09\x56\x31\x33\x36\x43\x34\x38\x30\x2c\x31\
+\x31\x33\x2e\x39\x30\x38\x2c\x34\x36\x32\x2e\x30\x39\x32\x2c\x39\
+\x36\x2c\x34\x34\x30\x2c\x39\x36\x7a\x20\x4d\x32\x35\x36\x2c\x33\
+\x39\x32\x63\x2d\x36\x31\x2e\x38\x35\x35\x2c\x30\x2d\x31\x31\x32\
+\x2d\x35\x30\x2e\x31\x34\x35\x2d\x31\x31\x32\x2d\x31\x31\x32\x73\
+\x35\x30\x2e\x31\x34\x35\x2d\x31\x31\x32\x2c\x31\x31\x32\x2d\x31\
+\x31\x32\x73\x31\x31\x32\x2c\x35\x30\x2e\x31\x34\x35\x2c\x31\x31\
+\x32\x2c\x31\x31\x32\x0d\x0a\x09\x09\x53\x33\x31\x37\x2e\x38\x35\
+\x35\x2c\x33\x39\x32\x2c\x32\x35\x36\x2c\x33\x39\x32\x7a\x22\x2f\
+\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
+\x0a\
+\x00\x00\x05\x27\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
@@ -210,51 +290,115 @@
 \x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
 \x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
 \x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
-\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
-\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
-\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
-\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
-\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x33\x37\x2e\x35\
-\x2c\x33\x38\x36\x2e\x36\x4c\x33\x30\x36\x2e\x39\x2c\x32\x35\x36\
-\x6c\x31\x33\x30\x2e\x36\x2d\x31\x33\x30\x2e\x36\x63\x31\x34\x2e\
-\x31\x2d\x31\x34\x2e\x31\x2c\x31\x34\x2e\x31\x2d\x33\x36\x2e\x38\
-\x2c\x30\x2d\x35\x30\x2e\x39\x63\x2d\x31\x34\x2e\x31\x2d\x31\x34\
-\x2e\x31\x2d\x33\x36\x2e\x38\x2d\x31\x34\x2e\x31\x2d\x35\x30\x2e\
-\x39\x2c\x30\x4c\x32\x35\x36\x2c\x32\x30\x35\x2e\x31\x4c\x31\x32\
-\x35\x2e\x34\x2c\x37\x34\x2e\x35\x0d\x0a\x09\x63\x2d\x31\x34\x2e\
-\x31\x2d\x31\x34\x2e\x31\x2d\x33\x36\x2e\x38\x2d\x31\x34\x2e\x31\
-\x2d\x35\x30\x2e\x39\x2c\x30\x63\x2d\x31\x34\x2e\x31\x2c\x31\x34\
-\x2e\x31\x2d\x31\x34\x2e\x31\x2c\x33\x36\x2e\x38\x2c\x30\x2c\x35\
-\x30\x2e\x39\x4c\x32\x30\x35\x2e\x31\x2c\x32\x35\x36\x4c\x37\x34\
-\x2e\x35\x2c\x33\x38\x36\x2e\x36\x63\x2d\x31\x34\x2e\x31\x2c\x31\
-\x34\x2e\x31\x2d\x31\x34\x2e\x31\x2c\x33\x36\x2e\x38\x2c\x30\x2c\
-\x35\x30\x2e\x39\x0d\x0a\x09\x63\x31\x34\x2e\x31\x2c\x31\x34\x2e\
-\x31\x2c\x33\x36\x2e\x38\x2c\x31\x34\x2e\x31\x2c\x35\x30\x2e\x39\
-\x2c\x30\x4c\x32\x35\x36\x2c\x33\x30\x36\x2e\x39\x6c\x31\x33\x30\
-\x2e\x36\x2c\x31\x33\x30\x2e\x36\x63\x31\x34\x2e\x31\x2c\x31\x34\
-\x2e\x31\x2c\x33\x36\x2e\x38\x2c\x31\x34\x2e\x31\x2c\x35\x30\x2e\
-\x39\x2c\x30\x43\x34\x35\x31\x2e\x35\x2c\x34\x32\x33\x2e\x34\x2c\
-\x34\x35\x31\x2e\x35\x2c\x34\x30\x30\x2e\x36\x2c\x34\x33\x37\x2e\
-\x35\x2c\x33\x38\x36\x2e\x36\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\
-\x76\x67\x3e\x0d\x0a\
-\x00\x00\x00\xdd\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x5f\x31\x32\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\
+\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\
+\x35\x36\x2c\x36\x34\x43\x31\x35\x30\x2e\x34\x30\x31\x2c\x36\x34\
+\x2c\x36\x34\x2c\x31\x35\x30\x2e\x34\x30\x31\x2c\x36\x34\x2c\x32\
+\x35\x36\x63\x30\x2c\x31\x30\x35\x2e\x36\x30\x34\x2c\x38\x36\x2e\
+\x34\x30\x31\x2c\x31\x39\x32\x2c\x31\x39\x32\x2c\x31\x39\x32\x63\
+\x31\x38\x2e\x31\x33\x36\x2c\x30\x2c\x33\x32\x2d\x31\x33\x2e\x38\
+\x36\x34\x2c\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\x09\x63\x30\x2d\
+\x38\x2e\x35\x33\x31\x2d\x33\x2e\x31\x39\x38\x2d\x31\x36\x2d\x38\
+\x2e\x35\x33\x31\x2d\x32\x31\x2e\x33\x33\x33\x63\x2d\x35\x2e\x33\
+\x33\x33\x2d\x35\x2e\x33\x33\x34\x2d\x38\x2e\x35\x33\x31\x2d\x31\
+\x32\x2e\x38\x30\x33\x2d\x38\x2e\x35\x33\x31\x2d\x32\x31\x2e\x33\
+\x33\x34\x63\x30\x2d\x31\x38\x2e\x31\x33\x35\x2c\x31\x33\x2e\x38\
+\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x68\x33\x38\x2e\x33\
+\x39\x36\x0d\x0a\x09\x09\x09\x63\x35\x38\x2e\x36\x36\x37\x2c\x30\
+\x2c\x31\x30\x36\x2e\x36\x36\x37\x2d\x34\x38\x2c\x31\x30\x36\x2e\
+\x36\x36\x37\x2d\x31\x30\x36\x2e\x36\x36\x36\x43\x34\x34\x38\x2c\
+\x31\x34\x30\x2e\x38\x30\x32\x2c\x33\x36\x31\x2e\x36\x30\x34\x2c\
+\x36\x34\x2c\x32\x35\x36\x2c\x36\x34\x7a\x20\x4d\x31\x33\x38\x2e\
+\x36\x36\x37\x2c\x32\x35\x36\x63\x2d\x31\x38\x2e\x31\x33\x36\x2c\
+\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x34\x2d\x33\x32\x2d\x33\
+\x32\x73\x31\x33\x2e\x38\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\
+\x32\x0d\x0a\x09\x09\x09\x63\x31\x38\x2e\x31\x33\x35\x2c\x30\x2c\
+\x33\x32\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x53\
+\x31\x35\x36\x2e\x38\x30\x32\x2c\x32\x35\x36\x2c\x31\x33\x38\x2e\
+\x36\x36\x37\x2c\x32\x35\x36\x7a\x20\x4d\x32\x30\x32\x2e\x36\x36\
+\x37\x2c\x31\x37\x30\x2e\x36\x36\x37\x63\x2d\x31\x38\x2e\x31\x33\
+\x36\x2c\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x35\x2d\x33\x32\
+\x2d\x33\x32\x63\x30\x2d\x31\x38\x2e\x31\x33\x36\x2c\x31\x33\x2e\
+\x38\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\
+\x09\x63\x31\x38\x2e\x31\x33\x35\x2c\x30\x2c\x33\x32\x2c\x31\x33\
+\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x43\x32\x33\x34\x2e\x36\
+\x36\x37\x2c\x31\x35\x36\x2e\x38\x30\x32\x2c\x32\x32\x30\x2e\x38\
+\x30\x32\x2c\x31\x37\x30\x2e\x36\x36\x37\x2c\x32\x30\x32\x2e\x36\
+\x36\x37\x2c\x31\x37\x30\x2e\x36\x36\x37\x7a\x20\x4d\x33\x30\x39\
+\x2e\x33\x33\x33\x2c\x31\x37\x30\x2e\x36\x36\x37\x63\x2d\x31\x38\
+\x2e\x31\x33\x35\x2c\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x35\
+\x2d\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\x09\x63\x30\x2d\x31\x38\
+\x2e\x31\x33\x36\x2c\x31\x33\x2e\x38\x36\x35\x2d\x33\x32\x2c\x33\
+\x32\x2d\x33\x32\x63\x31\x38\x2e\x31\x33\x36\x2c\x30\x2c\x33\x32\
+\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x43\x33\x34\
+\x31\x2e\x33\x33\x33\x2c\x31\x35\x36\x2e\x38\x30\x32\x2c\x33\x32\
+\x37\x2e\x34\x36\x39\x2c\x31\x37\x30\x2e\x36\x36\x37\x2c\x33\x30\
+\x39\x2e\x33\x33\x33\x2c\x31\x37\x30\x2e\x36\x36\x37\x7a\x20\x4d\
+\x33\x37\x33\x2e\x33\x33\x33\x2c\x32\x35\x36\x0d\x0a\x09\x09\x09\
+\x63\x2d\x31\x38\x2e\x31\x33\x35\x2c\x30\x2d\x33\x32\x2d\x31\x33\
+\x2e\x38\x36\x34\x2d\x33\x32\x2d\x33\x32\x73\x31\x33\x2e\x38\x36\
+\x35\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x63\x31\x38\x2e\x31\x33\
+\x36\x2c\x30\x2c\x33\x32\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\
+\x2c\x33\x32\x53\x33\x39\x31\x2e\x34\x36\x39\x2c\x32\x35\x36\x2c\
+\x33\x37\x33\x2e\x33\x33\x33\x2c\x32\x35\x36\x7a\x22\x2f\x3e\x0d\
+\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
+\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x02\xfc\
 \x3c\
-\x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
-\x30\x2f\x73\x76\x67\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x38\x22\
-\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x38\x22\x20\x76\x69\x65\x77\
-\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x38\x20\x38\x22\x3e\x0a\x20\
-\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x30\x20\x30\x76\x32\
-\x68\x2e\x35\x63\x30\x2d\x2e\x35\x35\x2e\x34\x35\x2d\x31\x20\x31\
-\x2d\x31\x68\x31\x2e\x35\x76\x35\x2e\x35\x63\x30\x20\x2e\x32\x38\
-\x2d\x2e\x32\x32\x2e\x35\x2d\x2e\x35\x2e\x35\x68\x2d\x2e\x35\x76\
-\x31\x68\x34\x76\x2d\x31\x68\x2d\x2e\x35\x63\x2d\x2e\x32\x38\x20\
-\x30\x2d\x2e\x35\x2d\x2e\x32\x32\x2d\x2e\x35\x2d\x2e\x35\x76\x2d\
-\x35\x2e\x35\x68\x31\x2e\x35\x63\x2e\x35\x35\x20\x30\x20\x31\x20\
-\x2e\x34\x35\x20\x31\x20\x31\x68\x2e\x35\x76\x2d\x32\x68\x2d\x38\
-\x7a\x22\x20\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
-\x00\x00\x02\x7f\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x5f\x32\x30\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\
+\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\
+\x35\x36\x2c\x34\x38\x43\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\
+\x2c\x34\x38\x2c\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\x2c\x32\
+\x35\x36\x73\x39\x33\x2e\x36\x30\x31\x2c\x32\x30\x38\x2c\x32\x30\
+\x38\x2c\x32\x30\x38\x73\x32\x30\x38\x2d\x39\x33\x2e\x36\x30\x31\
+\x2c\x32\x30\x38\x2d\x32\x30\x38\x53\x33\x37\x30\x2e\x33\x39\x39\
+\x2c\x34\x38\x2c\x32\x35\x36\x2c\x34\x38\x7a\x20\x4d\x32\x35\x36\
+\x2c\x34\x32\x32\x2e\x33\x39\x39\x0d\x0a\x09\x09\x09\x63\x2d\x39\
+\x31\x2e\x35\x31\x38\x2c\x30\x2d\x31\x36\x36\x2e\x33\x39\x39\x2d\
+\x37\x34\x2e\x38\x38\x32\x2d\x31\x36\x36\x2e\x33\x39\x39\x2d\x31\
+\x36\x36\x2e\x33\x39\x39\x53\x31\x36\x34\x2e\x34\x38\x32\x2c\x38\
+\x39\x2e\x36\x2c\x32\x35\x36\x2c\x38\x39\x2e\x36\x53\x34\x32\x32\
+\x2e\x34\x2c\x31\x36\x34\x2e\x34\x38\x32\x2c\x34\x32\x32\x2e\x34\
+\x2c\x32\x35\x36\x53\x33\x34\x37\x2e\x35\x31\x38\x2c\x34\x32\x32\
+\x2e\x33\x39\x39\x2c\x32\x35\x36\x2c\x34\x32\x32\x2e\x33\x39\x39\
+\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\
+\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x03\x46\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
@@ -286,85 +430,108 @@
 \x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
 \x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
 \x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
-\x0a\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\
-\x3d\x22\x32\x38\x38\x2c\x39\x36\x20\x33\x33\x37\x2e\x39\x2c\x31\
-\x34\x35\x2e\x39\x20\x32\x37\x34\x2c\x32\x30\x39\x2e\x37\x20\x32\
-\x37\x34\x2c\x32\x30\x39\x2e\x37\x20\x31\x34\x35\x2e\x39\x2c\x33\
-\x33\x37\x2e\x39\x20\x39\x36\x2c\x32\x38\x38\x20\x39\x36\x2c\x34\
-\x31\x36\x20\x32\x32\x34\x2c\x34\x31\x36\x20\x31\x37\x34\x2e\x31\
-\x2c\x33\x36\x36\x2e\x31\x20\x33\x35\x37\x2e\x34\x2c\x31\x38\x32\
-\x2e\x39\x20\x33\x36\x36\x2e\x31\x2c\x31\x37\x34\x2e\x31\x20\x0d\
-\x0a\x09\x34\x31\x36\x2c\x32\x32\x34\x20\x34\x31\x36\x2c\x39\x36\
-\x20\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x04\x22\
+\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x33\x37\x2e\x35\
+\x2c\x33\x38\x36\x2e\x36\x4c\x33\x30\x36\x2e\x39\x2c\x32\x35\x36\
+\x6c\x31\x33\x30\x2e\x36\x2d\x31\x33\x30\x2e\x36\x63\x31\x34\x2e\
+\x31\x2d\x31\x34\x2e\x31\x2c\x31\x34\x2e\x31\x2d\x33\x36\x2e\x38\
+\x2c\x30\x2d\x35\x30\x2e\x39\x63\x2d\x31\x34\x2e\x31\x2d\x31\x34\
+\x2e\x31\x2d\x33\x36\x2e\x38\x2d\x31\x34\x2e\x31\x2d\x35\x30\x2e\
+\x39\x2c\x30\x4c\x32\x35\x36\x2c\x32\x30\x35\x2e\x31\x4c\x31\x32\
+\x35\x2e\x34\x2c\x37\x34\x2e\x35\x0d\x0a\x09\x63\x2d\x31\x34\x2e\
+\x31\x2d\x31\x34\x2e\x31\x2d\x33\x36\x2e\x38\x2d\x31\x34\x2e\x31\
+\x2d\x35\x30\x2e\x39\x2c\x30\x63\x2d\x31\x34\x2e\x31\x2c\x31\x34\
+\x2e\x31\x2d\x31\x34\x2e\x31\x2c\x33\x36\x2e\x38\x2c\x30\x2c\x35\
+\x30\x2e\x39\x4c\x32\x30\x35\x2e\x31\x2c\x32\x35\x36\x4c\x37\x34\
+\x2e\x35\x2c\x33\x38\x36\x2e\x36\x63\x2d\x31\x34\x2e\x31\x2c\x31\
+\x34\x2e\x31\x2d\x31\x34\x2e\x31\x2c\x33\x36\x2e\x38\x2c\x30\x2c\
+\x35\x30\x2e\x39\x0d\x0a\x09\x63\x31\x34\x2e\x31\x2c\x31\x34\x2e\
+\x31\x2c\x33\x36\x2e\x38\x2c\x31\x34\x2e\x31\x2c\x35\x30\x2e\x39\
+\x2c\x30\x4c\x32\x35\x36\x2c\x33\x30\x36\x2e\x39\x6c\x31\x33\x30\
+\x2e\x36\x2c\x31\x33\x30\x2e\x36\x63\x31\x34\x2e\x31\x2c\x31\x34\
+\x2e\x31\x2c\x33\x36\x2e\x38\x2c\x31\x34\x2e\x31\x2c\x35\x30\x2e\
+\x39\x2c\x30\x43\x34\x35\x31\x2e\x35\x2c\x34\x32\x33\x2e\x34\x2c\
+\x34\x35\x31\x2e\x35\x2c\x34\x30\x30\x2e\x36\x2c\x34\x33\x37\x2e\
+\x35\x2c\x33\x38\x36\x2e\x36\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\
+\x76\x67\x3e\x0d\x0a\
+\x00\x00\x04\xca\
 \x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
-\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
-\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
-\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
-\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
-\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
-\x74\x3d\x27\x32\x34\x70\x74\x27\x20\x76\x65\x72\x73\x69\x6f\x6e\
-\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x27\
-\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\x38\x33\x20\
-\x32\x34\x20\x32\x34\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x32\x34\
-\x70\x74\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
-\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
-\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
-\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
-\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\
-\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
-\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
-\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
-\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\
-\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x2d\x39\x2e\x33\x39\
-\x31\x31\x38\x20\x2d\x30\x4c\x20\x2d\x36\x2e\x36\x34\x30\x35\x37\
-\x20\x2d\x31\x32\x2e\x30\x34\x35\x4c\x20\x38\x2e\x36\x37\x36\x33\
-\x32\x20\x2d\x36\x2e\x35\x31\x38\x37\x31\x4c\x20\x33\x2e\x33\x32\
-\x30\x32\x38\x20\x36\x2e\x30\x32\x32\x35\x27\x20\x66\x69\x6c\x6c\
-\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\
-\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\
-\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\
-\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\
-\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\
-\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\
-\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\
-\x3d\x27\x31\x2e\x37\x35\x36\x35\x36\x27\x2f\x3e\x0a\x3c\x2f\x67\
-\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
-\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
-\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
-\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\
-\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x2d\x39\x2e\x33\
-\x39\x31\x31\x38\x27\x20\x63\x79\x3d\x27\x2d\x30\x27\x20\x72\x3d\
-\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\
-\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
-\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
-\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\
-\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\
-\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\x3c\x63\
-\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x2d\x36\x2e\x36\x34\x30\
-\x35\x37\x27\x20\x63\x79\x3d\x27\x2d\x31\x32\x2e\x30\x34\x35\x27\
-\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\
-\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\
-\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\
-\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\
-\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\
-\x2e\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\
-\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x38\x2e\x36\
-\x37\x36\x33\x32\x27\x20\x63\x79\x3d\x27\x2d\x36\x2e\x35\x31\x38\
-\x37\x31\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\
-\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\
-\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\
-\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\
-\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\
-\x20\x36\x38\x2e\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\
-\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\
-\x33\x2e\x33\x32\x30\x32\x38\x27\x20\x63\x79\x3d\x27\x36\x2e\x30\
-\x32\x32\x35\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\
-\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\
-\x3e\x0a\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\
-\x3e\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\
+\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\
+\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x39\x2e\x32\x2e\x31\x2c\x20\
+\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\
+\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\
+\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\
+\x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\
+\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\
+\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\
+\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\
+\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\
+\x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\
+\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x09\x20\x69\x64\x3d\
+\x22\x73\x76\x67\x34\x36\x31\x39\x22\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x39\x31\
+\x2b\x64\x65\x76\x65\x6c\x2b\x6f\x73\x78\x6d\x65\x6e\x75\x20\x72\
+\x31\x32\x39\x31\x31\x22\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
+\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x74\x72\x69\x61\x6e\x67\x6c\
+\x65\x2d\x73\x74\x72\x6f\x6b\x65\x64\x2d\x31\x35\x2e\x73\x76\x67\
+\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x63\x72\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\
+\x6e\x73\x2e\x6f\x72\x67\x2f\x6e\x73\x23\x22\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\
+\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\
+\x73\x2f\x31\x2e\x31\x2f\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
+\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\
+\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\x6e\x6b\x73\x63\
+\x61\x70\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\
+\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\x22\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\x68\x74\x74\
+\x70\x3a\x2f\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\x73\x6f\x75\
+\x72\x63\x65\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\x44\x54\x44\
+\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\x74\x64\x22\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\
+\x30\x30\x2f\x73\x76\x67\x22\x0a\x09\x20\x78\x6d\x6c\x6e\x73\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\
+\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\
+\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\
+\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\
+\x79\x3d\x22\x30\x70\x78\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x31\
+\x35\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x35\x70\
+\x78\x22\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\
+\x30\x20\x31\x35\x20\x31\x35\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\
+\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\x31\x35\x20\x31\x35\x3b\
+\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\
+\x73\x65\x72\x76\x65\x22\x3e\x0a\x3c\x70\x61\x74\x68\x20\x69\x64\
+\x3d\x22\x72\x65\x63\x74\x33\x33\x33\x38\x22\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\
+\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x20\x73\x6f\x64\
+\x69\x70\x6f\x64\x69\x3a\x6e\x6f\x64\x65\x74\x79\x70\x65\x73\x3d\
+\x22\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x22\x20\x64\
+\x3d\x22\x4d\x37\x2e\x35\x32\x34\x33\x2c\x31\x2e\x35\x30\x30\x34\
+\x0a\x09\x43\x37\x2e\x32\x34\x32\x39\x2c\x31\x2e\x34\x39\x31\x33\
+\x2c\x36\x2e\x39\x37\x38\x37\x2c\x31\x2e\x36\x34\x32\x33\x2c\x36\
+\x2e\x38\x33\x33\x36\x2c\x31\x2e\x38\x39\x35\x32\x6c\x2d\x35\x2e\
+\x35\x2c\x39\x2e\x38\x36\x39\x32\x43\x31\x2e\x30\x32\x31\x38\x2c\
+\x31\x32\x2e\x33\x30\x37\x38\x2c\x31\x2e\x33\x39\x35\x2c\x31\x32\
+\x2e\x39\x39\x39\x39\x2c\x32\x2c\x31\x33\x68\x31\x31\x0a\x09\x63\
+\x30\x2e\x36\x30\x35\x2d\x30\x2e\x30\x30\x30\x31\x2c\x30\x2e\x39\
+\x37\x38\x32\x2d\x30\x2e\x36\x39\x32\x32\x2c\x30\x2e\x36\x36\x36\
+\x34\x2d\x31\x2e\x32\x33\x35\x35\x6c\x2d\x35\x2e\x35\x2d\x39\x2e\
+\x38\x36\x39\x32\x43\x38\x2e\x30\x33\x30\x32\x2c\x31\x2e\x36\x35\
+\x37\x39\x2c\x37\x2e\x37\x38\x38\x34\x2c\x31\x2e\x35\x30\x39\x32\
+\x2c\x37\x2e\x35\x32\x34\x33\x2c\x31\x2e\x35\x30\x30\x34\x7a\x20\
+\x4d\x37\x2e\x35\x2c\x33\x2e\x38\x39\x39\x33\x6c\x34\x2e\x31\x32\
+\x36\x37\x2c\x37\x2e\x34\x37\x30\x34\x0a\x09\x48\x33\x2e\x33\x37\
+\x33\x33\x4c\x37\x2e\x35\x2c\x33\x2e\x38\x39\x39\x33\x7a\x22\x2f\
+\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
 \x00\x00\x03\xb5\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
@@ -427,12 +594,75 @@
 \x35\x2e\x33\x38\x35\x2c\x31\x38\x2e\x33\x35\x34\x2c\x31\x30\x2c\
 \x31\x38\x2e\x33\x35\x34\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\
 \x67\x3e\x0d\x0a\
-\x00\x00\x02\x79\
+\x00\x00\x03\xc4\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
 \x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
 \x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x43\x68\x65\x76\x72\x6f\x6e\x5f\x63\x69\x72\x63\x6c\x65\
+\x64\x5f\x6c\x65\x66\x74\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\
+\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\
+\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
+\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\
+\x6c\x69\x6e\x6b\x22\x0d\x0a\x09\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\x61\
+\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\
+\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x78\
+\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
+\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\
+\x31\x31\x2e\x33\x30\x32\x2c\x36\x2e\x37\x37\x36\x63\x2d\x30\x2e\
+\x31\x39\x36\x2d\x30\x2e\x31\x39\x37\x2d\x30\x2e\x35\x31\x35\x2d\
+\x30\x2e\x31\x39\x37\x2d\x30\x2e\x37\x31\x2c\x30\x4c\x37\x2e\x37\
+\x38\x35\x2c\x39\x2e\x36\x34\x31\x63\x2d\x30\x2e\x31\x39\x36\x2c\
+\x30\x2e\x31\x39\x39\x2d\x30\x2e\x31\x39\x36\x2c\x30\x2e\x35\x32\
+\x2c\x30\x2c\x30\x2e\x37\x31\x37\x6c\x32\x2e\x38\x30\x37\x2c\x32\
+\x2e\x38\x36\x34\x0d\x0a\x09\x63\x30\x2e\x31\x39\x35\x2c\x30\x2e\
+\x31\x39\x39\x2c\x30\x2e\x35\x31\x34\x2c\x30\x2e\x31\x39\x38\x2c\
+\x30\x2e\x37\x31\x2c\x30\x63\x30\x2e\x31\x39\x36\x2d\x30\x2e\x31\
+\x39\x37\x2c\x30\x2e\x31\x39\x36\x2d\x30\x2e\x35\x31\x38\x2c\x30\
+\x2d\x30\x2e\x37\x31\x37\x4c\x39\x2c\x31\x30\x6c\x32\x2e\x33\x30\
+\x32\x2d\x32\x2e\x35\x30\x36\x43\x31\x31\x2e\x34\x39\x38\x2c\x37\
+\x2e\x32\x39\x36\x2c\x31\x31\x2e\x34\x39\x38\x2c\x36\x2e\x39\x37\
+\x36\x2c\x31\x31\x2e\x33\x30\x32\x2c\x36\x2e\x37\x37\x36\x7a\x0d\
+\x0a\x09\x20\x4d\x31\x30\x2c\x30\x2e\x34\x63\x2d\x35\x2e\x33\x30\
+\x32\x2c\x30\x2d\x39\x2e\x36\x2c\x34\x2e\x32\x39\x38\x2d\x39\x2e\
+\x36\x2c\x39\x2e\x36\x63\x30\x2c\x35\x2e\x33\x30\x33\x2c\x34\x2e\
+\x32\x39\x38\x2c\x39\x2e\x36\x2c\x39\x2e\x36\x2c\x39\x2e\x36\x73\
+\x39\x2e\x36\x2d\x34\x2e\x32\x39\x37\x2c\x39\x2e\x36\x2d\x39\x2e\
+\x36\x43\x31\x39\x2e\x36\x2c\x34\x2e\x36\x39\x38\x2c\x31\x35\x2e\
+\x33\x30\x32\x2c\x30\x2e\x34\x2c\x31\x30\x2c\x30\x2e\x34\x7a\x20\
+\x4d\x31\x30\x2c\x31\x38\x2e\x33\x35\x34\x0d\x0a\x09\x63\x2d\x34\
+\x2e\x36\x31\x35\x2c\x30\x2d\x38\x2e\x33\x35\x34\x2d\x33\x2e\x37\
+\x34\x2d\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\x30\x2d\
+\x34\x2e\x36\x31\x34\x2c\x33\x2e\x37\x33\x39\x2d\x38\x2e\x33\x35\
+\x34\x2c\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\x34\x2e\
+\x36\x31\x33\x2c\x30\x2c\x38\x2e\x33\x35\x34\x2c\x33\x2e\x37\x34\
+\x2c\x38\x2e\x33\x35\x34\x2c\x38\x2e\x33\x35\x34\x0d\x0a\x09\x43\
+\x31\x38\x2e\x33\x35\x34\x2c\x31\x34\x2e\x36\x31\x34\x2c\x31\x34\
+\x2e\x36\x31\x33\x2c\x31\x38\x2e\x33\x35\x34\x2c\x31\x30\x2c\x31\
+\x38\x2e\x33\x35\x34\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\
+\x3e\x0d\x0a\
+\x00\x00\x05\xca\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
 \x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
 \x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
 \x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
@@ -458,17 +688,285 @@
 \x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
 \x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
 \x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x5f\x31\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
-\x0d\x0a\x09\x09\x3c\x67\x3e\x0d\x0a\x09\x09\x09\x3c\x70\x6f\x6c\
-\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\x22\x31\x38\x36\
-\x2e\x33\x30\x31\x2c\x33\x33\x39\x2e\x38\x39\x33\x20\x39\x36\x2c\
-\x32\x34\x39\x2e\x34\x36\x31\x20\x36\x34\x2c\x32\x37\x39\x2e\x39\
-\x36\x38\x20\x31\x38\x36\x2e\x33\x30\x31\x2c\x34\x30\x32\x20\x34\
-\x34\x38\x2c\x31\x34\x30\x2e\x35\x30\x36\x20\x34\x31\x36\x2c\x31\
-\x31\x30\x20\x09\x09\x09\x22\x2f\x3e\x0d\x0a\x09\x09\x3c\x2f\x67\
-\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\
-\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\
+\x64\x3d\x22\x4d\x34\x35\x30\x2e\x36\x37\x39\x2c\x32\x37\x33\x2e\
+\x35\x63\x2d\x31\x34\x2e\x35\x38\x35\x2d\x31\x34\x2e\x35\x37\x37\
+\x2d\x33\x36\x2e\x30\x35\x34\x2d\x31\x35\x2e\x38\x39\x2d\x35\x30\
+\x2e\x36\x33\x39\x2d\x31\x2e\x33\x31\x32\x6c\x2d\x34\x31\x2e\x36\
+\x38\x37\x2c\x34\x31\x2e\x36\x36\x34\x63\x2d\x31\x30\x2e\x38\x35\
+\x32\x2c\x31\x30\x2e\x38\x33\x36\x2d\x32\x33\x2e\x39\x33\x2c\x31\
+\x30\x2e\x38\x35\x39\x2d\x33\x31\x2e\x35\x36\x34\x2c\x31\x2e\x38\
+\x35\x32\x0d\x0a\x09\x63\x2d\x35\x2e\x30\x35\x37\x2d\x35\x2e\x39\
+\x36\x38\x2d\x33\x2e\x30\x36\x31\x2d\x32\x34\x2e\x33\x37\x34\x2d\
+\x31\x2e\x36\x34\x34\x2d\x33\x36\x2e\x30\x34\x39\x6c\x32\x30\x2e\
+\x39\x30\x37\x2d\x31\x37\x31\x2e\x38\x34\x39\x63\x31\x2e\x38\x36\
+\x37\x2d\x31\x35\x2e\x33\x35\x33\x2d\x39\x2e\x30\x37\x2d\x33\x30\
+\x2e\x31\x38\x35\x2d\x32\x34\x2e\x34\x33\x2d\x33\x32\x2e\x30\x35\
+\x31\x0d\x0a\x09\x63\x2d\x31\x35\x2e\x33\x35\x38\x2d\x31\x2e\x38\
+\x36\x37\x2d\x32\x39\x2e\x33\x32\x32\x2c\x39\x2e\x39\x33\x39\x2d\
+\x33\x31\x2e\x31\x39\x31\x2c\x32\x35\x2e\x32\x38\x39\x4c\x32\x36\
+\x37\x2e\x33\x37\x2c\x32\x33\x36\x2e\x30\x32\x31\x63\x2d\x31\x2e\
+\x32\x30\x35\x2c\x33\x2e\x33\x35\x38\x2d\x33\x2e\x37\x39\x2c\x33\
+\x2e\x39\x33\x38\x2d\x34\x2e\x30\x38\x31\x2d\x30\x2e\x35\x38\x32\
+\x4c\x32\x35\x35\x2e\x34\x34\x2c\x36\x30\x0d\x0a\x09\x63\x30\x2d\
+\x31\x35\x2e\x34\x36\x35\x2d\x31\x32\x2e\x35\x34\x32\x2d\x32\x38\
+\x2d\x32\x38\x2e\x30\x31\x34\x2d\x32\x38\x63\x2d\x31\x35\x2e\x34\
+\x37\x33\x2c\x30\x2d\x32\x38\x2e\x30\x31\x35\x2c\x31\x32\x2e\x35\
+\x33\x35\x2d\x32\x38\x2e\x30\x31\x35\x2c\x32\x38\x6c\x2d\x30\x2e\
+\x35\x35\x32\x2c\x31\x37\x36\x2e\x37\x35\x32\x63\x30\x2e\x31\x34\
+\x36\x2c\x32\x2e\x30\x34\x2d\x31\x2e\x36\x30\x34\x2c\x32\x2e\x36\
+\x32\x34\x2d\x31\x2e\x39\x32\x2c\x30\x2e\x32\x39\x34\x4c\x31\x37\
+\x32\x2e\x30\x31\x36\x2c\x39\x39\x2e\x30\x37\x37\x0d\x0a\x09\x63\
+\x2d\x32\x2e\x37\x35\x2d\x31\x35\x2e\x32\x31\x39\x2d\x31\x37\x2e\
+\x33\x32\x33\x2d\x32\x36\x2e\x32\x30\x33\x2d\x33\x32\x2e\x35\x34\
+\x38\x2d\x32\x33\x2e\x34\x35\x33\x63\x2d\x31\x35\x2e\x32\x32\x37\
+\x2c\x32\x2e\x37\x34\x38\x2d\x32\x35\x2e\x33\x33\x39\x2c\x31\x38\
+\x2e\x31\x38\x37\x2d\x32\x32\x2e\x35\x39\x31\x2c\x33\x33\x2e\x34\
+\x30\x33\x6c\x32\x32\x2e\x31\x39\x33\x2c\x31\x36\x31\x2e\x34\x35\
+\x35\x0d\x0a\x09\x63\x30\x2e\x30\x32\x33\x2c\x32\x2e\x38\x37\x32\
+\x2d\x30\x2e\x39\x34\x31\x2c\x34\x2e\x35\x31\x33\x2d\x32\x2e\x33\
+\x30\x38\x2c\x30\x2e\x38\x33\x31\x6c\x2d\x33\x33\x2e\x31\x30\x39\
+\x2d\x38\x38\x2e\x35\x31\x37\x63\x2d\x35\x2e\x31\x38\x2d\x31\x34\
+\x2e\x35\x37\x32\x2d\x32\x31\x2e\x31\x39\x36\x2d\x32\x33\x2e\x30\
+\x36\x35\x2d\x33\x35\x2e\x37\x37\x36\x2d\x31\x37\x2e\x38\x38\x39\
+\x0d\x0a\x09\x63\x2d\x31\x34\x2e\x35\x37\x39\x2c\x35\x2e\x31\x37\
+\x37\x2d\x32\x32\x2e\x32\x30\x31\x2c\x32\x32\x2e\x30\x36\x31\x2d\
+\x31\x37\x2e\x30\x32\x33\x2c\x33\x36\x2e\x36\x33\x31\x6c\x35\x38\
+\x2e\x30\x34\x32\x2c\x31\x38\x39\x2e\x36\x32\x35\x63\x30\x2e\x33\
+\x30\x33\x2c\x31\x2e\x30\x34\x36\x2c\x30\x2e\x36\x32\x34\x2c\x32\
+\x2e\x30\x38\x35\x2c\x30\x2e\x39\x35\x33\x2c\x33\x2e\x31\x31\x38\
+\x6c\x30\x2e\x31\x32\x31\x2c\x30\x2e\x33\x39\x0d\x0a\x09\x63\x30\
+\x2e\x30\x31\x31\x2c\x30\x2e\x30\x33\x31\x2c\x30\x2e\x30\x32\x35\
+\x2c\x30\x2e\x30\x35\x38\x2c\x30\x2e\x30\x33\x35\x2c\x30\x2e\x30\
+\x38\x38\x43\x31\x32\x36\x2e\x30\x37\x39\x2c\x34\x34\x34\x2e\x32\
+\x33\x33\x2c\x31\x37\x32\x2e\x35\x37\x2c\x34\x38\x30\x2c\x32\x32\
+\x37\x2e\x34\x32\x37\x2c\x34\x38\x30\x63\x33\x35\x2e\x31\x31\x36\
+\x2c\x30\x2c\x37\x31\x2e\x35\x39\x31\x2d\x31\x32\x2e\x33\x37\x38\
+\x2c\x39\x39\x2e\x33\x35\x37\x2d\x33\x33\x2e\x36\x37\x32\x0d\x0a\
+\x09\x63\x30\x2e\x30\x30\x31\x2c\x30\x2c\x30\x2e\x30\x30\x33\x2d\
+\x30\x2e\x30\x30\x32\x2c\x30\x2e\x30\x30\x33\x2d\x30\x2e\x30\x30\
+\x32\x63\x32\x39\x2e\x39\x39\x2d\x31\x38\x2e\x30\x35\x31\x2c\x31\
+\x32\x36\x2e\x30\x37\x31\x2d\x31\x32\x31\x2e\x33\x34\x37\x2c\x31\
+\x32\x36\x2e\x30\x37\x31\x2d\x31\x32\x31\x2e\x33\x34\x37\x43\x34\
+\x36\x37\x2e\x34\x34\x35\x2c\x33\x31\x30\x2e\x34\x30\x32\x2c\x34\
+\x36\x35\x2e\x32\x36\x36\x2c\x32\x38\x38\x2e\x30\x38\x2c\x34\x35\
+\x30\x2e\x36\x37\x39\x2c\x32\x37\x33\x2e\x35\x7a\x22\x2f\x3e\x0d\
+\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x03\x26\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x33\x38\
+\x38\x63\x2d\x37\x32\x2e\x35\x39\x37\x2c\x30\x2d\x31\x33\x32\x2d\
+\x35\x39\x2e\x34\x30\x35\x2d\x31\x33\x32\x2d\x31\x33\x32\x63\x30\
+\x2d\x37\x32\x2e\x36\x30\x31\x2c\x35\x39\x2e\x34\x30\x33\x2d\x31\
+\x33\x32\x2c\x31\x33\x32\x2d\x31\x33\x32\x63\x33\x36\x2e\x33\x2c\
+\x30\x2c\x36\x39\x2e\x32\x39\x39\x2c\x31\x35\x2e\x34\x2c\x39\x32\
+\x2e\x34\x30\x36\x2c\x33\x39\x2e\x36\x30\x31\x4c\x32\x37\x38\x2c\
+\x32\x33\x34\x68\x31\x35\x34\x56\x38\x30\x0d\x0a\x09\x09\x6c\x2d\
+\x35\x31\x2e\x36\x39\x38\x2c\x35\x31\x2e\x37\x30\x32\x43\x33\x34\
+\x38\x2e\x34\x30\x36\x2c\x39\x39\x2e\x37\x39\x38\x2c\x33\x30\x34\
+\x2e\x34\x30\x36\x2c\x38\x30\x2c\x32\x35\x36\x2c\x38\x30\x63\x2d\
+\x39\x36\x2e\x37\x39\x37\x2c\x30\x2d\x31\x37\x36\x2c\x37\x39\x2e\
+\x32\x30\x33\x2d\x31\x37\x36\x2c\x31\x37\x36\x73\x37\x38\x2e\x30\
+\x39\x34\x2c\x31\x37\x36\x2c\x31\x37\x36\x2c\x31\x37\x36\x0d\x0a\
+\x09\x09\x63\x38\x31\x2e\x30\x34\x35\x2c\x30\x2c\x31\x34\x38\x2e\
+\x32\x38\x37\x2d\x35\x34\x2e\x31\x33\x34\x2c\x31\x36\x39\x2e\x34\
+\x30\x31\x2d\x31\x32\x38\x48\x33\x37\x38\x2e\x38\x35\x43\x33\x36\
+\x30\x2e\x31\x30\x35\x2c\x33\x35\x33\x2e\x35\x36\x31\x2c\x33\x31\
+\x31\x2e\x37\x31\x32\x2c\x33\x38\x38\x2c\x32\x35\x36\x2c\x33\x38\
+\x38\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\
+\x76\x67\x3e\x0d\x0a\
+\x00\x00\x04\xbd\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
+\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
+\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
+\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
+\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
+\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
+\x74\x3d\x27\x32\x34\x70\x74\x27\x20\x76\x65\x72\x73\x69\x6f\x6e\
+\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x27\
+\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\x38\x33\x20\
+\x32\x34\x20\x32\x34\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x32\x34\
+\x70\x74\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
+\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
+\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
+\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\
+\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
+\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
+\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
+\x37\x36\x35\x35\x20\x36\x39\x2e\x37\x36\x38\x38\x29\x27\x3e\x0a\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x2d\x39\x2e\x33\x39\
+\x31\x31\x38\x20\x2d\x30\x43\x20\x2d\x39\x2e\x39\x36\x38\x36\x31\
+\x20\x2d\x33\x2e\x38\x33\x30\x30\x34\x20\x2d\x38\x2e\x35\x35\x37\
+\x30\x36\x20\x2d\x37\x2e\x35\x31\x39\x34\x34\x20\x2d\x36\x2e\x36\
+\x34\x30\x35\x37\x20\x2d\x31\x30\x2e\x32\x31\x37\x31\x43\x20\x2d\
+\x30\x2e\x34\x39\x31\x30\x38\x39\x20\x2d\x31\x38\x2e\x38\x37\x33\
+\x33\x20\x38\x2e\x33\x35\x36\x37\x36\x20\x2d\x31\x35\x2e\x31\x39\
+\x30\x36\x20\x38\x2e\x36\x37\x36\x33\x32\x20\x2d\x35\x2e\x35\x32\
+\x39\x34\x38\x43\x20\x38\x2e\x38\x33\x36\x20\x2d\x30\x2e\x37\x30\
+\x32\x30\x30\x38\x20\x36\x2e\x32\x33\x39\x36\x38\x20\x32\x2e\x39\
+\x34\x32\x30\x37\x20\x33\x2e\x33\x32\x30\x32\x38\x20\x35\x2e\x31\
+\x30\x38\x35\x37\x43\x20\x2d\x31\x2e\x39\x36\x38\x39\x31\x20\x39\
+\x2e\x30\x33\x33\x37\x31\x20\x2d\x38\x2e\x32\x36\x38\x39\x35\x20\
+\x37\x2e\x34\x34\x33\x37\x20\x2d\x39\x2e\x33\x39\x31\x31\x38\x20\
+\x2d\x30\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\
+\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\
+\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\
+\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\
+\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\
+\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\
+\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\
+\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x31\x2e\x37\x35\x36\
+\x35\x36\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\
+\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\
+\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\
+\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\x20\x36\x39\
+\x2e\x37\x36\x38\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\
+\x20\x63\x78\x3d\x27\x2d\x39\x2e\x33\x39\x31\x31\x38\x27\x20\x63\
+\x79\x3d\x27\x2d\x30\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\
+\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\
+\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\
+\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\
+\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\
+\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\x20\x36\x39\x2e\x37\
+\x36\x38\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\
+\x78\x3d\x27\x2d\x36\x2e\x36\x34\x30\x35\x37\x27\x20\x63\x79\x3d\
+\x27\x2d\x31\x30\x2e\x32\x31\x37\x31\x27\x20\x72\x3d\x27\x33\x2e\
+\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\
+\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\
+\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\
+\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\
+\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\x20\
+\x36\x39\x2e\x37\x36\x38\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\
+\x6c\x65\x20\x63\x78\x3d\x27\x38\x2e\x36\x37\x36\x33\x32\x27\x20\
+\x63\x79\x3d\x27\x2d\x35\x2e\x35\x32\x39\x34\x38\x27\x20\x72\x3d\
+\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\
+\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
+\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
+\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\
+\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\
+\x35\x35\x20\x36\x39\x2e\x37\x36\x38\x38\x29\x27\x3e\x0a\x3c\x63\
+\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x33\x2e\x33\x32\x30\x32\
+\x38\x27\x20\x63\x79\x3d\x27\x35\x2e\x31\x30\x38\x35\x37\x27\x20\
+\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\
+\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\
+\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x00\xdd\
+\x3c\
+\x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x38\x22\
+\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x38\x22\x20\x76\x69\x65\x77\
+\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x38\x20\x38\x22\x3e\x0a\x20\
+\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x30\x20\x30\x76\x32\
+\x68\x2e\x35\x63\x30\x2d\x2e\x35\x35\x2e\x34\x35\x2d\x31\x20\x31\
+\x2d\x31\x68\x31\x2e\x35\x76\x35\x2e\x35\x63\x30\x20\x2e\x32\x38\
+\x2d\x2e\x32\x32\x2e\x35\x2d\x2e\x35\x2e\x35\x68\x2d\x2e\x35\x76\
+\x31\x68\x34\x76\x2d\x31\x68\x2d\x2e\x35\x63\x2d\x2e\x32\x38\x20\
+\x30\x2d\x2e\x35\x2d\x2e\x32\x32\x2d\x2e\x35\x2d\x2e\x35\x76\x2d\
+\x35\x2e\x35\x68\x31\x2e\x35\x63\x2e\x35\x35\x20\x30\x20\x31\x20\
+\x2e\x34\x35\x20\x31\x20\x31\x68\x2e\x35\x76\x2d\x32\x68\x2d\x38\
+\x7a\x22\x20\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x01\xdd\
+\x00\
+\x00\x06\xe4\x78\x9c\xcd\x54\x4d\x6f\x9b\x40\x10\x3d\x13\x29\xff\
+\x61\xba\xb7\x4a\xec\x17\xc4\xd4\xa6\xa6\x51\xfd\x21\xcb\x52\x9a\
+\x58\x6a\xea\xaa\xa7\x0a\xc3\x16\x50\x28\x20\x58\xc0\xce\xaf\xef\
+\xee\x92\x54\x51\x95\xfa\x18\xfb\xb0\x33\xda\x79\x6f\xde\xbc\x65\
+\x24\xa6\xd7\xfb\xdf\x39\x74\xa2\x6e\xb2\xb2\x08\x10\x27\x0c\x81\
+\x28\xa2\x32\xce\x8a\x24\x40\xad\xfc\x85\xc7\xe8\xfa\xd3\xe5\xc5\
+\xf4\x1d\xc6\xb0\x12\x85\xa8\x43\x59\xd6\x3e\x7c\x8e\xcb\x9d\x80\
+\x75\x9e\xb7\x8d\x34\x25\xe0\x1e\x71\x08\xb7\xe1\xeb\x76\x05\xcb\
+\x7d\x55\xd6\x12\x36\x79\x9b\xe0\x75\x01\xc4\x14\xb7\xc3\x10\x1f\
+\x3c\xc2\x18\xcc\xda\x2c\x8f\x81\xbd\x07\xc0\xd8\xe8\x2f\xee\xe6\
+\xf7\x3f\x36\x4b\x68\xba\x04\x36\xdf\x66\x37\xeb\x39\x20\x4c\xe9\
+\x77\x77\x4e\xe9\xe2\x7e\x61\x24\x38\xe1\x94\x2e\x6f\x11\xa0\x54\
+\xca\xca\xa7\xb4\xef\x7b\xd2\xbb\xa4\xac\x13\xba\xaa\xc3\x2a\xcd\
+\xa2\x86\x2a\x22\xd5\x44\xd5\x44\x95\x18\xe7\x24\x96\x31\xd2\x33\
+\xb4\xf4\x8b\xa7\x72\x04\x59\x1c\xa0\x9b\xf0\x20\xea\x9f\xea\xa2\
+\xbe\x44\xd1\x04\xaf\x48\x3b\x8c\x31\x2d\xf5\x44\xf1\xf7\x79\x56\
+\x3c\xbc\x46\xe4\x93\xc9\x84\x1a\x54\x51\x03\xc4\xaa\x3d\x82\xc3\
+\x90\x2f\x2f\x2c\xe8\xb3\x58\xa6\x01\x1a\x71\x47\x03\xa9\xc8\x92\
+\x54\xfe\xbd\x76\x99\xe8\x67\xa5\xee\x02\x06\xaa\xa6\x0f\x82\x46\
+\x1e\x72\x11\x20\x51\x84\xbb\x5c\xe0\x5d\x18\x3d\x24\x75\xd9\x16\
+\xb1\x5f\x88\x1e\x5e\x30\x3f\x1a\x6f\x7e\x53\x85\x91\xa2\x57\xb5\
+\x68\x44\xdd\x09\xf3\xea\x44\x05\x6b\x88\xd6\xb4\x0a\x65\x0a\xea\
+\xd1\x5f\xb8\xc7\x6c\x3e\x72\x89\x1b\x31\xdb\x25\x1f\xb0\x6b\x7b\
+\x2a\xaa\xa3\x73\x8a\x47\x8c\x8c\x22\xac\x00\x9b\xe9\x22\x76\xf1\
+\x13\xdc\x0d\x10\x33\x98\xfb\xdc\xa0\x73\x6a\x00\xd3\xa2\x4b\xb6\
+\x51\xd4\x67\x6b\xe6\x3c\xea\x4f\x60\x59\xf4\x1f\x1f\xce\x78\x7c\
+\x16\x3e\xae\xb8\x77\x3a\x1f\x53\xfa\xff\x25\x39\x63\xfe\x26\xa6\
+\xcc\x9c\x23\x4b\x3a\x07\x1f\x7a\x49\x27\xf3\x71\x6c\x49\x57\x6c\
+\xf2\x26\xa6\xcc\x9c\x23\x4b\x3a\x07\x1f\x7a\x49\x27\xf3\x31\x2c\
+\xe9\x39\xaa\x7f\xb6\xca\x7f\x00\x99\x18\x96\x19\
+\x00\x00\x02\x20\
+\x00\
+\x00\x07\x7f\x78\x9c\xdd\x55\x3b\x6f\xdb\x30\x10\xde\xfb\x2b\xae\
+\xe8\xc0\x76\x20\x45\x52\x24\x45\x06\x51\x02\xd4\x40\xa7\x74\x4b\
+\x96\x6e\x6a\xcc\x48\x6c\x6c\xc9\x90\x54\xcb\xfd\xf7\x3d\xc5\xd6\
+\xc3\x56\xd0\x29\x43\x11\x69\xd0\x3d\x78\x77\xdf\x7d\xc7\x83\xae\
+\x6f\x0f\xdb\x0d\xec\x7d\xdd\x84\xaa\x4c\x89\x60\x9c\x80\x2f\x1f\
+\xab\x75\x28\xf3\x94\x3c\xdc\x7f\xa3\x96\xdc\xde\x7c\xb8\xfe\x48\
+\x29\xdc\x17\xa1\x81\xa7\xb0\xf1\xd0\x65\x0d\xe4\xbe\xf4\x75\xd6\
+\xfa\x35\xfc\xfc\x03\xeb\x7d\x68\xf6\xf9\x16\x24\x53\x40\x29\x9e\
+\x47\x0d\x0a\x1f\xf2\xa2\x4d\x89\x54\xbb\x96\xcc\x6b\x08\xd4\x82\
+\xef\xbe\x56\x87\x94\x68\xc3\x14\x77\x0a\x74\xcc\xac\xb6\x31\x08\
+\xcb\x54\x9c\x68\x90\x8a\x40\x17\xd6\x6d\x81\x01\x47\x53\x9f\x04\
+\xc1\x96\x4d\x4a\x8a\xb6\xdd\x5d\x45\x51\xd7\x75\xac\x8b\x59\x55\
+\xe7\x91\xe4\x9c\x47\x58\xf4\x74\xe4\xea\xb0\x09\xe5\xf3\x6b\x07\
+\x85\x73\x2e\x7a\xf1\x12\x84\x99\x43\x58\xa7\x64\x97\xe5\x5e\x1c\
+\xd5\xb6\xce\xca\xe6\xa9\xaa\xb7\x29\xd9\x66\x6d\x1d\x0e\x9f\x39\
+\x73\xce\x48\xa3\x80\xf7\xef\xa0\x18\xcd\x8c\xb4\x12\x12\xc5\x24\
+\x97\x5f\xfa\xe0\x5d\xd6\x16\x80\xd9\xbe\x03\xb5\x0c\xf1\x72\xa4\
+\x42\x33\x2e\x35\x97\x77\x33\x13\x9f\x2b\x02\x9b\x76\x26\xf6\x54\
+\xe8\xd5\x99\x59\xc6\x2e\xd1\xbd\x79\x66\x35\x4c\x38\x9b\x24\x68\
+\x35\xf3\x7c\xb3\x40\xc1\xb4\x12\x16\xa8\x42\x70\x28\xe1\x38\x12\
+\x27\x8c\x45\xe0\x27\x69\x05\x97\xae\x8b\xd0\x41\x45\x94\xaf\x88\
+\x53\x3f\x13\x54\xce\x38\x62\x9f\x74\x4c\xe4\x30\xd1\x50\x87\x0a\
+\xc9\xac\x12\x09\x62\x18\xc4\xd5\x04\x70\xf4\xd2\x45\x02\x7a\x5e\
+\xe2\x6e\xc9\xea\x0f\xd2\xdf\xc6\x4d\x4a\x3e\x59\xde\xbf\x24\xc2\
+\x29\x44\xf9\xdb\xcd\x71\x8e\x49\x18\x93\xcc\xdb\x44\xfe\xb8\xd5\
+\xb3\x36\x63\xe6\xb4\x55\x2f\x6d\x1e\xc5\xb3\x36\x4f\x5e\xba\x48\
+\x40\x97\x45\x26\x93\xc3\x78\xe5\xe4\x2c\xd1\x38\x94\x51\x9c\x46\
+\x3a\x3a\x17\xf1\x97\x35\x46\xe6\xca\xaa\xf4\x04\x9a\xb6\xae\x9e\
+\x3d\xf2\xc8\x5f\x9e\xc1\x40\x71\x4b\xfc\x63\xb6\x4b\x49\x5d\xfd\
+\x2e\xd7\x67\xe6\x5f\x55\x28\x2f\xed\xdb\xd0\xfa\x7a\x13\xf0\x83\
+\x3b\x8b\x33\xc3\x9a\xa3\x6f\x58\x65\x96\x68\xa3\xcd\x9b\x4f\x6a\
+\xc1\xe2\xbb\xd9\xb8\x53\x3f\xef\x6d\x60\xff\x5a\x2d\x8d\x44\x49\
+\x31\x5b\x2d\x77\x64\x8a\x8f\xe2\xd9\x6a\x9d\xbc\x74\x91\x60\x71\
+\x29\xfe\x13\x12\x8f\x44\xf6\x7f\xab\x9b\xbf\x3f\x45\xd8\x3d\
 \x00\x00\x04\x79\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
@@ -543,380 +1041,6 @@
 \x2c\x39\x2e\x39\x30\x35\x2c\x31\x36\x2e\x36\x35\x33\x2c\x39\x2e\
 \x39\x38\x36\x2c\x31\x36\x2e\x31\x36\x35\x7a\x22\x2f\x3e\x0d\x0a\
 \x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x04\x30\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
-\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
-\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
-\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
-\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
-\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
-\x74\x3d\x27\x32\x34\x70\x74\x27\x20\x76\x65\x72\x73\x69\x6f\x6e\
-\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x27\
-\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\x38\x33\x20\
-\x32\x34\x20\x32\x34\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x32\x34\
-\x70\x74\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
-\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
-\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
-\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
-\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\
-\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
-\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
-\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
-\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\
-\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x2d\x39\x2e\x33\x39\
-\x31\x31\x38\x20\x2d\x30\x4c\x20\x2d\x36\x2e\x36\x34\x30\x35\x37\
-\x20\x2d\x31\x32\x2e\x30\x34\x35\x4c\x20\x38\x2e\x36\x37\x36\x33\
-\x32\x20\x2d\x36\x2e\x35\x31\x38\x37\x31\x4c\x20\x33\x2e\x33\x32\
-\x30\x32\x38\x20\x36\x2e\x30\x32\x32\x35\x4c\x20\x2d\x39\x2e\x33\
-\x39\x31\x31\x38\x20\x2d\x30\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\
-\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\
-\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\
-\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\
-\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\
-\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\
-\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\
-\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\
-\x31\x2e\x37\x35\x36\x35\x36\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
-\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
-\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\
-\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\
-\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\x3c\x63\
-\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x2d\x39\x2e\x33\x39\x31\
-\x31\x38\x27\x20\x63\x79\x3d\x27\x2d\x30\x27\x20\x72\x3d\x27\x33\
-\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\
-\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\
-\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\
-\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\
-\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\
-\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\x3c\x63\x69\x72\
-\x63\x6c\x65\x20\x63\x78\x3d\x27\x2d\x36\x2e\x36\x34\x30\x35\x37\
-\x27\x20\x63\x79\x3d\x27\x2d\x31\x32\x2e\x30\x34\x35\x27\x20\x72\
-\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\
-\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\
-\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\
-\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\
-\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\
-\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\x3c\
-\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x38\x2e\x36\x37\x36\
-\x33\x32\x27\x20\x63\x79\x3d\x27\x2d\x36\x2e\x35\x31\x38\x37\x31\
-\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\
-\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\
-\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\
-\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\
-\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\
-\x38\x2e\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\
-\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x33\x2e\
-\x33\x32\x30\x32\x38\x27\x20\x63\x79\x3d\x27\x36\x2e\x30\x32\x32\
-\x35\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\
-\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\
-\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
-\x00\x00\x07\x80\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
-\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x39\x33\x2e\x34\x36\
-\x2c\x32\x34\x39\x2e\x30\x35\x36\x63\x33\x2e\x37\x32\x33\x2d\x30\
-\x2e\x36\x37\x2c\x37\x2e\x35\x38\x39\x2d\x31\x2e\x30\x34\x31\x2c\
-\x31\x31\x2e\x35\x38\x36\x2d\x31\x2e\x30\x34\x31\x4c\x32\x30\x31\
-\x2e\x39\x32\x34\x2c\x32\x34\x38\x68\x31\x30\x33\x2e\x38\x32\x33\
-\x63\x34\x2e\x35\x30\x33\x2c\x30\x2c\x38\x2e\x38\x30\x36\x2d\x30\
-\x2e\x36\x31\x37\x2c\x31\x32\x2e\x39\x30\x38\x2d\x31\x2e\x37\x35\
-\x34\x0d\x0a\x09\x09\x63\x31\x39\x2e\x33\x37\x2d\x35\x2e\x33\x36\
-\x33\x2c\x33\x33\x2e\x33\x34\x35\x2d\x32\x32\x2e\x35\x33\x37\x2c\
-\x33\x33\x2e\x33\x34\x35\x2d\x34\x33\x2e\x36\x36\x33\x76\x2d\x33\
-\x30\x2e\x38\x32\x32\x76\x2d\x35\x36\x2e\x34\x30\x32\x63\x30\x2d\
-\x32\x34\x2e\x38\x33\x32\x2d\x32\x31\x2e\x31\x35\x2d\x34\x33\x2e\
-\x34\x38\x34\x2d\x34\x36\x2e\x32\x38\x39\x2d\x34\x37\x2e\x36\x30\
-\x36\x0d\x0a\x09\x09\x63\x2d\x31\x35\x2e\x39\x33\x31\x2d\x32\x2e\
-\x36\x32\x34\x2d\x33\x39\x2e\x32\x35\x38\x2d\x33\x2e\x38\x32\x37\
-\x2d\x35\x35\x2e\x30\x38\x39\x2d\x33\x2e\x37\x34\x39\x63\x2d\x31\
-\x35\x2e\x38\x32\x39\x2c\x30\x2e\x30\x38\x36\x2d\x33\x30\x2e\x39\
-\x38\x31\x2c\x31\x2e\x34\x30\x34\x2d\x34\x34\x2e\x32\x37\x37\x2c\
-\x33\x2e\x37\x34\x39\x43\x31\x36\x37\x2e\x31\x34\x33\x2c\x37\x34\
-\x2e\x35\x37\x36\x2c\x31\x36\x30\x2c\x38\x38\x2e\x39\x32\x38\x2c\
-\x31\x36\x30\x2c\x31\x31\x35\x2e\x33\x35\x39\x56\x31\x34\x34\x68\
-\x39\x36\x0d\x0a\x09\x09\x76\x31\x36\x48\x31\x32\x38\x2e\x38\x32\
-\x63\x2d\x33\x35\x2e\x36\x32\x38\x2c\x30\x2d\x36\x34\x2e\x35\x33\
-\x38\x2c\x34\x32\x2e\x35\x37\x31\x2d\x36\x34\x2e\x38\x31\x33\x2c\
-\x39\x35\x2e\x32\x34\x32\x43\x36\x34\x2e\x30\x30\x35\x2c\x32\x35\
-\x35\x2e\x34\x39\x35\x2c\x36\x34\x2c\x32\x35\x35\x2e\x37\x34\x37\
-\x2c\x36\x34\x2c\x32\x35\x36\x63\x30\x2c\x39\x2e\x35\x32\x33\x2c\
-\x30\x2e\x39\x34\x2c\x31\x38\x2e\x37\x32\x2c\x32\x2e\x36\x38\x35\
-\x2c\x32\x37\x2e\x34\x30\x34\x0d\x0a\x09\x09\x43\x37\x34\x2e\x36\
-\x34\x38\x2c\x33\x32\x33\x2e\x30\x37\x2c\x39\x39\x2e\x34\x35\x31\
-\x2c\x33\x35\x32\x2c\x31\x32\x38\x2e\x38\x32\x2c\x33\x35\x32\x48\
-\x31\x34\x34\x76\x2d\x32\x2e\x36\x36\x32\x76\x2d\x34\x33\x2e\x32\
-\x37\x33\x43\x31\x34\x34\x2c\x32\x37\x39\x2e\x32\x33\x38\x2c\x31\
-\x36\x34\x2e\x31\x34\x36\x2c\x32\x35\x34\x2e\x33\x33\x32\x2c\x31\
-\x39\x33\x2e\x34\x36\x2c\x32\x34\x39\x2e\x30\x35\x36\x7a\x20\x4d\
-\x32\x30\x33\x2e\x36\x35\x36\x2c\x31\x32\x37\x2e\x30\x30\x32\x0d\
-\x0a\x09\x09\x63\x2d\x39\x2e\x35\x39\x32\x2c\x30\x2d\x31\x37\x2e\
-\x33\x38\x34\x2d\x37\x2e\x37\x38\x35\x2d\x31\x37\x2e\x33\x38\x34\
-\x2d\x31\x37\x2e\x34\x30\x33\x63\x30\x2d\x39\x2e\x36\x36\x34\x2c\
-\x37\x2e\x37\x37\x34\x2d\x31\x37\x2e\x35\x32\x2c\x31\x37\x2e\x33\
-\x38\x34\x2d\x31\x37\x2e\x35\x32\x63\x39\x2e\x35\x37\x34\x2c\x30\
-\x2c\x31\x37\x2e\x33\x39\x39\x2c\x37\x2e\x38\x35\x35\x2c\x31\x37\
-\x2e\x33\x39\x39\x2c\x31\x37\x2e\x35\x32\x0d\x0a\x09\x09\x43\x32\
-\x32\x31\x2e\x30\x35\x36\x2c\x31\x31\x39\x2e\x32\x31\x37\x2c\x32\
-\x31\x33\x2e\x32\x34\x36\x2c\x31\x32\x37\x2e\x30\x30\x32\x2c\x32\
-\x30\x33\x2e\x36\x35\x36\x2c\x31\x32\x37\x2e\x30\x30\x32\x7a\x22\
-\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\
-\x34\x33\x2e\x39\x35\x31\x2c\x32\x32\x32\x2e\x35\x34\x33\x43\x34\
-\x33\x34\x2e\x37\x38\x2c\x31\x38\x36\x2e\x30\x32\x31\x2c\x34\x31\
-\x31\x2e\x30\x33\x33\x2c\x31\x36\x30\x2c\x33\x38\x33\x2e\x31\x38\
-\x2c\x31\x36\x30\x48\x33\x36\x38\x76\x32\x2e\x36\x32\x36\x76\x33\
-\x38\x2e\x30\x34\x36\x63\x30\x2c\x33\x33\x2e\x39\x31\x35\x2d\x32\
-\x32\x2e\x32\x38\x36\x2c\x35\x38\x2e\x34\x37\x34\x2d\x34\x39\x2e\
-\x34\x38\x39\x2c\x36\x32\x2e\x36\x38\x31\x0d\x0a\x09\x09\x63\x2d\
-\x32\x2e\x37\x33\x37\x2c\x30\x2e\x34\x32\x34\x2d\x35\x2e\x34\x38\
-\x33\x2c\x30\x2e\x36\x34\x36\x2d\x38\x2e\x33\x30\x31\x2c\x30\x2e\
-\x36\x34\x36\x48\x32\x30\x36\x2e\x33\x35\x31\x63\x2d\x34\x2e\x35\
-\x31\x38\x2c\x30\x2d\x38\x2e\x39\x30\x34\x2c\x30\x2e\x35\x38\x34\
-\x2d\x31\x33\x2e\x30\x34\x39\x2c\x31\x2e\x36\x37\x32\x43\x31\x37\
-\x34\x2e\x31\x38\x2c\x32\x37\x30\x2e\x36\x38\x39\x2c\x31\x36\x30\
-\x2c\x32\x38\x36\x2e\x36\x2c\x31\x36\x30\x2c\x33\x30\x37\x2e\x32\
-\x33\x36\x76\x33\x32\x2e\x39\x32\x32\x0d\x0a\x09\x09\x76\x35\x34\
-\x2e\x33\x30\x35\x63\x30\x2c\x32\x34\x2e\x38\x33\x32\x2c\x32\x34\
-\x2e\x39\x37\x37\x2c\x33\x39\x2e\x34\x32\x36\x2c\x34\x39\x2e\x34\
-\x38\x31\x2c\x34\x36\x2e\x35\x35\x31\x63\x32\x39\x2e\x33\x32\x37\
-\x2c\x38\x2e\x35\x33\x31\x2c\x36\x31\x2e\x32\x36\x37\x2c\x31\x30\
-\x2e\x30\x36\x38\x2c\x39\x36\x2e\x33\x36\x36\x2c\x30\x43\x33\x32\
-\x39\x2e\x31\x35\x2c\x34\x33\x34\x2e\x33\x35\x34\x2c\x33\x35\x32\
-\x2c\x34\x32\x30\x2e\x38\x39\x33\x2c\x33\x35\x32\x2c\x33\x39\x34\
-\x2e\x34\x36\x33\x56\x33\x36\x38\x0d\x0a\x09\x09\x68\x2d\x39\x36\
-\x76\x2d\x31\x36\x68\x31\x32\x37\x2e\x31\x38\x63\x32\x35\x2e\x32\
-\x34\x2c\x30\x2c\x34\x37\x2e\x31\x30\x37\x2d\x32\x31\x2e\x33\x36\
-\x35\x2c\x35\x37\x2e\x38\x31\x34\x2d\x35\x32\x2e\x35\x34\x39\x43\
-\x34\x34\x35\x2e\x34\x37\x34\x2c\x32\x38\x36\x2e\x34\x30\x34\x2c\
-\x34\x34\x38\x2c\x32\x37\x31\x2e\x36\x34\x31\x2c\x34\x34\x38\x2c\
-\x32\x35\x36\x0d\x0a\x09\x09\x43\x34\x34\x38\x2c\x32\x34\x34\x2e\
-\x32\x33\x32\x2c\x34\x34\x36\x2e\x35\x36\x37\x2c\x32\x33\x32\x2e\
-\x39\x36\x32\x2c\x34\x34\x33\x2e\x39\x35\x31\x2c\x32\x32\x32\x2e\
-\x35\x34\x33\x7a\x20\x4d\x33\x30\x37\x2e\x38\x36\x37\x2c\x33\x38\
-\x32\x2e\x38\x32\x63\x39\x2e\x35\x39\x2c\x30\x2c\x31\x37\x2e\x33\
-\x38\x31\x2c\x37\x2e\x37\x38\x35\x2c\x31\x37\x2e\x33\x38\x31\x2c\
-\x31\x37\x2e\x34\x0d\x0a\x09\x09\x63\x30\x2c\x39\x2e\x36\x35\x2d\
-\x37\x2e\x37\x39\x31\x2c\x31\x37\x2e\x35\x32\x31\x2d\x31\x37\x2e\
-\x33\x38\x31\x2c\x31\x37\x2e\x35\x32\x31\x63\x2d\x39\x2e\x35\x37\
-\x37\x2c\x30\x2d\x31\x37\x2e\x33\x39\x39\x2d\x37\x2e\x38\x37\x31\
-\x2d\x31\x37\x2e\x33\x39\x39\x2d\x31\x37\x2e\x35\x32\x31\x43\x32\
-\x39\x30\x2e\x34\x36\x38\x2c\x33\x39\x30\x2e\x35\x39\x2c\x32\x39\
-\x38\x2e\x32\x37\x34\x2c\x33\x38\x32\x2e\x38\x32\x2c\x33\x30\x37\
-\x2e\x38\x36\x37\x2c\x33\x38\x32\x2e\x38\x32\x7a\x22\x2f\x3e\x0d\
-\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x05\x27\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x5f\x31\x32\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\
-\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\
-\x35\x36\x2c\x36\x34\x43\x31\x35\x30\x2e\x34\x30\x31\x2c\x36\x34\
-\x2c\x36\x34\x2c\x31\x35\x30\x2e\x34\x30\x31\x2c\x36\x34\x2c\x32\
-\x35\x36\x63\x30\x2c\x31\x30\x35\x2e\x36\x30\x34\x2c\x38\x36\x2e\
-\x34\x30\x31\x2c\x31\x39\x32\x2c\x31\x39\x32\x2c\x31\x39\x32\x63\
-\x31\x38\x2e\x31\x33\x36\x2c\x30\x2c\x33\x32\x2d\x31\x33\x2e\x38\
-\x36\x34\x2c\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\x09\x63\x30\x2d\
-\x38\x2e\x35\x33\x31\x2d\x33\x2e\x31\x39\x38\x2d\x31\x36\x2d\x38\
-\x2e\x35\x33\x31\x2d\x32\x31\x2e\x33\x33\x33\x63\x2d\x35\x2e\x33\
-\x33\x33\x2d\x35\x2e\x33\x33\x34\x2d\x38\x2e\x35\x33\x31\x2d\x31\
-\x32\x2e\x38\x30\x33\x2d\x38\x2e\x35\x33\x31\x2d\x32\x31\x2e\x33\
-\x33\x34\x63\x30\x2d\x31\x38\x2e\x31\x33\x35\x2c\x31\x33\x2e\x38\
-\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x68\x33\x38\x2e\x33\
-\x39\x36\x0d\x0a\x09\x09\x09\x63\x35\x38\x2e\x36\x36\x37\x2c\x30\
-\x2c\x31\x30\x36\x2e\x36\x36\x37\x2d\x34\x38\x2c\x31\x30\x36\x2e\
-\x36\x36\x37\x2d\x31\x30\x36\x2e\x36\x36\x36\x43\x34\x34\x38\x2c\
-\x31\x34\x30\x2e\x38\x30\x32\x2c\x33\x36\x31\x2e\x36\x30\x34\x2c\
-\x36\x34\x2c\x32\x35\x36\x2c\x36\x34\x7a\x20\x4d\x31\x33\x38\x2e\
-\x36\x36\x37\x2c\x32\x35\x36\x63\x2d\x31\x38\x2e\x31\x33\x36\x2c\
-\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x34\x2d\x33\x32\x2d\x33\
-\x32\x73\x31\x33\x2e\x38\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\
-\x32\x0d\x0a\x09\x09\x09\x63\x31\x38\x2e\x31\x33\x35\x2c\x30\x2c\
-\x33\x32\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x53\
-\x31\x35\x36\x2e\x38\x30\x32\x2c\x32\x35\x36\x2c\x31\x33\x38\x2e\
-\x36\x36\x37\x2c\x32\x35\x36\x7a\x20\x4d\x32\x30\x32\x2e\x36\x36\
-\x37\x2c\x31\x37\x30\x2e\x36\x36\x37\x63\x2d\x31\x38\x2e\x31\x33\
-\x36\x2c\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x35\x2d\x33\x32\
-\x2d\x33\x32\x63\x30\x2d\x31\x38\x2e\x31\x33\x36\x2c\x31\x33\x2e\
-\x38\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\
-\x09\x63\x31\x38\x2e\x31\x33\x35\x2c\x30\x2c\x33\x32\x2c\x31\x33\
-\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x43\x32\x33\x34\x2e\x36\
-\x36\x37\x2c\x31\x35\x36\x2e\x38\x30\x32\x2c\x32\x32\x30\x2e\x38\
-\x30\x32\x2c\x31\x37\x30\x2e\x36\x36\x37\x2c\x32\x30\x32\x2e\x36\
-\x36\x37\x2c\x31\x37\x30\x2e\x36\x36\x37\x7a\x20\x4d\x33\x30\x39\
-\x2e\x33\x33\x33\x2c\x31\x37\x30\x2e\x36\x36\x37\x63\x2d\x31\x38\
-\x2e\x31\x33\x35\x2c\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x35\
-\x2d\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\x09\x63\x30\x2d\x31\x38\
-\x2e\x31\x33\x36\x2c\x31\x33\x2e\x38\x36\x35\x2d\x33\x32\x2c\x33\
-\x32\x2d\x33\x32\x63\x31\x38\x2e\x31\x33\x36\x2c\x30\x2c\x33\x32\
-\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x43\x33\x34\
-\x31\x2e\x33\x33\x33\x2c\x31\x35\x36\x2e\x38\x30\x32\x2c\x33\x32\
-\x37\x2e\x34\x36\x39\x2c\x31\x37\x30\x2e\x36\x36\x37\x2c\x33\x30\
-\x39\x2e\x33\x33\x33\x2c\x31\x37\x30\x2e\x36\x36\x37\x7a\x20\x4d\
-\x33\x37\x33\x2e\x33\x33\x33\x2c\x32\x35\x36\x0d\x0a\x09\x09\x09\
-\x63\x2d\x31\x38\x2e\x31\x33\x35\x2c\x30\x2d\x33\x32\x2d\x31\x33\
-\x2e\x38\x36\x34\x2d\x33\x32\x2d\x33\x32\x73\x31\x33\x2e\x38\x36\
-\x35\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x63\x31\x38\x2e\x31\x33\
-\x36\x2c\x30\x2c\x33\x32\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\
-\x2c\x33\x32\x53\x33\x39\x31\x2e\x34\x36\x39\x2c\x32\x35\x36\x2c\
-\x33\x37\x33\x2e\x33\x33\x33\x2c\x32\x35\x36\x7a\x22\x2f\x3e\x0d\
-\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
-\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x02\xa2\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
-\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x32\x38\x2c\x34\x30\
-\x35\x2e\x34\x32\x39\x43\x31\x32\x38\x2c\x34\x32\x38\x2e\x38\x34\
-\x36\x2c\x31\x34\x37\x2e\x31\x39\x38\x2c\x34\x34\x38\x2c\x31\x37\
-\x30\x2e\x36\x36\x37\x2c\x34\x34\x38\x68\x31\x37\x30\x2e\x36\x36\
-\x37\x43\x33\x36\x34\x2e\x38\x30\x32\x2c\x34\x34\x38\x2c\x33\x38\
-\x34\x2c\x34\x32\x38\x2e\x38\x34\x36\x2c\x33\x38\x34\x2c\x34\x30\
-\x35\x2e\x34\x32\x39\x56\x31\x36\x30\x48\x31\x32\x38\x56\x34\x30\
-\x35\x2e\x34\x32\x39\x7a\x20\x4d\x34\x31\x36\x2c\x39\x36\x0d\x0a\
-\x09\x09\x68\x2d\x38\x30\x6c\x2d\x32\x36\x2e\x37\x38\x35\x2d\x33\
-\x32\x48\x32\x30\x32\x2e\x37\x38\x36\x4c\x31\x37\x36\x2c\x39\x36\
-\x48\x39\x36\x76\x33\x32\x68\x33\x32\x30\x56\x39\x36\x7a\x22\x2f\
-\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
-\x0a\
-\x00\x00\x03\x22\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
-\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x22\x32\x35\x36\x22\
-\x20\x63\x79\x3d\x22\x32\x38\x30\x22\x20\x72\x3d\x22\x36\x33\x22\
-\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\
-\x34\x30\x2c\x39\x36\x68\x2d\x38\x38\x6c\x2d\x33\x32\x2d\x33\x32\
-\x48\x31\x39\x32\x6c\x2d\x33\x32\x2c\x33\x32\x48\x37\x32\x63\x2d\
-\x32\x32\x2e\x30\x39\x32\x2c\x30\x2d\x34\x30\x2c\x31\x37\x2e\x39\
-\x30\x38\x2d\x34\x30\x2c\x34\x30\x76\x32\x37\x32\x63\x30\x2c\x32\
-\x32\x2e\x30\x39\x32\x2c\x31\x37\x2e\x39\x30\x38\x2c\x34\x30\x2c\
-\x34\x30\x2c\x34\x30\x68\x33\x36\x38\x63\x32\x32\x2e\x30\x39\x32\
-\x2c\x30\x2c\x34\x30\x2d\x31\x37\x2e\x39\x30\x38\x2c\x34\x30\x2d\
-\x34\x30\x0d\x0a\x09\x09\x56\x31\x33\x36\x43\x34\x38\x30\x2c\x31\
-\x31\x33\x2e\x39\x30\x38\x2c\x34\x36\x32\x2e\x30\x39\x32\x2c\x39\
-\x36\x2c\x34\x34\x30\x2c\x39\x36\x7a\x20\x4d\x32\x35\x36\x2c\x33\
-\x39\x32\x63\x2d\x36\x31\x2e\x38\x35\x35\x2c\x30\x2d\x31\x31\x32\
-\x2d\x35\x30\x2e\x31\x34\x35\x2d\x31\x31\x32\x2d\x31\x31\x32\x73\
-\x35\x30\x2e\x31\x34\x35\x2d\x31\x31\x32\x2c\x31\x31\x32\x2d\x31\
-\x31\x32\x73\x31\x31\x32\x2c\x35\x30\x2e\x31\x34\x35\x2c\x31\x31\
-\x32\x2c\x31\x31\x32\x0d\x0a\x09\x09\x53\x33\x31\x37\x2e\x38\x35\
-\x35\x2c\x33\x39\x32\x2c\x32\x35\x36\x2c\x33\x39\x32\x7a\x22\x2f\
-\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
-\x0a\
 \x00\x00\x02\x7d\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
@@ -950,13 +1074,13 @@
 \x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
 \x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
 \x22\x49\x63\x6f\x6e\x5f\x38\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
-\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\x35\
-\x2c\x32\x37\x37\x2e\x33\x37\x35\x68\x32\x35\x39\x2e\x37\x30\x34\
-\x4c\x32\x32\x35\x2e\x30\x30\x32\x2c\x33\x39\x37\x2e\x30\x37\x37\
-\x4c\x32\x35\x36\x2c\x34\x32\x37\x6c\x31\x37\x31\x2d\x31\x37\x31\
-\x4c\x32\x35\x36\x2c\x38\x35\x6c\x2d\x32\x39\x2e\x39\x32\x32\x2c\
-\x32\x39\x2e\x39\x32\x34\x6c\x31\x31\x38\x2e\x36\x32\x36\x2c\x31\
-\x31\x39\x2e\x37\x30\x31\x48\x38\x35\x56\x32\x37\x37\x2e\x33\x37\
+\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x32\
+\x37\x2c\x32\x33\x34\x2e\x36\x32\x35\x48\x31\x36\x37\x2e\x32\x39\
+\x36\x6c\x31\x31\x39\x2e\x37\x30\x32\x2d\x31\x31\x39\x2e\x37\x30\
+\x32\x4c\x32\x35\x36\x2c\x38\x35\x4c\x38\x35\x2c\x32\x35\x36\x6c\
+\x31\x37\x31\x2c\x31\x37\x31\x6c\x32\x39\x2e\x39\x32\x32\x2d\x32\
+\x39\x2e\x39\x32\x34\x4c\x31\x36\x37\x2e\x32\x39\x36\x2c\x32\x37\
+\x37\x2e\x33\x37\x35\x48\x34\x32\x37\x56\x32\x33\x34\x2e\x36\x32\
 \x35\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
 \x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
 \x00\x00\x05\xb7\
@@ -1053,160 +1177,73 @@
 \x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x31\x2e\x37\x35\
 \x36\x35\x36\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\
 \x3c\x2f\x73\x76\x67\x3e\
-\x00\x00\x03\x26\
+\x00\x00\x04\x10\
 \x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
-\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x33\x38\
-\x38\x63\x2d\x37\x32\x2e\x35\x39\x37\x2c\x30\x2d\x31\x33\x32\x2d\
-\x35\x39\x2e\x34\x30\x35\x2d\x31\x33\x32\x2d\x31\x33\x32\x63\x30\
-\x2d\x37\x32\x2e\x36\x30\x31\x2c\x35\x39\x2e\x34\x30\x33\x2d\x31\
-\x33\x32\x2c\x31\x33\x32\x2d\x31\x33\x32\x63\x33\x36\x2e\x33\x2c\
-\x30\x2c\x36\x39\x2e\x32\x39\x39\x2c\x31\x35\x2e\x34\x2c\x39\x32\
-\x2e\x34\x30\x36\x2c\x33\x39\x2e\x36\x30\x31\x4c\x32\x37\x38\x2c\
-\x32\x33\x34\x68\x31\x35\x34\x56\x38\x30\x0d\x0a\x09\x09\x6c\x2d\
-\x35\x31\x2e\x36\x39\x38\x2c\x35\x31\x2e\x37\x30\x32\x43\x33\x34\
-\x38\x2e\x34\x30\x36\x2c\x39\x39\x2e\x37\x39\x38\x2c\x33\x30\x34\
-\x2e\x34\x30\x36\x2c\x38\x30\x2c\x32\x35\x36\x2c\x38\x30\x63\x2d\
-\x39\x36\x2e\x37\x39\x37\x2c\x30\x2d\x31\x37\x36\x2c\x37\x39\x2e\
-\x32\x30\x33\x2d\x31\x37\x36\x2c\x31\x37\x36\x73\x37\x38\x2e\x30\
-\x39\x34\x2c\x31\x37\x36\x2c\x31\x37\x36\x2c\x31\x37\x36\x0d\x0a\
-\x09\x09\x63\x38\x31\x2e\x30\x34\x35\x2c\x30\x2c\x31\x34\x38\x2e\
-\x32\x38\x37\x2d\x35\x34\x2e\x31\x33\x34\x2c\x31\x36\x39\x2e\x34\
-\x30\x31\x2d\x31\x32\x38\x48\x33\x37\x38\x2e\x38\x35\x43\x33\x36\
-\x30\x2e\x31\x30\x35\x2c\x33\x35\x33\x2e\x35\x36\x31\x2c\x33\x31\
-\x31\x2e\x37\x31\x32\x2c\x33\x38\x38\x2c\x32\x35\x36\x2c\x33\x38\
-\x38\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\
-\x76\x67\x3e\x0d\x0a\
-\x00\x00\x03\x0c\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x43\x68\x65\x63\x6b\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
+\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
+\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
+\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
+\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
+\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
+\x74\x3d\x27\x31\x38\x2e\x37\x35\x70\x74\x27\x20\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\
+\x78\x3d\x27\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\
+\x38\x33\x20\x31\x38\x2e\x37\x35\x20\x31\x38\x2e\x37\x35\x27\x20\
+\x77\x69\x64\x74\x68\x3d\x27\x31\x38\x2e\x37\x35\x70\x74\x27\x20\
+\x78\x6d\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
+\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\
 \x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
-\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\
-\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\
-\x78\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\
-\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\
-\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\
-\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\
-\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\
-\x4d\x38\x2e\x32\x39\x34\x2c\x31\x36\x2e\x39\x39\x38\x63\x2d\x30\
-\x2e\x34\x33\x35\x2c\x30\x2d\x30\x2e\x38\x34\x37\x2d\x30\x2e\x32\
-\x30\x33\x2d\x31\x2e\x31\x31\x31\x2d\x30\x2e\x35\x35\x33\x4c\x33\
-\x2e\x36\x31\x2c\x31\x31\x2e\x37\x32\x34\x63\x2d\x30\x2e\x34\x36\
-\x35\x2d\x30\x2e\x36\x31\x33\x2d\x30\x2e\x33\x34\x34\x2d\x31\x2e\
-\x34\x38\x36\x2c\x30\x2e\x32\x37\x2d\x31\x2e\x39\x35\x31\x0d\x0a\
-\x09\x63\x30\x2e\x36\x31\x35\x2d\x30\x2e\x34\x36\x37\x2c\x31\x2e\
-\x34\x38\x38\x2d\x30\x2e\x33\x34\x34\x2c\x31\x2e\x39\x35\x33\x2c\
-\x30\x2e\x32\x37\x6c\x32\x2e\x33\x35\x31\x2c\x33\x2e\x31\x30\x34\
-\x6c\x35\x2e\x39\x31\x31\x2d\x39\x2e\x34\x39\x32\x63\x30\x2e\x34\
-\x30\x37\x2d\x30\x2e\x36\x35\x32\x2c\x31\x2e\x32\x36\x37\x2d\x30\
-\x2e\x38\x35\x32\x2c\x31\x2e\x39\x32\x31\x2d\x30\x2e\x34\x34\x35\
-\x0d\x0a\x09\x63\x30\x2e\x36\x35\x33\x2c\x30\x2e\x34\x30\x36\x2c\
-\x30\x2e\x38\x35\x34\x2c\x31\x2e\x32\x36\x36\x2c\x30\x2e\x34\x34\
-\x36\x2c\x31\x2e\x39\x32\x4c\x39\x2e\x34\x37\x38\x2c\x31\x36\x2e\
-\x33\x34\x63\x2d\x30\x2e\x32\x34\x32\x2c\x30\x2e\x33\x39\x31\x2d\
-\x30\x2e\x36\x36\x31\x2c\x30\x2e\x36\x33\x35\x2d\x31\x2e\x31\x32\
-\x2c\x30\x2e\x36\x35\x36\x43\x38\x2e\x33\x33\x36\x2c\x31\x36\x2e\
-\x39\x39\x38\x2c\x38\x2e\x33\x31\x36\x2c\x31\x36\x2e\x39\x39\x38\
-\x2c\x38\x2e\x32\x39\x34\x2c\x31\x36\x2e\x39\x39\x38\x7a\x22\x2f\
-\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x02\xfc\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x5f\x32\x30\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\
-\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\
-\x35\x36\x2c\x34\x38\x43\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\
-\x2c\x34\x38\x2c\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\x2c\x32\
-\x35\x36\x73\x39\x33\x2e\x36\x30\x31\x2c\x32\x30\x38\x2c\x32\x30\
-\x38\x2c\x32\x30\x38\x73\x32\x30\x38\x2d\x39\x33\x2e\x36\x30\x31\
-\x2c\x32\x30\x38\x2d\x32\x30\x38\x53\x33\x37\x30\x2e\x33\x39\x39\
-\x2c\x34\x38\x2c\x32\x35\x36\x2c\x34\x38\x7a\x20\x4d\x32\x35\x36\
-\x2c\x34\x32\x32\x2e\x33\x39\x39\x0d\x0a\x09\x09\x09\x63\x2d\x39\
-\x31\x2e\x35\x31\x38\x2c\x30\x2d\x31\x36\x36\x2e\x33\x39\x39\x2d\
-\x37\x34\x2e\x38\x38\x32\x2d\x31\x36\x36\x2e\x33\x39\x39\x2d\x31\
-\x36\x36\x2e\x33\x39\x39\x53\x31\x36\x34\x2e\x34\x38\x32\x2c\x38\
-\x39\x2e\x36\x2c\x32\x35\x36\x2c\x38\x39\x2e\x36\x53\x34\x32\x32\
-\x2e\x34\x2c\x31\x36\x34\x2e\x34\x38\x32\x2c\x34\x32\x32\x2e\x34\
-\x2c\x32\x35\x36\x53\x33\x34\x37\x2e\x35\x31\x38\x2c\x34\x32\x32\
-\x2e\x33\x39\x39\x2c\x32\x35\x36\x2c\x34\x32\x32\x2e\x33\x39\x39\
-\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\
-\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x27\x3e\x0a\x3c\
+\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\x3e\x0a\x3c\x67\
+\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\
+\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\
+\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x35\x2e\x37\x38\x34\x34\
+\x20\x36\x33\x2e\x32\x33\x33\x33\x29\x27\x3e\x0a\x3c\x70\x61\x74\
+\x68\x20\x64\x3d\x27\x4d\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x20\
+\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x38\x2e\x36\x35\x37\x33\x34\
+\x20\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x38\x2e\x36\x35\x37\x33\
+\x34\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x2d\x38\x2e\x36\
+\x35\x37\x33\x34\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x2d\
+\x38\x2e\x36\x35\x37\x33\x34\x20\x38\x2e\x36\x35\x37\x33\x34\x5a\
+\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\
+\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\
+\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\
+\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\
+\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\
+\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\
+\x2d\x77\x69\x64\x74\x68\x3d\x27\x31\x2e\x35\x30\x35\x36\x32\x27\
+\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\
+\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\
+\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\
+\x36\x34\x20\x36\x35\x2e\x37\x38\x34\x34\x20\x36\x33\x2e\x32\x33\
+\x33\x33\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\
+\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x20\x2d\x30\x4c\x20\x38\x2e\
+\x36\x35\x37\x33\x34\x20\x30\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\
+\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\
+\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\
+\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\
+\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\
+\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\
+\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\
+\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x31\
+\x2e\x35\x30\x35\x36\x32\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\
+\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\
+\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\
+\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x35\x2e\x37\x38\x34\
+\x34\x20\x36\x33\x2e\x32\x33\x33\x33\x29\x27\x3e\x0a\x3c\x70\x61\
+\x74\x68\x20\x64\x3d\x27\x4d\x20\x30\x20\x38\x2e\x36\x35\x37\x33\
+\x34\x4c\x20\x30\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x27\x20\x66\
+\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\
+\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\
+\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\
+\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\
+\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\
+\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\
+\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\
+\x64\x74\x68\x3d\x27\x31\x2e\x35\x30\x35\x36\x32\x27\x2f\x3e\x0a\
+\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
 \x00\x00\x03\x4c\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
@@ -1262,7 +1299,7 @@
 \x2c\x34\x32\x32\x2e\x34\x2c\x32\x35\x36\x2c\x34\x32\x32\x2e\x34\
 \x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\
 \x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x04\x64\
+\x00\x00\x03\xeb\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
@@ -1289,113 +1326,189 @@
 \x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
 \x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
 \x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\x0d\x0a\x09\
-\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x31\
-\x37\x36\x63\x2d\x34\x34\x2e\x30\x30\x34\x2c\x30\x2d\x38\x30\x2e\
-\x30\x30\x31\x2c\x33\x36\x2d\x38\x30\x2e\x30\x30\x31\x2c\x38\x30\
-\x63\x30\x2c\x34\x34\x2e\x30\x30\x34\x2c\x33\x35\x2e\x39\x39\x37\
-\x2c\x38\x30\x2c\x38\x30\x2e\x30\x30\x31\x2c\x38\x30\x63\x34\x34\
-\x2e\x30\x30\x35\x2c\x30\x2c\x37\x39\x2e\x39\x39\x39\x2d\x33\x35\
-\x2e\x39\x39\x36\x2c\x37\x39\x2e\x39\x39\x39\x2d\x38\x30\x0d\x0a\
-\x09\x09\x09\x43\x33\x33\x35\x2e\x39\x39\x39\x2c\x32\x31\x32\x2c\
-\x33\x30\x30\x2e\x30\x30\x35\x2c\x31\x37\x36\x2c\x32\x35\x36\x2c\
-\x31\x37\x36\x7a\x20\x4d\x34\x34\x36\x2e\x39\x33\x38\x2c\x32\x33\
-\x34\x2e\x36\x36\x37\x63\x2d\x39\x2e\x36\x30\x35\x2d\x38\x38\x2e\
-\x35\x33\x31\x2d\x38\x31\x2e\x30\x37\x34\x2d\x31\x36\x30\x2d\x31\
-\x36\x39\x2e\x36\x30\x35\x2d\x31\x36\x39\x2e\x35\x39\x39\x56\x33\
-\x32\x68\x2d\x34\x32\x2e\x36\x36\x36\x76\x33\x33\x2e\x30\x36\x37\
-\x0d\x0a\x09\x09\x09\x63\x2d\x38\x38\x2e\x35\x33\x31\x2c\x39\x2e\
-\x35\x39\x39\x2d\x31\x36\x30\x2c\x38\x31\x2e\x30\x36\x38\x2d\x31\
-\x36\x39\x2e\x36\x30\x34\x2c\x31\x36\x39\x2e\x35\x39\x39\x48\x33\
-\x32\x76\x34\x32\x2e\x36\x36\x37\x68\x33\x33\x2e\x30\x36\x32\x63\
-\x39\x2e\x36\x30\x34\x2c\x38\x38\x2e\x35\x33\x31\x2c\x38\x31\x2e\
-\x30\x37\x32\x2c\x31\x36\x30\x2c\x31\x36\x39\x2e\x36\x30\x34\x2c\
-\x31\x36\x39\x2e\x36\x30\x34\x56\x34\x38\x30\x68\x34\x32\x2e\x36\
-\x36\x36\x76\x2d\x33\x33\x2e\x30\x36\x32\x0d\x0a\x09\x09\x09\x63\
-\x38\x38\x2e\x35\x33\x31\x2d\x39\x2e\x36\x30\x34\x2c\x31\x36\x30\
-\x2d\x38\x31\x2e\x30\x37\x33\x2c\x31\x36\x39\x2e\x36\x30\x35\x2d\
-\x31\x36\x39\x2e\x36\x30\x34\x48\x34\x38\x30\x76\x2d\x34\x32\x2e\
-\x36\x36\x37\x48\x34\x34\x36\x2e\x39\x33\x38\x7a\x20\x4d\x32\x35\
-\x36\x2c\x34\x30\x35\x2e\x33\x33\x33\x63\x2d\x38\x32\x2e\x31\x33\
-\x37\x2c\x30\x2d\x31\x34\x39\x2e\x33\x33\x34\x2d\x36\x37\x2e\x31\
-\x39\x38\x2d\x31\x34\x39\x2e\x33\x33\x34\x2d\x31\x34\x39\x2e\x33\
-\x33\x33\x0d\x0a\x09\x09\x09\x63\x30\x2d\x38\x32\x2e\x31\x33\x36\
-\x2c\x36\x37\x2e\x31\x39\x37\x2d\x31\x34\x39\x2e\x33\x33\x33\x2c\
-\x31\x34\x39\x2e\x33\x33\x34\x2d\x31\x34\x39\x2e\x33\x33\x33\x63\
-\x38\x32\x2e\x31\x33\x35\x2c\x30\x2c\x31\x34\x39\x2e\x33\x33\x32\
-\x2c\x36\x37\x2e\x31\x39\x38\x2c\x31\x34\x39\x2e\x33\x33\x32\x2c\
-\x31\x34\x39\x2e\x33\x33\x33\x43\x34\x30\x35\x2e\x33\x33\x32\x2c\
-\x33\x33\x38\x2e\x31\x33\x35\x2c\x33\x33\x38\x2e\x31\x33\x35\x2c\
-\x34\x30\x35\x2e\x33\x33\x33\x2c\x32\x35\x36\x2c\x34\x30\x35\x2e\
-\x33\x33\x33\x7a\x0d\x0a\x09\x09\x09\x22\x2f\x3e\x0d\x0a\x09\x3c\
-\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\
-\x3e\x0d\x0a\
-\x00\x00\x03\x36\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
+\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
+\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
+\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
+\x0a\x3c\x67\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\
+\x4d\x32\x35\x36\x2c\x31\x32\x38\x63\x2d\x38\x31\x2e\x39\x2c\x30\
+\x2d\x31\x34\x35\x2e\x37\x2c\x34\x38\x2e\x38\x2d\x32\x32\x34\x2c\
+\x31\x32\x38\x63\x36\x37\x2e\x34\x2c\x36\x37\x2e\x37\x2c\x31\x32\
+\x34\x2c\x31\x32\x38\x2c\x32\x32\x34\x2c\x31\x32\x38\x63\x39\x39\
+\x2e\x39\x2c\x30\x2c\x31\x37\x33\x2e\x34\x2d\x37\x36\x2e\x34\x2c\
+\x32\x32\x34\x2d\x31\x32\x36\x2e\x36\x0d\x0a\x09\x09\x43\x34\x32\
+\x38\x2e\x32\x2c\x31\x39\x38\x2e\x36\x2c\x33\x35\x34\x2e\x38\x2c\
+\x31\x32\x38\x2c\x32\x35\x36\x2c\x31\x32\x38\x7a\x20\x4d\x32\x35\
+\x36\x2c\x33\x34\x37\x2e\x33\x63\x2d\x34\x39\x2e\x34\x2c\x30\x2d\
+\x38\x39\x2e\x36\x2d\x34\x31\x2d\x38\x39\x2e\x36\x2d\x39\x31\x2e\
+\x33\x63\x30\x2d\x35\x30\x2e\x34\x2c\x34\x30\x2e\x32\x2d\x39\x31\
+\x2e\x33\x2c\x38\x39\x2e\x36\x2d\x39\x31\x2e\x33\x73\x38\x39\x2e\
+\x36\x2c\x34\x31\x2c\x38\x39\x2e\x36\x2c\x39\x31\x2e\x33\x0d\x0a\
+\x09\x09\x43\x33\x34\x35\x2e\x36\x2c\x33\x30\x36\x2e\x34\x2c\x33\
+\x30\x35\x2e\x34\x2c\x33\x34\x37\x2e\x33\x2c\x32\x35\x36\x2c\x33\
+\x34\x37\x2e\x33\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x67\x3e\x0d\x0a\
+\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\
+\x32\x32\x34\x63\x30\x2d\x37\x2e\x39\x2c\x32\x2e\x39\x2d\x31\x35\
+\x2e\x31\x2c\x37\x2e\x36\x2d\x32\x30\x2e\x37\x63\x2d\x32\x2e\x35\
+\x2d\x30\x2e\x34\x2d\x35\x2d\x30\x2e\x36\x2d\x37\x2e\x36\x2d\x30\
+\x2e\x36\x63\x2d\x32\x38\x2e\x38\x2c\x30\x2d\x35\x32\x2e\x33\x2c\
+\x32\x33\x2e\x39\x2d\x35\x32\x2e\x33\x2c\x35\x33\x2e\x33\x63\x30\
+\x2c\x32\x39\x2e\x34\x2c\x32\x33\x2e\x35\x2c\x35\x33\x2e\x33\x2c\
+\x35\x32\x2e\x33\x2c\x35\x33\x2e\x33\x0d\x0a\x09\x09\x09\x73\x35\
+\x32\x2e\x33\x2d\x32\x33\x2e\x39\x2c\x35\x32\x2e\x33\x2d\x35\x33\
+\x2e\x33\x63\x30\x2d\x32\x2e\x33\x2d\x30\x2e\x32\x2d\x34\x2e\x36\
+\x2d\x30\x2e\x34\x2d\x36\x2e\x39\x63\x2d\x35\x2e\x35\x2c\x34\x2e\
+\x33\x2d\x31\x32\x2e\x33\x2c\x36\x2e\x39\x2d\x31\x39\x2e\x38\x2c\
+\x36\x2e\x39\x43\x32\x37\x30\x2e\x33\x2c\x32\x35\x36\x2c\x32\x35\
+\x36\x2c\x32\x34\x31\x2e\x37\x2c\x32\x35\x36\x2c\x32\x32\x34\x7a\
+\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\
+\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x04\x22\
 \x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
-\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\
-\x22\x33\x39\x36\x2e\x37\x39\x35\x2c\x33\x39\x36\x2e\x38\x20\x33\
-\x32\x30\x2c\x33\x39\x36\x2e\x38\x20\x33\x32\x30\x2c\x34\x34\x38\
-\x20\x34\x34\x38\x2c\x34\x34\x38\x20\x34\x34\x38\x2c\x33\x32\x30\
-\x20\x33\x39\x36\x2e\x37\x39\x35\x2c\x33\x32\x30\x20\x09\x22\x2f\
-\x3e\x0d\x0a\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\
-\x6e\x74\x73\x3d\x22\x33\x39\x36\x2e\x38\x2c\x31\x31\x35\x2e\x32\
-\x30\x35\x20\x33\x39\x36\x2e\x38\x2c\x31\x39\x32\x20\x34\x34\x38\
-\x2c\x31\x39\x32\x20\x34\x34\x38\x2c\x36\x34\x20\x33\x32\x30\x2c\
-\x36\x34\x20\x33\x32\x30\x2c\x31\x31\x35\x2e\x32\x30\x35\x20\x09\
-\x22\x2f\x3e\x0d\x0a\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\
-\x6f\x69\x6e\x74\x73\x3d\x22\x31\x31\x35\x2e\x32\x30\x35\x2c\x31\
-\x31\x35\x2e\x32\x20\x31\x39\x32\x2c\x31\x31\x35\x2e\x32\x20\x31\
-\x39\x32\x2c\x36\x34\x20\x36\x34\x2c\x36\x34\x20\x36\x34\x2c\x31\
-\x39\x32\x20\x31\x31\x35\x2e\x32\x30\x35\x2c\x31\x39\x32\x20\x09\
-\x22\x2f\x3e\x0d\x0a\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\
-\x6f\x69\x6e\x74\x73\x3d\x22\x31\x31\x35\x2e\x32\x2c\x33\x39\x36\
-\x2e\x37\x39\x35\x20\x31\x31\x35\x2e\x32\x2c\x33\x32\x30\x20\x36\
-\x34\x2c\x33\x32\x30\x20\x36\x34\x2c\x34\x34\x38\x20\x31\x39\x32\
-\x2c\x34\x34\x38\x20\x31\x39\x32\x2c\x33\x39\x36\x2e\x37\x39\x35\
-\x20\x09\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\
-\x76\x67\x3e\x0d\x0a\
-\x00\x00\x02\xf7\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
+\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
+\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
+\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
+\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
+\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
+\x74\x3d\x27\x32\x34\x70\x74\x27\x20\x76\x65\x72\x73\x69\x6f\x6e\
+\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x27\
+\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\x38\x33\x20\
+\x32\x34\x20\x32\x34\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x32\x34\
+\x70\x74\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
+\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
+\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
+\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\
+\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
+\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
+\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
+\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x2d\x39\x2e\x33\x39\
+\x31\x31\x38\x20\x2d\x30\x4c\x20\x2d\x36\x2e\x36\x34\x30\x35\x37\
+\x20\x2d\x31\x32\x2e\x30\x34\x35\x4c\x20\x38\x2e\x36\x37\x36\x33\
+\x32\x20\x2d\x36\x2e\x35\x31\x38\x37\x31\x4c\x20\x33\x2e\x33\x32\
+\x30\x32\x38\x20\x36\x2e\x30\x32\x32\x35\x27\x20\x66\x69\x6c\x6c\
+\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\
+\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\
+\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\
+\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\
+\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\
+\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\
+\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\
+\x3d\x27\x31\x2e\x37\x35\x36\x35\x36\x27\x2f\x3e\x0a\x3c\x2f\x67\
+\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
+\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
+\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
+\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\
+\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x2d\x39\x2e\x33\
+\x39\x31\x31\x38\x27\x20\x63\x79\x3d\x27\x2d\x30\x27\x20\x72\x3d\
+\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\
+\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
+\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
+\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\
+\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\
+\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\x3c\x63\
+\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x2d\x36\x2e\x36\x34\x30\
+\x35\x37\x27\x20\x63\x79\x3d\x27\x2d\x31\x32\x2e\x30\x34\x35\x27\
+\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\
+\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\
+\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\
+\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\
+\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\
+\x2e\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\
+\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x38\x2e\x36\
+\x37\x36\x33\x32\x27\x20\x63\x79\x3d\x27\x2d\x36\x2e\x35\x31\x38\
+\x37\x31\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\
+\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\
+\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\
+\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\
+\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\
+\x20\x36\x38\x2e\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\
+\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\
+\x33\x2e\x33\x32\x30\x32\x38\x27\x20\x63\x79\x3d\x27\x36\x2e\x30\
+\x32\x32\x35\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\
+\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\
+\x3e\x0a\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\
+\x3e\
+\x00\x00\x04\x30\
 \x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
+\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
+\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
+\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
+\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
+\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
+\x74\x3d\x27\x32\x34\x70\x74\x27\x20\x76\x65\x72\x73\x69\x6f\x6e\
+\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x27\
+\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\x38\x33\x20\
+\x32\x34\x20\x32\x34\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x32\x34\
+\x70\x74\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
+\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
+\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
+\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\
+\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
+\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
+\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
+\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x2d\x39\x2e\x33\x39\
+\x31\x31\x38\x20\x2d\x30\x4c\x20\x2d\x36\x2e\x36\x34\x30\x35\x37\
+\x20\x2d\x31\x32\x2e\x30\x34\x35\x4c\x20\x38\x2e\x36\x37\x36\x33\
+\x32\x20\x2d\x36\x2e\x35\x31\x38\x37\x31\x4c\x20\x33\x2e\x33\x32\
+\x30\x32\x38\x20\x36\x2e\x30\x32\x32\x35\x4c\x20\x2d\x39\x2e\x33\
+\x39\x31\x31\x38\x20\x2d\x30\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\
+\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\
+\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\
+\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\
+\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\
+\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\
+\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\
+\x31\x2e\x37\x35\x36\x35\x36\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
+\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
+\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\
+\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\
+\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\x3c\x63\
+\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x2d\x39\x2e\x33\x39\x31\
+\x31\x38\x27\x20\x63\x79\x3d\x27\x2d\x30\x27\x20\x72\x3d\x27\x33\
+\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\
+\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\
+\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\
+\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\
+\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\
+\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\x3c\x63\x69\x72\
+\x63\x6c\x65\x20\x63\x78\x3d\x27\x2d\x36\x2e\x36\x34\x30\x35\x37\
+\x27\x20\x63\x79\x3d\x27\x2d\x31\x32\x2e\x30\x34\x35\x27\x20\x72\
+\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\
+\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\
+\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\
+\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\
+\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\
+\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\x3c\
+\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x38\x2e\x36\x37\x36\
+\x33\x32\x27\x20\x63\x79\x3d\x27\x2d\x36\x2e\x35\x31\x38\x37\x31\
+\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\
+\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\
+\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\
+\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\
+\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\
+\x38\x2e\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\
+\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x33\x2e\
+\x33\x32\x30\x32\x38\x27\x20\x63\x79\x3d\x27\x36\x2e\x30\x32\x32\
+\x35\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\
+\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\
+\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x03\x0c\
+\x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
 \x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
 \x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\
 \x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
 \x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
 \x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
@@ -1407,39 +1520,40 @@
 \x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
 \x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
 \x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
-\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
-\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
-\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
-\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
-\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x31\x37\x2e\x34\
-\x2c\x32\x32\x34\x48\x32\x38\x38\x56\x39\x34\x2e\x36\x63\x30\x2d\
-\x31\x36\x2e\x39\x2d\x31\x34\x2e\x33\x2d\x33\x30\x2e\x36\x2d\x33\
-\x32\x2d\x33\x30\x2e\x36\x63\x2d\x31\x37\x2e\x37\x2c\x30\x2d\x33\
-\x32\x2c\x31\x33\x2e\x37\x2d\x33\x32\x2c\x33\x30\x2e\x36\x56\x32\
-\x32\x34\x48\x39\x34\x2e\x36\x43\x37\x37\x2e\x37\x2c\x32\x32\x34\
-\x2c\x36\x34\x2c\x32\x33\x38\x2e\x33\x2c\x36\x34\x2c\x32\x35\x36\
-\x0d\x0a\x09\x63\x30\x2c\x31\x37\x2e\x37\x2c\x31\x33\x2e\x37\x2c\
-\x33\x32\x2c\x33\x30\x2e\x36\x2c\x33\x32\x48\x32\x32\x34\x76\x31\
-\x32\x39\x2e\x34\x63\x30\x2c\x31\x36\x2e\x39\x2c\x31\x34\x2e\x33\
-\x2c\x33\x30\x2e\x36\x2c\x33\x32\x2c\x33\x30\x2e\x36\x63\x31\x37\
-\x2e\x37\x2c\x30\x2c\x33\x32\x2d\x31\x33\x2e\x37\x2c\x33\x32\x2d\
-\x33\x30\x2e\x36\x56\x32\x38\x38\x68\x31\x32\x39\x2e\x34\x63\x31\
-\x36\x2e\x39\x2c\x30\x2c\x33\x30\x2e\x36\x2d\x31\x34\x2e\x33\x2c\
-\x33\x30\x2e\x36\x2d\x33\x32\x0d\x0a\x09\x43\x34\x34\x38\x2c\x32\
-\x33\x38\x2e\x33\x2c\x34\x33\x34\x2e\x33\x2c\x32\x32\x34\x2c\x34\
-\x31\x37\x2e\x34\x2c\x32\x32\x34\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\
-\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x03\x52\
+\x3d\x22\x43\x68\x65\x63\x6b\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
+\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
+\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\
+\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\
+\x78\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\
+\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\
+\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\
+\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\
+\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\
+\x4d\x38\x2e\x32\x39\x34\x2c\x31\x36\x2e\x39\x39\x38\x63\x2d\x30\
+\x2e\x34\x33\x35\x2c\x30\x2d\x30\x2e\x38\x34\x37\x2d\x30\x2e\x32\
+\x30\x33\x2d\x31\x2e\x31\x31\x31\x2d\x30\x2e\x35\x35\x33\x4c\x33\
+\x2e\x36\x31\x2c\x31\x31\x2e\x37\x32\x34\x63\x2d\x30\x2e\x34\x36\
+\x35\x2d\x30\x2e\x36\x31\x33\x2d\x30\x2e\x33\x34\x34\x2d\x31\x2e\
+\x34\x38\x36\x2c\x30\x2e\x32\x37\x2d\x31\x2e\x39\x35\x31\x0d\x0a\
+\x09\x63\x30\x2e\x36\x31\x35\x2d\x30\x2e\x34\x36\x37\x2c\x31\x2e\
+\x34\x38\x38\x2d\x30\x2e\x33\x34\x34\x2c\x31\x2e\x39\x35\x33\x2c\
+\x30\x2e\x32\x37\x6c\x32\x2e\x33\x35\x31\x2c\x33\x2e\x31\x30\x34\
+\x6c\x35\x2e\x39\x31\x31\x2d\x39\x2e\x34\x39\x32\x63\x30\x2e\x34\
+\x30\x37\x2d\x30\x2e\x36\x35\x32\x2c\x31\x2e\x32\x36\x37\x2d\x30\
+\x2e\x38\x35\x32\x2c\x31\x2e\x39\x32\x31\x2d\x30\x2e\x34\x34\x35\
+\x0d\x0a\x09\x63\x30\x2e\x36\x35\x33\x2c\x30\x2e\x34\x30\x36\x2c\
+\x30\x2e\x38\x35\x34\x2c\x31\x2e\x32\x36\x36\x2c\x30\x2e\x34\x34\
+\x36\x2c\x31\x2e\x39\x32\x4c\x39\x2e\x34\x37\x38\x2c\x31\x36\x2e\
+\x33\x34\x63\x2d\x30\x2e\x32\x34\x32\x2c\x30\x2e\x33\x39\x31\x2d\
+\x30\x2e\x36\x36\x31\x2c\x30\x2e\x36\x33\x35\x2d\x31\x2e\x31\x32\
+\x2c\x30\x2e\x36\x35\x36\x43\x38\x2e\x33\x33\x36\x2c\x31\x36\x2e\
+\x39\x39\x38\x2c\x38\x2e\x33\x31\x36\x2c\x31\x36\x2e\x39\x39\x38\
+\x2c\x38\x2e\x32\x39\x34\x2c\x31\x36\x2e\x39\x39\x38\x7a\x22\x2f\
+\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x02\xa2\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
@@ -1470,32 +1584,21 @@
 \x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
 \x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
 \x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\
-\x64\x3d\x22\x4d\x34\x33\x37\x2e\x33\x33\x34\x2c\x31\x34\x34\x48\
-\x32\x35\x36\x2e\x30\x30\x36\x6c\x2d\x34\x32\x2e\x36\x36\x38\x2d\
-\x34\x38\x48\x37\x34\x2e\x36\x36\x36\x43\x35\x31\x2e\x31\x39\x37\
-\x2c\x39\x36\x2c\x33\x32\x2c\x31\x31\x35\x2e\x31\x39\x38\x2c\x33\
-\x32\x2c\x31\x33\x38\x2e\x36\x36\x37\x76\x32\x33\x34\x2e\x36\x36\
-\x36\x43\x33\x32\x2c\x33\x39\x36\x2e\x38\x30\x32\x2c\x35\x31\x2e\
-\x31\x39\x37\x2c\x34\x31\x36\x2c\x37\x34\x2e\x36\x36\x36\x2c\x34\
-\x31\x36\x68\x33\x36\x32\x2e\x36\x36\x38\x0d\x0a\x09\x43\x34\x36\
-\x30\x2e\x38\x30\x33\x2c\x34\x31\x36\x2c\x34\x38\x30\x2c\x33\x39\
-\x36\x2e\x38\x30\x32\x2c\x34\x38\x30\x2c\x33\x37\x33\x2e\x33\x33\
-\x33\x56\x31\x38\x36\x2e\x36\x36\x37\x43\x34\x38\x30\x2c\x31\x36\
-\x33\x2e\x31\x39\x38\x2c\x34\x36\x30\x2e\x38\x30\x33\x2c\x31\x34\
-\x34\x2c\x34\x33\x37\x2e\x33\x33\x34\x2c\x31\x34\x34\x7a\x20\x4d\
-\x34\x34\x38\x2c\x33\x37\x33\x2e\x33\x33\x33\x0d\x0a\x09\x63\x30\
-\x2c\x35\x2e\x37\x38\x32\x2d\x34\x2e\x38\x38\x35\x2c\x31\x30\x2e\
-\x36\x36\x37\x2d\x31\x30\x2e\x36\x36\x36\x2c\x31\x30\x2e\x36\x36\
-\x37\x48\x37\x34\x2e\x36\x36\x36\x43\x36\x38\x2e\x38\x38\x34\x2c\
-\x33\x38\x34\x2c\x36\x34\x2c\x33\x37\x39\x2e\x31\x31\x35\x2c\x36\
-\x34\x2c\x33\x37\x33\x2e\x33\x33\x33\x56\x31\x37\x36\x68\x33\x37\
-\x33\x2e\x33\x33\x34\x63\x35\x2e\x37\x38\x31\x2c\x30\x2c\x31\x30\
-\x2e\x36\x36\x36\x2c\x34\x2e\x38\x38\x35\x2c\x31\x30\x2e\x36\x36\
-\x36\x2c\x31\x30\x2e\x36\x36\x37\x0d\x0a\x09\x56\x33\x37\x33\x2e\
-\x33\x33\x33\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x32\x38\x2c\x34\x30\
+\x35\x2e\x34\x32\x39\x43\x31\x32\x38\x2c\x34\x32\x38\x2e\x38\x34\
+\x36\x2c\x31\x34\x37\x2e\x31\x39\x38\x2c\x34\x34\x38\x2c\x31\x37\
+\x30\x2e\x36\x36\x37\x2c\x34\x34\x38\x68\x31\x37\x30\x2e\x36\x36\
+\x37\x43\x33\x36\x34\x2e\x38\x30\x32\x2c\x34\x34\x38\x2c\x33\x38\
+\x34\x2c\x34\x32\x38\x2e\x38\x34\x36\x2c\x33\x38\x34\x2c\x34\x30\
+\x35\x2e\x34\x32\x39\x56\x31\x36\x30\x48\x31\x32\x38\x56\x34\x30\
+\x35\x2e\x34\x32\x39\x7a\x20\x4d\x34\x31\x36\x2c\x39\x36\x0d\x0a\
+\x09\x09\x68\x2d\x38\x30\x6c\x2d\x32\x36\x2e\x37\x38\x35\x2d\x33\
+\x32\x48\x32\x30\x32\x2e\x37\x38\x36\x4c\x31\x37\x36\x2c\x39\x36\
+\x48\x39\x36\x76\x33\x32\x68\x33\x32\x30\x56\x39\x36\x7a\x22\x2f\
+\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
 \x0a\
-\x00\x00\x05\xca\
+\x00\x00\x07\x80\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
@@ -1526,227 +1629,97 @@
 \x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
 \x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
 \x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\
-\x64\x3d\x22\x4d\x34\x35\x30\x2e\x36\x37\x39\x2c\x32\x37\x33\x2e\
-\x35\x63\x2d\x31\x34\x2e\x35\x38\x35\x2d\x31\x34\x2e\x35\x37\x37\
-\x2d\x33\x36\x2e\x30\x35\x34\x2d\x31\x35\x2e\x38\x39\x2d\x35\x30\
-\x2e\x36\x33\x39\x2d\x31\x2e\x33\x31\x32\x6c\x2d\x34\x31\x2e\x36\
-\x38\x37\x2c\x34\x31\x2e\x36\x36\x34\x63\x2d\x31\x30\x2e\x38\x35\
-\x32\x2c\x31\x30\x2e\x38\x33\x36\x2d\x32\x33\x2e\x39\x33\x2c\x31\
-\x30\x2e\x38\x35\x39\x2d\x33\x31\x2e\x35\x36\x34\x2c\x31\x2e\x38\
-\x35\x32\x0d\x0a\x09\x63\x2d\x35\x2e\x30\x35\x37\x2d\x35\x2e\x39\
-\x36\x38\x2d\x33\x2e\x30\x36\x31\x2d\x32\x34\x2e\x33\x37\x34\x2d\
-\x31\x2e\x36\x34\x34\x2d\x33\x36\x2e\x30\x34\x39\x6c\x32\x30\x2e\
-\x39\x30\x37\x2d\x31\x37\x31\x2e\x38\x34\x39\x63\x31\x2e\x38\x36\
-\x37\x2d\x31\x35\x2e\x33\x35\x33\x2d\x39\x2e\x30\x37\x2d\x33\x30\
-\x2e\x31\x38\x35\x2d\x32\x34\x2e\x34\x33\x2d\x33\x32\x2e\x30\x35\
-\x31\x0d\x0a\x09\x63\x2d\x31\x35\x2e\x33\x35\x38\x2d\x31\x2e\x38\
-\x36\x37\x2d\x32\x39\x2e\x33\x32\x32\x2c\x39\x2e\x39\x33\x39\x2d\
-\x33\x31\x2e\x31\x39\x31\x2c\x32\x35\x2e\x32\x38\x39\x4c\x32\x36\
-\x37\x2e\x33\x37\x2c\x32\x33\x36\x2e\x30\x32\x31\x63\x2d\x31\x2e\
-\x32\x30\x35\x2c\x33\x2e\x33\x35\x38\x2d\x33\x2e\x37\x39\x2c\x33\
-\x2e\x39\x33\x38\x2d\x34\x2e\x30\x38\x31\x2d\x30\x2e\x35\x38\x32\
-\x4c\x32\x35\x35\x2e\x34\x34\x2c\x36\x30\x0d\x0a\x09\x63\x30\x2d\
-\x31\x35\x2e\x34\x36\x35\x2d\x31\x32\x2e\x35\x34\x32\x2d\x32\x38\
-\x2d\x32\x38\x2e\x30\x31\x34\x2d\x32\x38\x63\x2d\x31\x35\x2e\x34\
-\x37\x33\x2c\x30\x2d\x32\x38\x2e\x30\x31\x35\x2c\x31\x32\x2e\x35\
-\x33\x35\x2d\x32\x38\x2e\x30\x31\x35\x2c\x32\x38\x6c\x2d\x30\x2e\
-\x35\x35\x32\x2c\x31\x37\x36\x2e\x37\x35\x32\x63\x30\x2e\x31\x34\
-\x36\x2c\x32\x2e\x30\x34\x2d\x31\x2e\x36\x30\x34\x2c\x32\x2e\x36\
-\x32\x34\x2d\x31\x2e\x39\x32\x2c\x30\x2e\x32\x39\x34\x4c\x31\x37\
-\x32\x2e\x30\x31\x36\x2c\x39\x39\x2e\x30\x37\x37\x0d\x0a\x09\x63\
-\x2d\x32\x2e\x37\x35\x2d\x31\x35\x2e\x32\x31\x39\x2d\x31\x37\x2e\
-\x33\x32\x33\x2d\x32\x36\x2e\x32\x30\x33\x2d\x33\x32\x2e\x35\x34\
-\x38\x2d\x32\x33\x2e\x34\x35\x33\x63\x2d\x31\x35\x2e\x32\x32\x37\
-\x2c\x32\x2e\x37\x34\x38\x2d\x32\x35\x2e\x33\x33\x39\x2c\x31\x38\
-\x2e\x31\x38\x37\x2d\x32\x32\x2e\x35\x39\x31\x2c\x33\x33\x2e\x34\
-\x30\x33\x6c\x32\x32\x2e\x31\x39\x33\x2c\x31\x36\x31\x2e\x34\x35\
-\x35\x0d\x0a\x09\x63\x30\x2e\x30\x32\x33\x2c\x32\x2e\x38\x37\x32\
-\x2d\x30\x2e\x39\x34\x31\x2c\x34\x2e\x35\x31\x33\x2d\x32\x2e\x33\
-\x30\x38\x2c\x30\x2e\x38\x33\x31\x6c\x2d\x33\x33\x2e\x31\x30\x39\
-\x2d\x38\x38\x2e\x35\x31\x37\x63\x2d\x35\x2e\x31\x38\x2d\x31\x34\
-\x2e\x35\x37\x32\x2d\x32\x31\x2e\x31\x39\x36\x2d\x32\x33\x2e\x30\
-\x36\x35\x2d\x33\x35\x2e\x37\x37\x36\x2d\x31\x37\x2e\x38\x38\x39\
-\x0d\x0a\x09\x63\x2d\x31\x34\x2e\x35\x37\x39\x2c\x35\x2e\x31\x37\
-\x37\x2d\x32\x32\x2e\x32\x30\x31\x2c\x32\x32\x2e\x30\x36\x31\x2d\
-\x31\x37\x2e\x30\x32\x33\x2c\x33\x36\x2e\x36\x33\x31\x6c\x35\x38\
-\x2e\x30\x34\x32\x2c\x31\x38\x39\x2e\x36\x32\x35\x63\x30\x2e\x33\
-\x30\x33\x2c\x31\x2e\x30\x34\x36\x2c\x30\x2e\x36\x32\x34\x2c\x32\
-\x2e\x30\x38\x35\x2c\x30\x2e\x39\x35\x33\x2c\x33\x2e\x31\x31\x38\
-\x6c\x30\x2e\x31\x32\x31\x2c\x30\x2e\x33\x39\x0d\x0a\x09\x63\x30\
-\x2e\x30\x31\x31\x2c\x30\x2e\x30\x33\x31\x2c\x30\x2e\x30\x32\x35\
-\x2c\x30\x2e\x30\x35\x38\x2c\x30\x2e\x30\x33\x35\x2c\x30\x2e\x30\
-\x38\x38\x43\x31\x32\x36\x2e\x30\x37\x39\x2c\x34\x34\x34\x2e\x32\
-\x33\x33\x2c\x31\x37\x32\x2e\x35\x37\x2c\x34\x38\x30\x2c\x32\x32\
-\x37\x2e\x34\x32\x37\x2c\x34\x38\x30\x63\x33\x35\x2e\x31\x31\x36\
-\x2c\x30\x2c\x37\x31\x2e\x35\x39\x31\x2d\x31\x32\x2e\x33\x37\x38\
-\x2c\x39\x39\x2e\x33\x35\x37\x2d\x33\x33\x2e\x36\x37\x32\x0d\x0a\
-\x09\x63\x30\x2e\x30\x30\x31\x2c\x30\x2c\x30\x2e\x30\x30\x33\x2d\
-\x30\x2e\x30\x30\x32\x2c\x30\x2e\x30\x30\x33\x2d\x30\x2e\x30\x30\
-\x32\x63\x32\x39\x2e\x39\x39\x2d\x31\x38\x2e\x30\x35\x31\x2c\x31\
-\x32\x36\x2e\x30\x37\x31\x2d\x31\x32\x31\x2e\x33\x34\x37\x2c\x31\
-\x32\x36\x2e\x30\x37\x31\x2d\x31\x32\x31\x2e\x33\x34\x37\x43\x34\
-\x36\x37\x2e\x34\x34\x35\x2c\x33\x31\x30\x2e\x34\x30\x32\x2c\x34\
-\x36\x35\x2e\x32\x36\x36\x2c\x32\x38\x38\x2e\x30\x38\x2c\x34\x35\
-\x30\x2e\x36\x37\x39\x2c\x32\x37\x33\x2e\x35\x7a\x22\x2f\x3e\x0d\
-\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x04\xbd\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
-\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
-\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
-\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
-\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
-\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
-\x74\x3d\x27\x32\x34\x70\x74\x27\x20\x76\x65\x72\x73\x69\x6f\x6e\
-\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x27\
-\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\x38\x33\x20\
-\x32\x34\x20\x32\x34\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x32\x34\
-\x70\x74\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
-\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
-\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
-\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
-\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\
-\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
-\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
-\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
-\x37\x36\x35\x35\x20\x36\x39\x2e\x37\x36\x38\x38\x29\x27\x3e\x0a\
-\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x2d\x39\x2e\x33\x39\
-\x31\x31\x38\x20\x2d\x30\x43\x20\x2d\x39\x2e\x39\x36\x38\x36\x31\
-\x20\x2d\x33\x2e\x38\x33\x30\x30\x34\x20\x2d\x38\x2e\x35\x35\x37\
-\x30\x36\x20\x2d\x37\x2e\x35\x31\x39\x34\x34\x20\x2d\x36\x2e\x36\
-\x34\x30\x35\x37\x20\x2d\x31\x30\x2e\x32\x31\x37\x31\x43\x20\x2d\
-\x30\x2e\x34\x39\x31\x30\x38\x39\x20\x2d\x31\x38\x2e\x38\x37\x33\
-\x33\x20\x38\x2e\x33\x35\x36\x37\x36\x20\x2d\x31\x35\x2e\x31\x39\
-\x30\x36\x20\x38\x2e\x36\x37\x36\x33\x32\x20\x2d\x35\x2e\x35\x32\
-\x39\x34\x38\x43\x20\x38\x2e\x38\x33\x36\x20\x2d\x30\x2e\x37\x30\
-\x32\x30\x30\x38\x20\x36\x2e\x32\x33\x39\x36\x38\x20\x32\x2e\x39\
-\x34\x32\x30\x37\x20\x33\x2e\x33\x32\x30\x32\x38\x20\x35\x2e\x31\
-\x30\x38\x35\x37\x43\x20\x2d\x31\x2e\x39\x36\x38\x39\x31\x20\x39\
-\x2e\x30\x33\x33\x37\x31\x20\x2d\x38\x2e\x32\x36\x38\x39\x35\x20\
-\x37\x2e\x34\x34\x33\x37\x20\x2d\x39\x2e\x33\x39\x31\x31\x38\x20\
-\x2d\x30\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\
-\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\
-\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\
-\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\
-\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\
-\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\
-\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\
-\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x31\x2e\x37\x35\x36\
-\x35\x36\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\
-\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\
-\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\
-\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\x20\x36\x39\
-\x2e\x37\x36\x38\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\
-\x20\x63\x78\x3d\x27\x2d\x39\x2e\x33\x39\x31\x31\x38\x27\x20\x63\
-\x79\x3d\x27\x2d\x30\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\
-\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\
-\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\
-\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\
-\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\
-\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\x20\x36\x39\x2e\x37\
-\x36\x38\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\
-\x78\x3d\x27\x2d\x36\x2e\x36\x34\x30\x35\x37\x27\x20\x63\x79\x3d\
-\x27\x2d\x31\x30\x2e\x32\x31\x37\x31\x27\x20\x72\x3d\x27\x33\x2e\
-\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\
-\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\
-\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\
-\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\
-\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\x20\
-\x36\x39\x2e\x37\x36\x38\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\
-\x6c\x65\x20\x63\x78\x3d\x27\x38\x2e\x36\x37\x36\x33\x32\x27\x20\
-\x63\x79\x3d\x27\x2d\x35\x2e\x35\x32\x39\x34\x38\x27\x20\x72\x3d\
-\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\
-\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
-\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
-\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\
-\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\
-\x35\x35\x20\x36\x39\x2e\x37\x36\x38\x38\x29\x27\x3e\x0a\x3c\x63\
-\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x33\x2e\x33\x32\x30\x32\
-\x38\x27\x20\x63\x79\x3d\x27\x35\x2e\x31\x30\x38\x35\x37\x27\x20\
-\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\
-\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\
-\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
-\x00\x00\x04\xca\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\
-\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\
-\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x39\x2e\x32\x2e\x31\x2c\x20\
-\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\
-\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\
-\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\
-\x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\
-\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\
-\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\
-\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
-\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\
-\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\
-\x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\
-\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x09\x20\x69\x64\x3d\
-\x22\x73\x76\x67\x34\x36\x31\x39\x22\x20\x69\x6e\x6b\x73\x63\x61\
-\x70\x65\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x39\x31\
-\x2b\x64\x65\x76\x65\x6c\x2b\x6f\x73\x78\x6d\x65\x6e\x75\x20\x72\
-\x31\x32\x39\x31\x31\x22\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
-\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x74\x72\x69\x61\x6e\x67\x6c\
-\x65\x2d\x73\x74\x72\x6f\x6b\x65\x64\x2d\x31\x35\x2e\x73\x76\x67\
-\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\
-\x3a\x2f\x2f\x63\x72\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\
-\x6e\x73\x2e\x6f\x72\x67\x2f\x6e\x73\x23\x22\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\
-\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\
-\x73\x2f\x31\x2e\x31\x2f\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x69\x6e\
-\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
-\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\
-\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\x6e\x6b\x73\x63\
-\x61\x70\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\
-\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
-\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\
-\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\x22\x20\x78\x6d\x6c\
-\x6e\x73\x3a\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\x68\x74\x74\
-\x70\x3a\x2f\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\x73\x6f\x75\
-\x72\x63\x65\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\x44\x54\x44\
-\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\x74\x64\x22\
-\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\x68\x74\x74\x70\
-\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\
-\x30\x30\x2f\x73\x76\x67\x22\x0a\x09\x20\x78\x6d\x6c\x6e\x73\x3d\
-\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\
-\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\
-\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\
-\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\
-\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\
-\x79\x3d\x22\x30\x70\x78\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x31\
-\x35\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x35\x70\
-\x78\x22\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\
-\x30\x20\x31\x35\x20\x31\x35\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\
-\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\
-\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\x31\x35\x20\x31\x35\x3b\
-\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\
-\x73\x65\x72\x76\x65\x22\x3e\x0a\x3c\x70\x61\x74\x68\x20\x69\x64\
-\x3d\x22\x72\x65\x63\x74\x33\x33\x33\x38\x22\x20\x69\x6e\x6b\x73\
-\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\
-\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x20\x73\x6f\x64\
-\x69\x70\x6f\x64\x69\x3a\x6e\x6f\x64\x65\x74\x79\x70\x65\x73\x3d\
-\x22\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x22\x20\x64\
-\x3d\x22\x4d\x37\x2e\x35\x32\x34\x33\x2c\x31\x2e\x35\x30\x30\x34\
-\x0a\x09\x43\x37\x2e\x32\x34\x32\x39\x2c\x31\x2e\x34\x39\x31\x33\
-\x2c\x36\x2e\x39\x37\x38\x37\x2c\x31\x2e\x36\x34\x32\x33\x2c\x36\
-\x2e\x38\x33\x33\x36\x2c\x31\x2e\x38\x39\x35\x32\x6c\x2d\x35\x2e\
-\x35\x2c\x39\x2e\x38\x36\x39\x32\x43\x31\x2e\x30\x32\x31\x38\x2c\
-\x31\x32\x2e\x33\x30\x37\x38\x2c\x31\x2e\x33\x39\x35\x2c\x31\x32\
-\x2e\x39\x39\x39\x39\x2c\x32\x2c\x31\x33\x68\x31\x31\x0a\x09\x63\
-\x30\x2e\x36\x30\x35\x2d\x30\x2e\x30\x30\x30\x31\x2c\x30\x2e\x39\
-\x37\x38\x32\x2d\x30\x2e\x36\x39\x32\x32\x2c\x30\x2e\x36\x36\x36\
-\x34\x2d\x31\x2e\x32\x33\x35\x35\x6c\x2d\x35\x2e\x35\x2d\x39\x2e\
-\x38\x36\x39\x32\x43\x38\x2e\x30\x33\x30\x32\x2c\x31\x2e\x36\x35\
-\x37\x39\x2c\x37\x2e\x37\x38\x38\x34\x2c\x31\x2e\x35\x30\x39\x32\
-\x2c\x37\x2e\x35\x32\x34\x33\x2c\x31\x2e\x35\x30\x30\x34\x7a\x20\
-\x4d\x37\x2e\x35\x2c\x33\x2e\x38\x39\x39\x33\x6c\x34\x2e\x31\x32\
-\x36\x37\x2c\x37\x2e\x34\x37\x30\x34\x0a\x09\x48\x33\x2e\x33\x37\
-\x33\x33\x4c\x37\x2e\x35\x2c\x33\x2e\x38\x39\x39\x33\x7a\x22\x2f\
-\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x39\x33\x2e\x34\x36\
+\x2c\x32\x34\x39\x2e\x30\x35\x36\x63\x33\x2e\x37\x32\x33\x2d\x30\
+\x2e\x36\x37\x2c\x37\x2e\x35\x38\x39\x2d\x31\x2e\x30\x34\x31\x2c\
+\x31\x31\x2e\x35\x38\x36\x2d\x31\x2e\x30\x34\x31\x4c\x32\x30\x31\
+\x2e\x39\x32\x34\x2c\x32\x34\x38\x68\x31\x30\x33\x2e\x38\x32\x33\
+\x63\x34\x2e\x35\x30\x33\x2c\x30\x2c\x38\x2e\x38\x30\x36\x2d\x30\
+\x2e\x36\x31\x37\x2c\x31\x32\x2e\x39\x30\x38\x2d\x31\x2e\x37\x35\
+\x34\x0d\x0a\x09\x09\x63\x31\x39\x2e\x33\x37\x2d\x35\x2e\x33\x36\
+\x33\x2c\x33\x33\x2e\x33\x34\x35\x2d\x32\x32\x2e\x35\x33\x37\x2c\
+\x33\x33\x2e\x33\x34\x35\x2d\x34\x33\x2e\x36\x36\x33\x76\x2d\x33\
+\x30\x2e\x38\x32\x32\x76\x2d\x35\x36\x2e\x34\x30\x32\x63\x30\x2d\
+\x32\x34\x2e\x38\x33\x32\x2d\x32\x31\x2e\x31\x35\x2d\x34\x33\x2e\
+\x34\x38\x34\x2d\x34\x36\x2e\x32\x38\x39\x2d\x34\x37\x2e\x36\x30\
+\x36\x0d\x0a\x09\x09\x63\x2d\x31\x35\x2e\x39\x33\x31\x2d\x32\x2e\
+\x36\x32\x34\x2d\x33\x39\x2e\x32\x35\x38\x2d\x33\x2e\x38\x32\x37\
+\x2d\x35\x35\x2e\x30\x38\x39\x2d\x33\x2e\x37\x34\x39\x63\x2d\x31\
+\x35\x2e\x38\x32\x39\x2c\x30\x2e\x30\x38\x36\x2d\x33\x30\x2e\x39\
+\x38\x31\x2c\x31\x2e\x34\x30\x34\x2d\x34\x34\x2e\x32\x37\x37\x2c\
+\x33\x2e\x37\x34\x39\x43\x31\x36\x37\x2e\x31\x34\x33\x2c\x37\x34\
+\x2e\x35\x37\x36\x2c\x31\x36\x30\x2c\x38\x38\x2e\x39\x32\x38\x2c\
+\x31\x36\x30\x2c\x31\x31\x35\x2e\x33\x35\x39\x56\x31\x34\x34\x68\
+\x39\x36\x0d\x0a\x09\x09\x76\x31\x36\x48\x31\x32\x38\x2e\x38\x32\
+\x63\x2d\x33\x35\x2e\x36\x32\x38\x2c\x30\x2d\x36\x34\x2e\x35\x33\
+\x38\x2c\x34\x32\x2e\x35\x37\x31\x2d\x36\x34\x2e\x38\x31\x33\x2c\
+\x39\x35\x2e\x32\x34\x32\x43\x36\x34\x2e\x30\x30\x35\x2c\x32\x35\
+\x35\x2e\x34\x39\x35\x2c\x36\x34\x2c\x32\x35\x35\x2e\x37\x34\x37\
+\x2c\x36\x34\x2c\x32\x35\x36\x63\x30\x2c\x39\x2e\x35\x32\x33\x2c\
+\x30\x2e\x39\x34\x2c\x31\x38\x2e\x37\x32\x2c\x32\x2e\x36\x38\x35\
+\x2c\x32\x37\x2e\x34\x30\x34\x0d\x0a\x09\x09\x43\x37\x34\x2e\x36\
+\x34\x38\x2c\x33\x32\x33\x2e\x30\x37\x2c\x39\x39\x2e\x34\x35\x31\
+\x2c\x33\x35\x32\x2c\x31\x32\x38\x2e\x38\x32\x2c\x33\x35\x32\x48\
+\x31\x34\x34\x76\x2d\x32\x2e\x36\x36\x32\x76\x2d\x34\x33\x2e\x32\
+\x37\x33\x43\x31\x34\x34\x2c\x32\x37\x39\x2e\x32\x33\x38\x2c\x31\
+\x36\x34\x2e\x31\x34\x36\x2c\x32\x35\x34\x2e\x33\x33\x32\x2c\x31\
+\x39\x33\x2e\x34\x36\x2c\x32\x34\x39\x2e\x30\x35\x36\x7a\x20\x4d\
+\x32\x30\x33\x2e\x36\x35\x36\x2c\x31\x32\x37\x2e\x30\x30\x32\x0d\
+\x0a\x09\x09\x63\x2d\x39\x2e\x35\x39\x32\x2c\x30\x2d\x31\x37\x2e\
+\x33\x38\x34\x2d\x37\x2e\x37\x38\x35\x2d\x31\x37\x2e\x33\x38\x34\
+\x2d\x31\x37\x2e\x34\x30\x33\x63\x30\x2d\x39\x2e\x36\x36\x34\x2c\
+\x37\x2e\x37\x37\x34\x2d\x31\x37\x2e\x35\x32\x2c\x31\x37\x2e\x33\
+\x38\x34\x2d\x31\x37\x2e\x35\x32\x63\x39\x2e\x35\x37\x34\x2c\x30\
+\x2c\x31\x37\x2e\x33\x39\x39\x2c\x37\x2e\x38\x35\x35\x2c\x31\x37\
+\x2e\x33\x39\x39\x2c\x31\x37\x2e\x35\x32\x0d\x0a\x09\x09\x43\x32\
+\x32\x31\x2e\x30\x35\x36\x2c\x31\x31\x39\x2e\x32\x31\x37\x2c\x32\
+\x31\x33\x2e\x32\x34\x36\x2c\x31\x32\x37\x2e\x30\x30\x32\x2c\x32\
+\x30\x33\x2e\x36\x35\x36\x2c\x31\x32\x37\x2e\x30\x30\x32\x7a\x22\
+\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\
+\x34\x33\x2e\x39\x35\x31\x2c\x32\x32\x32\x2e\x35\x34\x33\x43\x34\
+\x33\x34\x2e\x37\x38\x2c\x31\x38\x36\x2e\x30\x32\x31\x2c\x34\x31\
+\x31\x2e\x30\x33\x33\x2c\x31\x36\x30\x2c\x33\x38\x33\x2e\x31\x38\
+\x2c\x31\x36\x30\x48\x33\x36\x38\x76\x32\x2e\x36\x32\x36\x76\x33\
+\x38\x2e\x30\x34\x36\x63\x30\x2c\x33\x33\x2e\x39\x31\x35\x2d\x32\
+\x32\x2e\x32\x38\x36\x2c\x35\x38\x2e\x34\x37\x34\x2d\x34\x39\x2e\
+\x34\x38\x39\x2c\x36\x32\x2e\x36\x38\x31\x0d\x0a\x09\x09\x63\x2d\
+\x32\x2e\x37\x33\x37\x2c\x30\x2e\x34\x32\x34\x2d\x35\x2e\x34\x38\
+\x33\x2c\x30\x2e\x36\x34\x36\x2d\x38\x2e\x33\x30\x31\x2c\x30\x2e\
+\x36\x34\x36\x48\x32\x30\x36\x2e\x33\x35\x31\x63\x2d\x34\x2e\x35\
+\x31\x38\x2c\x30\x2d\x38\x2e\x39\x30\x34\x2c\x30\x2e\x35\x38\x34\
+\x2d\x31\x33\x2e\x30\x34\x39\x2c\x31\x2e\x36\x37\x32\x43\x31\x37\
+\x34\x2e\x31\x38\x2c\x32\x37\x30\x2e\x36\x38\x39\x2c\x31\x36\x30\
+\x2c\x32\x38\x36\x2e\x36\x2c\x31\x36\x30\x2c\x33\x30\x37\x2e\x32\
+\x33\x36\x76\x33\x32\x2e\x39\x32\x32\x0d\x0a\x09\x09\x76\x35\x34\
+\x2e\x33\x30\x35\x63\x30\x2c\x32\x34\x2e\x38\x33\x32\x2c\x32\x34\
+\x2e\x39\x37\x37\x2c\x33\x39\x2e\x34\x32\x36\x2c\x34\x39\x2e\x34\
+\x38\x31\x2c\x34\x36\x2e\x35\x35\x31\x63\x32\x39\x2e\x33\x32\x37\
+\x2c\x38\x2e\x35\x33\x31\x2c\x36\x31\x2e\x32\x36\x37\x2c\x31\x30\
+\x2e\x30\x36\x38\x2c\x39\x36\x2e\x33\x36\x36\x2c\x30\x43\x33\x32\
+\x39\x2e\x31\x35\x2c\x34\x33\x34\x2e\x33\x35\x34\x2c\x33\x35\x32\
+\x2c\x34\x32\x30\x2e\x38\x39\x33\x2c\x33\x35\x32\x2c\x33\x39\x34\
+\x2e\x34\x36\x33\x56\x33\x36\x38\x0d\x0a\x09\x09\x68\x2d\x39\x36\
+\x76\x2d\x31\x36\x68\x31\x32\x37\x2e\x31\x38\x63\x32\x35\x2e\x32\
+\x34\x2c\x30\x2c\x34\x37\x2e\x31\x30\x37\x2d\x32\x31\x2e\x33\x36\
+\x35\x2c\x35\x37\x2e\x38\x31\x34\x2d\x35\x32\x2e\x35\x34\x39\x43\
+\x34\x34\x35\x2e\x34\x37\x34\x2c\x32\x38\x36\x2e\x34\x30\x34\x2c\
+\x34\x34\x38\x2c\x32\x37\x31\x2e\x36\x34\x31\x2c\x34\x34\x38\x2c\
+\x32\x35\x36\x0d\x0a\x09\x09\x43\x34\x34\x38\x2c\x32\x34\x34\x2e\
+\x32\x33\x32\x2c\x34\x34\x36\x2e\x35\x36\x37\x2c\x32\x33\x32\x2e\
+\x39\x36\x32\x2c\x34\x34\x33\x2e\x39\x35\x31\x2c\x32\x32\x32\x2e\
+\x35\x34\x33\x7a\x20\x4d\x33\x30\x37\x2e\x38\x36\x37\x2c\x33\x38\
+\x32\x2e\x38\x32\x63\x39\x2e\x35\x39\x2c\x30\x2c\x31\x37\x2e\x33\
+\x38\x31\x2c\x37\x2e\x37\x38\x35\x2c\x31\x37\x2e\x33\x38\x31\x2c\
+\x31\x37\x2e\x34\x0d\x0a\x09\x09\x63\x30\x2c\x39\x2e\x36\x35\x2d\
+\x37\x2e\x37\x39\x31\x2c\x31\x37\x2e\x35\x32\x31\x2d\x31\x37\x2e\
+\x33\x38\x31\x2c\x31\x37\x2e\x35\x32\x31\x63\x2d\x39\x2e\x35\x37\
+\x37\x2c\x30\x2d\x31\x37\x2e\x33\x39\x39\x2d\x37\x2e\x38\x37\x31\
+\x2d\x31\x37\x2e\x33\x39\x39\x2d\x31\x37\x2e\x35\x32\x31\x43\x32\
+\x39\x30\x2e\x34\x36\x38\x2c\x33\x39\x30\x2e\x35\x39\x2c\x32\x39\
+\x38\x2e\x32\x37\x34\x2c\x33\x38\x32\x2e\x38\x32\x2c\x33\x30\x37\
+\x2e\x38\x36\x37\x2c\x33\x38\x32\x2e\x38\x32\x7a\x22\x2f\x3e\x0d\
+\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
 \x00\x00\x04\x8d\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
@@ -1822,8 +1795,17 @@
 \x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\
 \x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\
 \x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
-\x00\x00\x03\xeb\
+\x00\x00\x00\x6c\
 \x3c\
+\x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\
+\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x3e\x3c\x70\x61\x74\x68\
+\x20\x64\x3d\x22\x4d\x31\x38\x20\x31\x32\x76\x31\x48\x38\x76\x35\
+\x6c\x2d\x36\x2d\x36\x20\x36\x2d\x36\x76\x35\x68\x38\x56\x32\x68\
+\x32\x7a\x22\x2f\x3e\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x03\x36\
+\x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
 \x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
@@ -1849,44 +1831,117 @@
 \x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
 \x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
 \x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
+\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\
+\x22\x33\x39\x36\x2e\x37\x39\x35\x2c\x33\x39\x36\x2e\x38\x20\x33\
+\x32\x30\x2c\x33\x39\x36\x2e\x38\x20\x33\x32\x30\x2c\x34\x34\x38\
+\x20\x34\x34\x38\x2c\x34\x34\x38\x20\x34\x34\x38\x2c\x33\x32\x30\
+\x20\x33\x39\x36\x2e\x37\x39\x35\x2c\x33\x32\x30\x20\x09\x22\x2f\
+\x3e\x0d\x0a\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\
+\x6e\x74\x73\x3d\x22\x33\x39\x36\x2e\x38\x2c\x31\x31\x35\x2e\x32\
+\x30\x35\x20\x33\x39\x36\x2e\x38\x2c\x31\x39\x32\x20\x34\x34\x38\
+\x2c\x31\x39\x32\x20\x34\x34\x38\x2c\x36\x34\x20\x33\x32\x30\x2c\
+\x36\x34\x20\x33\x32\x30\x2c\x31\x31\x35\x2e\x32\x30\x35\x20\x09\
+\x22\x2f\x3e\x0d\x0a\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\
+\x6f\x69\x6e\x74\x73\x3d\x22\x31\x31\x35\x2e\x32\x30\x35\x2c\x31\
+\x31\x35\x2e\x32\x20\x31\x39\x32\x2c\x31\x31\x35\x2e\x32\x20\x31\
+\x39\x32\x2c\x36\x34\x20\x36\x34\x2c\x36\x34\x20\x36\x34\x2c\x31\
+\x39\x32\x20\x31\x31\x35\x2e\x32\x30\x35\x2c\x31\x39\x32\x20\x09\
+\x22\x2f\x3e\x0d\x0a\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\
+\x6f\x69\x6e\x74\x73\x3d\x22\x31\x31\x35\x2e\x32\x2c\x33\x39\x36\
+\x2e\x37\x39\x35\x20\x31\x31\x35\x2e\x32\x2c\x33\x32\x30\x20\x36\
+\x34\x2c\x33\x32\x30\x20\x36\x34\x2c\x34\x34\x38\x20\x31\x39\x32\
+\x2c\x34\x34\x38\x20\x31\x39\x32\x2c\x33\x39\x36\x2e\x37\x39\x35\
+\x20\x09\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\
+\x76\x67\x3e\x0d\x0a\
+\x00\x00\x02\x79\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x5f\x31\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
+\x0d\x0a\x09\x09\x3c\x67\x3e\x0d\x0a\x09\x09\x09\x3c\x70\x6f\x6c\
+\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\x22\x31\x38\x36\
+\x2e\x33\x30\x31\x2c\x33\x33\x39\x2e\x38\x39\x33\x20\x39\x36\x2c\
+\x32\x34\x39\x2e\x34\x36\x31\x20\x36\x34\x2c\x32\x37\x39\x2e\x39\
+\x36\x38\x20\x31\x38\x36\x2e\x33\x30\x31\x2c\x34\x30\x32\x20\x34\
+\x34\x38\x2c\x31\x34\x30\x2e\x35\x30\x36\x20\x34\x31\x36\x2c\x31\
+\x31\x30\x20\x09\x09\x09\x22\x2f\x3e\x0d\x0a\x09\x09\x3c\x2f\x67\
+\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\
+\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x02\x7f\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
 \x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
 \x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
 \x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
 \x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
 \x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
-\x0a\x3c\x67\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\
-\x4d\x32\x35\x36\x2c\x31\x32\x38\x63\x2d\x38\x31\x2e\x39\x2c\x30\
-\x2d\x31\x34\x35\x2e\x37\x2c\x34\x38\x2e\x38\x2d\x32\x32\x34\x2c\
-\x31\x32\x38\x63\x36\x37\x2e\x34\x2c\x36\x37\x2e\x37\x2c\x31\x32\
-\x34\x2c\x31\x32\x38\x2c\x32\x32\x34\x2c\x31\x32\x38\x63\x39\x39\
-\x2e\x39\x2c\x30\x2c\x31\x37\x33\x2e\x34\x2d\x37\x36\x2e\x34\x2c\
-\x32\x32\x34\x2d\x31\x32\x36\x2e\x36\x0d\x0a\x09\x09\x43\x34\x32\
-\x38\x2e\x32\x2c\x31\x39\x38\x2e\x36\x2c\x33\x35\x34\x2e\x38\x2c\
-\x31\x32\x38\x2c\x32\x35\x36\x2c\x31\x32\x38\x7a\x20\x4d\x32\x35\
-\x36\x2c\x33\x34\x37\x2e\x33\x63\x2d\x34\x39\x2e\x34\x2c\x30\x2d\
-\x38\x39\x2e\x36\x2d\x34\x31\x2d\x38\x39\x2e\x36\x2d\x39\x31\x2e\
-\x33\x63\x30\x2d\x35\x30\x2e\x34\x2c\x34\x30\x2e\x32\x2d\x39\x31\
-\x2e\x33\x2c\x38\x39\x2e\x36\x2d\x39\x31\x2e\x33\x73\x38\x39\x2e\
-\x36\x2c\x34\x31\x2c\x38\x39\x2e\x36\x2c\x39\x31\x2e\x33\x0d\x0a\
-\x09\x09\x43\x33\x34\x35\x2e\x36\x2c\x33\x30\x36\x2e\x34\x2c\x33\
-\x30\x35\x2e\x34\x2c\x33\x34\x37\x2e\x33\x2c\x32\x35\x36\x2c\x33\
-\x34\x37\x2e\x33\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x67\x3e\x0d\x0a\
-\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\
-\x32\x32\x34\x63\x30\x2d\x37\x2e\x39\x2c\x32\x2e\x39\x2d\x31\x35\
-\x2e\x31\x2c\x37\x2e\x36\x2d\x32\x30\x2e\x37\x63\x2d\x32\x2e\x35\
-\x2d\x30\x2e\x34\x2d\x35\x2d\x30\x2e\x36\x2d\x37\x2e\x36\x2d\x30\
-\x2e\x36\x63\x2d\x32\x38\x2e\x38\x2c\x30\x2d\x35\x32\x2e\x33\x2c\
-\x32\x33\x2e\x39\x2d\x35\x32\x2e\x33\x2c\x35\x33\x2e\x33\x63\x30\
-\x2c\x32\x39\x2e\x34\x2c\x32\x33\x2e\x35\x2c\x35\x33\x2e\x33\x2c\
-\x35\x32\x2e\x33\x2c\x35\x33\x2e\x33\x0d\x0a\x09\x09\x09\x73\x35\
-\x32\x2e\x33\x2d\x32\x33\x2e\x39\x2c\x35\x32\x2e\x33\x2d\x35\x33\
-\x2e\x33\x63\x30\x2d\x32\x2e\x33\x2d\x30\x2e\x32\x2d\x34\x2e\x36\
-\x2d\x30\x2e\x34\x2d\x36\x2e\x39\x63\x2d\x35\x2e\x35\x2c\x34\x2e\
-\x33\x2d\x31\x32\x2e\x33\x2c\x36\x2e\x39\x2d\x31\x39\x2e\x38\x2c\
-\x36\x2e\x39\x43\x32\x37\x30\x2e\x33\x2c\x32\x35\x36\x2c\x32\x35\
-\x36\x2c\x32\x34\x31\x2e\x37\x2c\x32\x35\x36\x2c\x32\x32\x34\x7a\
-\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\
-\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x0a\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\
+\x3d\x22\x32\x38\x38\x2c\x39\x36\x20\x33\x33\x37\x2e\x39\x2c\x31\
+\x34\x35\x2e\x39\x20\x32\x37\x34\x2c\x32\x30\x39\x2e\x37\x20\x32\
+\x37\x34\x2c\x32\x30\x39\x2e\x37\x20\x31\x34\x35\x2e\x39\x2c\x33\
+\x33\x37\x2e\x39\x20\x39\x36\x2c\x32\x38\x38\x20\x39\x36\x2c\x34\
+\x31\x36\x20\x32\x32\x34\x2c\x34\x31\x36\x20\x31\x37\x34\x2e\x31\
+\x2c\x33\x36\x36\x2e\x31\x20\x33\x35\x37\x2e\x34\x2c\x31\x38\x32\
+\x2e\x39\x20\x33\x36\x36\x2e\x31\x2c\x31\x37\x34\x2e\x31\x20\x0d\
+\x0a\x09\x34\x31\x36\x2c\x32\x32\x34\x20\x34\x31\x36\x2c\x39\x36\
+\x20\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
 \x00\x00\x03\x6c\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
@@ -1944,7 +1999,7 @@
 \x33\x32\x2c\x34\x38\x30\x20\x31\x34\x38\x2e\x37\x33\x37\x2c\x34\
 \x34\x37\x2e\x39\x37\x39\x20\x09\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\
 \x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x02\x7d\
+\x00\x00\x02\xf7\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
@@ -1971,93 +2026,29 @@
 \x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
 \x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
 \x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x5f\x38\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
-\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x32\
-\x37\x2c\x32\x33\x34\x2e\x36\x32\x35\x48\x31\x36\x37\x2e\x32\x39\
-\x36\x6c\x31\x31\x39\x2e\x37\x30\x32\x2d\x31\x31\x39\x2e\x37\x30\
-\x32\x4c\x32\x35\x36\x2c\x38\x35\x4c\x38\x35\x2c\x32\x35\x36\x6c\
-\x31\x37\x31\x2c\x31\x37\x31\x6c\x32\x39\x2e\x39\x32\x32\x2d\x32\
-\x39\x2e\x39\x32\x34\x4c\x31\x36\x37\x2e\x32\x39\x36\x2c\x32\x37\
-\x37\x2e\x33\x37\x35\x48\x34\x32\x37\x56\x32\x33\x34\x2e\x36\x32\
-\x35\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
-\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x03\xc4\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x43\x68\x65\x76\x72\x6f\x6e\x5f\x63\x69\x72\x63\x6c\x65\
-\x64\x5f\x6c\x65\x66\x74\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\
-\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\
-\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
-\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\
-\x6c\x69\x6e\x6b\x22\x0d\x0a\x09\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\x61\
-\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\
-\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x78\
-\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
-\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\
-\x31\x31\x2e\x33\x30\x32\x2c\x36\x2e\x37\x37\x36\x63\x2d\x30\x2e\
-\x31\x39\x36\x2d\x30\x2e\x31\x39\x37\x2d\x30\x2e\x35\x31\x35\x2d\
-\x30\x2e\x31\x39\x37\x2d\x30\x2e\x37\x31\x2c\x30\x4c\x37\x2e\x37\
-\x38\x35\x2c\x39\x2e\x36\x34\x31\x63\x2d\x30\x2e\x31\x39\x36\x2c\
-\x30\x2e\x31\x39\x39\x2d\x30\x2e\x31\x39\x36\x2c\x30\x2e\x35\x32\
-\x2c\x30\x2c\x30\x2e\x37\x31\x37\x6c\x32\x2e\x38\x30\x37\x2c\x32\
-\x2e\x38\x36\x34\x0d\x0a\x09\x63\x30\x2e\x31\x39\x35\x2c\x30\x2e\
-\x31\x39\x39\x2c\x30\x2e\x35\x31\x34\x2c\x30\x2e\x31\x39\x38\x2c\
-\x30\x2e\x37\x31\x2c\x30\x63\x30\x2e\x31\x39\x36\x2d\x30\x2e\x31\
-\x39\x37\x2c\x30\x2e\x31\x39\x36\x2d\x30\x2e\x35\x31\x38\x2c\x30\
-\x2d\x30\x2e\x37\x31\x37\x4c\x39\x2c\x31\x30\x6c\x32\x2e\x33\x30\
-\x32\x2d\x32\x2e\x35\x30\x36\x43\x31\x31\x2e\x34\x39\x38\x2c\x37\
-\x2e\x32\x39\x36\x2c\x31\x31\x2e\x34\x39\x38\x2c\x36\x2e\x39\x37\
-\x36\x2c\x31\x31\x2e\x33\x30\x32\x2c\x36\x2e\x37\x37\x36\x7a\x0d\
-\x0a\x09\x20\x4d\x31\x30\x2c\x30\x2e\x34\x63\x2d\x35\x2e\x33\x30\
-\x32\x2c\x30\x2d\x39\x2e\x36\x2c\x34\x2e\x32\x39\x38\x2d\x39\x2e\
-\x36\x2c\x39\x2e\x36\x63\x30\x2c\x35\x2e\x33\x30\x33\x2c\x34\x2e\
-\x32\x39\x38\x2c\x39\x2e\x36\x2c\x39\x2e\x36\x2c\x39\x2e\x36\x73\
-\x39\x2e\x36\x2d\x34\x2e\x32\x39\x37\x2c\x39\x2e\x36\x2d\x39\x2e\
-\x36\x43\x31\x39\x2e\x36\x2c\x34\x2e\x36\x39\x38\x2c\x31\x35\x2e\
-\x33\x30\x32\x2c\x30\x2e\x34\x2c\x31\x30\x2c\x30\x2e\x34\x7a\x20\
-\x4d\x31\x30\x2c\x31\x38\x2e\x33\x35\x34\x0d\x0a\x09\x63\x2d\x34\
-\x2e\x36\x31\x35\x2c\x30\x2d\x38\x2e\x33\x35\x34\x2d\x33\x2e\x37\
-\x34\x2d\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\x30\x2d\
-\x34\x2e\x36\x31\x34\x2c\x33\x2e\x37\x33\x39\x2d\x38\x2e\x33\x35\
-\x34\x2c\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\x34\x2e\
-\x36\x31\x33\x2c\x30\x2c\x38\x2e\x33\x35\x34\x2c\x33\x2e\x37\x34\
-\x2c\x38\x2e\x33\x35\x34\x2c\x38\x2e\x33\x35\x34\x0d\x0a\x09\x43\
-\x31\x38\x2e\x33\x35\x34\x2c\x31\x34\x2e\x36\x31\x34\x2c\x31\x34\
-\x2e\x36\x31\x33\x2c\x31\x38\x2e\x33\x35\x34\x2c\x31\x30\x2c\x31\
-\x38\x2e\x33\x35\x34\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\
-\x3e\x0d\x0a\
-\x00\x00\x00\x6c\
-\x3c\
-\x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
-\x30\x2f\x73\x76\x67\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\
-\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x3e\x3c\x70\x61\x74\x68\
-\x20\x64\x3d\x22\x4d\x31\x38\x20\x31\x32\x76\x31\x48\x38\x76\x35\
-\x6c\x2d\x36\x2d\x36\x20\x36\x2d\x36\x76\x35\x68\x38\x56\x32\x68\
-\x32\x7a\x22\x2f\x3e\x3c\x2f\x73\x76\x67\x3e\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
+\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
+\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
+\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
+\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x31\x37\x2e\x34\
+\x2c\x32\x32\x34\x48\x32\x38\x38\x56\x39\x34\x2e\x36\x63\x30\x2d\
+\x31\x36\x2e\x39\x2d\x31\x34\x2e\x33\x2d\x33\x30\x2e\x36\x2d\x33\
+\x32\x2d\x33\x30\x2e\x36\x63\x2d\x31\x37\x2e\x37\x2c\x30\x2d\x33\
+\x32\x2c\x31\x33\x2e\x37\x2d\x33\x32\x2c\x33\x30\x2e\x36\x56\x32\
+\x32\x34\x48\x39\x34\x2e\x36\x43\x37\x37\x2e\x37\x2c\x32\x32\x34\
+\x2c\x36\x34\x2c\x32\x33\x38\x2e\x33\x2c\x36\x34\x2c\x32\x35\x36\
+\x0d\x0a\x09\x63\x30\x2c\x31\x37\x2e\x37\x2c\x31\x33\x2e\x37\x2c\
+\x33\x32\x2c\x33\x30\x2e\x36\x2c\x33\x32\x48\x32\x32\x34\x76\x31\
+\x32\x39\x2e\x34\x63\x30\x2c\x31\x36\x2e\x39\x2c\x31\x34\x2e\x33\
+\x2c\x33\x30\x2e\x36\x2c\x33\x32\x2c\x33\x30\x2e\x36\x63\x31\x37\
+\x2e\x37\x2c\x30\x2c\x33\x32\x2d\x31\x33\x2e\x37\x2c\x33\x32\x2d\
+\x33\x30\x2e\x36\x56\x32\x38\x38\x68\x31\x32\x39\x2e\x34\x63\x31\
+\x36\x2e\x39\x2c\x30\x2c\x33\x30\x2e\x36\x2d\x31\x34\x2e\x33\x2c\
+\x33\x30\x2e\x36\x2d\x33\x32\x0d\x0a\x09\x43\x34\x34\x38\x2c\x32\
+\x33\x38\x2e\x33\x2c\x34\x33\x34\x2e\x33\x2c\x32\x32\x34\x2c\x34\
+\x31\x37\x2e\x34\x2c\x32\x32\x34\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\
+\x73\x76\x67\x3e\x0d\x0a\
 \x00\x00\x02\xb7\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
@@ -2104,74 +2095,6 @@
 \x35\x2e\x37\x39\x38\x2c\x32\x35\x36\x20\x09\x09\x22\x2f\x3e\x0d\
 \x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
 \x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x01\xdd\
-\x00\
-\x00\x06\xe4\x78\x9c\xcd\x54\x4d\x6f\x9b\x40\x10\x3d\x13\x29\xff\
-\x61\xba\xb7\x4a\xec\x17\xc4\xd4\xa6\xa6\x51\xfd\x21\xcb\x52\x9a\
-\x58\x6a\xea\xaa\xa7\x0a\xc3\x16\x50\x28\x20\x58\xc0\xce\xaf\xef\
-\xee\x92\x54\x51\x95\xfa\x18\xfb\xb0\x33\xda\x79\x6f\xde\xbc\x65\
-\x24\xa6\xd7\xfb\xdf\x39\x74\xa2\x6e\xb2\xb2\x08\x10\x27\x0c\x81\
-\x28\xa2\x32\xce\x8a\x24\x40\xad\xfc\x85\xc7\xe8\xfa\xd3\xe5\xc5\
-\xf4\x1d\xc6\xb0\x12\x85\xa8\x43\x59\xd6\x3e\x7c\x8e\xcb\x9d\x80\
-\x75\x9e\xb7\x8d\x34\x25\xe0\x1e\x71\x08\xb7\xe1\xeb\x76\x05\xcb\
-\x7d\x55\xd6\x12\x36\x79\x9b\xe0\x75\x01\xc4\x14\xb7\xc3\x10\x1f\
-\x3c\xc2\x18\xcc\xda\x2c\x8f\x81\xbd\x07\xc0\xd8\xe8\x2f\xee\xe6\
-\xf7\x3f\x36\x4b\x68\xba\x04\x36\xdf\x66\x37\xeb\x39\x20\x4c\xe9\
-\x77\x77\x4e\xe9\xe2\x7e\x61\x24\x38\xe1\x94\x2e\x6f\x11\xa0\x54\
-\xca\xca\xa7\xb4\xef\x7b\xd2\xbb\xa4\xac\x13\xba\xaa\xc3\x2a\xcd\
-\xa2\x86\x2a\x22\xd5\x44\xd5\x44\x95\x18\xe7\x24\x96\x31\xd2\x33\
-\xb4\xf4\x8b\xa7\x72\x04\x59\x1c\xa0\x9b\xf0\x20\xea\x9f\xea\xa2\
-\xbe\x44\xd1\x04\xaf\x48\x3b\x8c\x31\x2d\xf5\x44\xf1\xf7\x79\x56\
-\x3c\xbc\x46\xe4\x93\xc9\x84\x1a\x54\x51\x03\xc4\xaa\x3d\x82\xc3\
-\x90\x2f\x2f\x2c\xe8\xb3\x58\xa6\x01\x1a\x71\x47\x03\xa9\xc8\x92\
-\x54\xfe\xbd\x76\x99\xe8\x67\xa5\xee\x02\x06\xaa\xa6\x0f\x82\x46\
-\x1e\x72\x11\x20\x51\x84\xbb\x5c\xe0\x5d\x18\x3d\x24\x75\xd9\x16\
-\xb1\x5f\x88\x1e\x5e\x30\x3f\x1a\x6f\x7e\x53\x85\x91\xa2\x57\xb5\
-\x68\x44\xdd\x09\xf3\xea\x44\x05\x6b\x88\xd6\xb4\x0a\x65\x0a\xea\
-\xd1\x5f\xb8\xc7\x6c\x3e\x72\x89\x1b\x31\xdb\x25\x1f\xb0\x6b\x7b\
-\x2a\xaa\xa3\x73\x8a\x47\x8c\x8c\x22\xac\x00\x9b\xe9\x22\x76\xf1\
-\x13\xdc\x0d\x10\x33\x98\xfb\xdc\xa0\x73\x6a\x00\xd3\xa2\x4b\xb6\
-\x51\xd4\x67\x6b\xe6\x3c\xea\x4f\x60\x59\xf4\x1f\x1f\xce\x78\x7c\
-\x16\x3e\xae\xb8\x77\x3a\x1f\x53\xfa\xff\x25\x39\x63\xfe\x26\xa6\
-\xcc\x9c\x23\x4b\x3a\x07\x1f\x7a\x49\x27\xf3\x71\x6c\x49\x57\x6c\
-\xf2\x26\xa6\xcc\x9c\x23\x4b\x3a\x07\x1f\x7a\x49\x27\xf3\x31\x2c\
-\xe9\x39\xaa\x7f\xb6\xca\x7f\x00\x99\x18\x96\x19\
-\x00\x00\x02\x20\
-\x00\
-\x00\x07\x7f\x78\x9c\xdd\x55\x3b\x6f\xdb\x30\x10\xde\xfb\x2b\xae\
-\xe8\xc0\x76\x20\x45\x52\x24\x45\x06\x51\x02\xd4\x40\xa7\x74\x4b\
-\x96\x6e\x6a\xcc\x48\x6c\x6c\xc9\x90\x54\xcb\xfd\xf7\x3d\xc5\xd6\
-\xc3\x56\xd0\x29\x43\x11\x69\xd0\x3d\x78\x77\xdf\x7d\xc7\x83\xae\
-\x6f\x0f\xdb\x0d\xec\x7d\xdd\x84\xaa\x4c\x89\x60\x9c\x80\x2f\x1f\
-\xab\x75\x28\xf3\x94\x3c\xdc\x7f\xa3\x96\xdc\xde\x7c\xb8\xfe\x48\
-\x29\xdc\x17\xa1\x81\xa7\xb0\xf1\xd0\x65\x0d\xe4\xbe\xf4\x75\xd6\
-\xfa\x35\xfc\xfc\x03\xeb\x7d\x68\xf6\xf9\x16\x24\x53\x40\x29\x9e\
-\x47\x0d\x0a\x1f\xf2\xa2\x4d\x89\x54\xbb\x96\xcc\x6b\x08\xd4\x82\
-\xef\xbe\x56\x87\x94\x68\xc3\x14\x77\x0a\x74\xcc\xac\xb6\x31\x08\
-\xcb\x54\x9c\x68\x90\x8a\x40\x17\xd6\x6d\x81\x01\x47\x53\x9f\x04\
-\xc1\x96\x4d\x4a\x8a\xb6\xdd\x5d\x45\x51\xd7\x75\xac\x8b\x59\x55\
-\xe7\x91\xe4\x9c\x47\x58\xf4\x74\xe4\xea\xb0\x09\xe5\xf3\x6b\x07\
-\x85\x73\x2e\x7a\xf1\x12\x84\x99\x43\x58\xa7\x64\x97\xe5\x5e\x1c\
-\xd5\xb6\xce\xca\xe6\xa9\xaa\xb7\x29\xd9\x66\x6d\x1d\x0e\x9f\x39\
-\x73\xce\x48\xa3\x80\xf7\xef\xa0\x18\xcd\x8c\xb4\x12\x12\xc5\x24\
-\x97\x5f\xfa\xe0\x5d\xd6\x16\x80\xd9\xbe\x03\xb5\x0c\xf1\x72\xa4\
-\x42\x33\x2e\x35\x97\x77\x33\x13\x9f\x2b\x02\x9b\x76\x26\xf6\x54\
-\xe8\xd5\x99\x59\xc6\x2e\xd1\xbd\x79\x66\x35\x4c\x38\x9b\x24\x68\
-\x35\xf3\x7c\xb3\x40\xc1\xb4\x12\x16\xa8\x42\x70\x28\xe1\x38\x12\
-\x27\x8c\x45\xe0\x27\x69\x05\x97\xae\x8b\xd0\x41\x45\x94\xaf\x88\
-\x53\x3f\x13\x54\xce\x38\x62\x9f\x74\x4c\xe4\x30\xd1\x50\x87\x0a\
-\xc9\xac\x12\x09\x62\x18\xc4\xd5\x04\x70\xf4\xd2\x45\x02\x7a\x5e\
-\xe2\x6e\xc9\xea\x0f\xd2\xdf\xc6\x4d\x4a\x3e\x59\xde\xbf\x24\xc2\
-\x29\x44\xf9\xdb\xcd\x71\x8e\x49\x18\x93\xcc\xdb\x44\xfe\xb8\xd5\
-\xb3\x36\x63\xe6\xb4\x55\x2f\x6d\x1e\xc5\xb3\x36\x4f\x5e\xba\x48\
-\x40\x97\x45\x26\x93\xc3\x78\xe5\xe4\x2c\xd1\x38\x94\x51\x9c\x46\
-\x3a\x3a\x17\xf1\x97\x35\x46\xe6\xca\xaa\xf4\x04\x9a\xb6\xae\x9e\
-\x3d\xf2\xc8\x5f\x9e\xc1\x40\x71\x4b\xfc\x63\xb6\x4b\x49\x5d\xfd\
-\x2e\xd7\x67\xe6\x5f\x55\x28\x2f\xed\xdb\xd0\xfa\x7a\x13\xf0\x83\
-\x3b\x8b\x33\xc3\x9a\xa3\x6f\x58\x65\x96\x68\xa3\xcd\x9b\x4f\x6a\
-\xc1\xe2\xbb\xd9\xb8\x53\x3f\xef\x6d\x60\xff\x5a\x2d\x8d\x44\x49\
-\x31\x5b\x2d\x77\x64\x8a\x8f\xe2\xd9\x6a\x9d\xbc\x74\x91\x60\x71\
-\x29\xfe\x13\x12\x8f\x44\xf6\x7f\xab\x9b\xbf\x3f\x45\xd8\x3d\
 \x00\x00\x01\x20\
 \x3c\
 \x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
@@ -2192,13 +2115,13 @@
 \x2e\x34\x32\x7a\x4d\x31\x30\x20\x34\x61\x31\x20\x31\x20\x30\x20\
 \x31\x20\x30\x20\x30\x2d\x32\x20\x31\x20\x31\x20\x30\x20\x30\x20\
 \x30\x20\x30\x20\x32\x7a\x22\x2f\x3e\x3c\x2f\x73\x76\x67\x3e\
-\x00\x00\x02\x6c\
+\x00\x00\x02\x7d\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
 \x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
 \x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x31\x2c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
 \x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
 \x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
 \x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
@@ -2210,29 +2133,103 @@
 \x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
 \x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
 \x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x53\x61\x76\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\
-\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\
-\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
-\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\
-\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\
-\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\x61\
-\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\
-\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x78\
-\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
-\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\
-\x31\x35\x2e\x31\x37\x33\x2c\x32\x48\x34\x43\x32\x2e\x38\x39\x39\
-\x2c\x32\x2c\x32\x2c\x32\x2e\x39\x2c\x32\x2c\x34\x76\x31\x32\x63\
-\x30\x2c\x31\x2e\x31\x2c\x30\x2e\x38\x39\x39\x2c\x32\x2c\x32\x2c\
-\x32\x68\x31\x32\x63\x31\x2e\x31\x30\x31\x2c\x30\x2c\x32\x2d\x30\
-\x2e\x39\x2c\x32\x2d\x32\x56\x35\x2e\x31\x32\x37\x4c\x31\x35\x2e\
-\x31\x37\x33\x2c\x32\x7a\x20\x4d\x31\x34\x2c\x38\x63\x30\x2c\x30\
-\x2e\x35\x34\x39\x2d\x30\x2e\x34\x35\x2c\x31\x2d\x31\x2c\x31\x48\
-\x37\x0d\x0a\x09\x43\x36\x2e\x34\x35\x2c\x39\x2c\x36\x2c\x38\x2e\
-\x35\x34\x39\x2c\x36\x2c\x38\x56\x33\x68\x38\x56\x38\x7a\x20\x4d\
-\x31\x33\x2c\x34\x68\x2d\x32\x76\x34\x68\x32\x56\x34\x7a\x22\x2f\
-\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x5f\x38\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
+\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\x35\
+\x2c\x32\x37\x37\x2e\x33\x37\x35\x68\x32\x35\x39\x2e\x37\x30\x34\
+\x4c\x32\x32\x35\x2e\x30\x30\x32\x2c\x33\x39\x37\x2e\x30\x37\x37\
+\x4c\x32\x35\x36\x2c\x34\x32\x37\x6c\x31\x37\x31\x2d\x31\x37\x31\
+\x4c\x32\x35\x36\x2c\x38\x35\x6c\x2d\x32\x39\x2e\x39\x32\x32\x2c\
+\x32\x39\x2e\x39\x32\x34\x6c\x31\x31\x38\x2e\x36\x32\x36\x2c\x31\
+\x31\x39\x2e\x37\x30\x31\x48\x38\x35\x56\x32\x37\x37\x2e\x33\x37\
+\x35\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
+\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x04\x64\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\x0d\x0a\x09\
+\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x31\
+\x37\x36\x63\x2d\x34\x34\x2e\x30\x30\x34\x2c\x30\x2d\x38\x30\x2e\
+\x30\x30\x31\x2c\x33\x36\x2d\x38\x30\x2e\x30\x30\x31\x2c\x38\x30\
+\x63\x30\x2c\x34\x34\x2e\x30\x30\x34\x2c\x33\x35\x2e\x39\x39\x37\
+\x2c\x38\x30\x2c\x38\x30\x2e\x30\x30\x31\x2c\x38\x30\x63\x34\x34\
+\x2e\x30\x30\x35\x2c\x30\x2c\x37\x39\x2e\x39\x39\x39\x2d\x33\x35\
+\x2e\x39\x39\x36\x2c\x37\x39\x2e\x39\x39\x39\x2d\x38\x30\x0d\x0a\
+\x09\x09\x09\x43\x33\x33\x35\x2e\x39\x39\x39\x2c\x32\x31\x32\x2c\
+\x33\x30\x30\x2e\x30\x30\x35\x2c\x31\x37\x36\x2c\x32\x35\x36\x2c\
+\x31\x37\x36\x7a\x20\x4d\x34\x34\x36\x2e\x39\x33\x38\x2c\x32\x33\
+\x34\x2e\x36\x36\x37\x63\x2d\x39\x2e\x36\x30\x35\x2d\x38\x38\x2e\
+\x35\x33\x31\x2d\x38\x31\x2e\x30\x37\x34\x2d\x31\x36\x30\x2d\x31\
+\x36\x39\x2e\x36\x30\x35\x2d\x31\x36\x39\x2e\x35\x39\x39\x56\x33\
+\x32\x68\x2d\x34\x32\x2e\x36\x36\x36\x76\x33\x33\x2e\x30\x36\x37\
+\x0d\x0a\x09\x09\x09\x63\x2d\x38\x38\x2e\x35\x33\x31\x2c\x39\x2e\
+\x35\x39\x39\x2d\x31\x36\x30\x2c\x38\x31\x2e\x30\x36\x38\x2d\x31\
+\x36\x39\x2e\x36\x30\x34\x2c\x31\x36\x39\x2e\x35\x39\x39\x48\x33\
+\x32\x76\x34\x32\x2e\x36\x36\x37\x68\x33\x33\x2e\x30\x36\x32\x63\
+\x39\x2e\x36\x30\x34\x2c\x38\x38\x2e\x35\x33\x31\x2c\x38\x31\x2e\
+\x30\x37\x32\x2c\x31\x36\x30\x2c\x31\x36\x39\x2e\x36\x30\x34\x2c\
+\x31\x36\x39\x2e\x36\x30\x34\x56\x34\x38\x30\x68\x34\x32\x2e\x36\
+\x36\x36\x76\x2d\x33\x33\x2e\x30\x36\x32\x0d\x0a\x09\x09\x09\x63\
+\x38\x38\x2e\x35\x33\x31\x2d\x39\x2e\x36\x30\x34\x2c\x31\x36\x30\
+\x2d\x38\x31\x2e\x30\x37\x33\x2c\x31\x36\x39\x2e\x36\x30\x35\x2d\
+\x31\x36\x39\x2e\x36\x30\x34\x48\x34\x38\x30\x76\x2d\x34\x32\x2e\
+\x36\x36\x37\x48\x34\x34\x36\x2e\x39\x33\x38\x7a\x20\x4d\x32\x35\
+\x36\x2c\x34\x30\x35\x2e\x33\x33\x33\x63\x2d\x38\x32\x2e\x31\x33\
+\x37\x2c\x30\x2d\x31\x34\x39\x2e\x33\x33\x34\x2d\x36\x37\x2e\x31\
+\x39\x38\x2d\x31\x34\x39\x2e\x33\x33\x34\x2d\x31\x34\x39\x2e\x33\
+\x33\x33\x0d\x0a\x09\x09\x09\x63\x30\x2d\x38\x32\x2e\x31\x33\x36\
+\x2c\x36\x37\x2e\x31\x39\x37\x2d\x31\x34\x39\x2e\x33\x33\x33\x2c\
+\x31\x34\x39\x2e\x33\x33\x34\x2d\x31\x34\x39\x2e\x33\x33\x33\x63\
+\x38\x32\x2e\x31\x33\x35\x2c\x30\x2c\x31\x34\x39\x2e\x33\x33\x32\
+\x2c\x36\x37\x2e\x31\x39\x38\x2c\x31\x34\x39\x2e\x33\x33\x32\x2c\
+\x31\x34\x39\x2e\x33\x33\x33\x43\x34\x30\x35\x2e\x33\x33\x32\x2c\
+\x33\x33\x38\x2e\x31\x33\x35\x2c\x33\x33\x38\x2e\x31\x33\x35\x2c\
+\x34\x30\x35\x2e\x33\x33\x33\x2c\x32\x35\x36\x2c\x34\x30\x35\x2e\
+\x33\x33\x33\x7a\x0d\x0a\x09\x09\x09\x22\x2f\x3e\x0d\x0a\x09\x3c\
+\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\
+\x3e\x0d\x0a\
 \x00\x00\x02\xbd\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
@@ -2279,63 +2276,66 @@
 \x37\x2e\x36\x0d\x0a\x09\x53\x31\x34\x2e\x31\x39\x37\x2c\x31\x37\
 \x2e\x35\x39\x39\x2c\x31\x30\x2c\x31\x37\x2e\x35\x39\x39\x7a\x22\
 \x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x03\x65\
+\x00\x00\x03\x93\
 \x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
-\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
-\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
-\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
-\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
-\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
-\x74\x3d\x27\x31\x38\x2e\x37\x35\x70\x74\x27\x20\x76\x65\x72\x73\
-\x69\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\
-\x78\x3d\x27\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\
-\x38\x33\x20\x31\x38\x2e\x37\x35\x20\x31\x38\x2e\x37\x35\x27\x20\
-\x77\x69\x64\x74\x68\x3d\x27\x31\x38\x2e\x37\x35\x70\x74\x27\x20\
-\x78\x6d\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
-\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\
-\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
-\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x27\x3e\x0a\x3c\
-\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\x3e\x0a\x3c\x67\
-\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\
-\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\
-\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x35\x2e\x37\x38\x34\x34\
-\x20\x36\x33\x2e\x32\x33\x33\x33\x29\x27\x3e\x0a\x3c\x70\x61\x74\
-\x68\x20\x64\x3d\x27\x4d\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x20\
-\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x38\x2e\x36\x35\x37\x33\x34\
-\x20\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x38\x2e\x36\x35\x37\x33\
-\x34\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x2d\x38\x2e\x36\
-\x35\x37\x33\x34\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x2d\
-\x38\x2e\x36\x35\x37\x33\x34\x20\x38\x2e\x36\x35\x37\x33\x34\x5a\
-\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\
-\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\
-\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\
-\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\
-\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\
-\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\
-\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\
-\x2d\x77\x69\x64\x74\x68\x3d\x27\x31\x2e\x35\x30\x35\x36\x32\x27\
-\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\
-\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\
-\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\
-\x36\x34\x20\x36\x35\x2e\x37\x38\x34\x34\x20\x36\x33\x2e\x32\x33\
-\x33\x33\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\
-\x20\x34\x2e\x33\x32\x38\x36\x37\x20\x30\x43\x20\x34\x2e\x33\x32\
-\x38\x36\x37\x20\x2d\x32\x2e\x33\x39\x30\x36\x36\x20\x32\x2e\x33\
-\x39\x30\x36\x36\x20\x2d\x34\x2e\x33\x32\x38\x36\x37\x20\x30\x20\
-\x2d\x34\x2e\x33\x32\x38\x36\x37\x43\x20\x2d\x32\x2e\x33\x39\x30\
-\x36\x36\x20\x2d\x34\x2e\x33\x32\x38\x36\x37\x20\x2d\x34\x2e\x33\
-\x32\x38\x36\x37\x20\x2d\x32\x2e\x33\x39\x30\x36\x36\x20\x2d\x34\
-\x2e\x33\x32\x38\x36\x37\x20\x2d\x30\x43\x20\x2d\x34\x2e\x33\x32\
-\x38\x36\x37\x20\x32\x2e\x33\x39\x30\x36\x36\x20\x2d\x32\x2e\x33\
-\x39\x30\x36\x36\x20\x34\x2e\x33\x32\x38\x36\x37\x20\x30\x20\x34\
-\x2e\x33\x32\x38\x36\x37\x43\x20\x32\x2e\x33\x39\x30\x36\x36\x20\
-\x34\x2e\x33\x32\x38\x36\x37\x20\x34\x2e\x33\x32\x38\x36\x37\x20\
-\x32\x2e\x33\x39\x30\x36\x36\x20\x34\x2e\x33\x32\x38\x36\x37\x20\
-\x30\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\
-\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\
-\x73\x76\x67\x3e\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4d\x61\x67\x6e\x69\x66\x79\x69\x6e\x67\x5f\x67\x6c\x61\
+\x73\x73\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
+\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
+\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
+\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x79\x3d\x22\
+\x30\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\
+\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\x61\x62\x6c\x65\x2d\
+\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\
+\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x78\x6d\x6c\x3a\x73\
+\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\
+\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x37\x2e\x35\
+\x34\x35\x2c\x31\x35\x2e\x34\x36\x37\x6c\x2d\x33\x2e\x37\x37\x39\
+\x2d\x33\x2e\x37\x37\x39\x63\x30\x2e\x35\x37\x2d\x30\x2e\x39\x33\
+\x35\x2c\x30\x2e\x38\x39\x38\x2d\x32\x2e\x30\x33\x35\x2c\x30\x2e\
+\x38\x39\x38\x2d\x33\x2e\x32\x31\x63\x30\x2d\x33\x2e\x34\x31\x37\
+\x2d\x32\x2e\x39\x36\x31\x2d\x36\x2e\x33\x37\x37\x2d\x36\x2e\x33\
+\x37\x38\x2d\x36\x2e\x33\x37\x37\x0d\x0a\x09\x43\x34\x2e\x38\x36\
+\x39\x2c\x32\x2e\x31\x2c\x32\x2e\x31\x2c\x34\x2e\x38\x37\x2c\x32\
+\x2e\x31\x2c\x38\x2e\x32\x38\x37\x63\x30\x2c\x33\x2e\x34\x31\x36\
+\x2c\x32\x2e\x39\x36\x31\x2c\x36\x2e\x33\x37\x37\x2c\x36\x2e\x33\
+\x37\x37\x2c\x36\x2e\x33\x37\x37\x63\x31\x2e\x31\x33\x37\x2c\x30\
+\x2c\x32\x2e\x32\x2d\x30\x2e\x33\x30\x39\x2c\x33\x2e\x31\x31\x35\
+\x2d\x30\x2e\x38\x34\x34\x6c\x33\x2e\x37\x39\x39\x2c\x33\x2e\x38\
+\x30\x31\x0d\x0a\x09\x63\x30\x2e\x33\x37\x32\x2c\x30\x2e\x33\x37\
+\x31\x2c\x30\x2e\x39\x37\x35\x2c\x30\x2e\x33\x37\x31\x2c\x31\x2e\
+\x33\x34\x36\x2c\x30\x6c\x30\x2e\x39\x34\x33\x2d\x30\x2e\x39\x34\
+\x33\x43\x31\x38\x2e\x30\x35\x31\x2c\x31\x36\x2e\x33\x30\x37\x2c\
+\x31\x37\x2e\x39\x31\x36\x2c\x31\x35\x2e\x38\x33\x38\x2c\x31\x37\
+\x2e\x35\x34\x35\x2c\x31\x35\x2e\x34\x36\x37\x7a\x20\x4d\x34\x2e\
+\x30\x30\x34\x2c\x38\x2e\x32\x38\x37\x0d\x0a\x09\x63\x30\x2d\x32\
+\x2e\x33\x36\x36\x2c\x31\x2e\x39\x31\x37\x2d\x34\x2e\x32\x38\x33\
+\x2c\x34\x2e\x32\x38\x32\x2d\x34\x2e\x32\x38\x33\x63\x32\x2e\x33\
+\x36\x36\x2c\x30\x2c\x34\x2e\x34\x37\x34\x2c\x32\x2e\x31\x30\x37\
+\x2c\x34\x2e\x34\x37\x34\x2c\x34\x2e\x34\x37\x34\x63\x30\x2c\x32\
+\x2e\x33\x36\x35\x2d\x31\x2e\x39\x31\x38\x2c\x34\x2e\x32\x38\x33\
+\x2d\x34\x2e\x32\x38\x33\x2c\x34\x2e\x32\x38\x33\x0d\x0a\x09\x43\
+\x36\x2e\x31\x31\x31\x2c\x31\x32\x2e\x37\x36\x2c\x34\x2e\x30\x30\
+\x34\x2c\x31\x30\x2e\x36\x35\x32\x2c\x34\x2e\x30\x30\x34\x2c\x38\
+\x2e\x32\x38\x37\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x0d\x0a\
 "
 
 qt_resource_name = b"\
@@ -2343,235 +2343,235 @@
 \x00\x6f\xa6\x53\
 \x00\x69\
 \x00\x63\x00\x6f\x00\x6e\x00\x73\
-\x00\x10\
-\x08\x89\xfa\x47\
-\x00\x63\
-\x00\x65\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x6f\x00\x72\x00\x69\x00\x67\x00\x69\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
 \x00\x0e\
 \x05\xed\x38\x67\
 \x00\x61\
 \x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x6d\x00\x6f\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x14\
-\x0f\xa5\xe0\xc7\
-\x00\x6d\
-\x00\x61\x00\x67\x00\x6e\x00\x69\x00\x66\x00\x79\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x67\x00\x6c\x00\x61\x00\x73\x00\x73\x00\x2e\
-\x00\x73\x00\x76\x00\x67\
+\x00\x0a\
+\x0a\xc8\x62\x67\
+\x00\x63\
+\x00\x65\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x08\
+\x08\xc8\x55\xe7\
+\x00\x73\
+\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x17\
+\x07\x87\x48\x27\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x66\x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2d\x00\x6f\x00\x70\
+\x00\x65\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x12\
+\x08\x79\x97\xe7\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x63\x00\x61\x00\x6d\x00\x65\x00\x72\x00\x61\x00\x2e\x00\x73\x00\x76\
+\x00\x67\
+\x00\x19\
+\x0f\xef\x7b\xe7\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x63\x00\x6f\x00\x6c\x00\x6f\x00\x72\x00\x2d\x00\x70\x00\x61\x00\x6c\
+\x00\x65\x00\x74\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x1c\
+\x08\x8a\x79\x07\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x61\x00\x64\x00\x69\x00\x6f\x00\x2d\x00\x62\x00\x75\x00\x74\
+\x00\x74\x00\x6f\x00\x6e\x00\x2d\x00\x6f\x00\x66\x00\x66\x00\x2e\x00\x73\x00\x76\x00\x67\
 \x00\x0f\
 \x09\x76\x60\xc7\
 \x00\x63\
 \x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x2d\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x08\
-\x0c\xf7\x55\x87\
+\x00\x17\
+\x06\xc6\x02\xa7\
 \x00\x74\
-\x00\x65\x00\x78\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x10\
-\x0c\x57\x65\x47\
-\x00\x61\
-\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x72\x00\x65\x00\x73\x00\x69\x00\x7a\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x0f\
-\x07\x0e\xc4\x87\
-\x00\x6f\
-\x00\x70\x00\x65\x00\x6e\x00\x70\x00\x6f\x00\x6c\x00\x79\x00\x67\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x72\x00\x69\x00\x61\x00\x6e\x00\x67\x00\x6c\x00\x65\x00\x2d\x00\x73\x00\x74\x00\x72\x00\x6f\x00\x6b\x00\x65\x00\x64\x00\x2d\
+\x00\x31\x00\x35\x00\x2e\x00\x73\x00\x76\x00\x67\
 \x00\x1d\
 \x06\xec\xf4\xc7\
 \x00\x63\
 \x00\x68\x00\x65\x00\x76\x00\x72\x00\x6f\x00\x6e\x00\x2d\x00\x77\x00\x69\x00\x74\x00\x68\x00\x2d\x00\x63\x00\x69\x00\x72\x00\x63\
 \x00\x6c\x00\x65\x00\x2d\x00\x72\x00\x69\x00\x67\x00\x68\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x1c\
+\x04\x66\xe1\x67\
+\x00\x63\
+\x00\x68\x00\x65\x00\x76\x00\x72\x00\x6f\x00\x6e\x00\x2d\x00\x77\x00\x69\x00\x74\x00\x68\x00\x2d\x00\x63\x00\x69\x00\x72\x00\x63\
+\x00\x6c\x00\x65\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
 \x00\x10\
-\x08\xe4\xaf\x47\
+\x06\xe3\xaf\xe7\
 \x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x64\x00\x6f\x00\x6e\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x68\x00\x61\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x13\
+\x03\x24\x75\x47\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x65\x00\x66\x00\x72\x00\x65\x00\x73\x00\x68\x00\x2e\x00\x73\
+\x00\x76\x00\x67\
+\x00\x0f\
+\x04\xf2\xa7\x87\
+\x00\x63\
+\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x64\x00\x63\x00\x75\x00\x72\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
 \x00\x08\
+\x0c\xf7\x55\x87\
+\x00\x74\
+\x00\x65\x00\x78\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x08\
+\x08\xf7\x57\x07\
+\x00\x67\
+\x00\x72\x00\x69\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x10\
+\x04\xa9\x22\xc7\
+\x00\x66\
+\x00\x69\x00\x6c\x00\x6c\x00\x65\x00\x64\x00\x62\x00\x75\x00\x63\x00\x6b\x00\x65\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x08\
 \x05\xa8\x57\x87\
 \x00\x63\
 \x00\x6f\x00\x64\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x11\
-\x0c\xa7\xc7\x47\
-\x00\x63\
-\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x64\x00\x70\x00\x6f\x00\x6c\x00\x79\x00\x67\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
-\
-\x00\x11\
-\x01\x60\xbc\x47\
-\x00\x73\
-\x00\x6f\x00\x63\x00\x69\x00\x61\x00\x6c\x00\x2d\x00\x70\x00\x79\x00\x74\x00\x68\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
-\
-\x00\x19\
-\x0f\xef\x7b\xe7\
+\x00\x16\
+\x01\xfb\x76\x27\
 \x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x63\x00\x6f\x00\x6c\x00\x6f\x00\x72\x00\x2d\x00\x70\x00\x61\x00\x6c\
-\x00\x65\x00\x74\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x12\
-\x08\x55\xef\xc7\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x64\x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\
-\x00\x67\
-\x00\x12\
-\x08\x79\x97\xe7\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x63\x00\x61\x00\x6d\x00\x65\x00\x72\x00\x61\x00\x2e\x00\x73\x00\x76\
-\x00\x67\
-\x00\x19\
-\x0a\x43\x45\xc7\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x61\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x66\x00\x6f\x00\x72\
-\x00\x77\x00\x61\x00\x72\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x61\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x62\x00\x61\x00\x63\
+\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
 \x00\x0a\
 \x01\xca\x6d\x87\
 \x00\x62\
 \x00\x75\x00\x63\x00\x6b\x00\x65\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x13\
-\x03\x24\x75\x47\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x65\x00\x66\x00\x72\x00\x65\x00\x73\x00\x68\x00\x2e\x00\x73\
-\x00\x76\x00\x67\
-\x00\x09\
-\x0b\x9e\x89\x07\
+\x00\x10\
+\x08\x89\xfa\x47\
 \x00\x63\
-\x00\x68\x00\x65\x00\x63\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x1c\
-\x08\x8a\x79\x07\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x61\x00\x64\x00\x69\x00\x6f\x00\x2d\x00\x62\x00\x75\x00\x74\
-\x00\x74\x00\x6f\x00\x6e\x00\x2d\x00\x6f\x00\x66\x00\x66\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x65\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x6f\x00\x72\x00\x69\x00\x67\x00\x69\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
 \x00\x1b\
 \x0e\xb5\x68\xe7\
 \x00\x61\
 \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x61\x00\x64\x00\x69\x00\x6f\x00\x2d\x00\x62\x00\x75\x00\x74\
 \x00\x74\x00\x6f\x00\x6e\x00\x2d\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x07\
+\x0c\xf8\x5a\x07\
+\x00\x65\
+\x00\x79\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0f\
+\x07\x0e\xc4\x87\
+\x00\x6f\
+\x00\x70\x00\x65\x00\x6e\x00\x70\x00\x6f\x00\x6c\x00\x79\x00\x67\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x11\
+\x0c\xa7\xc7\x47\
+\x00\x63\
+\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x64\x00\x70\x00\x6f\x00\x6c\x00\x79\x00\x67\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\
+\x00\x09\
+\x0b\x9e\x89\x07\
+\x00\x63\
+\x00\x68\x00\x65\x00\x63\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
 \x00\x12\
-\x0c\x5e\xd4\xa7\
+\x08\x55\xef\xc7\
 \x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x6c\x00\x6f\x00\x63\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x64\x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\
 \x00\x67\
+\x00\x11\
+\x01\x60\xbc\x47\
+\x00\x73\
+\x00\x6f\x00\x63\x00\x69\x00\x61\x00\x6c\x00\x2d\x00\x70\x00\x79\x00\x74\x00\x68\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\
+\x00\x0d\
+\x05\x20\xce\x87\
+\x00\x6f\
+\x00\x70\x00\x65\x00\x6e\x00\x63\x00\x75\x00\x72\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x15\
+\x0f\xc4\x59\xe7\
+\x00\x73\
+\x00\x75\x00\x62\x00\x64\x00\x69\x00\x72\x00\x65\x00\x63\x00\x74\x00\x6f\x00\x72\x00\x79\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\
+\x00\x2e\x00\x73\x00\x76\x00\x67\
 \x00\x12\
 \x04\xb2\x21\x47\
 \x00\x61\
 \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x65\x00\x78\x00\x70\x00\x61\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\
 \x00\x67\
-\x00\x0e\
-\x0f\xcb\xd5\xc7\
-\x00\x70\
-\x00\x6c\x00\x75\x00\x73\x00\x2d\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x17\
-\x07\x87\x48\x27\
+\x00\x10\
+\x08\xe4\xaf\x47\
 \x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x66\x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2d\x00\x6f\x00\x70\
-\x00\x65\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x64\x00\x6f\x00\x6e\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
 \x00\x10\
-\x06\xe3\xaf\xe7\
+\x0c\x57\x65\x47\
 \x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x68\x00\x61\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x0f\
-\x04\xf2\xa7\x87\
-\x00\x63\
-\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x64\x00\x63\x00\x75\x00\x72\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x17\
-\x06\xc6\x02\xa7\
-\x00\x74\
-\x00\x72\x00\x69\x00\x61\x00\x6e\x00\x67\x00\x6c\x00\x65\x00\x2d\x00\x73\x00\x74\x00\x72\x00\x6f\x00\x6b\x00\x65\x00\x64\x00\x2d\
-\x00\x31\x00\x35\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x0d\
-\x05\x20\xce\x87\
-\x00\x6f\
-\x00\x70\x00\x65\x00\x6e\x00\x63\x00\x75\x00\x72\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x07\
-\x0c\xf8\x5a\x07\
-\x00\x65\
-\x00\x79\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x72\x00\x65\x00\x73\x00\x69\x00\x7a\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
 \x00\x08\
 \x0b\x07\x57\xa7\
 \x00\x65\
 \x00\x64\x00\x69\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x16\
-\x01\xfb\x76\x27\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x61\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x62\x00\x61\x00\x63\
-\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x1c\
-\x04\x66\xe1\x67\
-\x00\x63\
-\x00\x68\x00\x65\x00\x76\x00\x72\x00\x6f\x00\x6e\x00\x2d\x00\x77\x00\x69\x00\x74\x00\x68\x00\x2d\x00\x63\x00\x69\x00\x72\x00\x63\
-\x00\x6c\x00\x65\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x15\
-\x0f\xc4\x59\xe7\
-\x00\x73\
-\x00\x75\x00\x62\x00\x64\x00\x69\x00\x72\x00\x65\x00\x63\x00\x74\x00\x6f\x00\x72\x00\x79\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\
-\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0e\
+\x0f\xcb\xd5\xc7\
+\x00\x70\
+\x00\x6c\x00\x75\x00\x73\x00\x2d\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
 \x00\x11\
 \x0c\xdb\x38\xe7\
 \x00\x61\
 \x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x63\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
 \
-\x00\x08\
-\x08\xf7\x57\x07\
-\x00\x67\
-\x00\x72\x00\x69\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x10\
-\x04\xa9\x22\xc7\
-\x00\x66\
-\x00\x69\x00\x6c\x00\x6c\x00\x65\x00\x64\x00\x62\x00\x75\x00\x63\x00\x6b\x00\x65\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
 \x00\x0a\
 \x0f\x68\x53\xe7\
 \x00\x61\
 \x00\x6e\x00\x63\x00\x68\x00\x6f\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x08\
-\x08\xc8\x55\xe7\
-\x00\x73\
-\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x19\
+\x0a\x43\x45\xc7\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x61\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x66\x00\x6f\x00\x72\
+\x00\x77\x00\x61\x00\x72\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x12\
+\x0c\x5e\xd4\xa7\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x6c\x00\x6f\x00\x63\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\
+\x00\x67\
 \x00\x0a\
 \x0a\x2d\x1b\xc7\
 \x00\x63\
 \x00\x69\x00\x72\x00\x63\x00\x6c\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x0a\
-\x0a\xc8\x62\x67\
-\x00\x63\
-\x00\x65\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x14\
+\x0f\xa5\xe0\xc7\
+\x00\x6d\
+\x00\x61\x00\x67\x00\x6e\x00\x69\x00\x66\x00\x79\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x67\x00\x6c\x00\x61\x00\x73\x00\x73\x00\x2e\
+\x00\x73\x00\x76\x00\x67\
 "
 
 qt_resource_struct_v1 = b"\
 \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
 \x00\x00\x00\x00\x00\x02\x00\x00\x00\x29\x00\x00\x00\x02\
-\x00\x00\x01\xae\x00\x00\x00\x00\x00\x01\x00\x00\x24\x33\
-\x00\x00\x02\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x39\x2f\
-\x00\x00\x04\xe4\x00\x00\x00\x00\x00\x01\x00\x00\x74\xb4\
-\x00\x00\x02\xb4\x00\x00\x00\x00\x00\x01\x00\x00\x3e\xea\
-\x00\x00\x05\x16\x00\x00\x00\x00\x00\x01\x00\x00\x77\x35\
-\x00\x00\x05\xc2\x00\x01\x00\x00\x00\x01\x00\x00\x80\x09\
-\x00\x00\x03\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x4f\xdc\
-\x00\x00\x04\x42\x00\x00\x00\x00\x00\x01\x00\x00\x5f\x35\
-\x00\x00\x04\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x68\xc4\
-\x00\x00\x01\x70\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x82\
-\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x04\x14\
-\x00\x00\x04\x66\x00\x00\x00\x00\x00\x01\x00\x00\x63\xf6\
-\x00\x00\x04\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x59\x67\
-\x00\x00\x01\x0a\x00\x00\x00\x00\x00\x01\x00\x00\x15\x4c\
-\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x11\x26\
-\x00\x00\x03\xe8\x00\x00\x00\x00\x00\x01\x00\x00\x56\x11\
-\x00\x00\x02\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x30\xe2\
-\x00\x00\x02\x38\x00\x00\x00\x00\x00\x01\x00\x00\x33\x88\
+\x00\x00\x04\x3a\x00\x00\x00\x00\x00\x01\x00\x00\x5f\xa1\
+\x00\x00\x03\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x40\x83\
+\x00\x00\x02\xea\x00\x00\x00\x00\x00\x01\x00\x00\x3e\x02\
+\x00\x00\x02\x32\x00\x00\x00\x00\x00\x01\x00\x00\x2c\xb4\
+\x00\x00\x01\xce\x00\x00\x00\x00\x00\x01\x00\x00\x23\x1e\
+\x00\x00\x02\xae\x00\x01\x00\x00\x00\x01\x00\x00\x37\x61\
+\x00\x00\x04\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x6c\x26\
+\x00\x00\x02\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x2f\xde\
+\x00\x00\x04\x62\x00\x00\x00\x00\x00\x01\x00\x00\x67\x25\
+\x00\x00\x02\xd4\x00\x00\x00\x00\x00\x01\x00\x00\x39\x85\
 \x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x02\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x45\x24\
-\x00\x00\x06\x02\x00\x00\x00\x00\x00\x01\x00\x00\x83\x51\
-\x00\x00\x01\x4a\x00\x00\x00\x00\x00\x01\x00\x00\x19\x05\
-\x00\x00\x05\xac\x00\x01\x00\x00\x00\x01\x00\x00\x7e\x28\
-\x00\x00\x00\x86\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x78\
-\x00\x00\x06\x18\x00\x00\x00\x00\x00\x01\x00\x00\x85\xc1\
-\x00\x00\x02\x62\x00\x00\x00\x00\x00\x01\x00\x00\x36\xae\
-\x00\x00\x06\x32\x00\x00\x00\x00\x00\x01\x00\x00\x88\x82\
-\x00\x00\x04\xce\x00\x00\x00\x00\x00\x01\x00\x00\x71\x44\
-\x00\x00\x02\xe0\x00\x00\x00\x00\x00\x01\x00\x00\x42\x14\
-\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x01\x00\x00\x0e\xa3\
-\x00\x00\x03\x72\x00\x00\x00\x00\x00\x01\x00\x00\x4b\x74\
-\x00\x00\x01\x86\x00\x00\x00\x00\x00\x01\x00\x00\x1f\xff\
-\x00\x00\x05\x84\x00\x00\x00\x00\x00\x01\x00\x00\x7b\x6d\
-\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xc2\
-\x00\x00\x04\xba\x00\x00\x00\x00\x00\x01\x00\x00\x6d\x55\
-\x00\x00\x03\x36\x00\x00\x00\x00\x00\x01\x00\x00\x48\x24\
-\x00\x00\x05\xe8\x00\x00\x00\x00\x00\x01\x00\x00\x82\x2d\
-\x00\x00\x00\x58\x00\x00\x00\x00\x00\x01\x00\x00\x06\xe1\
-\x00\x00\x05\x54\x00\x00\x00\x00\x00\x01\x00\x00\x7a\xfd\
-\x00\x00\x03\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x53\x16\
-\x00\x00\x01\xd6\x00\x00\x00\x00\x00\x01\x00\x00\x2b\xb7\
+\x00\x00\x01\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x1a\x97\
+\x00\x00\x02\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x26\xe6\
+\x00\x00\x01\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x1f\x65\
+\x00\x00\x03\xac\x00\x00\x00\x00\x00\x01\x00\x00\x51\x91\
+\x00\x00\x00\x62\x00\x00\x00\x00\x00\x01\x00\x00\x08\xa6\
+\x00\x00\x04\x10\x00\x00\x00\x00\x00\x01\x00\x00\x5c\xfb\
+\x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x0b\xfc\
+\x00\x00\x03\x36\x00\x00\x00\x00\x00\x01\x00\x00\x46\x3e\
+\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x14\x4d\
+\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x06\x36\
+\x00\x00\x04\xdc\x00\x00\x00\x00\x00\x01\x00\x00\x6f\x60\
+\x00\x00\x02\x98\x00\x01\x00\x00\x00\x01\x00\x00\x35\x80\
+\x00\x00\x01\x36\x00\x00\x00\x00\x00\x01\x00\x00\x17\x4d\
+\x00\x00\x06\x04\x00\x00\x00\x00\x00\x01\x00\x00\x85\x93\
+\x00\x00\x05\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x7e\xaa\
+\x00\x00\x00\x32\x00\x00\x00\x00\x00\x01\x00\x00\x02\xcd\
+\x00\x00\x05\x28\x00\x00\x00\x00\x00\x01\x00\x00\x74\x60\
+\x00\x00\x03\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x59\xeb\
+\x00\x00\x05\x02\x00\x00\x00\x00\x00\x01\x00\x00\x71\xdd\
+\x00\x00\x05\xda\x00\x00\x00\x00\x00\x01\x00\x00\x81\x2b\
+\x00\x00\x03\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x55\xb7\
+\x00\x00\x05\x60\x00\x00\x00\x00\x00\x01\x00\x00\x7a\xcb\
+\x00\x00\x02\x82\x00\x00\x00\x00\x00\x01\x00\x00\x34\x9f\
+\x00\x00\x03\x98\x00\x00\x00\x00\x00\x01\x00\x00\x4d\xa2\
+\x00\x00\x03\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x4a\x52\
+\x00\x00\x05\x88\x00\x00\x00\x00\x00\x01\x00\x00\x7d\x86\
+\x00\x00\x06\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x88\x54\
+\x00\x00\x04\x82\x00\x00\x00\x00\x00\x01\x00\x00\x6b\xb6\
+\x00\x00\x05\x3e\x00\x00\x00\x00\x00\x01\x00\x00\x77\xd0\
+\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x01\x00\x00\x0f\x22\
 "
 
 qt_resource_struct_v2 = b"\
@@ -2579,92 +2579,92 @@
 \x00\x00\x00\x00\x00\x00\x00\x00\
 \x00\x00\x00\x00\x00\x02\x00\x00\x00\x29\x00\x00\x00\x02\
 \x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x01\xae\x00\x00\x00\x00\x00\x01\x00\x00\x24\x33\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x02\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x39\x2f\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x04\xe4\x00\x00\x00\x00\x00\x01\x00\x00\x74\xb4\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x02\xb4\x00\x00\x00\x00\x00\x01\x00\x00\x3e\xea\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x05\x16\x00\x00\x00\x00\x00\x01\x00\x00\x77\x35\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x05\xc2\x00\x01\x00\x00\x00\x01\x00\x00\x80\x09\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x03\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x4f\xdc\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x04\x42\x00\x00\x00\x00\x00\x01\x00\x00\x5f\x35\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x04\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x68\xc4\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x01\x70\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x82\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x04\x14\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x04\x66\x00\x00\x00\x00\x00\x01\x00\x00\x63\xf6\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x04\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x59\x67\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x01\x0a\x00\x00\x00\x00\x00\x01\x00\x00\x15\x4c\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x11\x26\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x03\xe8\x00\x00\x00\x00\x00\x01\x00\x00\x56\x11\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x02\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x30\xe2\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x02\x38\x00\x00\x00\x00\x00\x01\x00\x00\x33\x88\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x04\x3a\x00\x00\x00\x00\x00\x01\x00\x00\x5f\xa1\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x03\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x40\x83\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x02\xea\x00\x00\x00\x00\x00\x01\x00\x00\x3e\x02\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x02\x32\x00\x00\x00\x00\x00\x01\x00\x00\x2c\xb4\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x01\xce\x00\x00\x00\x00\x00\x01\x00\x00\x23\x1e\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x02\xae\x00\x01\x00\x00\x00\x01\x00\x00\x37\x61\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x04\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x6c\x26\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x02\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x2f\xde\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x04\x62\x00\x00\x00\x00\x00\x01\x00\x00\x67\x25\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x02\xd4\x00\x00\x00\x00\x00\x01\x00\x00\x39\x85\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
 \x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x02\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x45\x24\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x06\x02\x00\x00\x00\x00\x00\x01\x00\x00\x83\x51\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x01\x4a\x00\x00\x00\x00\x00\x01\x00\x00\x19\x05\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x05\xac\x00\x01\x00\x00\x00\x01\x00\x00\x7e\x28\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x00\x86\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x78\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x06\x18\x00\x00\x00\x00\x00\x01\x00\x00\x85\xc1\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x02\x62\x00\x00\x00\x00\x00\x01\x00\x00\x36\xae\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x06\x32\x00\x00\x00\x00\x00\x01\x00\x00\x88\x82\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x04\xce\x00\x00\x00\x00\x00\x01\x00\x00\x71\x44\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x02\xe0\x00\x00\x00\x00\x00\x01\x00\x00\x42\x14\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x01\x00\x00\x0e\xa3\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x03\x72\x00\x00\x00\x00\x00\x01\x00\x00\x4b\x74\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x01\x86\x00\x00\x00\x00\x00\x01\x00\x00\x1f\xff\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x05\x84\x00\x00\x00\x00\x00\x01\x00\x00\x7b\x6d\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xc2\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x04\xba\x00\x00\x00\x00\x00\x01\x00\x00\x6d\x55\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x03\x36\x00\x00\x00\x00\x00\x01\x00\x00\x48\x24\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x05\xe8\x00\x00\x00\x00\x00\x01\x00\x00\x82\x2d\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
-\x00\x00\x00\x58\x00\x00\x00\x00\x00\x01\x00\x00\x06\xe1\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x05\x54\x00\x00\x00\x00\x00\x01\x00\x00\x7a\xfd\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x03\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x53\x16\
-\x00\x00\x01\x64\xed\x16\x26\xd7\
-\x00\x00\x01\xd6\x00\x00\x00\x00\x00\x01\x00\x00\x2b\xb7\
-\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x01\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x1a\x97\
+\x00\x00\x01\x69\xbd\xf2\x98\x84\
+\x00\x00\x02\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x26\xe6\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x01\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x1f\x65\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x03\xac\x00\x00\x00\x00\x00\x01\x00\x00\x51\x91\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x00\x62\x00\x00\x00\x00\x00\x01\x00\x00\x08\xa6\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x04\x10\x00\x00\x00\x00\x00\x01\x00\x00\x5c\xfb\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x0b\xfc\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x03\x36\x00\x00\x00\x00\x00\x01\x00\x00\x46\x3e\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x14\x4d\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x06\x36\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x04\xdc\x00\x00\x00\x00\x00\x01\x00\x00\x6f\x60\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x02\x98\x00\x01\x00\x00\x00\x01\x00\x00\x35\x80\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x01\x36\x00\x00\x00\x00\x00\x01\x00\x00\x17\x4d\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x06\x04\x00\x00\x00\x00\x00\x01\x00\x00\x85\x93\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x05\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x7e\xaa\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x00\x32\x00\x00\x00\x00\x00\x01\x00\x00\x02\xcd\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x05\x28\x00\x00\x00\x00\x00\x01\x00\x00\x74\x60\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x03\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x59\xeb\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x05\x02\x00\x00\x00\x00\x00\x01\x00\x00\x71\xdd\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x05\xda\x00\x00\x00\x00\x00\x01\x00\x00\x81\x2b\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x03\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x55\xb7\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x05\x60\x00\x00\x00\x00\x00\x01\x00\x00\x7a\xcb\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x02\x82\x00\x00\x00\x00\x00\x01\x00\x00\x34\x9f\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x03\x98\x00\x00\x00\x00\x00\x01\x00\x00\x4d\xa2\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x03\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x4a\x52\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
+\x00\x00\x05\x88\x00\x00\x00\x00\x00\x01\x00\x00\x7d\x86\
+\x00\x00\x01\x69\xbd\xf2\x98\x81\
+\x00\x00\x06\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x88\x54\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x04\x82\x00\x00\x00\x00\x00\x01\x00\x00\x6b\xb6\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x05\x3e\x00\x00\x00\x00\x00\x01\x00\x00\x77\xd0\
+\x00\x00\x01\x69\xbd\xf2\x98\x83\
+\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x01\x00\x00\x0f\x22\
+\x00\x00\x01\x69\xbd\xf2\x98\x82\
 "
 
-qt_version = QtCore.qVersion().split('.')
-if qt_version < ['5', '8', '0']:
+qt_version = [int(v) for v in QtCore.qVersion().split('.')]
+if qt_version < [5, 8, 0]:
     rcc_version = 1
     qt_resource_struct = qt_resource_struct_v1
 else:

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/custMatTransform.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/custMatTransform.py	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/custMatTransform.py	2019-03-27 22:27:57 UTC (rev 50622)
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/custMatTransform.ui'
 #
-# Created by: PyQt5 UI code generator 5.10
+# Created by: PyQt5 UI code generator 5.11.3
 #
 # WARNING! All changes made in this file will be lost!
 

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/labelTextEditor.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/labelTextEditor.py	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/labelTextEditor.py	2019-03-27 22:27:57 UTC (rev 50622)
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/labelTextEditor.ui'
 #
-# Created by: PyQt5 UI code generator 5.10
+# Created by: PyQt5 UI code generator 5.11.3
 #
 # WARNING! All changes made in this file will be lost!
 

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/setCustomAnchor.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/setCustomAnchor.py	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/setCustomAnchor.py	2019-03-27 22:27:57 UTC (rev 50622)
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/setCustomAnchor.ui'
 #
-# Created by: PyQt5 UI code generator 5.10
+# Created by: PyQt5 UI code generator 5.11.3
 #
 # WARNING! All changes made in this file will be lost!
 

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addLabel.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addLabel.py	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addLabel.py	2019-03-27 22:27:57 UTC (rev 50622)
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/widg_addLabel.ui'
 #
-# Created by: PyQt5 UI code generator 5.10
+# Created by: PyQt5 UI code generator 5.11.3
 #
 # WARNING! All changes made in this file will be lost!
 

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addPolyOpt.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addPolyOpt.py	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addPolyOpt.py	2019-03-27 22:27:57 UTC (rev 50622)
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/widg_addPolyOpt.ui'
 #
-# Created by: PyQt5 UI code generator 5.10
+# Created by: PyQt5 UI code generator 5.11.3
 #
 # WARNING! All changes made in this file will be lost!
 

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_editBezier.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_editBezier.py	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_editBezier.py	2019-03-27 22:27:57 UTC (rev 50622)
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/widg_editBezier.ui'
 #
-# Created by: PyQt5 UI code generator 5.10
+# Created by: PyQt5 UI code generator 5.11.3
 #
 # WARNING! All changes made in this file will be lost!
 

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/widgetPointEditor.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/widgetPointEditor.py	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/widgetPointEditor.py	2019-03-27 22:27:57 UTC (rev 50622)
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/widgetPointEditor.ui'
 #
-# Created by: PyQt5 UI code generator 5.10
+# Created by: PyQt5 UI code generator 5.11.3
 #
 # WARNING! All changes made in this file will be lost!
 

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/window1.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/window1.py	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/window1.py	2019-03-27 22:27:57 UTC (rev 50622)
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/window1.ui'
 #
-# Created by: PyQt5 UI code generator 5.10
+# Created by: PyQt5 UI code generator 5.11.3
 #
 # WARNING! All changes made in this file will be lost!
 

Modified: trunk/Build/source/utils/asymptote/Makefile.in
===================================================================
--- trunk/Build/source/utils/asymptote/Makefile.in	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/Makefile.in	2019-03-27 22:27:57 UTC (rev 50622)
@@ -12,13 +12,13 @@
 GCLIBS = $(GCPPLIB) $(GCLIB)
 LFLAGS = @LDFLAGS@
 LIBS = $(LFLAGS) @PTHREAD_LIBS@ @LIBS@ $(GCLIBS)
-DOSLIBS = $(subst -lncurses, -ltermcap, $(LIBS)) -s -static
+DOSLIBS = $(subst -lncurses, -ltermcap, $(LIBS)) -lgdi32 -lwinmm -s -static
 
 PERL = perl
 
 # Libraries needed to make asymptote.so.
 # We have to remove OpenGL, threading, GC, etc from this.
-SHAREDLIBS = $(filter-out -lGL -lGLU -lglut -pthread $(GCLIBS), $(LIBS))
+SHAREDLIBS = $(filter-out -lglut -GL -pthread $(GCLIBS), $(LIBS))
 
 vpath %.cc prc
 vpath %.ui GUI/windows
@@ -43,17 +43,18 @@
 	fftw++asy simpson coder coenv impdatum \
 	@getopt@ locate parser program application varinit fundec refaccess \
 	envcompleter process constructor array Delaunay predicates \
-	$(PRC) glrender tr arcball algebra3 quaternion
+	$(PRC) glrender tr arcball algebra3 quaternion shaders
 
 FILES = $(COREFILES) main
 
 SYMBOLSH = opsymbols.h allsymbols.h $(SYMBOL_FILES:=.symbols.h)
+UIFILES = $(wildcard GUI/windows/*.ui)
+PYFILES = $(wildcard GUI/pyUIClass/*.py) GUI/icons_rc.py
 DIST = camp.tab.h camp.tab.cc lex.yy.cc runtime.cc keywords.cc \
 	asy-keywords.el $(RUNTIME_FILES:=.cc) $(RUNTIME_FILES:=.h) asy.list \
-        $(SYMBOLSH)
+        $(SYMBOLSH) $(PYFILES)
 NAME = asy
 XNAME = x$(NAME)
-UIFILES = $(wildcard GUI/windows/*.ui)
 CLEAN = camp.output base/version.asy doc/version.texi \
         GUI/xasyVersion.py $(XNAME) doc/asy-latex.pdf $(SYMBOLSH)
 EXTRA = asy-mode.el asy-init.el asy.vim asy_filetype.vim asy-kate.sh \
@@ -68,7 +69,6 @@
 DEFS = @DEFS@ @OPTIONS@ @PTHREAD_CFLAGS@ -DFFTWPP_SINGLE_THREAD
 CFLAGS = @CFLAGS@
 OPTS = $(DEFS) @CPPFLAGS@ @CXXFLAGS@ $(CFLAGS)
-INCL = -I. @INCL@
 
 # Options for compiling the object files for the shared library.
 # gc has to be configured with the option --disable-threads in order to make a
@@ -80,6 +80,8 @@
 CC = @CC@ -Wall
 MAKEDEPEND = $(OPTS) -O0 -M -DDEPEND
 BISON = bison
+PYRCC = pyrcc5
+PYUIC = pyuic5
 LEX = @LEX@
 
 prefix = @prefix@
@@ -91,6 +93,7 @@
 datadir = $(DESTDIR)@datadir@
 asydir = $(datadir)/asymptote
 GUIdir = $(asydir)/GUI
+shaderdir = $(asydir)/shaders
 docdir = $(DESTDIR)@docdir@
 exampledir = $(docdir)/examples
 animationsdir = $(exampledir)/animations
@@ -110,7 +113,6 @@
 export prefix docdir exampledir mandir infodir INSTALL MAKE DESTDIR TEXI2DVI
 
 asy:	version
-	-pyrcc5 GUI/res/icons.qrc -o GUI/icons_rc.py
 	if test -n "$(MSDOS)"; then \
           $(CXX) $(OPTS) -o $(NAME) $(FILES:=.o) revision.o asy.o $(DOSLIBS); \
 	else \
@@ -118,11 +120,11 @@
 	  $(CXX) $(OPTS) -o $(NAME) $(FILES:=.o) revision.o $(LIBS); \
 	fi
 
-version: $(GCLIB) $(FILES:=.o) $(UIFILES:.ui=.py)
+version: $(GCLIB) $(FILES:=.o) $(notdir $(UIFILES:.ui=.py)) GUI/icons_rc.py
 	if test ! -s revision.cc -o "$(revision)" != "$(last)"; then     \
 	  echo $(REVISION)\"$(revision)\"\; > revision.cc; \
 	fi
-	$(CXX) $(OPTS) $(INCL) -o revision.o -c revision.cc;
+	$(CXX) $(OPTS) -o revision.o -c revision.cc;
 
 	echo string VERSION=\"$(revision)\"\; > base/version.asy
 	echo @set VERSION $(revision) > doc/version.texi
@@ -189,17 +191,20 @@
 	$(PERL) ./runtime.pl $(@:.cc=)
 
 $(SYMBOL_FILES:=.symbols.h): %.symbols.h: findsym.pl %.cc
-	$(CXX) -E -DNOSYM $(OPTS) $(INCL) $(@:.symbols.h=.cc) | \
+	$(CXX) -E -DNOSYM $(OPTS) $(@:.symbols.h=.cc) | \
           $(PERL) ./findsym.pl $@ -
 
 $(SYMBOL_FILES:=.o): %.o: %.symbols.h
 
 allsymbols.h: findsym.pl $(SYMBOL_FILES:=.cc)
-	$(CXX) -E -DNOSYM $(OPTS) $(INCL) $(SYMBOL_FILES:=.cc) | \
+	$(CXX) -E -DNOSYM $(OPTS) $(SYMBOL_FILES:=.cc) | \
           $(PERL) ./findsym.pl $@ -
 
 symbol.o: $(SYMBOLSH)
 
+GUI/icons_rc.py: GUI/res/icons.qrc
+	-$(PYRCC) GUI/res/icons.qrc -o GUI/icons_rc.py
+
 camp.tab.cc: camp.y
 	$(BISON) -dvt -b camp camp.y && mv camp.tab.c camp.tab.cc
 
@@ -239,7 +244,7 @@
 install-asy: asy sty
 	${INSTALL} -d $(bindir) $(asydir) $(exampledir) $(animationsdir)
 	${INSTALL} -d $(GUIdir) $(GUIdir)/pyUIClass $(GUIdir)/configs \
-			$(GUIdir)/res $(GUIdir)/res/icons
+			$(GUIdir)/res $(GUIdir)/res/icons $(shaderdir)
 	-${INSTALL} -d $(latexdir)
 	-${INSTALL} -d $(contextdir)
 	${INSTALL} -p -m 755 $(NAME) $(bindir)
@@ -246,6 +251,7 @@
 	${INSTALL} -p -m 644 base/*.asy $(addprefix base/,$(EXTRA)) \
 		asy-keywords.el $(asydir)
 	${INSTALL} -p -m 755 GUI/*.py $(GUIdir)
+	${INSTALL} -p -m 755 base/shaders/*.glsl $(shaderdir)
 	${INSTALL} -p -m 644 GUI/pyUIClass/*.py $(GUIdir)/pyUIClass
 	${INSTALL} -p -m 644 GUI/configs/*.cson $(GUIdir)/configs
 	${INSTALL} -p -m 644 GUI/res/icons.qrc $(GUIdir)/res
@@ -279,6 +285,8 @@
 	-rmdir $(exampledir)
 	-cd $(GUIdir) && rm -f *.py
 	-rmdir $(GUIdir)
+	-cd $(shaderdir) && rm -f *.glsl
+	-rmdir $(shaderdir)
 	-cd $(asydir) && rm -f asy-keywords.el *.asy $(EXTRA)
 	-rmdir $(asydir)
 	-cd $(latexdir) && rm -f $(LATEXFILES)
@@ -316,6 +324,7 @@
 maintainer-clean: FORCE distclean
 	-rm -f configure config.h.in $(DIST)
 	-rm -rf autom4te.cache
+	-rm -rf GUI/pyUIClass
 
 test: asy FORCE
 	./wce
@@ -329,26 +338,26 @@
 
 .SUFFIXES: .c .cc .o .d .ui .py
 %.o: %.cc
-	$(CXX) $(OPTS) $(INCL) -o $@ -c $<
+	$(CXX) $(OPTS) -o $@ -c $<
 %.d: %.cc
 	@echo Creating $@; \
 	rm -f $@; \
-	${CXX} $(MAKEDEPEND) $(INCL) $(MDOPTS) $< > $@.$$$$ 2>/dev/null && \
+	${CXX} $(MAKEDEPEND) $(MDOPTS) $< > $@.$$$$ 2>/dev/null && \
 	sed 's,\($*\)\.o[ :]*,\1.o \1.pic.o $@ : ,g' < $@.$$$$ > $@; \
 	rm -f $@.$$$$
 %.d: %.c
 	@echo Creating $@; \
 	rm -f $@; \
-	${CC} $(MAKEDEPEND) $(INCL) $(MDOPTS) $< > $@.$$$$ 2>/dev/null && \
+	${CC} $(MAKEDEPEND) $(MDOPTS) $< > $@.$$$$ 2>/dev/null && \
 	sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
 	rm -f $@.$$$$
 %.py: %.ui
 	mkdir -p GUI/pyUIClass
-	-pyuic5 -o GUI/pyUIClass/$(notdir $@) $<
+	-$(PYUIC) -o GUI/pyUIClass/$(notdir $@) $<
 # Compile for the shared library.  OpenGL must be disabled as it causes
 # crashes inside a shared library.
 %.pic.o: %.cc
-	$(CXX) $(SHAREDOPTS) $(INCL) -o $@ -c $<
+	$(CXX) $(SHAREDOPTS) -o $@ -c $<
 
 ifeq (,$(findstring clean,${MAKECMDGOALS}))
 -include $(FILES:=.d)

Modified: trunk/Build/source/utils/asymptote/README
===================================================================
--- trunk/Build/source/utils/asymptote/README	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/README	2019-03-27 22:27:57 UTC (rev 50622)
@@ -44,20 +44,17 @@
 Note that the MSWindows executable version of Asymptote can only be
 released under the GNU General Public License (GPL) as it is linked against
 the GNU Scientific Library, GNU Readline library, and other GPL
-libraries. This version of Asymptote also ships with the dll libraries
+libraries. This version of Asymptote also ships with the cygwin1.dll libraries
 noted below.
 
-The source code for the x86_64 2.9.0-3 cygwin1.dll is available under the
+The source code for the x86_64 2.11.2 cygwin1.dll is available under the
 GPL license:
-https://cygwin.com/snapshots/x86_64/cygwin-20170823-src.tar.xz
+https://cygwin.com/snapshots/x86_64/
 
-The source code for the i386 2.10.0-1 cygwin1.dll is available under the
+The source code for the i386 2.11.2 cygwin1.dll is available under the
 GPL license:
-https://cygwin.com/snapshots/x86/cygwin-20171219-src.tar.xz
+https://cygwin.com/snapshots/x86/
 
-The source code for freeglut.dll is available under the X-Consortium license:
-http://prdownloads.sourceforge.net/freeglut/freeglut-2.8.1.tar.gz
-
 Source for various icons is available under the MIT license from
 https://github.com/driftyco/ionicons/archive/v2.0.1.zip
 https://github.com/iconic/open-iconic/archive/master.zip

Modified: trunk/Build/source/utils/asymptote/ReleaseNotes
===================================================================
--- trunk/Build/source/utils/asymptote/ReleaseNotes	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/ReleaseNotes	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1,3 +1,15 @@
+Release Notes for Version 2.48
+
+The OpenGL code was modernized to use GLSL shaders. Transparent
+triangles of different materials are now sorted before drawing.
+The viewport option from the light function was removed.
+A workaround was implemented for the Ghostscript transparency extension
+-dSAFER bug. Bugs in the simplex method were fixed. Experimental
+offscreen rendering is now disabled by default due to NVIDIA conflicts.
+The min, max, minratio, maxratio, and intersection calculations were
+accelerated. A workaround was implemented for broken Intel GPU drivers
+under MSWindows.
+
 Release Notes for Version 2.47
 
 Further shipout and scaling problems were fixed. Unused files were removed.

Modified: trunk/Build/source/utils/asymptote/TODO
===================================================================
--- trunk/Build/source/utils/asymptote/TODO	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/TODO	2019-03-27 22:27:57 UTC (rev 50622)
@@ -33,3 +33,11 @@
 Andy: Decide if we should change vm::error to em in application.cc
 
 John or Andy: Add unit test for AddOps.
+
+Supakorn: Eventually create a PBR rendering pipeline
+struct PBRMaterial {
+public:
+  glm::vec3 diffuse, emission;
+  float metallic, roughness, fresnelIOR 
+};
+

Modified: trunk/Build/source/utils/asymptote/asy-keywords.el
===================================================================
--- trunk/Build/source/utils/asymptote/asy-keywords.el	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/asy-keywords.el	2019-03-27 22:27:57 UTC (rev 50622)
@@ -2,7 +2,7 @@
 ;; This file is automatically generated by asy-list.pl.
 ;; Changes will be overwritten.
 ;;
-(defvar asy-keywords-version "2.47")
+(defvar asy-keywords-version "2.48")
 
 (defvar asy-keyword-name '(
 and controls tension atleast curl if else while for do return break continue struct typedef new access import unravel from include quote static public private restricted this explicit true false null cycle newframe operator ))
@@ -11,7 +11,7 @@
 Braid FitResult Label Legend Solution TreeNode abscissa arc arrowhead binarytree binarytreeNode block bool bool3 bounds bqe circle conic coord coordsys cputime ellipse evaluatedpoint file filltype frame grid3 guide horner hsv hyperbola int inversion key light line linefit marginT marker mass node object pair parabola patch path path3 pen picture point position positionedvector projection rational real revolution scaleT scientific segment side simplex slice solution splitface string surface tensionSpecifier ticklocate ticksgridT tickvalues transform transformation tree triangle trilinear triple vector vertex void ))
 
 (defvar asy-function-name '(
-AND Arc ArcArrow ArcArrows Arrow Arrows AtA Automatic AvantGarde B03 B13 B23 B33 BBox BWRainbow BWRainbow2 Bar Bars BeginArcArrow BeginArrow BeginBar BeginDotMargin BeginMargin BeginPenMargin Blank Bookman Bottom BottomTop Bounds Break Broken BrokenLog CLZ CTZ Ceil Circle CircleBarIntervalMarker Cos Courier CrossIntervalMarker DOSendl DOSnewl DefaultFormat DefaultLogFormat Degrees Dir DotMargin DotMargins Dotted Draw Drawline Embed EndArcArrow EndArrow EndBar EndDotMargin EndMargin EndPenMargin Fill FillDraw Floor Format Full Gaussian Gaussrand Gaussrandpair Gradient Grayscale Helvetica Hermite HookHead InOutTicks InTicks Jn Label Landscape Left LeftRight LeftTicks Legend Linear Log LogFormat Margin Margins Mark MidArcArrow MidArrow NOT NewCenturySchoolBook NoBox NoMargin NoModifier NoTicks NoTicks3 NoZero NoZeroFormat None OR OmitFormat OmitTick OmitTickInterval OmitTickIntervals OutTicks Ox Oy Palatino PaletteTicks Pen PenMargin PenMargins Pentype Portrait RGB RadialShade RadialShadeDraw Rainbow Range Relative Right RightTicks Rotate Round SQR Scale ScaleX ScaleY ScaleZ Seascape Shift Sin Slant Spline StickIntervalMarker Straight Symbol Tan TeXify Ticks Ticks3 TildeIntervalMarker TimesRoman Top TrueMargin UnFill UpsideDown Wheel X XEquals XOR XY XYEquals XYZero XYgrid XZEquals XZZero XZero XZgrid Y YEquals YXgrid YZ YZEquals YZZero YZero YZgrid Yn Z ZX ZXgrid ZYgrid ZapfChancery ZapfDingbats _begingroup3 _cputime _draw _eval _findroot _image _labelpath _projection _shipout _strokepath _texpath aCos aSin aTan abort abs accel acos acosh acot acsc activatequote add addArrow addMargins addSaveFunction addpenarc addpenline addseg adjust alias align all altitude angabscissa angle angledegrees angpoint animate annotate anticomplementary antipedal apply approximate arc arcarrowsize arccircle arcdir arcfromcenter arcfromfocus arclength arcnodesnumber arcpoint arcsubtended arcsubtendedcenter arctime arctopath array arrow arrow2 arrowbase arrowbasepoints arrowsize ascii asec asin asinh ask assert asy asycode asy!
 dir asyfigure asyfilecode asyinclude asywrite atan atan2 atanh atbreakpoint atexit attach attract atupdate autoformat autoscale autoscale3 axes axes3 axialshade axis axiscoverage azimuth babel background bangles bar barmarksize barsize basealign baseline bbox beep begin beginclip begingroup beginpoint between bevel bezier bezierP bezierPP bezierPPP bezulate bibliography bibliographystyle binarytree binarytreeNode binomial bins bisector bisectorpoint bispline bitreverse blend blockconnector box bqe brace breakpoint breakpoints brick buildRestoreDefaults buildRestoreThunk buildcycle bulletcolor byte calculateScaling canonical canonicalcartesiansystem cartesiansystem case1 case2 case3 cbrt cd ceil center centerToFocus centroid cevian change2 changecoordsys checkSegment check_fpt_zero checkconditionlength checker checkincreasing checklengths checkposition checkpt checkptincube checktriangle choose circle circlebarframe circlemarkradius circlenodesnumber circumcenter circumcircle clamped clear clip clipdraw close cmyk code colatitude collect collinear color colorless colors colorspace comma compassmark complement complementary concat concurrent cone conic conicnodesnumber conictype conj connect containmentTree contains contour contour3 controlSpecifier convert coordinates coordsys copy copyPairOrTriple cos cosh cot countIntersections cputime crop cropcode cross crossframe crosshatch crossmarksize csc cubicroots curabscissa curlSpecifier curpoint currentarrow currentexitfunction currentmomarrow currentpolarconicroutine curve cut cutafter cutbefore cyclic cylinder deactivatequote debugger deconstruct defaultdir defaultformat defaultpen defined degenerate degrees delete deletepreamble determinant diagonal diamond diffdiv dir dirSpecifier dirtime display distance divisors do_overpaint dot dotframe dotsize downcase draw drawAll drawDoubleLine drawFermion drawGhost drawGluon drawMomArrow drawPRCcylinder drawPRCdisk drawPRCsphere drawPRCtube drawPhoton drawScalar drawVertex drawVertexBox drawVertexBoxO drawVertexBoxX drawVe!
 rtexO drawVertexOX drawVertexTriangle drawVertexTriangleO drawVertexX drawarrow drawarrow2 drawbeziertriangle drawline drawpixel drawstrokepath drawtick duplicate elle ellipse ellipsenodesnumber embed embed3 embedplayer empty enclose end endclip endgroup endgroup3 endl endpoint endpoints eof eol equation equations erase erasestep erf erfc error errorbar errorbars eval excenter excircle exit exitfunction exp expfactors expi expm1 exradius extend extension extouch fabs factorial fermat fft fhorner figure file filecode fill filldraw filloutside fillrule filltype find findall findroot finite finiteDifferenceJacobian firstcut firstframe fit fit2 fixedscaling floor flush fmdefaults fmod focusToCenter font fontcommand fontsize foot format frac frequency fromCenter fromFocus fspline functionshade gamma gcd generate_random_backtrace generateticks gergonne getc getint getpair getreal getstring gettriple gluon gouraudshade graph graphic graphicscale gray grestore grid grid3 gsave halfbox hatch hdiffdiv hermite hex histogram history hline hprojection hsv hyperbola hyperbolanodesnumber hyperlink hypot identity image implicitsurface incenter incentral incircle increasing incrementposition indexedfigure initdefaults initialized input inradius insert inside insphere integrate interactive interior interp interpolate intersect intersection intersectionpoint intersectionpoints intersections intouch inverse inversion invisible is3D isDuplicate isnan isogonal isogonalconjugate isotomic isotomicconjugate isparabola italic item jobname key kurtosis kurtosisexcess label labelaxis labelmargin labelpath labels labeltick labelx labelx3 labely labely3 labelz labelz3 lastcut latex latitude latticeshade layer layout lcm ldexp leastsquares legend legenditem length lexorder lift light limits line linear linecap lineinversion linejoin linemargin lineskip linetype linewidth link list lm_enorm lm_evaluate_default lm_lmdif lm_lmpar lm_minimize lm_print_default lm_print_quiet lm_qrfac lm_qrsolv locale locate locatefile location log log10 log1p loga!
 xiscoverage longitude lookup make3dgrid makeNode makecircle makedraw makepen maketriangle map margin markangle markangleradius markanglespace markarc marker markinterval marknodes markrightangle markthin markuniform mass masscenter massformat math max max3 maxAfterTransform maxbezier maxbound maxcoords maxlength maxratio maxtimes mean medial median midpoint min min3 minAfterTransform minbezier minbound minipage minratio mintimes miterlimit mktemp momArrowPath momarrowsize monotonic multifigure nGrad nativeformat natural newl newpage newslide newton newtree nextframe nextnormal nextpage nib nodabscissa node none norm normalout normalvideo nosetpagesize notaknot nowarn numberpage nurb object offset onpath opacity opposite orient orientation origin orthic orthocentercenter outformat outline outname outprefix output overloadedMessage overwrite pack pad pairs palette parabola parabolanodesnumber parallel parallelogram partialsum patchwithnormals path path3 pathbetween pathinface pattern pause pdf pedal periodic perp perpendicular perpendicularmark phantom phi1 phi2 phi3 photon piecewisestraight point polar polarconicroutine polargraph polygon popcount postcontrol postscript pow10 ppoint prc prc0 prconly precision precontrol prepend printBytecode print_random_addresses progress project projection projecttospan projecttospan_findcoeffs purge pwhermite quadpatches quadrant quadraticroots quantize quarticroots quotient radialshade radians radicalcenter radicalline radius rand randompath rd readline realmult realquarticroots rectangle rectangular rectify reflect relabscissa relative relativedistance reldir relpoint reltime remainder remark removeDuplicates rename replace report resetdefaultpen restore restoredefaults reverse reversevideo rf rfind rgb rgba rgbint rms rotate rotateO rotation round roundbox roundedpath roundrectangle samecoordsys sameside sample save savedefaults saveline scale scale3 scaleO scaleT scaleless scientific search searchtree sec secondaryX secondaryY seconds section sector seek seekeof segment se!
 gmentlimits sequence setpens sgn sgnd sharpangle sharpdegrees shift shiftless shipout shipout3 show simeq simplex simpson sin sinh size size3 skewness skip slant sleep slice slope slopefield solve solveBVP sort sourceline sphere split sqrt square srand standardizecoordsys stdev step stickframe stickmarksize stickmarkspace stop straight straightness string stripdirectory stripextension stripfile stripsuffix strokepath subdivide subitem subpath substr sum surface symmedial symmedian system tab tableau tan tangent tangential tangents tanh tell tensionSpecifier tensorshade tex texcolor texify texpath texpreamble texreset texshipout texsize textpath thick thin tick tickMax tickMax3 tickMin tickMin3 ticklabelshift ticklocate tildeframe tildemarksize tile tiling time times title titlepage topbox toplocation transform transformation transpose trembleFuzz triangle triangleAbc triangleabc triangletoquads trianglewithnormals triangulate tricoef tridiagonal trilinear trim truepoint tube uncycle unfill uniform unique unit unitrand unitsize unityroot unstraighten upcase updatefunction uperiodic upscale uptodate usepackage usersetting usetypescript usleep value variance variancebiased vbox vector vectorfield verbatim view vline vperiodic vprojection warn warning windingnumber write xasyKEY xaxis xaxis3 xaxis3At xaxisAt xequals xlimits xmap xpart xscale xscaleO xtick xtick3 xtrans yaxis yaxis3 yaxis3At yaxisAt yequals ylimits ypart yscale yscaleO ytick ytick3 ytrans zaxis3 zaxis3At zero zlimits zpart ztick ztick3 ztrans ))
+AND Arc ArcArrow ArcArrows Arrow Arrows AtA Automatic AvantGarde B03 B13 B23 B33 BBox BWRainbow BWRainbow2 Bar Bars BeginArcArrow BeginArrow BeginBar BeginDotMargin BeginMargin BeginPenMargin Blank Bookman Bottom BottomTop Bounds Break Broken BrokenLog CLZ CTZ Ceil Circle CircleBarIntervalMarker Cos Courier CrossIntervalMarker DOSendl DOSnewl DefaultFormat DefaultLogFormat Degrees Dir DotMargin DotMargins Dotted Draw Drawline Embed EndArcArrow EndArrow EndBar EndDotMargin EndMargin EndPenMargin Fill FillDraw Floor Format Full Gaussian Gaussrand Gaussrandpair Gradient Grayscale Helvetica Hermite HookHead InOutTicks InTicks Jn Label Landscape Left LeftRight LeftTicks Legend Linear Log LogFormat Margin Margins Mark MidArcArrow MidArrow NOT NewCenturySchoolBook NoBox NoMargin NoModifier NoTicks NoTicks3 NoZero NoZeroFormat None OR OmitFormat OmitTick OmitTickInterval OmitTickIntervals OutTicks Ox Oy Palatino PaletteTicks Pen PenMargin PenMargins Pentype Portrait RGB RadialShade RadialShadeDraw Rainbow Range Relative Right RightTicks Rotate Round SQR Scale ScaleX ScaleY ScaleZ Seascape Shift Sin Slant Spline StickIntervalMarker Straight Symbol Tan TeXify Ticks Ticks3 TildeIntervalMarker TimesRoman Top TrueMargin UnFill UpsideDown Wheel X XEquals XOR XY XYEquals XYZero XYgrid XZEquals XZZero XZero XZgrid Y YEquals YXgrid YZ YZEquals YZZero YZero YZgrid Yn Z ZX ZXgrid ZYgrid ZapfChancery ZapfDingbats _begingroup3 _cputime _draw _eval _findroot _image _labelpath _projection _shipout _strokepath _texpath aCos aSin aTan abort abs accel acos acosh acot acsc activatequote add addArrow addMargins addSaveFunction addpenarc addpenline addseg adjust alias align all altitude angabscissa angle angledegrees angpoint animate annotate anticomplementary antipedal apply approximate arc arcarrowsize arccircle arcdir arcfromcenter arcfromfocus arclength arcnodesnumber arcpoint arcsubtended arcsubtendedcenter arctime arctopath array arrow arrow2 arrowbase arrowbasepoints arrowsize ascii asec asin asinh ask assert asy asycode asy!
 dir asyfigure asyfilecode asyinclude asywrite atan atan2 atanh atbreakpoint atexit attach attract atupdate autoformat autoscale autoscale3 axes axes3 axialshade axis axiscoverage azimuth babel background bangles bar barmarksize barsize basealign baseline bbox beep begin beginclip begingroup beginpoint between bevel bezier bezierP bezierPP bezierPPP bezulate bibliography bibliographystyle binarytree binarytreeNode binomial bins bisector bisectorpoint bispline bitreverse blend blockconnector box bqe brace breakpoint breakpoints brick buildRestoreDefaults buildRestoreThunk buildcycle bulletcolor byte calculateScaling canonical canonicalcartesiansystem cartesiansystem case1 case2 case3 cbrt cd ceil center centerToFocus centroid cevian change2 changecoordsys checkSegment check_fpt_zero checkconditionlength checker checkincreasing checklengths checkposition checkpt checkptincube checktriangle choose circle circlebarframe circlemarkradius circlenodesnumber circumcenter circumcircle clamped clear clip clipdraw close cmyk code colatitude collect collinear color colorless colors colorspace comma compassmark complement complementary concat concurrent cone conic conicnodesnumber conictype conj connect containmentTree contains contour contour3 controlSpecifier convert coordinates coordsys copy copyPairOrTriple cos cosh cot countIntersections cputime crop cropcode cross crossframe crosshatch crossmarksize csc cubicroots curabscissa curlSpecifier curpoint currentarrow currentexitfunction currentmomarrow currentpolarconicroutine curve cut cutafter cutbefore cyclic cylinder deactivatequote debugger deconstruct defaultdir defaultformat defaultpen defined degenerate degrees delete deletepreamble determinant diagonal diamond diffdiv dir dirSpecifier dirtime display distance divisors do_overpaint dot dotframe dotsize downcase draw drawAll drawDoubleLine drawFermion drawGhost drawGluon drawMomArrow drawPRCcylinder drawPRCdisk drawPRCsphere drawPRCtube drawPhoton drawScalar drawVertex drawVertexBox drawVertexBoxO drawVertexBoxX drawVe!
 rtexO drawVertexOX drawVertexTriangle drawVertexTriangleO drawVertexX drawarrow drawarrow2 drawbeziertriangle drawline drawpixel drawstrokepath drawtick duplicate elle ellipse ellipsenodesnumber embed embed3 embedplayer empty enclose end endclip endgroup endgroup3 endl endpoint endpoints eof eol equation equations erase erasestep erf erfc error errorbar errorbars eval excenter excircle exit exitfunction exp expfactors expi expm1 exradius extend extension extouch fabs factorial fermat fft fhorner figure file filecode fill filldraw filloutside fillrule filltype find findall findroot finite finiteDifferenceJacobian firstcut firstframe fit fit2 fixedscaling floor flush fmdefaults fmod focusToCenter font fontcommand fontsize foot format frac frequency fromCenter fromFocus fspline functionshade gamma gcd generate_random_backtrace generateticks gergonne getc getint getpair getreal getstring gettriple gluon gouraudshade graph graphic graphicscale gray grestore grid grid3 gsave halfbox hatch hdiffdiv hermite hex histogram history hline hprojection hsv hyperbola hyperbolanodesnumber hyperlink hypot identity image implicitsurface incenter incentral incircle increasing incrementposition indexedfigure initdefaults initialized input inradius insert inside insphere integrate interactive interior interp interpolate intersect intersection intersectionpoint intersectionpoints intersections intouch inverse inversion invisible is3D isDuplicate isnan isogonal isogonalconjugate isotomic isotomicconjugate isparabola italic item jobname key kurtosis kurtosisexcess label labelaxis labelmargin labelpath labels labeltick labelx labelx3 labely labely3 labelz labelz3 lastcut latex latitude latticeshade layer layout lcm ldexp leastsquares legend legenditem length lexorder lift light limits line linear linecap lineinversion linejoin linemargin lineskip linetype linewidth link list lm_enorm lm_evaluate_default lm_lmdif lm_lmpar lm_minimize lm_print_default lm_print_quiet lm_qrfac lm_qrsolv locale locate locatefile location log log10 log1p loga!
 xiscoverage longitude lookup make3dgrid makeNode makecircle makedraw makepen maketriangle map margin markangle markangleradius markanglespace markarc marker markinterval marknodes markrightangle markthin markuniform mass masscenter massformat math max max3 maxAfterTransform maxbezier maxbound maxcoords maxlength maxratio maxtimes mean medial median midpoint min min3 minAfterTransform minbezier minbound minipage minratio mintimes miterlimit mktemp momArrowPath momarrowsize monotonic multifigure nGrad nativeformat natural newl newpage newslide newton newtree nextframe nextnormal nextpage nib nodabscissa node none norm normalout normalvideo nosetpagesize notaknot nowarn numberpage nurb object offset onpath opacity opposite orient orientation origin orthic orthocentercenter outformat outline outname outprefix output overloadedMessage overwrite pack pad pairs palette parabola parabolanodesnumber parallel parallelogram partialsum patchwithnormals path path3 pathbetween pathinface pattern pause pdf pedal periodic perp perpendicular perpendicularmark phantom phi1 phi2 phi3 photon piecewisestraight point polar polarconicroutine polargraph polygon popcount postcontrol postscript pow10 ppoint prc prc0 prconly precision precontrol prepend printBytecode print_random_addresses progress project projection projecttospan projecttospan_findcoeffs purge pwhermite quadpatches quadrant quadraticroots quantize quarticroots quotient radialshade radians radicalcenter radicalline radius rand randompath rationalidentity rd readline realmult realquarticroots rectangle rectangular rectify reflect relabscissa relative relativedistance reldir relpoint reltime remainder remark removeDuplicates rename replace report resetdefaultpen restore restoredefaults reverse reversevideo rf rfind rgb rgba rgbint rms rotate rotateO rotation round roundbox roundedpath roundrectangle samecoordsys sameside sample save savedefaults saveline scale scale3 scaleO scaleT scaleless scientific search searchtree sec secondaryX secondaryY seconds section sector seek s!
 eekeof segment segmentlimits sequence setpens sgn sgnd sharpangle sharpdegrees shift shiftless shipout shipout3 show simeq simplex simplexPhase2 simplexTableau simplexWrite simpson sin sinh size size3 skewness skip slant sleep slice slope slopefield solve solveBVP sort sourceline sphere split sqrt square srand standardizecoordsys stdev step stickframe stickmarksize stickmarkspace stop straight straightness string stripdirectory stripextension stripfile stripsuffix strokepath subdivide subitem subpath substr sum surface symmedial symmedian system tab tableau tan tangent tangential tangents tanh tell tensionSpecifier tensorshade tex texcolor texify texpath texpreamble texreset texshipout texsize texstring textpath thick thin tick tickMax tickMax3 tickMin tickMin3 ticklabelshift ticklocate tildeframe tildemarksize tile tiling time times title titlepage topbox toplocation transform transformation transpose trembleFuzz triangle triangleAbc triangleabc triangletoquads trianglewithnormals triangulate tricoef tridiagonal trilinear trim truepoint tube uncycle unfill uniform unique unit unitrand unitsize unityroot unstraighten upcase updatefunction uperiodic upscale uptodate usepackage usersetting usetypescript usleep value variance variancebiased vbox vector vectorfield verbatim view vline vperiodic vprojection warn warning windingnumber write xasyKEY xaxis xaxis3 xaxis3At xaxisAt xequals xlimits xmap xpart xscale xscaleO xtick xtick3 xtrans yaxis yaxis3 yaxis3At yaxisAt yequals ylimits ypart yscale yscaleO ytick ytick3 ytrans zaxis3 zaxis3At zero zlimits zpart ztick ztick3 ztrans ))
 
 (defvar asy-variable-name '(
 AliceBlue Align Allow AntiqueWhite Apricot Aqua Aquamarine Aspect Azure BeginPoint Beige Bisque Bittersweet Black BlanchedAlmond Blue BlueGreen BlueViolet Both Break BrickRed Brown BurlyWood BurntOrange CCW CW CadetBlue CarnationPink Center Centered Cerulean Chartreuse Chocolate Coeff Coral CornflowerBlue Cornsilk Crimson Crop Cyan Dandelion DarkBlue DarkCyan DarkGoldenrod DarkGray DarkGreen DarkKhaki DarkMagenta DarkOliveGreen DarkOrange DarkOrchid DarkRed DarkSalmon DarkSeaGreen DarkSlateBlue DarkSlateGray DarkTurquoise DarkViolet DeepPink DeepSkyBlue DefaultHead DimGray DodgerBlue Dotted Down Draw E ENE EPS ESE E_Euler E_PC E_RK2 E_RK3BS Emerald EndPoint Euler Fill FillDraw FireBrick FloralWhite ForestGreen Fuchsia Gainsboro GhostWhite Gold Goldenrod Gray Green GreenYellow Honeydew HookHead Horizontal HotPink I IgnoreAspect IndianRed Indigo Ivory JOIN_IN JOIN_OUT JungleGreen Khaki LM_DWARF LM_MACHEP LM_SQRT_DWARF LM_SQRT_GIANT LM_USERTOL Label Lavender LavenderBlush LawnGreen Left LeftJustified LeftSide LemonChiffon LightBlue LightCoral LightCyan LightGoldenrodYellow LightGreen LightGrey LightPink LightSalmon LightSeaGreen LightSkyBlue LightSlateGray LightSteelBlue LightYellow Lime LimeGreen Linear Linen Log Logarithmic Magenta Mahogany Mark MarkFill MarkPath Maroon Max MediumAquamarine MediumBlue MediumOrchid MediumPurple MediumSeaGreen MediumSlateBlue MediumSpringGreen MediumTurquoise MediumVioletRed Melon MidPoint MidnightBlue Min MintCream MistyRose Moccasin Move MoveQuiet Mulberry N NE NNE NNW NULL_VERTEX NW NavajoWhite Navy NavyBlue NoAlign NoCrop NoFill NoSide OldLace Olive OliveDrab OliveGreen Orange OrangeRed Orchid Ox Oy PC PaleGoldenrod PaleGreen PaleTurquoise PaleVioletRed PapayaWhip Peach PeachPuff Periwinkle Peru PineGreen Pink Plum PowderBlue ProcessBlue Purple RK2 RK3 RK3BS RK4 RK5 RK5DP RK5F RawSienna Red RedOrange RedViolet Rhodamine Right RightJustified RightSide RosyBrown RoyalBlue RoyalPurple RubineRed S SE SSE SSW SW SaddleBrown Salmon SandyBrown SeaGreen Seashell Sepia Sienna S!
 ilver SimpleHead SkyBlue SlateBlue SlateGray Snow SpringGreen SteelBlue Suppress SuppressQuiet Tan TeXHead Teal TealBlue Thistle Ticksize Tomato Turquoise UnFill Up VERSION Value Vertical Violet VioletRed W WNW WSW Wheat White WhiteSmoke WildStrawberry XHIGH XLOW XYAlign YAlign YHIGH YLOW Yellow YellowGreen YellowOrange ZHIGH ZLOW _outpipe aboveequationskip addpenarc addpenline align allowstepping angularsystem animationdelay appendsuffix arcarrowangle arcarrowfactor arrow2sizelimit arrowangle arrowbarb arrowdir arrowfactor arrowhookfactor arrowlength arrowsizelimit arrowtexfactor authorpen axis axiscoverage axislabelfactor background backgroundcolor backgroundpen barfactor barmarksizefactor basealign baselinetemplate bernstein beveljoin bigvertexpen bigvertexsize black blue bm bottom bp bracedefaultratio braceinnerangle bracemidangle braceouterangle brown bullet byfoci byvertices camerafactor chartreuse circlemarkradiusfactor circlenodesnumberfactor circleprecision circlescale cm codefile codepen codeskip colorPen coloredNodes coloredSegments conditionlength conicnodesfactor count cputimeformat crossmarksizefactor currentcoordsys currentlight currentpatterns currentpen currentpicture currentposition currentprojection curvilinearsystem cuttings cyan darkblue darkbrown darkcyan darkgray darkgreen darkgrey darkmagenta darkolive darkred dashdotted dashed datepen dateskip debuggerlines debugging deepblue deepcyan deepgray deepgreen deepgrey deepmagenta deepred deepyellow default defaultControl defaultS defaultbackpen defaultcoordsys defaultexcursion defaultfilename defaultformat defaultmassformat defaultpen defaultseparator differentlengths dot dotfactor dotframe dotted doublelinepen doublelinespacing down duplicateFuzz ellipsenodesnumberfactor eps epsgeo epsilon evenodd expansionfactor extendcap fermionpen figureborder figuremattpen file3 firstnode firststep foregroundcolor fuchsia fuzz gapfactor ghostpen gluonamplitude gluonpen gluonratio gray green grey hatchepsilon havepagenumber heavyblue heavycyan heavygray he!
 avygreen heavygrey heavymagenta heavyred hline hwratio hyperbolanodesnumberfactor identity identity4 ignore implicitshipout inch inches includegraphicscommand inf infinity institutionpen intMax intMin invert invisible itempen itemskip itemstep labelmargin landscape lastnode left legendhskip legendlinelength legendmargin legendmarkersize legendmaxrelativewidth legendvskip lightblue lightcyan lightgray lightgreen lightgrey lightmagenta lightolive lightred lightyellow linemargin lm_infmsg lm_shortmsg longdashdotted longdashed magenta magneticRadius mantissaBits markangleradius markangleradiusfactor markanglespace markanglespacefactor maxrefinements mediumblue mediumcyan mediumgray mediumgreen mediumgrey mediummagenta mediumred mediumyellow middle minDistDefault minblockheight minblockwidth mincirclediameter minipagemargin minipagewidth minvertexangle miterjoin mm momarrowfactor momarrowlength momarrowmargin momarrowoffset momarrowpen monoPen morepoints nCircle nan newbulletcolor ngraph nil nmesh nobasealign nodeMarginDefault nodesystem nomarker nopoint noprimary nullpath nullpen numarray ocgindex oldbulletcolor olive orange origin overpaint page pageheight pagemargin pagenumberalign pagenumberpen pagenumberposition pagewidth paleblue palecyan palegray palegreen palegrey palemagenta palered paleyellow parabolanodesnumberfactor perpfactor phi photonamplitude photonpen photonratio pi pink plain plain_bounds plain_scaling plus preamblenodes pt purple r3 r4a r4b randMax realDigits realEpsilon realMax realMin red relativesystem reverse right roundcap roundjoin royalblue salmon saveFunctions scalarpen sequencereal settings signedtrailingzero simplex solid spinner springgreen sqrtEpsilon squarecap squarepen startposition stdin stdout stepfactor stepfraction steppagenumberpen stepping stickframe stickmarksizefactor stickmarkspacefactor swap textpen ticksize tildeframe tildemarksizefactor tinv titlealign titlepagepen titlepageposition titlepen titleskip top trailingzero treeLevelStep treeMinNodeWidth treeNodeStep trembleAngl!
 e trembleFrequency trembleRandom undefined unitcircle unitsquare up urlpen urlskip version vertexpen vertexsize viewportmargin viewportsize vline white wye yellow ylabelwidth zeroTransform zerotickfuzz zerowinding ))

Modified: trunk/Build/source/utils/asymptote/asy.list
===================================================================
--- trunk/Build/source/utils/asymptote/asy.list	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/asy.list	2019-03-27 22:27:57 UTC (rev 50622)
@@ -6,14 +6,15 @@
 light currentlight;
 pen royalblue;
 real arrowdir;
-frame pack(pair align=<default> ... object[] inset);
 filltype filltype(int type=<default>, pen fillpen=<default>, pen drawpen=<default>, void fill2(frame f, path[] g, pen fillpen));
-void addArrow(picture pic, arrowhead arrowhead, path g, pen p, real size, real angle, filltype filltype, real position);
 int Suppress;
 align NoAlign;
+pair relative(picture pic=<default>, pair z);
 filltype RadialShade(pen penc, pen penr);
 real[] arrowbasepoints(path base, path left, path right, real default=<default>);
+object embed3(string, frame, string, string, string, light, projection);
 real bp;
+projection projection(triple camera, triple up=<default>, triple target=<default>, triple normal=<default>, real zoom=<default>, real angle=<default>, pair viewportshift=<default>, bool showtarget=<default>, bool autoadjust=<default>, bool center=<default>, transformation projector(triple camera, triple up, triple target));
 pen mean(pen[] p, real opacity(real[])=<default>);
 pen[] mean(pen[][] palette, real opacity(real[])=<default>);
 pen squarecap;
@@ -23,12 +24,11 @@
 real inches;
 pair SW;
 real inch;
+picture legenditem(Legend legenditem, real linelength);
 marginT EndMargin(path, pen);
 pen mediumgrey;
 pen darkcyan;
 real legendhskip;
-string ask(string prompt);
-frame[] fit2(picture[] pictures, picture all);
 void addSaveFunction(void s()());
 pen olive;
 pen zerowinding;
@@ -41,13 +41,10 @@
 pen darkgreen;
 string verbatim(string s);
 pen heavygray;
-bool ArcArrows(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
-bool ArcArrows(picture, path, pen, marginT(path, pen));
 pen darkred;
 pair E;
 plain_scaling plain_scaling;
 pen darkgray;
-projection projection(triple camera, triple up=<default>, triple target=<default>, triple normal=<default>, real zoom=<default>, real angle=<default>, pair viewportshift=<default>, bool showtarget=<default>, bool autoadjust=<default>, bool center=<default>, transformation projector(triple camera, triple up, triple target));
 frame orientation(frame);
 void progress(bool3 init=<default>);
 pen salmon;
@@ -58,13 +55,11 @@
 triple gettriple(string name=<default>, triple default=<default>, string prompt=<default>, bool store=<default>);
 pen Yellow;
 real cm;
-bool EndBar(picture, path, pen, marginT(path, pen));
-bool EndBar(picture, path, pen, marginT(path, pen))(real size=<default>);
 pen mediumgreen;
 pen heavygreen;
+string ask(string prompt);
+frame[] fit2(picture[] pictures, picture all);
 pen dashdotted;
-int debuggerlines;
-frame bbox(picture pic=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>);
 pen deepblue;
 string graphicscale(real x);
 pen mediumblue;
@@ -71,16 +66,16 @@
 pen heavyblue;
 transform invert;
 pair NNW;
-void drawarrow2(frame f, arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>);
 pair SE;
 pen thick(pen p=<default>);
 pen mediumred;
 marginT EndDotMargin(path, pen);
+bool ArcArrows(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
+bool ArcArrows(picture, path, pen, marginT(path, pen));
 void filloutside(picture pic=<default>, path[] g, pen p=<default>, bool copy=<default>);
 void filloutside(frame f, path[] g, pen p=<default>, bool copy=<default>);
 filltype RadialShadeDraw(real xmargin=<default>, real ymargin=<default>, pen penc, pen penr, pen drawpen=<default>);
 marginT BeginDotMargin(path, pen);
-frame enclose(string prefix=<default>, object F, string format=<default>);
 marker[] Mark;
 marker Mark(int n);
 pen darkolive;
@@ -91,10 +86,18 @@
 pen Symbol(string series=<default>, string shape=<default>);
 int count;
 path circle(pair c, real r);
+path ellipse(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+path ellipse(frame f, Label L, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+path ellipse(pair c, real a, real b);
 pen beveljoin;
 pen orange;
 pen green;
+bool EndBar(picture, path, pen, marginT(path, pen));
+bool EndBar(picture, path, pen, marginT(path, pen))(real size=<default>);
 file stdin;
+int debuggerlines;
+frame bbox(picture pic=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>);
+frame pack(pair align=<default> ... object[] inset);
 path unitcircle;
 arrowhead DefaultHead;
 pen white;
@@ -103,11 +106,14 @@
 transform Rotate(transform t);
 Legend Legend(string label, pen plabel=<default>, pen p=<default>, frame mark=<default>, bool above=<default>);
 void exitfunction();
+void drawarrow(frame f, arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, bool forwards=<default>, marginT margin(path, pen)=<default>, bool center=<default>);
 string cputimeformat;
 pair arcpoint(path p, real L);
 bool interior(int windingnumber, pen fillrule);
 pen fuchsia;
 pen brown;
+bool EndArrow(picture, path, pen, marginT(path, pen));
+bool EndArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
 void bar(picture pic, pair a, pair d, pen p=<default>);
 picture bar(pair a, pair d, pen p=<default>);
 pen deepcyan;
@@ -117,12 +123,7 @@
 pen TimesRoman(string series=<default>, string shape=<default>);
 pen palemagenta;
 int mantissaBits;
-void copyPairOrTriple(pairOrTriple dest, pairOrTriple src);
 pen lightolive;
-string outprefix(string prefix=<default>);
-object object(frame f);
-object object(Label L);
-object object(Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
 path arrowbase(path r, pair y, real t, real size);
 pen[] monoPen;
 bool CW;
@@ -130,8 +131,9 @@
 marginT EndPenMargin(path, pen);
 pair NNE;
 pen roundjoin;
+void addArrow(picture pic, arrowhead arrowhead, path g, pen p, real size, real angle, filltype filltype, real position);
 pen lightgray;
-pair relative(picture pic=<default>, pair z);
+picture arrow2(arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>);
 position MidPoint;
 string Embed(string name, string text=<default>, string options=<default>, real width=<default>, real height=<default>);
 pen deepgrey;
@@ -142,12 +144,14 @@
 file stdout;
 frame Seascape(frame f);
 pair up;
-void savedefaults()();
-bool MidArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
-bool MidArrow(picture, path, pen, marginT(path, pen));
 pen ZapfChancery(string series=<default>, string shape=<default>);
 pair left;
 bool prconly(string format=<default>);
+pair[] pairs(real[] x, real[] y);
+void eval(code s, bool embedded=<default>);
+void eval(string s, bool embedded=<default>);
+bool Arrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+bool Arrow(picture, path, pen, marginT(path, pen));
 pen deepgreen;
 pen lightmagenta;
 real bracedefaultratio;
@@ -154,27 +158,21 @@
 transform Scale(transform t);
 string getstring(string name=<default>, string default=<default>, string prompt=<default>, bool store=<default>);
 marginT DotMargins(path, pen);
+bool debugging;
+void shipout(string prefix=<default>, picture pic=<default>, frame orientation(frame)=<default>, string format=<default>, bool wait=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>);
+void shipout(string prefix=<default>, frame f, string format=<default>, bool wait=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>, transform t=<default>);
 path[] MarkPath;
-picture legenditem(Legend legenditem, real linelength);
 pen deepgray;
-bool BeginArcArrow(picture, path, pen, marginT(path, pen));
-bool BeginArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
 string defaultformat(int n, string trailingzero=<default>, bool fixed=<default>, bool signed=<default>);
 string defaultformat;
 pen lightcyan;
 pen paleblue;
-real legendmargin;
-bool None(picture, path, pen, marginT(path, pen));
-path box(pair a, pair b);
-path box(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-path box(frame f, Label L, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-pen Bookman(string series=<default>, string shape=<default>);
-frame[] fit(string prefix=<default>, picture[] pictures, string format=<default>, bool view=<default>, string options=<default>, string script=<default>, projection P=<default>);
 frame align(frame f, pair align);
+path[] align(path[] g, transform t=<default>, pair position, pair align, pen p=<default>);
 object align(object F, pair align);
-path[] align(path[] g, transform t=<default>, pair position, pair align, pen p=<default>);
 transform scaleless(transform t);
 pen RGB(int r, int g, int b);
+void copyPairOrTriple(pairOrTriple dest, pairOrTriple src);
 pen thin();
 real arcarrowangle;
 void restoredefaults();
@@ -188,15 +186,14 @@
 guide operator ---(... guide[]);
 int JOIN_IN;
 real barfactor;
+void arrow(picture pic=<default>, Label L=<default>, pair b, pair dir, real length=<default>, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>);
+picture arrow(arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, bool forwards=<default>, marginT margin(path, pen)=<default>, bool center=<default>);
+void unitsize(picture pic=<default>, real x, real y=<default>, real z=<default>);
 pen lightgreen;
 transform zeroTransform;
 void endl(file file);
-bool ArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
-bool ArcArrow(picture, path, pen, marginT(path, pen));
 void usersetting();
 bool prc0(string format=<default>);
-bool Bars(picture, path, pen, marginT(path, pen));
-bool Bars(picture, path, pen, marginT(path, pen))(real size=<default>);
 pair rectify(pair dir);
 arrowhead TeXHead;
 void beep();
@@ -205,6 +202,9 @@
 pen lightblue;
 real bracemidangle;
 path unitsquare;
+void savedefaults()();
+bool MidArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
+bool MidArrow(picture, path, pen, marginT(path, pen));
 pen cyan;
 pen grey;
 transform rotation(transform t);
@@ -212,8 +212,6 @@
 pen magenta;
 pair WSW;
 pen nobasealign;
-bool BeginArrow(picture, path, pen, marginT(path, pen));
-bool BeginArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
 frame Landscape(frame f);
 real camerafactor;
 pen lightred;
@@ -223,9 +221,18 @@
 pen squarepen;
 pen deepyellow;
 real barsize(pen p=<default>);
+bool BeginArcArrow(picture, path, pen, marginT(path, pen));
+bool BeginArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+real legendmargin;
+bool None(picture, path, pen, marginT(path, pen));
 pen AvantGarde(string series=<default>, string shape=<default>);
 real circleprecision;
 pen Black;
+pen Bookman(string series=<default>, string shape=<default>);
+path box(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+path box(frame f, Label L, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+path box(pair a, pair b);
+frame[] fit(string prefix=<default>, picture[] pictures, string format=<default>, bool view=<default>, string options=<default>, string script=<default>, projection P=<default>);
 pen Pen(int n);
 pair ENE;
 pen Courier(string series=<default>, string shape=<default>);
@@ -236,7 +243,6 @@
 path arc(pair c, real r, real angle1, real angle2, bool direction);
 pair right;
 string outformat(string format=<default>);
-marker markthin(path g, pen p=<default>, real thin(real fraction)=<default>, filltype filltype=<default>);
 filltype Fill;
 filltype Fill(real xmargin=<default>, real ymargin=<default>, pen p=<default>);
 pen Palatino(string series=<default>, string shape=<default>);
@@ -249,6 +255,8 @@
 real calculateScaling(string dir, coord[] m, coord[] M, real size, bool warn=<default>);
 real expansionfactor;
 position BeginPoint;
+bool ArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+bool ArcArrow(picture, path, pen, marginT(path, pen));
 real arrowhookfactor;
 bool finite(real x);
 bool finite(pair z);
@@ -255,6 +263,9 @@
 bool finite(triple v);
 filltype UnFill(real xmargin=<default>, real ymargin=<default>);
 filltype UnFill;
+frame enclose(string prefix=<default>, object F, string format=<default>);
+bool Bars(picture, path, pen, marginT(path, pen));
+bool Bars(picture, path, pen, marginT(path, pen))(real size=<default>);
 pair I;
 pair SSW;
 transform Slant(transform t);
@@ -272,9 +283,6 @@
 real arrow2sizelimit;
 filltype FillDraw;
 filltype FillDraw(real xmargin=<default>, real ymargin=<default>, pen fillpen=<default>, pen drawpen=<default>);
-bool debugging;
-void shipout(string prefix=<default>, frame f, string format=<default>, bool wait=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>, transform t=<default>);
-void shipout(string prefix=<default>, picture pic=<default>, frame orientation(frame)=<default>, string format=<default>, bool wait=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>);
 void pause(string w=<default>);
 int ocgindex;
 pen springgreen;
@@ -281,14 +289,11 @@
 pen heavygrey;
 void markuniform(picture pic=<default>, frame f, path g)(pair z(real t), real a, real b, int n);
 void markuniform(picture pic=<default>, frame f, path g)(bool centered=<default>, int n, bool rotated=<default>);
+bool BeginArrow(picture, path, pen, marginT(path, pen));
+bool BeginArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+real circlescale;
 bool ignore;
-real circlescale;
-frame dotframe(pen p=<default>, filltype filltype=<default>);
-frame dotframe;
 pen darkblue;
-path ellipse(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-path ellipse(frame f, Label L, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-path ellipse(pair c, real a, real b);
 real reltime(path p, real l);
 void marknodes(picture pic=<default>, frame f, path g);
 int JOIN_OUT;
@@ -295,6 +300,27 @@
 projection currentprojection;
 real arrowsizelimit;
 pair endpoint(path p);
+arrowhead HookHead;
+arrowhead HookHead(real dir=<default>, real barb=<default>);
+real[] concat(... real[][]);
+pair[] concat(... pair[][]);
+pen[] concat(... pen[][]);
+marker[] concat(... marker[][]);
+path[] concat(... path[][]);
+coord[] concat(... coord[][]);
+coord[] concat(... coord[][]);
+picture[] concat(... picture[][]);
+int[] concat(... int[][]);
+void()()[] concat(... void()()[][]);
+bool3[] concat(... bool3[][]);
+object[] concat(... object[][]);
+string[] concat(... string[][]);
+Label[] concat(... Label[][]);
+triple[] concat(... triple[][]);
+Legend[] concat(... Legend[][]);
+frame[] concat(... frame[][]);
+guide[] concat(... guide[][]);
+bool[] concat(... bool[][]);
 slice firstcut(path p, path knife);
 frame UpsideDown(frame f);
 pair viewportmargin;
@@ -305,21 +331,17 @@
 node node(void d(frame f, transform t, transform T, pair lb, pair rt), string key=<default>);
 marginT BeginMargin(path, pen);
 path buildcycle(... path[] p);
-void unitsize(picture pic=<default>, real x, real y=<default>, real z=<default>);
-void arrow(picture pic=<default>, Label L=<default>, pair b, pair dir, real length=<default>, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>);
-picture arrow(arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, bool forwards=<default>, marginT margin(path, pen)=<default>, bool center=<default>);
-pair[] pairs(real[] x, real[] y);
-void eval(code s, bool embedded=<default>);
-void eval(string s, bool embedded=<default>);
-bool Arrow(picture, path, pen, marginT(path, pen));
-bool Arrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+marker markthin(path g, pen p=<default>, real thin(real fraction)=<default>, filltype filltype=<default>);
 void activatequote(picture pic=<default>);
 int undefined;
+string outprefix(string prefix=<default>);
+object object(Label L);
+object object(Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+object object(frame f);
+void drawarrow2(frame f, arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>);
 pen roundcap;
 void buildRestoreThunk()();
 void overloadedMessage(file file);
-bool EndArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
-bool EndArrow(picture, path, pen, marginT(path, pen));
 frame currentpatterns;
 real arrowfactor;
 pen heavyred;
@@ -339,8 +361,9 @@
 string[] array(int n, string value, int depth=<default>);
 pair[][] array(int n, pair[] value, int depth=<default>);
 bool3[] array(int n, bool3 value, int depth=<default>);
-Label[] array(int n, Label value, int depth=<default>);
-picture[] array(int n, picture value, int depth=<default>);
+object[] array(int n, object value, int depth=<default>);
+marker[] array(int n, marker value, int depth=<default>);
+Legend[] array(int n, Legend value, int depth=<default>);
 real[][] array(int n, real[] value, int depth=<default>);
 real[] array(int n, real value, int depth=<default>);
 triple[] array(int n, triple value, int depth=<default>);
@@ -349,9 +372,8 @@
 pen[][] array(int n, pen[] value, int depth=<default>);
 coord[] array(int n, coord value, int depth=<default>);
 coord[] array(int n, coord value, int depth=<default>);
-object[] array(int n, object value, int depth=<default>);
-marker[] array(int n, marker value, int depth=<default>);
-Legend[] array(int n, Legend value, int depth=<default>);
+Label[] array(int n, Label value, int depth=<default>);
+picture[] array(int n, picture value, int depth=<default>);
 int[] array(int n, int value, int depth=<default>);
 string[][] array(int n, string[] value, int depth=<default>);
 pair[] array(int n, pair value, int depth=<default>);
@@ -360,42 +382,18 @@
 string[] array(string s);
 real[] uniform(real a, real b, int n);
 pair viewportsize;
-picture arrow2(arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>);
-void drawarrow(frame f, arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, bool forwards=<default>, marginT margin(path, pen)=<default>, bool center=<default>);
-object embed3(string, frame, string, string, string, light, projection);
 picture currentpicture;
 pen palegreen;
-Label Label(Label L, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
 Label Label(Label L, pair position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
 Label Label(string s, string size=<default>, explicit position position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
 Label Label(Label L, explicit position position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
+Label Label(explicit pair position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
 Label Label;
-Label Label(explicit pair position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
 Label Label(string s=<default>, string size=<default>, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
 Label Label(string s, string size=<default>, pair position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
+Label Label(Label L, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
 hsv hsv(real h, real s, real v);
 hsv hsv(pen p);
-arrowhead HookHead;
-arrowhead HookHead(real dir=<default>, real barb=<default>);
-marker[] concat(... marker[][]);
-real[] concat(... real[][]);
-picture[] concat(... picture[][]);
-pair[] concat(... pair[][]);
-object[] concat(... object[][]);
-pen[] concat(... pen[][]);
-Label[] concat(... Label[][]);
-path[] concat(... path[][]);
-coord[] concat(... coord[][]);
-coord[] concat(... coord[][]);
-Legend[] concat(... Legend[][]);
-int[] concat(... int[][]);
-void()()[] concat(... void()()[][]);
-bool3[] concat(... bool3[][]);
-string[] concat(... string[][]);
-triple[] concat(... triple[][]);
-frame[] concat(... frame[][]);
-guide[] concat(... guide[][]);
-bool[] concat(... bool[][]);
 pair N;
 real dotsize(pen p=<default>);
 real pt;
@@ -406,6 +404,8 @@
 pen miterjoin;
 arrowhead SimpleHead;
 real arrowangle;
+frame dotframe(pen p=<default>, filltype filltype=<default>);
+frame dotframe;
 real arcarrowfactor;
 real mm;
 plain plain;
@@ -418,8 +418,8 @@
 real[][] scale3(real s);
 int AND(int a, int b);
 real[] cubicroots(real a, real b, real c, real d);
+void attach(picture dest=<default>, frame src, pair position, pair align, bool group=<default>, filltype filltype=<default>, bool above=<default>);
 void attach(picture dest=<default>, frame src, pair position=<default>, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void attach(picture dest=<default>, frame src, pair position, pair align, bool group=<default>, filltype filltype=<default>, bool above=<default>);
 real[] quadraticroots(real a, real b, real c);
 pair[] quadraticroots(explicit pair a, explicit pair b, explicit pair c);
 path[] strokepath(path g, pen p=<default>);
@@ -426,10 +426,10 @@
 real erf(real x);
 real Yn(int n, real x);
 real Jn(int n, real x);
-light light(pen diffuse=<default>, pen ambient=<default>, pen specular=<default>, pen background=<default>, real specularfactor=<default>, bool viewport=<default> ... triple[] position);
-light light(pen[] diffuse, pen[] ambient=<default>, pen[] specular=<default>, pen background=<default>, real specularfactor=<default>, bool viewport=<default>, triple[] position);
-light light(pen diffuse=<default>, pen ambient=<default>, pen specular=<default>, pen background=<default>, bool viewport=<default>, real x, real y, real z);
+light light(pen[] diffuse, pen[] ambient=<default>, pen[] specular=<default>, pen background=<default>, real specularfactor=<default>, triple[] position);
+light light(pen diffuse=<default>, pen ambient=<default>, pen specular=<default>, pen background=<default>, real x, real y, real z);
 light light(explicit light light);
+light light(pen diffuse=<default>, pen ambient=<default>, pen specular=<default>, pen background=<default>, real specularfactor=<default> ... triple[] position);
 real remainder(real x, real y);
 int choose(int n, int k);
 real hypot(real x, real y);
@@ -615,8 +615,8 @@
 void clear(string file, string text);
 void unfill(frame f, path[] g, bool copy=<default>);
 void unfill(picture pic=<default>, path[] g, bool copy=<default>);
+bool Bar(picture, path, pen, marginT(path, pen))(real size=<default>);
 bool Bar(picture, path, pen, marginT(path, pen));
-bool Bar(picture, path, pen, marginT(path, pen))(real size=<default>);
 bool eol(file f);
 bool eof(file f);
 pen paleyellow;
@@ -653,9 +653,9 @@
 void dot(picture pic=<default>, pair z, pen p=<default>, filltype filltype=<default>);
 void dot(frame f, pair z, pen p=<default>, filltype filltype=<default>);
 void dot(picture pic=<default>, Label L, pen p=<default>, filltype filltype=<default>);
-marker dot;
 void dot(picture pic=<default>, Label[] L=<default>, pair[] z, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
 void dot(picture pic=<default>, path[] g, pen p=<default>, filltype filltype=<default>);
+marker dot;
 void dot(picture pic=<default>, Label L, pair z, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
 pair ESE;
 pair project(triple v, real[][] t);
@@ -678,9 +678,8 @@
 pen[][] sequence(pen[] f(int), int n);
 coord[] sequence(coord f(int), int n);
 coord[] sequence(coord f(int), int n);
-object[] sequence(object f(int), int n);
-marker[] sequence(marker f(int), int n);
-Legend[] sequence(Legend f(int), int n);
+Label[] sequence(Label f(int), int n);
+picture[] sequence(picture f(int), int n);
 int[] sequence(int f(int), int n);
 string[][] sequence(string[] f(int), int n);
 pair[] sequence(pair f(int), int n);
@@ -691,8 +690,9 @@
 string[] sequence(string f(int), int n);
 pair[][] sequence(pair[] f(int), int n);
 bool3[] sequence(bool3 f(int), int n);
-Label[] sequence(Label f(int), int n);
-picture[] sequence(picture f(int), int n);
+object[] sequence(object f(int), int n);
+marker[] sequence(marker f(int), int n);
+Legend[] sequence(Legend f(int), int n);
 real[][] sequence(real[] f(int), int n);
 real[] sequence(real f(int), int n);
 int[] sequence(int n, int m);
@@ -748,21 +748,21 @@
 void draw(frame f, triple[][] p, real[] uknot, real[] vknot, real[][] weights=<default>, pen[] p, real opacity, real shininess, real prcshininess, pen[] colors);
 void draw(frame f, triple[] v, int[][] vi, triple[] n, int[][] ni, pen[] p, real opacity, real shininess, real prcshininess, pen[] c=<default>, int[][] ci=<default>);
 void draw(picture pic=<default>, path[] g, pen fillrule=<default>, pen[] p);
-object draw(picture pic=<default>, Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-void draw(frame f, explicit path[] g, pen p=<default>);
-void draw(frame f, path g, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen)));
+object draw(picture pic=<default>, Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), pair position, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
 void draw(picture pic=<default>, guide[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
 void draw(pair origin, picture pic=<default>, guide[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
+void draw(frame f, explicit path[] g, pen p=<default>);
 void draw(picture pic=<default>, explicit path[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
 void draw(pair origin, picture pic=<default>, explicit path[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
-object draw(picture pic=<default>, Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), pair position, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+object draw(picture pic=<default>, Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
 void draw(frame f, guide[] g, pen p=<default>);
-void draw(frame f, path g, pen p=<default>);
 void draw(picture pic=<default>, Label L=<default>, path g, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
 void draw(pair origin, picture pic=<default>, Label L=<default>, path g, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
+void draw(frame f, path g, pen p=<default>);
+void draw(frame f, path g, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen)));
 void deconstruct(frame f, frame preamble=<default>, transform t=<default>);
 void deconstruct(picture pic=<default>);
-void shipout3(string prefix, frame f, string format=<default>, real width, real height, real angle, real zoom, triple m, triple m, pair shift, real[][] t, real[] background, triple[] lights, real[][] diffuse, real[][] ambient, real[][] specular, bool viewportlighting, bool view=<default>);
+void shipout3(string prefix, frame f, string format=<default>, real width, real height, real angle, real zoom, triple m, triple m, pair shift, real[][] t, real[] background, triple[] lights, real[][] diffuse, real[][] ambient, real[][] specular, bool view=<default>);
 void shipout3(string prefix, frame f);
 int CTZ(int a);
 void _shipout(string prefix=<default>, frame f, frame preamble=<default>, string format=<default>, bool wait=<default>, bool view=<default>, transform t=<default>);
@@ -787,27 +787,27 @@
 real braceouterangle;
 void tex(frame f, string s);
 void tex(frame f, string s, pair min, pair max);
+void tex(picture pic=<default>, string s, pair min, pair max);
 void tex(picture pic=<default>, string s);
-void tex(picture pic=<default>, string s, pair min, pair max);
 void prepend(frame dest, frame src);
 void add(frame dest, frame src);
+void add(picture dest=<default>, frame src, pair position, pair align, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(frame dest, frame src, pair position, pair align, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(picture src, bool group=<default>, filltype filltype=<default>, bool above=<default>);
 void add(picture pic=<default>, void d(frame f, transform t), bool exact=<default>);
+void add(picture pic=<default>, void d(picture, real[][]), bool exact=<default>);
+void add(frame f, transform t=<default>, Label L);
+void add(picture dest, picture src, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(picture dest, picture src, pair position, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(picture dest=<default>, object F, pair position=<default>, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(picture pic=<default>, Label L);
 void add(frame dest, frame src, filltype filltype, bool above=<default>);
 void add(frame dest, frame src, bool group, filltype filltype=<default>, bool above=<default>);
 void add(picture pic=<default>, void d(frame f, real[][] t, picture pic, projection P), bool exact=<default>);
-void add(picture pic=<default>, void d(picture, real[][]), bool exact=<default>);
 void add(frame dest, frame src, pair position, bool group=<default>, filltype filltype=<default>, bool above=<default>);
 void add(picture dest=<default>, frame src, pair position=<default>, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(picture pic=<default>, void d(picture, transform), bool exact=<default>);
 void add(picture src, pair position, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(picture dest=<default>, frame src, pair position, pair align, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(frame dest, frame src, pair position, pair align, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(picture src, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(picture pic=<default>, Label L);
-void add(picture pic=<default>, void d(picture, transform), bool exact=<default>);
-void add(picture dest, picture src, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(frame f, transform t=<default>, Label L);
-void add(picture dest, picture src, pair position, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(picture dest=<default>, object F, pair position=<default>, bool group=<default>, filltype filltype=<default>, bool above=<default>);
 void endgroup3(frame f);
 void _begingroup3(frame f, string name, real compression, real granularity, bool closed, bool tessellate, bool dobreak, bool nobreak, triple center, int interaction);
 void endgroup(frame f);
@@ -867,8 +867,8 @@
 bool IgnoreAspect;
 void postscript(frame f, string s);
 void postscript(frame f, string s, pair min, pair max);
+void postscript(picture pic=<default>, string s, pair min, pair max);
 void postscript(picture pic=<default>, string s);
-void postscript(picture pic=<default>, string s, pair min, pair max);
 transform slant(real s);
 transform yscale(real y);
 transform inverse(transform t);
@@ -916,9 +916,9 @@
 int size(path p);
 int size(path[] p);
 int size(path3 p);
-void size(picture dest, picture src);
 pair size(picture pic, bool user=<default>);
 void size(picture pic=<default>, transform t);
+void size(picture dest, picture src);
 void size(picture pic=<default>, real x, real y=<default>, bool keepAspect=<default>);
 void size(picture pic=<default>, real xsize, real ysize, pair min, pair max);
 string texify(string s);
@@ -1043,61 +1043,61 @@
 string VERSION;
 bool alias(pair[][] a, pair[][] b);
 bool alias(guide[] a, guide[] b);
+bool alias(marginT a, marginT b);
 bool alias(coord[] a, coord[] b);
 bool alias(coord[] a, coord[] b);
-bool alias(light a, light b);
-bool alias(autoscaleT a, autoscaleT b);
-bool alias(align a, align b);
-bool alias(Legend[] a, Legend[] b);
+bool alias(node a, node b);
+bool alias(Label a, Label b);
+bool alias(picture[] a, picture[] b);
 bool alias(pair[] a, pair[] b);
 bool alias(scaling a, scaling b);
 bool alias(scaling a, scaling b);
 bool alias(bounds a, bounds b);
-bool alias(node a, node b);
-bool alias(Label a, Label b);
-bool alias(processtime a, processtime b);
+bool alias(transformation a, transformation b);
+bool alias(marker a, marker b);
+bool alias(Legend[] a, Legend[] b);
 bool alias(int[] a, int[] b);
 bool alias(string[][] a, string[][] b);
-bool alias(filltype a, filltype b);
-bool alias(coords3 a, coords3 b);
-bool alias(object[] a, object[] b);
-bool alias(marker a, marker b);
+bool alias(slice a, slice b);
+bool alias(projection a, projection b);
+bool alias(ScaleT a, ScaleT b);
+bool alias(side a, side b);
 bool alias(cputime a, cputime b);
 bool alias(real[][] a, real[][] b);
 bool alias(bool3 a, bool3 b);
 bool alias(bool3[] a, bool3[] b);
-bool alias(ScaleT a, ScaleT b);
-bool alias(side a, side b);
-bool alias(arrowhead a, arrowhead b);
+bool alias(autoscaleT a, autoscaleT b);
+bool alias(pairOrTriple a, pairOrTriple b);
+bool alias(object a, object b);
+bool alias(object[] a, object[] b);
 bool alias(string[] a, string[] b);
 bool alias(frame[] a, frame[] b);
-bool alias(hsv a, hsv b);
 bool alias(coords2 a, coords2 b);
 bool alias(coords2 a, coords2 b);
-bool alias(transformation a, transformation b);
-bool alias(pairOrTriple a, pairOrTriple b);
-bool alias(object a, object b);
-bool alias(marker[] a, marker[] b);
+bool alias(light a, light b);
+bool alias(coords3 a, coords3 b);
+bool alias(arrowhead a, arrowhead b);
 bool alias(bool[] a, bool[] b);
 bool alias(void()()[] a, void()()[] b);
 bool alias(pen[][] a, pen[][] b);
-bool alias(marginT a, marginT b);
+bool alias(filltype a, filltype b);
 bool alias(simplex a, simplex b);
-bool alias(scaleT a, scaleT b);
-bool alias(Label[] a, Label[] b);
+bool alias(Legend a, Legend b);
+bool alias(position a, position b);
+bool alias(marker[] a, marker[] b);
 bool alias(path[] a, path[] b);
 bool alias(triple[] a, triple[] b);
 bool alias(coord a, coord b);
 bool alias(coord a, coord b);
-bool alias(Legend a, Legend b);
-bool alias(position a, position b);
+bool alias(picture a, picture b);
+bool alias(Label[] a, Label[] b);
 bool alias(real[] a, real[] b);
 bool alias(pen[] a, pen[] b);
-bool alias(slice a, slice b);
+bool alias(hsv a, hsv b);
 bool alias(freezableBounds a, freezableBounds b);
-bool alias(projection a, projection b);
-bool alias(picture a, picture b);
-bool alias(picture[] a, picture[] b);
+bool alias(scaleT a, scaleT b);
+bool alias(align a, align b);
+bool alias(processtime a, processtime b);
 real pi;
 int randMax;
 pen heavycyan;
@@ -1108,7 +1108,7 @@
 pair NE;
 real realMin;
 real realMax;
-simplex simplex(real[] c, real[][] A, real[] b, bool phase1=<default>);
+simplex simplex(real[] c, real[][] A, real[] b, bool phase1=<default>, bool dual=<default>);
 simplex simplex(real[] c, real[][] A, int[] s, real[] b);
 simplex simplex;
 real nan;
@@ -1121,27 +1121,27 @@
 real[] map(real f(pair), pair[] a);
 int[] map(int f(real), real[] a);
 bool3[] map(bool3 f(bool3), bool3[] a);
+object[] map(object f(object), object[] a);
 frame[] map(frame f(frame), frame[] a);
 coord[] map(coord f(coord), coord[] a);
 coord[] map(coord f(coord), coord[] a);
-Legend[] map(Legend f(Legend), Legend[] a);
+picture[] map(picture f(picture), picture[] a);
 pen[][] map(pen[] f(pen[]), pen[][] a);
 triple[] map(triple f(triple), triple[] a);
 pen[] map(pen f(pen), pen[] a);
-Label[] map(Label f(Label), Label[] a);
+marker[] map(marker f(marker), marker[] a);
 pair[] map(pair f(pair), pair[] a);
-object[] map(object f(object), object[] a);
 string[] map(string f(string), string[] a);
-picture[] map(picture f(picture), picture[] a);
 void()()[] map(void f()()(void()()), void()()[] a);
 pair[][] map(pair[] f(pair[]), pair[][] a);
 real[] map(real f(real), real[] a);
-marker[] map(marker f(marker), marker[] a);
 int[] map(int f(int), int[] a);
 string[][] map(string[] f(string[]), string[][] a);
+Legend[] map(Legend f(Legend), Legend[] a);
 bool[] map(bool f(bool), bool[] a);
 path[] map(path f(path), path[] a);
 real[][] map(real[] f(real[]), real[][] a);
+Label[] map(Label f(Label), Label[] a);
 guide[] map(guide f(guide), guide[] a);
 real identity(real x);
 real[] identity(real[] a);
@@ -1257,24 +1257,24 @@
 int search(real[] a, real key);
 int search(string[] a, string key);
 int search(void()()[] a, void key()(), bool less(void()(), void()()));
-int search(picture[] a, picture key, bool less(picture, picture));
 int search(real[] a, real key, bool less(real, real));
 int search(guide[] a, guide key, bool less(guide, guide));
-int search(object[] a, object key, bool less(object, object));
 int search(pair[] a, pair key, bool less(pair, pair));
-int search(Label[] a, Label key, bool less(Label, Label));
+int search(marker[] a, marker key, bool less(marker, marker));
 int search(frame[] a, frame key, bool less(frame, frame));
 int search(coord[] a, coord key, bool less(coord, coord));
 int search(coord[] a, coord key, bool less(coord, coord));
-int search(Legend[] a, Legend key, bool less(Legend, Legend));
+int search(picture[] a, picture key, bool less(picture, picture));
 int search(int[] a, int key, bool less(int, int));
 int search(bool3[] a, bool3 key, bool less(bool3, bool3));
+int search(object[] a, object key, bool less(object, object));
+int search(Label[] a, Label key, bool less(Label, Label));
 int search(string[] a, string key, bool less(string, string));
 int search(path[] a, path key, bool less(path, path));
 int search(pen[] a, pen key, bool less(pen, pen));
+int search(Legend[] a, Legend key, bool less(Legend, Legend));
 int search(bool[] a, bool key, bool less(bool, bool));
 int search(triple[] a, triple key, bool less(triple, triple));
-int search(marker[] a, marker key, bool less(marker, marker));
 int[] sort(int[] a);
 int[][] sort(int[][] a);
 real[] sort(real[] a);
@@ -1283,9 +1283,8 @@
 string[][] sort(string[][] a);
 coord[] sort(coord[] a, bool less(coord, coord), bool stable=<default>);
 coord[] sort(coord[] a, bool less(coord, coord), bool stable=<default>);
-object[] sort(object[] a, bool less(object, object), bool stable=<default>);
-marker[] sort(marker[] a, bool less(marker, marker), bool stable=<default>);
-Legend[] sort(Legend[] a, bool less(Legend, Legend), bool stable=<default>);
+Label[] sort(Label[] a, bool less(Label, Label), bool stable=<default>);
+picture[] sort(picture[] a, bool less(picture, picture), bool stable=<default>);
 path[] sort(path[] a, bool less(path, path), bool stable=<default>);
 pen[][] sort(pen[][] a, bool less(pen[], pen[]), bool stable=<default>);
 pair[][] sort(pair[][] a, bool less(pair[], pair[]), bool stable=<default>);
@@ -1294,8 +1293,9 @@
 void()()[] sort(void()()[] a, bool less(void()(), void()()), bool stable=<default>);
 frame[] sort(frame[] a, bool less(frame, frame), bool stable=<default>);
 bool3[] sort(bool3[] a, bool less(bool3, bool3), bool stable=<default>);
-Label[] sort(Label[] a, bool less(Label, Label), bool stable=<default>);
-picture[] sort(picture[] a, bool less(picture, picture), bool stable=<default>);
+object[] sort(object[] a, bool less(object, object), bool stable=<default>);
+marker[] sort(marker[] a, bool less(marker, marker), bool stable=<default>);
+Legend[] sort(Legend[] a, bool less(Legend, Legend), bool stable=<default>);
 int[] sort(int[] a, bool less(int, int), bool stable=<default>);
 string[][] sort(string[][] a, bool less(string[], string[]), bool stable=<default>);
 real[] sort(real[] a, bool less(real, real), bool stable=<default>);
@@ -1334,10 +1334,10 @@
 pair max(explicit path p);
 pair max(path[] p);
 triple max(path3 p);
+pair max(picture pic, bool user=<default>);
 real max(real M, scaling s, coord[] c);
 real max(real M, scaling s, coord[] c);
 int max(... int[] a);
-pair max(picture pic, bool user=<default>);
 real max(... real[] a);
 void restore();
 pen basealign(int n);
@@ -1369,8 +1369,8 @@
 pair min(explicit path p);
 pair min(path[] p);
 triple min(path3 p);
+real min(... real[] a);
 pair min(picture pic, bool user=<default>);
-real min(... real[] a);
 real min(real m, scaling s, coord[] c);
 real min(real m, scaling s, coord[] c);
 int min(... int[] a);
@@ -1440,9 +1440,8 @@
 pen[] copy(pen[] a, int depth=<default>);
 coord[] copy(coord[] a, int depth=<default>);
 coord[] copy(coord[] a, int depth=<default>);
-object[] copy(object[] a, int depth=<default>);
-marker[] copy(marker[] a, int depth=<default>);
-Legend[] copy(Legend[] a, int depth=<default>);
+Label[] copy(Label[] a, int depth=<default>);
+picture[] copy(picture[] a, int depth=<default>);
 pen[][] copy(pen[][] a, int depth=<default>);
 path[] copy(path[] a, int depth=<default>);
 string[] copy(string[] a, int depth=<default>);
@@ -1452,8 +1451,9 @@
 frame[] copy(frame[] a, int depth=<default>);
 pair[] copy(pair[] a, int depth=<default>);
 bool3[] copy(bool3[] a, int depth=<default>);
-Label[] copy(Label[] a, int depth=<default>);
-picture[] copy(picture[] a, int depth=<default>);
+object[] copy(object[] a, int depth=<default>);
+marker[] copy(marker[] a, int depth=<default>);
+Legend[] copy(Legend[] a, int depth=<default>);
 pair[][] copy(pair[][] a, int depth=<default>);
 real[] abs(pair[] a);
 real[] abs(triple[] a);
@@ -1539,15 +1539,15 @@
 triple operator *(real x, triple v);
 triple operator *(triple v, real x);
 path3 operator *(real[][] t, path3 g);
+picture operator *(real[][] t, picture orig);
 side operator *(real x, side s);
 Label operator *(real[][] t, Label L);
+path[] operator *(transform t, explicit path[] p);
+bounds operator *(transform t, bounds b);
+pair[] operator *(transform t, pair[] z);
 picture operator *(transform t, picture orig);
 object operator *(transform t, explicit object F);
-path[] operator *(transform t, explicit path[] p);
-bounds operator *(transform t, bounds b);
 Label operator *(transform t, Label L);
-pair[] operator *(transform t, pair[] z);
-picture operator *(real[][] t, picture orig);
 real latitude(triple v, bool warn=<default>);
 int sum(int[] a);
 real sum(real[] a);
@@ -1626,13 +1626,13 @@
 void write(file file=<default>, string s=<default>, pen[] p);
 void write(void suffix(file)=<default>);
 void write(file file, string s=<default>, explicit path[] x, void suffix(file)=<default>);
-void write(file file=<default>, align align, void suffix(file)=<default>);
-void write(pairOrTriple a);
+void write(file file=<default>, Label L, void suffix(file)=<default>);
 void write(file file, string s=<default>, cputime c, string format=<default>, void suffix(file)=<default>);
 void write(string s=<default>, bool3 b, void suffix(file)=<default>);
 void write(file file, string s=<default>, bool3 b, void suffix(file)=<default>);
+void write(pairOrTriple a);
 void write(string s=<default>, explicit guide[] x, void suffix(file)=<default>);
-void write(file file=<default>, Label L, void suffix(file)=<default>);
+void write(file file=<default>, align align, void suffix(file)=<default>);
 bool operator !=(bool a, bool b);
 bool[] operator !=(bool a, bool[] b);
 bool[] operator !=(bool[] a, bool b);
@@ -1670,40 +1670,40 @@
 bool operator !=(path a, path b);
 bool operator !=(path3 a, path3 b);
 bool operator !=(bool3 a, bool3 b);
-bool operator !=(ScaleT a, ScaleT b);
-bool operator !=(side a, side b);
-bool operator !=(arrowhead a, arrowhead b);
-bool operator !=(hsv a, hsv b);
+bool operator !=(autoscaleT a, autoscaleT b);
+bool operator !=(pairOrTriple a, pairOrTriple b);
+bool operator !=(object a, object b);
 bool operator !=(coords2 a, coords2 b);
 bool operator !=(coords2 a, coords2 b);
-bool operator !=(transformation a, transformation b);
-bool operator !=(pairOrTriple a, pairOrTriple b);
-bool operator !=(object a, object b);
-bool operator !=(marginT a, marginT b);
+bool operator !=(light a, light b);
+bool operator !=(coords3 a, coords3 b);
+bool operator !=(arrowhead a, arrowhead b);
+bool operator !=(filltype a, filltype b);
 bool operator !=(simplex a, simplex b);
-bool operator !=(scaleT a, scaleT b);
+bool operator !=(Legend a, Legend b);
+bool operator !=(position a, position b);
 bool operator !=(coord a, coord b);
 bool operator !=(coord a, coord b);
-bool operator !=(Legend a, Legend b);
-bool operator !=(position a, position b);
-bool operator !=(slice a, slice b);
+bool operator !=(picture a, picture b);
+bool operator !=(hsv a, hsv b);
 bool operator !=(freezableBounds a, freezableBounds b);
-bool operator !=(projection a, projection b);
-bool operator !=(picture a, picture b);
+bool operator !=(scaleT a, scaleT b);
+bool operator !=(align a, align b);
+bool operator !=(processtime a, processtime b);
 bool operator !=(bool3 a, bool b);
-bool operator !=(light a, light b);
-bool operator !=(autoscaleT a, autoscaleT b);
-bool operator !=(align a, align b);
+bool operator !=(marginT a, marginT b);
+bool operator !=(node a, node b);
+bool operator !=(Label a, Label b);
 bool operator !=(scaling a, scaling b);
 bool operator !=(scaling a, scaling b);
 bool operator !=(bounds a, bounds b);
-bool operator !=(node a, node b);
-bool operator !=(Label a, Label b);
-bool operator !=(processtime a, processtime b);
+bool operator !=(transformation a, transformation b);
+bool operator !=(marker a, marker b);
 bool operator !=(bool a, bool3 b);
-bool operator !=(filltype a, filltype b);
-bool operator !=(coords3 a, coords3 b);
-bool operator !=(marker a, marker b);
+bool operator !=(slice a, slice b);
+bool operator !=(projection a, projection b);
+bool operator !=(ScaleT a, ScaleT b);
+bool operator !=(side a, side b);
 bool operator !=(cputime a, cputime b);
 bool operator ==(bool a, bool b);
 bool[] operator ==(bool a, bool[] b);
@@ -1742,40 +1742,40 @@
 bool operator ==(path a, path b);
 bool operator ==(path3 a, path3 b);
 bool operator ==(bool3 a, bool3 b);
-bool operator ==(ScaleT a, ScaleT b);
-bool operator ==(side a, side b);
-bool operator ==(arrowhead a, arrowhead b);
-bool operator ==(hsv a, hsv b);
+bool operator ==(autoscaleT a, autoscaleT b);
+bool operator ==(pairOrTriple a, pairOrTriple b);
+bool operator ==(object a, object b);
 bool operator ==(coords2 a, coords2 b);
 bool operator ==(coords2 a, coords2 b);
-bool operator ==(transformation a, transformation b);
-bool operator ==(pairOrTriple a, pairOrTriple b);
-bool operator ==(object a, object b);
-bool operator ==(marginT a, marginT b);
+bool operator ==(light a, light b);
+bool operator ==(coords3 a, coords3 b);
+bool operator ==(arrowhead a, arrowhead b);
+bool operator ==(filltype a, filltype b);
 bool operator ==(simplex a, simplex b);
-bool operator ==(scaleT a, scaleT b);
+bool operator ==(Legend a, Legend b);
+bool operator ==(position a, position b);
 bool operator ==(coord a, coord b);
 bool operator ==(coord a, coord b);
-bool operator ==(Legend a, Legend b);
-bool operator ==(position a, position b);
-bool operator ==(slice a, slice b);
+bool operator ==(picture a, picture b);
+bool operator ==(hsv a, hsv b);
 bool operator ==(freezableBounds a, freezableBounds b);
-bool operator ==(projection a, projection b);
-bool operator ==(picture a, picture b);
+bool operator ==(scaleT a, scaleT b);
+bool operator ==(align a, align b);
+bool operator ==(processtime a, processtime b);
 bool operator ==(bool3 a, bool b);
-bool operator ==(light a, light b);
-bool operator ==(autoscaleT a, autoscaleT b);
-bool operator ==(align a, align b);
+bool operator ==(marginT a, marginT b);
+bool operator ==(node a, node b);
+bool operator ==(Label a, Label b);
 bool operator ==(scaling a, scaling b);
 bool operator ==(scaling a, scaling b);
 bool operator ==(bounds a, bounds b);
-bool operator ==(node a, node b);
-bool operator ==(Label a, Label b);
-bool operator ==(processtime a, processtime b);
+bool operator ==(transformation a, transformation b);
+bool operator ==(marker a, marker b);
 bool operator ==(bool a, bool3 b);
-bool operator ==(filltype a, filltype b);
-bool operator ==(coords3 a, coords3 b);
-bool operator ==(marker a, marker b);
+bool operator ==(slice a, slice b);
+bool operator ==(projection a, projection b);
+bool operator ==(ScaleT a, ScaleT b);
+bool operator ==(side a, side b);
 bool operator ==(cputime a, cputime b);
 bool operator ^(bool a, bool b);
 bool[] operator ^(bool a, bool[] b);
@@ -1846,10 +1846,10 @@
 pen operator +(pen a, pen b);
 transform operator +(transform a, transform b);
 pen operator +(pen p, real w);
-marginT operator +(path, pen)(marginT ma(path, pen), marginT mb(path, pen));
 pen[] operator +(pen a, pen[] b);
 pen operator +(real w, pen p);
 string operator +(... string[] a);
+marginT operator +(path, pen)(marginT ma(path, pen), marginT mb(path, pen));
 pen[] operator +(pen[] a, pen b);
 real operator cast(int);
 pair operator cast(int);
@@ -1892,33 +1892,33 @@
 guide operator cast(cycleToken tok);
 guide operator cast(curlSpecifier spec);
 guide operator cast(tensionSpecifier t);
-align operator cast(side side);
+object operator cast(Label L);
+Label operator cast(object F);
 guide[] operator cast(path[] g);
-pair operator cast(pairOrTriple a);
-triple operator cast(pairOrTriple a);
-pen operator cast(hsv hsv);
-frame operator cast(object F);
+hsv operator cast(pen p);
 bool3[] operator cast(bool[] b);
-hsv operator cast(pen p);
-position operator cast(pair x);
-object operator cast(Label L);
-Label operator cast(object F);
-pair operator cast(position P);
-object operator cast(frame f);
+position operator cast(int x);
+object operator cast(string s);
+position operator cast(real x);
+Label operator cast(string s);
 guide[] operator cast(pair[] z);
 path[] operator cast(guide[] g);
 bool operator cast(bool3 b);
-align operator cast(pair dir);
+pair operator cast(pairOrTriple a);
+triple operator cast(pairOrTriple a);
+frame operator cast(object F);
 path[] operator cast(guide g);
+position operator cast(pair x);
 path[] operator cast(pair[] z);
-align operator cast(triple dir);
 path[] operator cast(path p);
+pair operator cast(position P);
 bool[] operator cast(bool3[] b);
+object operator cast(frame f);
+align operator cast(side side);
 bool3 operator cast(bool b);
-position operator cast(int x);
-object operator cast(string s);
-position operator cast(real x);
-Label operator cast(string s);
+align operator cast(pair dir);
+pen operator cast(hsv hsv);
+align operator cast(triple dir);
 pen deepred;
 bool error(file f);
 string operator ecast(int);
@@ -1946,44 +1946,44 @@
 pen operator init();
 frame operator init();
 file operator init();
-light operator init();
-autoscaleT operator init();
-align operator init();
 marginT operator init();
+node operator init();
+Label operator init();
+filltype operator init();
 simplex operator init();
-scaleT operator init();
-filltype operator init();
-coords3 operator init();
-marker operator init();
-cputime operator init();
+Legend operator init();
+position operator init();
 slice operator init();
 projection operator init();
-picture operator init();
+ScaleT operator init();
+side operator init();
+cputime operator init();
 hsv operator init();
+scaleT operator init();
+align operator init();
+processtime operator init();
 coords2 operator init();
 coords2 operator init();
-transformation operator init();
-pairOrTriple operator init();
-object operator init();
+light operator init();
+coords3 operator init();
+arrowhead operator init();
 scaling operator init();
 scaling operator init();
 bounds operator init();
-node operator init();
-Label operator init();
-processtime operator init();
+transformation operator init();
+marker operator init();
 coord operator init();
 coord operator init();
-Legend operator init();
-position operator init();
+picture operator init();
 bool3 operator init();
-ScaleT operator init();
-side operator init();
-arrowhead operator init();
+autoscaleT operator init();
+pairOrTriple operator init();
+object operator init();
 sCAD operator init();
 frame NoBox(frame f);
 real animationdelay;
+frame BBox(frame)(real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>);
 animation operator init();
-frame BBox(frame)(real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>);
 void annotate(picture pic=<default>, string title, string text, pair position);
 void babel(string s);
 path[] bezulate(path[] p);
@@ -2005,18 +2005,20 @@
 key key(int n, bool active=<default>);
 real minDistDefault;
 real nodeMarginDefault;
+object draw(picture pic=<default>, binarytreeNode node, pair pos, int height, real minDist, real levelDist, real nodeDiameter, pen p=<default>, bool condensed=<default>);
+void draw(picture pic=<default>, binarytree tree, real minDist=<default>, real nodeMargin=<default>, pen p=<default>, bool condensed=<default>);
+key operator cast(int n);
+int operator cast(key k);
+int[] operator cast(key[] k);
+binarytreeNode binarytreeNode(int key);
 binarytreeNode operator init();
 key operator init();
 binarytree operator init();
-binarytreeNode binarytreeNode(int key);
-key operator cast(int n);
-int operator cast(key k);
-int[] operator cast(key[] k);
-object draw(picture pic=<default>, binarytreeNode node, pair pos, int height, real minDist, real levelDist, real nodeDiameter, pen p=<default>, bool condensed=<default>);
-void draw(picture pic=<default>, binarytree tree, real minDist=<default>, real nodeMargin=<default>, pen p=<default>, bool condensed=<default>);
 binarytree searchtree(... int[] keys);
 real epsilon;
 void add(picture pic=<default>, face[] faces, projection P=<default>);
+picture operator cast(face f);
+face operator cast(path3 p);
 line intersection(face a, face b);
 face operator init();
 line operator init();
@@ -2023,8 +2025,6 @@
 half operator init();
 splitface operator init();
 bsp operator init();
-picture operator cast(face f);
-face operator cast(path3 p);
 splitface split(face a, face cut, projection P);
 void addseg(pair[][] gds, segment seg);
 pen[] extend(pen[] palette, pen below, pen above);
@@ -2033,16 +2033,16 @@
 segment case3(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge=<default>);
 segment case1(pair p0, pair p1, int edge);
 real eps;
+segment checktriangle(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge=<default>);
+segment case2(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge);
 guide[][] contour(pair[][] z, real[][] f, real[][] midpoint=<default>, real[] c, guide join(... guide[])=<default>);
 guide[][] contour(real[][] f, real[][] midpoint=<default>, pair a, pair b, real[] c, guide join(... guide[])=<default>);
 guide[][] contour(real f(real, real), pair a, pair b, real[] c, int nx=<default>, int ny=<default>, guide join(... guide[])=<default>);
 guide[][] contour(real f(pair), pair a, pair b, real[] c, int nx=<default>, int ny=<default>, guide join(... guide[])=<default>);
 guide[][] contour(pair[] z, real[] f, real[] c, guide join(... guide[])=<default>);
-segment checktriangle(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge=<default>);
-segment case2(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge);
+segment operator init();
 void draw(picture pic=<default>, Label[] L=<default>, guide[][] g, pen[] p);
 void draw(picture pic=<default>, Label[] L=<default>, guide[][] g, pen p=<default>);
-segment operator init();
 pen[][] interior(picture pic=<default>, guide[][] g, pen[] palette);
 void fill(picture pic=<default>, guide[][] g, pen[][] palette);
 vertex[][] contour3(triple[][][] v, real[][][] f, real[][][] midpoint=<default>, projection P=<default>);
@@ -2056,10 +2056,10 @@
 real eps;
 real treeMinNodeWidth;
 real treeNodeStep;
+void add(TreeNode child, TreeNode parent);
 TreeNode operator init();
 TreeNode makeNode(TreeNode parent=<default>, frame f);
 TreeNode makeNode(TreeNode parent=<default>, Label label);
-void add(TreeNode child, TreeNode parent);
 real treeLevelStep;
 void draw(TreeNode root, pair pos);
 void drawAll(TreeNode node, frame f);
@@ -2070,7 +2070,6 @@
 string link(string label, string text=<default>);
 string hyperlink(string url, string text);
 string embed(string name, string text=<default>, string options=<default>, real width=<default>, real height=<default>, string image=<default>);
-bool XYAlign;
 void drawMomArrow(picture pic=<default>, path p, align align, position pos=<default>, real offset=<default>, real length=<default>, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real margin=<default>);
 void drawVertexOX(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
 void drawVertexBoxO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
@@ -2094,24 +2093,26 @@
 real photonamplitude;
 real gluonamplitude;
 real photonratio;
+bool XYAlign;
 pen gluonpen;
 pen fermionpen;
 void drawVertexX(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
+real bigvertexsize;
 void drawVertexO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
-real momarrowfactor;
 real momarrowlength;
-void drawVertexTriangleO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
+void texshipout(string stem, picture pic=<default>, bool xalign=<default>);
 path photon(path p, real amp=<default>, real width=<default>);
-void texshipout(string stem, picture pic=<default>, bool xalign=<default>);
 void drawPhoton(picture pic=<default>, path p, real amp=<default>, real width=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
 path gluon(path p, real amp=<default>, real width=<default>);
 real momarrowsize(pen p=<default>);
-void fmdefaults();
+void drawVertexTriangleO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
 void drawFermion(picture pic=<default>, path p, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
+void do_overpaint(picture pic, path p, pen bgpen, real halfwidth, real vertexangle);
 bool appendsuffix;
+void fmdefaults();
+real momarrowfactor;
+pen vertexpen;
 path momArrowPath(path p, align align, position pos, real offset=<default>, real length=<default>);
-pen vertexpen;
-real bigvertexsize;
 real gluonratio;
 void drawGluon(picture pic=<default>, path p, real amp=<default>, real width=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
 pen backgroundpen;
@@ -2121,7 +2122,6 @@
 void drawScalar(picture pic=<default>, path p, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
 string includegraphicscommand;
 pen photonpen;
-void do_overpaint(picture pic, path p, pen bgpen, real halfwidth, real vertexangle);
 pen bigvertexpen;
 Dir Down;
 Dir Left;
@@ -2169,8 +2169,50 @@
 triangle extouch(side side);
 triangle pedal(triangle t, point M);
 line pedal(side side, point M);
-point isogonalconjugate(triangle t, point M);
+point isogonal(side side, point M);
+line isogonal(vertex V, point M);
+triangle isogonal(triangle t, point M);
 point isotomicconjugate(triangle t, point M);
+pair[] intersectionpoints(pair A, pair B, real a, real b, real c, real d, real f, real g);
+pair[] intersectionpoints(pair A, pair B, real[] equation);
+point[] intersectionpoints(line l, path g);
+point[] intersectionpoints(bqe bqe1, bqe bqe2);
+point[] intersectionpoints(triangle t, line l, bool extended=<default>);
+point[] intersectionpoints(line l, triangle t, bool extended=<default>);
+point[] intersectionpoints(line l, circle c);
+point[] intersectionpoints(circle c, line l);
+point[] intersectionpoints(line l, ellipse el);
+point[] intersectionpoints(ellipse el, line l);
+point[] intersectionpoints(line l, parabola p);
+point[] intersectionpoints(parabola p, line l);
+point[] intersectionpoints(line l, hyperbola h);
+point[] intersectionpoints(hyperbola h, line l);
+point[] intersectionpoints(line l, conic co);
+point[] intersectionpoints(conic co, line l);
+point[] intersectionpoints(conic co1, conic co2);
+point[] intersectionpoints(triangle t, conic co, bool extended=<default>);
+point[] intersectionpoints(conic co, triangle t, bool extended=<default>);
+point[] intersectionpoints(ellipse a, ellipse b);
+point[] intersectionpoints(ellipse a, circle b);
+point[] intersectionpoints(circle a, ellipse b);
+point[] intersectionpoints(ellipse a, parabola b);
+point[] intersectionpoints(parabola a, ellipse b);
+point[] intersectionpoints(ellipse a, hyperbola b);
+point[] intersectionpoints(hyperbola a, ellipse b);
+point[] intersectionpoints(circle a, parabola b);
+point[] intersectionpoints(parabola a, circle b);
+point[] intersectionpoints(circle a, hyperbola b);
+point[] intersectionpoints(hyperbola a, circle b);
+point[] intersectionpoints(parabola a, parabola b);
+point[] intersectionpoints(parabola a, hyperbola b);
+point[] intersectionpoints(hyperbola a, parabola b);
+point[] intersectionpoints(hyperbola a, hyperbola b);
+point[] intersectionpoints(circle c1, circle c2);
+point[] intersectionpoints(conic co, arc a);
+point[] intersectionpoints(arc a, conic co);
+point[] intersectionpoints(arc a1, arc a2);
+point[] intersectionpoints(line l, arc a);
+point[] intersectionpoints(arc a, line l);
 transform projection(point A, point B);
 transform projection(point A, point B, point C, point D, bool safe=<default>);
 transform projection(line l);
@@ -2220,18 +2262,17 @@
 abscissa angabscissa(parabola p, point M);
 abscissa angabscissa(explicit conic co, point M);
 abscissa angabscissa(arc a, point M);
-point arcsubtendedcenter(point A, point B, real angle);
+point centroid(point A, point B, point C);
+point centroid(triangle t);
 inversion inversion(real k, point C);
 inversion inversion(point C, real k);
 inversion inversion(circle c1, circle c2, real sgn=<default>);
 inversion inversion(circle c1, circle c2, circle c3);
 inversion inversion(circle c);
-real EPS;
-bqe canonical(bqe bqe);
+point arcsubtendedcenter(point A, point B, real angle);
+line altitude(vertex V);
+line altitude(side side);
 path compassmark(pair O, pair A, real position, real angle=<default>);
-triangle cevian(triangle t, point P);
-point cevian(side side, point P);
-line cevian(vertex V, point P);
 vector vector(coordsys R=<default>, pair v);
 vector vector(point M);
 path square(pair z1, pair z2);
@@ -2249,7 +2290,6 @@
 real arclength(parabola p, real angle1, real angle2);
 real arclength(parabola p);
 real arclength(arc a);
-point[] standardizecoordsys(coordsys R=<default>, bool warn=<default> ... point[] M);
 bool degenerate(conic c);
 bool degenerate(circle c);
 bool degenerate(ellipse el);
@@ -2259,8 +2299,8 @@
 void perpendicularmark(picture pic=<default>, point z, vector align, path g, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
 void perpendicularmark(picture pic=<default>, line l1, line l2, real size=<default>, pen p=<default>, int quarter=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
 void markrightangle(picture pic=<default>, point A, point O, point B, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+point ppoint(arc a, real x);
 line sector(int n=<default>, int p=<default>, line l1, line l2, real angle=<default>, bool sharp=<default>);
-point ppoint(arc a, real x);
 line hline(coordsys R=<default>);
 line hline;
 real binomial(real n, real k);
@@ -2298,36 +2338,28 @@
 transform scale(real k, point M);
 transform scale(real k, point A, point B, point C, point D, bool safe=<default>);
 transform scale(real k, line l1, line l2, bool safe=<default>);
-point angpoint(conic co, real angle);
-point angpoint(explicit circle c, real x);
-point angpoint(explicit ellipse el, real x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
-point angpoint(explicit parabola p, real x);
-point angpoint(explicit hyperbola h, real x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
-point angpoint(arc a, real angle);
-pen addpenline;
-pen addpenline(pen p);
+point relpoint(line l, real x);
+point relpoint(explicit circle c, real x);
+point relpoint(explicit ellipse el, real x);
+point relpoint(explicit parabola p, real x);
+point relpoint(explicit hyperbola h, real x);
+point relpoint(explicit conic co, explicit real x);
+point relpoint(explicit conic co, explicit int x);
+point relpoint(arc a, real x);
+bool collinear(vector u, vector v);
+string conictype(bqe bqe);
 bool operator ==(coordsys c1, coordsys c2);
 bool operator ==(explicit point M, explicit point N);
 bool operator ==(explicit vector u, explicit vector v);
 bool operator ==(line l1, line l2);
+mass masscenter(... mass[] M);
 triangle triangleAbc(real alpha, real b, real c, real angle=<default>, point A=<default>);
 vector unit(point M);
 vector unit(vector u);
 transform reflect(line l);
 transform reflect(line l1, line l2, bool safe=<default>);
-real sharpdegrees(line l1, line l2);
-int ellipsenodesnumberfactor;
-line tangent(circle c, abscissa x);
-line tangent(circle c, point M);
-line tangent(circle c, explicit vector v);
-line tangent(ellipse el, abscissa x);
-line tangent(parabola p, abscissa x);
-line tangent(hyperbola h, abscissa x);
-line tangent(explicit arc a, abscissa x);
-line tangent(explicit arc a, point M);
-mass masscenter(... mass[] M);
-circle incircle(point A, point B, point C);
-circle incircle(triangle t);
+real EPS;
+bqe canonical(bqe bqe);
 real degrees(explicit point M, coordsys R=<default>, bool warn=<default>);
 real degrees(vector v, coordsys R=<default>, bool warn=<default>);
 real degrees(line l, coordsys R=<default>);
@@ -2335,9 +2367,17 @@
 real degrees(arc a);
 point foot(vertex V);
 point foot(side side);
+ellipse ellipse(point F1, point F2, real a);
+ellipse ellipse(point F1, point F2, point M);
+ellipse ellipse(point C, real a, real b, real angle=<default>);
+ellipse ellipse(bqe bqe);
+ellipse ellipse(point M1, point M2, point M3, point M4, point M5);
 point[] fermat(triangle t);
 point excenter(point A, point B, point C);
 point excenter(side side);
+bool operator !=(explicit point M, explicit point N);
+bool operator !=(line l1, line l2);
+arc arcsubtended(point A, point B, real angle);
 triangle incentral(triangle t);
 point origin;
 point origin(coordsys R=<default>);
@@ -2345,48 +2385,7 @@
 void write(explicit line l);
 void write(explicit segment s);
 void write(trilinear tri);
-point midpoint(segment s);
-point midpoint(side side);
-point relpoint(line l, real x);
-point relpoint(explicit circle c, real x);
-point relpoint(explicit ellipse el, real x);
-point relpoint(explicit parabola p, real x);
-point relpoint(explicit hyperbola h, real x);
-point relpoint(explicit conic co, explicit real x);
-point relpoint(explicit conic co, explicit int x);
-point relpoint(arc a, real x);
-bool collinear(vector u, vector v);
-point curpoint(line l, real x);
-point curpoint(explicit circle c, real x);
-point curpoint(explicit ellipse el, real x);
-point curpoint(explicit parabola p, real x);
-point curpoint(conic co, real x);
-point curpoint(arc a, real x);
-int parabolanodesnumber(parabola p, real angle1, real angle2);
-line complementary(explicit line l);
-line[] complementary(explicit segment s);
-arc complementary(arc a);
-pair coordinates(point M);
-string defaultmassformat;
-int circlenodesnumberfactor;
-coordsys operator init();
-point operator init();
-vector operator init();
-line operator init();
-segment operator init();
-bqe operator init();
-conic operator init();
-circle operator init();
-ellipse operator init();
-parabola operator init();
-hyperbola operator init();
-abscissa operator init();
-arc operator init();
-mass operator init();
-triangle operator init();
-trilinear operator init();
-inversion operator init();
-triangle triangle(line l1, line l2, line l3);
+int ellipsenodesnumberfactor;
 pair operator cast(point P);
 pair[] operator cast(point[] P);
 point operator cast(pair p);
@@ -2432,61 +2431,46 @@
 point operator cast(trilinear tri);
 circle operator cast(inversion i);
 inversion operator cast(circle c);
-bool inside(ellipse el, point M);
-bool inside(parabola p, point M);
-transform vprojection(line l, bool safe=<default>);
-string conictype(bqe bqe);
-circle circumcircle(point A, point B, point C);
-circle circumcircle(triangle t);
-pen addpenarc;
-pen addpenarc(pen p);
-line reverse(line l);
-arc reverse(arc a);
-line vline(coordsys R=<default>);
-line vline;
-real[] intersect(path g, explicit pair p, real fuzz=<default>);
-real[] intersect(path g, explicit point P, real fuzz=<default>);
-pair[] intersectionpoints(pair A, pair B, real a, real b, real c, real d, real f, real g);
-pair[] intersectionpoints(pair A, pair B, real[] equation);
-point[] intersectionpoints(line l, path g);
-point[] intersectionpoints(bqe bqe1, bqe bqe2);
-point[] intersectionpoints(triangle t, line l, bool extended=<default>);
-point[] intersectionpoints(line l, triangle t, bool extended=<default>);
-point[] intersectionpoints(line l, circle c);
-point[] intersectionpoints(circle c, line l);
-point[] intersectionpoints(line l, ellipse el);
-point[] intersectionpoints(ellipse el, line l);
-point[] intersectionpoints(line l, parabola p);
-point[] intersectionpoints(parabola p, line l);
-point[] intersectionpoints(line l, hyperbola h);
-point[] intersectionpoints(hyperbola h, line l);
-point[] intersectionpoints(line l, conic co);
-point[] intersectionpoints(conic co, line l);
-point[] intersectionpoints(conic co1, conic co2);
-point[] intersectionpoints(triangle t, conic co, bool extended=<default>);
-point[] intersectionpoints(conic co, triangle t, bool extended=<default>);
-point[] intersectionpoints(ellipse a, ellipse b);
-point[] intersectionpoints(ellipse a, circle b);
-point[] intersectionpoints(circle a, ellipse b);
-point[] intersectionpoints(ellipse a, parabola b);
-point[] intersectionpoints(parabola a, ellipse b);
-point[] intersectionpoints(ellipse a, hyperbola b);
-point[] intersectionpoints(hyperbola a, ellipse b);
-point[] intersectionpoints(circle a, parabola b);
-point[] intersectionpoints(parabola a, circle b);
-point[] intersectionpoints(circle a, hyperbola b);
-point[] intersectionpoints(hyperbola a, circle b);
-point[] intersectionpoints(parabola a, parabola b);
-point[] intersectionpoints(parabola a, hyperbola b);
-point[] intersectionpoints(hyperbola a, parabola b);
-point[] intersectionpoints(hyperbola a, hyperbola b);
-point[] intersectionpoints(circle c1, circle c2);
-point[] intersectionpoints(conic co, arc a);
-point[] intersectionpoints(arc a, conic co);
-point[] intersectionpoints(arc a1, arc a2);
-point[] intersectionpoints(line l, arc a);
-point[] intersectionpoints(arc a, line l);
-void drawline(picture pic=<default>, triangle t, pen p=<default>);
+line complementary(explicit line l);
+line[] complementary(explicit segment s);
+arc complementary(arc a);
+point angpoint(conic co, real angle);
+point angpoint(explicit circle c, real x);
+point angpoint(explicit ellipse el, real x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
+point angpoint(explicit parabola p, real x);
+point angpoint(explicit hyperbola h, real x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
+point angpoint(arc a, real angle);
+pen addpenline;
+pen addpenline(pen p);
+int parabolanodesnumber(parabola p, real angle1, real angle2);
+point curpoint(line l, real x);
+point curpoint(explicit circle c, real x);
+point curpoint(explicit ellipse el, real x);
+point curpoint(explicit parabola p, real x);
+point curpoint(conic co, real x);
+point curpoint(arc a, real x);
+point midpoint(segment s);
+point midpoint(side side);
+string defaultmassformat;
+int circlenodesnumberfactor;
+coordsys operator init();
+point operator init();
+vector operator init();
+line operator init();
+segment operator init();
+bqe operator init();
+conic operator init();
+circle operator init();
+ellipse operator init();
+parabola operator init();
+hyperbola operator init();
+abscissa operator init();
+arc operator init();
+mass operator init();
+triangle operator init();
+trilinear operator init();
+inversion operator init();
+real sharpdegrees(line l1, line l2);
 void draw(picture pic=<default>, Label L=<default>, line l, bool dirA=<default>, bool dirB=<default>, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, Label legend=<default>, marker marker=<default>, path pathModifier(path)=<default>);
 void draw(picture pic=<default>, Label[] L=<default>, line[] l, align align=<default>, pen[] p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, Label[] legend=<default>, marker marker=<default>, path pathModifier(path)=<default>);
 void draw(picture pic=<default>, Label[] L=<default>, line[] l, align align=<default>, pen p, bool arrow(picture, path, pen, marginT(path, pen))=<default>, Label[] legend=<default>, marker marker=<default>, path pathModifier(path)=<default>);
@@ -2498,11 +2482,19 @@
 void draw(picture pic=<default>, Label L=<default>, arc a, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
 void draw(picture pic=<default>, triangle t, pen p=<default>, marker marker=<default>);
 void draw(picture pic=<default>, triangle[] t, pen p=<default>, marker marker=<default>);
-void label(picture pic=<default>, Label L, explicit mass M, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
-void label(picture pic=<default>, Label L, vertex V, pair align=<default>, real alignFactor=<default>, pen p=<default>, filltype filltype=<default>);
-void label(picture pic=<default>, Label LA=<default>, Label LB=<default>, Label LC=<default>, triangle t, real alignAngle=<default>, real alignFactor=<default>, pen p=<default>, filltype filltype=<default>);
-side opposite(vertex V);
-vertex opposite(side side);
+pair coordinates(point M);
+transform vprojection(line l, bool safe=<default>);
+circle circumcircle(point A, point B, point C);
+circle circumcircle(triangle t);
+pen addpenarc;
+pen addpenarc(pen p);
+line reverse(line l);
+arc reverse(arc a);
+void drawline(picture pic=<default>, triangle t, pen p=<default>);
+bool inside(ellipse el, point M);
+bool inside(parabola p, point M);
+circle incircle(point A, point B, point C);
+circle incircle(triangle t);
 line[] operator ^^(line l1, line l2);
 line[] operator ^^(line l1, line[] l2);
 line[] operator ^^(line[] l2, line l1);
@@ -2539,6 +2531,9 @@
 mass operator +(explicit mass M, int x);
 point intersectionpoint(line l1, line l2);
 bool concurrent(... line[] l);
+void label(picture pic=<default>, Label L, explicit mass M, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
+void label(picture pic=<default>, Label L, vertex V, pair align=<default>, real alignFactor=<default>, pen p=<default>, filltype filltype=<default>);
+void label(picture pic=<default>, Label LA=<default>, Label LB=<default>, Label LC=<default>, triangle t, real alignAngle=<default>, real alignFactor=<default>, pen p=<default>, filltype filltype=<default>);
 circle circle(explicit point C, real r);
 circle circle(point A, point B);
 circle circle(segment s);
@@ -2566,6 +2561,9 @@
 arc arc(explicit arc a, abscissa x1, abscissa x2);
 arc arc(explicit arc a, point M, point N);
 path arc(explicit pair B, explicit pair A, explicit pair C, real r);
+point isogonalconjugate(triangle t, point M);
+transform xscale(real k, point M);
+bool between(point M, point O, point N);
 point operator -(explicit point P);
 point operator -(explicit point P1, explicit point P2);
 point operator -(explicit point P1, explicit pair p2);
@@ -2591,24 +2589,23 @@
 mass operator -(explicit mass M, real x);
 mass operator -(explicit mass M, int x);
 real[] realquarticroots(real a, real b, real c, real d, real e);
-bool operator !=(explicit point M, explicit point N);
-bool operator !=(line l1, line l2);
-arc arcsubtended(point A, point B, real angle);
-point centroid(point A, point B, point C);
-point centroid(triangle t);
+coordsys canonicalcartesiansystem(ellipse el);
+coordsys canonicalcartesiansystem(parabola p);
+coordsys canonicalcartesiansystem(hyperbola h);
+coordsys canonicalcartesiansystem(explicit conic co);
 hyperbola hyperbola(point P1, point P2, real ae, bool byfoci=<default>);
 hyperbola hyperbola(point C, real a, real b, real angle=<default>);
 hyperbola hyperbola(bqe bqe);
 hyperbola hyperbola(point M1, point M2, point M3, point M4, point M5);
+real[] intersect(path g, explicit pair p, real fuzz=<default>);
+real[] intersect(path g, explicit point P, real fuzz=<default>);
 transform rotate(explicit pair dir);
 transform rotate(explicit vector dir);
 transform rotate(explicit point dir);
 void addMargins(picture pic=<default>, real lmargin=<default>, real bmargin=<default>, real rmargin=<default>, real tmargin=<default>, bool rigid=<default>, bool allObject=<default>);
-ellipse ellipse(point F1, point F2, real a);
-ellipse ellipse(point F1, point F2, point M);
-ellipse ellipse(point C, real a, real b, real angle=<default>);
-ellipse ellipse(bqe bqe);
-ellipse ellipse(point M1, point M2, point M3, point M4, point M5);
+point circumcenter(point A, point B, point C);
+point circumcenter(triangle t);
+triangle triangle(line l1, line l2, line l3);
 path fromCenter(conic co, real angle1, real angle2, int n, bool direction);
 abscissa nodabscissa(real x);
 abscissa nodabscissa(int x);
@@ -2618,16 +2615,20 @@
 abscissa nodabscissa(parabola p, point M);
 abscissa nodabscissa(conic co, point M);
 abscissa nodabscissa(arc a, point M);
-point isogonal(side side, point M);
-line isogonal(vertex V, point M);
-triangle isogonal(triangle t, point M);
-transform xscale(real k, point M);
-point circumcenter(point A, point B, point C);
-point circumcenter(triangle t);
+side opposite(vertex V);
+vertex opposite(side side);
 line Ox(coordsys R=<default>);
 line Ox;
 real abs(coordsys R, pair m);
 real abs(explicit point M);
+line tangent(circle c, abscissa x);
+line tangent(circle c, point M);
+line tangent(circle c, explicit vector v);
+line tangent(ellipse el, abscissa x);
+line tangent(parabola p, abscissa x);
+line tangent(hyperbola h, abscissa x);
+line tangent(explicit arc a, abscissa x);
+line tangent(explicit arc a, point M);
 trilinear trilinear(triangle t, real a, real b, real c);
 trilinear trilinear(triangle t, point M);
 trilinear trilinear(triangle t, real f(real, real, real), real a=<default>, real b=<default>, real c=<default>);
@@ -2637,12 +2638,8 @@
 real angle(line l, coordsys R=<default>);
 real angle(line l1, line l2);
 real angle(arc a);
-coordsys canonicalcartesiansystem(ellipse el);
-coordsys canonicalcartesiansystem(parabola p);
-coordsys canonicalcartesiansystem(hyperbola h);
-coordsys canonicalcartesiansystem(explicit conic co);
-real[] bangles(picture pic=<default>, parabola p);
-real[][] bangles(picture pic=<default>, hyperbola h);
+line vline(coordsys R=<default>);
+line vline;
 triangle tangential(triangle t);
 line[] tangents(circle c, point M);
 line[] tangents(ellipse el, point M);
@@ -2696,6 +2693,7 @@
 conic changecoordsys(coordsys R, conic co);
 bool samecoordsys(bool warn=<default> ... point[] M);
 bool samecoordsys(bool warn=<default> ... bqe[] bqes);
+point[] standardizecoordsys(coordsys R=<default>, bool warn=<default> ... point[] M);
 pair locate(point P);
 point locate(pair p);
 pair locate(explicit vector v);
@@ -2725,7 +2723,6 @@
 bool sameside(point M, point P, line l);
 point[] sameside(point M, line l1, line l2);
 path currentpolarconicroutine(conic co, real angle1, real angle2, int n, bool direction);
-bool between(point M, point O, point N);
 int ellipsenodesnumber(real a, real b);
 int ellipsenodesnumber(real a, real b, real angle1, real angle2, bool dir);
 path NoModifier(path);
@@ -2733,6 +2730,8 @@
 void distance(picture pic=<default>, Label L=<default>, point A, point B, bool rotated=<default>, real offset=<default>, pen p=<default>, pen joinpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>);
 real distance(point M, line l);
 real distance(line l, point M);
+real[] bangles(picture pic=<default>, parabola p);
+real[][] bangles(picture pic=<default>, hyperbola h);
 pair attract(pair m, path g, real fuzz=<default>);
 point attract(point M, path g, real fuzz=<default>);
 point incenter(point A, point B, point C);
@@ -2742,6 +2741,7 @@
 coordsys coordsys(ellipse el);
 line Oy(coordsys R=<default>);
 line Oy;
+real centerToFocus(ellipse el, real a);
 void dot(picture pic=<default>, Label L, explicit point Z, align align=<default>, string format=<default>, pen p=<default>);
 real dot(point A, point B);
 real dot(point A, explicit pair B);
@@ -2748,7 +2748,6 @@
 real dot(explicit pair A, point B);
 void dot(picture pic=<default>, Label L, explicit mass M, align align=<default>, string format=<default>, pen p=<default>);
 void dot(picture pic=<default>, triangle t, pen p=<default>);
-real centerToFocus(ellipse el, real a);
 line parallel(point M, line l);
 line parallel(point M, explicit vector dir);
 line parallel(point M, explicit pair dir);
@@ -2816,12 +2815,13 @@
 circle excircle(point A, point B, point C);
 circle excircle(side side);
 int[] numarray;
-line altitude(vertex V);
-line altitude(side side);
 int[] tricoef(side side);
 point symmedian(triangle t);
 point symmedian(side side);
 line symmedian(vertex V);
+triangle cevian(triangle t, point P);
+point cevian(side side, point P);
+line cevian(vertex V, point P);
 int angularsystem;
 point gergonne(triangle t);
 path Arc(pair c, real r, real angle1, real angle2, bool direction, int n=<default>);
@@ -2856,10 +2856,10 @@
 void labelx(picture pic=<default>, Label L, string format=<default>, explicit pen p=<default>);
 void tick(picture pic=<default>, pair z, pair dir, real size=<default>, pen p=<default>);
 void tick(picture pic=<default>, Label L, real value, explicit pair z, pair dir, string format=<default>, real size=<default>, pen p=<default>);
+void xaxis(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
 void limits(picture pic=<default>, pair min, pair max, bool crop=<default>);
 void crop(picture pic=<default>);
 void ylimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
-void yaxisAt(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool opposite=<default>);
 void YZero(picture, axisT)(bool extend=<default>);
 void YZero(picture, axisT);
 void YEquals(picture, axisT)(real y, bool extend=<default>);
@@ -2874,7 +2874,8 @@
 void RightTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
 void NoTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)();
 void NoTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
-tickvalues OmitTickInterval(tickvalues)(real a, real b);
+tickvalues OmitTick(tickvalues)(... real[] x);
+tickvalues OmitTickIntervals(tickvalues)(real[] a, real[] b);
 void Ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks=<default>, real[] ticks=<default>, int N=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
 void Ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
 void Ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
@@ -2883,7 +2884,7 @@
 real zerotickfuzz;
 void drawtick(frame f, transform T, path g, path g2, ticklocate locate, real val, real Size, int sign, pen p, bool extend);
 pair ticklabelshift(pair align, pen p=<default>);
-void xaxis(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
+void yaxis(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool autorotate=<default>);
 string DefaultFormat(real);
 string Format(real)(string s=<default>);
 real upscale(real b, real a);
@@ -2898,6 +2899,10 @@
 bool axiscoverage(int N, transform T, path g, ticklocate locate, real Step, pair side, int sign, real Size, Label F, string ticklabel(real), real norm, real limit);
 void errorbar(picture pic, pair z, pair dp, pair dm, pen p=<default>, real size=<default>);
 real linear(real)(real S(real x)=<default>, real Min, real Max);
+tickvalues OmitTickInterval(tickvalues)(real a, real b);
+void BottomTop(picture, axisT)(bool extend=<default>);
+void BottomTop(picture, axisT);
+int Value;
 tickvalues NoZero(tickvalues);
 autoscaleT defaultS;
 real ScaleY(picture pic=<default>, real y);
@@ -2910,23 +2915,21 @@
 void errorbars(picture pic=<default>, pair[] z, pair[] dp, pair[] dm=<default>, bool[] cond=<default>, pen p=<default>, real size=<default>);
 void errorbars(picture pic=<default>, real[] x, real[] y, real[] dpx, real[] dpy, real[] dmx=<default>, real[] dmy=<default>, bool[] cond=<default>, pen p=<default>, real size=<default>);
 void errorbars(picture pic=<default>, real[] x, real[] y, real[] dpy, bool[] cond=<default>, pen p=<default>, real size=<default>);
-void XZero(picture, axisT)(bool extend=<default>);
-void XZero(picture, axisT);
+tickvalues None(tickvalues v);
 void labelaxis(frame f, transform T, Label L, path g, ticklocate locate=<default>, int sign=<default>, bool ticklabels=<default>);
 path Circle(pair c, real r, int n=<default>);
-void xaxisAt(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool opposite=<default>);
+void yaxisAt(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool opposite=<default>);
 real ytrans(transform t, real y);
 string LogFormat(real)(int base);
 string LogFormat(real);
-tickvalues OmitTickIntervals(tickvalues)(real[] a, real[] b);
 void checkconditionlength(int x, int y);
-pair zero(real);
-void label(picture pic, Label L, pair z, real x, align align, string format, pen p);
 pair tickMin(picture pic);
 tickvalues generateticks(int sign, Label F=<default>, string ticklabel(real)=<default>, int N, int n=<default>, real Step=<default>, real step=<default>, real Size=<default>, real size=<default>, transform T, pair side, path g, real limit, pen p, ticklocate locate, int[] divisor, bool opposite);
 int Both;
 ticklocate ticklocate(real a, real b, autoscaleT S=<default>, real tickmin=<default>, real tickmax=<default>, real time(real)=<default>, pair dir(real)=<default>);
 int Max;
+pair zero(real);
+void label(picture pic, Label L, pair z, real x, align align, string format, pen p);
 scaleT Logarithmic;
 string NoZeroFormat(real);
 string trailingzero;
@@ -2941,31 +2944,27 @@
 locateT operator init();
 tickvalues operator init();
 axisT operator init();
-void yaxis(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool autorotate=<default>);
 real ScaleX(picture pic=<default>, real x);
-pair tickMax(picture pic);
-real xtrans(transform t, real x);
+scaleT BrokenLog(real a, real b, bool automin=<default>, bool automax=<default>);
 void LeftTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
 void LeftTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
 void LeftTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
 pair Scale(picture pic=<default>, pair z);
-tickvalues None(tickvalues v);
+string baselinetemplate;
 real maxlength(pair a, pair b, int nx, int ny);
-scaleT BrokenLog(real a, real b, bool automin=<default>, bool automax=<default>);
+void XZero(picture, axisT)(bool extend=<default>);
+void XZero(picture, axisT);
 void xequals(picture pic=<default>, Label L=<default>, real x, bool extend=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
 scaleT Log;
 scaleT Log(bool automin=<default>, bool automax=<default>);
+real xtrans(transform t, real x);
 string signedtrailingzero;
-string baselinetemplate;
 void xlimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
 void scale(picture pic=<default>, scaleT x, scaleT y=<default>, scaleT z=<default>);
 void scale(picture pic=<default>, bool xautoscale=<default>, bool yautoscale=<default>, bool zautoscale=<default>);
-int Value;
-void BottomTop(picture, axisT)(bool extend=<default>);
-void BottomTop(picture, axisT);
+pair tickMax(picture pic);
 void Bottom(picture, axisT)(bool extend=<default>);
 void Bottom(picture, axisT);
-tickvalues OmitTick(tickvalues)(... real[] x);
 void xtick(picture pic=<default>, explicit pair z, pair dir=<default>, real size=<default>, pen p=<default>);
 void xtick(picture pic=<default>, real x, pair dir=<default>, real size=<default>, pen p=<default>);
 void xtick(picture pic=<default>, Label L, explicit pair z, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
@@ -2983,6 +2982,7 @@
 string DefaultLogFormat(real)(int base);
 string DefaultLogFormat(real);
 string OmitFormat(real)(string s=<default> ... real[] x);
+void xaxisAt(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool opposite=<default>);
 void labelz(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
 void labelx3(picture pic=<default>, Label L=<default>, real x, align align=<default>, string format=<default>, pen p=<default>);
 void ztick3(picture pic=<default>, real z, triple dir=<default>, real size=<default>, pen p=<default>);
@@ -2991,7 +2991,7 @@
 void ztick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
 void ytick3(picture pic=<default>, real y, triple dir=<default>, real size=<default>, pen p=<default>);
 void ytick3(picture pic=<default>, Label L, real y, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void zaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real zmin=<default>, real zmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
+void xaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
 void autoscale3(picture pic=<default>, void axis(picture, axisT));
 void zaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real zmin=<default>, real zmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>);
 void yaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>);
@@ -3015,25 +3015,28 @@
 void Ticks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
 surface bispline(real[][] z, real[][] p, real[][] q, real[][] r, real[] x, real[] y, bool[][] cond=<default>);
 void axes3(picture pic=<default>, Label xlabel=<default>, Label ylabel=<default>, Label zlabel=<default>, bool extend=<default>, triple min=<default>, triple max=<default>, pen p=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>);
+void zlimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
 bool vperiodic(triple[][] a);
 void xtick3(picture pic=<default>, real x, triple dir=<default>, real size=<default>, pen p=<default>);
 void xtick3(picture pic=<default>, Label L, real x, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
 bool uperiodic(triple[][] a);
-void yaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
+void zaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real zmin=<default>, real zmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
 void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
 void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
 void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>);
 triple tickMin3(picture pic);
 void axis(picture pic=<default>, Label L=<default>, path3 g, path3 g2=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>), ticklocate locate, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, int[] divisor=<default>, bool above=<default>, bool opposite=<default>);
+triple tickMax3(picture pic);
 void labely3(picture pic=<default>, Label L=<default>, real y, align align=<default>, string format=<default>, pen p=<default>);
 void(flatguide3)[][] lift(real f(real x, real y), guide[][] g, void join(flatguide3)(... void(flatguide3)[])=<default>);
 void(flatguide3)[][] lift(real f(pair z), guide[][] g, void join(flatguide3)(... void(flatguide3)[])=<default>);
 void ytick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
 void ytick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+void Straight(flatguide3)(... void(flatguide3)[]);
 real xtrans(real[][] t, real x);
-real maxlength(triple f(pair z), pair a, pair b, int nu, int nv);
+triple Dir(real)(triple dir);
 locateT operator init();
-triple Dir(real)(triple dir);
+void yaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
 void draw(picture pic=<default>, Label[] L=<default>, void(flatguide3)[][] g, pen[] p, light light=<default>, string name=<default>, render render=<default>, interaction interaction=<default>);
 void draw(picture pic=<default>, Label[] L=<default>, void(flatguide3)[][] g, pen p=<default>, light light=<default>, string name=<default>, render render=<default>, interaction interaction=<default>);
 void xtick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
@@ -3040,14 +3043,12 @@
 void xtick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
 picture vectorfield(path3 vector(pair v), triple f(pair z), pair a, pair b, int nu=<default>, int nv=<default>, bool truesize=<default>, real maxlength=<default>, bool cond(pair z)=<default>, pen p=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, string name=<default>, render render=<default>);
 path3[] segment(triple[] v, bool[] cond, void join(flatguide3)(... void(flatguide3)[])=<default>);
-void xaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
+real ytrans(real[][] t, real y);
+ticklocate ticklocate(real a, real b, autoscaleT S=<default>, real tickmin=<default>, real tickmax=<default>, real time(real)=<default>, triple dir(real));
 void label(picture pic, Label L, triple v, real x, align align, string format, pen p);
-ticklocate ticklocate(real a, real b, autoscaleT S=<default>, real tickmin=<default>, real tickmax=<default>, real time(real)=<default>, triple dir(real));
 void XZZero(picture, axisT)(triple align=<default>, bool extend=<default>);
 void XZZero(picture, axisT);
-void Straight(flatguide3)(... void(flatguide3)[]);
-triple tickMax3(picture pic);
-real ytrans(real[][] t, real y);
+real maxlength(triple f(pair z), pair a, pair b, int nu, int nv);
 path3 Circle(triple c, real r, triple normal=<default>, int n=<default>);
 void labelaxis(picture pic, real[][] T, Label L, path3 g, ticklocate locate=<default>, int sign=<default>, bool ticklabels=<default>);
 void XYEquals(picture, axisT)(real x, real y, triple align=<default>, bool extend=<default>);
@@ -3075,10 +3076,10 @@
 void labelx(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
 void labely(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
 void drawtick(picture pic, real[][] T, path3 g, path3 g2, ticklocate locate, real val, real Size, int sign, pen p, bool extend);
-triple Scale(picture pic=<default>, triple v);
 void tick(picture pic=<default>, triple v, triple dir, real size=<default>, pen p=<default>);
 void tick(picture pic=<default>, Label L, real value, triple v, triple dir, string format=<default>, real size=<default>, pen p=<default>);
 void polargraph(flatguide3)(real r(real, real), real theta(real), real phi(real), int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
+triple Scale(picture pic=<default>, triple v);
 triple ticklabelshift(triple align, pen p=<default>);
 triple polar(real r, real theta, real phi);
 void limits(picture pic=<default>, triple min, triple max);
@@ -3093,7 +3094,6 @@
 surface surface(triple f(pair z), pair a, pair b, int nu=<default>, int nv=<default>, real[](real[], real[])[] usplinetype, real[](real[], real[])[] vsplinetype=<default>, bool cond(pair z)=<default>);
 surface surface(real f(pair z), pair a, pair b, int nx=<default>, int ny=<default>, bool cond(pair z)=<default>);
 surface surface(real f(pair z), pair a, pair b, int nx=<default>, int ny=<default>, real[] xsplinetype(real[], real[]), real[] ysplinetype(real[], real[])=<default>, bool cond(pair z)=<default>);
-void zlimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
 real axiscoverage;
 real Ticksize;
 real ticksize;
@@ -3100,10 +3100,10 @@
 int nmesh;
 int nCircle;
 real epsilon;
+real ylabelwidth;
+int ngraph;
 real axislabelfactor;
 bool NoCrop;
-real ylabelwidth;
-int ngraph;
 bool Crop;
 guide hermite(real[] x, real[] y, real[] splinetype(real[], real[])=<default>);
 real[] monotonic(real[] x, real[] y);
@@ -3115,8 +3115,8 @@
 real[](real[], real[])[] Spline;
 real[] notaknot(real[] x, real[] y);
 real[] periodic(real[] x, real[] y);
+void checklengths(int x, int y, string text=<default>);
 real[] natural(real[] x, real[] y);
-void checklengths(int x, int y, string text=<default>);
 void checkincreasing(real[] x);
 position middle;
 grid3(picture pic)[] YX_YZgrid(position posa=<default>, position posb=<default>);
@@ -3134,8 +3134,9 @@
 grid3 XYgrid(picture pic)(position pos=<default>);
 grid3 XYgrid(picture pic);
 ticksgridT InTicks()(Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, pen pTick=<default>, pen ptick=<default>, grid3(picture pic)[][] gridroutine, pen pGrid=<default>, pen pgrid=<default>);
-grid3 YZgrid(picture pic)(position pos=<default>);
-grid3 YZgrid(picture pic);
+void xaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
+grid3(picture pic)[] XZXgrid(position pos=<default>);
+grid3(picture pic)[] XZXgrid;
 grid3(picture pic)[][] XYZgrid(position pos=<default>);
 grid3(picture pic)[][] XYZgrid;
 grid3(picture pic)[] YXYgrid(position pos=<default>);
@@ -3142,8 +3143,10 @@
 grid3(picture pic)[] YXYgrid;
 grid3(picture pic)[] ZX_ZYgrid(position posa=<default>, position posb=<default>);
 grid3(picture pic)[] ZX_ZYgrid;
+void zaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
+void grid3(picture pic=<default>, grid3(picture pic)[][] gridroutine=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, pen pGrid=<default>, pen pgrid=<default>, bool above=<default>);
+void grid3(picture pic=<default>, grid3(picture pic)[][] gridroutine, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, pen[] pGrid, pen[] pgrid, bool above=<default>);
 ticksgridT OutTicks()(Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, pen pTick=<default>, pen ptick=<default>, grid3(picture pic)[][] gridroutine, pen pGrid=<default>, pen pgrid=<default>);
-position top;
 triple ZX(picture pic);
 triple X(picture pic);
 triple Y(picture pic);
@@ -3150,32 +3153,29 @@
 grid3(picture pic)[] operator cast(grid3 gridroutine(picture pic));
 grid3(picture pic)[][] operator cast(grid3(picture pic)[] gridroutine);
 grid3(picture pic)[][] operator cast(grid3 gridroutine(picture pic));
+position top;
 grid3 operator init();
 ticksgridT operator init();
 position bottom;
-void grid3(picture pic=<default>, grid3(picture pic)[][] gridroutine=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, pen pGrid=<default>, pen pgrid=<default>, bool above=<default>);
-void grid3(picture pic=<default>, grid3(picture pic)[][] gridroutine, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, pen[] pGrid, pen[] pgrid, bool above=<default>);
+void yaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
 grid3(picture pic)[] XY_XZgrid(position posa=<default>, position posb=<default>);
 grid3(picture pic)[] XY_XZgrid;
-grid3 XZgrid(picture pic)(position pos=<default>);
-grid3 XZgrid(picture pic);
 grid3(picture pic)[] ZYZgrid(position pos=<default>);
 grid3(picture pic)[] ZYZgrid;
+grid3 YZgrid(picture pic)(position pos=<default>);
+grid3 YZgrid(picture pic);
 grid3(picture pic)[] XYXgrid(position pos=<default>);
 grid3(picture pic)[] XYXgrid;
 ticksgridT InOutTicks()(Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, pen pTick=<default>, pen ptick=<default>, grid3(picture pic)[][] gridroutine, pen pGrid=<default>, pen pgrid=<default>);
 triple XY(picture pic);
-void xaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
-void yaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
-void zaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
+grid3 XZgrid(picture pic)(position pos=<default>);
+grid3 XZgrid(picture pic);
 triple YZ(picture pic);
 triple Z(picture pic);
-grid3(picture pic)[] XZXgrid(position pos=<default>);
-grid3(picture pic)[] XZXgrid;
 real fspline(real)(real[] x, real[] y, real[] splinetype(real[], real[])=<default>);
 real fhorner(real)(horner sh);
+horner hdiffdiv(real[] x, real[] y, real[] dy);
 horner operator init();
-horner hdiffdiv(real[] x, real[] y, real[] dy);
 real pwhermite(real)(real[] x, real[] y, real[] dy);
 horner diffdiv(real[] x, real[] y);
 void labelpath(frame f, Label L, path g, string justify=<default>, pen p=<default>);
@@ -3204,7 +3204,6 @@
 real LM_DWARF;
 real LM_MACHEP;
 string[] lm_infmsg;
-real LM_SQRT_GIANT;
 void lm_evaluate_default(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info);
 lm_data_type operator init();
 lm_int_type operator init();
@@ -3217,6 +3216,7 @@
 real LM_SQRT_DWARF;
 FitResult fit(real[] xdata, real[] ydata, real[] errors, real function(real[], real), real[] parameters, FitControl control=<default>);
 FitResult fit(real[] xdata, real[] ydata, real function(real[], real), real[] parameters, FitControl control=<default>);
+real LM_SQRT_GIANT;
 marker CrossIntervalMarker(int i=<default>, int n=<default>, real size=<default>, real space=<default>, real angle=<default>, pair offset=<default>, bool rotated=<default>, pen p=<default>, frame uniform=<default>, bool above=<default>);
 marker StickIntervalMarker(int i=<default>, int n=<default>, real size=<default>, real space=<default>, real angle=<default>, pair offset=<default>, bool rotated=<default>, pen p=<default>, frame uniform=<default>, bool above=<default>);
 void markangle(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, pair A, pair O, pair B, bool arrow(picture, path, pen, marginT(path, pen))=<default>, pen p=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>, marker marker=<default>);
@@ -3236,11 +3236,11 @@
 marker TildeIntervalMarker(int i=<default>, int n=<default>, real size=<default>, real space=<default>, real angle=<default>, pair offset=<default>, bool rotated=<default>, pen p=<default>, frame uniform=<default>, bool above=<default>);
 real tildemarksize(pen p=<default>);
 real tildemarksizefactor;
-real circlemarkradius(pen p=<default>);
 real markangleradiusfactor;
 real markanglespacefactor;
 frame stickframe(int n=<default>, real size=<default>, pair space=<default>, real angle=<default>, pair offset=<default>, pen p=<default>);
 frame stickframe;
+real circlemarkradius(pen p=<default>);
 frame circlebarframe(int n=<default>, real barsize=<default>, real radius=<default>, real angle=<default>, pair offset=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
 real stickmarksizefactor;
 real stickmarksize(pen p=<default>);
@@ -3279,20 +3279,20 @@
 real csc(real x);
 int quadrant(real degrees);
 pair exp(explicit pair z);
-real intersect(pair p, pair q, pair z);
-real intersect(triple P, triple Q, triple n, triple Z);
-pair unityroot(int n, int k=<default>);
 string nopoint;
 real cot(real x);
 pair log(explicit pair z);
-real[] zero(int n);
-real[][] zero(int n, int m);
 triple intersectionpoint(triple n0, triple P0, triple n1, triple P1);
 real findroot(real f(real), real a, real b, real tolerance=<default>, real fa=<default>, real fb=<default>);
 void drawline(picture pic=<default>, pair P, pair Q, pen p=<default>);
 int[][] segment(bool[] b);
+rootfinder_settings operator init();
 real acot(real x);
-rootfinder_settings operator init();
+real intersect(pair p, pair q, pair z);
+real intersect(triple P, triple Q, triple n, triple Z);
+real[] zero(int n);
+real[][] zero(int n, int m);
+pair unityroot(int n, int k=<default>);
 bool polygon(path p);
 bool square(real[][] m);
 bool increasing(real[] a, bool strict=<default>);
@@ -3320,12 +3320,12 @@
 real stepfactor;
 real phi2(real x);
 RKTableau RK5DP;
-real phi3(real x);
 void report(real old, real h, real t);
 RKTableau E_PC;
 RKTableau E_RK2;
+RKTableau PC;
 RKTableau RK3;
-RKTableau PC;
+real phi3(real x);
 coefficients operator init();
 RKTableau operator init();
 solution operator init();
@@ -3334,8 +3334,8 @@
 void write(Solution S);
 void expfactors(real x, coefficients a);
 RKTableau E_RK3BS;
+real[] solveBVP(real[] f(real, real[]), real a, real b=<default>, real h=<default>, int n=<default>, bool dynamic=<default>, real tolmin=<default>, real tolmax=<default>, real dtmin=<default>, real dtmax=<default>, RKTableau tableau, bool verbose=<default>, real[] initial(real[]), real[] discrepancy(real[]), real[] guess, int iterations=<default>);
 RKTableau Euler;
-real[] solveBVP(real[] f(real, real[]), real a, real b=<default>, real h=<default>, int n=<default>, bool dynamic=<default>, real tolmin=<default>, real tolmax=<default>, real dtmin=<default>, real dtmax=<default>, RKTableau tableau, bool verbose=<default>, real[] initial(real[]), real[] discrepancy(real[]), real[] guess, int iterations=<default>);
 pen[] cmyk(pen[] Palette);
 pen[] BWRainbow2(int NColors=<default>);
 pen[] Wheel(int NColors=<default>);
@@ -3355,7 +3355,6 @@
 void NoTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>);
 pen[] Gradient(int NColors=<default> ... pen[] p);
 pen[] quantize(pen[] Palette, int n);
-pen[] Rainbow(int NColors=<default>);
 pen[] Grayscale(int NColors=<default>);
 pen[] BWRainbow(int NColors, bool two);
 pen[] BWRainbow(int NColors=<default>);
@@ -3362,9 +3361,10 @@
 pen[] palette(real[] f, pen[] palette);
 pen[][] palette(real[][] f, pen[] palette);
 void palette(picture pic=<default>, Label L=<default>, bounds bounds, pair initial, pair final, void axis(picture, axisT)=<default>, pen[] palette, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>)=<default>, bool copy=<default>, bool antialias=<default>);
-bounds Range(picture pic, real min, real max)(bool automin=<default>, real min=<default>, bool automax=<default>, real max=<default>);
 void PaletteTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, pen pTick=<default>, pen ptick=<default>);
 void PaletteTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>);
+bounds Range(picture pic, real min, real max)(bool automin=<default>, real min=<default>, bool automax=<default>, real max=<default>);
+pen[] Rainbow(int NColors=<default>);
 picture crosshatch(real H=<default>, pen p=<default>);
 picture hatch(real H=<default>, pair dir=<default>, pen p=<default>);
 real hatchepsilon;
@@ -3374,27 +3374,33 @@
 frame tiling(string name, picture pic, pair lb=<default>, pair rt=<default>);
 void add(string name, picture pic, pair lb=<default>, pair rt=<default>);
 void grestore(picture pic=<default>);
+void gsave(picture pic=<default>);
 pen textpen;
-void gsave(picture pic=<default>);
 pair align;
+rational[][] rationalidentity(int n);
 rational sum(rational[] a);
 bool rectangular(rational[][] m);
+string texstring(rational r);
 bool operator >(rational r, rational s);
+bool[] operator >(rational[] r, rational s);
 bool operator <(rational r, rational s);
+bool[] operator <(rational[] r, rational s);
 rational operator /(rational r, rational s);
 rational abs(rational r);
 int lcm(int m, int n);
 bool operator >=(rational r, rational s);
+bool[] operator >=(rational[] r, rational s);
 rational operator +(rational r, rational s);
 bool operator <=(rational r, rational s);
+bool[] operator <=(rational[] r, rational s);
 rational operator init();
 rational min(rational a, rational b);
 rational operator cast(int p);
 rational[] operator cast(int[] a);
 rational[][] operator cast(int[][] a);
-void write(string s=<default>, rational r, void suffix(file)=<default>);
-void write(string s=<default>, rational[] a, void suffix(file)=<default>);
-void write(string s=<default>, rational[][] a, void suffix(file)=<default>);
+void write(file fout=<default>, string s=<default>, rational r, void suffix(file)=<default>);
+void write(file fout=<default>, string s=<default>, rational[] a, void suffix(file)=<default>);
+void write(file fout=<default>, string s=<default>, rational[][] a, void suffix(file)=<default>);
 int gcd(int m, int n);
 bool operator !=(rational r, rational s);
 bool operator ==(rational r, rational s);
@@ -3401,12 +3407,17 @@
 bool[] operator ==(rational[] r, rational s);
 bool operator ==(rational[] r, rational[] s);
 bool operator ==(rational[][] r, rational[][] s);
+string string(rational r);
 rational operator -(rational r);
 rational operator -(rational r, rational s);
+rational[] operator -(rational[] r);
 rational max(rational a, rational b);
 rational max(rational[] a);
 real operator ecast(rational r);
 rational operator *(rational r, rational s);
+void simplexWrite(rational[][] E, int[] Bindicies, int, int);
+void simplexPhase2();
+void simplexTableau(rational[][] E, int[] Bindices, int I=<default>, int J=<default>);
 simplex operator init();
 path roundedpath(path A, real R, real S=<default>);
 simplex operator init();
@@ -3414,9 +3425,6 @@
 void subitem(string s, pen p=<default>);
 void asyfilecode(bool center=<default>, string s, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>, bool newslide=<default>);
 void asyfigure(string s, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, filltype filltype=<default>, bool newslide=<default>);
-void filecode(bool center=<default>, string s, pen p=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>);
-void code(bool center=<default>, string s, pen p=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>);
-string cropcode(string s);
 void asyinclude(string s, real xsize=<default>, real ysize=<default>);
 string[] codefile;
 void figure(string[] s, string options=<default>, real margin=<default>, string[] captions=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
@@ -3431,6 +3439,8 @@
 void outline(string s=<default>, pair position=<default>, pair align=<default>, pen p=<default>);
 void erasestep(int erasenode);
 bool checkposition();
+void code(bool center=<default>, string s, pen p=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>);
+void nextpage(pen p=<default>);
 void reversevideo();
 void color(string name, string color);
 bool empty();
@@ -3437,7 +3447,6 @@
 void setpens(pen red=<default>, pen blue=<default>, pen steppen=<default>);
 int preamblenodes;
 int[] firstnode;
-pair currentposition;
 pair titlepageposition;
 pen foregroundcolor;
 pen backgroundcolor;
@@ -3452,6 +3461,7 @@
 pen datepen;
 pen institutionpen;
 pen titlepagepen;
+pen authorpen;
 pen codepen;
 pair urlskip;
 transform tinv;
@@ -3464,37 +3474,37 @@
 pen titlepen;
 string bulletcolor(string color);
 real minipagemargin;
-void item(string s, pen p=<default>, bool step=<default>);
 void incrementposition(pair z);
 void newslide(bool stepping=<default>);
 void center(string s, pen p=<default>);
 real titleskip;
-void equations(string s, pen p=<default>);
+pair currentposition;
 bool stepping;
 pen steppagenumberpen;
-void currentexitfunction();
+void filecode(bool center=<default>, string s, pen p=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>);
+int page;
 void step();
-void multifigure(string[] slist, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool step=<default>);
 pair startposition;
 void titlepage(string title, string author, string institution=<default>, string date=<default>, string url=<default>, bool newslide=<default>);
+void item(string s, pen p=<default>, bool step=<default>);
+void currentexitfunction();
 void asycode(bool center=<default>, string s, string options=<default>, string caption=<default>, string preamble=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>, bool newslide=<default>);
 pen itempen;
 string asywrite(string s, string preamble=<default>);
 bool reverse;
 void numberpage(pen p=<default>);
-pen authorpen;
 bool firststep;
 bool landscape;
-void nextpage(pen p=<default>);
 void normalvideo();
 real codeskip;
-bool itemstep;
 real figureborder;
 string bullet;
+bool itemstep;
+void multifigure(string[] slist, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool step=<default>);
 pen pagenumberpen;
 int[] lastnode;
 string texcolor(pen p);
-int page;
+void equations(string s, pen p=<default>);
 void usersetting();
 real aboveequationskip;
 real minipagewidth;
@@ -3501,6 +3511,7 @@
 void bibliographystyle(string name);
 real pagemargin;
 pen urlpen;
+string cropcode(string s);
 void title(string s, pair position=<default>, pair align=<default>, pen p=<default>, bool newslide=<default>);
 pair pagenumberalign;
 bool havepagenumber;
@@ -3529,6 +3540,7 @@
 triple projecttospan(triple toproject, triple v1, triple v2, real mincoeff=<default>);
 int YHIGH;
 int XHIGH;
+int NULL_VERTEX;
 patch trianglewithnormals(path3 external, triple n1, triple n2, triple n3);
 patch patchwithnormals(path3 external, triple[] u0normals, triple[] u1normals, triple[] v0normals, triple[] v1normals);
 patch patchwithnormals(path3 external, triple normalat(triple));
@@ -3536,8 +3548,9 @@
 real B23(real t);
 real B13(real t);
 real B03(real t);
-evaluatedpoint[][][] make3dgrid(triple a, triple b, int nx, int ny, int nz, real f(triple), bool allowzero=<default>);
+real B33(real t);
 bool operator ==(edge a, edge b);
+int YLOW;
 pathwithnormals_settings operator init();
 intset operator init();
 int_to_intset operator init();
@@ -3545,14 +3558,11 @@
 positionedvector operator init();
 evaluatedpoint operator init();
 gridwithzeros operator init();
+int ZLOW;
 string operator cast(edge e);
 string operator cast(edge[] edges);
 string operator cast(positionedvector vv);
 triple operator cast(evaluatedpoint p);
-real B33(real t);
-int NULL_VERTEX;
-int ZLOW;
-int YLOW;
 real[] projecttospan_findcoeffs(triple toproject, triple v1, triple v2, bool warn=<default>);
 int ZHIGH;
 real angledegrees(triple a, triple b);
@@ -3559,6 +3569,7 @@
 path3 pathbetween(positionedvector v1, positionedvector v2);
 path3 pathbetween(path3 edgecycle, int vertex1, int vertex2);
 int XLOW;
+evaluatedpoint[][][] make3dgrid(triple a, triple b, int nx, int ny, int nz, real f(triple), bool allowzero=<default>);
 int[] makecircle(edge[] edges);
 path[] cylinder(path3 base, real h, triple axis=<default>, projection P);
 revolution cylinder(triple c=<default>, real r, real h, triple axis=<default>);
@@ -3569,8 +3580,8 @@
 void draw(picture pic=<default>, revolution r, int m=<default>, int n=<default>, pen frontpen=<default>, pen backpen=<default>, pen longitudinalpen=<default>, pen longitudinalbackpen=<default>, light light=<default>, string name=<default>, render render=<default>, projection P=<default>);
 skeleton operator init();
 revolution operator init();
+pen defaultbackpen;
 real[] tangent(path p, path q, bool side);
-pen defaultbackpen;
 surface surface(revolution r, int n=<default>, pen color(int i, real j)=<default>);
 linefit leastsquares(real[] x, real[] y);
 real Gaussrand();
@@ -3581,25 +3592,24 @@
 int[][] frequency(real[] x, real[] y, real[] xbins, real[] ybins);
 int[][] frequency(real[] x, real[] y, pair a, pair b, int nx, int ny=<default>);
 int[][] frequency(pair[] z, pair a, pair b, int nx, int ny=<default>);
+real Gaussian(real x, real sigma);
+real Gaussian(real x);
 real kurtosis(real[] A);
+real stdev(real[] A);
 real variancebiased(real[] A);
 real variance(real[] A);
 real legendmarkersize;
-int bins(real[] data, int max=<default>);
 real rms(real[] A);
-pair Gaussrandpair();
 real kurtosisexcess(real[] A);
-real Gaussian(real x, real sigma);
-real Gaussian(real x);
-linefit operator init();
 real skewness(real[] A);
 path topbox(pair a, pair b);
+linefit operator init();
+int bins(real[] data, int max=<default>);
 path halfbox(pair a, pair b);
+pair Gaussrandpair();
 real mean(real[] A);
-real stdev(real[] A);
-Relation r4a;
 picture tableau(frame[] cards, bool number=<default>);
-Component wye;
+Braid apply(Relation r, Braid b, int step, int place);
 Component phi;
 Component bm;
 real gapfactor;
@@ -3606,20 +3616,20 @@
 real hwratio;
 Component bp;
 pair[] endpoints(guide[] a);
-Relation operator -(Relation r);
-pair max(pair[] z);
+pair min(pair[] z);
 Relation r4b;
 Component operator init();
 Braid operator init();
 Relation operator init();
 Syzygy operator init();
-pair min(pair[] z);
-Braid apply(Relation r, Braid b, int step, int place);
+Relation r4a;
+Relation operator -(Relation r);
+pair max(pair[] z);
 Relation r3;
+Component wye;
 pen Gray;
 pen Tan;
 pen Brown;
-pen Sepia;
 pen OliveGreen;
 pen SeaGreen;
 pen JungleGreen;
@@ -3629,7 +3639,6 @@
 pen BlueViolet;
 pen RoyalPurple;
 pen Plum;
-pen DarkOrchid;
 pen Thistle;
 pen Lavender;
 pen Fuchsia;
@@ -3636,7 +3645,6 @@
 pen Rhodamine;
 pen VioletRed;
 pen CarnationPink;
-pen Salmon;
 pen WildStrawberry;
 pen RubineRed;
 pen OrangeRed;
@@ -3650,36 +3658,39 @@
 pen Peach;
 pen SkyBlue;
 pen Cerulean;
+pen YellowOrange;
 pen White;
 pen Yellow;
-pen YellowGreen;
 pen PineGreen;
-pen Violet;
 pen RedViolet;
 pen Red;
 pen Magenta;
 pen Turquoise;
+pen MidnightBlue;
 pen ProcessBlue;
-pen Orchid;
-pen YellowOrange;
+pen Violet;
 pen Black;
 pen Bittersweet;
 pen ForestGreen;
+pen YellowGreen;
+pen Orchid;
 pen Aquamarine;
 pen RawSienna;
-pen Emerald;
+pen Maroon;
 pen SpringGreen;
+pen DarkOrchid;
 pen Periwinkle;
 pen LimeGreen;
-pen MidnightBlue;
+pen Sepia;
 pen Mulberry;
 pen Cyan;
 pen Blue;
-pen Maroon;
 pen Orange;
+pen Emerald;
 pen CornflowerBlue;
 pen TealBlue;
 pen RedOrange;
+pen Salmon;
 pen RoyalBlue;
 pen Apricot;
 pen Purple;
@@ -3687,8 +3698,8 @@
 int lookup(tree t, int key);
 bool contains(tree t, int key);
 tree operator init();
+tree add(tree t, int key, int value);
 void write(file out=<default>, tree t);
-tree add(tree t, int key, int value);
 tree newtree();
 real trembleFrequency;
 real trembleFuzz();
@@ -3697,27 +3708,29 @@
 real trembleRandom;
 real trembleAngle;
 real degrees(rmf a, rmf b);
+surface tube(path3 g, coloredpath section, transform T(real)=<default>, real corner=<default>, real relstep=<default>);
 path3 roundedpath(path3 A, real r);
 int coloredNodes;
+coloredpath operator init();
 coloredpath operator cast(path p);
 coloredpath operator cast(guide p);
-coloredpath operator init();
-surface tube(path3 g, coloredpath section, transform T(real)=<default>, real corner=<default>, real relstep=<default>);
+real[] sample(path3 g, real r, real relstep=<default>);
 surface surface(rmf[] R, real[] t, coloredpath cp, transform T(real), bool cyclic);
 int coloredSegments;
-real[] sample(path3 g, real r, real relstep=<default>);
 string VERSION;
 pen Tomato;
+pen Thistle;
 pen Tan;
+pen SteelBlue;
 pen Snow;
 pen Sienna;
+pen Seashell;
 pen SeaGreen;
-pen Salmon;
+pen SandyBrown;
 pen RosyBrown;
 pen PowderBlue;
 pen Plum;
 pen Pink;
-pen PeachPuff;
 pen PaleVioletRed;
 pen PaleTurquoise;
 pen OrangeRed;
@@ -3727,14 +3740,13 @@
 pen Moccasin;
 pen MistyRose;
 pen MintCream;
-pen LightYellow;
 pen LightSlateGray;
 pen LightSkyBlue;
 pen LightSalmon;
 pen LightPink;
 pen LightGreen;
-pen LemonChiffon;
 pen LawnGreen;
+pen LavenderBlush;
 pen Lavender;
 pen Khaki;
 pen HotPink;
@@ -3746,18 +3758,17 @@
 pen Goldenrod;
 pen Fuchsia;
 pen DimGray;
-pen DeepSkyBlue;
-pen Thistle;
 pen DeepPink;
 pen DarkTurquoise;
 pen DarkSlateGray;
 pen DarkSalmon;
-pen DarkOrchid;
 pen DarkMagenta;
+pen Silver;
 pen DarkGreen;
 pen DarkGoldenrod;
 pen DarkBlue;
 pen Crimson;
+pen Cornsilk;
 pen Coral;
 pen PapayaWhip;
 pen CadetBlue;
@@ -3767,19 +3778,16 @@
 pen BlueViolet;
 pen Beige;
 pen Azure;
-pen Aqua;
+pen LemonChiffon;
 pen Indigo;
+pen Orchid;
 pen OliveDrab;
 pen DarkKhaki;
 pen Peru;
-pen WhiteSmoke;
 pen LightGoldenrodYellow;
 pen DarkSeaGreen;
-pen MidnightBlue;
 pen White;
 pen Yellow;
-pen YellowGreen;
-pen Seashell;
 pen LightCyan;
 pen Ivory;
 pen Red;
@@ -3787,64 +3795,67 @@
 pen LightSeaGreen;
 pen DarkViolet;
 pen Turquoise;
+pen WhiteSmoke;
+pen LightSteelBlue;
 pen AntiqueWhite;
-pen Orchid;
+pen MidnightBlue;
+pen DarkOliveGreen;
 pen Bisque;
-pen DarkOliveGreen;
+pen Violet;
+pen Lime;
 pen PaleGreen;
-pen LightGrey;
+pen GhostWhite;
 pen PaleGoldenrod;
-pen Wheat;
 pen Black;
 pen SlateBlue;
 pen SkyBlue;
 pen LightBlue;
 pen ForestGreen;
+pen YellowGreen;
+pen LightGrey;
 pen AliceBlue;
 pen Aquamarine;
-pen MediumVioletRed;
-pen SandyBrown;
+pen Maroon;
+pen MediumSpringGreen;
 pen SpringGreen;
+pen DarkOrchid;
 pen FloralWhite;
 pen Linen;
 pen Olive;
 pen BlanchedAlmond;
-pen MediumSpringGreen;
+pen DarkSlateBlue;
+pen SlateGray;
 pen LimeGreen;
 pen FireBrick;
 pen Gold;
-pen Maroon;
-pen GhostWhite;
 pen rgbint(int r, int g, int b);
 pen Cyan;
 pen Blue;
+pen Aqua;
 pen Teal;
 pen MediumBlue;
-pen Violet;
+pen DarkOrange;
+pen MediumVioletRed;
+pen PeachPuff;
 pen Chartreuse;
-pen DarkSlateBlue;
-pen SlateGray;
-pen Lime;
 pen Orange;
 pen CornflowerBlue;
-pen Silver;
 pen DarkGray;
 pen MediumOrchid;
 pen Chocolate;
-pen LavenderBlush;
 pen MediumPurple;
-pen DarkOrange;
 pen DodgerBlue;
 pen DarkRed;
 pen DarkCyan;
 pen MediumSlateBlue;
 pen MediumSeaGreen;
-pen SteelBlue;
 pen RoyalBlue;
 pen MediumAquamarine;
 pen Purple;
+pen DeepSkyBlue;
 pen MediumTurquoise;
-pen LightSteelBlue;
+pen LightYellow;
+pen Wheat;
 pen Green;
 pen Gainsboro;
-pen Cornsilk;
+pen Salmon;

Modified: trunk/Build/source/utils/asymptote/asymptote.spec
===================================================================
--- trunk/Build/source/utils/asymptote/asymptote.spec	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/asymptote.spec	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1,8 +1,9 @@
 %{!?_texmf: %global _texmf %(eval "echo `kpsewhich -expand-var '$TEXMFLOCAL'`")}
 %global _python_bytecompile_errors_terminate_build 0
+%global __python %{__python3}
 
 Name:           asymptote
-Version:        2.47
+Version:        2.48
 Release:        1%{?dist}
 Summary:        Descriptive vector graphics language
 
@@ -25,6 +26,7 @@
 Requires:       tetex-latex
 Requires:       tkinter
 Requires:       freeglut-devel >= 3.0.0
+Requires:       glew-devel
 Requires(post): /usr/bin/texhash /sbin/install-info
 Requires(postun): /usr/bin/texhash /sbin/install-info
 

Modified: trunk/Build/source/utils/asymptote/base/plain_prethree.asy
===================================================================
--- trunk/Build/source/utils/asymptote/base/plain_prethree.asy	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/base/plain_prethree.asy	2019-03-27 22:27:57 UTC (rev 50622)
@@ -165,7 +165,6 @@
   real[][] specular;
   pen background=nullpen; // Background color of the 3D canvas.
   real specularfactor;
-  bool viewport; // Are the lights specified (and fixed) in the viewport frame?
   triple[] position; // Only directional lights are currently implemented.
 
   transform3 T=identity(4); // Transform to apply to normal vectors.
@@ -176,7 +175,7 @@
                      pen[] ambient=array(diffuse.length,black),
                      pen[] specular=diffuse, pen background=nullpen,
                      real specularfactor=1,
-                     bool viewport=false, triple[] position) {
+                     triple[] position) {
     int n=diffuse.length;
     assert(ambient.length == n && specular.length == n && position.length == n);
     
@@ -192,21 +191,18 @@
       this.position[i]=unit(position[i]);
     }
     this.specularfactor=specularfactor;
-    this.viewport=viewport;
   }
 
   void operator init(pen diffuse=white, pen ambient=black, pen specular=diffuse,
-                     pen background=nullpen, real specularfactor=1,
-                     bool viewport=false...triple[] position) {
+                     pen background=nullpen, real specularfactor=1 ...triple[] position) {
     int n=position.length;
     operator init(array(n,diffuse),array(n,ambient),array(n,specular),
-                  background,specularfactor,viewport,position);
+                  background,specularfactor,position);
   }
 
   void operator init(pen diffuse=white, pen ambient=black, pen specular=diffuse,
-                     pen background=nullpen, bool viewport=false,
-                     real x, real y, real z) {
-    operator init(diffuse,ambient,specular,background,viewport,(x,y,z));
+                     pen background=nullpen, real x, real y, real z) {
+    operator init(diffuse,ambient,specular,background,(x,y,z));
   }
 
   void operator init(explicit light light) {
@@ -215,7 +211,6 @@
     specular=copy(light.specular);
     background=light.background;
     specularfactor=light.specularfactor;
-    viewport=light.viewport;
     position=copy(light.position);
   }
 

Modified: trunk/Build/source/utils/asymptote/base/rational.asy
===================================================================
--- trunk/Build/source/utils/asymptote/base/rational.asy	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/base/rational.asy	2019-03-27 22:27:57 UTC (rev 50622)
@@ -133,6 +133,26 @@
   return all(sequence(new bool(int i) {return r[i] == s[i];},r.length));
 }
 
+bool[] operator <(rational[] r, rational s)
+{
+  return sequence(new bool(int i) {return r[i] < s;},r.length);
+}
+
+bool[] operator >(rational[] r, rational s)
+{
+  return sequence(new bool(int i) {return r[i] > s;},r.length);
+}
+
+bool[] operator <=(rational[] r, rational s)
+{
+  return sequence(new bool(int i) {return r[i] <= s;},r.length);
+}
+
+bool[] operator >=(rational[] r, rational s)
+{
+  return sequence(new bool(int i) {return r[i] >= s;},r.length);
+}
+
 rational min(rational a, rational b)
 {
   return a <= b ? a : b;
@@ -143,35 +163,47 @@
   return a >= b ? a : b;
 }
 
+string string(rational r)
+{
+ return r.q == 1 ? string(r.p) : string(r.p)+"/"+string(r.q);
+}
 
-void write(string s="", rational r, suffix suffix=endl) {
-  if(r.q == 1)
-    write(s+string(r.p),suffix);
-  else
-    write(s+string(r.p)+"/"+string(r.q),suffix);
+string texstring(rational r)
+{
+ if(r.q == 1) return string(r.p);
+ string s;
+ if(r.p < 0) s="-";
+ return s+"\frac{"+string(abs(r.p))+"}{"+string(r.q)+"}";
 }
 
-void write(string s="", rational[] a, suffix suffix=endl) {
+void write(file fout=stdout, string s="", rational r, suffix suffix=none)
+{
+ write(fout,s+string(r),suffix);
+}
+
+void write(file fout=stdout, string s="", rational[] a, suffix suffix=none)
+{
   if(s != "")
-    write(s);
+    write(fout,s);
   for(int i=0; i < a.length; ++i) {
-    write(i,none);
-    write(':\t',a[i]);
+    write(fout,i,none);
+    write(fout,':\t',a[i],endl);
   }
-  write(suffix);
+  write(fout,suffix);
 }
 
-void write(string s="", rational[][] a, suffix suffix=endl) {
+void write(file fout=stdout, string s="", rational[][] a, suffix suffix=none)
+{
   if(s != "")
-    write(s);
+    write(fout,s);
   for(int i=0; i < a.length; ++i) {
     rational[] ai=a[i];
     for(int j=0; j < ai.length; ++j) {
-      write(ai[j],tab);
+      write(fout,ai[j],tab);
     }
-    write();
+    write(fout,endl);
   }
-  write(suffix);
+  write(fout,suffix);
 }
 
 bool rectangular(rational[][] m)
@@ -203,10 +235,19 @@
 
 rational abs(rational r)
 {
-  return rational(abs(r.p),r.q,false);
+ return rational(abs(r.p),r.q,false);
 }
 
+rational[] operator -(rational[] r)
+{
+ return sequence(new rational(int i) {return -r[i];},r.length);
+}
 
+rational[][] rationalidentity(int n)
+{
+ return sequence(new rational[](int i) {return sequence(new rational(int j) {return j == i ? 1 : 0;},n);},n);
+}
+
 /*
 rational r=rational(1,3)+rational(1,4);
 write(r == rational(1,12));

Modified: trunk/Build/source/utils/asymptote/base/rationalSimplex.asy
===================================================================
--- trunk/Build/source/utils/asymptote/base/rationalSimplex.asy	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/base/rationalSimplex.asy	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1,6 +1,29 @@
 // Rational simplex solver written by John C. Bowman and Pouria Ramazi, 2018.
 import rational;
 
+void simplexTableau(rational[][] E, int[] Bindices, int I=-1, int J=-1) {}
+void simplexPhase2() {}
+
+void simplexWrite(rational[][] E, int[] Bindicies, int, int)
+{
+  int m=E.length-1;
+  int n=E[0].length-1;
+
+  write(E[m][n],tab);
+  for(int j=0; j < n; ++j)
+    write(E[m][j],tab);
+  write();
+
+  for(int i=0; i < m; ++i) {
+    write(E[i][n],tab);
+    for(int j=0; j < n; ++j) {
+      write(E[i][j],tab);
+    }
+    write();
+  }
+  write();
+};
+
 struct simplex {
   static int OPTIMAL=0;
   static int UNBOUNDED=1;
@@ -49,7 +72,7 @@
         if(Em[J] < 0) break;
 
       if(J == N)
-        return 0;
+        break;
 
       int I=-1;
       rational M;
@@ -65,28 +88,74 @@
         rational e=E[i][J];
         if(e > 0) {
           rational v=E[i][N]/e;
-          if(v <= M) {M=v; I=i;}
+          if(v < M) {M=v; I=i;} // Bland's rule: choose smallest argmin
         }
       }
       if(I == -1)
         return UNBOUNDED; // Can only happen in Phase 2.
 
+      simplexTableau(E,Bindices,I,J);
+
+      // Generate new tableau
       Bindices[I]=J;
+      rowreduce(E,N,I,J);
+    }
+    return OPTIMAL;
+  }
 
+  int iterateDual(rational[][] E, int N, int[] Bindices) {
+    while(true) {
+      // Find first negative entry in right (basic variable) column
+      rational[] Em=E[m];
+      int I;
+      for(I=0; I < m; ++I) {
+        if(E[I][N] < 0) break;
+      }
+
+      if(I == m)
+        break;
+
+      int J=-1;
+      rational M;
+      for(int j=0; j < N; ++j) {
+        rational e=E[I][j];
+        if(e < 0) {
+          M=-E[m][j]/e;
+          J=j;
+          break;
+        }
+      }
+      for(int j=J+1; j < N; ++j) {
+        rational e=E[I][j];
+        if(e < 0) {
+          rational v=-E[m][j]/e;
+          if(v < M) {M=v; J=j;} // Bland's rule: choose smallest argmin
+        }
+      }
+      if(J == -1)
+        return INFEASIBLE; // Can only happen in Phase 2.
+
+      simplexTableau(E,Bindices,I,J);
+
       // Generate new tableau
+      Bindices[I]=J;
       rowreduce(E,N,I,J);
     }
-    return 0;
+    return OPTIMAL;
   }
 
   // Try to find a solution x to Ax=b that minimizes the cost c^T x,
-  // where A is an m x n matrix, x is a vector of length n, b is a
-  // vector of length m, and c is a vector of length n.
+  // where A is an m x n matrix, x is a vector of n non-negative numbers,
+  // b is a vector of length m, and c is a vector of length n.
+  // Can set phase1=false if the last m columns of A form the identity matrix.
   void operator init(rational[] c, rational[][] A, rational[] b,
-                     bool phase1=true) {
-    // Phase 1    
+                     bool phase1=true, bool dual=false) {
+    if(dual) phase1=false;
+    // Phase 1
     m=A.length;
+    if(m == 0) {case=INFEASIBLE; return;}
     n=A[0].length;
+    if(n == 0) {case=INFEASIBLE; return;}
 
     int N=phase1 ? n+m : n;
     rational[][] E=new rational[m+1][N+1];
@@ -98,7 +167,7 @@
     for(int i=0; i < m; ++i) {
       rational[] Ai=A[i];
       rational[] Ei=E[i];
-      if(b[i] >= 0) {
+      if(b[i] >= 0 || dual) {
         for(int j=0; j < n; ++j) {
           rational Aij=Ai[j];
           Ei[j]=Aij;
@@ -126,7 +195,7 @@
 
     rational sum=0;
     for(int i=0; i < m; ++i) {
-      rational B=abs(b[i]);
+      rational B=dual ? b[i] : abs(b[i]);
       E[i][N]=B;
       sum -= B;
     }
@@ -136,27 +205,45 @@
       for(int j=0; j < m; ++j)
         Em[n+j]=0;
    
-    int[] Bindices=sequence(new int(int x){return x;},m)+n;
+    int[] Bindices;
 
     if(phase1) {
+      Bindices=sequence(new int(int x){return x;},m)+n;
       iterate(E,N,Bindices);
   
       if(Em[J] != 0) {
+        simplexTableau(E,Bindices);
       case=INFEASIBLE;
       return;
       }
-    }
-    
+    } else Bindices=sequence(new int(int x){return x;},m)+n-m;
+
+    rational[] cB=phase1 ? new rational[m] : c[n-m:n];
     rational[][] D=phase1 ? new rational[m+1][n+1] : E;
-    rational[] Dm=D[m];
-    rational[] cb=phase1 ? new rational[m] : c[n-m:n];
     if(phase1) {
+      bool output=true;
+      // Drive artificial variables out of basis.
+      for(int i=0; i < m; ++i) {
+        int k=Bindices[i];
+        if(k >= n) {
+          rational[] Ei=E[i];
+          int j;
+          for(j=0; j < n; ++j)
+            if(Ei[j] != 0) break;
+          if(j == n) continue;
+          output=false;
+          simplexTableau(E,Bindices,i,j);
+          Bindices[i]=j;
+          rowreduce(E,n,i,j);
+        }
+      }
+      if(output) simplexTableau(E,Bindices);
       int ip=0; // reduced i
       for(int i=0; i < m; ++i) {
         int k=Bindices[i];
         if(k >= n) continue;
         Bindices[ip]=k; 
-        cb[ip]=c[k];
+        cB[ip]=c[k];
         rational[] Dip=D[ip];
         rational[] Ei=E[i];
         for(int j=0; j < n; ++j)
@@ -171,28 +258,34 @@
         Dip[j]=Em[j];
       Dip[n]=Em[N];
 
-      m=ip;
-
-      for(int j=0; j < n; ++j) {
-        rational sum=0;
-        for(int k=0; k < m; ++k)
-          sum += cb[k]*D[k][j];
-        Dm[j]=c[j]-sum;
+      if(m > ip) {
+        Bindices.delete(ip,m-1);
+        D.delete(ip,m-1);
+        m=ip;
       }
+      if(!output) simplexTableau(D,Bindices);
+    }
 
-      // Done with Phase 1
+    rational[] Dm=D[m];
+    for(int j=0; j < n; ++j) {
+      rational sum=0;
+      for(int k=0; k < m; ++k)
+        sum += cB[k]*D[k][j];
+      Dm[j]=c[j]-sum;
     }
-   
+
     rational sum=0;
     for(int k=0; k < m; ++k)
-      sum += cb[k]*D[k][n];
+      sum += cB[k]*D[k][n];
     Dm[n]=-sum;
 
-    if(iterate(D,n,Bindices) == UNBOUNDED) {
-    case=UNBOUNDED;
-    return;
-    }
+    simplexPhase2();
 
+    case=(dual ? iterateDual : iterate)(D,n,Bindices);
+    simplexTableau(D,Bindices);
+    if(case != OPTIMAL)
+      return;
+
     for(int j=0; j < n; ++j)
       x[j]=0;
 
@@ -200,15 +293,16 @@
       x[Bindices[k]]=D[k][n];
 
     cost=-Dm[n];
-    case=OPTIMAL;
   }
 
   // Try to find a solution x to sgn(Ax-b)=sgn(s) that minimizes the cost
-  // c^T x, where A is an m x n matrix, x is a vector of length n, b is a
-  // vector of length m, and c is a vector of length n.
+  // c^T x, where A is an m x n matrix, x is a vector of n non-negative
+  // numbers, b is a vector of length m, and c is a vector of length n.
   void operator init(rational[] c, rational[][] A, int[] s, rational[] b) {
     int m=A.length;
+    if(m == 0) {case=INFEASIBLE; return;}
     int n=A[0].length;
+    if(n == 0) {case=INFEASIBLE; return;}
 
     int count=0;
     for(int i=0; i < m; ++i)
@@ -226,6 +320,9 @@
   
     int k=0;
 
+    bool phase1=false;
+    bool dual=count == m && all(c >= 0);
+
     for(int i=0; i < m; ++i) {
       rational[] ai=a[i];
       for(int j=0; j < k; ++j)
@@ -234,47 +331,32 @@
         ai[n+k]=-s[i];
       for(int j=k+1; j < count; ++j)
         ai[n+j]=0;
-      if(s[i] != 0) ++k;
+      int si=s[i];
+      if(si == 0) phase1=true;
+      else {
+        ++k;
+        rational bi=b[i];
+        if(bi == 0) {
+          if(si == 1) {
+            s[i]=-1;
+            for(int j=0; j < n+count; ++j)
+              ai[j]=-ai[j];
+          }
+        } else if(si*bi > 0) {
+          if(dual && si == 1) {
+            b[i]=-bi;
+            s[i]=-1;
+            for(int j=0; j < n+count; ++j)
+              ai[j]=-ai[j];
+          } else
+            phase1=true;
+        }
+      }
     }
 
-    bool phase1=!all(s == -1);
-    operator init(concat(c,array(count,rational(0))),a,b,phase1);
+    operator init(concat(c,array(count,rational(0))),a,b,phase1,dual);
 
-    if(case == OPTIMAL)
+    if(case == OPTIMAL && count > 0)
       x.delete(n,n+count-1);
   }
 }
-
-/*
-simplex S=simplex(new rational[] {4,1,1},
-                  new rational[][] {{2,1,2},{3,3,1}},
-                  new rational[] {4,3});
-
-simplex S=simplex(new rational[] {2,6,1,1},
-                  new rational[][] {{1,2,0,1},{1,2,1,1},{1,3,-1,2},{1,1,1,0}},
-                  new rational[] {6,7,7,5});
-simplex S=simplex(new rational[] {-10,-12,-12,0,0,0},
-                  new rational[][] {{1,2,2,1,0,0},
-                                    {2,1,2,0,1,0},
-                                    {2,2,1,0,0,1}},
-                  new rational[] {20,20,20});
-
-simplex S=simplex(new rational[] {-10,-12,-12},
-                  new rational[][] {{1,2,2},
-                                    {2,1,2},
-                                    {2,2,1}},
-                  new int[] {0,0,-1},
-                  new rational[] {20,20,20});
-
-simplex S=simplex(new rational[] {1,1,1,0},
-                  new rational[][] {{1,2,3,0},
-                                    {-1,2,6,0},
-                                    {0,4,9,0},
-                                    {0,0,3,1}},
-                  new rational[] {3,2,5,1});
-
-write();
-write("case:",S.case);
-write("x:",S.x);
-write("Cost=",S.cost);
-*/

Added: trunk/Build/source/utils/asymptote/base/shaders/fragment.glsl
===================================================================
--- trunk/Build/source/utils/asymptote/base/shaders/fragment.glsl	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/base/shaders/fragment.glsl	2019-03-27 22:27:57 UTC (rev 50622)
@@ -0,0 +1,85 @@
+struct Material
+{
+  vec4 diffuse,ambient,emissive,specular;
+  float shininess; 
+};
+
+struct Light
+{
+  vec4 direction;
+  vec4 diffuse,ambient,specular;  
+};
+
+uniform int nlights;
+
+uniform Light lights[Nlights];
+
+uniform MaterialBuffer {
+  Material Materials[Nmaterials];
+};
+
+in vec3 Normal;
+
+#ifdef EXPLICIT_COLOR
+in vec4 Color; 
+#endif
+flat in int materialIndex;
+
+out vec4 outColor;
+
+void main()
+{
+  vec4 Diffuse;
+  vec4 Ambient;
+  vec4 Emissive;
+  vec4 Specular;
+  float Shininess;
+
+#ifdef EXPLICIT_COLOR
+  if(materialIndex < 0) {
+    int index=-materialIndex-1;
+    Material m=Materials[index];
+    Diffuse=Color;
+    Ambient=Color;
+    Emissive=vec4(0.0,0.0,0.0,1.0);
+    Specular=m.specular;
+    Shininess=m.shininess;
+  } else {
+    Material m=Materials[materialIndex];
+    Diffuse=m.diffuse;
+    Ambient=m.ambient;
+    Emissive=m.emissive;
+    Specular=m.specular;
+    Shininess=m.shininess;
+  }
+#else
+  Material m=Materials[materialIndex];
+  Diffuse=m.diffuse;
+  Ambient=m.ambient;
+  Emissive=m.emissive;
+  Specular=m.specular;
+  Shininess=m.shininess;
+#endif
+  // Phong-Blinn model
+  if(nlights > 0) {
+    vec3 diffuse=vec3(0,0,0);
+    vec3 specular=vec3(0,0,0);
+    vec3 ambient=vec3(0,0,0);
+    vec3 Z=vec3(0,0,1);
+        
+    for(int i=0; i < nlights; ++i) {
+      vec3 L=normalize(lights[i].direction.xyz);
+      diffuse += lights[i].diffuse.rgb*abs(dot(Normal,L));
+      ambient += lights[i].ambient.rgb;
+      specular += pow(abs(dot(Normal,normalize(L+Z))),Shininess)*
+        lights[i].specular.rgb;
+    }
+
+    vec3 color=diffuse*Diffuse.rgb+
+      ambient*Ambient.rgb+
+      specular*Specular.rgb+
+      Emissive.rgb;
+    outColor=vec4(color,Diffuse[3]);
+  } else
+    outColor=Diffuse;
+}

Added: trunk/Build/source/utils/asymptote/base/shaders/vertex.glsl
===================================================================
--- trunk/Build/source/utils/asymptote/base/shaders/vertex.glsl	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/base/shaders/vertex.glsl	2019-03-27 22:27:57 UTC (rev 50622)
@@ -0,0 +1,34 @@
+in vec3 position;
+in vec3 normal;
+
+#ifdef EXPLICIT_COLOR
+in uint color;
+#endif
+
+in int material;
+
+uniform mat4 projViewMat;
+uniform mat4 viewMat;
+uniform mat4 normMat;
+
+out vec3 ViewPosition;
+out vec3 Normal;
+    
+#ifdef EXPLICIT_COLOR
+out vec4 Color;
+#endif
+
+flat out int materialIndex;
+
+void main()
+{
+  gl_Position=projViewMat*vec4(position,1.0);
+  ViewPosition=(viewMat*vec4(position,1.0)).xyz;
+  Normal=normalize((normMat*vec4(normal,0)).xyz);
+
+#ifdef EXPLICIT_COLOR
+  Color=unpackUnorm4x8(color);
+#endif
+
+  materialIndex=material;
+}

Modified: trunk/Build/source/utils/asymptote/base/simplex.asy
===================================================================
--- trunk/Build/source/utils/asymptote/base/simplex.asy	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/base/simplex.asy	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1,4 +1,4 @@
-// General simplex solver written by John C. Bowman and Pouria Ramazi, 2018.
+// Real simplex solver written by John C. Bowman and Pouria Ramazi, 2018.
 
 struct simplex {
   static int OPTIMAL=0;
@@ -49,7 +49,7 @@
         if(Em[J] < 0) break;
 
       if(J == N)
-        return 0;
+        break;
 
       int I=-1;
       real M;
@@ -65,28 +65,69 @@
         real e=E[i][J];
         if(e > epsilonA) {
           real v=E[i][N]/e;
-          if(v <= M) {M=v; I=i;}
+          if(v < M) {M=v; I=i;} // Bland's rule: choose smallest argmin
         }
       }
       if(I == -1)
         return UNBOUNDED; // Can only happen in Phase 2.
 
+      // Generate new tableau
       Bindices[I]=J;
+      rowreduce(E,N,I,J);
+    }
+    return OPTIMAL;
+  }
 
+  int iterateDual(real[][] E, int N, int[] Bindices) {
+    while(true) {
+      // Find first negative entry in right (basic variable) column
+      real[] Em=E[m];
+      int I;
+      for(I=0; I < m; ++I) {
+        if(E[I][N] < 0) break;
+      }
+
+      if(I == m)
+        break;
+
+      int J=-1;
+      real M;
+      for(int j=0; j < N; ++j) {
+        real e=E[I][j];
+        if(e < epsilonA) {
+          M=-E[m][j]/e;
+          J=j;
+          break;
+        }
+      }
+      for(int j=J+1; j < N; ++j) {
+        real e=E[I][j];
+        if(e < epsilonA) {
+          real v=-E[m][j]/e;
+          if(v < M) {M=v; J=j;} // Bland's rule: choose smallest argmin
+        }
+      }
+      if(J == -1)
+        return INFEASIBLE; // Can only happen in Phase 2.
+
       // Generate new tableau
+      Bindices[I]=J;
       rowreduce(E,N,I,J);
     }
-    return 0;
+    return OPTIMAL;
   }
 
   // Try to find a solution x to Ax=b that minimizes the cost c^T x,
   // where A is an m x n matrix, x is a vector of n non-negative numbers,
   // b is a vector of length m, and c is a vector of length n.
-  void operator init(real[] c, real[][] A, real[] b, bool phase1=true) {
+  // Can set phase1=false if the last m columns of A form the identity matrix.
+  void operator init(real[] c, real[][] A, real[] b, bool phase1=true,
+                     bool dual=false) {
+    if(dual) phase1=false;
     static real epsilon=sqrt(realEpsilon);
     epsilonA=epsilon*norm(A);
 
-    // Phase 1    
+    // Phase 1
     m=A.length;
     if(m == 0) {case=INFEASIBLE; return;}
     n=A[0].length;
@@ -102,7 +143,7 @@
     for(int i=0; i < m; ++i) {
       real[] Ai=A[i];
       real[] Ei=E[i];
-      if(b[i] >= 0) {
+      if(b[i] >= 0 || dual) {
         for(int j=0; j < n; ++j) {
           real Aij=Ai[j];
           Ei[j]=Aij;
@@ -130,7 +171,7 @@
 
     real sum=0;
     for(int i=0; i < m; ++i) {
-      real B=abs(b[i]);
+      real B=dual ? b[i] : abs(b[i]);
       E[i][N]=B;
       sum -= B;
     }
@@ -140,9 +181,10 @@
       for(int j=0; j < m; ++j)
         Em[n+j]=0.0;
    
-    int[] Bindices=sequence(new int(int x){return x;},m)+n;
+    int[] Bindices;
 
     if(phase1) {
+      Bindices=sequence(new int(int x){return x;},m)+n;
       iterate(E,N,Bindices);
   
       if(abs(Em[J]) > epsilonA) {
@@ -149,18 +191,30 @@
       case=INFEASIBLE;
       return;
       }
-    }
+    } else Bindices=sequence(new int(int x){return x;},m)+n-m;
     
+    real[] cB=phase1 ? new real[m] : c[n-m:n];
     real[][] D=phase1 ? new real[m+1][n+1] : E;
-    real[] Dm=D[m];
-    real[] cb=phase1 ? new real[m] : c[n-m:n];
     if(phase1) {
+      // Drive artificial variables out of basis.
+      for(int i=0; i < m; ++i) {
+        int k=Bindices[i];
+        if(k >= n) {
+          real[] Ei=E[i];
+          int j;
+          for(j=0; j < n; ++j)
+            if(Ei[j] != 0) break;
+          if(j == n) continue;
+          Bindices[i]=j;
+          rowreduce(E,n,i,j);
+        }
+      }
       int ip=0; // reduced i
       for(int i=0; i < m; ++i) {
         int k=Bindices[i];
         if(k >= n) continue;
         Bindices[ip]=k; 
-        cb[ip]=c[k];
+        cB[ip]=c[k];
         real[] Dip=D[ip];
         real[] Ei=E[i];
         for(int j=0; j < n; ++j)
@@ -175,27 +229,29 @@
         Dip[j]=Em[j];
       Dip[n]=Em[N];
 
-      m=ip;
-
-      for(int j=0; j < n; ++j) {
-        real sum=0;
-        for(int k=0; k < m; ++k)
-          sum += cb[k]*D[k][j];
-        Dm[j]=c[j]-sum;
+      if(m > ip) {
+        Bindices.delete(ip,m-1);
+        D.delete(ip,m-1);
+        m=ip;
       }
+    }
 
-      // Done with Phase 1
+    real[] Dm=D[m];
+    for(int j=0; j < n; ++j) {
+      real sum=0;
+      for(int k=0; k < m; ++k)
+        sum += cB[k]*D[k][j];
+      Dm[j]=c[j]-sum;
     }
-   
+
     real sum=0;
     for(int k=0; k < m; ++k)
-      sum += cb[k]*D[k][n];
+      sum += cB[k]*D[k][n];
     Dm[n]=-sum;
 
-    if(iterate(D,n,Bindices) == UNBOUNDED) {
-    case=UNBOUNDED;
-    return;
-    }
+    case=(dual ? iterateDual : iterate)(D,n,Bindices);
+    if(case != OPTIMAL)
+      return;
 
     for(int j=0; j < n; ++j)
       x[j]=0;
@@ -204,7 +260,6 @@
       x[Bindices[k]]=D[k][n];
 
     cost=-Dm[n];
-    case=OPTIMAL;
   }
 
   // Try to find a solution x to sgn(Ax-b)=sgn(s) that minimizes the cost
@@ -232,6 +287,9 @@
   
     int k=0;
 
+    bool phase1=false;
+    bool dual=count == m && all(c >= 0);
+
     for(int i=0; i < m; ++i) {
       real[] ai=a[i];
       for(int j=0; j < k; ++j)
@@ -240,14 +298,32 @@
         ai[n+k]=-s[i];
       for(int j=k+1; j < count; ++j)
         ai[n+j]=0;
-      if(s[i] != 0) ++k;
+      int si=s[i];
+      if(si == 0) phase1=true;
+      else {
+        ++k;
+        real bi=b[i];
+        if(bi == 0) {
+          if(si == 1) {
+            s[i]=-1;
+            for(int j=0; j < n+count; ++j)
+              ai[j]=-ai[j];
+          }
+        } else if(si*bi > 0) {
+          if(dual && si == 1) {
+            b[i]=-bi;
+            s[i]=-1;
+            for(int j=0; j < n+count; ++j)
+              ai[j]=-ai[j];
+          } else
+            phase1=true;
+        }
+      }
     }
 
-    //    bool phase1=!all(s == -1); // TODO: Check
-    bool phase1=true;
-    operator init(concat(c,array(count,0.0)),a,b,phase1);
+    operator init(concat(c,array(count,0.0)),a,b,phase1,dual);
 
-    if(case == OPTIMAL)
+    if(case == OPTIMAL && count > 0)
       x.delete(n,n+count-1);
   }
 }

Modified: trunk/Build/source/utils/asymptote/base/three.asy
===================================================================
--- trunk/Build/source/utils/asymptote/base/three.asy	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/base/three.asy	2019-03-27 22:27:57 UTC (rev 50622)
@@ -2021,7 +2021,7 @@
   }
   
   string invalidnormal="invalid normal vector";
-  real fuzz=sqrtEpsilon*max(abs(v1),abs(v2));
+  real fuzz=sqrtEpsilon;
   if(abs(v1.z) > fuzz || abs(v2.z) > fuzz)
     abort(invalidnormal);
   
@@ -2558,23 +2558,6 @@
     Format(t[0][3])+sep+Format(t[1][3])+sep+Format(t[2][3]);
 }
 
-string lightscript(light light) {
-  string script="for(var i=scene.lights.count-1; i >= 0; i--)
-  scene.lights.removeByIndex(i);"+'\n\n';
-  for(int i=0; i < light.position.length; ++i) {
-    string Li="L"+string(i);
-    real[] diffuse=light.diffuse[i];
-    script += Li+"=scene.createLight();"+'\n'+
-      Li+".direction.set("+format(-light.position[i],",")+");"+'\n'+
-      Li+".color.set("+format((diffuse[0],diffuse[1],diffuse[2]),",")+");"+'\n';
-  }
-  // Work around initialization bug in Adobe Reader 8.0:
-  return script +"
-scene.lightScheme=scene.LIGHT_MODE_HEADLAMP;
-scene.lightScheme=scene.LIGHT_MODE_FILE;
-";
-}
-
 void writeJavaScript(string name, string preamble, string script) 
 {
   file out=output(name);
@@ -2625,10 +2608,6 @@
   shipout3(prefix,f);
 
   string name=prefix+".js";
-  // Adobe Reader doesn't appear to support user-specified viewport lights.
-  bool lightscript=light.on() && !light.viewport;
-  if(lightscript)
-    writeJavaScript(name,lightscript(light),script);
 
   if(!settings.inlinetex && !prconly())
     file3.push(prefix+".prc");
@@ -2637,7 +2616,7 @@
   transform3 inv=inverse(flipxz*P.T.modelview);
 
   string options3="3Dlights="+
-    (light.on() ? (light.viewport ? "Headlamp" : "File") : "None");
+    (light.on() ? "Headlamp" : "None");
   if(defaultembed3Doptions != "") options3 += ","+defaultembed3Doptions;
 
   if((settings.render < 0 || !settings.embed) && settings.auto3D)
@@ -2653,8 +2632,6 @@
   if(options != "") options3 += ","+options;
   if(settings.inlinetex)
     prefix=jobname(prefix);
-  if(lightscript)
-    options3 += ",add3Djscript="+prefix+".js";
   options3 += ",add3Djscript=asylabels.js";
 
   return text == "" ? Embed(prefix+".prc","",options3,width,height) :
@@ -2909,7 +2886,7 @@
              P.zoom,m,M,P.viewportshift,
              tinv*inv*shift(0,0,zcenter),Light.background(),Light.position,
              Light.diffuse,Light.ambient,Light.specular,
-             Light.viewport,view && !preview);
+             view && !preview);
     if(!preview) return F;
   }
 

Modified: trunk/Build/source/utils/asymptote/base/three_light.asy
===================================================================
--- trunk/Build/source/utils/asymptote/base/three_light.asy	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/base/three_light.asy	2019-03-27 22:27:57 UTC (rev 50622)
@@ -86,15 +86,22 @@
   real[] Ambient=rgba(m.ambient());
   real[] Specular=rgba(m.specular());
   real[] p=rgba(m.emissive());
+  real[] diffuse={0,0,0,0};
+  real[] ambient={0,0,0,0};
+  real[] specular={0,0,0,0};
   for(int i=0; i < position.length; ++i) {
-    triple L=light.viewport ? position[i] : T*position[i];
-    real Ldotn=max(dot(normal,L),0);
-    p += light.ambient[i]*Ambient+Ldotn*light.diffuse[i]*Diffuse;
-    // Apply specularfactor to partially compensate non-pixel-based rendering.
-    if(Ldotn > 0) // Phong-Blinn model of specular reflection
-      p += dot(normal,unit(L+Z))^s*light.specularfactor*
-        light.specular[i]*Specular;
+    triple L=position[i];
+    real dotproduct=abs(dot(normal,L));
+    diffuse += dotproduct*light.diffuse[i];
+    ambient += light.ambient[i];
+    dotproduct=abs(dot(normal,unit(L+Z)));
+    // Phong-Blinn model of specular reflection
+      specular += dotproduct^s*light.specular[i];
   }
+  p += diffuse*Diffuse;
+  p += ambient*Ambient;
+  // Apply specularfactor to partially compensate non-pixel-based rendering.
+  p += specular*Specular*light.specularfactor;
   return rgb(p[0],p[1],p[2])+opacity(opacity(m.diffuse()));
 }
 
@@ -101,14 +108,12 @@
 light operator * (transform3 t, light light)
 {
   light light=light(light);
-  if(!light.viewport) light.position=shiftless(t)*light.position;
   return light;
 }
 
 light operator cast(triple v) {return light(v);}
 
-light Viewport=light(ambient=gray(0.1),specularfactor=3,viewport=true,
-                     (0.25,-0.25,1));
+light Viewport=light(ambient=gray(0.1),specularfactor=3,(0.25,-0.25,1));
 
 light White=light(new pen[] {rgb(0.38,0.38,0.45),rgb(0.6,0.6,0.67),
                              rgb(0.5,0.5,0.57)},specularfactor=3,
@@ -115,7 +120,7 @@
   new triple[] {(-2,-1.5,-0.5),(2,1.1,-2.5),(-0.5,0,2)});
 
 light Headlamp=light(gray(0.8),ambient=gray(0.1),specular=gray(0.7),
-                     specularfactor=3,viewport=true,dir(42,48));
+                     specularfactor=3,dir(42,48));
 
 currentlight=Headlamp;
 

Modified: trunk/Build/source/utils/asymptote/base/three_surface.asy
===================================================================
--- trunk/Build/source/utils/asymptote/base/three_surface.asy	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/base/three_surface.asy	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1409,11 +1409,32 @@
      PRCshininess,s.colors,interaction.type,prc);
 }
 
+int computeNormals(triple[] v, int[][] vi, triple[] n, int[][] ni)
+{
+  triple lastnormal=O;
+  for(int i=0; i < vi.length; ++i) {
+    int[] vii=vi[i];
+    int[] nii=ni[i];
+    triple normal=normal(new triple[] {v[vii[0]],v[vii[1]],v[vii[2]]});
+    if(normal != lastnormal || n.length == 0) {
+      n.push(normal);
+      lastnormal=normal;
+    }
+    nii[0]=nii[1]=nii[2]=n.length-1;
+  }
+  return ni.length;
+}
+
 // Draw triangles on a frame.
 void draw(frame f, triple[] v, int[][] vi,
           triple[] n={}, int[][] ni={}, material m=currentpen, pen[] p={},
           int[][] pi={}, light light=currentlight)
 {
+  bool normals=ni.length > 0;
+  if(!normals) {
+    ni=new int[vi.length][3];
+    normals=computeNormals(v,vi,n,ni) > 0;
+  }
   if(p.length > 0)
     m=mean(p);
   m=material(m,light);
@@ -1428,23 +1449,12 @@
           triple[] n={}, int[][] ni={}, material m=currentpen, pen[] p={},
           int[][] pi={}, light light=currentlight)
 {
-  bool colors=pi.length > 0;
   bool normals=ni.length > 0;
-  if(!colors && !normals) {
-    n=new triple[];
+  if(!normals) {
     ni=new int[vi.length][3];
-    triple lastnormal=O;
-    for(int i=0; i < vi.length; ++i) {
-      int[] vii=vi[i];
-      int[] nii=ni[i];
-      triple normal=normal(new triple[] {v[vii[0]],v[vii[1]],v[vii[2]]});
-      if(normal != lastnormal || n.length == 0) {
-        n.push(normal);
-        lastnormal=normal;
-      }
-      nii[0]=nii[1]=nii[2]=n.length-1;
-    }
+    normals=computeNormals(v,vi,n,ni) > 0;
   }
+  bool colors=pi.length > 0;
 
   pic.add(new void(frame f, transform3 t, picture pic, projection P) {
       triple[] v=t*v;

Modified: trunk/Build/source/utils/asymptote/bbox.h
===================================================================
--- trunk/Build/source/utils/asymptote/bbox.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/bbox.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -9,6 +9,7 @@
 #define BBOX_H
 
 #include "pair.h"
+#include "settings.h"
 
 namespace camp {
 
@@ -222,6 +223,20 @@
   }
 }
 
+inline bbox svgbbox(const bbox& B, pair shift=pair(0,0))
+{
+  bbox b=B;
+  double height=b.top-b.bottom;
+  double threshold=12.0*settings::tex2ps;
+  if(height < threshold) {
+    double offset=threshold-height;
+    b.top += offset;
+    b.bottom += offset;
+  }
+  b.shift(pair(1.99*settings::cm,1.9*settings::cm)+shift);
+  return b;
+}
+
 } // namespace camp
 
 GC_DECLARE_PTRFREE(camp::bbox);

Modified: trunk/Build/source/utils/asymptote/beziercurve.cc
===================================================================
--- trunk/Build/source/utils/asymptote/beziercurve.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/beziercurve.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -5,6 +5,7 @@
  * Render a Bezier curve.
  *****/
 
+#include "bezierpatch.h"
 #include "beziercurve.h"
 
 namespace camp {
@@ -11,9 +12,15 @@
 
 #ifdef HAVE_GL
 
-std::vector<GLfloat> BezierCurve::buffer;
+extern GLint noColorShader;
+extern void setUniforms(GLint shader); 
+
+std::vector<vertexData1> BezierCurve::vertexbuffer;
 std::vector<GLuint> BezierCurve::indices;
 
+GLuint BezierCurve::vertsBufferIndex;
+GLuint BezierCurve::elemBufferIndex;
+
 void BezierCurve::init(double res, const triple& Min, const triple& Max)
 {
   this->res=res;
@@ -22,7 +29,7 @@
   this->Max=Max;
 
   const size_t nbuffer=10000;
-  buffer.reserve(nbuffer);
+  vertexbuffer.reserve(nbuffer);
   indices.reserve(nbuffer);
 }
 
@@ -74,15 +81,85 @@
   
 void BezierCurve::draw()
 {
-  size_t stride=3*sizeof(GLfloat);
+  const size_t size=sizeof(GLfloat);
+  static const size_t bytestride=sizeof(vertexData1);
 
-  glEnableClientState(GL_VERTEX_ARRAY);
-  glVertexPointer(3,GL_FLOAT,stride,&buffer[0]);
-  glDrawElements(GL_LINES,indices.size(),GL_UNSIGNED_INT,&indices[0]);
-  glDisableClientState(GL_VERTEX_ARRAY);
+  GLuint vao;
+  glGenVertexArrays(1,&vao);
+  glBindVertexArray(vao);
+
+  createBuffers();
+    
+  camp::setUniforms(noColorShader); 
+  
+  const GLint posAttrib=glGetAttribLocation(noColorShader, "position");
+  const GLint materialAttrib=glGetAttribLocation(noColorShader,"material");
+
+  glBindBuffer(GL_ARRAY_BUFFER,vertsBufferIndex);
+  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,elemBufferIndex);
+
+  glVertexAttribPointer(posAttrib,3,GL_FLOAT,GL_FALSE,bytestride,(void *) 0);
+  glEnableVertexAttribArray(posAttrib);
+
+  glVertexAttribIPointer(materialAttrib,1,GL_INT,bytestride,(void *) (3*size));
+  glEnableVertexAttribArray(materialAttrib);
+
+  glFlush(); // Workaround broken MSWindows drivers for Intel GPU
+  glDrawElements(GL_LINES,indices.size(),GL_UNSIGNED_INT,(void*)(0));
+  
+  glDisableVertexAttribArray(posAttrib);
+  glDisableVertexAttribArray(materialAttrib);
+  
+  glBindBuffer(GL_ARRAY_BUFFER,0);
+  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+  glUseProgram(0);
+
+  glBindVertexArray(0);
+  glDeleteVertexArrays(1,&vao);
+  
   clear();
 }
 
+void Pixel::draw(const triple& p)
+{
+  vertexData1 point(p);
+
+  const size_t size=sizeof(GLfloat);
+  static const size_t bytestride=sizeof(vertexData1);
+
+  GLuint vbo;
+  glGenBuffers(1,&vbo);
+  
+  GLuint vao;
+  glGenVertexArrays(1,&vao);
+  glBindVertexArray(vao);
+
+  camp::setUniforms(noColorShader); 
+  
+  const GLint posAttrib=glGetAttribLocation(noColorShader, "position");
+  const GLint materialAttrib=glGetAttribLocation(noColorShader,"material");
+
+  glBindBuffer(GL_ARRAY_BUFFER,vbo);
+  glBufferData(GL_ARRAY_BUFFER,bytestride,&point,GL_STATIC_DRAW);
+
+  glVertexAttribPointer(posAttrib,3,GL_FLOAT,GL_FALSE,0,(void*)(0));
+  glEnableVertexAttribArray(posAttrib);
+  
+  glVertexAttribIPointer(materialAttrib,1,GL_INT,bytestride,(void *) (3*size));
+  glEnableVertexAttribArray(materialAttrib);
+  
+  glDrawArrays(GL_POINTS,0,1);
+
+  glDisableVertexAttribArray(posAttrib);
+  glDisableVertexAttribArray(materialAttrib);
+  
+  glBindBuffer(GL_ARRAY_BUFFER,0);
+  glUseProgram(0);
+
+  glBindVertexArray(0);
+  glDeleteVertexArrays(1,&vao);
+}
+
 #endif
 
 } //namespace camp

Modified: trunk/Build/source/utils/asymptote/beziercurve.h
===================================================================
--- trunk/Build/source/utils/asymptote/beziercurve.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/beziercurve.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -17,13 +17,29 @@
 extern const double Fuzz;
 extern const double Fuzz2;
 
+class vertexData1 {
+public:
+  GLfloat position[3];
+  GLint  material;
+  vertexData1() {};
+  vertexData1(const triple& v) {
+    position[0]=v.getx();
+    position[1]=v.gety();
+    position[2]=v.getz();
+    material=drawElement::materialIndex;
+  }
+};
+
 struct BezierCurve
 {
-  static std::vector<GLfloat> buffer;
+  static std::vector<vertexData1> vertexbuffer;
   static std::vector<GLuint> indices;
   GLuint nvertices;
   double res,res2;
   triple Min,Max;
+
+  static GLuint vertsBufferIndex; 
+  static GLuint elemBufferIndex; 
   
   BezierCurve() : nvertices(0) {}
   
@@ -31,12 +47,21 @@
     
 // Store the vertex v in the buffer.
   GLuint vertex(const triple &v) {
-    buffer.push_back(v.getx());
-    buffer.push_back(v.gety());
-    buffer.push_back(v.getz());
+    vertexbuffer.push_back(vertexData1(v));
     return nvertices++;
   }
   
+  void createBuffers() {
+    glGenBuffers(1,&vertsBufferIndex);
+    glGenBuffers(1,&elemBufferIndex);
+
+    //vbo
+    registerBuffer(vertexbuffer,vertsBufferIndex);
+
+    //ebo
+    registerBuffer(indices,elemBufferIndex);
+  }
+  
 // Approximate bounds by bounding box of control polyhedron.
   bool offscreen(size_t n, const triple *v) {
     double x,y,z;
@@ -51,13 +76,14 @@
   
   void clear() {
     nvertices=0;
-    buffer.clear();
+    vertexbuffer.clear();
     indices.clear();
+    
+    glDeleteBuffers(1,&vertsBufferIndex);
+    glDeleteBuffers(1,&elemBufferIndex);
   }
   
-  ~BezierCurve() {
-    clear();
-  }
+  ~BezierCurve() {}
   
   void render(const triple *p, GLuint I0, GLuint I1);
   void render(const triple *p, bool straight);
@@ -76,6 +102,14 @@
   }
 };
 
+struct Pixel
+{
+  Pixel() {}
+  ~Pixel() {}
+  
+  void draw(const triple& p);
+};
+
 #endif
 
 } //namespace camp

Modified: trunk/Build/source/utils/asymptote/bezierpatch.cc
===================================================================
--- trunk/Build/source/utils/asymptote/bezierpatch.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/bezierpatch.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -13,23 +13,31 @@
 using ::orient2d;
 using ::orient3d;
 
-size_t tstride;
+#ifdef HAVE_GL
 
-double viewpoint[3];
 
-#ifdef HAVE_GL
+//FIXME: Find a nicer way to pass the shader program number,
+// preferably without global variables...
 
-std::vector<GLfloat> BezierPatch::buffer;
-std::vector<GLfloat> BezierPatch::Buffer;
+extern GLint noColorShader;
+extern GLint colorShader;
+extern void setUniforms(GLint shader); 
+
+const size_t nbuffer=10000; // Initial size of dynamic buffers
+
+std::vector<vertexData> BezierPatch::vertexbuffer;
+std::vector<VertexData> BezierPatch::Vertexbuffer;
+std::vector<VertexData> BezierPatch::tVertexbuffer;
 std::vector<GLuint> BezierPatch::indices;
 std::vector<GLuint> BezierPatch::Indices;
-std::vector<GLfloat> BezierPatch::tbuffer;
-std::vector<GLuint> BezierPatch::tindices;
-std::vector<GLfloat> BezierPatch::tBuffer;
 std::vector<GLuint> BezierPatch::tIndices;
 
-std::vector<GLuint>& I=BezierPatch::tIndices;
-std::vector<GLfloat>& V=BezierPatch::tBuffer;
+GLuint BezierPatch::nvertices=0;
+GLuint BezierPatch::Nvertices=0;
+GLuint BezierPatch::Ntvertices=0;
+
+//std::vector<GLuint>& I=BezierPatch::tIndices;
+//std::vector<VertexData>& V=BezierPatch::tVertexbuffer;
 bool colors;
 
 std::vector<GLfloat> zbuffer;
@@ -63,11 +71,6 @@
 
 std::vector<iz> IZ;
 
-GLuint BezierPatch::nvertices=0;
-GLuint BezierPatch::ntvertices=0;
-GLuint BezierPatch::Nvertices=0;
-GLuint BezierPatch::Ntvertices=0;
-
 extern const double Fuzz2;
 
 const double FillFactor=0.1;
@@ -196,7 +199,6 @@
 
 unsigned n;
 unsigned int count;
-const size_t nbuffer=10000;
   
 // Sort nonintersecting triangles by depth.
 int compare(const void *p, const void *P)
@@ -249,6 +251,7 @@
   */
 }
 
+#if 0
 void split(unsigned i3, GLuint ia, GLuint ib, GLuint ic,
            double *a, double *b, double *c, double *N, double *A) {
   double td=intersect(a,b,N,A);
@@ -282,8 +285,8 @@
     id=BezierPatch::tVertex(d,nd,cd);
     ie=BezierPatch::tVertex(e,ne,ce);
   } else {
-    id=BezierPatch::tvertex(d,nd);
-    ie=BezierPatch::tvertex(e,ne);
+    id=BezierPatch::tVertex(d,nd);
+    ie=BezierPatch::tVertex(e,ne);
   }
       
   I[i3]=ia;
@@ -298,6 +301,7 @@
   I.push_back(ib);
   I.push_back(ic);
 }
+#endif
 
 void BezierPatch::init(double res, const triple& Min, const triple& Max,
                        bool transparent, GLfloat *colors)
@@ -305,31 +309,27 @@
   res2=res*res;
   Res2=BezierFactor*BezierFactor*res2;
   Epsilon=FillFactor*res;
+
   this->Min=Min;
   this->Max=Max;
-  
-  const size_t nbuffer=10000;
-  indices.reserve(nbuffer);
+
   if(transparent) {
-    tbuffer.reserve(nbuffer);
-    tindices.reserve(nbuffer);
-    pindices=&tindices;
+    tVertexbuffer.reserve(nbuffer);
+    tIndices.reserve(nbuffer);
+    pindices=&tIndices;
     pvertex=&tvertex;
-    if(colors) {
-      tBuffer.reserve(nbuffer);
-      tIndices.reserve(nbuffer);
-      pindices=&tIndices;
-      pVertex=&tVertex;
-    }
+    pVertex=&tVertex;
   } else {
-    buffer.reserve(nbuffer);
-    pindices=&indices;
-    pvertex=&vertex;
     if(colors) {
-      Buffer.reserve(nbuffer);
+      Vertexbuffer.reserve(nbuffer);
       Indices.reserve(nbuffer);
       pindices=&Indices;
       pVertex=&Vertex;
+    } else {
+      vertexbuffer.reserve(nbuffer);
+      indices.reserve(nbuffer);
+      pindices=&indices;
+      pvertex=&vertex;
     }
   }
 }
@@ -830,20 +830,19 @@
   }
 }
 
-void transform(const std::vector<GLfloat>& b)
+void transform(const std::vector<VertexData>& b)
 {
-  unsigned n=b.size()/tstride;
+  unsigned n=b.size();
 //  xbuffer.resize(n);
 //  ybuffer.resize(n);
   zbuffer.resize(n);
   
   for(unsigned i=0; i < n; ++i) {
-    unsigned j=tstride*i;
+    const GLfloat *v=b[i].position;
 //    xbuffer[i]=Tx[0]*b[j]+Tx[1]*b[j+1]+Tx[2]*b[j+2];
 //    ybuffer[i]=Ty[0]*b[j]+Ty[1]*b[j+1]+Ty[2]*b[j+2];
-    zbuffer[i]=Tz[0]*b[j]+Tz[1]*b[j+1]+Tz[2]*b[j+2];
+    zbuffer[i]=Tz[0]*v[0]+Tz[1]*v[1]+Tz[2]*v[2];
   }
-  
 }
 
 // precompute min and max bounds of each triangle
@@ -850,10 +849,13 @@
 void bounds(const std::vector<GLuint>& I)
 {
   unsigned n=I.size()/3;
+/*  
   xmin.resize(n);
   xmax.resize(n);
   ymin.resize(n);
   ymax.resize(n);
+*/
+  
   zmin.resize(n);
   zmax.resize(n);
   
@@ -863,6 +865,8 @@
     unsigned Ib=I[i3+1];
     unsigned Ic=I[i3+2];
     
+    
+    /*
     double xa=xbuffer[Ia];
     double xb=xbuffer[Ib];
     double xc=xbuffer[Ic];
@@ -870,16 +874,19 @@
     double ya=ybuffer[Ia];
     double yb=ybuffer[Ib];
     double yc=ybuffer[Ic];
+    */
     
     double za=zbuffer[Ia];
     double zb=zbuffer[Ib];
     double zc=zbuffer[Ic];
     
+    /*
     xmin[i]=min(xa,xb,xc);
     xmax[i]=max(xa,xb,xc);
     
     ymin[i]=min(ya,yb,yc);
     ymax[i]=max(ya,yb,yc);
+    */
     
     zmin[i]=min(za,zb,zc);
     zmax[i]=max(za,zb,zc);
@@ -886,72 +893,231 @@
   }
 }
   
-void BezierPatch::draw()
+void BezierPatch::drawMaterials()
 {
-  if(nvertices == 0 && ntvertices == 0 && Nvertices == 0 && Ntvertices == 0)
+  if(nvertices == 0)
     return;
   
-  const size_t stride=6;
-  const size_t Stride=10;
-  const size_t size=sizeof(GLfloat);
-  const size_t bytestride=stride*size;
-  const size_t Bytestride=Stride*size;
+  static const size_t size=sizeof(GLfloat);
+  static const size_t bytestride=sizeof(vertexData);
+
+  GLuint vertsBufferIndex; 
+  GLuint elemBufferIndex; 
+  
+  GLuint vao;
+  
+  glGenVertexArrays(1,&vao);
+  glBindVertexArray(vao);
+
+  glGenBuffers(1,&vertsBufferIndex);
+  glGenBuffers(1,&elemBufferIndex);
+  
+  registerBuffer(vertexbuffer,vertsBufferIndex);
+  registerBuffer(indices,elemBufferIndex);
+  
+  camp::setUniforms(noColorShader); 
+
+  const GLint posAttrib=glGetAttribLocation(noColorShader,"position");
+  const GLint normalAttrib=glGetAttribLocation(noColorShader,"normal");
+  const GLint materialAttrib=glGetAttribLocation(noColorShader,"material");
+  
+  glBindBuffer(GL_ARRAY_BUFFER,vertsBufferIndex);
+  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,elemBufferIndex);
+
+  glVertexAttribPointer(posAttrib,3,GL_FLOAT,GL_FALSE,bytestride,(void *) 0);
+  glEnableVertexAttribArray(posAttrib);
     
-  glEnableClientState(GL_NORMAL_ARRAY);
-  glEnableClientState(GL_VERTEX_ARRAY);
+  glVertexAttribPointer(normalAttrib,3,GL_FLOAT,GL_FALSE,bytestride,
+                        (void *) (3*size));
+  glEnableVertexAttribArray(normalAttrib);
+
+  glVertexAttribIPointer(materialAttrib,1,GL_INT,bytestride, 
+                         (void *) (6*size));
+  glEnableVertexAttribArray(materialAttrib);
+
+  glFlush(); // Workaround broken MSWindows drivers for Intel GPU
+  glDrawElements(GL_TRIANGLES,indices.size(),GL_UNSIGNED_INT,(void *) 0);
+
+  glDisableVertexAttribArray(posAttrib);
+  glDisableVertexAttribArray(normalAttrib);
+  glDisableVertexAttribArray(materialAttrib);
+
+  glBindBuffer(GL_ARRAY_BUFFER,0);
+  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+  glUseProgram(0);
+
+  glBindVertexArray(0);
+  glDeleteVertexArrays(1,&vao);
   
-  if(nvertices > 0) {
-    glVertexPointer(3,GL_FLOAT,bytestride,&buffer[0]);
-    glNormalPointer(GL_FLOAT,bytestride,&buffer[3]);
-    glDrawElements(GL_TRIANGLES,indices.size(),GL_UNSIGNED_INT,&indices[0]);
-  }
+  nvertices=0;
+  vertexbuffer.clear();
+  indices.clear();
   
-  if(Nvertices > 0) {
-    glEnableClientState(GL_COLOR_ARRAY);
-    glEnable(GL_COLOR_MATERIAL);
-    glVertexPointer(3,GL_FLOAT,Bytestride,&Buffer[0]);
-    glNormalPointer(GL_FLOAT,Bytestride,&Buffer[3]);
-    glColorPointer(4,GL_FLOAT,Bytestride,&Buffer[6]);
-    glDrawElements(GL_TRIANGLES,Indices.size(),GL_UNSIGNED_INT,&Indices[0]);
-    glDisable(GL_COLOR_MATERIAL);
-    glDisableClientState(GL_COLOR_ARRAY);
-  }
+  glDeleteBuffers(1,&vertsBufferIndex);
+  glDeleteBuffers(1,&elemBufferIndex);
+}
+
+void BezierPatch::drawColors(GLuint& Nvertices,
+                             std::vector<VertexData>& Vertexbuffer,
+                             std::vector<GLuint>& Indices)
+{
+  if(Nvertices == 0)
+    return;
+
+  static const size_t size=sizeof(GLfloat);
+  static const size_t bytestride=sizeof(VertexData);
+
+  GLuint vertsBufferIndex; 
+  GLuint elemBufferIndex; 
   
-  if(ntvertices > 0) {
-    tstride=stride;
-    transform(tbuffer); 
-//    bounds(tindices);
+  GLuint vao;
+  
+  glGenVertexArrays(1,&vao);
+  glBindVertexArray(vao);
+
+  glGenBuffers(1,&vertsBufferIndex);
+  glGenBuffers(1,&elemBufferIndex);
+  
+  registerBuffer(Vertexbuffer,vertsBufferIndex);
+  registerBuffer(Indices,elemBufferIndex);
+  
+  camp::setUniforms(colorShader); 
+
+  const GLint posAttrib=glGetAttribLocation(colorShader,"position");
+  const GLint normalAttrib=glGetAttribLocation(colorShader,"normal");
+  const GLint colorAttrib=glGetAttribLocation(colorShader,"color");
+  const GLint materialAttrib=glGetAttribLocation(colorShader,"material");
+  
+  glBindBuffer(GL_ARRAY_BUFFER,vertsBufferIndex);
+  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,elemBufferIndex);
+
+  glVertexAttribPointer(posAttrib,3,GL_FLOAT,GL_FALSE,bytestride,
+                        (void *) 0);
+  glEnableVertexAttribArray(posAttrib);
+
+  glVertexAttribPointer(normalAttrib,3,GL_FLOAT,GL_FALSE,bytestride,
+                        (void *) (3*size));
+  glEnableVertexAttribArray(normalAttrib);
+
+  glVertexAttribIPointer(colorAttrib,1,GL_UNSIGNED_INT,bytestride,
+                         (void *) (6*size));
+  glEnableVertexAttribArray(colorAttrib);
+
+  glVertexAttribIPointer(materialAttrib,1,GL_INT,bytestride,
+                         (void *) (6*size+sizeof(GLuint)));
+  glEnableVertexAttribArray(materialAttrib);
     
-    qsort(&tindices[0],tindices.size()/3,3*sizeof(GLuint),compare);
-      
-    glVertexPointer(3,GL_FLOAT,bytestride,&tbuffer[0]);
-    glNormalPointer(GL_FLOAT,bytestride,&tbuffer[3]);
-    glDrawElements(GL_TRIANGLES,tindices.size(),GL_UNSIGNED_INT,&tindices[0]);
-  }
+  glFlush(); // Workaround broken MSWindows drivers for Intel GPU
+  glDrawElements(GL_TRIANGLES,Indices.size(),GL_UNSIGNED_INT,(void *) 0);
+
+  glDisableVertexAttribArray(posAttrib);
+  glDisableVertexAttribArray(normalAttrib);
+  glDisableVertexAttribArray(colorAttrib);
+  glDisableVertexAttribArray(materialAttrib);
+
+  glBindBuffer(GL_ARRAY_BUFFER,0);
+  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+  glUseProgram(0);
+
+  glBindVertexArray(0);
+  glDeleteVertexArrays(1,&vao);
   
+  Nvertices=0;
+  Vertexbuffer.clear();
+  Indices.clear();
+  
+  glDeleteBuffers(1,&vertsBufferIndex);
+  glDeleteBuffers(1,&elemBufferIndex);
+}
+
+void BezierPatch::sortTriangles()
+{
   if(Ntvertices > 0) {
-    tstride=Stride;
-    transform(tBuffer);
-//    bounds(tIndices);
-    
+    transform(tVertexbuffer);
+    bounds(tIndices);
     qsort(&tIndices[0],tIndices.size()/3,3*sizeof(GLuint),compare);
-    
-    glEnableClientState(GL_COLOR_ARRAY);
-    glEnable(GL_COLOR_MATERIAL);
-    glVertexPointer(3,GL_FLOAT,Bytestride,&tBuffer[0]);
-    glNormalPointer(GL_FLOAT,Bytestride,&tBuffer[3]);
-    glColorPointer(4,GL_FLOAT,Bytestride,&tBuffer[6]);
-    glDrawElements(GL_TRIANGLES,tIndices.size(),GL_UNSIGNED_INT,&tIndices[0]);
-    glDisable(GL_COLOR_MATERIAL);
-    glDisableClientState(GL_COLOR_ARRAY);
   }
-  
-  glDisableClientState(GL_VERTEX_ARRAY);
-  glDisableClientState(GL_NORMAL_ARRAY);
-  
-  clear();
 }
 
+void Triangles::queue(size_t nP, triple* P, size_t nN, triple* N,
+                      size_t nC, prc::RGBAColour* C, size_t nI,
+                      uint32_t (*PI)[3], uint32_t (*NI)[3], uint32_t (*CI)[3],
+                      bool transparent)
+{
+  if(!nN) return;
+  const size_t indexstride=3;
+  size_t nindices=indexstride*nI;
+  size_t index0;
+
+  if(transparent) {
+    tVertexbuffer.reserve(nbuffer);
+    tVertexbuffer.resize(Ntvertices+nP);
+    tIndices.reserve(nbuffer);
+    index0=tIndices.size();
+    tIndices.resize(index0+nindices);
+  } else {
+    if(nC) {
+      Vertexbuffer.reserve(nbuffer);
+      Vertexbuffer.resize(Nvertices+nP);
+      Indices.reserve(nbuffer);
+      index0=Indices.size();
+      Indices.resize(index0+nindices);
+    } else {
+      vertexbuffer.reserve(nbuffer);
+      vertexbuffer.resize(nvertices+nP);
+      indices.reserve(nbuffer);
+      index0=indices.size();
+      indices.resize(index0+nindices);
+    }
+  }
+
+  uint32_t *P0=(uint32_t *) PI;
+  uint32_t *N0=(uint32_t *) NI;
+  uint32_t *C0=(uint32_t *) CI;
+
+  if(transparent) {
+    if(nC) {
+      for(size_t i=0; i < nindices; ++i) {
+        uint32_t i0=P0[i];
+        prc::RGBAColour c=C[C0[i]];
+        GLfloat c0[]={(GLfloat) c.R,(GLfloat) c.G,(GLfloat) c.B,(GLfloat) c.A};
+        GLuint index=Ntvertices+i0;
+        tVertexbuffer[index]=VertexData(P[i0],N[N0[i]],c0);
+        tIndices[index0+i]=index;
+      }
+    } else {
+      for(size_t i=0; i < nindices; ++i) {
+        uint32_t i0=P0[i];
+        GLuint index=Ntvertices+i0;
+        tVertexbuffer[index]=VertexData(P[i0],N[N0[i]]);
+        tIndices[index0+i]=index;
+      }
+    }
+    Ntvertices += nP;
+  } else {
+    if(nC) {
+      for(size_t i=0; i < nindices; ++i) {
+        uint32_t i0=P0[i];
+        prc::RGBAColour c=C[C0[i]];
+        GLfloat c0[]={(GLfloat) c.R,(GLfloat) c.G,(GLfloat) c.B,
+                      (GLfloat) c.A};
+        GLuint index=Nvertices+i0;
+        Vertexbuffer[index]=VertexData(P[i0],N[N0[i]],c0);
+        Indices[index0+i]=index;
+      }
+      Nvertices += nP;
+    } else {
+      for(size_t i=0; i < nindices; ++i) {
+        uint32_t i0=P0[i];
+        GLuint index=nvertices+i0;
+        vertexbuffer[index]=vertexData(P[i0],N[N0[i]]);
+        indices[index0+i]=index;
+      }
+      nvertices += nP;
+    }
+  }
+}
+ 
 #endif
 
 } //namespace camp

Modified: trunk/Build/source/utils/asymptote/bezierpatch.h
===================================================================
--- trunk/Build/source/utils/asymptote/bezierpatch.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/bezierpatch.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -14,25 +14,76 @@
 
 #ifdef HAVE_GL
 
-extern int sign;
-
 extern const double Fuzz;
 extern const double Fuzz2;
 
+class vertexData {
+public:
+  GLfloat position[3];
+  GLfloat normal[3];
+  GLint  material;
+  vertexData() {};
+  vertexData(const triple& v, const triple& n) {
+    position[0]=v.getx();
+    position[1]=v.gety();
+    position[2]=v.getz();
+    normal[0]=n.getx();
+    normal[1]=n.gety();
+    normal[2]=n.getz();
+    material=drawElement::materialIndex;
+  }
+};
+
+class VertexData {
+public:
+  GLfloat position[3];
+  GLfloat normal[3];
+  GLuint color;
+  GLint  material;
+  VertexData() {};
+  VertexData(const triple& v, const triple& n) {
+    position[0]=v.getx();
+    position[1]=v.gety();
+    position[2]=v.getz();
+    normal[0]=n.getx();
+    normal[1]=n.gety();
+    normal[2]=n.getz();
+    color=0;
+    material=drawElement::materialIndex;
+  }
+  VertexData(const triple& v, const triple& n, GLfloat *c) {
+    position[0]=v.getx();
+    position[1]=v.gety();
+    position[2]=v.getz();
+    normal[0]=n.getx();
+    normal[1]=n.gety();
+    normal[2]=n.getz();
+    color=glm::packUnorm4x8(glm::vec4(c[0],c[1],c[2],c[3]));
+    material=-(int) drawElement::materialIndex-1; // request explicit color
+  }
+
+};
+
 struct BezierPatch
 {
-  static std::vector<GLfloat> buffer;
-  static std::vector<GLfloat> Buffer;
+  static std::vector<vertexData> vertexbuffer;
+  static std::vector<VertexData> Vertexbuffer;
+  static std::vector<VertexData> tVertexbuffer; // for transparent surfaces
   static std::vector<GLuint> indices;
   static std::vector<GLuint> Indices;
-  static std::vector<GLfloat> tbuffer;
-  static std::vector<GLuint> tindices;
-  static std::vector<GLfloat> tBuffer;
   static std::vector<GLuint> tIndices;
   static GLuint nvertices;
-  static GLuint ntvertices;
   static GLuint Nvertices;
   static GLuint Ntvertices;
+  
+  static GLuint vertsBufferIndex; 
+  static GLuint VertsBufferIndex; 
+  static GLuint tVertsBufferIndex; 
+  
+  static GLuint elemBufferIndex; 
+  static GLuint ElemBufferIndex; 
+  static GLuint tElemBufferIndex; 
+  
   std::vector<GLuint> *pindices;
   triple u,v,w;
   double epsilon;
@@ -52,57 +103,23 @@
     
 // Store the vertex v and its normal vector n in the buffer.
   static GLuint vertex(const triple &v, const triple& n) {
-    buffer.push_back(v.getx());
-    buffer.push_back(v.gety());
-    buffer.push_back(v.getz());
-    
-    buffer.push_back(n.getx());
-    buffer.push_back(n.gety());
-    buffer.push_back(n.getz());
+    vertexbuffer.push_back(vertexData(v,n));
     return nvertices++;
   }
   
-  static GLuint tvertex(const triple &v, const triple& n) {
-    tbuffer.push_back(v.getx());
-    tbuffer.push_back(v.gety());
-    tbuffer.push_back(v.getz());
-    
-    tbuffer.push_back(n.getx());
-    tbuffer.push_back(n.gety());
-    tbuffer.push_back(n.getz());
-    return ntvertices++;
-  }
-  
 // Store the vertex v and its normal vector n and colour c in the buffer.
   static GLuint Vertex(const triple& v, const triple& n, GLfloat *c) {
-    Buffer.push_back(v.getx());
-    Buffer.push_back(v.gety());
-    Buffer.push_back(v.getz());
-    
-    Buffer.push_back(n.getx());
-    Buffer.push_back(n.gety());
-    Buffer.push_back(n.getz());
-    
-    Buffer.push_back(c[0]);
-    Buffer.push_back(c[1]);
-    Buffer.push_back(c[2]);
-    Buffer.push_back(c[3]);
+    Vertexbuffer.push_back(VertexData(v,n,c));
     return Nvertices++;
   }
   
+  static GLuint tvertex(const triple &v, const triple& n) {
+    tVertexbuffer.push_back(VertexData(v,n));
+    return Ntvertices++;
+  }
+  
   static GLuint tVertex(const triple& v, const triple& n, GLfloat *c) {
-    tBuffer.push_back(v.getx());
-    tBuffer.push_back(v.gety());
-    tBuffer.push_back(v.getz());
-    
-    tBuffer.push_back(n.getx());
-    tBuffer.push_back(n.gety());
-    tBuffer.push_back(n.getz());
-    
-    tBuffer.push_back(c[0]);
-    tBuffer.push_back(c[1]);
-    tBuffer.push_back(c[2]);
-    tBuffer.push_back(c[3]);
+    tVertexbuffer.push_back(VertexData(v,n,c));
     return Ntvertices++;
   }
   
@@ -189,19 +206,7 @@
       Y < Min.gety() || y > Max.gety() ||
       Z < Min.getz() || z > Max.getz();
   }
-  
-  void clear() {
-    nvertices=ntvertices=Nvertices=Ntvertices=0;
-    buffer.clear();
-    indices.clear();
-    Buffer.clear();
-    Indices.clear();
-    tbuffer.clear();
-    tindices.clear();
-    tBuffer.clear();
-    tIndices.clear();
-  }
-  
+
   ~BezierPatch() {}
   
   void render(const triple *p,
@@ -219,13 +224,33 @@
     render(g,straight,colors);
   }
   
-  void draw();
-  void draw(const triple *g, bool straight, double ratio,
-            const triple& Min, const triple& Max, bool transparent,
-            GLfloat *colors=NULL) {
-    queue(g,straight,ratio,Min,Max,transparent,colors);
-    draw();
+  void drawMaterials();
+  void drawColors(GLuint& Nvertices,
+                  std::vector<VertexData>& Vertexbuffer,
+                  std::vector<GLuint>& Indices);
+  void sortTriangles();
+  
+  void drawColors() {
+    drawColors(Nvertices,Vertexbuffer,Indices);
   }
+    
+  void drawOpaque() {
+    drawMaterials();
+    drawColors();
+  }
+    
+  void drawTransparent() {
+    glDepthMask(GL_FALSE);
+    sortTriangles();
+    drawColors(Ntvertices,tVertexbuffer,tIndices);
+    glDepthMask(GL_TRUE);
+  }
+  
+  void draw() {
+    drawOpaque();
+    drawTransparent();
+  }
+  
 };
 
 struct BezierTriangle : public BezierPatch {
@@ -255,6 +280,17 @@
 };
 
 
+struct Triangles : public BezierPatch {
+public:
+  Triangles() : BezierPatch() {}
+
+  void queue(size_t nP, triple* P, size_t nN, triple* N,
+             size_t nC, prc::RGBAColour* C, size_t nI,
+             uint32_t (*PI)[3], uint32_t (*NI)[3], uint32_t (*CI)[3],
+             bool transparent);
+};
+
+
 #endif
 
 } //namespace camp

Modified: trunk/Build/source/utils/asymptote/build-scripts/HOWTO-MSWindows
===================================================================
--- trunk/Build/source/utils/asymptote/build-scripts/HOWTO-MSWindows	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/build-scripts/HOWTO-MSWindows	2019-03-27 22:27:57 UTC (rev 50622)
@@ -4,7 +4,7 @@
 and source tar ball and copy them to a directory ~/shared which needs to be
 shared via virtualbox to the cygwin build environment.
 
-Install these cygwin packages:
+Install TeXLive and these Cygwin packages:
 
 git
 wget
@@ -17,16 +17,19 @@
 w32api-headers
 w32api-runtime
 zlib-devel
-libGLU-devel
 libtirpc-devel (SRC)
 libreadline-devel (SRC)
 libfftw3-devel (SRC)
 libgsl-devel (SRC)
+libGLEW-devel (SRC)
+glm-devel
 automake1.15
 libtool
 
 mv /usr/include/GL /usr/include/GL.orig
 
+Install these cygwin packages:
+
 Build and install static libraries from /usr/local/src:
 
 gsl-devel:
@@ -41,7 +44,7 @@
 ./configure --prefix=/usr --enable-shared 
 make install
 
-tirpc-devel (if rpc library is unavailable):
+tirpc-devel:
 ./configure --prefix=/usr --disable-gssapi
 make install
 ln -s /usr/include/tirpc/rpc /usr/include/rpc
@@ -52,19 +55,23 @@
 ./configure --prefix=/usr
 make install
 
+glew-2.1.0:
+make CFLAGS=-D_WIN32 glew.lib.static
+make install
+cp lib/libGLEW.a /usr/lib
+
 git clone http://github.com/vectorgraphics/asymptote
 
-cd /usr/include
-patch -p0 < ~/asymptote/patches/cygwin_glu.patch
+freeglut-3.0.0:
+patch -p1 < ~/asymptote/patches/cygwin_freeglut-3.0.0.patch
+cmake CMakeLists.txt
+make
+cp lib/libfreeglut_static.a /usr/lib/libfreeglut.a
+cp -a include/GL/*.h /usr/include/w32api/GL/
 
 mkdir -p ~/dll/cygwin
 cp /usr/bin/cygwin1.dll ~/dll/cygwin
 
-cd
-~/asymptote/build-scripts/build-freeglut
-
-install texlive
-
 mkdir ~/CTAN
 cp -a ~/asymptote/build-scripts/README-binaries ~/CTAN
 
@@ -75,8 +82,7 @@
 tar -zxf libatomic_ops-$GCVERSION.tar.gz
 mv libatomic_ops-$GCVERSION gc-$GCVERSION/libatomic_ops
 cd gc-$GCVERSION
-patch -p1 < ~/asymptote/patches/cygwin_gc.patch
 ./configure --disable-shared
 make check
 
-~/asymptote/build-scripts/build-asymptote.dos 2.43
+~/asymptote/build-scripts/build-asymptote.dos 2.48

Modified: trunk/Build/source/utils/asymptote/build-scripts/build-asymptote
===================================================================
--- trunk/Build/source/utils/asymptote/build-scripts/build-asymptote	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/build-scripts/build-asymptote	2019-03-27 22:27:57 UTC (rev 50622)
@@ -4,8 +4,8 @@
 HOME=~bowman
 SHARED=$HOME/shared/asy
 
-GCVERSION=7.6.2
-ATOMICVERSION=7.6.2
+GCVERSION=8.0.2
+ATOMICVERSION=7.6.8
 GC=gc-$GCVERSION
 
 MAKEFLAGS=-j8

Modified: trunk/Build/source/utils/asymptote/build-scripts/build-asymptote.dos
===================================================================
--- trunk/Build/source/utils/asymptote/build-scripts/build-asymptote.dos	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/build-scripts/build-asymptote.dos	2019-03-27 22:27:57 UTC (rev 50622)
@@ -34,10 +34,9 @@
 make -n MSDOS=1 >& /dev/null || ./configure OSTYPE=msdos --enable-gc=$GC --with-latex=/usr/local/share --with-context=/usr/local/share
 rm -rf $BUILD
 mkdir -p $BUILD
-cp -a $HOME/dll/cygwin/*.dll $HOME/dll/*.dll $BUILD
+cp -a $HOME/dll/cygwin/*.dll $BUILD
 chmod 0644 $BUILD/*.dll
 cp -a $BUILD/*.dll ~/CTAN/asymptote-$VERSION/binaries/$BINDIR/
-cp -a $HOME/dll/*.dll .
 make MSDOS=1 DESTDIR="$BUILD/" docdir="$BUILD/"
 test -f asy.list || make MSDOS=1 keywords DESTDIR="$BUILD/" docdir="$BUILD/"
 make MSDOS=1 install-asy DESTDIR="$BUILD/" docdir="$BUILD/"

Modified: trunk/Build/source/utils/asymptote/camp.tab.cc
===================================================================
--- trunk/Build/source/utils/asymptote/camp.tab.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/camp.tab.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 3.0.4.  */
+/* A Bison parser, made by GNU Bison 3.0.5.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -44,7 +44,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "3.0.4"
+#define YYBISON_VERSION "3.0.5"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -1632,6 +1632,7 @@
       case N:                               \
         yyformat = S;                       \
       break
+    default: /* Avoid compiler warnings. */
       YYCASE_(0, YY_("syntax error"));
       YYCASE_(1, YY_("syntax error, unexpected %s"));
       YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
@@ -1948,1232 +1949,1232 @@
   switch (yyn)
     {
         case 2:
-#line 191 "camp.y" /* yacc.c:1646  */
+#line 191 "camp.y" /* yacc.c:1648  */
     { absyntax::root = (yyvsp[0].b); }
-#line 1954 "camp.tab.c" /* yacc.c:1646  */
+#line 1955 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 3:
-#line 195 "camp.y" /* yacc.c:1646  */
+#line 195 "camp.y" /* yacc.c:1648  */
     { (yyval.b) = new file(lexerPos(), false); }
-#line 1960 "camp.tab.c" /* yacc.c:1646  */
+#line 1961 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 4:
-#line 197 "camp.y" /* yacc.c:1646  */
+#line 197 "camp.y" /* yacc.c:1648  */
     { (yyval.b) = (yyvsp[-1].b); (yyval.b)->add((yyvsp[0].run)); }
-#line 1966 "camp.tab.c" /* yacc.c:1646  */
+#line 1967 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 5:
-#line 201 "camp.y" /* yacc.c:1646  */
+#line 201 "camp.y" /* yacc.c:1648  */
     { (yyval.b) = new block(lexerPos(), true); }
-#line 1972 "camp.tab.c" /* yacc.c:1646  */
+#line 1973 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 6:
-#line 203 "camp.y" /* yacc.c:1646  */
+#line 203 "camp.y" /* yacc.c:1648  */
     { (yyval.b) = (yyvsp[-1].b); (yyval.b)->add((yyvsp[0].run)); }
-#line 1978 "camp.tab.c" /* yacc.c:1646  */
+#line 1979 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 7:
-#line 207 "camp.y" /* yacc.c:1646  */
+#line 207 "camp.y" /* yacc.c:1648  */
     { (yyval.n) = new simpleName((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 1984 "camp.tab.c" /* yacc.c:1646  */
+#line 1985 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 8:
-#line 208 "camp.y" /* yacc.c:1646  */
+#line 208 "camp.y" /* yacc.c:1648  */
     { (yyval.n) = new qualifiedName((yyvsp[-1].pos), (yyvsp[-2].n), (yyvsp[0].ps).sym); }
-#line 1990 "camp.tab.c" /* yacc.c:1646  */
+#line 1991 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 9:
-#line 209 "camp.y" /* yacc.c:1646  */
+#line 209 "camp.y" /* yacc.c:1648  */
     { (yyval.n) = new simpleName((yyvsp[0].ps).pos,
                                   symbol::trans("operator answer")); }
-#line 1997 "camp.tab.c" /* yacc.c:1646  */
+#line 1998 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 10:
-#line 214 "camp.y" /* yacc.c:1646  */
+#line 214 "camp.y" /* yacc.c:1648  */
     { (yyval.run) = (yyvsp[0].d); }
-#line 2003 "camp.tab.c" /* yacc.c:1646  */
+#line 2004 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 11:
-#line 215 "camp.y" /* yacc.c:1646  */
+#line 215 "camp.y" /* yacc.c:1648  */
     { (yyval.run) = (yyvsp[0].s); }
-#line 2009 "camp.tab.c" /* yacc.c:1646  */
+#line 2010 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 12:
-#line 217 "camp.y" /* yacc.c:1646  */
+#line 217 "camp.y" /* yacc.c:1648  */
     { (yyval.run) = new modifiedRunnable((yyvsp[-1].ml)->getPos(), (yyvsp[-1].ml), (yyvsp[0].d)); }
-#line 2015 "camp.tab.c" /* yacc.c:1646  */
+#line 2016 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 13:
-#line 219 "camp.y" /* yacc.c:1646  */
+#line 219 "camp.y" /* yacc.c:1648  */
     { (yyval.run) = new modifiedRunnable((yyvsp[-1].ml)->getPos(), (yyvsp[-1].ml), (yyvsp[0].s)); }
-#line 2021 "camp.tab.c" /* yacc.c:1646  */
+#line 2022 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 14:
-#line 223 "camp.y" /* yacc.c:1646  */
+#line 223 "camp.y" /* yacc.c:1648  */
     { (yyval.ml) = new modifierList((yyvsp[0].mod).pos); (yyval.ml)->add((yyvsp[0].mod).val); }
-#line 2027 "camp.tab.c" /* yacc.c:1646  */
+#line 2028 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 15:
-#line 224 "camp.y" /* yacc.c:1646  */
+#line 224 "camp.y" /* yacc.c:1648  */
     { (yyval.ml) = new modifierList((yyvsp[0].perm).pos); (yyval.ml)->add((yyvsp[0].perm).val); }
-#line 2033 "camp.tab.c" /* yacc.c:1646  */
+#line 2034 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 16:
-#line 226 "camp.y" /* yacc.c:1646  */
+#line 226 "camp.y" /* yacc.c:1648  */
     { (yyval.ml) = (yyvsp[-1].ml); (yyval.ml)->add((yyvsp[0].mod).val); }
-#line 2039 "camp.tab.c" /* yacc.c:1646  */
+#line 2040 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 17:
-#line 228 "camp.y" /* yacc.c:1646  */
+#line 228 "camp.y" /* yacc.c:1648  */
     { (yyval.ml) = (yyvsp[-1].ml); (yyval.ml)->add((yyvsp[0].perm).val); }
-#line 2045 "camp.tab.c" /* yacc.c:1646  */
+#line 2046 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 18:
-#line 232 "camp.y" /* yacc.c:1646  */
+#line 232 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = (yyvsp[0].vd); }
-#line 2051 "camp.tab.c" /* yacc.c:1646  */
+#line 2052 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 19:
-#line 233 "camp.y" /* yacc.c:1646  */
+#line 233 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = (yyvsp[0].d); }
-#line 2057 "camp.tab.c" /* yacc.c:1646  */
+#line 2058 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 20:
-#line 234 "camp.y" /* yacc.c:1646  */
+#line 234 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = (yyvsp[0].d); }
-#line 2063 "camp.tab.c" /* yacc.c:1646  */
+#line 2064 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 21:
-#line 236 "camp.y" /* yacc.c:1646  */
+#line 236 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = new accessdec((yyvsp[-2].pos), (yyvsp[-1].ipl)); }
-#line 2069 "camp.tab.c" /* yacc.c:1646  */
+#line 2070 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 22:
-#line 238 "camp.y" /* yacc.c:1646  */
+#line 238 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = new unraveldec((yyvsp[-4].pos), (yyvsp[-3].n), (yyvsp[-1].ipl)); }
-#line 2075 "camp.tab.c" /* yacc.c:1646  */
+#line 2076 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 23:
-#line 240 "camp.y" /* yacc.c:1646  */
+#line 240 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = new unraveldec((yyvsp[-4].pos), (yyvsp[-3].n), WILDCARD); }
-#line 2081 "camp.tab.c" /* yacc.c:1646  */
+#line 2082 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 24:
-#line 241 "camp.y" /* yacc.c:1646  */
+#line 241 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = new unraveldec((yyvsp[-2].pos), (yyvsp[-1].n), WILDCARD); }
-#line 2087 "camp.tab.c" /* yacc.c:1646  */
+#line 2088 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 25:
-#line 243 "camp.y" /* yacc.c:1646  */
+#line 243 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = new fromaccessdec((yyvsp[-4].pos), (yyvsp[-3].ps).sym, (yyvsp[-1].ipl)); }
-#line 2093 "camp.tab.c" /* yacc.c:1646  */
+#line 2094 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 26:
-#line 245 "camp.y" /* yacc.c:1646  */
+#line 245 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = new fromaccessdec((yyvsp[-4].pos), (yyvsp[-3].ps).sym, WILDCARD); }
-#line 2099 "camp.tab.c" /* yacc.c:1646  */
+#line 2100 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 27:
-#line 247 "camp.y" /* yacc.c:1646  */
+#line 247 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = new importdec((yyvsp[-2].pos), (yyvsp[-1].ip)); }
-#line 2105 "camp.tab.c" /* yacc.c:1646  */
+#line 2106 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 28:
-#line 248 "camp.y" /* yacc.c:1646  */
+#line 248 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = new includedec((yyvsp[-2].pos), (yyvsp[-1].ps).sym); }
-#line 2111 "camp.tab.c" /* yacc.c:1646  */
+#line 2112 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 29:
-#line 250 "camp.y" /* yacc.c:1646  */
+#line 250 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = new includedec((yyvsp[-2].pos), (yyvsp[-1].stre)->getString()); }
-#line 2117 "camp.tab.c" /* yacc.c:1646  */
+#line 2118 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 30:
-#line 254 "camp.y" /* yacc.c:1646  */
+#line 254 "camp.y" /* yacc.c:1648  */
     { (yyval.ip) = new idpair((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 2123 "camp.tab.c" /* yacc.c:1646  */
+#line 2124 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 31:
-#line 256 "camp.y" /* yacc.c:1646  */
+#line 256 "camp.y" /* yacc.c:1648  */
     { (yyval.ip) = new idpair((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym, (yyvsp[-1].ps).sym , (yyvsp[0].ps).sym); }
-#line 2129 "camp.tab.c" /* yacc.c:1646  */
+#line 2130 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 32:
-#line 260 "camp.y" /* yacc.c:1646  */
+#line 260 "camp.y" /* yacc.c:1648  */
     { (yyval.ipl) = new idpairlist(); (yyval.ipl)->add((yyvsp[0].ip)); }
-#line 2135 "camp.tab.c" /* yacc.c:1646  */
+#line 2136 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 33:
-#line 262 "camp.y" /* yacc.c:1646  */
+#line 262 "camp.y" /* yacc.c:1648  */
     { (yyval.ipl) = (yyvsp[-2].ipl); (yyval.ipl)->add((yyvsp[0].ip)); }
-#line 2141 "camp.tab.c" /* yacc.c:1646  */
+#line 2142 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 34:
-#line 266 "camp.y" /* yacc.c:1646  */
+#line 266 "camp.y" /* yacc.c:1648  */
     { (yyval.ps) = (yyvsp[0].ps); }
-#line 2147 "camp.tab.c" /* yacc.c:1646  */
+#line 2148 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 35:
-#line 267 "camp.y" /* yacc.c:1646  */
+#line 267 "camp.y" /* yacc.c:1648  */
     { (yyval.ps).pos = (yyvsp[0].stre)->getPos();
                      (yyval.ps).sym = symbol::literalTrans((yyvsp[0].stre)->getString()); }
-#line 2154 "camp.tab.c" /* yacc.c:1646  */
+#line 2155 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 36:
-#line 272 "camp.y" /* yacc.c:1646  */
+#line 272 "camp.y" /* yacc.c:1648  */
     { (yyval.ip) = new idpair((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 2160 "camp.tab.c" /* yacc.c:1646  */
+#line 2161 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 37:
-#line 274 "camp.y" /* yacc.c:1646  */
+#line 274 "camp.y" /* yacc.c:1648  */
     { (yyval.ip) = new idpair((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym, (yyvsp[-1].ps).sym , (yyvsp[0].ps).sym); }
-#line 2166 "camp.tab.c" /* yacc.c:1646  */
+#line 2167 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 38:
-#line 278 "camp.y" /* yacc.c:1646  */
+#line 278 "camp.y" /* yacc.c:1648  */
     { (yyval.ipl) = new idpairlist(); (yyval.ipl)->add((yyvsp[0].ip)); }
-#line 2172 "camp.tab.c" /* yacc.c:1646  */
+#line 2173 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 39:
-#line 280 "camp.y" /* yacc.c:1646  */
+#line 280 "camp.y" /* yacc.c:1648  */
     { (yyval.ipl) = (yyvsp[-2].ipl); (yyval.ipl)->add((yyvsp[0].ip)); }
-#line 2178 "camp.tab.c" /* yacc.c:1646  */
+#line 2179 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 40:
-#line 284 "camp.y" /* yacc.c:1646  */
+#line 284 "camp.y" /* yacc.c:1648  */
     { (yyval.vd) = (yyvsp[-1].vd); }
-#line 2184 "camp.tab.c" /* yacc.c:1646  */
+#line 2185 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 41:
-#line 288 "camp.y" /* yacc.c:1646  */
+#line 288 "camp.y" /* yacc.c:1648  */
     { (yyval.vd) = new vardec((yyvsp[-1].t)->getPos(), (yyvsp[-1].t), (yyvsp[0].dil)); }
-#line 2190 "camp.tab.c" /* yacc.c:1646  */
+#line 2191 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 42:
-#line 292 "camp.y" /* yacc.c:1646  */
+#line 292 "camp.y" /* yacc.c:1648  */
     { (yyval.t) = (yyvsp[0].t); }
-#line 2196 "camp.tab.c" /* yacc.c:1646  */
+#line 2197 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 43:
-#line 293 "camp.y" /* yacc.c:1646  */
+#line 293 "camp.y" /* yacc.c:1648  */
     { (yyval.t) = new arrayTy((yyvsp[-1].n), (yyvsp[0].dim)); }
-#line 2202 "camp.tab.c" /* yacc.c:1646  */
+#line 2203 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 44:
-#line 297 "camp.y" /* yacc.c:1646  */
+#line 297 "camp.y" /* yacc.c:1648  */
     { (yyval.t) = new nameTy((yyvsp[0].n)); }
-#line 2208 "camp.tab.c" /* yacc.c:1646  */
+#line 2209 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 45:
-#line 301 "camp.y" /* yacc.c:1646  */
+#line 301 "camp.y" /* yacc.c:1648  */
     { (yyval.dim) = new dimensions((yyvsp[-1].pos)); }
-#line 2214 "camp.tab.c" /* yacc.c:1646  */
+#line 2215 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 46:
-#line 302 "camp.y" /* yacc.c:1646  */
+#line 302 "camp.y" /* yacc.c:1648  */
     { (yyval.dim) = (yyvsp[-2].dim); (yyval.dim)->increase(); }
-#line 2220 "camp.tab.c" /* yacc.c:1646  */
+#line 2221 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 47:
-#line 306 "camp.y" /* yacc.c:1646  */
+#line 306 "camp.y" /* yacc.c:1648  */
     { (yyval.elist) = new explist((yyvsp[-2].pos)); (yyval.elist)->add((yyvsp[-1].e)); }
-#line 2226 "camp.tab.c" /* yacc.c:1646  */
+#line 2227 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 48:
-#line 308 "camp.y" /* yacc.c:1646  */
+#line 308 "camp.y" /* yacc.c:1648  */
     { (yyval.elist) = (yyvsp[-3].elist); (yyval.elist)->add((yyvsp[-1].e)); }
-#line 2232 "camp.tab.c" /* yacc.c:1646  */
+#line 2233 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 49:
-#line 312 "camp.y" /* yacc.c:1646  */
+#line 312 "camp.y" /* yacc.c:1648  */
     { (yyval.dil) = new decidlist((yyvsp[0].di)->getPos()); (yyval.dil)->add((yyvsp[0].di)); }
-#line 2238 "camp.tab.c" /* yacc.c:1646  */
+#line 2239 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 50:
-#line 314 "camp.y" /* yacc.c:1646  */
+#line 314 "camp.y" /* yacc.c:1648  */
     { (yyval.dil) = (yyvsp[-2].dil); (yyval.dil)->add((yyvsp[0].di)); }
-#line 2244 "camp.tab.c" /* yacc.c:1646  */
+#line 2245 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 51:
-#line 318 "camp.y" /* yacc.c:1646  */
+#line 318 "camp.y" /* yacc.c:1648  */
     { (yyval.di) = new decid((yyvsp[0].dis)->getPos(), (yyvsp[0].dis)); }
-#line 2250 "camp.tab.c" /* yacc.c:1646  */
+#line 2251 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 52:
-#line 320 "camp.y" /* yacc.c:1646  */
+#line 320 "camp.y" /* yacc.c:1648  */
     { (yyval.di) = new decid((yyvsp[-2].dis)->getPos(), (yyvsp[-2].dis), (yyvsp[0].vi)); }
-#line 2256 "camp.tab.c" /* yacc.c:1646  */
+#line 2257 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 53:
-#line 324 "camp.y" /* yacc.c:1646  */
+#line 324 "camp.y" /* yacc.c:1648  */
     { (yyval.dis) = new decidstart((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 2262 "camp.tab.c" /* yacc.c:1646  */
+#line 2263 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 54:
-#line 325 "camp.y" /* yacc.c:1646  */
+#line 325 "camp.y" /* yacc.c:1648  */
     { (yyval.dis) = new decidstart((yyvsp[-1].ps).pos, (yyvsp[-1].ps).sym, (yyvsp[0].dim)); }
-#line 2268 "camp.tab.c" /* yacc.c:1646  */
+#line 2269 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 55:
-#line 326 "camp.y" /* yacc.c:1646  */
+#line 326 "camp.y" /* yacc.c:1648  */
     { (yyval.dis) = new fundecidstart((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym, 0,
                                             new formals((yyvsp[-1].pos))); }
-#line 2275 "camp.tab.c" /* yacc.c:1646  */
+#line 2276 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 56:
-#line 329 "camp.y" /* yacc.c:1646  */
+#line 329 "camp.y" /* yacc.c:1648  */
     { (yyval.dis) = new fundecidstart((yyvsp[-3].ps).pos, (yyvsp[-3].ps).sym, 0, (yyvsp[-1].fls)); }
-#line 2281 "camp.tab.c" /* yacc.c:1646  */
+#line 2282 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 57:
-#line 333 "camp.y" /* yacc.c:1646  */
+#line 333 "camp.y" /* yacc.c:1648  */
     { (yyval.vi) = (yyvsp[0].e); }
-#line 2287 "camp.tab.c" /* yacc.c:1646  */
+#line 2288 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 58:
-#line 334 "camp.y" /* yacc.c:1646  */
+#line 334 "camp.y" /* yacc.c:1648  */
     { (yyval.vi) = (yyvsp[0].ai); }
-#line 2293 "camp.tab.c" /* yacc.c:1646  */
+#line 2294 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 59:
-#line 339 "camp.y" /* yacc.c:1646  */
+#line 339 "camp.y" /* yacc.c:1648  */
     { (yyval.b) = (yyvsp[-1].b); }
-#line 2299 "camp.tab.c" /* yacc.c:1646  */
+#line 2300 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 60:
-#line 343 "camp.y" /* yacc.c:1646  */
+#line 343 "camp.y" /* yacc.c:1648  */
     { (yyval.ai) = new arrayinit((yyvsp[-1].pos)); }
-#line 2305 "camp.tab.c" /* yacc.c:1646  */
+#line 2306 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 61:
-#line 345 "camp.y" /* yacc.c:1646  */
+#line 345 "camp.y" /* yacc.c:1648  */
     { (yyval.ai) = new arrayinit((yyvsp[-3].pos)); (yyval.ai)->addRest((yyvsp[-1].vi)); }
-#line 2311 "camp.tab.c" /* yacc.c:1646  */
+#line 2312 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 62:
-#line 347 "camp.y" /* yacc.c:1646  */
+#line 347 "camp.y" /* yacc.c:1648  */
     { (yyval.ai) = (yyvsp[-1].ai); }
-#line 2317 "camp.tab.c" /* yacc.c:1646  */
+#line 2318 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 63:
-#line 349 "camp.y" /* yacc.c:1646  */
+#line 349 "camp.y" /* yacc.c:1648  */
     { (yyval.ai) = (yyvsp[-3].ai); (yyval.ai)->addRest((yyvsp[-1].vi)); }
-#line 2323 "camp.tab.c" /* yacc.c:1646  */
+#line 2324 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 64:
-#line 353 "camp.y" /* yacc.c:1646  */
+#line 353 "camp.y" /* yacc.c:1648  */
     { (yyval.ai) = new arrayinit((yyvsp[0].pos)); }
-#line 2329 "camp.tab.c" /* yacc.c:1646  */
+#line 2330 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 65:
-#line 354 "camp.y" /* yacc.c:1646  */
+#line 354 "camp.y" /* yacc.c:1648  */
     { (yyval.ai) = (yyvsp[0].ai); }
-#line 2335 "camp.tab.c" /* yacc.c:1646  */
+#line 2336 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 66:
-#line 355 "camp.y" /* yacc.c:1646  */
+#line 355 "camp.y" /* yacc.c:1648  */
     { (yyval.ai) = (yyvsp[-1].ai); }
-#line 2341 "camp.tab.c" /* yacc.c:1646  */
+#line 2342 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 67:
-#line 359 "camp.y" /* yacc.c:1646  */
+#line 359 "camp.y" /* yacc.c:1648  */
     { (yyval.ai) = new arrayinit((yyvsp[0].vi)->getPos());
 		     (yyval.ai)->add((yyvsp[0].vi));}
-#line 2348 "camp.tab.c" /* yacc.c:1646  */
+#line 2349 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 68:
-#line 362 "camp.y" /* yacc.c:1646  */
+#line 362 "camp.y" /* yacc.c:1648  */
     { (yyval.ai) = (yyvsp[-2].ai); (yyval.ai)->add((yyvsp[0].vi)); }
-#line 2354 "camp.tab.c" /* yacc.c:1646  */
+#line 2355 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 69:
-#line 366 "camp.y" /* yacc.c:1646  */
+#line 366 "camp.y" /* yacc.c:1648  */
     { (yyval.fls) = new formals((yyvsp[0].fl)->getPos()); (yyval.fls)->add((yyvsp[0].fl)); }
-#line 2360 "camp.tab.c" /* yacc.c:1646  */
+#line 2361 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 70:
-#line 367 "camp.y" /* yacc.c:1646  */
+#line 367 "camp.y" /* yacc.c:1648  */
     { (yyval.fls) = new formals((yyvsp[-1].pos)); (yyval.fls)->addRest((yyvsp[0].fl)); }
-#line 2366 "camp.tab.c" /* yacc.c:1646  */
+#line 2367 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 71:
-#line 369 "camp.y" /* yacc.c:1646  */
+#line 369 "camp.y" /* yacc.c:1648  */
     { (yyval.fls) = (yyvsp[-2].fls); (yyval.fls)->add((yyvsp[0].fl)); }
-#line 2372 "camp.tab.c" /* yacc.c:1646  */
+#line 2373 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 72:
-#line 371 "camp.y" /* yacc.c:1646  */
+#line 371 "camp.y" /* yacc.c:1648  */
     { (yyval.fls) = (yyvsp[-2].fls); (yyval.fls)->addRest((yyvsp[0].fl)); }
-#line 2378 "camp.tab.c" /* yacc.c:1646  */
+#line 2379 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 73:
-#line 375 "camp.y" /* yacc.c:1646  */
+#line 375 "camp.y" /* yacc.c:1648  */
     { (yyval.boo) = true; }
-#line 2384 "camp.tab.c" /* yacc.c:1646  */
+#line 2385 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 74:
-#line 376 "camp.y" /* yacc.c:1646  */
+#line 376 "camp.y" /* yacc.c:1648  */
     { (yyval.boo) = false; }
-#line 2390 "camp.tab.c" /* yacc.c:1646  */
+#line 2391 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 75:
-#line 381 "camp.y" /* yacc.c:1646  */
+#line 381 "camp.y" /* yacc.c:1648  */
     { (yyval.fl) = new formal((yyvsp[0].t)->getPos(), (yyvsp[0].t), 0, 0, (yyvsp[-1].boo), 0); }
-#line 2396 "camp.tab.c" /* yacc.c:1646  */
+#line 2397 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 76:
-#line 383 "camp.y" /* yacc.c:1646  */
+#line 383 "camp.y" /* yacc.c:1648  */
     { (yyval.fl) = new formal((yyvsp[-1].t)->getPos(), (yyvsp[-1].t), (yyvsp[0].dis), 0, (yyvsp[-2].boo), 0); }
-#line 2402 "camp.tab.c" /* yacc.c:1646  */
+#line 2403 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 77:
-#line 385 "camp.y" /* yacc.c:1646  */
+#line 385 "camp.y" /* yacc.c:1648  */
     { (yyval.fl) = new formal((yyvsp[-3].t)->getPos(), (yyvsp[-3].t), (yyvsp[-2].dis), (yyvsp[0].vi), (yyvsp[-4].boo), 0); }
-#line 2408 "camp.tab.c" /* yacc.c:1646  */
+#line 2409 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 78:
-#line 388 "camp.y" /* yacc.c:1646  */
+#line 388 "camp.y" /* yacc.c:1648  */
     { bool k = checkKeyword((yyvsp[-1].ps).pos, (yyvsp[-1].ps).sym);
                      (yyval.fl) = new formal((yyvsp[-2].t)->getPos(), (yyvsp[-2].t), (yyvsp[0].dis), 0, (yyvsp[-3].boo), k); }
-#line 2415 "camp.tab.c" /* yacc.c:1646  */
+#line 2416 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 79:
-#line 391 "camp.y" /* yacc.c:1646  */
+#line 391 "camp.y" /* yacc.c:1648  */
     { bool k = checkKeyword((yyvsp[-3].ps).pos, (yyvsp[-3].ps).sym);
                      (yyval.fl) = new formal((yyvsp[-4].t)->getPos(), (yyvsp[-4].t), (yyvsp[-2].dis), (yyvsp[0].vi), (yyvsp[-5].boo), k); }
-#line 2422 "camp.tab.c" /* yacc.c:1646  */
+#line 2423 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 80:
-#line 397 "camp.y" /* yacc.c:1646  */
+#line 397 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = new fundec((yyvsp[-2].pos), (yyvsp[-4].t), (yyvsp[-3].ps).sym, new formals((yyvsp[-2].pos)), (yyvsp[0].s)); }
-#line 2428 "camp.tab.c" /* yacc.c:1646  */
+#line 2429 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 81:
-#line 399 "camp.y" /* yacc.c:1646  */
+#line 399 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = new fundec((yyvsp[-3].pos), (yyvsp[-5].t), (yyvsp[-4].ps).sym, (yyvsp[-2].fls), (yyvsp[0].s)); }
-#line 2434 "camp.tab.c" /* yacc.c:1646  */
+#line 2435 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 82:
-#line 403 "camp.y" /* yacc.c:1646  */
+#line 403 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = new recorddec((yyvsp[-2].pos), (yyvsp[-1].ps).sym, (yyvsp[0].b)); }
-#line 2440 "camp.tab.c" /* yacc.c:1646  */
+#line 2441 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 83:
-#line 404 "camp.y" /* yacc.c:1646  */
+#line 404 "camp.y" /* yacc.c:1648  */
     { (yyval.d) = new typedec((yyvsp[-1].pos), (yyvsp[0].vd)); }
-#line 2446 "camp.tab.c" /* yacc.c:1646  */
+#line 2447 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 84:
-#line 408 "camp.y" /* yacc.c:1646  */
+#line 408 "camp.y" /* yacc.c:1648  */
     { (yyval.slice) = new slice((yyvsp[0].pos), 0, 0); }
-#line 2452 "camp.tab.c" /* yacc.c:1646  */
+#line 2453 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 85:
-#line 409 "camp.y" /* yacc.c:1646  */
+#line 409 "camp.y" /* yacc.c:1648  */
     { (yyval.slice) = new slice((yyvsp[0].pos), (yyvsp[-1].e), 0); }
-#line 2458 "camp.tab.c" /* yacc.c:1646  */
+#line 2459 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 86:
-#line 410 "camp.y" /* yacc.c:1646  */
+#line 410 "camp.y" /* yacc.c:1648  */
     { (yyval.slice) = new slice((yyvsp[-1].pos), 0, (yyvsp[0].e)); }
-#line 2464 "camp.tab.c" /* yacc.c:1646  */
+#line 2465 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 87:
-#line 411 "camp.y" /* yacc.c:1646  */
+#line 411 "camp.y" /* yacc.c:1648  */
     { (yyval.slice) = new slice((yyvsp[-1].pos), (yyvsp[-2].e), (yyvsp[0].e)); }
-#line 2470 "camp.tab.c" /* yacc.c:1646  */
+#line 2471 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 88:
-#line 415 "camp.y" /* yacc.c:1646  */
+#line 415 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new fieldExp((yyvsp[-1].pos), (yyvsp[-2].e), (yyvsp[0].ps).sym); }
-#line 2476 "camp.tab.c" /* yacc.c:1646  */
+#line 2477 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 89:
-#line 416 "camp.y" /* yacc.c:1646  */
+#line 416 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new subscriptExp((yyvsp[-2].pos),
                               new nameExp((yyvsp[-3].n)->getPos(), (yyvsp[-3].n)), (yyvsp[-1].e)); }
-#line 2483 "camp.tab.c" /* yacc.c:1646  */
+#line 2484 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 90:
-#line 418 "camp.y" /* yacc.c:1646  */
+#line 418 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new subscriptExp((yyvsp[-2].pos), (yyvsp[-3].e), (yyvsp[-1].e)); }
-#line 2489 "camp.tab.c" /* yacc.c:1646  */
+#line 2490 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 91:
-#line 419 "camp.y" /* yacc.c:1646  */
+#line 419 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new sliceExp((yyvsp[-2].pos),
                               new nameExp((yyvsp[-3].n)->getPos(), (yyvsp[-3].n)), (yyvsp[-1].slice)); }
-#line 2496 "camp.tab.c" /* yacc.c:1646  */
+#line 2497 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 92:
-#line 421 "camp.y" /* yacc.c:1646  */
+#line 421 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new sliceExp((yyvsp[-2].pos), (yyvsp[-3].e), (yyvsp[-1].slice)); }
-#line 2502 "camp.tab.c" /* yacc.c:1646  */
+#line 2503 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 93:
-#line 422 "camp.y" /* yacc.c:1646  */
+#line 422 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new callExp((yyvsp[-1].pos),
                                       new nameExp((yyvsp[-2].n)->getPos(), (yyvsp[-2].n)),
                                       new arglist()); }
-#line 2510 "camp.tab.c" /* yacc.c:1646  */
+#line 2511 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 94:
-#line 426 "camp.y" /* yacc.c:1646  */
+#line 426 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new callExp((yyvsp[-2].pos), 
                                       new nameExp((yyvsp[-3].n)->getPos(), (yyvsp[-3].n)),
                                       (yyvsp[-1].alist)); }
-#line 2518 "camp.tab.c" /* yacc.c:1646  */
+#line 2519 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 95:
-#line 429 "camp.y" /* yacc.c:1646  */
+#line 429 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new callExp((yyvsp[-1].pos), (yyvsp[-2].e), new arglist()); }
-#line 2524 "camp.tab.c" /* yacc.c:1646  */
+#line 2525 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 96:
-#line 431 "camp.y" /* yacc.c:1646  */
+#line 431 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new callExp((yyvsp[-2].pos), (yyvsp[-3].e), (yyvsp[-1].alist)); }
-#line 2530 "camp.tab.c" /* yacc.c:1646  */
+#line 2531 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 97:
-#line 433 "camp.y" /* yacc.c:1646  */
+#line 433 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = (yyvsp[-1].e); }
-#line 2536 "camp.tab.c" /* yacc.c:1646  */
+#line 2537 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 98:
-#line 435 "camp.y" /* yacc.c:1646  */
+#line 435 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new nameExp((yyvsp[-1].n)->getPos(), (yyvsp[-1].n)); }
-#line 2542 "camp.tab.c" /* yacc.c:1646  */
+#line 2543 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 99:
-#line 436 "camp.y" /* yacc.c:1646  */
+#line 436 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new thisExp((yyvsp[0].pos)); }
-#line 2548 "camp.tab.c" /* yacc.c:1646  */
+#line 2549 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 100:
-#line 440 "camp.y" /* yacc.c:1646  */
+#line 440 "camp.y" /* yacc.c:1648  */
     { (yyval.arg).name = symbol::nullsym; (yyval.arg).val=(yyvsp[0].e); }
-#line 2554 "camp.tab.c" /* yacc.c:1646  */
+#line 2555 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 101:
-#line 441 "camp.y" /* yacc.c:1646  */
+#line 441 "camp.y" /* yacc.c:1648  */
     { (yyval.arg).name = (yyvsp[-2].ps).sym; (yyval.arg).val=(yyvsp[0].e); }
-#line 2560 "camp.tab.c" /* yacc.c:1646  */
+#line 2561 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 102:
-#line 445 "camp.y" /* yacc.c:1646  */
+#line 445 "camp.y" /* yacc.c:1648  */
     { (yyval.alist) = new arglist(); (yyval.alist)->add((yyvsp[0].arg)); }
-#line 2566 "camp.tab.c" /* yacc.c:1646  */
+#line 2567 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 103:
-#line 447 "camp.y" /* yacc.c:1646  */
+#line 447 "camp.y" /* yacc.c:1648  */
     { (yyval.alist) = new arglist(); (yyval.alist)->addRest((yyvsp[0].arg)); }
-#line 2572 "camp.tab.c" /* yacc.c:1646  */
+#line 2573 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 104:
-#line 449 "camp.y" /* yacc.c:1646  */
+#line 449 "camp.y" /* yacc.c:1648  */
     { (yyval.alist) = (yyvsp[-2].alist); (yyval.alist)->add((yyvsp[0].arg)); }
-#line 2578 "camp.tab.c" /* yacc.c:1646  */
+#line 2579 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 105:
-#line 451 "camp.y" /* yacc.c:1646  */
+#line 451 "camp.y" /* yacc.c:1648  */
     { (yyval.alist) = (yyvsp[-2].alist); (yyval.alist)->addRest((yyvsp[0].arg)); }
-#line 2584 "camp.tab.c" /* yacc.c:1646  */
+#line 2585 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 106:
-#line 456 "camp.y" /* yacc.c:1646  */
+#line 456 "camp.y" /* yacc.c:1648  */
     { (yyval.alist) = new arglist(); (yyval.alist)->add((yyvsp[-2].e)); (yyval.alist)->add((yyvsp[0].e)); }
-#line 2590 "camp.tab.c" /* yacc.c:1646  */
+#line 2591 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 107:
-#line 457 "camp.y" /* yacc.c:1646  */
+#line 457 "camp.y" /* yacc.c:1648  */
     { (yyval.alist) = (yyvsp[-2].alist); (yyval.alist)->add((yyvsp[0].e)); }
-#line 2596 "camp.tab.c" /* yacc.c:1646  */
+#line 2597 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 108:
-#line 461 "camp.y" /* yacc.c:1646  */
+#line 461 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new nameExp((yyvsp[0].n)->getPos(), (yyvsp[0].n)); }
-#line 2602 "camp.tab.c" /* yacc.c:1646  */
+#line 2603 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 109:
-#line 462 "camp.y" /* yacc.c:1646  */
+#line 462 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = (yyvsp[0].e); }
-#line 2608 "camp.tab.c" /* yacc.c:1646  */
+#line 2609 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 110:
-#line 463 "camp.y" /* yacc.c:1646  */
+#line 463 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = (yyvsp[0].e); }
-#line 2614 "camp.tab.c" /* yacc.c:1646  */
+#line 2615 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 111:
-#line 464 "camp.y" /* yacc.c:1646  */
+#line 464 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = (yyvsp[0].stre); }
-#line 2620 "camp.tab.c" /* yacc.c:1646  */
+#line 2621 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 112:
-#line 466 "camp.y" /* yacc.c:1646  */
+#line 466 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new scaleExp((yyvsp[-1].e)->getPos(), (yyvsp[-1].e), (yyvsp[0].e)); }
-#line 2626 "camp.tab.c" /* yacc.c:1646  */
+#line 2627 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 113:
-#line 468 "camp.y" /* yacc.c:1646  */
+#line 468 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new castExp((yyvsp[-2].n)->getPos(), new nameTy((yyvsp[-2].n)), (yyvsp[0].e)); }
-#line 2632 "camp.tab.c" /* yacc.c:1646  */
+#line 2633 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 114:
-#line 470 "camp.y" /* yacc.c:1646  */
+#line 470 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new castExp((yyvsp[-3].n)->getPos(), new arrayTy((yyvsp[-3].n), (yyvsp[-2].dim)), (yyvsp[0].e)); }
-#line 2638 "camp.tab.c" /* yacc.c:1646  */
+#line 2639 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 115:
-#line 472 "camp.y" /* yacc.c:1646  */
+#line 472 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new unaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym); }
-#line 2644 "camp.tab.c" /* yacc.c:1646  */
+#line 2645 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 116:
-#line 474 "camp.y" /* yacc.c:1646  */
+#line 474 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new unaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym); }
-#line 2650 "camp.tab.c" /* yacc.c:1646  */
+#line 2651 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 117:
-#line 475 "camp.y" /* yacc.c:1646  */
+#line 475 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new unaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym); }
-#line 2656 "camp.tab.c" /* yacc.c:1646  */
+#line 2657 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 118:
-#line 476 "camp.y" /* yacc.c:1646  */
+#line 476 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2662 "camp.tab.c" /* yacc.c:1646  */
+#line 2663 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 119:
-#line 477 "camp.y" /* yacc.c:1646  */
+#line 477 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2668 "camp.tab.c" /* yacc.c:1646  */
+#line 2669 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 120:
-#line 478 "camp.y" /* yacc.c:1646  */
+#line 478 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2674 "camp.tab.c" /* yacc.c:1646  */
+#line 2675 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 121:
-#line 479 "camp.y" /* yacc.c:1646  */
+#line 479 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2680 "camp.tab.c" /* yacc.c:1646  */
+#line 2681 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 122:
-#line 480 "camp.y" /* yacc.c:1646  */
+#line 480 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2686 "camp.tab.c" /* yacc.c:1646  */
+#line 2687 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 123:
-#line 481 "camp.y" /* yacc.c:1646  */
+#line 481 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2692 "camp.tab.c" /* yacc.c:1646  */
+#line 2693 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 124:
-#line 482 "camp.y" /* yacc.c:1646  */
+#line 482 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2698 "camp.tab.c" /* yacc.c:1646  */
+#line 2699 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 125:
-#line 483 "camp.y" /* yacc.c:1646  */
+#line 483 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2704 "camp.tab.c" /* yacc.c:1646  */
+#line 2705 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 126:
-#line 484 "camp.y" /* yacc.c:1646  */
+#line 484 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2710 "camp.tab.c" /* yacc.c:1646  */
+#line 2711 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 127:
-#line 485 "camp.y" /* yacc.c:1646  */
+#line 485 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2716 "camp.tab.c" /* yacc.c:1646  */
+#line 2717 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 128:
-#line 486 "camp.y" /* yacc.c:1646  */
+#line 486 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2722 "camp.tab.c" /* yacc.c:1646  */
+#line 2723 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 129:
-#line 487 "camp.y" /* yacc.c:1646  */
+#line 487 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new equalityExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2728 "camp.tab.c" /* yacc.c:1646  */
+#line 2729 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 130:
-#line 488 "camp.y" /* yacc.c:1646  */
+#line 488 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new equalityExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2734 "camp.tab.c" /* yacc.c:1646  */
+#line 2735 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 131:
-#line 489 "camp.y" /* yacc.c:1646  */
+#line 489 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new andExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2740 "camp.tab.c" /* yacc.c:1646  */
+#line 2741 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 132:
-#line 490 "camp.y" /* yacc.c:1646  */
+#line 490 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new orExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2746 "camp.tab.c" /* yacc.c:1646  */
+#line 2747 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 133:
-#line 491 "camp.y" /* yacc.c:1646  */
+#line 491 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2752 "camp.tab.c" /* yacc.c:1646  */
+#line 2753 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 134:
-#line 492 "camp.y" /* yacc.c:1646  */
+#line 492 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2758 "camp.tab.c" /* yacc.c:1646  */
+#line 2759 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 135:
-#line 493 "camp.y" /* yacc.c:1646  */
+#line 493 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2764 "camp.tab.c" /* yacc.c:1646  */
+#line 2765 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 136:
-#line 494 "camp.y" /* yacc.c:1646  */
+#line 494 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2770 "camp.tab.c" /* yacc.c:1646  */
+#line 2771 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 137:
-#line 495 "camp.y" /* yacc.c:1646  */
+#line 495 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2776 "camp.tab.c" /* yacc.c:1646  */
+#line 2777 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 138:
-#line 497 "camp.y" /* yacc.c:1646  */
+#line 497 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new newRecordExp((yyvsp[-1].pos), (yyvsp[0].t)); }
-#line 2782 "camp.tab.c" /* yacc.c:1646  */
+#line 2783 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 139:
-#line 499 "camp.y" /* yacc.c:1646  */
+#line 499 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new newArrayExp((yyvsp[-2].pos), (yyvsp[-1].t), (yyvsp[0].elist), 0, 0); }
-#line 2788 "camp.tab.c" /* yacc.c:1646  */
+#line 2789 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 140:
-#line 501 "camp.y" /* yacc.c:1646  */
+#line 501 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new newArrayExp((yyvsp[-3].pos), (yyvsp[-2].t), (yyvsp[-1].elist), (yyvsp[0].dim), 0); }
-#line 2794 "camp.tab.c" /* yacc.c:1646  */
+#line 2795 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 141:
-#line 503 "camp.y" /* yacc.c:1646  */
+#line 503 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new newArrayExp((yyvsp[-2].pos), (yyvsp[-1].t), 0, (yyvsp[0].dim), 0); }
-#line 2800 "camp.tab.c" /* yacc.c:1646  */
+#line 2801 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 142:
-#line 505 "camp.y" /* yacc.c:1646  */
+#line 505 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new newArrayExp((yyvsp[-3].pos), (yyvsp[-2].t), 0, (yyvsp[-1].dim), (yyvsp[0].ai)); }
-#line 2806 "camp.tab.c" /* yacc.c:1646  */
+#line 2807 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 143:
-#line 507 "camp.y" /* yacc.c:1646  */
+#line 507 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new newFunctionExp((yyvsp[-4].pos), (yyvsp[-3].t), new formals((yyvsp[-2].pos)), (yyvsp[0].s)); }
-#line 2812 "camp.tab.c" /* yacc.c:1646  */
+#line 2813 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 144:
-#line 509 "camp.y" /* yacc.c:1646  */
+#line 509 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new newFunctionExp((yyvsp[-5].pos),
                                              new arrayTy((yyvsp[-4].t)->getPos(), (yyvsp[-4].t), (yyvsp[-3].dim)),
                                              new formals((yyvsp[-2].pos)),
                                              (yyvsp[0].s)); }
-#line 2821 "camp.tab.c" /* yacc.c:1646  */
+#line 2822 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 145:
-#line 514 "camp.y" /* yacc.c:1646  */
+#line 514 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new newFunctionExp((yyvsp[-5].pos), (yyvsp[-4].t), (yyvsp[-2].fls), (yyvsp[0].s)); }
-#line 2827 "camp.tab.c" /* yacc.c:1646  */
+#line 2828 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 146:
-#line 516 "camp.y" /* yacc.c:1646  */
+#line 516 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new newFunctionExp((yyvsp[-6].pos),
                                              new arrayTy((yyvsp[-5].t)->getPos(), (yyvsp[-5].t), (yyvsp[-4].dim)),
                                              (yyvsp[-2].fls),
                                              (yyvsp[0].s)); }
-#line 2836 "camp.tab.c" /* yacc.c:1646  */
+#line 2837 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 147:
-#line 521 "camp.y" /* yacc.c:1646  */
+#line 521 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new conditionalExp((yyvsp[-3].pos), (yyvsp[-4].e), (yyvsp[-2].e), (yyvsp[0].e)); }
-#line 2842 "camp.tab.c" /* yacc.c:1646  */
+#line 2843 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 148:
-#line 522 "camp.y" /* yacc.c:1646  */
+#line 522 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new assignExp((yyvsp[-1].pos), (yyvsp[-2].e), (yyvsp[0].e)); }
-#line 2848 "camp.tab.c" /* yacc.c:1646  */
+#line 2849 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 149:
-#line 523 "camp.y" /* yacc.c:1646  */
+#line 523 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new callExp((yyvsp[-2].pos), new nameExp((yyvsp[-2].pos), SYM_TUPLE), (yyvsp[-1].alist)); }
-#line 2854 "camp.tab.c" /* yacc.c:1646  */
+#line 2855 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 150:
-#line 525 "camp.y" /* yacc.c:1646  */
+#line 525 "camp.y" /* yacc.c:1648  */
     { (yyvsp[-1].j)->pushFront((yyvsp[-2].e)); (yyvsp[-1].j)->pushBack((yyvsp[0].e)); (yyval.e) = (yyvsp[-1].j); }
-#line 2860 "camp.tab.c" /* yacc.c:1646  */
+#line 2861 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 151:
-#line 527 "camp.y" /* yacc.c:1646  */
+#line 527 "camp.y" /* yacc.c:1648  */
     { (yyvsp[0].se)->setSide(camp::OUT);
                      joinExp *jexp =
                          new joinExp((yyvsp[0].se)->getPos(), SYM_DOTS);
                      (yyval.e)=jexp;
                      jexp->pushBack((yyvsp[-1].e)); jexp->pushBack((yyvsp[0].se)); }
-#line 2870 "camp.tab.c" /* yacc.c:1646  */
+#line 2871 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 152:
-#line 533 "camp.y" /* yacc.c:1646  */
+#line 533 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new prefixExp((yyvsp[-1].ps).pos, (yyvsp[0].e), SYM_PLUS); }
-#line 2876 "camp.tab.c" /* yacc.c:1646  */
+#line 2877 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 153:
-#line 535 "camp.y" /* yacc.c:1646  */
+#line 535 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new prefixExp((yyvsp[-1].ps).pos, (yyvsp[0].e), SYM_MINUS); }
-#line 2882 "camp.tab.c" /* yacc.c:1646  */
+#line 2883 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 154:
-#line 538 "camp.y" /* yacc.c:1646  */
+#line 538 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new postfixExp((yyvsp[0].ps).pos, (yyvsp[-1].e), SYM_PLUS); }
-#line 2888 "camp.tab.c" /* yacc.c:1646  */
+#line 2889 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 155:
-#line 539 "camp.y" /* yacc.c:1646  */
+#line 539 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new selfExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2894 "camp.tab.c" /* yacc.c:1646  */
+#line 2895 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 156:
-#line 541 "camp.y" /* yacc.c:1646  */
+#line 541 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new quoteExp((yyvsp[-3].pos), (yyvsp[-1].b)); }
-#line 2900 "camp.tab.c" /* yacc.c:1646  */
+#line 2901 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 157:
-#line 547 "camp.y" /* yacc.c:1646  */
+#line 547 "camp.y" /* yacc.c:1648  */
     { (yyval.j) = new joinExp((yyvsp[0].ps).pos,(yyvsp[0].ps).sym); }
-#line 2906 "camp.tab.c" /* yacc.c:1646  */
+#line 2907 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 158:
-#line 549 "camp.y" /* yacc.c:1646  */
+#line 549 "camp.y" /* yacc.c:1648  */
     { (yyval.j) = (yyvsp[0].j); }
-#line 2912 "camp.tab.c" /* yacc.c:1646  */
+#line 2913 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 159:
-#line 551 "camp.y" /* yacc.c:1646  */
+#line 551 "camp.y" /* yacc.c:1648  */
     { (yyvsp[-1].se)->setSide(camp::OUT);
                      (yyval.j) = (yyvsp[0].j); (yyval.j)->pushFront((yyvsp[-1].se)); }
-#line 2919 "camp.tab.c" /* yacc.c:1646  */
+#line 2920 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 160:
-#line 554 "camp.y" /* yacc.c:1646  */
+#line 554 "camp.y" /* yacc.c:1648  */
     { (yyvsp[0].se)->setSide(camp::IN);
                      (yyval.j) = (yyvsp[-1].j); (yyval.j)->pushBack((yyvsp[0].se)); }
-#line 2926 "camp.tab.c" /* yacc.c:1646  */
+#line 2927 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 161:
-#line 557 "camp.y" /* yacc.c:1646  */
+#line 557 "camp.y" /* yacc.c:1648  */
     { (yyvsp[-2].se)->setSide(camp::OUT); (yyvsp[0].se)->setSide(camp::IN);
                      (yyval.j) = (yyvsp[-1].j); (yyval.j)->pushFront((yyvsp[-2].se)); (yyval.j)->pushBack((yyvsp[0].se)); }
-#line 2933 "camp.tab.c" /* yacc.c:1646  */
+#line 2934 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 162:
-#line 562 "camp.y" /* yacc.c:1646  */
+#line 562 "camp.y" /* yacc.c:1648  */
     { (yyval.se) = new specExp((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym, (yyvsp[-1].e)); }
-#line 2939 "camp.tab.c" /* yacc.c:1646  */
+#line 2940 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 163:
-#line 563 "camp.y" /* yacc.c:1646  */
+#line 563 "camp.y" /* yacc.c:1648  */
     { (yyval.se) = new specExp((yyvsp[-2].pos), symbol::opTrans("spec"), (yyvsp[-1].e)); }
-#line 2945 "camp.tab.c" /* yacc.c:1646  */
+#line 2946 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 164:
-#line 565 "camp.y" /* yacc.c:1646  */
+#line 565 "camp.y" /* yacc.c:1648  */
     { (yyval.se) = new specExp((yyvsp[-4].pos), symbol::opTrans("spec"),
 				      new pairExp((yyvsp[-2].pos), (yyvsp[-3].e), (yyvsp[-1].e))); }
-#line 2952 "camp.tab.c" /* yacc.c:1646  */
+#line 2953 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 165:
-#line 568 "camp.y" /* yacc.c:1646  */
+#line 568 "camp.y" /* yacc.c:1648  */
     { (yyval.se) = new specExp((yyvsp[-6].pos), symbol::opTrans("spec"),
 				      new tripleExp((yyvsp[-4].pos), (yyvsp[-5].e), (yyvsp[-3].e), (yyvsp[-1].e))); }
-#line 2959 "camp.tab.c" /* yacc.c:1646  */
+#line 2960 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 166:
-#line 573 "camp.y" /* yacc.c:1646  */
+#line 573 "camp.y" /* yacc.c:1648  */
     { (yyval.j) = new joinExp((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 2965 "camp.tab.c" /* yacc.c:1646  */
+#line 2966 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 167:
-#line 575 "camp.y" /* yacc.c:1646  */
+#line 575 "camp.y" /* yacc.c:1648  */
     { (yyval.j) = new joinExp((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym); (yyval.j)->pushBack((yyvsp[-1].e)); }
-#line 2971 "camp.tab.c" /* yacc.c:1646  */
+#line 2972 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 168:
-#line 577 "camp.y" /* yacc.c:1646  */
+#line 577 "camp.y" /* yacc.c:1648  */
     { (yyval.j) = new joinExp((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym); (yyval.j)->pushBack((yyvsp[-1].e)); }
-#line 2977 "camp.tab.c" /* yacc.c:1646  */
+#line 2978 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 169:
-#line 578 "camp.y" /* yacc.c:1646  */
+#line 578 "camp.y" /* yacc.c:1648  */
     { (yyval.j) = new joinExp((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 2983 "camp.tab.c" /* yacc.c:1646  */
+#line 2984 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 170:
-#line 579 "camp.y" /* yacc.c:1646  */
+#line 579 "camp.y" /* yacc.c:1648  */
     { (yyval.j) = new joinExp((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 2989 "camp.tab.c" /* yacc.c:1646  */
+#line 2990 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 171:
-#line 583 "camp.y" /* yacc.c:1646  */
+#line 583 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym,
                               new booleanExp((yyvsp[-1].ps).pos, false)); }
-#line 2996 "camp.tab.c" /* yacc.c:1646  */
+#line 2997 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 172:
-#line 586 "camp.y" /* yacc.c:1646  */
+#line 586 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new ternaryExp((yyvsp[-3].ps).pos, (yyvsp[-2].e), (yyvsp[-3].ps).sym, (yyvsp[0].e),
                               new booleanExp((yyvsp[-3].ps).pos, false)); }
-#line 3003 "camp.tab.c" /* yacc.c:1646  */
+#line 3004 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 173:
-#line 589 "camp.y" /* yacc.c:1646  */
+#line 589 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-2].ps).pos, (yyvsp[0].e), (yyvsp[-2].ps).sym,
                               new booleanExp((yyvsp[-1].ps).pos, true)); }
-#line 3010 "camp.tab.c" /* yacc.c:1646  */
+#line 3011 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 174:
-#line 592 "camp.y" /* yacc.c:1646  */
+#line 592 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new ternaryExp((yyvsp[-4].ps).pos, (yyvsp[-2].e), (yyvsp[-4].ps).sym, (yyvsp[0].e),
                               new booleanExp((yyvsp[-3].ps).pos, true)); }
-#line 3017 "camp.tab.c" /* yacc.c:1646  */
+#line 3018 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 175:
-#line 597 "camp.y" /* yacc.c:1646  */
+#line 597 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new unaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym); }
-#line 3023 "camp.tab.c" /* yacc.c:1646  */
+#line 3024 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 176:
-#line 599 "camp.y" /* yacc.c:1646  */
+#line 599 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = new binaryExp((yyvsp[-3].ps).pos, (yyvsp[-2].e), (yyvsp[-3].ps).sym, (yyvsp[0].e)); }
-#line 3029 "camp.tab.c" /* yacc.c:1646  */
+#line 3030 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 177:
-#line 603 "camp.y" /* yacc.c:1646  */
+#line 603 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = new emptyStm((yyvsp[0].pos)); }
-#line 3035 "camp.tab.c" /* yacc.c:1646  */
+#line 3036 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 178:
-#line 604 "camp.y" /* yacc.c:1646  */
+#line 604 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = (yyvsp[0].s); }
-#line 3041 "camp.tab.c" /* yacc.c:1646  */
+#line 3042 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 179:
-#line 605 "camp.y" /* yacc.c:1646  */
+#line 605 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = (yyvsp[-1].s); }
-#line 3047 "camp.tab.c" /* yacc.c:1646  */
+#line 3048 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 180:
-#line 607 "camp.y" /* yacc.c:1646  */
+#line 607 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = new ifStm((yyvsp[-4].pos), (yyvsp[-2].e), (yyvsp[0].s)); }
-#line 3053 "camp.tab.c" /* yacc.c:1646  */
+#line 3054 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 181:
-#line 609 "camp.y" /* yacc.c:1646  */
+#line 609 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = new ifStm((yyvsp[-6].pos), (yyvsp[-4].e), (yyvsp[-2].s), (yyvsp[0].s)); }
-#line 3059 "camp.tab.c" /* yacc.c:1646  */
+#line 3060 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 182:
-#line 611 "camp.y" /* yacc.c:1646  */
+#line 611 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = new whileStm((yyvsp[-4].pos), (yyvsp[-2].e), (yyvsp[0].s)); }
-#line 3065 "camp.tab.c" /* yacc.c:1646  */
+#line 3066 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 183:
-#line 613 "camp.y" /* yacc.c:1646  */
+#line 613 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = new doStm((yyvsp[-6].pos), (yyvsp[-5].s), (yyvsp[-2].e)); }
-#line 3071 "camp.tab.c" /* yacc.c:1646  */
+#line 3072 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 184:
-#line 615 "camp.y" /* yacc.c:1646  */
+#line 615 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = new forStm((yyvsp[-8].pos), (yyvsp[-6].run), (yyvsp[-4].e), (yyvsp[-2].sel), (yyvsp[0].s)); }
-#line 3077 "camp.tab.c" /* yacc.c:1646  */
+#line 3078 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 185:
-#line 617 "camp.y" /* yacc.c:1646  */
+#line 617 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = new extendedForStm((yyvsp[-7].pos), (yyvsp[-5].t), (yyvsp[-4].ps).sym, (yyvsp[-2].e), (yyvsp[0].s)); }
-#line 3083 "camp.tab.c" /* yacc.c:1646  */
+#line 3084 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 186:
-#line 618 "camp.y" /* yacc.c:1646  */
+#line 618 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = new breakStm((yyvsp[-1].pos)); }
-#line 3089 "camp.tab.c" /* yacc.c:1646  */
+#line 3090 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 187:
-#line 619 "camp.y" /* yacc.c:1646  */
+#line 619 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = new continueStm((yyvsp[-1].pos)); }
-#line 3095 "camp.tab.c" /* yacc.c:1646  */
+#line 3096 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 188:
-#line 620 "camp.y" /* yacc.c:1646  */
+#line 620 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = new returnStm((yyvsp[-1].pos)); }
-#line 3101 "camp.tab.c" /* yacc.c:1646  */
+#line 3102 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 189:
-#line 621 "camp.y" /* yacc.c:1646  */
+#line 621 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = new returnStm((yyvsp[-2].pos), (yyvsp[-1].e)); }
-#line 3107 "camp.tab.c" /* yacc.c:1646  */
+#line 3108 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 190:
-#line 625 "camp.y" /* yacc.c:1646  */
+#line 625 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = new expStm((yyvsp[0].e)->getPos(), (yyvsp[0].e)); }
-#line 3113 "camp.tab.c" /* yacc.c:1646  */
+#line 3114 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 191:
-#line 629 "camp.y" /* yacc.c:1646  */
+#line 629 "camp.y" /* yacc.c:1648  */
     { (yyval.s) = new blockStm((yyvsp[0].b)->getPos(), (yyvsp[0].b)); }
-#line 3119 "camp.tab.c" /* yacc.c:1646  */
+#line 3120 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 192:
-#line 633 "camp.y" /* yacc.c:1646  */
+#line 633 "camp.y" /* yacc.c:1648  */
     { (yyval.run) = 0; }
-#line 3125 "camp.tab.c" /* yacc.c:1646  */
+#line 3126 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 193:
-#line 634 "camp.y" /* yacc.c:1646  */
+#line 634 "camp.y" /* yacc.c:1648  */
     { (yyval.run) = (yyvsp[0].sel); }
-#line 3131 "camp.tab.c" /* yacc.c:1646  */
+#line 3132 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 194:
-#line 635 "camp.y" /* yacc.c:1646  */
+#line 635 "camp.y" /* yacc.c:1648  */
     { (yyval.run) = (yyvsp[0].vd); }
-#line 3137 "camp.tab.c" /* yacc.c:1646  */
+#line 3138 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 195:
-#line 639 "camp.y" /* yacc.c:1646  */
+#line 639 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = 0; }
-#line 3143 "camp.tab.c" /* yacc.c:1646  */
+#line 3144 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 196:
-#line 640 "camp.y" /* yacc.c:1646  */
+#line 640 "camp.y" /* yacc.c:1648  */
     { (yyval.e) = (yyvsp[0].e); }
-#line 3149 "camp.tab.c" /* yacc.c:1646  */
+#line 3150 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 197:
-#line 644 "camp.y" /* yacc.c:1646  */
+#line 644 "camp.y" /* yacc.c:1648  */
     { (yyval.sel) = 0; }
-#line 3155 "camp.tab.c" /* yacc.c:1646  */
+#line 3156 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 198:
-#line 645 "camp.y" /* yacc.c:1646  */
+#line 645 "camp.y" /* yacc.c:1648  */
     { (yyval.sel) = (yyvsp[0].sel); }
-#line 3161 "camp.tab.c" /* yacc.c:1646  */
+#line 3162 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 199:
-#line 649 "camp.y" /* yacc.c:1646  */
+#line 649 "camp.y" /* yacc.c:1648  */
     { (yyval.sel) = new stmExpList((yyvsp[0].s)->getPos()); (yyval.sel)->add((yyvsp[0].s)); }
-#line 3167 "camp.tab.c" /* yacc.c:1646  */
+#line 3168 "camp.tab.c" /* yacc.c:1648  */
     break;
 
   case 200:
-#line 651 "camp.y" /* yacc.c:1646  */
+#line 651 "camp.y" /* yacc.c:1648  */
     { (yyval.sel) = (yyvsp[-2].sel); (yyval.sel)->add((yyvsp[0].s)); }
-#line 3173 "camp.tab.c" /* yacc.c:1646  */
+#line 3174 "camp.tab.c" /* yacc.c:1648  */
     break;
 
 
-#line 3177 "camp.tab.c" /* yacc.c:1646  */
+#line 3178 "camp.tab.c" /* yacc.c:1648  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires

Modified: trunk/Build/source/utils/asymptote/camp.tab.h
===================================================================
--- trunk/Build/source/utils/asymptote/camp.tab.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/camp.tab.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 3.0.4.  */
+/* A Bison parser, made by GNU Bison 3.0.5.  */
 
 /* Bison interface for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -108,7 +108,7 @@
 
 union YYSTYPE
 {
-#line 60 "camp.y" /* yacc.c:1909  */
+#line 60 "camp.y" /* yacc.c:1910  */
 
   position pos;
   bool boo;
@@ -155,7 +155,7 @@
   absyntax::formal *fl;
   absyntax::formals *fls;
 
-#line 159 "camp.tab.h" /* yacc.c:1909  */
+#line 159 "camp.tab.h" /* yacc.c:1910  */
 };
 
 typedef union YYSTYPE YYSTYPE;

Modified: trunk/Build/source/utils/asymptote/common.h
===================================================================
--- trunk/Build/source/utils/asymptote/common.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/common.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -23,8 +23,8 @@
 #include "config.h"
 #endif
 
-#if !defined(FOR_SHARED) && defined(HAVE_LIBGLU) && \
-  ((defined(HAVE_LIBGL) && defined(HAVE_LIBGLUT)) || defined(HAVE_LIBOSMESA))
+#if !defined(FOR_SHARED) && \
+  ((defined(HAVE_LIBGL) && defined(HAVE_LIBGLUT) && defined(HAVE_LIBGLEW) && defined(HAVE_LIBGLM)) || defined(HAVE_LIBOSMESA))
 #define HAVE_GL
 #endif
 

Modified: trunk/Build/source/utils/asymptote/config.guess
===================================================================
--- trunk/Build/source/utils/asymptote/config.guess	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/config.guess	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright 1992-2019 Free Software Foundation, Inc.
+#   Copyright 1992-2018 Free Software Foundation, Inc.
 
-timestamp='2019-03-04'
+timestamp='2018-03-08'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -50,7 +50,7 @@
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright 1992-2019 Free Software Foundation, Inc.
+Copyright 1992-2018 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -84,6 +84,8 @@
   exit 1
 fi
 
+trap 'exit 1' 1 2 15
+
 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a
 # compiler to aid in system detection is discouraged as it requires
 # temporary files to be created and, as you can see below, it is a
@@ -94,38 +96,34 @@
 
 # Portable tmp directory creation inspired by the Autoconf team.
 
-tmp=
-# shellcheck disable=SC2172
-trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > "$dummy.c" ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
 
-set_cc_for_build() {
-    : "${TMPDIR=/tmp}"
-    # shellcheck disable=SC2039
-    { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
-	{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
-	{ tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
-	{ echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
-    dummy=$tmp/dummy
-    case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
-	,,)    echo "int x;" > "$dummy.c"
-	       for driver in cc gcc c89 c99 ; do
-		   if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
-		       CC_FOR_BUILD="$driver"
-		       break
-		   fi
-	       done
-	       if test x"$CC_FOR_BUILD" = x ; then
-		   CC_FOR_BUILD=no_compiler_found
-	       fi
-	       ;;
-	,,*)   CC_FOR_BUILD=$CC ;;
-	,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-    esac
-}
-
 # This is needed to find uname on a Pyramid OSx when run in the BSD universe.
 # (ghazi at noc.rutgers.edu 1994-08-24)
-if test -f /.attbin/uname ; then
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
 	PATH=$PATH:/.attbin ; export PATH
 fi
 
@@ -140,7 +138,7 @@
 	# We could probably try harder.
 	LIBC=gnu
 
-	set_cc_for_build
+	eval "$set_cc_for_build"
 	cat <<-EOF > "$dummy.c"
 	#include <features.h>
 	#if defined(__UCLIBC__)
@@ -201,7 +199,7 @@
 		os=netbsdelf
 		;;
 	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		set_cc_for_build
+		eval "$set_cc_for_build"
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
 			| grep -q __ELF__
 		then
@@ -239,7 +237,7 @@
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "$machine-${os}${release}${abi-}"
+	echo "$machine-${os}${release}${abi}"
 	exit ;;
     *:Bitrig:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
@@ -391,7 +389,7 @@
 	echo i386-pc-auroraux"$UNAME_RELEASE"
 	exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-	set_cc_for_build
+	eval "$set_cc_for_build"
 	SUN_ARCH=i386
 	# If there is a compiler, see if it is configured for 64-bit objects.
 	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
@@ -484,7 +482,7 @@
 	echo clipper-intergraph-clix"$UNAME_RELEASE"
 	exit ;;
     mips:*:*:UMIPS | mips:*:*:RISCos)
-	set_cc_for_build
+	eval "$set_cc_for_build"
 	sed 's/^	//' << EOF > "$dummy.c"
 #ifdef __cplusplus
 #include <stdio.h>  /* for printf() prototype */
@@ -581,7 +579,7 @@
 	exit ;;
     *:AIX:2:3)
 	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		set_cc_for_build
+		eval "$set_cc_for_build"
 		sed 's/^		//' << EOF > "$dummy.c"
 		#include <sys/systemcfg.h>
 
@@ -662,7 +660,7 @@
 		    esac
 		fi
 		if [ "$HP_ARCH" = "" ]; then
-		    set_cc_for_build
+		    eval "$set_cc_for_build"
 		    sed 's/^		//' << EOF > "$dummy.c"
 
 		#define _HPUX_SOURCE
@@ -702,7 +700,7 @@
 	esac
 	if [ "$HP_ARCH" = hppa2.0w ]
 	then
-	    set_cc_for_build
+	    eval "$set_cc_for_build"
 
 	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
 	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
@@ -728,7 +726,7 @@
 	echo ia64-hp-hpux"$HPUX_REV"
 	exit ;;
     3050*:HI-UX:*:*)
-	set_cc_for_build
+	eval "$set_cc_for_build"
 	sed 's/^	//' << EOF > "$dummy.c"
 	#include <unistd.h>
 	int
@@ -842,17 +840,6 @@
     *:BSD/OS:*:*)
 	echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
 	exit ;;
-    arm:FreeBSD:*:*)
-	UNAME_PROCESSOR=`uname -p`
-	set_cc_for_build
-	if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
-	    | grep -q __ARM_PCS_VFP
-	then
-	    echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi
-	else
-	    echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf
-	fi
-	exit ;;
     *:FreeBSD:*:*)
 	UNAME_PROCESSOR=`/usr/bin/uname -p`
 	case "$UNAME_PROCESSOR" in
@@ -894,7 +881,7 @@
 	echo "$UNAME_MACHINE"-pc-uwin
 	exit ;;
     amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-pc-cygwin
+	echo x86_64-unknown-cygwin
 	exit ;;
     prep*:SunOS:5.*:*)
 	echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
@@ -907,8 +894,8 @@
 	# other systems with GNU libc and userland
 	echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC"
 	exit ;;
-    *:Minix:*:*)
-	echo "$UNAME_MACHINE"-unknown-minix
+    i*86:Minix:*:*)
+	echo "$UNAME_MACHINE"-pc-minix
 	exit ;;
     aarch64:Linux:*:*)
 	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
@@ -935,7 +922,7 @@
 	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
 	exit ;;
     arm*:Linux:*:*)
-	set_cc_for_build
+	eval "$set_cc_for_build"
 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
 	    | grep -q __ARM_EABI__
 	then
@@ -984,51 +971,23 @@
 	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
 	exit ;;
     mips:Linux:*:* | mips64:Linux:*:*)
-	set_cc_for_build
-	IS_GLIBC=0
-	test x"${LIBC}" = xgnu && IS_GLIBC=1
+	eval "$set_cc_for_build"
 	sed 's/^	//' << EOF > "$dummy.c"
 	#undef CPU
-	#undef mips
-	#undef mipsel
-	#undef mips64
-	#undef mips64el
-	#if ${IS_GLIBC} && defined(_ABI64)
-	LIBCABI=gnuabi64
-	#else
-	#if ${IS_GLIBC} && defined(_ABIN32)
-	LIBCABI=gnuabin32
-	#else
-	LIBCABI=${LIBC}
-	#endif
-	#endif
-
-	#if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
-	CPU=mipsisa64r6
-	#else
-	#if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
-	CPU=mipsisa32r6
-	#else
-	#if defined(__mips64)
-	CPU=mips64
-	#else
-	CPU=mips
-	#endif
-	#endif
-	#endif
-
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
 	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	MIPS_ENDIAN=el
+	CPU=${UNAME_MACHINE}el
 	#else
 	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	MIPS_ENDIAN=
+	CPU=${UNAME_MACHINE}
 	#else
-	MIPS_ENDIAN=
+	CPU=
 	#endif
 	#endif
 EOF
-	eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`"
-	test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+	eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`"
+	test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; }
 	;;
     mips64el:Linux:*:*)
 	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
@@ -1141,7 +1100,7 @@
 	    *Pentium)	     UNAME_MACHINE=i586 ;;
 	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
 	esac
-	echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}"
+	echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}"
 	exit ;;
     i*86:*:3.2:*)
 	if test -f /usr/options/cb.name; then
@@ -1326,7 +1285,7 @@
 	exit ;;
     *:Darwin:*:*)
 	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	set_cc_for_build
+	eval "$set_cc_for_build"
 	if test "$UNAME_PROCESSOR" = unknown ; then
 	    UNAME_PROCESSOR=powerpc
 	fi
@@ -1399,7 +1358,6 @@
 	# "uname -m" is not consistent, so use $cputype instead. 386
 	# is converted to i386 for consistency with other x86
 	# operating systems.
-	# shellcheck disable=SC2154
 	if test "$cputype" = 386; then
 	    UNAME_MACHINE=i386
 	else
@@ -1456,135 +1414,8 @@
     amd64:Isilon\ OneFS:*:*)
 	echo x86_64-unknown-onefs
 	exit ;;
-    *:Unleashed:*:*)
-	echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"
-	exit ;;
 esac
 
-# No uname command or uname output not recognized.
-set_cc_for_build
-cat > "$dummy.c" <<EOF
-#ifdef _SEQUENT_
-#include <sys/types.h>
-#include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-  "4"
-#else
-  ""
-#endif
-  ); exit (0);
-#endif
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-  struct utsname un;
-
-  uname(&un);
-  if (strncmp(un.version, "V2", 2) == 0) {
-    printf ("i386-sequent-ptx2\n"); exit (0);
-  }
-  if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-    printf ("i386-sequent-ptx1\n"); exit (0);
-  }
-  printf ("i386-sequent-ptx\n"); exit (0);
-#endif
-
-#if defined (vax)
-#if !defined (ultrix)
-#include <sys/param.h>
-#if defined (BSD)
-#if BSD == 43
-  printf ("vax-dec-bsd4.3\n"); exit (0);
-#else
-#if BSD == 199006
-  printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#else
-  printf ("vax-dec-bsd\n"); exit (0);
-#endif
-#endif
-#else
-  printf ("vax-dec-bsd\n"); exit (0);
-#endif
-#else
-  printf ("vax-dec-ultrix\n"); exit (0);
-#endif
-#endif
-#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
-#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
-#include <signal.h>
-#if defined(_SIZE_T_) /* >= ULTRIX4 */
-  printf ("mips-dec-ultrix4\n"); exit (0);
-#else
-#if defined(ULTRIX3) || defined(ultrix3) || defined(SIGLOST)
-  printf ("mips-dec-ultrix3\n"); exit (0);
-#endif
-#endif
-#endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
-
 echo "$0: unable to guess system type" >&2
 
 case "$UNAME_MACHINE:$UNAME_SYSTEM" in

Modified: trunk/Build/source/utils/asymptote/config.h.in
===================================================================
--- trunk/Build/source/utils/asymptote/config.h.in	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/config.h.in	2019-03-27 22:27:57 UTC (rev 50622)
@@ -9,9 +9,6 @@
 /* System directory for global .asy files */
 #undef ASYMPTOTE_SYSDIR
 
-/* Define if gluNurbsCallback expects a variadic function. */
-#undef GLU_TESS_CALLBACK_TRIPLEDOT
-
 /* Define to 1 if you have the <curses.h> header file. */
 #undef HAVE_CURSES_H
 
@@ -51,9 +48,12 @@
 /* Define to 1 if you have the `GL' library (-lGL). */
 #undef HAVE_LIBGL
 
-/* Define to 1 if you have the `GLU' library (-lGLU). */
-#undef HAVE_LIBGLU
+/* Define if you have the `GLEW' library (-lGLEW). */
+#undef HAVE_LIBGLEW
 
+/* Define if you have the `OpenGL Mathematics' library. */
+#undef HAVE_LIBGLM
+
 /* Define to 1 if you have the `glut' library (-lglut). */
 #undef HAVE_LIBGLUT
 

Modified: trunk/Build/source/utils/asymptote/configure
===================================================================
--- trunk/Build/source/utils/asymptote/configure	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/configure	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for Asymptote 2.47.
+# Generated by GNU Autoconf 2.69 for Asymptote 2.48.
 #
 # Report bugs to <http://sourceforge.net/projects/asymptote>.
 #
@@ -580,8 +580,8 @@
 # Identity of this package.
 PACKAGE_NAME='Asymptote'
 PACKAGE_TARNAME='asymptote'
-PACKAGE_VERSION='2.47'
-PACKAGE_STRING='Asymptote 2.47'
+PACKAGE_VERSION='2.48'
+PACKAGE_STRING='Asymptote 2.48'
 PACKAGE_BUGREPORT='http://sourceforge.net/projects/asymptote'
 PACKAGE_URL=''
 
@@ -1283,7 +1283,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures Asymptote 2.47 to adapt to many kinds of systems.
+\`configure' configures Asymptote 2.48 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1348,7 +1348,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of Asymptote 2.47:";;
+     short | recursive ) echo "Configuration of Asymptote 2.48:";;
    esac
   cat <<\_ACEOF
 
@@ -1367,8 +1367,8 @@
   --enable-gsl[=yes]      enable GNU Scientific Library
   --enable-fftw[=yes]     enable FFTW Library
   --enable-gl[=yes]       enable OpenGL Library
-  --enable-offscreen[=yes]
-                          enable offscreen rendering using OSMesa library
+  --enable-offscreen[=no] enable experimental offscreen rendering using OSMesa
+                          library
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -1462,7 +1462,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-Asymptote configure 2.47
+Asymptote configure 2.48
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2048,7 +2048,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by Asymptote $as_me 2.47, which was
+It was created by Asymptote $as_me 2.48, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -5837,16 +5837,8 @@
 
 
 
-case "${host_os}" in
-    darwin*)
-      GCVERSION=7.6.0
-      ATOMICVERSION=7.6.0
-        ;;
-   *)
-      GCVERSION=7.6.2
-      ATOMICVERSION=7.6.2
-        ;;
-esac
+GCVERSION=8.0.2
+ATOMICVERSION=7.6.8
 
 GCFILE=gc-$GCVERSION
 ac_cv_use_gc="system"
@@ -5885,6 +5877,7 @@
 OPTIONS="-D_FILE_OFFSET_BITS=64 "
 GCLIB=
 GCPPLIB=
+INCL="-I."
 GCNAME="Boehm Garbage Collector"
 GCOPTIONS="--disable-shared"
 if test "x$ac_cv_use_gc" != "xno" ; then
@@ -5892,7 +5885,7 @@
    case _$ac_cv_use_gc in
    _|_system|_*[\\/]*)
       if test "x$ac_cv_use_gc" = "xsystem" ; then
-         INCL="-I$prefix/include/gc -I/usr/include/gc"
+         INCL="-I. -I$prefix/include/gc -I/usr/include/gc"
          LIBS=$LIBS"-L$prefix/lib "
       else
          INCL="-I$ac_cv_use_gc/include/gc"
@@ -5946,7 +5939,7 @@
 else
 
         GCDIR=$GCFILE
-        INCL="-I\$(GC)/include"
+        INCL="-I. -I\$(GC)/include"
 	GCLIB="\$(GC)/.libs/libgc.a"
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: $GCNAME library not found" >&5
 $as_echo "$as_me: $GCNAME library not found" >&6;}
@@ -5955,7 +5948,7 @@
 else
   GCDIR=$GCFILE
       GCLIB="\$(GC)/.libs/libgc.a"
-      INCL="-I\$(GC)/include"
+      INCL="-I. -I\$(GC)/include"
       { $as_echo "$as_me:${as_lineno-$LINENO}: $GCNAME header file not found" >&5
 $as_echo "$as_me: $GCNAME header file not found" >&6;}
 fi
@@ -5970,7 +5963,7 @@
       { $as_echo "$as_me:${as_lineno-$LINENO}: enabling local $GCNAME $GCDIR" >&5
 $as_echo "$as_me: enabling local $GCNAME $GCDIR" >&6;}
       GCLIB="\$(GC)/.libs/libgc.a"
-      INCL="-I\$(GC)/include"
+      INCL="-I. -I\$(GC)/include"
       ;;
    esac
 else
@@ -6010,7 +6003,7 @@
 INCL=$INCL" -I/usr/include/tirpc"
 
 if test "$OSTYPE" = "msdos"; then
-CPPFLAGS=$CPPFLAGS" -D__MSDOS__ $INCL"
+CPPFLAGS=$CPPFLAGS" -D__MSDOS__ -DCALLBACK=__stdcall $INCL"
 else
 CPPFLAGS=$CPPFLAGS" $INCL"
 fi
@@ -7108,6 +7101,26 @@
 if test "x$enable_gl" != "xno"; then
 case "$OSTYPE" in
      msdos)
+              ac_fn_cxx_check_header_mongrel "$LINENO" "glm/glm.hpp" "ac_cv_header_glm_glm_hpp" "$ac_includes_default"
+if test "x$ac_cv_header_glm_glm_hpp" = xyes; then :
+
+$as_echo "#define HAVE_LIBGLM 1" >>confdefs.h
+
+fi
+
+
+      	      ac_fn_cxx_check_header_mongrel "$LINENO" "GL/glut.h" "ac_cv_header_GL_glut_h" "$ac_includes_default"
+if test "x$ac_cv_header_GL_glut_h" = xyes; then :
+
+$as_echo "#define HAVE_LIBGLUT 1" >>confdefs.h
+
+			     LIBS=$LIBS"-lfreeglut "
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Could not find libfreeglut: will compile without OpenGL support ***" >&5
+$as_echo "$as_me: *** Could not find libfreeglut: will compile without OpenGL support ***" >&6;}
+fi
+
+
               ac_fn_cxx_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default"
 if test "x$ac_cv_header_GL_gl_h" = xyes; then :
 
@@ -7120,65 +7133,29 @@
 fi
 
 
-	    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluNewNurbsRenderer in -lGLU" >&5
-$as_echo_n "checking for gluNewNurbsRenderer in -lGLU... " >&6; }
-if ${ac_cv_lib_GLU_gluNewNurbsRenderer+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lGLU  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+              ac_fn_cxx_check_header_mongrel "$LINENO" "GL/glew.h" "ac_cv_header_GL_glew_h" "$ac_includes_default"
+if test "x$ac_cv_header_GL_glew_h" = xyes; then :
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char gluNewNurbsRenderer ();
-int
-main ()
-{
-return gluNewNurbsRenderer ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  ac_cv_lib_GLU_gluNewNurbsRenderer=yes
-else
-  ac_cv_lib_GLU_gluNewNurbsRenderer=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLU_gluNewNurbsRenderer" >&5
-$as_echo "$ac_cv_lib_GLU_gluNewNurbsRenderer" >&6; }
-if test "x$ac_cv_lib_GLU_gluNewNurbsRenderer" = xyes; then :
+$as_echo "#define HAVE_LIBGLEW 1" >>confdefs.h
 
-$as_echo "#define HAVE_LIBGLU 1" >>confdefs.h
- LIBS=$LIBS"-lglu32 "
+			     LIBS="-lGLEW "$LIBS
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Could not find libglu32: will compile without OpenGL support ***" >&5
-$as_echo "$as_me: *** Could not find libglu32: will compile without OpenGL support ***" >&6;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Could not find libGLEW: will compile without OpenGL support ***" >&5
+$as_echo "$as_me: *** Could not find libGLEW: will compile without OpenGL support ***" >&6;}
 fi
 
-	       	       ac_fn_cxx_check_header_mongrel "$LINENO" "GL/glut.h" "ac_cv_header_GL_glut_h" "$ac_includes_default"
-if test "x$ac_cv_header_GL_glut_h" = xyes; then :
 
-$as_echo "#define HAVE_LIBGLUT 1" >>confdefs.h
+        ;;
+     darwin*)
+              LIBS=$LIBS"-lgccpp "
+              ac_fn_cxx_check_header_mongrel "$LINENO" "glm/glm.hpp" "ac_cv_header_glm_glm_hpp" "$ac_includes_default"
+if test "x$ac_cv_header_glm_glm_hpp" = xyes; then :
 
-			     LIBS=$LIBS"-lfreeglut "
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Could not find libfreeglut: will compile without GLUT support ***" >&5
-$as_echo "$as_me: *** Could not find libfreeglut: will compile without GLUT support ***" >&6;}
+$as_echo "#define HAVE_LIBGLM 1" >>confdefs.h
+
 fi
 
 
-        ;;
-     darwin*)
               ac_fn_cxx_check_header_mongrel "$LINENO" "OpenGL/gl.h" "ac_cv_header_OpenGL_gl_h" "$ac_includes_default"
 if test "x$ac_cv_header_OpenGL_gl_h" = xyes; then :
 
@@ -7187,54 +7164,41 @@
 fi
 
 
-              ac_fn_cxx_check_header_mongrel "$LINENO" "OpenGL/glu.h" "ac_cv_header_OpenGL_glu_h" "$ac_includes_default"
-if test "x$ac_cv_header_OpenGL_glu_h" = xyes; then :
+              ac_fn_cxx_check_header_mongrel "$LINENO" "GLUT/glut.h" "ac_cv_header_GLUT_glut_h" "$ac_includes_default"
+if test "x$ac_cv_header_GLUT_glut_h" = xyes; then :
 
-$as_echo "#define HAVE_LIBGLU 1" >>confdefs.h
+$as_echo "#define HAVE_LIBGLUT 1" >>confdefs.h
 
+			   LIBS=$LIBS"-framework GLUT -framework OpenGL -framework Cocoa "
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Could not find glut: will compile without OpenGLLUT support ***" >&5
+$as_echo "$as_me: *** Could not find glut: will compile without OpenGLLUT support ***" >&6;}
 fi
 
 
-              ac_fn_cxx_check_header_mongrel "$LINENO" "GLUT/glut.h" "ac_cv_header_GLUT_glut_h" "$ac_includes_default"
-if test "x$ac_cv_header_GLUT_glut_h" = xyes; then :
+              ac_fn_cxx_check_header_mongrel "$LINENO" "OpenGL/glew.h" "ac_cv_header_OpenGL_glew_h" "$ac_includes_default"
+if test "x$ac_cv_header_OpenGL_glew_h" = xyes; then :
 
-$as_echo "#define HAVE_LIBGLUT 1" >>confdefs.h
+$as_echo "#define HAVE_LIBGLEW 1" >>confdefs.h
 
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+			     LIBS="-lGLEW "$LIBS
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Could not find libGLEW: will compile without OpenGL support ***" >&5
+$as_echo "$as_me: *** Could not find libGLEW: will compile without OpenGL support ***" >&6;}
+fi
 
-#include <OpenGL/gl.h>
-#include <OpenGL/glu.h>
-#ifndef GLU_TESS_CALLBACK_TRIPLEDOT
-typedef GLvoid (* _GLUfuncptr)(...);
-void f(void) {
-  gluNurbsCallback(gluNewNurbsRenderer(),GLU_NURBS_BEGIN,(_GLUfuncptr) glBegin);
-}
-#endif
 
-int
-main ()
-{
+        ;;
+     *)
+         ac_fn_cxx_check_header_mongrel "$LINENO" "glm/glm.hpp" "ac_cv_header_glm_glm_hpp" "$ac_includes_default"
+if test "x$ac_cv_header_glm_glm_hpp" = xyes; then :
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+$as_echo "#define HAVE_LIBGLM 1" >>confdefs.h
 
-$as_echo "#define GLU_TESS_CALLBACK_TRIPLEDOT 1" >>confdefs.h
-
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-			   LIBS=$LIBS"-framework GLUT -framework OpenGL -framework Cocoa"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Could not find glut: will compile without GLUT support ***" >&5
-$as_echo "$as_me: *** Could not find glut: will compile without GLUT support ***" >&6;}
-fi
 
 
-        ;;
-     *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glDepthMask in -lGL" >&5
+          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glDepthMask in -lGL" >&5
 $as_echo_n "checking for glDepthMask in -lGL... " >&6; }
 if ${ac_cv_lib_GL_glDepthMask+:} false; then :
   $as_echo_n "(cached) " >&6
@@ -7279,54 +7243,6 @@
 
 fi
 
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluNewNurbsRenderer in -lGLU" >&5
-$as_echo_n "checking for gluNewNurbsRenderer in -lGLU... " >&6; }
-if ${ac_cv_lib_GLU_gluNewNurbsRenderer+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lGLU  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char gluNewNurbsRenderer ();
-int
-main ()
-{
-return gluNewNurbsRenderer ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  ac_cv_lib_GLU_gluNewNurbsRenderer=yes
-else
-  ac_cv_lib_GLU_gluNewNurbsRenderer=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLU_gluNewNurbsRenderer" >&5
-$as_echo "$ac_cv_lib_GLU_gluNewNurbsRenderer" >&6; }
-if test "x$ac_cv_lib_GLU_gluNewNurbsRenderer" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBGLU 1
-_ACEOF
-
-  LIBS="-lGLU $LIBS"
-
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Could not find libGLU: will compile without OpenGL support ***" >&5
-$as_echo "$as_me: *** Could not find libGLU: will compile without OpenGL support ***" >&6;}
-fi
-
 	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glutMainLoop in -lglut" >&5
 $as_echo_n "checking for glutMainLoop in -lglut... " >&6; }
 if ${ac_cv_lib_glut_glutMainLoop+:} false; then :
@@ -7375,8 +7291,20 @@
 $as_echo "$as_me: *** Could not find libglut: will compile without GLUT support ***" >&6;}
 fi
 
+          ac_fn_cxx_check_header_mongrel "$LINENO" "GL/glew.h" "ac_cv_header_GL_glew_h" "$ac_includes_default"
+if test "x$ac_cv_header_GL_glew_h" = xyes; then :
+
+$as_echo "#define HAVE_LIBGLEW 1" >>confdefs.h
+
+            LIBS="-lGLEW "$LIBS
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Could not find libGLEW: will compile without OpenGL support ***" >&5
+$as_echo "$as_me: *** Could not find libGLEW: will compile without OpenGL support ***" >&6;}
+fi
+
+
 esac
-   if test "x$enable_offscreen" != "xno"; then
+   if test "x$enable_offscreen" == "xyes"; then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OSMesaCreateContext in -lOSMesa" >&5
 $as_echo_n "checking for OSMesaCreateContext in -lOSMesa... " >&6; }
 if ${ac_cv_lib_OSMesa_OSMesaCreateContext+:} false; then :
@@ -8550,7 +8478,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by Asymptote $as_me 2.47, which was
+This file was extended by Asymptote $as_me 2.48, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -8612,7 +8540,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-Asymptote config.status 2.47
+Asymptote config.status 2.48
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 

Modified: trunk/Build/source/utils/asymptote/configure.ac
===================================================================
--- trunk/Build/source/utils/asymptote/configure.ac	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/configure.ac	2019-03-27 22:27:57 UTC (rev 50622)
@@ -3,7 +3,7 @@
 # this file.
 
 AC_PREREQ(2)
-AC_INIT([Asymptote],[2.47],[http://sourceforge.net/projects/asymptote])
+AC_INIT([Asymptote],[2.48],[http://sourceforge.net/projects/asymptote])
 VERSION=$PACKAGE_VERSION
 AC_SUBST(VERSION)
 m4_include([ax_pthread.m4])
@@ -124,16 +124,8 @@
 			      [Define to 1 if you have tr1/unordered_map]),
 	[AC_CHECK_HEADER(ext/hash_map,,OPTIONS=$OPTIONS"-DNOHASH ")])])
 
-case "${host_os}" in
-    darwin*)
-      GCVERSION=7.6.0
-      ATOMICVERSION=7.6.0
-        ;;
-   *)
-      GCVERSION=7.6.2
-      ATOMICVERSION=7.6.2
-        ;;
-esac
+GCVERSION=8.0.2
+ATOMICVERSION=7.6.8
 
 GCFILE=gc-$GCVERSION
 ac_cv_use_gc="system"
@@ -154,6 +146,7 @@
 OPTIONS="-D_FILE_OFFSET_BITS=64 "
 GCLIB=
 GCPPLIB=
+INCL="-I."
 GCNAME="Boehm Garbage Collector"
 GCOPTIONS="--disable-shared"
 if test "x$ac_cv_use_gc" != "xno" ; then
@@ -161,7 +154,7 @@
    case _$ac_cv_use_gc in
    _|_system|_*[[\\/]]*)
       if test "x$ac_cv_use_gc" = "xsystem" ; then
-         INCL="-I$prefix/include/gc -I/usr/include/gc"
+         INCL="-I. -I$prefix/include/gc -I/usr/include/gc"
          LIBS=$LIBS"-L$prefix/lib " 
       else 
          INCL="-I$ac_cv_use_gc/include/gc"
@@ -174,12 +167,12 @@
 	  LIBS=$LIBS"-lgc "
 	  AC_MSG_NOTICE([enabling system $GCNAME])],[
         GCDIR=$GCFILE
-        INCL="-I\$(GC)/include"
+        INCL="-I. -I\$(GC)/include"
 	GCLIB="\$(GC)/.libs/libgc.a"
 	AC_MSG_NOTICE($GCNAME library not found)]),
       GCDIR=$GCFILE
       GCLIB="\$(GC)/.libs/libgc.a"
-      INCL="-I\$(GC)/include"
+      INCL="-I. -I\$(GC)/include"
       AC_MSG_NOTICE($GCNAME header file not found))
       CPPFLAGS=$CPPFLAGS_SAVE
       ;;
@@ -189,7 +182,7 @@
       GCDIR=$GCFILE
       AC_MSG_NOTICE([enabling local $GCNAME $GCDIR])
       GCLIB="\$(GC)/.libs/libgc.a"
-      INCL="-I\$(GC)/include"
+      INCL="-I. -I\$(GC)/include"
       ;;
    esac
 else
@@ -221,7 +214,7 @@
 INCL=$INCL" -I/usr/include/tirpc"
 
 if test "$OSTYPE" = "msdos"; then
-CPPFLAGS=$CPPFLAGS" -D__MSDOS__ $INCL"
+CPPFLAGS=$CPPFLAGS" -D__MSDOS__ -DCALLBACK=__stdcall $INCL"
 else
 CPPFLAGS=$CPPFLAGS" $INCL"
 fi
@@ -314,54 +307,62 @@
 [AS_HELP_STRING(--enable-gl[[[=yes]]],enable OpenGL Library)])
 
 AC_ARG_ENABLE(offscreen,
-[AS_HELP_STRING(--enable-offscreen[[[=yes]]],enable offscreen rendering using OSMesa library)])
+[AS_HELP_STRING(--enable-offscreen[[[=no]]],enable experimental offscreen rendering using OSMesa library)])
 
 if test "x$enable_gl" != "xno"; then
 case "$OSTYPE" in
      msdos)
+              AC_CHECK_HEADER(glm/glm.hpp,
+                         [AC_DEFINE(HAVE_LIBGLM, 1,
+	             [Define if you have the `OpenGL Mathematics' library.])])
+      	      AC_CHECK_HEADER(GL/glut.h,
+				  [AC_DEFINE(HAVE_LIBGLUT, 1,
+		     [Define if you have the `freeglut' library (-lfreeglut).])
+			     LIBS=$LIBS"-lfreeglut "],
+				   AC_MSG_NOTICE([*** Could not find libfreeglut: will compile without OpenGL support ***]))
               AC_CHECK_HEADER(GL/gl.h,
 				  [AC_DEFINE(HAVE_LIBGL, 1,
 		     [Define if you have the `opengl32' library (-lopengl32).])
 			     LIBS=$LIBS"-lopengl32 "],
 				   AC_MSG_NOTICE([*** Could not find libopengl32: will compile without OpenGL support ***]))
-	    AC_CHECK_LIB([GLU], [gluNewNurbsRenderer],[AC_DEFINE(HAVE_LIBGLU, 1,
-		              [Define to 1 if you have the `glu32' library (-lglu32).]) LIBS=$LIBS"-lglu32 "],
-	    AC_MSG_NOTICE([*** Could not find libglu32: will compile without OpenGL support ***]))
-	       	       AC_CHECK_HEADER(GL/glut.h,
-				  [AC_DEFINE(HAVE_LIBGLUT, 1,
-		     [Define if you have the `freeglut' library (-lfreeglut).])
-			     LIBS=$LIBS"-lfreeglut "],
-				   AC_MSG_NOTICE([*** Could not find libfreeglut: will compile without GLUT support ***]))
+              AC_CHECK_HEADER(GL/glew.h,
+				  [AC_DEFINE(HAVE_LIBGLEW, 1,
+		     [Define if you have the `GLEW' library (-lGLEW).])
+			     LIBS="-lGLEW "$LIBS],
+				   AC_MSG_NOTICE([*** Could not find libGLEW: will compile without OpenGL support ***]))
         ;;                                 
      darwin*) 
+              LIBS=$LIBS"-lgccpp "
+              AC_CHECK_HEADER(glm/glm.hpp,
+                         [AC_DEFINE(HAVE_LIBGLM, 1,
+	             [Define if you have the `OpenGL Mathematics' library.])])
               AC_CHECK_HEADER(OpenGL/gl.h,
                              [AC_DEFINE(HAVE_LIBGL, 1,
 		             [Define if you have the `OpenGL' library.])])
-              AC_CHECK_HEADER(OpenGL/glu.h,
-                              [AC_DEFINE(HAVE_LIBGLU, 1,
-			      [Define if you have the `GLU' library.])])
               AC_CHECK_HEADER(GLUT/glut.h, [AC_DEFINE(HAVE_LIBGLUT, 1,
 		   [Define if you have the `GLUT' library.])
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
-#include <OpenGL/gl.h>
-#include <OpenGL/glu.h>
-#ifndef GLU_TESS_CALLBACK_TRIPLEDOT
-typedef GLvoid (* _GLUfuncptr)(...);
-void f(void) {
-  gluNurbsCallback(gluNewNurbsRenderer(),GLU_NURBS_BEGIN,(_GLUfuncptr) glBegin);
-}
-#endif
-])],[AC_DEFINE(GLU_TESS_CALLBACK_TRIPLEDOT, 1, [Define if gluNurbsCallback expects a variadic function.])])
-			   LIBS=$LIBS"-framework GLUT -framework OpenGL -framework Cocoa"],
-				 AC_MSG_NOTICE([*** Could not find glut: will compile without GLUT support ***]))
+			   LIBS=$LIBS"-framework GLUT -framework OpenGL -framework Cocoa "],
+				 AC_MSG_NOTICE([*** Could not find glut: will compile without OpenGLLUT support ***]))
+              AC_CHECK_HEADER(OpenGL/glew.h,
+				  [AC_DEFINE(HAVE_LIBGLEW, 1,
+		     [Define if you have the `GLEW' library (-lGLEW).])
+			     LIBS="-lGLEW "$LIBS],
+				   AC_MSG_NOTICE([*** Could not find libGLEW: will compile without OpenGL support ***]))
         ;;                                 
-     *) AC_CHECK_LIB([GL], [glDepthMask])
-        AC_CHECK_LIB([GLU], [gluNewNurbsRenderer],,
-	             AC_MSG_NOTICE([*** Could not find libGLU: will compile without OpenGL support ***]))
+     *)
+         AC_CHECK_HEADER(glm/glm.hpp,
+                         [AC_DEFINE(HAVE_LIBGLM, 1,
+	             [Define if you have the `OpenGL Mathematics' library.])])
+          AC_CHECK_LIB([GL], [glDepthMask])
 	  AC_CHECK_LIB([glut], [glutMainLoop],,
 		       AC_MSG_NOTICE([*** Could not find libglut: will compile without GLUT support ***]))
+          AC_CHECK_HEADER(GL/glew.h,
+            [AC_DEFINE(HAVE_LIBGLEW, 1,
+	    [Define if you have the `GLEW' library (-lGLEW).])
+            LIBS="-lGLEW "$LIBS],
+            AC_MSG_NOTICE([*** Could not find libGLEW: will compile without OpenGL support ***]))
 esac
-   if test "x$enable_offscreen" != "xno"; then
+   if test "x$enable_offscreen" == "xyes"; then
            AC_CHECK_LIB([OSMesa],OSMesaCreateContext,,
 			AC_MSG_NOTICE([*** Could not find libOSMesa: will compile without offscreen rendering support ***]))
    fi

Modified: trunk/Build/source/utils/asymptote/doc/CAD.pdf
===================================================================
(Binary files differ)

Modified: trunk/Build/source/utils/asymptote/doc/FAQ/asy-faq.info
===================================================================
--- trunk/Build/source/utils/asymptote/doc/FAQ/asy-faq.info	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/doc/FAQ/asy-faq.info	2019-03-27 22:27:57 UTC (rev 50622)
@@ -10,7 +10,7 @@
 File: asy-faq.info, Node: Top, Next: Question 1.1, Up: (dir)
 
             ASYMPTOTE FREQUENTLY ASKED QUESTIONS
-                            30 Jul 2018
+                            27 Mar 2019
                           
 This is the list of Frequently Asked Questions about Asymptote (asy).
 

Modified: trunk/Build/source/utils/asymptote/doc/TeXShopAndAsymptote.pdf
===================================================================
(Binary files differ)

Modified: trunk/Build/source/utils/asymptote/doc/asy-latex.dtx
===================================================================
--- trunk/Build/source/utils/asymptote/doc/asy-latex.dtx	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/doc/asy-latex.dtx	2019-03-27 22:27:57 UTC (rev 50622)
@@ -435,8 +435,8 @@
     \next%
   }
 \endgroup
-\def\asy at init{
-  \def\ASYlatexdir{}
+\def\asy at init{%
+  \def\ASYlatexdir{}%
   \ifx\asylatexdir\empty\else
     \def\ASYlatexdir{\asylatexdir/}%
   \fi
@@ -466,7 +466,7 @@
   \immediate\write\AsyPreStream{%
     \noexpand\InputIfFileExists{%
       \ASYprefix\noexpand\jobname-\the\c at asy.pre}{}{}%
-  }
+  }%
   \asy at write@graphic at header
   \let\ThisAsymptote\WriteAsyLine
   \ProcessAsymptote{asy}%

Modified: trunk/Build/source/utils/asymptote/doc/asy-latex.pdf
===================================================================
(Binary files differ)

Modified: trunk/Build/source/utils/asymptote/doc/asy.1
===================================================================
--- trunk/Build/source/utils/asymptote/doc/asy.1	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/doc/asy.1	2019-03-27 22:27:57 UTC (rev 50622)
@@ -166,6 +166,9 @@
 .B \-maxtile pair        
 Maximum rendering tile size [(1024,768)].
 .TP
+.B \-maxvertices n       
+Maximum number of vertices to queue [0].
+.TP
 .B \-maxviewport pair    
 Maximum viewport size [(2048,2048)].
 .TP

Modified: trunk/Build/source/utils/asymptote/doc/asyRefCard.pdf
===================================================================
(Binary files differ)

Modified: trunk/Build/source/utils/asymptote/doc/asymptote.pdf
===================================================================
(Binary files differ)

Modified: trunk/Build/source/utils/asymptote/doc/asymptote.sty
===================================================================
--- trunk/Build/source/utils/asymptote/doc/asymptote.sty	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/doc/asymptote.sty	2019-03-27 22:27:57 UTC (rev 50622)
@@ -186,8 +186,8 @@
     \next%
   }
 \endgroup
-\def\asy at init{
-  \def\ASYlatexdir{}
+\def\asy at init{%
+  \def\ASYlatexdir{}%
   \ifx\asylatexdir\empty\else
     \def\ASYlatexdir{\asylatexdir/}%
   \fi
@@ -206,7 +206,7 @@
   \immediate\write\AsyPreStream{%
     \noexpand\InputIfFileExists{%
       \ASYprefix\noexpand\jobname-\the\c at asy.pre}{}{}%
-  }
+  }%
   \asy at write@graphic at header
   \let\ThisAsymptote\WriteAsyLine
   \ProcessAsymptote{asy}%

Modified: trunk/Build/source/utils/asymptote/doc/asymptote.texi
===================================================================
--- trunk/Build/source/utils/asymptote/doc/asymptote.texi	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/doc/asymptote.texi	2019-03-27 22:27:57 UTC (rev 50622)
@@ -742,7 +742,7 @@
 The following commands are needed to install the latest development version of
 @code{Asymptote} using @code{git}:
 @verbatim
-git clone http://github.com/vectorgraphics/asymptote
+git clone https://github.com/vectorgraphics/asymptote
 
 cd asymptote
 ./autogen.sh
@@ -1297,7 +1297,7 @@
 @end verbatim
 @cindex @code{stroke}
 If @code{stroke=true}, the region filled is the same as the region that
-would be drawn by @code{draw(pic,g,fillrule+zerowinding)}; in this case the path
+would be drawn by @code{draw(pic,g,zerowinding)}; in this case the path
 @code{g} need not be cyclic.
 The pens in @code{p} must belong to the same color space. One can use the
 functions @code{rgb(pen)} or @code{cmyk(pen)} to promote pens to a
@@ -1425,7 +1425,7 @@
 Clip the current contents of picture @code{pic} to the region bounded
 by the path @code{g}, using fill rule @code{fillrule} (@pxref{fillrule}).
 If @code{stroke=true}, the clipped portion is the same as the region
-that would be drawn with @code{draw(pic,g,fillrule+zerowinding)}; in
+that would be drawn with @code{draw(pic,g,zerowinding)}; in
 this case the path @code{g} need not be cyclic. For an illustration of
 picture clipping, see the first example in @ref{LaTeX usage}.
 
@@ -6162,7 +6162,7 @@
 @end quotation
 @noindent
 after putting the contents of
- at url{http://sourceforge.net/p/asymptote/code/HEAD/tree/trunk/asymptote/doc/latexmkrc}
+ at url{https://raw.githubusercontent.com/vectorgraphics/asymptote/HEAD/doc/latexmkrc}
 @noindent
 in a file @code{latexmkrc} in the same directory. The command
 @verbatim
@@ -7913,8 +7913,8 @@
 @verbatim
 import settings;
 leftbutton=new string[] {"rotate","zoom","shift","pan"};
-middlebutton=new string[] {"menu"};
-rightbutton=new string[] {"zoom/menu","rotateX","rotateY","rotateZ"};
+middlebutton=new string[] {""};
+rightbutton=new string[] {"zoom","rotateX","rotateY","rotateZ"};
 wheelup=new string[] {"zoomin"};
 wheeldown=new string[] {"zoomout"};
 @end verbatim
@@ -7924,11 +7924,9 @@
 @item Shift Left: zoom
 @item Ctrl Left: shift viewport
 @item Alt Left: pan
- at item Middle: menu (must be unmodified; ignores Shift, Ctrl, and Alt)
 @item Wheel Up: zoom in
 @item Wheel Down: zoom out
- at item Right: zoom/menu (must be unmodified)
- at item Right double click: menu
+ at item Right: zoom
 @item Shift Right: rotate about the X axis
 @item Ctrl Right: rotate about the Y axis
 @item Alt Right: rotate about the Z axis
@@ -7963,7 +7961,7 @@
 @cindex @code{maxviewport}
 @cindex @code{maxtile}
 @cindex @code{glOptions}
- at cindex @code{iconic}
+ at cindex @code{iconify}
 @cindex @code{black stripes}
 @item Render the scene to a specified rasterized format @code{outformat}
 at the resolution of @code{n} pixels per @code{bp}, as specified by the
@@ -9504,7 +9502,7 @@
 @code{numpy}:
 
 @verbatim
-pip3 install pyqt5 cson numpy
+pip3 install cson numpy pyqt5 PyQt5.sip
 @end verbatim
 
 Pictures are deconstructed into the @acronym{SVG} image format.
@@ -9736,7 +9734,7 @@
 contributors include Orest Shardt, Jesse Frohlich, Michail Vidiassov,
 Charles Staats, Philippe Ivaldi, Olivier Guib@'e, Radoslav Marinov,
 Jeff Samuelson, Chris Savage, Jacques Pienaar, Mark Henning, Steve Melenchuk,
-Martin Wiebusch, and Stefan Knorr.
+Martin Wiebusch, Stefan Knorr, and Supakorn ``Jamie'' Rassameemasmuang.
 
 @node Index,  , Credits, Top
 @unnumbered Index

Modified: trunk/Build/source/utils/asymptote/doc/latexmkrc
===================================================================
--- trunk/Build/source/utils/asymptote/doc/latexmkrc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/doc/latexmkrc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1,4 +1,4 @@
-sub asy {return system("asy '$_[0]'");}
+sub asy {return system("asy \"$_[0]\"");}
 add_cus_dep("asy","eps",0,"asy");
 add_cus_dep("asy","pdf",0,"asy");
 add_cus_dep("asy","tex",0,"asy");

Modified: trunk/Build/source/utils/asymptote/doc/png/asymptote.info
===================================================================
--- trunk/Build/source/utils/asymptote/doc/png/asymptote.info	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/doc/png/asymptote.info	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1,7 +1,7 @@
 This is asymptote.info, produced by makeinfo version 6.5 from
 asymptote.texi.
 
-This file documents 'Asymptote', version 2.47.
+This file documents 'Asymptote', version 2.48.
 
    <http://asymptote.sourceforge.net>
 
@@ -22,7 +22,7 @@
 Asymptote
 *********
 
-This file documents 'Asymptote', version 2.47.
+This file documents 'Asymptote', version 2.48.
 
    <http://asymptote.sourceforge.net>
 
@@ -601,7 +601,7 @@
 
 The following commands are needed to install the latest development
 version of 'Asymptote' using 'git':
-git clone http://github.com/vectorgraphics/asymptote
+git clone https://github.com/vectorgraphics/asymptote
 
 cd asymptote
 ./autogen.sh
@@ -1027,10 +1027,10 @@
 void latticeshade(picture pic=currentpicture, path g, bool stroke=false,
                   pen fillrule=currentpen, pen[][] p)
    If 'stroke=true', the region filled is the same as the region that
-would be drawn by 'draw(pic,g,fillrule+zerowinding)'; in this case the
-path 'g' need not be cyclic.  The pens in 'p' must belong to the same
-color space.  One can use the functions 'rgb(pen)' or 'cmyk(pen)' to
-promote pens to a higher color space, as illustrated in the example file
+would be drawn by 'draw(pic,g,zerowinding)'; in this case the path 'g'
+need not be cyclic.  The pens in 'p' must belong to the same color
+space.  One can use the functions 'rgb(pen)' or 'cmyk(pen)' to promote
+pens to a higher color space, as illustrated in the example file
 'latticeshading.asy'.
 
    Axial gradient shading varying smoothly from 'pena' to 'penb' in the
@@ -1116,9 +1116,9 @@
    Clip the current contents of picture 'pic' to the region bounded by
 the path 'g', using fill rule 'fillrule' (*note fillrule::).  If
 'stroke=true', the clipped portion is the same as the region that would
-be drawn with 'draw(pic,g,fillrule+zerowinding)'; in this case the path
-'g' need not be cyclic.  For an illustration of picture clipping, see
-the first example in *note LaTeX usage::.
+be drawn with 'draw(pic,g,zerowinding)'; in this case the path 'g' need
+not be cyclic.  For an illustration of picture clipping, see the first
+example in *note LaTeX usage::.
 
 
 File: asymptote.info,  Node: label,  Prev: clip,  Up: Drawing commands
@@ -4785,7 +4785,7 @@
 'Asymptote' code is to use the 'latexmk' utility from
      <http://mirror.ctan.org/support/latexmk/>
 after putting the contents of
-<http://sourceforge.net/p/asymptote/code/HEAD/tree/trunk/asymptote/doc/latexmkrc>
+<https://raw.githubusercontent.com/vectorgraphics/asymptote/HEAD/doc/latexmkrc>
 in a file 'latexmkrc' in the same directory.  The command
 latexmk -pdf latexusage
 will then call 'Asymptote' automatically, recompiling only the figures
@@ -6882,8 +6882,8 @@
      default settings
      import settings;
      leftbutton=new string[] {"rotate","zoom","shift","pan"};
-     middlebutton=new string[] {"menu"};
-     rightbutton=new string[] {"zoom/menu","rotateX","rotateY","rotateZ"};
+     middlebutton=new string[] {""};
+     rightbutton=new string[] {"zoom","rotateX","rotateY","rotateZ"};
      wheelup=new string[] {"zoomin"};
      wheeldown=new string[] {"zoomout"};
      bind the mouse buttons as follows:
@@ -6891,12 +6891,9 @@
         * Shift Left: zoom
         * Ctrl Left: shift viewport
         * Alt Left: pan
-        * Middle: menu (must be unmodified; ignores Shift, Ctrl, and
-          Alt)
         * Wheel Up: zoom in
         * Wheel Down: zoom out
-        * Right: zoom/menu (must be unmodified)
-        * Right double click: menu
+        * Right: zoom
         * Shift Right: rotate about the X axis
         * Ctrl Right: rotate about the Y axis
         * Alt Right: rotate about the Z axis
@@ -8097,6 +8094,7 @@
 -loop                  Loop 3D animations [false]
 -m,-mask               Mask fpu exceptions; command-line only
 -maxtile pair          Maximum rendering tile size [(1024,768)]
+-maxvertices n         Maximum number of vertices to queue [0]
 -maxviewport pair      Maximum viewport size [(2048,2048)]
 -multiline             Input code over multiple lines at the prompt [false]
 -multipleView          View output from multiple batch-mode files [false]
@@ -8372,7 +8370,7 @@
 it requires 'Python' (<http://www.python.org>), along with the 'Python'
 packages 'pyqt5', 'cson', and 'numpy':
 
-pip3 install pyqt5 cson numpy
+pip3 install cson numpy pyqt5 PyQt5.sip
 
    Pictures are deconstructed into the SVG image format.  Since 'Qt5'
 does not suport 'SVG' clipping, you will need the 'rsvg-convert'
@@ -8542,7 +8540,7 @@
 include Orest Shardt, Jesse Frohlich, Michail Vidiassov, Charles Staats,
 Philippe Ivaldi, Olivier Guibe', Radoslav Marinov, Jeff Samuelson, Chris
 Savage, Jacques Pienaar, Mark Henning, Steve Melenchuk, Martin Wiebusch,
-and Stefan Knorr.
+Stefan Knorr, and Supakorn "Jamie" Rassameemasmuang.
 
 
 File: asymptote.info,  Node: Index,  Prev: Credits,  Up: Top
@@ -8592,9 +8590,9 @@
 * ---:                                   Bezier curves.      (line   84)
 * -=:                                    Self & prefix operators.
                                                              (line    6)
-* -c:                                    Options.            (line  184)
-* -l:                                    Options.            (line  203)
-* -u:                                    Options.            (line  194)
+* -c:                                    Options.            (line  185)
+* -l:                                    Options.            (line  204)
+* -u:                                    Options.            (line  195)
 * -V:                                    Configuring.        (line    6)
 * -V <1>:                                Drawing in batch mode.
                                                              (line   16)
@@ -8607,7 +8605,7 @@
 * 2D graphs:                             graph.              (line    6)
 * 3D graphs:                             graph3.             (line    6)
 * 3D grids:                              grid3.              (line    6)
-* 3D PostScript:                         three.              (line  583)
+* 3D PostScript:                         three.              (line  580)
 * ::                                     Arithmetic & logical.
                                                              (line   61)
 * :::                                    Bezier curves.      (line   70)
@@ -8642,7 +8640,7 @@
                                                              (line   35)
 * accel:                                 Paths and guides.   (line  126)
 * accel <1>:                             Paths and guides.   (line  132)
-* accel <2>:                             three.              (line  484)
+* accel <2>:                             three.              (line  481)
 * access:                                Import.             (line    6)
 * acknowledgments:                       Credits.            (line    6)
 * acos:                                  Mathematical functions.
@@ -8655,8 +8653,8 @@
                                                              (line  212)
 * add <1>:                               Frames and pictures.
                                                              (line  228)
-* add <2>:                               three.              (line  256)
-* addViews:                              three.              (line  377)
+* add <2>:                               three.              (line  253)
+* addViews:                              three.              (line  374)
 * adjust:                                Pens.               (line  123)
 * Ai:                                    Mathematical functions.
                                                              (line   48)
@@ -8667,7 +8665,7 @@
 * alias:                                 Structures.         (line   62)
 * alias <1>:                             Arrays.             (line  174)
 * Align:                                 label.              (line   12)
-* aligndir:                              Options.            (line  176)
+* aligndir:                              Options.            (line  177)
 * all:                                   Arrays.             (line  325)
 * Allow:                                 Pens.               (line  347)
 * and:                                   Bezier curves.      (line   56)
@@ -8680,22 +8678,22 @@
 * animation:                             animation.          (line    6)
 * animation <1>:                         animation.          (line    6)
 * annotate:                              annotate.           (line    6)
-* antialias:                             three.              (line  195)
-* antialias <1>:                         Options.            (line  147)
+* antialias:                             three.              (line  192)
+* antialias <1>:                         Options.            (line  148)
 * append:                                Files.              (line   36)
 * append <1>:                            Arrays.             (line   39)
 * arc:                                   Paths and guides.   (line   24)
 * Arc:                                   Paths and guides.   (line   37)
-* arc <1>:                               three.              (line  267)
+* arc <1>:                               three.              (line  264)
 * ArcArrow:                              draw.               (line   26)
-* ArcArrow3:                             three.              (line  550)
+* ArcArrow3:                             three.              (line  547)
 * ArcArrows:                             draw.               (line   26)
-* ArcArrows3:                            three.              (line  550)
+* ArcArrows3:                            three.              (line  547)
 * arclength:                             Paths and guides.   (line  153)
-* arclength <1>:                         three.              (line  484)
+* arclength <1>:                         three.              (line  481)
 * arcpoint:                              Paths and guides.   (line  163)
 * arctime:                               Paths and guides.   (line  157)
-* arctime <1>:                           three.              (line  484)
+* arctime <1>:                           three.              (line  481)
 * arguments:                             Default arguments.  (line    6)
 * arithmetic operators:                  Arithmetic & logical.
                                                              (line    6)
@@ -8709,10 +8707,10 @@
 * arrow keys:                            Drawing in interactive mode.
                                                              (line   11)
 * arrow keys <1>:                        GUI usage.          (line    6)
-* Arrow3:                                three.              (line  550)
+* Arrow3:                                three.              (line  547)
 * arrows:                                draw.               (line   26)
 * Arrows:                                draw.               (line   26)
-* Arrows3:                               three.              (line  550)
+* Arrows3:                               three.              (line  547)
 * as:                                    Import.             (line   67)
 * ascii:                                 Data types.         (line  308)
 * ascii <1>:                             Data types.         (line  308)
@@ -8733,7 +8731,7 @@
 * asyinclude:                            LaTeX usage.        (line   45)
 * asymptote.sty:                         LaTeX usage.        (line    6)
 * asymptote.xml:                         Editing modes.      (line   48)
-* ASYMPTOTE_CONFIG:                      Options.            (line  118)
+* ASYMPTOTE_CONFIG:                      Options.            (line  119)
 * atan:                                  Mathematical functions.
                                                              (line    6)
 * aTan:                                  Mathematical functions.
@@ -8747,8 +8745,8 @@
                                                              (line  273)
 * attach <1>:                            LaTeX usage.        (line   50)
 * attach <2>:                            graph.              (line  407)
-* autoadjust:                            three.              (line  342)
-* autoimport:                            Options.            (line  114)
+* autoadjust:                            three.              (line  339)
+* autoimport:                            Options.            (line  115)
 * automatic scaling:                     graph.              (line  691)
 * automatic scaling <1>:                 graph.              (line  691)
 * axialshade:                            fill.               (line   43)
@@ -8760,11 +8758,11 @@
 * babel:                                 babel.              (line    6)
 * background color:                      Frames and pictures.
                                                              (line  180)
-* BackView:                              three.              (line  370)
+* BackView:                              three.              (line  367)
 * Bar:                                   draw.               (line   19)
-* Bar3:                                  three.              (line  550)
+* Bar3:                                  three.              (line  547)
 * Bars:                                  draw.               (line   19)
-* Bars3:                                 three.              (line  550)
+* Bars3:                                 three.              (line  547)
 * barsize:                               draw.               (line   19)
 * base modules:                          Base modules.       (line    6)
 * basealign:                             Pens.               (line  181)
@@ -8773,18 +8771,18 @@
                                                              (line    6)
 * beep:                                  Data types.         (line  381)
 * BeginArcArrow:                         draw.               (line   26)
-* BeginArcArrow3:                        three.              (line  550)
+* BeginArcArrow3:                        three.              (line  547)
 * BeginArrow:                            draw.               (line   26)
-* BeginArrow3:                           three.              (line  550)
+* BeginArrow3:                           three.              (line  547)
 * BeginBar:                              draw.               (line   19)
-* BeginBar3:                             three.              (line  550)
+* BeginBar3:                             three.              (line  547)
 * BeginDotMargin:                        draw.               (line   42)
-* BeginDotMargin3:                       three.              (line  566)
+* BeginDotMargin3:                       three.              (line  563)
 * BeginMargin:                           draw.               (line   42)
-* BeginMargin3:                          three.              (line  566)
+* BeginMargin3:                          three.              (line  563)
 * BeginPenMargin:                        draw.               (line   42)
-* BeginPenMargin2:                       three.              (line  566)
-* BeginPenMargin3:                       three.              (line  566)
+* BeginPenMargin2:                       three.              (line  563)
+* BeginPenMargin3:                       three.              (line  563)
 * BeginPoint:                            label.              (line   55)
 * Bessel:                                Mathematical functions.
                                                              (line   48)
@@ -8796,7 +8794,7 @@
 * bezulate:                              three.              (line  106)
 * Bi:                                    Mathematical functions.
                                                              (line   48)
-* Billboard:                             three.              (line  454)
+* Billboard:                             three.              (line  451)
 * binary:                                Files.              (line   76)
 * binary format:                         Files.              (line   76)
 * binary operators:                      Arithmetic & logical.
@@ -8804,7 +8802,7 @@
 * binarytree:                            binarytree.         (line    6)
 * Bi_deriv:                              Mathematical functions.
                                                              (line   48)
-* black stripes:                         three.              (line  195)
+* black stripes:                         three.              (line  192)
 * Blank:                                 draw.               (line   26)
 * block.bottom:                          flowchart.          (line   19)
 * block.bottomleft:                      flowchart.          (line   19)
@@ -8823,7 +8821,7 @@
                                                              (line    6)
 * Bottom:                                graph.              (line  132)
 * BottomTop:                             graph.              (line  138)
-* BottomView:                            three.              (line  370)
+* BottomView:                            three.              (line  367)
 * bounding box:                          Frames and pictures.
                                                              (line  180)
 * Bounds:                                graph3.             (line   21)
@@ -8831,8 +8829,8 @@
                                                              (line   25)
 * box <1>:                               Frames and pictures.
                                                              (line  130)
-* box <2>:                               three.              (line  289)
-* box <3>:                               three.              (line  291)
+* box <2>:                               three.              (line  286)
+* box <3>:                               three.              (line  288)
 * bp:                                    Drawing in batch mode.
                                                              (line   23)
 * brace:                                 Paths and guides.   (line   51)
@@ -8850,7 +8848,7 @@
 * CAD:                                   CAD.                (line    6)
 * calculateTransform:                    Frames and pictures.
                                                              (line  118)
-* camera:                                three.              (line  336)
+* camera:                                three.              (line  333)
 * casts:                                 Casts.              (line    6)
 * cbrt:                                  Mathematical functions.
                                                              (line    6)
@@ -8858,7 +8856,7 @@
 * ceil:                                  Mathematical functions.
                                                              (line   26)
 * Center:                                label.              (line   60)
-* center:                                three.              (line  319)
+* center:                                three.              (line  316)
 * checker:                               Pens.               (line  269)
 * Chinese:                               unicode.            (line   12)
 * choose:                                Mathematical functions.
@@ -8867,7 +8865,7 @@
                                                              (line   48)
 * circle:                                Paths and guides.   (line   10)
 * Circle:                                Paths and guides.   (line   18)
-* circle <1>:                            three.              (line  263)
+* circle <1>:                            three.              (line  260)
 * circle <2>:                            flowchart.          (line   61)
 * circlebarframe:                        markers.            (line   18)
 * CJK:                                   unicode.            (line   12)
@@ -8901,13 +8899,13 @@
 * conditional <1>:                       Arithmetic & logical.
                                                              (line   61)
 * config:                                Configuring.        (line   64)
-* config <1>:                            Options.            (line  118)
+* config <1>:                            Options.            (line  119)
 * configuration file:                    Configuring.        (line   21)
-* configuration file <1>:                Options.            (line  118)
+* configuration file <1>:                Options.            (line  119)
 * configuring:                           Configuring.        (line    6)
 * conj:                                  Data types.         (line   62)
 * constructors:                          Structures.         (line   91)
-* context:                               Options.            (line  147)
+* context:                               Options.            (line  148)
 * continue:                              Programming.        (line   48)
 * continue <1>:                          Debugger.           (line   31)
 * contour:                               contour.            (line    6)
@@ -8918,8 +8916,8 @@
 * convert:                               Configuring.        (line   64)
 * convert <1>:                           Files.              (line  155)
 * convert <2>:                           animation.          (line    6)
-* convert <3>:                           Options.            (line  147)
-* convertOptions:                        Options.            (line  133)
+* convert <3>:                           Options.            (line  148)
+* convertOptions:                        Options.            (line  134)
 * Coons shading:                         fill.               (line   77)
 * copy:                                  Arrays.             (line  167)
 * cos:                                   Mathematical functions.
@@ -8944,7 +8942,7 @@
 * curl <1>:                              three.              (line    6)
 * curlSpecifier:                         Paths and guides.   (line  408)
 * currentpen:                            Pens.               (line    6)
-* currentprojection:                     three.              (line  367)
+* currentprojection:                     three.              (line  364)
 * curve:                                 slopefield.         (line   20)
 * custom axis types:                     graph.              (line  141)
 * custom mark routine:                   graph.              (line  578)
@@ -8956,7 +8954,7 @@
 * cyclic:                                Paths and guides.   (line   85)
 * cyclic <1>:                            Paths and guides.   (line  376)
 * cyclic <2>:                            Arrays.             (line   39)
-* cyclic <3>:                            three.              (line  484)
+* cyclic <3>:                            three.              (line  481)
 * Cyrillic:                              unicode.            (line    7)
 * dashdotted:                            Pens.               (line  102)
 * dashed:                                Pens.               (line  102)
@@ -8970,7 +8968,7 @@
 * default arguments:                     Default arguments.  (line    6)
 * defaultformat:                         graph.              (line  175)
 * DefaultHead:                           draw.               (line   26)
-* DefaultHead3:                          three.              (line  550)
+* DefaultHead3:                          three.              (line  547)
 * defaultpen:                            Pens.               (line   49)
 * defaultpen <1>:                        Pens.               (line  122)
 * defaultpen <2>:                        Pens.               (line  127)
@@ -8995,7 +8993,7 @@
 * dir <1>:                               Data types.         (line   90)
 * dir <2>:                               Data types.         (line  180)
 * dir <3>:                               Paths and guides.   (line  109)
-* dir <4>:                               three.              (line  484)
+* dir <4>:                               three.              (line  481)
 * direction specifier:                   Bezier curves.      (line    6)
 * directory:                             Files.              (line   25)
 * dirSpecifier:                          Paths and guides.   (line  390)
@@ -9010,11 +9008,11 @@
 * dot <3>:                               Arrays.             (line  254)
 * dot <4>:                               Arrays.             (line  257)
 * DotMargin:                             draw.               (line   42)
-* DotMargin3:                            three.              (line  566)
+* DotMargin3:                            three.              (line  563)
 * DotMargins:                            draw.               (line   42)
-* DotMargins3:                           three.              (line  566)
+* DotMargins3:                           three.              (line  563)
 * dotted:                                Pens.               (line  102)
-* double deferred drawing:               three.              (line  241)
+* double deferred drawing:               three.              (line  238)
 * double precision:                      Files.              (line   76)
 * draw:                                  Drawing commands.   (line   31)
 * draw <1>:                              draw.               (line    6)
@@ -9027,10 +9025,10 @@
 * drawline:                              math.               (line    9)
 * drawtree:                              drawtree.           (line    6)
 * dvips:                                 Configuring.        (line   64)
-* dvipsOptions:                          Options.            (line  133)
+* dvipsOptions:                          Options.            (line  134)
 * dvisvgm:                               Configuring.        (line   64)
-* dvisvgm <1>:                           Options.            (line  152)
-* dvisvgmOptions:                        Options.            (line  133)
+* dvisvgm <1>:                           Options.            (line  153)
+* dvisvgmOptions:                        Options.            (line  134)
 * E:                                     Labels.             (line   18)
 * E <1>:                                 Mathematical functions.
                                                              (line   48)
@@ -9045,23 +9043,23 @@
 * else:                                  Programming.        (line   26)
 * emacs:                                 Editing modes.      (line    6)
 * embed:                                 embed.              (line    6)
-* Embedded:                              three.              (line  454)
+* Embedded:                              three.              (line  451)
 * empty:                                 Frames and pictures.
                                                              (line    7)
 * EndArcArrow:                           draw.               (line   26)
-* EndArcArrow3:                          three.              (line  550)
+* EndArcArrow3:                          three.              (line  547)
 * EndArrow:                              draw.               (line   26)
-* EndArrow3:                             three.              (line  550)
+* EndArrow3:                             three.              (line  547)
 * EndBar:                                draw.               (line   19)
-* EndBar3:                               three.              (line  550)
+* EndBar3:                               three.              (line  547)
 * EndDotMargin:                          draw.               (line   42)
-* EndDotMargin3:                         three.              (line  566)
+* EndDotMargin3:                         three.              (line  563)
 * endl:                                  Files.              (line   61)
 * EndMargin:                             draw.               (line   42)
-* EndMargin3:                            three.              (line  566)
+* EndMargin3:                            three.              (line  563)
 * EndPenMargin:                          draw.               (line   42)
-* EndPenMargin2:                         three.              (line  566)
-* EndPenMargin3:                         three.              (line  566)
+* EndPenMargin2:                         three.              (line  563)
+* EndPenMargin3:                         three.              (line  563)
 * EndPoint:                              label.              (line   55)
 * envelope:                              Frames and pictures.
                                                              (line   25)
@@ -9071,7 +9069,7 @@
 * eol:                                   Files.              (line   93)
 * eol <1>:                               Arrays.             (line  339)
 * EPS:                                   label.              (line   78)
-* EPS <1>:                               Options.            (line  147)
+* EPS <1>:                               Options.            (line  148)
 * erase:                                 Drawing in interactive mode.
                                                              (line   11)
 * erase <1>:                             Data types.         (line  256)
@@ -9108,12 +9106,12 @@
 * extension:                             Paths and guides.   (line  246)
 * extension <1>:                         MetaPost.           (line   10)
 * external:                              embed.              (line   11)
-* extrude:                               three.              (line  478)
+* extrude:                               three.              (line  475)
 * F:                                     Mathematical functions.
                                                              (line   48)
 * fabs:                                  Mathematical functions.
                                                              (line    6)
-* face:                                  three.              (line  591)
+* face:                                  three.              (line  588)
 * factorial:                             Mathematical functions.
                                                              (line   39)
 * Fedora:                                UNIX binary distributions.
@@ -9143,7 +9141,7 @@
 * firstcut:                              Paths and guides.   (line  262)
 * fit:                                   Frames and pictures.
                                                              (line  113)
-* fit3:                                  three.              (line  254)
+* fit3:                                  three.              (line  251)
 * fixedscaling:                          Frames and pictures.
                                                              (line   81)
 * floor:                                 Mathematical functions.
@@ -9159,12 +9157,12 @@
 * fontsize:                              Pens.               (line  192)
 * for:                                   Programming.        (line   26)
 * format:                                Data types.         (line  289)
-* format <1>:                            Options.            (line  147)
+* format <1>:                            Options.            (line  148)
 * forum:                                 Help.               (line    6)
 * frame:                                 Frames and pictures.
                                                              (line    7)
 * from:                                  Import.             (line   16)
-* FrontView:                             three.              (line  370)
+* FrontView:                             three.              (line  367)
 * function declarations:                 Functions.          (line   79)
 * Function shading:                      fill.               (line   99)
 * function shading:                      fill.               (line   99)
@@ -9183,8 +9181,8 @@
 * getstring:                             Files.              (line  118)
 * gettriple:                             Files.              (line  118)
 * git:                                   Git.                (line    6)
-* glOptions:                             three.              (line  195)
-* glOptions <1>:                         Options.            (line  133)
+* glOptions:                             three.              (line  192)
+* glOptions <1>:                         Options.            (line  134)
 * GNU Scientific Library:                Mathematical functions.
                                                              (line   48)
 * gouraudshade:                          fill.               (line   62)
@@ -9205,7 +9203,7 @@
                                                              (line   63)
 * gsl:                                   Mathematical functions.
                                                              (line   48)
-* gsOptions:                             Options.            (line  133)
+* gsOptions:                             Options.            (line  134)
 * GUI:                                   GUI.                (line    6)
 * GUI installation:                      GUI installation.   (line    6)
 * GUI usage:                             GUI usage.          (line    6)
@@ -9222,7 +9220,7 @@
 * hex <1>:                               Pens.               (line   64)
 * hexidecimal:                           Data types.         (line  305)
 * hexidecimal <1>:                       Pens.               (line   62)
-* hidden surface removal:                three.              (line  591)
+* hidden surface removal:                three.              (line  588)
 * histogram:                             Mathematical functions.
                                                              (line   39)
 * history:                               Files.              (line  143)
@@ -9229,19 +9227,19 @@
 * history <1>:                           Interactive mode.   (line   54)
 * historylines:                          Interactive mode.   (line   57)
 * HookHead:                              draw.               (line   26)
-* HookHead3:                             three.              (line  550)
+* HookHead3:                             three.              (line  547)
 * Horizontal:                            flowchart.          (line   77)
-* hyperrefOptions:                       Options.            (line  133)
+* hyperrefOptions:                       Options.            (line  134)
 * hypot:                                 Mathematical functions.
                                                              (line    6)
 * I:                                     Mathematical functions.
                                                              (line   48)
-* iconic:                                three.              (line  195)
+* iconify:                               three.              (line  192)
 * identity:                              Transforms.         (line   24)
 * identity <1>:                          Mathematical functions.
                                                              (line    6)
 * identity <2>:                          Arrays.             (line  296)
-* identity4:                             three.              (line  422)
+* identity4:                             three.              (line  419)
 * if:                                    Programming.        (line   26)
 * IgnoreAspect:                          Frames and pictures.
                                                              (line   63)
@@ -9249,7 +9247,7 @@
 * image <1>:                             palette.            (line   58)
 * ImageMagick:                           Configuring.        (line   64)
 * ImageMagick <1>:                       animation.          (line    6)
-* ImageMagick <2>:                       Options.            (line  147)
+* ImageMagick <2>:                       Options.            (line  148)
 * images:                                palette.            (line    6)
 * implicit casts:                        Casts.              (line    6)
 * implicit linear solver:                MetaPost.           (line   10)
@@ -9277,7 +9275,7 @@
 * inside:                                Paths and guides.   (line  294)
 * inside <1>:                            Paths and guides.   (line  299)
 * inside <2>:                            Paths and guides.   (line  305)
-* insphere:                              three.              (line  513)
+* insphere:                              three.              (line  510)
 * inst:                                  Debugger.           (line   35)
 * installation:                          Installation.       (line    6)
 * int:                                   Data types.         (line   30)
@@ -9297,23 +9295,23 @@
 * interpolate:                           interpolate.        (line    6)
 * intersect:                             Paths and guides.   (line  195)
 * intersect <1>:                         math.               (line   13)
-* intersect <2>:                         three.              (line  484)
+* intersect <2>:                         three.              (line  481)
 * intersectionpoint:                     Paths and guides.   (line  238)
 * intersectionpoint <1>:                 math.               (line   17)
-* intersectionpoint <2>:                 three.              (line  484)
+* intersectionpoint <2>:                 three.              (line  481)
 * intersectionpoints:                    Paths and guides.   (line  242)
-* intersectionpoints <1>:                three.              (line  484)
-* intersectionpoints <2>:                three.              (line  497)
+* intersectionpoints <1>:                three.              (line  481)
+* intersectionpoints <2>:                three.              (line  494)
 * intersections:                         Paths and guides.   (line  206)
 * intersections <1>:                     Paths and guides.   (line  213)
-* intersections <2>:                     three.              (line  484)
-* intersections <3>:                     three.              (line  490)
+* intersections <2>:                     three.              (line  481)
+* intersections <3>:                     three.              (line  487)
 * InTicks:                               graph3.             (line   35)
 * intMax:                                Data types.         (line   30)
 * intMin:                                Data types.         (line   30)
 * inverse:                               Transforms.         (line   16)
 * inverse <1>:                           Arrays.             (line  302)
-* invert:                                three.              (line  412)
+* invert:                                three.              (line  409)
 * invisible:                             Pens.               (line   43)
 * isnan:                                 Data types.         (line   35)
 * i_scaled:                              Mathematical functions.
@@ -9332,7 +9330,7 @@
 * keepAspect <1>:                        Frames and pictures.
                                                              (line   63)
 * keepAspect <2>:                        LaTeX usage.        (line   50)
-* keyboard bindings::                    three.              (line  173)
+* keyboard bindings::                    three.              (line  170)
 * keys:                                  Arrays.             (line   39)
 * keyword:                               Named arguments.    (line   37)
 * keyword-only:                          Named arguments.    (line   37)
@@ -9345,7 +9343,7 @@
 * label <1>:                             label.              (line    6)
 * Label <1>:                             label.              (line   14)
 * Label <2>:                             graph.              (line  330)
-* label <2>:                             three.              (line  448)
+* label <2>:                             three.              (line  445)
 * labelpath:                             labelpath.          (line    6)
 * labelpath3:                            labelpath3.         (line    6)
 * labelx:                                graph.              (line  330)
@@ -9354,7 +9352,7 @@
                                                              (line  104)
 * lastcut:                               Paths and guides.   (line  266)
 * lasy-mode:                             Editing modes.      (line    6)
-* latex:                                 Options.            (line  147)
+* latex:                                 Options.            (line  148)
 * LaTeX fonts:                           Pens.               (line  206)
 * LaTeX usage:                           LaTeX usage.        (line    6)
 * latexmk:                               LaTeX usage.        (line   30)
@@ -9369,7 +9367,7 @@
 * LeftSide:                              label.              (line   60)
 * LeftTicks:                             graph.              (line  160)
 * LeftTicks <1>:                         graph.              (line  233)
-* LeftView:                              three.              (line  370)
+* LeftView:                              three.              (line  367)
 * legend:                                Drawing commands.   (line   31)
 * legend <1>:                            draw.               (line   64)
 * legend <2>:                            graph.              (line  425)
@@ -9381,12 +9379,12 @@
 * length <3>:                            Paths and guides.   (line   76)
 * length <4>:                            Paths and guides.   (line  373)
 * length <5>:                            Arrays.             (line   39)
-* length <6>:                            three.              (line  484)
+* length <6>:                            three.              (line  481)
 * letter:                                Configuring.        (line   58)
 * lexorder:                              math.               (line   67)
 * lexorder <1>:                          math.               (line   70)
 * libgs:                                 Configuring.        (line   64)
-* libgs <1>:                             Options.            (line  152)
+* libgs <1>:                             Options.            (line  153)
 * libm routines:                         Mathematical functions.
                                                              (line    6)
 * libsigsegv:                            Functions.          (line  100)
@@ -9418,8 +9416,8 @@
 * longdashed:                            Pens.               (line  102)
 * longitude:                             Data types.         (line  168)
 * loop:                                  Programming.        (line   26)
-* lualatex:                              Options.            (line  147)
-* luatex:                                Options.            (line  147)
+* lualatex:                              Options.            (line  148)
+* luatex:                                Options.            (line  148)
 * MacOS X binary distributions:          MacOS X binary distributions.
                                                              (line    6)
 * makepen:                               Pens.               (line  322)
@@ -9426,11 +9424,11 @@
 * map:                                   Arrays.             (line  131)
 * Margin:                                draw.               (line   42)
 * Margin <1>:                            draw.               (line   42)
-* Margin3:                               three.              (line  566)
-* Margin3 <1>:                           three.              (line  566)
+* Margin3:                               three.              (line  563)
+* Margin3 <1>:                           three.              (line  563)
 * Margins:                               draw.               (line   42)
-* margins:                               three.              (line  247)
-* Margins3:                              three.              (line  566)
+* margins:                               three.              (line  244)
+* Margins3:                              three.              (line  563)
 * mark:                                  graph.              (line  481)
 * markangle:                             markers.            (line   35)
 * marker:                                graph.              (line  481)
@@ -9446,12 +9444,12 @@
                                                              (line    7)
 * max <2>:                               Arrays.             (line  221)
 * max <3>:                               Arrays.             (line  231)
-* max <4>:                               three.              (line  484)
+* max <4>:                               three.              (line  481)
 * maxbound:                              Data types.         (line  134)
 * maxbound <1>:                          Data types.         (line  204)
-* maxtile:                               three.              (line  195)
+* maxtile:                               three.              (line  192)
 * maxtimes:                              Paths and guides.   (line  233)
-* maxviewport:                           three.              (line  195)
+* maxviewport:                           three.              (line  192)
 * MetaPost:                              MetaPost.           (line    6)
 * MetaPost ... :                         Bezier curves.      (line   70)
 * MetaPost cutafter:                     Paths and guides.   (line  267)
@@ -9460,9 +9458,9 @@
 * MetaPost whatever:                     MetaPost.           (line   10)
 * Microsoft Windows:                     Microsoft Windows.  (line    6)
 * MidArcArrow:                           draw.               (line   26)
-* MidArcArrow3:                          three.              (line  550)
+* MidArcArrow3:                          three.              (line  547)
 * MidArrow:                              draw.               (line   26)
-* MidArrow3:                             three.              (line  550)
+* MidArrow3:                             three.              (line  547)
 * MidPoint:                              label.              (line   55)
 * midpoint:                              Paths and guides.   (line  180)
 * min:                                   Paths and guides.   (line  275)
@@ -9470,7 +9468,7 @@
                                                              (line    7)
 * min <2>:                               Arrays.             (line  216)
 * min <3>:                               Arrays.             (line  226)
-* min <4>:                               three.              (line  484)
+* min <4>:                               three.              (line  481)
 * minbound:                              Data types.         (line  131)
 * minbound <1>:                          Data types.         (line  201)
 * minipage:                              label.              (line  116)
@@ -9510,12 +9508,12 @@
 * NoFill <1>:                            Frames and pictures.
                                                              (line  154)
 * NoMargin:                              draw.               (line   42)
-* NoMargin3:                             three.              (line  566)
+* NoMargin3:                             three.              (line  563)
 * None:                                  draw.               (line   19)
 * None <1>:                              draw.               (line   26)
 * none:                                  Files.              (line   61)
-* normal:                                three.              (line  470)
-* nosafe:                                Options.            (line  171)
+* normal:                                three.              (line  467)
+* nosafe:                                Options.            (line  172)
 * NOT:                                   Arithmetic & logical.
                                                              (line   68)
 * notaknot:                              graph.              (line   36)
@@ -9527,16 +9525,16 @@
                                                              (line  140)
 * nullpen <2>:                           Frames and pictures.
                                                              (line  149)
-* NURBS:                                 three.              (line  346)
-* O:                                     three.              (line  259)
+* NURBS:                                 three.              (line  343)
+* O:                                     three.              (line  256)
 * obj:                                   obj.                (line    6)
-* oblique:                               three.              (line  302)
-* obliqueX:                              three.              (line  309)
-* obliqueY:                              three.              (line  315)
-* obliqueZ:                              three.              (line  302)
+* oblique:                               three.              (line  299)
+* obliqueX:                              three.              (line  306)
+* obliqueY:                              three.              (line  312)
+* obliqueZ:                              three.              (line  299)
 * ode:                                   ode.                (line    6)
 * offset:                                Pens.               (line  123)
-* offset <1>:                            Options.            (line  176)
+* offset <1>:                            Options.            (line  177)
 * OmitTick:                              graph.              (line  223)
 * OmitTickInterval:                      graph.              (line  223)
 * OmitTickIntervals:                     graph.              (line  223)
@@ -9559,15 +9557,15 @@
 * OR:                                    Arithmetic & logical.
                                                              (line   68)
 * orient:                                Data types.         (line  108)
-* orient <1>:                            three.              (line  501)
+* orient <1>:                            three.              (line  498)
 * orientation:                           Frames and pictures.
                                                              (line  104)
-* orthographic:                          three.              (line  319)
+* orthographic:                          three.              (line  316)
 * outformat:                             three.              (line  142)
 * outprefix:                             Frames and pictures.
                                                              (line   91)
 * output:                                Files.              (line   36)
-* output <1>:                            Options.            (line  147)
+* output <1>:                            Options.            (line  148)
 * OutTicks:                              graph3.             (line   35)
 * overloading functions:                 Functions.          (line   55)
 * overwrite:                             Pens.               (line  344)
@@ -9597,37 +9595,37 @@
 * path[]:                                Paths.              (line   23)
 * patterns:                              Pens.               (line  255)
 * patterns <1>:                          patterns.           (line    6)
-* PDF:                                   Options.            (line  147)
-* pdflatex:                              Options.            (line  147)
-* pdfreloadOptions:                      Options.            (line  133)
+* PDF:                                   Options.            (line  148)
+* pdflatex:                              Options.            (line  148)
+* pdfreloadOptions:                      Options.            (line  134)
 * pdfviewer:                             Configuring.        (line    6)
-* pdfviewerOptions:                      Options.            (line  133)
+* pdfviewerOptions:                      Options.            (line  134)
 * pen:                                   Pens.               (line    6)
 * PenMargin:                             draw.               (line   42)
-* PenMargin2:                            three.              (line  566)
-* PenMargin3:                            three.              (line  566)
+* PenMargin2:                            three.              (line  563)
+* PenMargin3:                            three.              (line  563)
 * PenMargins:                            draw.               (line   42)
-* PenMargins2:                           three.              (line  566)
-* PenMargins3:                           three.              (line  566)
+* PenMargins2:                           three.              (line  563)
+* PenMargins3:                           three.              (line  563)
 * periodic:                              graph.              (line   36)
 * perl:                                  LaTeX usage.        (line   30)
 * perpendicular:                         geometry.           (line    6)
-* perspective:                           three.              (line  346)
+* perspective:                           three.              (line  343)
 * picture:                               Frames and pictures.
                                                              (line   39)
 * picture alignment:                     Frames and pictures.
                                                              (line  228)
 * piecewisestraight:                     Paths and guides.   (line   92)
-* pixel:                                 three.              (line  573)
+* pixel:                                 three.              (line  570)
 * Pl:                                    Mathematical functions.
                                                              (line   48)
 * plain:                                 plain.              (line    6)
 * planar:                                three.              (line   88)
-* plane:                                 three.              (line  285)
-* planeproject:                          three.              (line  467)
+* plane:                                 three.              (line  282)
+* planeproject:                          three.              (line  464)
 * point:                                 Paths and guides.   (line   95)
 * point <1>:                             Paths and guides.   (line  379)
-* point <2>:                             three.              (line  484)
+* point <2>:                             three.              (line  481)
 * polar:                                 Data types.         (line  148)
 * polargraph:                            graph.              (line   88)
 * polygon:                               graph.              (line  481)
@@ -9635,7 +9633,7 @@
 * Portrait:                              Frames and pictures.
                                                              (line  104)
 * postcontrol:                           Paths and guides.   (line  146)
-* postcontrol <1>:                       three.              (line  484)
+* postcontrol <1>:                       three.              (line  481)
 * postfix operators:                     Self & prefix operators.
                                                              (line   19)
 * postscript:                            Frames and pictures.
@@ -9644,10 +9642,10 @@
 * PostScript subpath:                    Paths.              (line   23)
 * pow10:                                 Mathematical functions.
                                                              (line    6)
-* prc:                                   three.              (line  216)
+* prc:                                   three.              (line  213)
 * precision:                             Files.              (line   93)
 * precontrol:                            Paths and guides.   (line  139)
-* precontrol <1>:                        three.              (line  484)
+* precontrol <1>:                        three.              (line  481)
 * prefix operators:                      Self & prefix operators.
                                                              (line    6)
 * private:                               Structures.         (line    6)
@@ -9655,7 +9653,7 @@
 * pstoedit:                              PostScript to Asymptote.
                                                              (line    6)
 * psviewer:                              Configuring.        (line    6)
-* psviewerOptions:                       Options.            (line  133)
+* psviewerOptions:                       Options.            (line  134)
 * pt:                                    Figure size.        (line   18)
 * public:                                Structures.         (line    6)
 * push:                                  Arrays.             (line   39)
@@ -9679,7 +9677,7 @@
 * radians:                               Mathematical functions.
                                                              (line   17)
 * radius:                                Paths and guides.   (line  135)
-* radius <1>:                            three.              (line  484)
+* radius <1>:                            three.              (line  481)
 * Rainbow:                               palette.            (line   12)
 * rand:                                  Mathematical functions.
                                                              (line   39)
@@ -9708,7 +9706,7 @@
 * rename:                                Files.              (line  152)
 * render:                                three.              (line   46)
 * render <1>:                            three.              (line  142)
-* render <2>:                            Options.            (line  147)
+* render <2>:                            Options.            (line  148)
 * replace:                               Data types.         (line  269)
 * resetdefaultpen:                       Pens.               (line  371)
 * rest arguments:                        Rest arguments.     (line    6)
@@ -9720,7 +9718,7 @@
 * reverse <1>:                           Paths and guides.   (line  183)
 * reverse <2>:                           Paths and guides.   (line  382)
 * reverse <3>:                           Arrays.             (line  136)
-* reverse <4>:                           three.              (line  484)
+* reverse <4>:                           three.              (line  481)
 * rewind:                                Files.              (line   93)
 * rfind:                                 Data types.         (line  246)
 * rgb:                                   Pens.               (line   30)
@@ -9732,9 +9730,9 @@
 * RightSide:                             label.              (line   60)
 * RightTicks:                            graph.              (line  160)
 * RightTicks <1>:                        graph.              (line  233)
-* RightView:                             three.              (line  370)
+* RightView:                             three.              (line  367)
 * Rotate:                                label.              (line   36)
-* rotate:                                three.              (line  438)
+* rotate:                                three.              (line  435)
 * Rotate(pair z):                        label.              (line   39)
 * round:                                 Mathematical functions.
                                                              (line   26)
@@ -9747,7 +9745,7 @@
 * runtime imports:                       Import.             (line   97)
 * Russian:                               unicode.            (line    7)
 * S:                                     Labels.             (line   18)
-* safe:                                  Options.            (line  171)
+* safe:                                  Options.            (line  172)
 * save:                                  Frames and pictures.
                                                              (line  285)
 * saveline:                              Files.              (line  135)
@@ -9757,8 +9755,8 @@
 * scale <2>:                             Transforms.         (line   36)
 * scale <3>:                             graph.              (line  691)
 * Scale <1>:                             graph.              (line  708)
-* scale <4>:                             three.              (line  437)
-* scale3:                                three.              (line  435)
+* scale <4>:                             three.              (line  434)
+* scale3:                                three.              (line  432)
 * scaled graph:                          graph.              (line  671)
 * scientific graph:                      graph.              (line  388)
 * scroll:                                Files.              (line  109)
@@ -9779,7 +9777,7 @@
                                                              (line    6)
 * sequence:                              Arrays.             (line  118)
 * settings:                              Configuring.        (line   21)
-* settings <1>:                          Options.            (line  118)
+* settings <1>:                          Options.            (line  119)
 * sgn:                                   Mathematical functions.
                                                              (line   26)
 * shading:                               fill.               (line   32)
@@ -9787,11 +9785,11 @@
 * shift:                                 Transforms.         (line   26)
 * shift <1>:                             Transforms.         (line   28)
 * shift <2>:                             Transforms.         (line   46)
-* shift <3>:                             three.              (line  427)
+* shift <3>:                             three.              (line  424)
 * shiftless:                             Transforms.         (line   46)
 * shipout:                               Frames and pictures.
                                                              (line   91)
-* showtarget:                            three.              (line  319)
+* showtarget:                            three.              (line  316)
 * Si:                                    Mathematical functions.
                                                              (line   48)
 * signedint:                             Files.              (line   76)
@@ -9811,9 +9809,9 @@
 * singlereal <1>:                        Files.              (line   89)
 * sinh:                                  Mathematical functions.
                                                              (line    6)
-* SixViews:                              three.              (line  385)
-* SixViewsFR:                            three.              (line  385)
-* SixViewsUS:                            three.              (line  385)
+* SixViews:                              three.              (line  382)
+* SixViewsFR:                            three.              (line  382)
+* SixViewsUS:                            three.              (line  382)
 * size:                                  Figure size.        (line    6)
 * size <1>:                              Paths and guides.   (line   81)
 * size <2>:                              Paths and guides.   (line  370)
@@ -9821,9 +9819,9 @@
                                                              (line   48)
 * size <4>:                              Frames and pictures.
                                                              (line   74)
-* size <5>:                              three.              (line  484)
-* size <6>:                              Options.            (line  147)
-* size3:                                 three.              (line  244)
+* size <5>:                              three.              (line  481)
+* size <6>:                              Options.            (line  148)
+* size3:                                 three.              (line  241)
 * Slant:                                 label.              (line   42)
 * slant:                                 Transforms.         (line   38)
 * sleep:                                 Data types.         (line  375)
@@ -9864,7 +9862,7 @@
 * stop:                                  Debugger.           (line   10)
 * straight:                              Paths and guides.   (line   88)
 * Straight:                              graph.              (line   30)
-* straight <1>:                          three.              (line  484)
+* straight <1>:                          three.              (line  481)
 * strftime:                              Data types.         (line  320)
 * strftime <1>:                          Data types.         (line  345)
 * string:                                Data types.         (line  207)
@@ -9876,7 +9874,7 @@
 * struct:                                Structures.         (line    6)
 * structures:                            Structures.         (line    6)
 * subpath:                               Paths and guides.   (line  186)
-* subpath <1>:                           three.              (line  484)
+* subpath <1>:                           three.              (line  481)
 * subpictures:                           Frames and pictures.
                                                              (line  113)
 * substr:                                Data types.         (line  261)
@@ -9888,9 +9886,9 @@
 * surface <1>:                           three.              (line   88)
 * surface <2>:                           three.              (line  102)
 * surface <3>:                           graph3.             (line   99)
-* SVG:                                   Options.            (line  152)
+* SVG:                                   Options.            (line  153)
 * system:                                Data types.         (line  353)
-* system <1>:                            Options.            (line  171)
+* system <1>:                            Options.            (line  172)
 * syzygy:                                syzygy.             (line    6)
 * tab:                                   Files.              (line   61)
 * tab completion:                        Drawing in interactive mode.
@@ -9901,7 +9899,7 @@
                                                              (line   20)
 * tanh:                                  Mathematical functions.
                                                              (line    6)
-* target:                                three.              (line  319)
+* target:                                three.              (line  316)
 * tell:                                  Files.              (line   93)
 * tension:                               Bezier curves.      (line   56)
 * tension <1>:                           three.              (line    6)
@@ -9911,12 +9909,12 @@
 * tessellation:                          three.              (line  114)
 * tex:                                   Frames and pictures.
                                                              (line  302)
-* tex <1>:                               Options.            (line  147)
+* tex <1>:                               Options.            (line  148)
 * TeX fonts:                             Pens.               (line  215)
 * TeX string:                            Data types.         (line  207)
 * texcommand:                            Configuring.        (line   64)
 * TeXHead:                               draw.               (line   26)
-* TeXHead3:                              three.              (line  550)
+* TeXHead3:                              three.              (line  547)
 * texpath:                               Configuring.        (line   64)
 * texpath <1>:                           label.              (line  113)
 * texpreamble:                           Frames and pictures.
@@ -9930,9 +9928,9 @@
 * thin:                                  three.              (line  125)
 * this:                                  Structures.         (line    6)
 * three:                                 three.              (line    6)
-* ThreeViews:                            three.              (line  385)
-* ThreeViewsFR:                          three.              (line  385)
-* ThreeViewsUS:                          three.              (line  385)
+* ThreeViews:                            three.              (line  382)
+* ThreeViewsFR:                          three.              (line  382)
+* ThreeViewsUS:                          three.              (line  382)
 * tick:                                  graph.              (line  330)
 * ticks:                                 graph.              (line  160)
 * Ticks:                                 graph.              (line  160)
@@ -9947,12 +9945,12 @@
 * times:                                 Paths and guides.   (line  220)
 * times <1>:                             Paths and guides.   (line  224)
 * Top:                                   graph.              (line  135)
-* TopView:                               three.              (line  370)
+* TopView:                               three.              (line  367)
 * trace:                                 Debugger.           (line   50)
 * trailingzero:                          graph.              (line  175)
 * transform:                             Transforms.         (line    6)
-* transform <1>:                         three.              (line  459)
-* transform3:                            three.              (line  422)
+* transform <1>:                         three.              (line  456)
+* transform3:                            three.              (line  419)
 * transparency:                          Pens.               (line  237)
 * transpose:                             Arrays.             (line  203)
 * transpose <1>:                         Arrays.             (line  206)
@@ -9966,7 +9964,7 @@
                                                              (line   48)
 * triple:                                Data types.         (line  137)
 * TrueMargin:                            draw.               (line   42)
-* TrueMargin3:                           three.              (line  566)
+* TrueMargin3:                           three.              (line  563)
 * tube:                                  three.              (line  125)
 * tube <1>:                              tube.               (line    6)
 * tutorial:                              Tutorial.           (line    6)
@@ -9988,10 +9986,10 @@
 * unit:                                  Data types.         (line   83)
 * unit <1>:                              Data types.         (line  173)
 * unitbox:                               Paths.              (line   44)
-* unitbox <1>:                           three.              (line  291)
+* unitbox <1>:                           three.              (line  288)
 * unitcircle:                            Paths.              (line   17)
 * unitcircle <1>:                        Paths.              (line   17)
-* unitcircle <2>:                        three.              (line  259)
+* unitcircle <2>:                        three.              (line  256)
 * unitrand:                              Mathematical functions.
                                                              (line   39)
 * unitsize:                              Figure size.        (line   39)
@@ -10001,7 +9999,7 @@
                                                              (line    6)
 * unpacking:                             Rest arguments.     (line   39)
 * unravel:                               Import.             (line   29)
-* up:                                    three.              (line  319)
+* up:                                    three.              (line  316)
 * update:                                Files.              (line   36)
 * UpsideDown:                            Frames and pictures.
                                                              (line  104)
@@ -10028,10 +10026,10 @@
 * vertex-dependent colors:               three.              (line   79)
 * Vertical:                              flowchart.          (line   77)
 * viewportheight:                        LaTeX usage.        (line   50)
-* viewportmargin:                        three.              (line  247)
-* viewportsize:                          three.              (line  247)
+* viewportmargin:                        three.              (line  244)
+* viewportsize:                          three.              (line  244)
 * viewportwidth:                         LaTeX usage.        (line   50)
-* views:                                 three.              (line  216)
+* views:                                 three.              (line  213)
 * vim:                                   Editing modes.      (line   32)
 * virtual functions:                     Structures.         (line  181)
 * void:                                  Data types.         (line   10)
@@ -10046,11 +10044,11 @@
 * word:                                  Arrays.             (line  349)
 * write:                                 Files.              (line   53)
 * write <1>:                             Arrays.             (line  388)
-* X:                                     three.              (line  259)
+* X:                                     three.              (line  256)
 * xasy:                                  GUI.                (line    6)
 * xaxis3:                                graph3.             (line    7)
 * xdr:                                   Files.              (line   76)
-* xelatex:                               Options.            (line  147)
+* xelatex:                               Options.            (line  148)
 * XEquals:                               graph.              (line  265)
 * xequals:                               graph.              (line  278)
 * xlimits:                               graph.              (line  640)
@@ -10059,10 +10057,10 @@
 * xpart:                                 Data types.         (line   94)
 * xpart <1>:                             Data types.         (line  184)
 * xscale:                                Transforms.         (line   30)
-* xscale3:                               three.              (line  429)
+* xscale3:                               three.              (line  426)
 * xtick:                                 graph.              (line  330)
-* XY:                                    three.              (line  444)
-* XY <1>:                                three.              (line  459)
+* XY:                                    three.              (line  441)
+* XY <1>:                                three.              (line  456)
 * XYEquals:                              graph3.             (line   21)
 * XYZero:                                graph3.             (line   21)
 * XZEquals:                              graph3.             (line   21)
@@ -10072,7 +10070,7 @@
                                                              (line    6)
 * Y <1>:                                 Mathematical functions.
                                                              (line   48)
-* Y <2>:                                 three.              (line  259)
+* Y <2>:                                 three.              (line  256)
 * yaxis3:                                graph3.             (line    7)
 * YEquals:                               graph.              (line  128)
 * yequals:                               graph.              (line  278)
@@ -10080,14 +10078,14 @@
 * ypart:                                 Data types.         (line   97)
 * ypart <1>:                             Data types.         (line  187)
 * yscale:                                Transforms.         (line   32)
-* yscale3:                               three.              (line  431)
+* yscale3:                               three.              (line  428)
 * ytick:                                 graph.              (line  330)
-* YX:                                    three.              (line  459)
-* YZ:                                    three.              (line  459)
+* YX:                                    three.              (line  456)
+* YZ:                                    three.              (line  456)
 * YZEquals:                              graph3.             (line   21)
 * YZero:                                 graph.              (line  123)
 * YZZero:                                graph3.             (line   21)
-* Z:                                     three.              (line  259)
+* Z:                                     three.              (line  256)
 * zaxis3:                                graph3.             (line    7)
 * zeroTransform:                         Transforms.         (line   44)
 * zerowinding:                           Pens.               (line  164)
@@ -10104,10 +10102,10 @@
 * zeta:                                  Mathematical functions.
                                                              (line   48)
 * zpart:                                 Data types.         (line  190)
-* zscale3:                               three.              (line  433)
-* ZX:                                    three.              (line  459)
-* ZX <1>:                                three.              (line  459)
-* ZY:                                    three.              (line  459)
+* zscale3:                               three.              (line  430)
+* ZX:                                    three.              (line  456)
+* ZX <1>:                                three.              (line  456)
+* ZY:                                    three.              (line  456)
 
 
 
@@ -10123,140 +10121,140 @@
 Node: Compiling from UNIX source20017
 Node: Editing modes23051
 Node: Git25472
-Node: Uninstall25871
-Node: Tutorial26217
-Node: Drawing in batch mode27105
-Node: Drawing in interactive mode27980
-Node: Figure size29012
-Node: Labels30604
-Node: Paths31431
-Ref: unitcircle32046
-Node: Drawing commands33946
-Node: draw35661
-Ref: arrows36843
-Node: fill42092
-Ref: gradient shading43138
-Node: clip47654
-Node: label48250
-Ref: Label48850
-Node: Bezier curves54695
-Node: Programming58592
-Ref: array iteration60345
-Node: Data types60512
-Ref: format71174
-Node: Paths and guides75620
-Ref: circle75874
-Ref: extension85581
-Node: Pens92390
-Ref: fillrule100079
-Ref: basealign100983
-Ref: transparency103817
-Ref: makepen107397
-Ref: overwrite108280
-Node: Transforms109494
-Node: Frames and pictures111326
-Ref: envelope112484
-Ref: size113577
-Ref: unitsize114564
-Ref: shipout115637
-Ref: filltype117988
-Ref: add121160
-Ref: add about122166
-Ref: tex125195
-Node: Files126091
-Ref: cd127078
-Ref: scroll131763
-Node: Variable initializers134681
-Node: Structures137398
-Node: Operators144900
-Node: Arithmetic & logical145214
-Node: Self & prefix operators147585
-Node: User-defined operators148379
-Node: Implicit scaling149292
-Node: Functions149855
-Ref: stack overflow152998
-Node: Default arguments153280
-Node: Named arguments154036
-Node: Rest arguments156606
-Node: Mathematical functions159728
-Node: Arrays164391
-Ref: sort171499
-Ref: tridiagonal174124
-Ref: solve175355
-Node: Slices179494
-Node: Casts183402
-Node: Import185669
-Node: Static190927
-Node: LaTeX usage193820
-Node: Base modules200337
-Node: plain202894
-Node: simplex203568
-Node: math203842
-Node: interpolate206551
-Node: geometry206830
-Node: trembling207424
-Node: stats207693
-Node: patterns207953
-Node: markers208189
-Node: tree210049
-Node: binarytree210234
-Node: drawtree210900
-Node: syzygy211101
-Node: feynman211375
-Node: roundedpath211650
-Node: animation211933
-Ref: animate212354
-Node: embed213471
-Node: slide214426
-Node: MetaPost214767
-Node: unicode215486
-Node: latin1216360
-Node: babel216729
-Node: labelpath216959
-Node: labelpath3217780
-Node: annotate218091
-Node: CAD218561
-Node: graph218872
-Ref: ticks226033
-Ref: pathmarkers239825
-Ref: marker240296
-Ref: markuniform240650
-Ref: errorbars242458
-Ref: automatic scaling246932
-Node: palette258679
-Ref: images258797
-Ref: image262971
-Ref: logimage263491
-Ref: penimage264596
-Ref: penfunctionimage264858
-Node: three265629
-Ref: PostScript3D292801
-Node: obj294539
-Node: graph3294788
-Ref: GaussianSurface300068
-Node: grid3301217
-Node: solids302001
-Node: tube302993
-Node: flowchart305227
-Node: contour309835
-Node: contour3315150
-Node: smoothcontour3315463
-Node: slopefield317184
-Node: ode318673
-Node: Options318930
-Ref: configuration file325159
-Ref: settings325159
-Ref: texengines326402
-Ref: convert326402
-Node: Interactive mode329726
-Ref: history331876
-Node: GUI333182
-Node: GUI installation333733
-Node: GUI usage334415
-Node: PostScript to Asymptote335331
-Node: Help336089
-Node: Debugger337743
-Node: Credits339499
-Node: Index340481
+Node: Uninstall25872
+Node: Tutorial26218
+Node: Drawing in batch mode27106
+Node: Drawing in interactive mode27981
+Node: Figure size29013
+Node: Labels30605
+Node: Paths31432
+Ref: unitcircle32047
+Node: Drawing commands33947
+Node: draw35662
+Ref: arrows36844
+Node: fill42093
+Ref: gradient shading43139
+Node: clip47646
+Node: label48233
+Ref: Label48833
+Node: Bezier curves54678
+Node: Programming58575
+Ref: array iteration60328
+Node: Data types60495
+Ref: format71157
+Node: Paths and guides75603
+Ref: circle75857
+Ref: extension85564
+Node: Pens92373
+Ref: fillrule100062
+Ref: basealign100966
+Ref: transparency103800
+Ref: makepen107380
+Ref: overwrite108263
+Node: Transforms109477
+Node: Frames and pictures111309
+Ref: envelope112467
+Ref: size113560
+Ref: unitsize114547
+Ref: shipout115620
+Ref: filltype117971
+Ref: add121143
+Ref: add about122149
+Ref: tex125178
+Node: Files126074
+Ref: cd127061
+Ref: scroll131746
+Node: Variable initializers134664
+Node: Structures137381
+Node: Operators144883
+Node: Arithmetic & logical145197
+Node: Self & prefix operators147568
+Node: User-defined operators148362
+Node: Implicit scaling149275
+Node: Functions149838
+Ref: stack overflow152981
+Node: Default arguments153263
+Node: Named arguments154019
+Node: Rest arguments156589
+Node: Mathematical functions159711
+Node: Arrays164374
+Ref: sort171482
+Ref: tridiagonal174107
+Ref: solve175338
+Node: Slices179477
+Node: Casts183385
+Node: Import185652
+Node: Static190910
+Node: LaTeX usage193803
+Node: Base modules200318
+Node: plain202875
+Node: simplex203549
+Node: math203823
+Node: interpolate206532
+Node: geometry206811
+Node: trembling207405
+Node: stats207674
+Node: patterns207934
+Node: markers208170
+Node: tree210030
+Node: binarytree210215
+Node: drawtree210881
+Node: syzygy211082
+Node: feynman211356
+Node: roundedpath211631
+Node: animation211914
+Ref: animate212335
+Node: embed213452
+Node: slide214407
+Node: MetaPost214748
+Node: unicode215467
+Node: latin1216341
+Node: babel216710
+Node: labelpath216940
+Node: labelpath3217761
+Node: annotate218072
+Node: CAD218542
+Node: graph218853
+Ref: ticks226014
+Ref: pathmarkers239806
+Ref: marker240277
+Ref: markuniform240631
+Ref: errorbars242439
+Ref: automatic scaling246913
+Node: palette258660
+Ref: images258778
+Ref: image262952
+Ref: logimage263472
+Ref: penimage264577
+Ref: penfunctionimage264839
+Node: three265610
+Ref: PostScript3D292628
+Node: obj294366
+Node: graph3294615
+Ref: GaussianSurface299895
+Node: grid3301044
+Node: solids301828
+Node: tube302820
+Node: flowchart305054
+Node: contour309662
+Node: contour3314977
+Node: smoothcontour3315290
+Node: slopefield317011
+Node: ode318500
+Node: Options318757
+Ref: configuration file325049
+Ref: settings325049
+Ref: texengines326292
+Ref: convert326292
+Node: Interactive mode329616
+Ref: history331766
+Node: GUI333072
+Node: GUI installation333623
+Node: GUI usage334315
+Node: PostScript to Asymptote335231
+Node: Help335989
+Node: Debugger337643
+Node: Credits339399
+Node: Index340416
 
 End Tag Table

Modified: trunk/Build/source/utils/asymptote/drawelement.h
===================================================================
--- trunk/Build/source/utils/asymptote/drawelement.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/drawelement.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -19,12 +19,13 @@
 #include "prcfile.h"
 #include "glrender.h"
 #include "arrayop.h"
+#include "material.h"
 
 namespace camp {
 
 //extern double Tx[3]; // x-component of current transform
 //extern double Ty[3]; // y-component of current transform
-extern double Tz[3]; // z-component of current transform
+extern double* Tz; // z-component of current transform
 
 static const double pixel=1.0; // Adaptive rendering constant.
 
@@ -118,6 +119,10 @@
 typedef mem::map<CONST string,unsigned> groupmap;
 typedef mem::vector<groupmap> groupsmap;
 
+#ifdef HAVE_GL
+typedef mem::map<CONST Material,size_t> MaterialMap;
+#endif
+
 class drawElement : public gc
 {
 public:
@@ -128,6 +133,13 @@
   
   virtual ~drawElement() {}
   
+  
+#ifdef HAVE_GL
+  static mem::vector<Material> material;
+  static MaterialMap materialMap;
+  static size_t materialIndex;
+#endif
+  
   static pen lastpen;  
   static const triple zero;
   
@@ -209,9 +221,8 @@
   virtual void displacement() {}
 
   // Render with OpenGL
-  virtual void render(GLUnurbs *nurb, double size2, 
-                      const triple& Min, const triple& Max,
-                      double perspective, bool lighton, bool transparent) {}
+  virtual void render(double size2, const triple& Min, const triple& Max,
+                      double perspective, bool transparent) {}
 
   // Transform as part of a picture.
   virtual drawElement *transformed(const transform&) {
@@ -373,10 +384,6 @@
   }
   
   void strokepath(psfile *out) {
-    // strokepath and evenodd are incompatible
-    static pen zerowinding=pen((FillRule) ZEROWINDING);
-    pentype=pentype+zerowinding;
-    out->setpen(pentype);
     out->strokepath();
   }
   
@@ -404,8 +411,25 @@
   }
 };
  
+#ifdef HAVE_GL
+template<class T>
+void registerBuffer(std::vector<T>& buffervector, GLuint bufferIndex) {
+  if (!buffervector.empty()) {
+    glBindBuffer(GL_ARRAY_BUFFER,bufferIndex);
+    glBufferData(GL_ARRAY_BUFFER,sizeof(T)*buffervector.size(),
+                 buffervector.data(),GL_STATIC_DRAW);
+    glBindBuffer(GL_ARRAY_BUFFER,0);
+  }
 }
 
+void setcolors(bool colors,
+               const prc::RGBAColour& diffuse,
+               const prc::RGBAColour& ambient,
+               const prc::RGBAColour& emissive,
+               const prc::RGBAColour& specular, double shininess);
+#endif
+}
+
 GC_DECLARE_PTRFREE(camp::box);
 GC_DECLARE_PTRFREE(camp::drawElement);
 

Modified: trunk/Build/source/utils/asymptote/drawfill.cc
===================================================================
--- trunk/Build/source/utils/asymptote/drawfill.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/drawfill.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -9,6 +9,9 @@
 
 namespace camp {
 
+using settings::ps2tex;
+using settings::tex2ps;
+
 void drawAxialShade::palette(psfile *out)
 {
   pentype.convert();

Modified: trunk/Build/source/utils/asymptote/drawlabel.cc
===================================================================
--- trunk/Build/source/utils/asymptote/drawlabel.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/drawlabel.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -45,7 +45,7 @@
   if (dim1 != string::npos && dim2 != string::npos) {
     string n=buffer.substr(dim1+start.size(),dim2-dim1-start.size());
     try {
-      dest=lexical::cast<double>(n,true)*camp::tex2ps;
+      dest=lexical::cast<double>(n,true)*tex2ps;
     } catch(lexical::bad_cast&) {
       camp::reportError(cannotread);
     }

Modified: trunk/Build/source/utils/asymptote/drawpath3.cc
===================================================================
--- trunk/Build/source/utils/asymptote/drawpath3.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/drawpath3.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -6,12 +6,23 @@
 
 #include "drawpath3.h"
 #include "drawsurface.h"
+#include "material.h"
 
+#include <glm/glm.hpp>
+#include <glm/gtc/matrix_transform.hpp>
+#include <glm/gtc/type_ptr.hpp>
+
 namespace camp {
 
 using vm::array;
 using namespace prc;
   
+#ifdef HAVE_GL
+using gl::modelView;
+
+BezierCurve drawPath3::R;
+#endif
+
 bool drawPath3::write(prcfile *out, unsigned int *, double, groupsmap&)
 {
   Int n=g.length();
@@ -43,9 +54,8 @@
   return true;
 }
 
-void drawPath3::render(GLUnurbs *nurb, double size2,
-                       const triple& b, const triple& B,
-                       double perspective, bool lighton, bool transparent)
+void drawPath3::render(double size2, const triple& b, const triple& B,
+                       double perspective, bool transparent)
 {
 #ifdef HAVE_GL
   Int n=g.length();
@@ -71,13 +81,8 @@
   
   const pair size3(s*(B.getx()-b.getx()),s*(B.gety()-b.gety()));
   
-  double t[16]; // current transform
-  glGetDoublev(GL_MODELVIEW_MATRIX,t);
-// Like Fortran, OpenGL uses transposed (column-major) format!
-  run::transpose(t,4);
-  run::inverse(t,4);
   bbox3 box(m,M);
-  box.transform(t);
+  box.transform(modelView.Tinv);
   m=box.Min();
   M=box.Max();
 
@@ -86,20 +91,9 @@
                     Max.getz() < m.getz() || Min.getz() > M.getz()))
     return;
   
-  drawBezierPatch::S.draw();
+  RGBAColour Black(0.0,0.0,0.0,color.A);
+  setcolors(false,Black,Black,color,Black,1.0);
   
-  GLfloat Diffuse[]={0.0,0.0,0.0,(GLfloat) color.A};
-  glMaterialfv(GL_FRONT,GL_DIFFUSE,Diffuse);
-  static GLfloat Black[]={0.0,0.0,0.0,1.0};
-  glMaterialfv(GL_FRONT,GL_AMBIENT,Black);
-  GLfloat Emissive[]={(GLfloat) color.R,(GLfloat) color.G,(GLfloat) color.B,
-		      (GLfloat) color.A};
-  glMaterialfv(GL_FRONT,GL_EMISSION,Emissive);
-  glMaterialfv(GL_FRONT,GL_SPECULAR,Black);
-  glMaterialf(GL_FRONT,GL_SHININESS,128.0);
-  
-  
-  
   if(billboard) {
     for(Int i=0; i < n; ++i) {
       triple controls[]={BB.transform(g.point(i)),BB.transform(g.postcontrol(i)),
@@ -214,9 +208,8 @@
 #endif  
 }
 
-void drawNurbsPath3::render(GLUnurbs *nurb, double, const triple&,
-                            const triple&, double, bool lighton,
-                            bool transparent)
+void drawNurbsPath3::render(double, const triple&, const triple&,
+                            double, bool transparent)
 {
 #ifdef HAVE_GL
   if(invisible || ((color.A < 1.0) ^ transparent))
@@ -235,20 +228,63 @@
   glMaterialfv(GL_FRONT,GL_SPECULAR,Black);
   
   glMaterialf(GL_FRONT,GL_SHININESS,128.0);
+#endif
+}
+
+bool drawPixel::write(prcfile *out, unsigned int *, double, groupsmap&)
+{
+  if(invisible)
+    return true;
+
+  out->addPoint(v,color,width);
   
-  if(weights)
-    gluNurbsCallback(nurb,GLU_NURBS_VERTEX,(_GLUfuncptr) glVertex4fv);
-  else gluNurbsCallback(nurb,GLU_NURBS_VERTEX,(_GLUfuncptr) glVertex3fv);
+  return true;
+}
+  
+void drawPixel::render(double size2, const triple& b, const triple& B,
+                       double perspective, bool transparent) 
+{
+#ifdef HAVE_GL
+  if(invisible || ((color.A < 1.0) ^ transparent)) return;
+  triple m,M;
+  
+  double f,F,s;
+  if(perspective) {
+    f=Min.getz()*perspective;
+    F=Max.getz()*perspective;
+    m=triple(min(f*b.getx(),F*b.getx()),min(f*b.gety(),F*b.gety()),b.getz());
+    M=triple(max(f*B.getx(),F*B.getx()),max(f*B.gety(),F*B.gety()),B.getz());
+    s=max(f,F);
+  } else {
+    m=b;
+    M=B;
+    s=1.0;
+  }
+  
+  const pair size3(s*(B.getx()-b.getx()),s*(B.gety()-b.gety()));
+  
+  bbox3 box(m,M);
+  box.transform(modelView.Tinv);
+  m=box.Min();
+  M=box.Max();
 
-  gluBeginCurve(nurb);
-  int order=degree+1;
-  gluNurbsCurve(nurb,order+n,Knots,weights ? 4 : 3,Controls,order,
-                weights ? GL_MAP1_VERTEX_4 : GL_MAP1_VERTEX_3);
-  gluEndCurve(nurb);
+  if((Max.getx() < m.getx() || Min.getx() > M.getx() ||
+      Max.gety() < m.gety() || Min.gety() > M.gety() ||
+      Max.getz() < m.getz() || Min.getz() > M.getz()))
+    return;
   
-  if(weights)
-    gluNurbsCallback(nurb,GLU_NURBS_VERTEX,(_GLUfuncptr) glVertex3fv);
+  RGBAColour Black(0.0,0.0,0.0,color.A);
+  setcolors(false,color,Black,color,Black,1.0);
+  
+  glPointSize(1.0+width);
+  R.draw(v);
+  glPointSize(1.0);
 #endif
 }
 
+drawElement *drawPixel::transformed(const double* t)
+{
+  return new drawPixel(t*v,p,width,KEY);
+}
+  
 } //namespace camp

Modified: trunk/Build/source/utils/asymptote/drawpath3.h
===================================================================
--- trunk/Build/source/utils/asymptote/drawpath3.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/drawpath3.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -16,7 +16,7 @@
 class drawPath3 : public drawElement {
 protected:
 #ifdef HAVE_GL
-  BezierCurve R;
+  static BezierCurve R;
 #endif  
   const path3 g;
   triple center;
@@ -70,8 +70,8 @@
   
   bool write(prcfile *out, unsigned int *, double, groupsmap&);
   
-  void render(GLUnurbs*, double, const triple&, const triple&, double,
-              bool lighton, bool transparent);
+  void render(double, const triple&, const triple&, double,
+              bool transparent);
 
   drawElement *transformed(const double* t);
 };
@@ -155,13 +155,52 @@
   void ratio(const double* t, pair &b, double (*m)(double, double), double fuzz,
              bool &first);
     
-  void render(GLUnurbs *nurb, double size2,
-              const triple& Min, const triple& Max,
-              double perspective, bool lighton, bool transparent);
+  void render(double size2, const triple& Min, const triple& Max,
+              double perspective, bool transparent);
     
   drawElement *transformed(const double* t);
 };
 
+// Draw a pixel.
+class drawPixel : public drawElement {
+#ifdef HAVE_GL
+  Pixel R;
+#endif  
+  triple v;
+  pen p;
+  prc::RGBAColour color;
+  double width;
+  bool invisible;
+  triple Min,Max;
+public:
+  drawPixel(const triple& v, const pen& p, double width, const string& key="")
+    : drawElement(key), v(v), p(p), color(rgba(p)), width(width),
+      invisible(p.invisible()) {}
+
+  void bounds(const double* t, bbox3& B) {
+    Min=Max=(t != NULL) ? t*v : v;
+    B.add(Min);
+  }
+  
+  void ratio(const double* t, pair &b, double (*m)(double, double), double,
+             bool &first) {
+    triple V=(t != NULL) ? t*v : v;
+    pair z=pair(xratio(V),yratio(V));
+              
+    if(first) {
+      b=z;
+      first=false;
+    } else b=pair(m(b.getx(),z.getx()),m(b.gety(),z.gety()));
+  }
+  
+  void render(double size2, const triple& b, const triple& B,
+              double perspective, bool transparent);
+  
+  bool write(prcfile *out, unsigned int *, double, groupsmap&);
+  
+  drawElement *transformed(const double* t);
+};
+
 }
 
 #endif

Modified: trunk/Build/source/utils/asymptote/drawsurface.cc
===================================================================
--- trunk/Build/source/utils/asymptote/drawsurface.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/drawsurface.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -5,6 +5,7 @@
  *****/
 
 #include "drawsurface.h"
+#include "drawpath3.h"
 #include "arrayop.h"
 
 #include <iostream>
@@ -11,16 +12,28 @@
 #include <iomanip>
 #include <fstream>
 
+#include <glm/glm.hpp>
+#include <glm/gtc/matrix_transform.hpp>
+#include <glm/gtc/type_ptr.hpp>
+
 using namespace prc;
-
+#include "material.h"
 namespace camp {
 
+#ifdef HAVE_GL
+mem::vector<Material> drawElement::material;
+MaterialMap drawElement::materialMap;
+size_t drawElement::materialIndex;
+
+using gl::modelView;
+//double* Tx=modelView.T;   // x-component of current transform
+//double* Ty=modelView.T+4; // y-component of current transform
+double* Tz=modelView.T+8; // z-component of current transform
+
+#endif
+
 const triple drawElement::zero;
 
-//double Tx[3]; // x-component of current transform
-//double Ty[3]; // y-component of current transform
-double Tz[3]; // z-component of current transform
-
 using vm::array;
 
 #ifdef HAVE_GL
@@ -46,64 +59,46 @@
   colors[i+3]=p.A;
 }
 
-void setcolors(bool colors, bool lighton,
+void clearMaterialBuffer(bool draw)
+{
+  if(draw) drawBezierPatch::S.draw();
+  drawElement::material.clear();
+  drawElement::material.reserve(nmaterials);
+  drawElement::materialMap.clear();
+  drawElement::materialIndex=0;
+}
+
+void setcolors(bool colors,
                const RGBAColour& diffuse,
                const RGBAColour& ambient,
                const RGBAColour& emissive,
                const RGBAColour& specular, double shininess) 
 {
-  static prc::RGBAColour lastdiffuse;
-  static prc::RGBAColour lastambient;
-  static prc::RGBAColour lastemissive;
-  static prc::RGBAColour lastspecular;
-  static double lastshininess=0.0;
-  static bool lastcolors=false;
-    
-  if(colors != lastcolors) {
-    drawBezierPatch::S.draw();
-    lastcolors=colors;
-  }
-  
-  if(!colors && (diffuse != lastdiffuse || ambient != lastambient || 
-                 emissive != lastemissive || specular != lastspecular ||
-                 shininess != lastshininess)) {
-    drawBezierPatch::S.draw(); 
-    lastdiffuse=diffuse;
-    lastambient=ambient;
-    lastemissive=emissive;
-    lastspecular=specular;
-    lastshininess=shininess;
-  }
-
+  Material m;
   if(colors) {
-    if(!lighton) 
-      glColorMaterial(GL_FRONT_AND_BACK,GL_EMISSION);
-
-    GLfloat Black[]={0,0,0,(GLfloat) diffuse.A};
-    glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,Black);
-    glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,Black);
-    glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,Black);
-  } else {
-    GLfloat Diffuse[]={(GLfloat) diffuse.R,(GLfloat) diffuse.G,
-		       (GLfloat) diffuse.B,(GLfloat) diffuse.A};
-    glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,Diffuse);
-  
-    GLfloat Ambient[]={(GLfloat) ambient.R,(GLfloat) ambient.G,
-		       (GLfloat) ambient.B,(GLfloat) ambient.A};
-    glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,Ambient);
-  
-    GLfloat Emissive[]={(GLfloat) emissive.R,(GLfloat) emissive.G,
-			(GLfloat) emissive.B,(GLfloat) emissive.A};
-    glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,Emissive);
+    static glm::vec4 Black(0.0,0.0,0.0,diffuse.A);
+    m=Material(Black,Black,Black,
+               glm::vec4(specular.R,specular.G,specular.B,specular.A),
+               shininess);
+  }  else
+    m=Material(glm::vec4(diffuse.R,diffuse.G,diffuse.B,diffuse.A),
+               glm::vec4(ambient.R,ambient.G,ambient.B,ambient.A),
+               glm::vec4(emissive.R,emissive.G,emissive.B,emissive.A),
+               glm::vec4(specular.R,specular.G,specular.B,specular.A),
+               shininess);
+          
+  MaterialMap::iterator p=drawElement::materialMap.find(m);
+  if(p != drawElement::materialMap.end())
+    drawElement::materialIndex=p->second;
+  else {
+    drawElement::materialIndex=drawElement::material.size();
+    if(drawElement::materialIndex >= nmaterials)
+      nmaterials=min(Maxmaterials,2*nmaterials);
+    if(drawElement::materialIndex >= Maxmaterials)
+      clearMaterialBuffer(true);
+    drawElement::material.push_back(m);
+    drawElement::materialMap[m]=drawElement::materialIndex;
   }
-    
-  if(lighton) {
-    GLfloat Specular[]={(GLfloat) specular.R,(GLfloat) specular.G,
-			(GLfloat) specular.B,(GLfloat) specular.A};
-    glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,Specular);
-  
-    glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,128.0*shininess);
-  }
 }
 
 #endif  
@@ -150,17 +145,17 @@
     }
     
     double c0=cx[0];
-    double fuzz=sqrtFuzz*run::norm(cx,16);
+    double fuzz=Fuzz*run::norm(cx,16);
     x=bound(cx,min,b.empty ? c0 : min(c0,b.left),fuzz,maxdepth);
     X=bound(cx,max,b.empty ? c0 : max(c0,b.right),fuzz,maxdepth);
     
     c0=cy[0];
-    fuzz=sqrtFuzz*run::norm(cy,16);
+    fuzz=Fuzz*run::norm(cy,16);
     y=bound(cy,min,b.empty ? c0 : min(c0,b.bottom),fuzz,maxdepth);
     Y=boundtri(cy,max,b.empty ? c0 : max(c0,b.top),fuzz,maxdepth);
     
     c0=cz[0];
-    fuzz=sqrtFuzz*run::norm(cz,16);
+    fuzz=Fuzz*run::norm(cz,16);
     z=bound(cz,min,b.empty ? c0 : min(c0,b.lower),fuzz,maxdepth);
     Z=bound(cz,max,b.empty ? c0 : max(c0,b.upper),fuzz,maxdepth);
   }  
@@ -247,10 +242,8 @@
   return true;
 }
 
-void drawBezierPatch::render(GLUnurbs *nurb, double size2,
-                             const triple& b, const triple& B,
-                             double perspective, bool lighton,
-                             bool transparent)
+void drawBezierPatch::render(double size2, const triple& b, const triple& B,
+                             double perspective, bool transparent)
 {
 #ifdef HAVE_GL
   if(invisible || 
@@ -275,28 +268,9 @@
   }
   
   const pair size3(s*(B.getx()-b.getx()),s*(B.gety()-b.gety()));
-  
-  double t[16]; // current transform
-  glGetDoublev(GL_MODELVIEW_MATRIX,t);
-// Like Fortran, OpenGL uses transposed (column-major) format!
-  run::transpose(t,4);
-/*  
-  Tx[0]=t[0];
-  Tx[1]=t[1];
-  Tx[2]=t[2];
-  
-  Ty[0]=t[4];
-  Ty[1]=t[5];
-  Ty[2]=t[6];
-*/
-  
-  Tz[0]=t[8];
-  Tz[1]=t[9];
-  Tz[2]=t[10];
-  
-  run::inverse(t,4);
+
   bbox3 box(m,M);
-  box.transform(t);
+  box.transform(modelView.Tinv);
   m=box.Min();
   M=box.Max();
   
@@ -305,14 +279,14 @@
                     Max.getz() < m.getz() || Min.getz() > M.getz()))
     return;
 
-  setcolors(colors,lighton,diffuse,ambient,emissive,specular,shininess);
+  setcolors(colors,diffuse,ambient,emissive,specular,shininess);
   
   if(billboard) BB.init(center);
   
-  GLfloat v[16];
+  GLfloat c[16];
   if(colors)
     for(size_t i=0; i < 4; ++i)
-      storecolor(v,4*i,colors[i]);
+      storecolor(c,4*i,colors[i]);
   
   triple *Controls;
   triple Controls0[16];
@@ -335,9 +309,11 @@
     C.draw();
   } else {
     S.queue(Controls,straight,size3.length()/size2,m,M,transparent,
-            colors ? v : NULL);
-    if(!transparent) 
-      S.draw();
+            colors ? c : NULL);
+    if(BezierPatch::nvertices >= gl::maxvertices)
+      drawBezierPatch::S.drawMaterials();
+    if(BezierPatch::Nvertices >= gl::maxvertices)
+      drawBezierPatch::S.drawColors();
   }
 #endif
 }
@@ -387,17 +363,17 @@
     }
     
     double c0=cx[0];
-    double fuzz=sqrtFuzz*run::norm(cx,10);
+    double fuzz=Fuzz*run::norm(cx,10);
     x=boundtri(cx,min,b.empty ? c0 : min(c0,b.left),fuzz,maxdepth);
     X=boundtri(cx,max,b.empty ? c0 : max(c0,b.right),fuzz,maxdepth);
     
     c0=cy[0];
-    fuzz=sqrtFuzz*run::norm(cy,10);
+    fuzz=Fuzz*run::norm(cy,10);
     y=boundtri(cy,min,b.empty ? c0 : min(c0,b.bottom),fuzz,maxdepth);
     Y=boundtri(cy,max,b.empty ? c0 : max(c0,b.top),fuzz,maxdepth);
     
     c0=cz[0];
-    fuzz=sqrtFuzz*run::norm(cz,10);
+    fuzz=Fuzz*run::norm(cz,10);
     z=boundtri(cz,min,b.empty ? c0 : min(c0,b.lower),fuzz,maxdepth);
     Z=boundtri(cz,max,b.empty ? c0 : max(c0,b.upper),fuzz,maxdepth);
   }
@@ -485,10 +461,8 @@
   return true;
 }
 
-void drawBezierTriangle::render(GLUnurbs *nurb, double size2,
-                                const triple& b, const triple& B,
-                                double perspective, bool lighton,
-                                bool transparent)
+void drawBezierTriangle::render(double size2, const triple& b, const triple& B,
+                                double perspective, bool transparent)
 {
 #ifdef HAVE_GL
   if(invisible || 
@@ -513,28 +487,9 @@
   }
   
   const pair size3(s*(B.getx()-b.getx()),s*(B.gety()-b.gety()));
-  
-  double t[16]; // current transform
-  glGetDoublev(GL_MODELVIEW_MATRIX,t);
-// Like Fortran, OpenGL uses transposed (column-major) format!
-  run::transpose(t,4);
-/*  
-  Tx[0]=t[0];
-  Tx[1]=t[1];
-  Tx[2]=t[2];
-  
-  Ty[0]=t[4];
-  Ty[1]=t[5];
-  Ty[2]=t[6];
-*/
-  
-  Tz[0]=t[8];
-  Tz[1]=t[9];
-  Tz[2]=t[10];
 
-  run::inverse(t,4);
   bbox3 box(m,M);
-  box.transform(t);
+  box.transform(modelView.Tinv);
   m=box.Min();
   M=box.Max();
 
@@ -543,7 +498,7 @@
                     Max.getz() < m.getz() || Min.getz() > M.getz()))
     return;
 
-  setcolors(colors,lighton,diffuse,ambient,emissive,specular,shininess);
+  setcolors(colors,diffuse,ambient,emissive,specular,shininess);
   
   if(billboard) BB.init(center);
   
@@ -569,12 +524,9 @@
     triple edge2[]={Controls[9],Controls[5],Controls[2],Controls[0]};
     C.queue(edge2,straight,size3.length()/size2,m,M);
     C.draw();
-  } else {
+  } else
     S.queue(Controls,straight,size3.length()/size2,m,M,transparent,
             colors ? v : NULL);
-    if(!transparent) 
-      S.draw();
-  }
 #endif
 }
 
@@ -685,20 +637,15 @@
 #endif  
 }
 
-void drawNurbs::render(GLUnurbs *nurb, double size2,
-                       const triple& Min, const triple& Max,
-                       double perspective, bool lighton, bool transparent)
+void drawNurbs::render(double size2, const triple& Min, const triple& Max,
+                       double perspective, bool transparent)
 {
 #ifdef HAVE_GL
   if(invisible || ((colors ? colors[3]+colors[7]+colors[11]+colors[15] < 4.0
                     : diffuse.A < 1.0) ^ transparent)) return;
-  
-  double t[16]; // current transform
-  glGetDoublev(GL_MODELVIEW_MATRIX,t);
-  run::transpose(t,4);
 
   bbox3 B(this->Min,this->Max);
-  B.transform(t);
+  B.transform(modelView.T);
     
   triple m=B.Min();
   triple M=B.Max();
@@ -718,27 +665,8 @@
        M.getz() < Min.getz() || m.getz() > Max.getz()) return;
   }
 
-  setcolors(colors,lighton,diffuse,ambient,emissive,specular,shininess);
-  
-  gluBeginSurface(nurb);
-  int uorder=udegree+1;
-  int vorder=vdegree+1;
-  size_t stride=weights ? 4 : 3;
-  gluNurbsSurface(nurb,uorder+nu,uKnots,vorder+nv,vKnots,stride*nv,stride,
-                  Controls,uorder,vorder,
-                  weights ? GL_MAP2_VERTEX_4 : GL_MAP2_VERTEX_3);
-  if(lighton)
-    gluNurbsCallback(nurb,GLU_NURBS_NORMAL,(_GLUfuncptr) glNormal3fv);
-  
-  if(colors) {
-    static GLfloat linear[]={0.0,0.0,1.0,1.0};
-    gluNurbsSurface(nurb,4,linear,4,linear,8,4,colors,2,2,GL_MAP2_COLOR_4);
-  }
-    
-  gluEndSurface(nurb);
-  
-  if(colors)
-    glDisable(GL_COLOR_MATERIAL);
+  setcolors(colors,diffuse,ambient,emissive,specular,shininess);
+// TODO: implement NURBS renderer
 #endif
 }
 
@@ -898,49 +826,6 @@
   return true;
 }
 
-bool drawPixel::write(prcfile *out, unsigned int *, double, groupsmap&)
-{
-  if(invisible)
-    return true;
-
-  out->addPoint(v,c,width);
-  
-  return true;
-}
-  
-void drawPixel::render(GLUnurbs *nurb, double size2,
-                       const triple& Min, const triple& Max,
-                       double perspective, bool lighton, bool transparent) 
-{
-#ifdef HAVE_GL
-  if(invisible)
-    return;
-  
-  GLfloat V[4];
-
-  glEnable(GL_COLOR_MATERIAL);
-  glColorMaterial(GL_FRONT_AND_BACK,GL_EMISSION);
-  
-  static GLfloat Black[]={0,0,0,1};
-  glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,Black);
-  glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,Black);
-  glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,Black);
-  glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,0.0);
-
-  glPointSize(1.0+width);
-  
-  glBegin(GL_POINT);
-  storecolor(V,0,c);
-  glColor4fv(V);
-  store(V,v);
-  glVertex3fv(V);
-  glEnd();
-  
-  glPointSize(1.0);
-  glDisable(GL_COLOR_MATERIAL);
-#endif
-}
-
 const string drawBaseTriangles::wrongsize=
   "triangle indices require 3 components";
 const string drawBaseTriangles::outofrange="index out of range";
@@ -993,7 +878,7 @@
   if(invisible)
     return true;
   
-  if (nC) {
+  if(nC) {
     const RGBAColour white(1,1,1,opacity);
     const RGBAColour black(0,0,0,opacity);
     const PRCmaterial m(black,white,black,specular,opacity,PRCshininess);
@@ -1006,8 +891,8 @@
   return true;
 }
 
-void drawTriangles::render(GLUnurbs *nurb, double size2, const triple& Min,
-                           const triple& Max, double perspective, bool lighton,
+void drawTriangles::render(double size2, const triple& Min,
+                           const triple& Max, double perspective,
                            bool transparent)
 {
 #ifdef HAVE_GL
@@ -1017,12 +902,9 @@
   if(invisible || ((diffuse.A < 1.0) ^ transparent)) return;
 
   triple m,M;
-  double t[16]; // current transform
-  glGetDoublev(GL_MODELVIEW_MATRIX,t);
-  run::transpose(t,4);
 
   bbox3 B(this->Min,this->Max);
-  B.transform(t);
+  B.transform(modelView.T);
 
   m=B.Min();
   M=B.Max();
@@ -1044,34 +926,8 @@
       return;
   }
 
-  setcolors(nC,!nC,diffuse,ambient,emissive,specular,shininess);
-  if(!nN) lighton=false;
-  
-  glBegin(GL_TRIANGLES);
-  for(size_t i=0; i < nI; i++) {
-    const uint32_t *pi=PI[i];
-    const uint32_t *ni=NI[i];
-    const uint32_t *ci=nC ? CI[i] : 0;
-    if(lighton)
-      glNormal3f(N[ni[0]].getx(),N[ni[0]].gety(),N[ni[0]].getz());
-    if(nC)
-      glColor4f(C[ci[0]].R,C[ci[0]].G,C[ci[0]].B,C[ci[0]].A);
-    glVertex3f(P[pi[0]].getx(),P[pi[0]].gety(),P[pi[0]].getz());
-    if(lighton)
-      glNormal3f(N[ni[1]].getx(),N[ni[1]].gety(),N[ni[1]].getz());
-    if(nC)
-      glColor4f(C[ci[1]].R,C[ci[1]].G,C[ci[1]].B,C[ci[1]].A);
-    glVertex3f(P[pi[1]].getx(),P[pi[1]].gety(),P[pi[1]].getz());
-    if(lighton)
-      glNormal3f(N[ni[2]].getx(),N[ni[2]].gety(),N[ni[2]].getz());
-    if(nC)
-      glColor4f(C[ci[2]].R,C[ci[2]].G,C[ci[2]].B,C[ci[2]].A);
-    glVertex3f(P[pi[2]].getx(),P[pi[2]].gety(),P[pi[2]].getz());
-  }
-  glEnd();
-
-  if(nC)
-    glDisable(GL_COLOR_MATERIAL);
+  setcolors(nC,diffuse,ambient,emissive,specular,shininess);
+  R.queue(nP,P,nN,N,nC,C,nI,PI,NI,CI,transparent);
 #endif
 }
 

Modified: trunk/Build/source/utils/asymptote/drawsurface.h
===================================================================
--- trunk/Build/source/utils/asymptote/drawsurface.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/drawsurface.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -52,10 +52,10 @@
   drawSurface(const vm::array& g, size_t ncontrols, triple center,
               bool straight, const vm::array&p, double opacity,
               double shininess, double PRCshininess, const vm::array &pens,
-              Interaction interaction, bool prc) :
-    ncontrols(ncontrols), center(center), straight(straight), opacity(opacity),
-    shininess(shininess), PRCshininess(PRCshininess), interaction(interaction),
-    prc(prc) {
+              Interaction interaction, bool prc, const string& key="") :
+    drawElement(key), ncontrols(ncontrols), center(center), straight(straight),
+    opacity(opacity), shininess(shininess), PRCshininess(PRCshininess),
+    interaction(interaction), prc(prc) {
     if(checkArray(&g) != 4 || checkArray(&p) != 4)
       reportError(wrongsize());
     
@@ -135,8 +135,8 @@
   
   bool write(prcfile *out, unsigned int *, double, groupsmap&);
   
-  void render(GLUnurbs *nurb, double, const triple& Min, const triple& Max,
-              double perspective, bool lighton, bool transparent);
+  void render(double, const triple& Min, const triple& Max,
+              double perspective, bool transparent);
   drawElement *transformed(const double* t);
 };
   
@@ -164,8 +164,8 @@
   
   bool write(prcfile *out, unsigned int *, double, groupsmap&);
   
-  void render(GLUnurbs *nurb, double, const triple& Min, const triple& Max,
-              double perspective, bool lighton, bool transparent);
+  void render(double, const triple& Min, const triple& Max,
+              double perspective, bool transparent);
   drawElement *transformed(const double* t);
 };
   
@@ -198,9 +198,10 @@
 public:
   drawNurbs(const vm::array& g, const vm::array* uknot, const vm::array* vknot,
             const vm::array* weight, const vm::array&p, double opacity,
-            double shininess, double PRCshininess, const vm::array &pens)
-            : opacity(opacity), shininess(shininess),
-              PRCshininess(PRCshininess) {
+            double shininess, double PRCshininess, const vm::array &pens,
+            const string& key="") 
+    : drawElement(key), opacity(opacity), shininess(shininess),
+      PRCshininess(PRCshininess) {
     size_t weightsize=checkArray(weight);
     
     const string wrongsize="Inconsistent NURBS data";
@@ -301,9 +302,8 @@
   void ratio(const double* t, pair &b, double (*m)(double, double), double,
              bool &first);
 
-  void render(GLUnurbs *nurb, double size2, const triple& Min,
-              const triple& Max, double perspective, bool lighton,
-              bool transparent);
+  void render(double size2, const triple& Min, const triple& Max,
+              double perspective, bool transparent);
     
   drawElement *transformed(const double* t);
 };
@@ -450,50 +450,13 @@
   }
 };
 
-// Draw a PRC pixel.
-class drawPixel : public drawElement {
-  triple v;
-  prc::RGBAColour c;
-  double width;
-  bool invisible;
-public:
-  drawPixel(const triple& v0, const pen& p, double width) :
-    c(rgba(p)), width(width) {
-    v=v0;
-    invisible=p.invisible();
-  }
-
-  drawPixel(const double* t, const drawPixel *s) : drawElement(s->KEY),
-    c(s->c), width(s->width), invisible(s->invisible) {
-    v=t*s->v;
-  }
-    
-  void bounds(const double* t, bbox3& b) {
-    const triple R=0.5*width*triple(1.0,1.0,1.0);
-    if (t != NULL) {
-      triple tv;
-      tv=t*v;
-      b.add(tv-R);
-      b.add(tv+R);
-    } else {
-      b.add(v-R);
-      b.add(v+R);
-    }    
-  }    
   
-  void render(GLUnurbs *nurb, double size2, const triple& Min,
-              const triple& Max, double perspective, bool lighton,
-              bool transparent);
-  
-  bool write(prcfile *out, unsigned int *, double, groupsmap&);
-  
-  drawElement *transformed(const double* t) {
-    return new drawPixel(t,this);
-  }
-};
-  
 class drawBaseTriangles : public drawElement {
 protected:
+#ifdef HAVE_GL
+  Triangles R;
+#endif  
+  
   size_t nP;
   triple* P;
   size_t nN;
@@ -676,9 +639,8 @@
  
   virtual ~drawTriangles() {}
  
-  void render(GLUnurbs *nurb, double size2, const triple& Min,
-              const triple& Max, double perspective, bool lighton,
-              bool transparent);
+  void render(double size2, const triple& Min, const triple& Max,
+              double perspective, bool transparent);
  
   bool write(prcfile *out, unsigned int *, double, groupsmap&);
  

Modified: trunk/Build/source/utils/asymptote/examples/Sierpinski.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/Sierpinski.asy	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/examples/Sierpinski.asy	2019-03-27 22:27:57 UTC (rev 50622)
@@ -5,8 +5,8 @@
 {
   pair B=A-(1,sqrt(2))*s/2;
   pair C=B+s;
-  if(top) draw(A--B--C--cycle);
-  draw((A+B)/2--(B+C)/2--(A+C)/2--cycle);
+  if(top) fill(A--B--C--cycle);
+  unfill((A+B)/2--(B+C)/2--(A+C)/2--cycle);
   if(q > 0) {
     Sierpinski(A,s/2,q-1,false);
     Sierpinski((A+B)/2,s/2,q-1,false);
@@ -14,4 +14,4 @@
   }
 }
 
-Sierpinski((0,1),1,5);
+Sierpinski((0,1),1,9);

Modified: trunk/Build/source/utils/asymptote/examples/arrows3.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/arrows3.asy	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/examples/arrows3.asy	2019-03-27 22:27:57 UTC (rev 50622)
@@ -5,7 +5,7 @@
 defaultrender.merge=true;
 
 currentprojection=perspective(24,14,13);
-currentlight=light(gray(0.5),specularfactor=3,viewport=false,
+currentlight=light(gray(0.5),specularfactor=3,
                    (0.5,-0.5,-0.25),(0.5,0.5,0.25),(0.5,0.5,1),(-0.5,-0.5,-1));
 
 defaultpen(0.75mm);

Modified: trunk/Build/source/utils/asymptote/examples/randompath3.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/randompath3.asy	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/examples/randompath3.asy	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1,4 +1,4 @@
 import three;
 
 size(300);
-draw(randompath3(100),red,currentlight);
+draw(randompath3(100),red,nolight);

Modified: trunk/Build/source/utils/asymptote/examples/threeviews.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/threeviews.asy	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/examples/threeviews.asy	2019-03-27 22:27:57 UTC (rev 50622)
@@ -3,7 +3,6 @@
 picture pic;
 unitsize(pic,5cm);
 
-currentlight.viewport=false;
 if(settings.render < 0) settings.render=4;
 settings.toolbar=false;
 viewportmargin=(1cm,1cm);

Modified: trunk/Build/source/utils/asymptote/examples/triangles.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/triangles.asy	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/examples/triangles.asy	2019-03-27 22:27:57 UTC (rev 50622)
@@ -8,12 +8,13 @@
 int[][] vi={{0,1,2},{2,3,0}};
 int[][] ni={{0,0,0},{1,1,1}};
 
+// Adobe Reader exhibits a PRC rendering bug for opacities:
 pen[] p={red+opacity(0.5),green+opacity(0.5),blue+opacity(0.5),
          black+opacity(0.5)};
 
-// Adobe Reader exhibits a PRC rendering bug for opacities in (0.5,1):
-//pen[] p={red+opacity(0.9),green+opacity(0.9),blue+opacity(0.9),black+opacity(0.9)};
-
 int[][] pi={{0,1,2},{2,3,0}};
 draw(v,vi,n,ni,red);
-draw(v+Z,vi,p,pi);
+draw(v+Z,vi,n,ni,p,pi);
+//draw(v+Z,vi,p,pi);
+//draw(v,vi,red);
+//draw(v+Z,vi);

Modified: trunk/Build/source/utils/asymptote/fpu.h
===================================================================
--- trunk/Build/source/utils/asymptote/fpu.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/fpu.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1,6 +1,11 @@
 #ifndef FPU_H
 #define FPU_H
 
+#ifdef __GNU_VISIBLE
+#undef __GNU_VISIBLE
+#define __GNU_VISIBLE 1
+#endif
+
 #include "common.h"
 
 #ifdef HAVE_FEENABLEEXCEPT

Added: trunk/Build/source/utils/asymptote/gc-8.0.2.tar.gz
===================================================================
(Binary files differ)

Index: trunk/Build/source/utils/asymptote/gc-8.0.2.tar.gz
===================================================================
--- trunk/Build/source/utils/asymptote/gc-8.0.2.tar.gz	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/gc-8.0.2.tar.gz	2019-03-27 22:27:57 UTC (rev 50622)

Property changes on: trunk/Build/source/utils/asymptote/gc-8.0.2.tar.gz
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: trunk/Build/source/utils/asymptote/glrender.cc
===================================================================
--- trunk/Build/source/utils/asymptote/glrender.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/glrender.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -14,6 +14,8 @@
 #include <sys/time.h>
 
 #include "common.h"
+#include "locate.h"
+#include "seconds.h"
 
 #ifdef HAVE_GL
 
@@ -43,10 +45,28 @@
 #endif
 #endif
 
+#include <glm/glm.hpp>
+#include <glm/gtc/matrix_transform.hpp>
+#include <glm/gtc/type_ptr.hpp>
+
+#include "shaders.h"
+#include "material.h"
+
+using settings::locateFile;
+using camp::Material;
+using camp::Maxmaterials;
+using camp::Nmaterials;
+using camp::nmaterials;
+using utils::seconds;
+
 namespace camp {
 billboard BB;
+GLint noColorShader;
+GLint colorShader;
+size_t Maxmaterials;
+size_t Nmaterials=1;
+size_t nmaterials=48;
 }
-
 namespace gl {
   
 bool outlinemode=false;
@@ -53,6 +73,9 @@
 bool glthread=false;
 bool initialize=true;
 
+GLint Maxvertices;
+Int maxvertices;
+
 using camp::picture;
 using camp::drawRawImage;
 using camp::transform;
@@ -65,8 +88,6 @@
 using settings::Setting;
 
 bool Iconify=false;
-bool Menu;
-bool Motion;
 bool ignorezoom;
 int Fitscreen;
 
@@ -86,7 +107,6 @@
 
 int x0,y0;
 string Action;
-int MenuButton;
 
 double lastangle;
 Arcball arcball;
@@ -132,12 +152,12 @@
 static const double radians=1.0/degrees;
 
 double Background[4];
-size_t Nlights;
+size_t Nlights=1; // Maximum number of lights compiled in shader
+size_t nlights; // Actual number of lights
 triple *Lights; 
 double *Diffuse;
 double *Ambient;
 double *Specular;
-bool ViewportLighting;
 bool antialias;
 
 double Zoom;
@@ -144,9 +164,43 @@
 double Zoom0;
 double lastzoom;
 
-GLfloat Rotate[16];  
-GLUnurbs *nurb=NULL;
+using glm::dvec3;
+using glm::mat4;
+using glm::dmat4;
+using glm::value_ptr;
+using glm::translate;
 
+mat4 projViewMat;
+mat4 viewMat;
+mat4 normMat;
+
+dmat4 dprojMat;
+dmat4 dviewMat;
+dmat4 drotateMat; 
+
+ModelView modelView;
+
+void updateModelViewData()
+{
+  // Like Fortran, OpenGL uses transposed (column-major) format!
+  dmat4 MV=glm::transpose(dviewMat);
+  dmat4 MVinv=glm::inverse(MV);
+  
+  normMat=mat4(MVinv);
+
+  double* T=value_ptr(MV);
+  double* Tinv=value_ptr(MVinv);
+
+  for(int j=0; j < 16; ++j) {
+    modelView.T[j]=T[j];
+    modelView.Tinv[j]=Tinv[j];
+  }
+}
+
+
+GLint shaderProg,shaderProgColor;
+
+double *Rotate;
 void *glrenderWrapper(void *a);
 
 #ifdef HAVE_LIBOSMESA
@@ -190,51 +244,14 @@
   return (a > b) ? a : b;
 }
 
-void lighting()
+glm::vec4 vec4(triple v)
 {
-  for(size_t i=0; i < Nlights; ++i) {
-    GLenum index=GL_LIGHT0+i;
-    triple Lighti=Lights[i];
-    GLfloat position[]={(GLfloat) Lighti.getx(),(GLfloat) Lighti.gety(),
-			(GLfloat) Lighti.getz(),0.0};
-    glLightfv(index,GL_POSITION,position);
-  }
+  return glm::vec4(v.getx(),v.gety(),v.getz(),0);
 }
 
-void initlighting() 
+glm::vec4 vec4(double *v)
 {
-  glClearColor(Background[0],Background[1],Background[2],Background[3]);
-  glEnable(GL_LIGHTING);
-  glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,getSetting<bool>("twosided"));
-    
-  for(size_t i=0; i < Nlights; ++i) {
-    GLenum index=GL_LIGHT0+i;
-    glEnable(index);
-    
-    size_t i4=4*i;
-    
-    GLfloat diffuse[]={(GLfloat) Diffuse[i4],(GLfloat) Diffuse[i4+1],
-		       (GLfloat) Diffuse[i4+2],(GLfloat) Diffuse[i4+3]};
-    glLightfv(index,GL_DIFFUSE,diffuse);
-    
-    GLfloat ambient[]={(GLfloat) Ambient[i4],(GLfloat) Ambient[i4+1],
-		       (GLfloat) Ambient[i4+2],(GLfloat) Ambient[i4+3]};
-    glLightfv(index,GL_AMBIENT,ambient);
-    
-    GLfloat specular[]={(GLfloat) Specular[i4],(GLfloat) Specular[i4+1],
-			(GLfloat) Specular[i4+2],(GLfloat) Specular[i4+3]};
-    glLightfv(index,GL_SPECULAR,specular);
-  }
-  
-  static size_t lastNlights=0;
-  for(size_t i=Nlights; i < lastNlights; ++i) {
-    GLenum index=GL_LIGHT0+i;
-    glDisable(index);
-  }
-  lastNlights=Nlights;
-  
-  if(ViewportLighting)
-    lighting();
+  return glm::vec4(v[0],v[1],v[2],v[3]);
 }
 
 void setDimensions(int Width, int Height, double X, double Y)
@@ -275,16 +292,26 @@
   }
 }
 
+void frustum(GLdouble left, GLdouble right, GLdouble bottom,
+             GLdouble top, GLdouble nearVal, GLdouble farVal)
+{
+  dprojMat=glm::frustum(left,right,bottom,top,nearVal,farVal);
+  projViewMat=mat4(dprojMat*dviewMat);
+}
+
+void ortho(GLdouble left, GLdouble right, GLdouble bottom,
+           GLdouble top, GLdouble nearVal, GLdouble farVal)
+{
+  dprojMat=glm::ortho(left,right,bottom,top,nearVal,farVal);
+  projViewMat=mat4(dprojMat*dviewMat);
+}
+
 void setProjection()
 {
-  glMatrixMode(GL_PROJECTION);
-  glLoadIdentity();
   setDimensions(Width,Height,X,Y);
-  if(orthographic)
-    glOrtho(xmin,xmax,ymin,ymax,-zmax,-zmin);
-  else
-    glFrustum(xmin,xmax,ymin,ymax,-zmax,-zmin);
-  glMatrixMode(GL_MODELVIEW);
+  if(orthographic) ortho(xmin,xmax,ymin,ymax,-zmax,-zmin);
+  else frustum(xmin,xmax,ymin,ymax,-zmax,-zmin);
+  
 #ifdef HAVE_LIBGLUT
   double arcballRadius=getSetting<double>("arcballradius");
   arcball.set_params(vec2(0.5*Width,0.5*Height),arcballRadius*Zoom);
@@ -304,9 +331,6 @@
 
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
-  if(!ViewportLighting) 
-    lighting();
-    
   triple m(xmin,ymin,zmin);
   triple M(xmax,ymax,zmax);
   double perspective=orthographic ? 0.0 : 1.0/zmax;
@@ -314,13 +338,13 @@
   double size2=hypot(Width,Height);
   
   // Render opaque objects
-  Picture->render(nurb,size2,m,M,perspective,Nlights,false);
+  Picture->render(size2,m,M,perspective,false);
   
   // Enable transparency
   glDepthMask(GL_FALSE);
   
   // Render transparent objects
-  Picture->render(nurb,size2,m,M,perspective,Nlights,true);
+  Picture->render(size2,m,M,perspective,true);
   glDepthMask(GL_TRUE);
 }
 
@@ -416,11 +440,18 @@
     arcball.init();
   }
 #endif
-  glLoadIdentity();
-  glGetFloatv(GL_MODELVIEW_MATRIX,Rotate);
+  viewMat=mat4(1.0f);
+  normMat=mat4(1.0f);
+  
+  dviewMat=dmat4(1.0);
+  drotateMat=dmat4(1.0); 
+  
+  Rotate=value_ptr(drotateMat);
+  updateModelViewData();
+
   lastzoom=Zoom=Zoom0;
   setDimensions(Width,Height,0,0);
-  initlighting();
+  glClearColor(Background[0],Background[1],Background[2],Background[3]);
 }
 
 void nodisplay()
@@ -479,24 +510,17 @@
 {
   switch(Mode) {
     case 0:
-      for(size_t i=0; i < Nlights; ++i) 
-        glEnable(GL_LIGHT0+i);
       outlinemode=false;
       glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
-      gluNurbsProperty(nurb,GLU_DISPLAY_MODE,GLU_FILL);
       ++Mode;
       break;
     case 1:
-      for(size_t i=0; i < Nlights; ++i) 
-        glDisable(GL_LIGHT0+i);
       outlinemode=true;
       glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
-      gluNurbsProperty(nurb,GLU_DISPLAY_MODE,GLU_OUTLINE_PATCH);
       ++Mode;
       break;
     case 2:
       outlinemode=false;
-      gluNurbsProperty(nurb,GLU_DISPLAY_MODE,GLU_OUTLINE_POLYGON);
       Mode=0;
       break;
   }
@@ -647,7 +671,18 @@
     if(!Animate) screen();
     queueScreen=false;
   }
+
+  maxvertices=getSetting<Int>("maxvertices");
+  if(maxvertices == 0) maxvertices=Maxvertices;
+
+  bool fps=settings::verbose > 2;  
+  if(fps) seconds();
   drawscene(Width,Height);
+  if(fps) {
+    double s=seconds();
+    if(s > 0.0)
+      cout << "FPS=" << 1.0/s << endl;
+  }
   glutSwapBuffers();
 #ifdef HAVE_PTHREAD
   if(glthread && Animate) {
@@ -686,10 +721,13 @@
   lastzoom=Zoom;
   glLoadIdentity();
   double cz=0.5*(zmin+zmax);
-  glTranslatef(cx,cy,cz);
-  glMultMatrixf(Rotate);
-  glTranslatef(0,0,-cz);
+  
+  dviewMat=translate(translate(dmat4(1.0),dvec3(cx,cy,cz))*drotateMat,
+                     dvec3(0,0,-cz));
+  viewMat=mat4(dviewMat);
   setProjection();
+  updateModelViewData();
+  
   glutPostRedisplay();
 }
 
@@ -766,30 +804,10 @@
   
 }
 
-int menustatus=GLUT_MENU_NOT_IN_USE;
-
-void menuStatus(int status, int x, int y) 
-{
-  menustatus=status;
-}
-  
-void disableMenu() 
-{
-  Menu=false;
-  if(menustatus == GLUT_MENU_NOT_IN_USE)
-    glutDetachMenu(MenuButton);
-}
-
 void zoom(int x, int y)
 {
   if(ignorezoom) {ignorezoom=false; y0=y; return;}
   if(x > 0 && y > 0) {
-    if(Menu) {
-      disableMenu();
-      y0=y;
-      return;
-    }
-    Motion=true;
     double zoomFactor=getSetting<double>("zoomfactor");
     if(zoomFactor > 0.0) {
       double zoomStep=getSetting<double>("zoomstep");
@@ -825,21 +843,15 @@
 void rotate(int x, int y)
 {
   if(x > 0 && y > 0) {
-    if(Menu) {
-      disableMenu();
-      arcball.mouse_down(x,Height-y);
-      return;
-    }
-    Motion=true;
     arcball.mouse_motion(x,Height-y,0,
                          Action == "rotateX", // X rotation only
                          Action == "rotateY");  // Y rotation only
 
     for(int i=0; i < 4; ++i) {
-      const vec4& roti=arcball.rot[i];
+      const ::vec4& roti=arcball.rot[i];
       int i4=4*i;
       for(int j=0; j < 4; ++j)
-        Rotate[i4+j]=roti[j];
+        value_ptr(drotateMat)[i4+j]=roti[j];
     }
     
     update();
@@ -853,9 +865,10 @@
 
 void updateArcball() 
 {
+  Rotate=value_ptr(drotateMat);
   for(int i=0; i < 4; ++i) {
     int i4=4*i;
-    vec4& roti=arcball.rot[i];
+    ::vec4& roti=arcball.rot[i];
     for(int j=0; j < 4; ++j)
       roti[j]=Rotate[i4+j];
   }
@@ -864,28 +877,25 @@
 
 void rotateX(double step) 
 {
-  glLoadIdentity();
-  glRotatef(step,1,0,0);
-  glMultMatrixf(Rotate);
-  glGetFloatv(GL_MODELVIEW_MATRIX,Rotate);
+  dmat4 tmpRot(1.0);
+  tmpRot=glm::rotate(tmpRot,glm::radians(step),dvec3(1,0,0));
+  drotateMat=tmpRot*drotateMat;
   updateArcball();
 }
 
 void rotateY(double step) 
 {
-  glLoadIdentity();
-  glRotatef(step,0,1,0);
-  glMultMatrixf(Rotate);
-  glGetFloatv(GL_MODELVIEW_MATRIX,Rotate);
+  dmat4 tmpRot(1.0);
+  tmpRot=glm::rotate(tmpRot,glm::radians(step),dvec3(0,1,0));
+  drotateMat=tmpRot*drotateMat;
   updateArcball();
 }
 
 void rotateZ(double step) 
 {
-  glLoadIdentity();
-  glRotatef(step,0,0,1);
-  glMultMatrixf(Rotate);
-  glGetFloatv(GL_MODELVIEW_MATRIX,Rotate);
+  dmat4 tmpRot(1.0);
+  tmpRot=glm::rotate(tmpRot,glm::radians(step),dvec3(0,0,1));
+  drotateMat=tmpRot*drotateMat;
   updateArcball();
 }
 
@@ -892,11 +902,6 @@
 void rotateZ(int x, int y)
 {
   if(x > 0 && y > 0) {
-    if(Menu) {
-      disableMenu();
-      return;
-    }
-    Motion=true;
     double angle=Degrees(x,y);
     rotateZ(angle-lastangle);
     lastangle=angle;
@@ -971,7 +976,6 @@
 
 void timeout(int)
 {
-  if(Menu) disableMenu();
 }
 
 void mouse(int button, int state, int x, int y)
@@ -979,19 +983,6 @@
   int mod=glutGetModifiers();
   string Action=action(button,mod);
 
-  if(!Menu) {
-    if(mod == 0 && state == GLUT_UP && !Motion && Action == "zoom/menu") {
-      MenuButton=button;
-      glutMotionFunc(NULL);
-      glutTimerFunc(getSetting<Int>("doubleclick"),timeout,0);
-      glutAttachMenu(button);
-      Menu=true;
-      return;
-    } else Motion=false;
-  }
-  
-  disableMenu();
-  
   if(Action == "zoomin") {
     glutMotionFunc(NULL);
     mousewheel(0,1,x,y);
@@ -1188,64 +1179,6 @@
   }
 }
  
-enum Menu {HOME,FITSCREEN,XSPIN,YSPIN,ZSPIN,STOP,MODE,EXPORT,CAMERA,
-           PLAY,STEP,REVERSE,QUIT};
-
-void menu(int choice)
-{
-  if(Menu) disableMenu();
-  ignorezoom=true;
-  Motion=true;
-  switch (choice) {
-    case HOME: // Home
-      home();
-      update();
-      break;
-    case FITSCREEN:
-      togglefitscreen();
-      break;
-    case XSPIN:
-      spinx();
-      break;
-    case YSPIN:
-      spiny();
-      break;
-    case ZSPIN:
-      spinz();
-      break;
-    case STOP:
-      idle();
-      break;
-    case MODE:
-      mode();
-      break;
-    case EXPORT:
-      queueExport=true;
-      break;
-    case CAMERA:
-      showCamera();
-      break;
-    case PLAY:
-      if(getSetting<bool>("reverse")) Animate=false;
-      Setting("reverse")=Step=false;
-      animate();
-      break;
-    case REVERSE:
-      if(!getSetting<bool>("reverse")) Animate=false;
-      Setting("reverse")=true;
-      Step=false;
-      animate();
-      break;
-    case STEP:
-      Step=true;
-      animate();
-      break;
-    case QUIT:
-      quit();
-      break;
-  }
-}
-
 void setosize()
 {
   oldWidth=(int) ceil(oWidth);
@@ -1328,10 +1261,17 @@
   push_split(cmd,getSetting<string>("glOptions"));
   char **argv=args(cmd,true);
   int argc=cmd.size();
+
+//  glutInitContextVersion(4,3);
+  glutInitContextProfile(GLUT_CORE_PROFILE);
+  //glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);
+
   glutInit(&argc,argv);
-  
+  // NOTE: Change version if needed. 
+
   screenWidth=glutGet(GLUT_SCREEN_WIDTH);
   screenHeight=glutGet(GLUT_SCREEN_HEIGHT);
+  
 #endif
 }
 
@@ -1375,21 +1315,74 @@
 #endif // HAVE_LIBOSMESA
 }
 
+GLuint vertShader,fragShader;
+GLuint vertShaderCol,fragShaderCol;
+
+void initshader()
+{
+  Nlights=max(Nlights,nlights);
+  Nmaterials=max(Nmaterials,nmaterials);
+  shaderProg=glCreateProgram();
+  string vs=locateFile("shaders/vertex.glsl");
+  string fs=locateFile("shaders/fragment.glsl");
+  if(vs.empty() || fs.empty()) {
+    cerr << "GLSL shaders not found." << endl;
+    exit(-1);
+  }
+
+  vertShader=createShaderFile(vs.c_str(),GL_VERTEX_SHADER,Nlights,
+                              Nmaterials);
+  fragShader=createShaderFile(fs.c_str(),GL_FRAGMENT_SHADER,Nlights,
+                              Nmaterials);
+  glAttachShader(shaderProg,vertShader);
+  glAttachShader(shaderProg,fragShader);
+    
+  shaderProgColor=glCreateProgram();
+  vertShaderCol=createShaderFile(vs.c_str(),
+                                 GL_VERTEX_SHADER,Nlights,Nmaterials,
+                                 {"EXPLICIT_COLOR"});
+  fragShaderCol=createShaderFile(fs.c_str(),
+                                 GL_FRAGMENT_SHADER,Nlights,Nmaterials,
+                                 {"EXPLICIT_COLOR"});
+  glAttachShader(shaderProgColor,vertShaderCol);
+  glAttachShader(shaderProgColor,fragShaderCol);
+
+  camp::noColorShader=shaderProg;
+  camp::colorShader=shaderProgColor;
+    
+  glLinkProgram(shaderProg);
+  glDetachShader(shaderProg,vertShader);
+  glDetachShader(shaderProg,fragShader);
+  glDeleteShader(vertShader);
+  glDeleteShader(fragShader);
+    
+  glLinkProgram(shaderProgColor);
+  glDetachShader(shaderProgColor,vertShaderCol);
+  glDetachShader(shaderProgColor,fragShaderCol);
+  glDeleteShader(vertShaderCol);
+  glDeleteShader(fragShaderCol);
+}
+
+void deleteshader() 
+{
+  glDeleteProgram(camp::noColorShader);
+  glDeleteProgram(camp::colorShader);
+}
+  
 // angle=0 means orthographic.
 void glrender(const string& prefix, const picture *pic, const string& format,
               double width, double height, double angle, double zoom,
               const triple& m, const triple& M, const pair& shift, double *t,
-              double *background, size_t nlights, triple *lights,
+              double *background, size_t nlights0, triple *lights,
               double *diffuse, double *ambient, double *specular,
-              bool Viewportlighting, bool view, int oldpid)
+              bool view, int oldpid)
 {
   bool offscreen=getSetting<bool>("offscreen");
   Iconify=getSetting<bool>("iconify");
-  
+
 #ifdef HAVE_PTHREAD
   static bool initializedView=false;
 #endif  
-
   width=max(width,1.0);
   height=max(height,1.0);
   
@@ -1403,12 +1396,12 @@
   for(int i=0; i < 4; ++i)
     Background[i]=background[i];
   
-  Nlights=min(nlights,(size_t) GL_MAX_LIGHTS);
+  nlights=min(nlights0,(size_t) GL_MAX_LIGHTS);
+  
   Lights=lights;
   Diffuse=diffuse;
   Ambient=ambient;
   Specular=specular;
-  ViewportLighting=Viewportlighting;
   View=view;
   Angle=angle*radians;
   Zoom0=zoom;
@@ -1425,8 +1418,6 @@
   orthographic=Angle == 0.0;
   H=orthographic ? 0.0 : -tan(0.5*Angle)*zmax;
     
-  Menu=false;
-  Motion=true;
   ignorezoom=false;
   Mode=0;
   Xfactor=Yfactor=1.0;
@@ -1499,7 +1490,7 @@
     setosize();
 #endif
     
-    if(View && settings::verbose > 1) 
+    if(View && settings::verbose > 1)
       cout << "Rendering " << stripDir(prefix) << " as "
            << Width << "x" << Height << " image" << endl;
   }
@@ -1508,12 +1499,11 @@
   
 #ifdef HAVE_LIBGLUT    
   unsigned int displaymode=GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH;
-  
-  int buttons[]={GLUT_LEFT_BUTTON,GLUT_MIDDLE_BUTTON,GLUT_RIGHT_BUTTON};
   string buttonnames[]={"left","middle","right"};
-  size_t nbuttons=sizeof(buttons)/sizeof(int);
 #endif  
   
+  camp::clearMaterialBuffer();
+  
 #ifdef HAVE_PTHREAD
   if(glthread && initializedView && !offscreen) {
     if(!View)
@@ -1541,6 +1531,7 @@
 
       ostringstream buf;
       int samples;
+
 #ifdef FREEGLUT
 #ifdef GLUT_INIT_MAJOR_VERSION
       while(true) {
@@ -1549,27 +1540,8 @@
 #endif      
 #endif      
         string title=string(settings::PROGRAM)+": "+prefix;
-        string suffix;
-        for(size_t i=0; i < nbuttons; ++i) {
-          int button=buttons[i];
-          if(action(button,0) == "zoom/menu") {
-            suffix="Double click "+buttonnames[i]+" button for menu";
-            break;
-          }
-        }
-        if(suffix.empty()) {
-          for(size_t i=0; i < nbuttons; ++i) {
-            int button=buttons[i];
-            if(action(button,0) == "menu") {
-              suffix="Click "+buttonnames[i]+" button for menu";
-              break;
-            }
-          }
-        }
-      
-        title += " ["+suffix+"]";
-    
         window=glutCreateWindow(title.c_str());
+
         GLint samplebuf[1];
         glGetIntegerv(GL_SAMPLES,samplebuf);
         samples=samplebuf[0];
@@ -1603,9 +1575,23 @@
   }
 #endif // HAVE_LIBGLUT
   initialized=true;
+
+  glewExperimental = GL_TRUE;
+
+  int result = glewInit();
+
+  if (result != GLEW_OK) {
+    cerr << "GLEW initialization error." << endl;
+    exit(-1);
+  }
   
-  glMatrixMode(GL_MODELVIEW);
-    
+  GLint val;
+  glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE,&val);
+  Maxmaterials=val/sizeof(Material);
+  if(nmaterials > Maxmaterials) nmaterials=Maxmaterials;
+
+  glGetIntegerv(GL_MAX_ELEMENTS_VERTICES,&Maxvertices);
+
   home();
     
 #ifdef HAVE_LIBGLUT
@@ -1620,35 +1606,13 @@
     }
   }
 #endif
+
+  initshader();
   
   glEnable(GL_BLEND);
   glEnable(GL_DEPTH_TEST);
-  glEnable(GL_MAP1_VERTEX_3);
-  glEnable(GL_MAP1_VERTEX_4);
-  glEnable(GL_MAP2_VERTEX_3);
-  glEnable(GL_MAP2_VERTEX_4);
-  glEnable(GL_MAP2_COLOR_4);
-  
+
   glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-  
-  if(nurb == NULL) {
-    nurb=gluNewNurbsRenderer();
-    if(nurb == NULL) 
-      outOfMemory();
-    gluNurbsProperty(nurb,GLU_SAMPLING_METHOD,GLU_PARAMETRIC_ERROR);
-    gluNurbsProperty(nurb,GLU_SAMPLING_TOLERANCE,0.5);
-    gluNurbsProperty(nurb,GLU_PARAMETRIC_TOLERANCE,1.0);
-    gluNurbsProperty(nurb,GLU_CULLING,GLU_TRUE);
-  
-    // The callback tessellation algorithm avoids artifacts at degenerate
-    // control points.
-    gluNurbsProperty(nurb,GLU_NURBS_MODE,GLU_NURBS_TESSELLATOR);
-    gluNurbsCallback(nurb,GLU_NURBS_BEGIN,(_GLUfuncptr) glBegin);
-    gluNurbsCallback(nurb,GLU_NURBS_VERTEX,(_GLUfuncptr) glVertex3fv);
-    gluNurbsCallback(nurb,GLU_NURBS_END,(_GLUfuncptr) glEnd);
-    gluNurbsCallback(nurb,GLU_NURBS_COLOR,(_GLUfuncptr) glColor4fv);
-  }
-  
   mode();
   
   if(View && !offscreen) {
@@ -1660,28 +1624,6 @@
     glutKeyboardFunc(keyboard);
     glutMouseFunc(mouse);
   
-    glutCreateMenu(menu);
-    glutAddMenuEntry("(h) Home",HOME);
-    glutAddMenuEntry("(f) Fitscreen",FITSCREEN);
-    glutAddMenuEntry("(x) X spin",XSPIN);
-    glutAddMenuEntry("(y) Y spin",YSPIN);
-    glutAddMenuEntry("(z) Z spin",ZSPIN);
-    glutAddMenuEntry("(s) Stop",STOP);
-    glutAddMenuEntry("(m) Mode",MODE);
-    glutAddMenuEntry("(e) Export",EXPORT);
-    glutAddMenuEntry("(c) Camera",CAMERA);
-    glutAddMenuEntry("(p) Play",PLAY);
-    glutAddMenuEntry("(r) Reverse",REVERSE);
-    glutAddMenuEntry("( ) Step",STEP);
-    glutAddMenuEntry("(q) Quit" ,QUIT);
-    glutMenuStatusFunc(menuStatus);
-  
-    for(size_t i=0; i < nbuttons; ++i) {
-      int button=buttons[i];
-      if(action(button,0) == "menu")
-        glutAttachMenu(button);
-    }
-    
     glutMainLoop();
 #endif // HAVE_LIBGLUT
   } else {
@@ -1706,4 +1648,70 @@
 
 } // namespace gl
 
+namespace camp {
+
+std::string getMaterialIndex(size_t const& index,
+                             std::string const& fieldName)
+{
+  return "materials["+std::to_string(index)+"]."+fieldName;
+} 
+
+std::string getLightIndex(size_t const& index, std::string const& fieldName) {
+  return "lights["+std::to_string(index)+"]."+fieldName;
+} 
+
+void setUniforms(GLint shader)
+{
+  if(gl::nlights > gl::Nlights || nmaterials > Nmaterials) {
+    gl::deleteshader();
+    gl::initshader();
+  }
+  
+  glUseProgram(shader);
+  
+  glUniformMatrix4fv(glGetUniformLocation(shader,"projViewMat"),1,GL_FALSE, value_ptr(gl::projViewMat));
+  glUniformMatrix4fv(glGetUniformLocation(shader,"viewMat"),1,GL_FALSE, value_ptr(gl::viewMat));
+  glUniformMatrix4fv(glGetUniformLocation(shader,"normMat"),1,GL_FALSE, value_ptr(gl::normMat));
+
+  GLuint binding=0;
+  GLint blockindex=glGetUniformBlockIndex(shader,"MaterialBuffer");
+  glUniformBlockBinding(shader,blockindex,binding);
+    
+  GLuint ubo;
+  glGenBuffers(1,&ubo);
+  glBindBuffer(GL_UNIFORM_BUFFER,ubo);
+    
+  glBufferData(GL_UNIFORM_BUFFER,drawElement::material.size()*sizeof(Material),
+               drawElement::material.data(),GL_STATIC_DRAW);
+  glBindBufferBase(GL_UNIFORM_BUFFER,binding,ubo);
+  
+  glUniform1i(glGetUniformLocation(shader,"nlights"),gl::nlights);
+  
+  for(size_t i=0; i < gl::nlights; ++i) {
+    triple Lighti=gl::Lights[i];
+    size_t i4=4*i;
+    glUniform4f(glGetUniformLocation(shader,
+                                     getLightIndex(i,"direction").c_str()),
+                (GLfloat) Lighti.getx(),(GLfloat) Lighti.gety(),
+                (GLfloat) Lighti.getz(),0.0);
+
+    glUniform4f(glGetUniformLocation(shader,
+                                     getLightIndex(i,"diffuse").c_str()),
+                (GLfloat) gl::Diffuse[i4],(GLfloat) gl::Diffuse[i4+1],
+                (GLfloat) gl::Diffuse[i4+2],(GLfloat) gl::Diffuse[i4+3]);
+      
+    glUniform4f(glGetUniformLocation(shader,
+                                     getLightIndex(i,"ambient").c_str()),
+                (GLfloat) gl::Ambient[i4],(GLfloat) gl::Ambient[i4+1],
+                (GLfloat) gl::Ambient[i4+2],(GLfloat) gl::Ambient[i4+3]);
+      
+    glUniform4f(glGetUniformLocation(shader,
+                                     getLightIndex(i,"specular").c_str()),
+                (GLfloat) gl::Specular[i4],(GLfloat) gl::Specular[i4+1],
+                (GLfloat) gl::Specular[i4+2],(GLfloat) gl::Specular[i4+3]);
+  }
+}
+
+}
+
 #endif

Modified: trunk/Build/source/utils/asymptote/glrender.h
===================================================================
--- trunk/Build/source/utils/asymptote/glrender.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/glrender.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -13,26 +13,36 @@
 
 #include <csignal>
 
+#define GLEW_NO_GLU
+//#define GLEW_OSMESA
+
+#ifdef __MSDOS__
+#define GLEW_STATIC
+#include <windows.h>
+#define CALLBACK __stdcall
+typedef void (APIENTRY* _GLUfuncptr)();
+#endif
+
 #ifdef __APPLE__
+#include <OpenGL/glew.h>
 #include <OpenGL/gl.h>
-#include <OpenGL/glext.h>
-#include <OpenGL/glu.h>
 #ifdef HAVE_LIBGLUT
 #include <GLUT/glut.h>
 #endif
 #ifdef HAVE_LIBOSMESA
-#include <GL/osmesa.h> // TODO: where would you find osmesa on a mac?
+#include <OpenGL/osmesa.h>
 #endif
-#ifdef GLU_TESS_CALLBACK_TRIPLEDOT
-typedef GLvoid (* _GLUfuncptr)(...);
 #else
-typedef GLvoid (* _GLUfuncptr)();
+#include <GL/glew.h>
+#ifdef __MSDOS__
+#include <GL/wglew.h>
+#include <GL/wglext.h>
 #endif
-#else
-#include <GL/gl.h>
-#include <GL/glext.h>
-#include <GL/glu.h>
 #ifdef HAVE_LIBGLUT
+#ifdef __MSDOS__
+#define FREEGLUT_STATIC
+#define APIENTRY
+#endif
 #include <GL/glut.h>
 #endif
 #ifdef HAVE_LIBOSMESA
@@ -70,6 +80,7 @@
 namespace gl {
 
 extern bool outlinemode;
+extern Int maxvertices;
 
 struct projection 
 {
@@ -97,8 +108,18 @@
               double zoom, const camp::triple& m, const camp::triple& M,
               const camp::pair& shift, double *t, double *background,
               size_t nlights, camp::triple *lights, double *diffuse,
-              double *ambient, double *specular, bool viewportlighting,
-              bool view, int oldpid=0);
+              double *ambient, double *specular, bool view, int oldpid=0);
+
+struct ModelView {
+  double T[16];
+  double Tinv[16];
+};
+
+extern ModelView modelView;
+
+void initshader();
+void deleteshader();
+
 }
 
 namespace camp {
@@ -143,10 +164,7 @@
 }
 
 #else
-typedef void GLUnurbs;
 typedef float GLfloat;
 #endif
 
 #endif
-
-

Modified: trunk/Build/source/utils/asymptote/lex.yy.cc
===================================================================
--- trunk/Build/source/utils/asymptote/lex.yy.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/lex.yy.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -3000,10 +3000,10 @@
 	YY_BUFFER_STATE b;
 	char *buf;
 	yy_size_t n;
-	yy_size_t i;
+	int i;
     
 	/* Get memory for full buffer, including space for trailing EOB's. */
-	n = (yy_size_t) _yybytes_len + 2;
+	n = (yy_size_t) (_yybytes_len + 2);
 	buf = (char *) yyalloc(n  );
 	if ( ! buf )
 		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );

Added: trunk/Build/source/utils/asymptote/libatomic_ops-7.6.8.tar.gz
===================================================================
(Binary files differ)

Index: trunk/Build/source/utils/asymptote/libatomic_ops-7.6.8.tar.gz
===================================================================
--- trunk/Build/source/utils/asymptote/libatomic_ops-7.6.8.tar.gz	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/libatomic_ops-7.6.8.tar.gz	2019-03-27 22:27:57 UTC (rev 50622)

Property changes on: trunk/Build/source/utils/asymptote/libatomic_ops-7.6.8.tar.gz
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: trunk/Build/source/utils/asymptote/main.cc
===================================================================
--- trunk/Build/source/utils/asymptote/main.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/main.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -240,3 +240,10 @@
 #endif
   asymain(&args);
 }
+
+#ifdef USEGC
+GC_API void GC_CALL GC_throw_bad_alloc() {
+  std::bad_alloc();
+}
+#endif
+

Added: trunk/Build/source/utils/asymptote/material.h
===================================================================
--- trunk/Build/source/utils/asymptote/material.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/material.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -0,0 +1,69 @@
+#ifndef MATERIAL_STRUCT
+#define MATERIAL_STRUCT
+#ifdef HAVE_GL
+
+#include <glm/glm.hpp>
+
+namespace camp {
+
+inline bool operator < (const glm::vec4& m1, const glm::vec4& m2) {
+  return m1[0] < m2[0] || 
+                 (m1[0] == m2[0] &&
+                  (m1[1] < m2[1] || 
+                   (m1[1] == m2[1] &&
+                    (m1[2] < m2[2] || 
+                     (m1[2] == m2[2] &&
+                      (m1[3] < m2[3]))))));
+}
+
+struct Material {
+public:
+  glm::vec4 diffuse, ambient, emissive, specular;
+  GLfloat shininess; 
+  GLfloat padding[3];
+
+  Material() {}
+
+  Material(const glm::vec4& diffuse, const glm::vec4& ambient,
+           const glm::vec4& emissive, const glm::vec4& specular,
+           double shininess) : 
+    diffuse(diffuse), ambient(ambient), emissive(emissive), specular(specular),
+    shininess(128*shininess) {}
+
+  Material(Material const& m):
+    diffuse(m.diffuse), ambient(m.ambient), emissive(m.emissive),
+    specular(m.specular), shininess(m.shininess) {}
+  ~Material() {}
+
+  Material& operator=(Material const& m)
+  {
+    diffuse=m.diffuse;
+    ambient=m.ambient;
+    emissive=m.emissive;
+    specular=m.specular;
+    shininess=m.shininess;
+    return *this; 
+  }
+      
+  friend bool operator < (const Material& m1, const Material& m2) {
+    return m1.diffuse < m2.diffuse ||
+                        (m1.diffuse == m2.diffuse && 
+                         (m1.ambient < m2.ambient ||
+                        (m1.ambient == m2.ambient && 
+                         (m1.emissive < m2.emissive ||
+                        (m1.emissive == m2.emissive && 
+                         (m1.specular < m2.specular ||
+                        (m1.specular == m2.specular && 
+                         (m1.shininess < m2.shininess))))))));
+  }
+      
+}; 
+
+extern size_t Nmaterials; // Number of materials compiled in shader
+extern size_t nmaterials; // Current size of materials buffer
+extern size_t Maxmaterials; // Maxinum size of materials buffer
+void clearMaterialBuffer(bool draw=false);
+
+}
+#endif
+#endif


Property changes on: trunk/Build/source/utils/asymptote/material.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/utils/asymptote/memory.h
===================================================================
--- trunk/Build/source/utils/asymptote/memory.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/memory.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -181,12 +181,8 @@
                                  gc_allocator<char> > ostringstream;
 typedef std::basic_stringbuf<char,std::char_traits<char>,
                              gc_allocator<char> > stringbuf;
-#if GC_TMP_VERSION_MAJOR >= 7 && GC_TMP_VERSION_MINOR > 1
 inline void compact(int x) {GC_set_dont_expand(x);}
 #else
-inline void compact(int x) {GC_dont_expand=x;}
-#endif    
-#else
 inline void compact(int x) {}
 typedef std::string string;
 typedef std::stringstream stringstream;

Modified: trunk/Build/source/utils/asymptote/patches/README
===================================================================
--- trunk/Build/source/utils/asymptote/patches/README	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/patches/README	2019-03-27 22:27:57 UTC (rev 50622)
@@ -14,13 +14,9 @@
 The file gc-7.0nomem.patch avoids segmentation faults with gc-7.0 on
 out-of-memory errors.
 
-The file cygwin_glu.patch adds missing GLU 1.3 declarations to w32api/GL/glu.h.
+The file cygwin_freeglut-3.0.0.patch fixes undefined symbols when compiling the
+freeglut library statically under cygwin.
 
-The file cygwin_gc.patch fixes redefined symbols in the Boehm garbage collector.
-
-The file cygwin_freeglut-2.8.1.patch fixes undefined symbols when compiling the
-freeglut library under cygwin.
-
 The file fixmem.reg patches the Microsoft Windows registry so that the
 cygwin1.dll library can allocate more than 384MB. It is applied
 automatically by the Asymptote setup.exe file but may also be applied manually:

Added: trunk/Build/source/utils/asymptote/patches/cygwin_freeglut-3.0.0.patch
===================================================================
--- trunk/Build/source/utils/asymptote/patches/cygwin_freeglut-3.0.0.patch	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/patches/cygwin_freeglut-3.0.0.patch	2019-03-27 22:27:57 UTC (rev 50622)
@@ -0,0 +1,48 @@
+diff -ru freeglut-3.0.0/CMakeLists.txt freeglut-3.0.0J/CMakeLists.txt
+--- freeglut-3.0.0/CMakeLists.txt	2015-02-17 23:59:57.000000000 -0500
++++ freeglut-3.0.0J/CMakeLists.txt	2019-01-20 22:15:55.410415400 -0500
+@@ -20,7 +20,7 @@
+ set(VERSION_MAJOR 3)
+ set(VERSION_MINOR 0)
+ set(VERSION_PATCH 0)
+-
++set(WIN32 1)
+ # Update fg_version.h to match the versions number here in cmake
+ CONFIGURE_FILE(src/fg_version.h.in src/fg_version.h)
+ 
+@@ -32,7 +32,7 @@
+ # FREEGLUT_BUILD_SHARED_LIBS is already a standard CMake variable, but we need to
+ # re-declare it here so it will show up in the GUI.
+ # by default, we want to build both
+-OPTION(FREEGLUT_BUILD_SHARED_LIBS "Build FreeGLUT shared library." ON)
++OPTION(FREEGLUT_BUILD_SHARED_LIBS "Build FreeGLUT shared library." OFF)
+ OPTION(FREEGLUT_BUILD_STATIC_LIBS "Build FreeGLUT static library." ON)
+ 
+ # option for whether warnings and errors should be printed
+@@ -439,7 +439,7 @@
+ 
+ 
+ # Optionally build demos, on by default.
+-option( FREEGLUT_BUILD_DEMOS "Build FreeGLUT demos." ON )
++option( FREEGLUT_BUILD_DEMOS "Build FreeGLUT demos." OFF )
+ 
+ SET(DEMO_LIBS ${OPENGL_glu_LIBRARY} ${LIBS})
+ # lib m for math, not needed on windows
+Only in freeglut-3.0.0J: CMakeLists.txt~
+diff -ru freeglut-3.0.0/src/fg_internal.h freeglut-3.0.0J/src/fg_internal.h
+--- freeglut-3.0.0/src/fg_internal.h	2014-12-22 11:27:02.000000000 -0500
++++ freeglut-3.0.0J/src/fg_internal.h	2019-01-20 22:13:40.317578700 -0500
+@@ -24,6 +24,13 @@
+  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+  */
++#define FREEGLUT_EXPORTS 1
++
++#define TARGET_HOST_MS_WINDOWS 1
++
++#define GCL_HCURSOR (-12)
++#define _snprintf snprintf
++
+ 
+ #ifndef  FREEGLUT_INTERNAL_H
+ #define  FREEGLUT_INTERNAL_H


Property changes on: trunk/Build/source/utils/asymptote/patches/cygwin_freeglut-3.0.0.patch
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/utils/asymptote/path.cc
===================================================================
--- trunk/Build/source/utils/asymptote/path.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/path.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -18,11 +18,11 @@
 
 namespace camp {
 
-const double Fuzz=1000.0*DBL_EPSILON;
-const double BigFuzz=10.0*Fuzz;
-const double Fuzz2=Fuzz*Fuzz;
-const double sqrtFuzz=sqrt(Fuzz);
-const double fuzzFactor=10.0;
+const double Fuzz2=1000.0*DBL_EPSILON;
+const double Fuzz=sqrt(Fuzz2);
+const double Fuzz4=Fuzz2*Fuzz2;
+const double BigFuzz=10.0*Fuzz2;
+const double fuzzFactor=100.0;
 
 const double third=1.0/3.0;
 
@@ -49,8 +49,8 @@
 quadraticroots::quadraticroots(double a, double b, double c)
 {
   // Remove roots at numerical infinity.
-  if(fabs(a) <= Fuzz*(fabs(b)+fabs(c)*Fuzz)) {
-    if(fabs(b) > Fuzz*fabs(c)) {
+  if(fabs(a) <= Fuzz2*fabs(b)+Fuzz4*fabs(c)) {
+    if(fabs(b) > Fuzz2*fabs(c)) {
       distinct=quadraticroots::ONE;
       roots=1;
       t1=-c/b;
@@ -65,7 +65,7 @@
   } else {
     double factor=0.5*b/a;
     double denom=b*factor;
-    if(fabs(denom) <= Fuzz*fabs(c)) {
+    if(fabs(denom) <= Fuzz2*fabs(c)) {
       double x=-c/a;
       if(x >= 0.0) {
         distinct=quadraticroots::TWO;
@@ -160,7 +160,7 @@
   static const double fiftyfourth=1.0/54.0;
   
   // Remove roots at numerical infinity.
-  if(fabs(a) <= Fuzz*(fabs(b)+fabs(c)*Fuzz+fabs(d)*Fuzz2)) {
+  if(fabs(a) <= Fuzz2*(fabs(b)+fabs(c)*Fuzz2+fabs(d)*Fuzz4)) {
     quadraticroots q(b,c,d);
     roots=q.roots;
     if(q.roots >= 1) t1=q.t1;
@@ -169,7 +169,7 @@
   }
   
   // Detect roots at numerical zero.
-  if(fabs(d) <= Fuzz*(fabs(c)+fabs(b)*Fuzz+fabs(a)*Fuzz2)) {
+  if(fabs(d) <= Fuzz2*(fabs(c)+fabs(b)*Fuzz2+fabs(a)*Fuzz4)) {
     quadraticroots q(a,b,c);
     roots=q.roots+1;
     t1=0;
@@ -184,11 +184,11 @@
   
   double b2=b*b;
   double Q=3.0*c-b2;
-  if(fabs(Q) < Fuzz*(3.0*fabs(c)+fabs(b2)))
+  if(fabs(Q) < Fuzz2*(3.0*fabs(c)+fabs(b2)))
     Q=0.0;
   
   double R=(3.0*Q+b2)*b-27.0*d;
-  if(fabs(R) < Fuzz*((3.0*fabs(Q)+fabs(b2))*fabs(b)+27.0*fabs(d)))
+  if(fabs(R) < Fuzz2*((3.0*fabs(Q)+fabs(b2))*fabs(b)+27.0*fabs(d)))
     R=0.0;
   
   Q *= ninth;
@@ -797,10 +797,10 @@
     size_t m=r.size();
     for(size_t j=0 ; j < m; ++j) {
       double t=r[j];
-      if(t >= -Fuzz && t <= 1.0+Fuzz) {
+      if(t >= -Fuzz2 && t <= 1.0+Fuzz2) {
         double s=i+t;
         if((g.point(s)-z).abs2() <= fuzz2) {
-          if(cycles && s >= n-Fuzz) s=0;
+          if(cycles && s >= n-Fuzz2) s=0;
           T.push_back(s);
         }
       }
@@ -846,7 +846,7 @@
     double d=dy*z0.getx()-dx*z0.gety()+det;
     std::vector<double> r;
     if(max(max(max(a*a,b*b),c*c),d*d) >
-       Fuzz2*max(max(max(z0.abs2(),z1.abs2()),c0.abs2()),c1.abs2()))
+       Fuzz4*max(max(max(z0.abs2(),z1.abs2()),c0.abs2()),c1.abs2()))
       roots(r,a,b,c,d);
     else r.push_back(0.0);
     if(endpoints) {
@@ -859,9 +859,9 @@
     size_t m=r.size();
     for(size_t j=0 ; j < m; ++j) {
       double t=r[j];
-      if(t >= -Fuzz && t <= 1.0+Fuzz) {
+      if(t >= -Fuzz2 && t <= 1.0+Fuzz2) {
         double s=i+t;
-        if(cycles && s >= n-Fuzz) s=0;
+        if(cycles && s >= n-Fuzz2) s=0;
         T.push_back(s);
       }
     }
@@ -891,7 +891,7 @@
     for(size_t i=0; i < n; ++i) {
       double s=S1[i];
       double t=dot(g.point(s)-p,factor);
-      if(t >= -Fuzz && t <= 1.0+Fuzz) {
+      if(t >= -Fuzz2 && t <= 1.0+Fuzz2) {
         S.push_back(s);
         T.push_back(t);
       }
@@ -953,8 +953,7 @@
 void intersections(std::vector<double>& S, path& g,
                    const pair& p, const pair& q, double fuzz)
 {       
-  double fuzz2=max(fuzzFactor*fuzz,Fuzz);
-  fuzz2=fuzz2*fuzz2;
+  double fuzz2=max(fuzzFactor*fuzz*fuzz,Fuzz2);
   std::vector<double> S1;
   lineintersections(S1,g,p,q,fuzz);
   size_t n=S1.size();
@@ -968,8 +967,7 @@
 {
   if(errorstream::interrupt) throw interrupted();
   
-  double fuzz2=max(fuzzFactor*fuzz,Fuzz);
-  fuzz2=fuzz2*fuzz2;
+  double fuzz2=max(fuzzFactor*fuzz*fuzz,Fuzz2);
   
   Int lp=p.length();
   if(((lp == 1 && p.straight(0)) || lp == 0) && exact) {
@@ -999,6 +997,9 @@
     // Overlapping bounding boxes
 
     --depth;
+    fuzz *= 2.0;
+    double fuzz2=max(fuzzFactor*fuzz*fuzz,Fuzz2);
+
     if((maxp-minp).length()+(maxq-minq).length() <= fuzz || depth == 0) {
       if(single) {
         s=0.5;
@@ -1240,6 +1241,7 @@
 {
   if(depth == 0) return true;
   --depth;
+
   if(insidebbox(z0,c0,c1,z1,z)) {
     const pair m0=0.5*(z0+c0);
     const pair m1=0.5*(c0+c1);

Modified: trunk/Build/source/utils/asymptote/path3.cc
===================================================================
--- trunk/Build/source/utils/asymptote/path3.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/path3.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -336,7 +336,9 @@
   b=m(b,m(f(z0),f(z1)));
   if(m(-1.0,1.0)*(b-ratiobound(z0,c0,c1,z1,m,f)) >= -fuzz || depth == 0)
     return b;
+  
   --depth;
+  fuzz *= 2;
 
   triple m0=0.5*(z0+c0);
   triple m1=0.5*(c0+c1);
@@ -352,7 +354,7 @@
 
 pair path3::ratio(double (*m)(double, double)) const
 {
-  double fuzz=sqrtFuzz*(max()-min()).length();
+  double fuzz=Fuzz*(max()-min()).length();
   checkEmpty3(n);
   
   triple v=point((Int) 0);
@@ -505,10 +507,10 @@
     size_t m=r.size();
     for(size_t j=0 ; j < m; ++j) {
       double t=r[j];
-      if(t >= -Fuzz && t <= 1.0+Fuzz) {
+      if(t >= -Fuzz2 && t <= 1.0+Fuzz2) {
         double s=i+t;
         if((g.point(s)-v).abs2() <= fuzz2) {
-          if(cycles && s >= n-Fuzz) s=0;
+          if(cycles && s >= n-Fuzz2) s=0;
           T.push_back(s);
         }
       }
@@ -578,8 +580,7 @@
 {
   if(errorstream::interrupt) throw interrupted();
   
-  double fuzz2=max(fuzzFactor*fuzz,Fuzz);
-  fuzz2=fuzz2*fuzz2;
+  double fuzz2=max(fuzzFactor*fuzz*fuzz,Fuzz2);
   
   Int lp=p.length();
   if(lp == 0 && exact) {
@@ -611,6 +612,8 @@
     // Overlapping bounding boxes
 
     --depth;
+    fuzz *= 2;
+
     if((maxp-minp).length()+(maxq-minq).length() <= fuzz || depth == 0) {
       if(single) {
         s=0.5;
@@ -815,7 +818,9 @@
   b=m(b,cornerbound(P,m));
   if(m(-1.0,1.0)*(b-controlbound(P,m)) >= -fuzz || depth == 0)
     return b;
+  
   --depth;
+  fuzz *= 2;
 
   Split<double> c0(P[0],P[1],P[2],P[3]);
   Split<double> c1(P[4],P[5],P[6],P[7]);
@@ -894,8 +899,10 @@
   b=m(b,cornerbound(P,m,f));
   if(m(-1.0,1.0)*(b-ratiobound(P,m,f,16)) >= -fuzz || depth == 0)
     return b;
+
   --depth;
-
+  fuzz *= 2;
+  
   Split<triple> c0(P[0],P[1],P[2],P[3]);
   Split<triple> c1(P[4],P[5],P[6],P[7]);
   Split<triple> c2(P[8],P[9],P[10],P[11]);
@@ -1038,7 +1045,9 @@
   b=m(b,cornerboundtri(P,m));
   if(m(-1.0,1.0)*(b-controlboundtri(P,m)) >= -fuzz || depth == 0)
     return b;
+  
   --depth;
+  fuzz *= 2;
 
   Splittri<double> s(P);
   
@@ -1065,7 +1074,9 @@
   b=m(b,cornerboundtri(P,m,f));
   if(m(-1.0,1.0)*(b-ratiobound(P,m,f,10)) >= -fuzz || depth == 0)
     return b;
+  
   --depth;
+  fuzz *= 2;
 
   Splittri<triple> s(P);
   
@@ -1178,6 +1189,8 @@
      v.getz()+fuzz >= z) { // Overlapping bounding boxes
     
     --depth;
+    fuzz *= 2;
+
     if(abs2(X-x,Y-y,Z-z) <= fuzz*fuzz || depth == 0) {
       U=0.5;
       V=0.5;
@@ -1271,6 +1284,7 @@
      pmax.getz()+fuzz >= z) { // Overlapping bounding boxes
     
     --depth;
+    fuzz *= 2;
 
     if(((pmax-pmin).length()+sqrt(abs2(X-x,Y-y,Z-z)) <= fuzz) || depth == 0) {
       T.push_back(0.5);
@@ -1287,8 +1301,7 @@
     std::vector<double> T1,U1,V1;
     double tscale,toffset;
 
-    double fuzz2=max(fuzzFactor*fuzz,Fuzz);
-    fuzz2=fuzz2*fuzz2;
+    double fuzz2=max(fuzzFactor*fuzz*fuzz,Fuzz2);
   
     if(lp <= 1) {
       if(lp == 1) p.halve(p0,p1);

Modified: trunk/Build/source/utils/asymptote/pen.cc
===================================================================
--- trunk/Build/source/utils/asymptote/pen.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/pen.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -9,9 +9,6 @@
 
 namespace camp {
 
-const double tex2ps=72.0/72.27;
-const double ps2tex=1.0/tex2ps;
-
 const char* DEFPAT="<default>";
 const char* DEFLATEXFONT="\\usefont{\\ASYencoding}{\\ASYfamily}{\\ASYseries}{\\ASYshape}";
 const char* DEFCONTEXTFONT="modern";

Modified: trunk/Build/source/utils/asymptote/pen.h
===================================================================
--- trunk/Build/source/utils/asymptote/pen.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/pen.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -18,9 +18,6 @@
 
 namespace camp {
 
-extern const double tex2ps;
-extern const double ps2tex;
-  
 class LineType
 {
 public:  
@@ -405,7 +402,7 @@
   
   static pen initialpen() {
     return pen(LineType(vm::array(0),0.0,true,true),0.5,nullpath,"",
-               12.0*tex2ps,12.0*1.2*tex2ps,GRAYSCALE,
+               12.0*settings::tex2ps,12.0*1.2*settings::tex2ps,GRAYSCALE,
                0.0,0.0,0.0,0.0,"",ZEROWINDING,NOBASEALIGN,
                Transparency(),1,1,10.0,ALLOW,identity);
   }
@@ -443,11 +440,11 @@
   // Work around misalignment in ConTeXt switchtobodyfont if font is not found.
           if(texengine == "context")
             buf << "\\switchtobodyfont[" 
-                << DEFCONTEXTFONT << "," << size()*ps2tex 
+                << DEFCONTEXTFONT << "," << size()*settings::ps2tex 
                 << "pt]\\removeunwantedspaces%" << newl;
           else
             buf << "\\font\\ASYfont=" << DEFTEXFONT
-              << " at " << size()*ps2tex << "pt\\ASYfont";
+                << " at " << size()*settings::ps2tex << "pt\\ASYfont";
           return buf.str();
         }
       }

Modified: trunk/Build/source/utils/asymptote/picture.cc
===================================================================
--- trunk/Build/source/utils/asymptote/picture.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/picture.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -15,6 +15,7 @@
 #include "drawlabel.h"
 #include "drawlayer.h"
 #include "drawsurface.h"
+#include "drawpath3.h"
 
 using std::ifstream;
 using std::ofstream;
@@ -323,7 +324,7 @@
   bool first=true;
   pair b;
   bounds3();
-  double fuzz=sqrtFuzz*(b3.Max()-b3.Min()).length();
+  double fuzz=Fuzz*(b3.Max()-b3.Min()).length();
   matrixstack ms;
   for(nodelist::const_iterator p=nodes.begin(); p != nodes.end(); ++p) {
     assert(*p);
@@ -457,8 +458,18 @@
         push_split(cmd,getSetting<string>("dvisvgmOptions"));
         cmd.push_back("-o"+outname);
         ostringstream buf;
+        bbox B=svgbbox(b,bboxshift);
+        /*
+        double height=b.top-b.bottom;
+        double threshold=12.0*tex2ps;
+        if(height < threshold) {
+          double offset=threshold-height;
+          b.top += offset;
+          b.bottom += offset;
+        }
         bbox B=b;
         B.shift(bboxshift+pair(1.99*cm,1.9*cm));
+        */
         buf << "--bbox=" 
             << B.left << "bp " 
             << B.bottom << "bp "
@@ -595,8 +606,10 @@
   cmd.push_back("-dNOPAUSE");
   cmd.push_back("-dBATCH");
   cmd.push_back("-P");
-  if(safe)
+  if(safe) {
     cmd.push_back("-dSAFER");
+    cmd.push_back("-dDELAYSAFER"); // Support transparency extensions.
+  }
   cmd.push_back("-sDEVICE=pdfwrite");
   cmd.push_back("-dEPSCrop");
   cmd.push_back("-dSubsetFonts=true");
@@ -612,6 +625,11 @@
   cmd.push_back("-dDEVICEHEIGHTPOINTS="+String(max(b.top-b.bottom,3.0)));
   push_split(cmd,getSetting<string>("gsOptions"));
   cmd.push_back("-sOutputFile="+stripDir(pdfname));
+  if(safe) {
+    cmd.push_back("-c");
+    cmd.push_back(".setsafe");
+    cmd.push_back("-f");
+  }
   cmd.push_back(stripDir(epsname));
 
   char *oldPath=NULL;
@@ -963,7 +981,7 @@
   
   bbox bshift=b;
   
-  transparency=false;
+//  transparency=false;
   int svgcount=0;
   
   typedef mem::list<drawElement *> clipstack;
@@ -1088,8 +1106,8 @@
     out.epilogue();
     out.close();
     
-    if(out.Transparency())
-      transparency=true;
+//    if(out.Transparency())
+//      transparency=true;
     
     if(Labels) {
       tex->resetpen();
@@ -1157,16 +1175,18 @@
 }
 
 // render viewport with width x height pixels.
-void picture::render(GLUnurbs *nurb, double size2,
-                     const triple& Min, const triple& Max,
-                     double perspective, bool lighton, bool transparent) const
+void picture::render(double size2, const triple& Min, const triple& Max,
+                     double perspective, bool transparent) const
 {
   for(nodelist::const_iterator p=nodes.begin(); p != nodes.end(); ++p) {
     assert(*p);
-    (*p)->render(nurb,size2,Min,Max,perspective,lighton,transparent);
+    (*p)->render(size2,Min,Max,perspective,transparent);
   }
 #ifdef HAVE_GL
-  drawBezierPatch::S.draw();
+  if(transparent)
+    drawBezierPatch::S.drawTransparent();
+  else
+    drawBezierPatch::S.drawOpaque();
 #endif  
 }
   
@@ -1188,7 +1208,6 @@
   double *diffuse;
   double *ambient;
   double *specular;
-  bool viewportlighting;
   bool view;
 };
 
@@ -1203,8 +1222,7 @@
 #endif  
   glrender(com.prefix,com.pic,com.format,com.width,com.height,com.angle,
            com.zoom,com.m,com.M,com.shift,com.t,com.background,com.nlights,
-           com.lights,com.diffuse,com.ambient,com.specular,com.viewportlighting,
-           com.view);
+           com.lights,com.diffuse,com.ambient,com.specular,com.view);
 #endif  
 }
 
@@ -1213,7 +1231,7 @@
                        const triple& m, const triple& M, const pair& shift,
                        double *t, double *background, size_t nlights,
                        triple *lights, double *diffuse, double *ambient,
-                       double *specular, bool viewportlighting, bool view)
+                       double *specular, bool view)
 {
   if(getSetting<bool>("interrupt"))
     return true;
@@ -1288,7 +1306,6 @@
       com.diffuse=diffuse;
       com.ambient=ambient;
       com.specular=specular;
-      com.viewportlighting=viewportlighting;
       com.view=View;
       if(Wait)
         pthread_mutex_lock(&readyLock);
@@ -1322,8 +1339,7 @@
 #endif
 #ifdef HAVE_GL  
   glrender(prefix,pic,outputformat,width,height,angle,zoom,m,M,shift,t,
-           background,nlights,lights,diffuse,ambient,specular,viewportlighting,
-           View,oldpid);
+           background,nlights,lights,diffuse,ambient,specular,View,oldpid);
 #ifdef HAVE_PTHREAD
   if(glthread && !offscreen && Wait) {
     pthread_cond_wait(&readySignal,&readyLock);

Modified: trunk/Build/source/utils/asymptote/picture.h
===================================================================
--- trunk/Build/source/utils/asymptote/picture.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/picture.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -86,15 +86,14 @@
   bool shipout(picture* preamble, const string& prefix,
                const string& format, bool wait=false, bool view=true);
  
-  void render(GLUnurbs *nurb, double size2,
-              const triple &Min, const triple& Max, double perspective,
-              bool lighton, bool transparent) const;
+  void render(double size2, const triple &Min, const triple& Max,
+              double perspective, bool transparent) const;
   bool shipout3(const string& prefix, const string& format,
                 double width, double height, double angle, double zoom,
                 const triple& m, const triple& M, const pair& shift, double *t,
                 double *background, size_t nlights, triple *lights,
                 double *diffuse, double *ambient, double *specular,
-                bool viewportlighting, bool view);
+                bool view);
   
   // PRC output
   bool shipout3(const string& prefix);

Modified: trunk/Build/source/utils/asymptote/pipestream.cc
===================================================================
--- trunk/Build/source/utils/asymptote/pipestream.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/pipestream.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -93,7 +93,7 @@
 void iopipestream::pipeclose()
 {
   if(pipeopen) {
-    kill(pid,SIGTERM);
+//    kill(pid,SIGTERM);
     eof();
     close(out[0]);
     Running=false;

Modified: trunk/Build/source/utils/asymptote/process.cc
===================================================================
--- trunk/Build/source/utils/asymptote/process.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/process.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -565,7 +565,8 @@
 
 bool isSlashed(const string line) {
   // NOTE: This doesn't fully handle escaped slashed in a string literal.
-  return line[line.size()-1]=='\\';
+  unsigned n=line.size();
+  return n > 0 ? line[line.size()-1] == '\\' : false;
 }
 string deslash(const string line) {
   return isSlashed(line) ? line.substr(0,line.size()-1) : line;

Modified: trunk/Build/source/utils/asymptote/psfile.h
===================================================================
--- trunk/Build/source/utils/asymptote/psfile.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/psfile.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -162,9 +162,9 @@
     *out << newl;
   }
   
-  bool Transparency() {
-    return transparency;
-  }
+//  bool Transparency() {
+//    return transparency;
+//  }
   
   void write(pair z) {
     *out << " " << z.getx() << " " << z.gety();

Modified: trunk/Build/source/utils/asymptote/revision.cc
===================================================================
--- trunk/Build/source/utils/asymptote/revision.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/revision.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1 +1 @@
-const char *REVISION="2.47";
+const char *REVISION="2.48";

Modified: trunk/Build/source/utils/asymptote/runarray.cc
===================================================================
--- trunk/Build/source/utils/asymptote/runarray.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/runarray.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -2290,9 +2290,9 @@
   size_t N;
   real *A=copyTripleArray2Components(P,N);
   bound_double *B=bounddouble(N);
-  b=triple(B(A,::min,b.getx(),sqrtFuzz*norm(A,N),maxdepth),
-           B(A+N,::min,b.gety(),sqrtFuzz*norm(A+N,N),maxdepth),
-           B(A+2*N,::min,b.getz(),sqrtFuzz*norm(A+2*N,N),maxdepth));
+  b=triple(B(A,::min,b.getx(),Fuzz*norm(A,N),maxdepth),
+           B(A+N,::min,b.gety(),Fuzz*norm(A+N,N),maxdepth),
+           B(A+2*N,::min,b.getz(),Fuzz*norm(A+2*N,N),maxdepth));
   delete[] A;
   {Stack->push<triple>(b); return;}
 }
@@ -2307,9 +2307,9 @@
   size_t N;
   real *A=copyTripleArray2Components(P,N);
   bound_double *B=bounddouble(N);
-  b=triple(B(A,::max,b.getx(),sqrtFuzz*norm(A,N),maxdepth),
-           B(A+N,::max,b.gety(),sqrtFuzz*norm(A+N,N),maxdepth),
-           B(A+2*N,::max,b.getz(),sqrtFuzz*norm(A+2*N,N),maxdepth));
+  b=triple(B(A,::max,b.getx(),Fuzz*norm(A,N),maxdepth),
+           B(A+N,::max,b.gety(),Fuzz*norm(A+N,N),maxdepth),
+           B(A+2*N,::max,b.getz(),Fuzz*norm(A+2*N,N),maxdepth));
   delete[] A;
   {Stack->push<triple>(b); return;}
 }
@@ -2323,7 +2323,7 @@
 #line 1938 "runarray.in"
   size_t N;
   triple *A=copyTripleArray2C(P,N);
-  real fuzz=sqrtFuzz*norm(A,N);
+  real fuzz=Fuzz*norm(A,N);
   bound_triple *B=boundtriple(N);
   b=pair(B(A,::min,xratio,b.getx(),fuzz,maxdepth),
          B(A,::min,yratio,b.gety(),fuzz,maxdepth));
@@ -2341,7 +2341,7 @@
   size_t N;
   triple *A=copyTripleArray2C(P,N);
   bound_triple *B=boundtriple(N);
-  real fuzz=sqrtFuzz*norm(A,N);
+  real fuzz=Fuzz*norm(A,N);
   b=pair(B(A,::max,xratio,b.getx(),fuzz,maxdepth),
          B(A,::max,yratio,b.gety(),fuzz,maxdepth));
   delete[] A;

Modified: trunk/Build/source/utils/asymptote/runarray.in
===================================================================
--- trunk/Build/source/utils/asymptote/runarray.in	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/runarray.in	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1915,9 +1915,9 @@
   size_t N;
   real *A=copyTripleArray2Components(P,N);
   bound_double *B=bounddouble(N);
-  b=triple(B(A,::min,b.getx(),sqrtFuzz*norm(A,N),maxdepth),
-           B(A+N,::min,b.gety(),sqrtFuzz*norm(A+N,N),maxdepth),
-           B(A+2*N,::min,b.getz(),sqrtFuzz*norm(A+2*N,N),maxdepth));
+  b=triple(B(A,::min,b.getx(),Fuzz*norm(A,N),maxdepth),
+           B(A+N,::min,b.gety(),Fuzz*norm(A+N,N),maxdepth),
+           B(A+2*N,::min,b.getz(),Fuzz*norm(A+2*N,N),maxdepth));
   delete[] A;
   return b;
 }
@@ -1927,9 +1927,9 @@
   size_t N;
   real *A=copyTripleArray2Components(P,N);
   bound_double *B=bounddouble(N);
-  b=triple(B(A,::max,b.getx(),sqrtFuzz*norm(A,N),maxdepth),
-           B(A+N,::max,b.gety(),sqrtFuzz*norm(A+N,N),maxdepth),
-           B(A+2*N,::max,b.getz(),sqrtFuzz*norm(A+2*N,N),maxdepth));
+  b=triple(B(A,::max,b.getx(),Fuzz*norm(A,N),maxdepth),
+           B(A+N,::max,b.gety(),Fuzz*norm(A+N,N),maxdepth),
+           B(A+2*N,::max,b.getz(),Fuzz*norm(A+2*N,N),maxdepth));
   delete[] A;
   return b;
 }
@@ -1938,7 +1938,7 @@
 {
   size_t N;
   triple *A=copyTripleArray2C(P,N);
-  real fuzz=sqrtFuzz*norm(A,N);
+  real fuzz=Fuzz*norm(A,N);
   bound_triple *B=boundtriple(N);
   b=pair(B(A,::min,xratio,b.getx(),fuzz,maxdepth),
          B(A,::min,yratio,b.gety(),fuzz,maxdepth));
@@ -1951,7 +1951,7 @@
   size_t N;
   triple *A=copyTripleArray2C(P,N);
   bound_triple *B=boundtriple(N);
-  real fuzz=sqrtFuzz*norm(A,N);
+  real fuzz=Fuzz*norm(A,N);
   b=pair(B(A,::max,xratio,b.getx(),fuzz,maxdepth),
          B(A,::max,yratio,b.gety(),fuzz,maxdepth));
   delete[] A;

Modified: trunk/Build/source/utils/asymptote/runpicture.cc
===================================================================
--- trunk/Build/source/utils/asymptote/runpicture.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/runpicture.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -113,7 +113,6 @@
 using types::penArray2;
 
 static transform ZeroTransform=transform(0.0,0.0,0.0,0.0,0.0,0.0);
-//static int tag=0;
 
 transform getTransform(xmap_t &xmap, picture::nodelist::iterator p)
 {
@@ -120,9 +119,10 @@
     string s=(*p)->KEY;
     transform t;
     // Don't apply xmap without an explicit corresponding key
-    if(s.substr(s.length()-1) != "1") return t;
+    size_t n=s.length();
+    if(n == 0 || s.substr(n-1) != "1") return t;
 
-    xmap_t::iterator q=xmap.find(s.substr(0,s.length()-2));
+    xmap_t::iterator q=xmap.find(s.substr(0,n-2));
     if(q != xmap.end()) {
       xtransform_t& v=q->second;
       if(!v.empty()) {
@@ -762,11 +762,10 @@
 }
 
 #line 467 "runpicture.in"
-// void shipout3(string prefix, picture *f, string format=emptystring,              real width, real height, real angle, real zoom,              triple m, triple M, pair shift, realarray2 *t,              realarray *background, triplearray *lights, realarray2 *diffuse,              realarray2 *ambient, realarray2 *specular,              bool viewportlighting, bool view=true);
+// void shipout3(string prefix, picture *f, string format=emptystring,              real width, real height, real angle, real zoom,              triple m, triple M, pair shift, realarray2 *t,              realarray *background, triplearray *lights, realarray2 *diffuse,              realarray2 *ambient, realarray2 *specular, bool view=true);
 void gen_runpicture43(stack *Stack)
 {
   bool view=vm::pop<bool>(Stack,true);
-  bool viewportlighting=vm::pop<bool>(Stack);
   realarray2 * specular=vm::pop<realarray2 *>(Stack);
   realarray2 * ambient=vm::pop<realarray2 *>(Stack);
   realarray2 * diffuse=vm::pop<realarray2 *>(Stack);
@@ -783,7 +782,7 @@
   string format=vm::pop<string>(Stack,emptystring);
   picture * f=vm::pop<picture *>(Stack);
   string prefix=vm::pop<string>(Stack);
-#line 473 "runpicture.in"
+#line 472 "runpicture.in"
   size_t n=checkArrays(lights,diffuse);
   checkEqual(n,checkArray(ambient));
   checkEqual(n,checkArray(specular));
@@ -799,29 +798,29 @@
   copyArray2C(Specular,specular,false,4,UseGC);
     
   f->shipout3(prefix,format,width,height,angle,zoom,m,M,shift,T,Background,n,
-              Lights,Diffuse,Ambient,Specular,viewportlighting,view);
+              Lights,Diffuse,Ambient,Specular,view);
   
   delete[] Background;
   delete[] T;
 }
 
-#line 495 "runpicture.in"
+#line 494 "runpicture.in"
 // void shipout3(string prefix, picture *f);
 void gen_runpicture44(stack *Stack)
 {
   picture * f=vm::pop<picture *>(Stack);
   string prefix=vm::pop<string>(Stack);
-#line 496 "runpicture.in"
+#line 495 "runpicture.in"
   f->shipout3(prefix);
 }
 
-#line 500 "runpicture.in"
+#line 499 "runpicture.in"
 // void xmap(string key, transform t=identity);
 void gen_runpicture45(stack *Stack)
 {
   transform t=vm::pop<transform>(Stack,identity);
   string key=vm::pop<string>(Stack);
-#line 501 "runpicture.in"
+#line 500 "runpicture.in"
   xmap_t &xmap=processData().xmap;
   xmap_t::iterator p=xmap.find(key);
   if(p != xmap.end())
@@ -833,7 +832,7 @@
   }
 }
 
-#line 513 "runpicture.in"
+#line 512 "runpicture.in"
 // void deconstruct(picture *f, picture *preamble=NULL, transform T=identity);
 void gen_runpicture46(stack *Stack)
 {
@@ -840,7 +839,7 @@
   transform T=vm::pop<transform>(Stack,identity);
   picture * preamble=vm::pop<picture *>(Stack,NULL);
   picture * f=vm::pop<picture *>(Stack);
-#line 514 "runpicture.in"
+#line 513 "runpicture.in"
   unsigned level=0;
 
   string prefix=outname();
@@ -935,7 +934,7 @@
 // Three-dimensional picture and surface operations
 
 // Bezier curve
-#line 609 "runpicture.in"
+#line 608 "runpicture.in"
 // void _draw(picture *f, path3 g, triple center=Zero, pen p, Int interaction=0);
 void gen_runpicture47(stack *Stack)
 {
@@ -944,13 +943,13 @@
   triple center=vm::pop<triple>(Stack,Zero);
   path3 g=vm::pop<path3>(Stack);
   picture * f=vm::pop<picture *>(Stack);
-#line 610 "runpicture.in"
+#line 609 "runpicture.in"
   if(g.size() > 0)
     f->append(new drawPath3(g,center,p,(Interaction) intcast(interaction)));
 }
 
 // Bezier patch
-#line 616 "runpicture.in"
+#line 615 "runpicture.in"
 // void draw(picture *f, triplearray2 *P, triple center, bool straight,          penarray *p, real opacity, real shininess, real PRCshininess,          penarray *colors, Int interaction, bool prc=true);
 void gen_runpicture48(stack *Stack)
 {
@@ -965,7 +964,7 @@
   triple center=vm::pop<triple>(Stack);
   triplearray2 * P=vm::pop<triplearray2 *>(Stack);
   picture * f=vm::pop<picture *>(Stack);
-#line 619 "runpicture.in"
+#line 618 "runpicture.in"
   f->append(new drawBezierPatch(*P,center,straight,*p,opacity,shininess,
                                 PRCshininess,*colors,
                                 (Interaction) intcast(interaction),prc));
@@ -972,7 +971,7 @@
 }
 
 // Bezier triangle
-#line 626 "runpicture.in"
+#line 625 "runpicture.in"
 // void drawbeziertriangle(picture *f, triplearray2 *P, triple center,                        bool straight, penarray *p, real opacity,                        real shininess, real PRCshininess,                        penarray *colors, Int interaction, bool prc=true);
 void gen_runpicture49(stack *Stack)
 {
@@ -987,7 +986,7 @@
   triple center=vm::pop<triple>(Stack);
   triplearray2 * P=vm::pop<triplearray2 *>(Stack);
   picture * f=vm::pop<picture *>(Stack);
-#line 630 "runpicture.in"
+#line 629 "runpicture.in"
   f->append(new drawBezierTriangle(*P,center,straight,*p,opacity,shininess,
                                    PRCshininess,*colors,
                                    (Interaction) intcast(interaction),prc));
@@ -994,7 +993,7 @@
 }
 
 // General NURBS curve
-#line 637 "runpicture.in"
+#line 636 "runpicture.in"
 // void draw(picture *f, triplearray *P, realarray *knot,          realarray *weights=emptyarray, pen p);
 void gen_runpicture50(stack *Stack)
 {
@@ -1003,12 +1002,12 @@
   realarray * knot=vm::pop<realarray *>(Stack);
   triplearray * P=vm::pop<triplearray *>(Stack);
   picture * f=vm::pop<picture *>(Stack);
-#line 639 "runpicture.in"
+#line 638 "runpicture.in"
   f->append(new drawNurbsPath3(*P,knot,weights,p));
 }
 
 // General NURBS surface
-#line 644 "runpicture.in"
+#line 643 "runpicture.in"
 // void draw(picture *f, triplearray2 *P, realarray *uknot, realarray *vknot,          realarray2 *weights=emptyarray, penarray *p, real opacity,          real shininess, real PRCshininess, penarray *colors);
 void gen_runpicture51(stack *Stack)
 {
@@ -1022,13 +1021,13 @@
   realarray * uknot=vm::pop<realarray *>(Stack);
   triplearray2 * P=vm::pop<triplearray2 *>(Stack);
   picture * f=vm::pop<picture *>(Stack);
-#line 647 "runpicture.in"
+#line 646 "runpicture.in"
   f->append(new drawNurbs(*P,uknot,vknot,weights,*p,opacity,shininess,
                           PRCshininess,*colors));
 }
 
 // PRC unit sphere
-#line 653 "runpicture.in"
+#line 652 "runpicture.in"
 // void drawPRCsphere(picture *f, realarray2 *t, bool half=false, penarray *p,                   real opacity, real shininess, Int type);
 void gen_runpicture52(stack *Stack)
 {
@@ -1039,12 +1038,12 @@
   bool half=vm::pop<bool>(Stack,false);
   realarray2 * t=vm::pop<realarray2 *>(Stack);
   picture * f=vm::pop<picture *>(Stack);
-#line 655 "runpicture.in"
+#line 654 "runpicture.in"
   f->append(new drawSphere(*t,half,*p,opacity,shininess,intcast(type)));
 }
 
 // PRC unit cylinder
-#line 660 "runpicture.in"
+#line 659 "runpicture.in"
 // void drawPRCcylinder(picture *f, realarray2 *t, penarray *p, real opacity,                     real shininess);
 void gen_runpicture53(stack *Stack)
 {
@@ -1053,12 +1052,12 @@
   penarray * p=vm::pop<penarray *>(Stack);
   realarray2 * t=vm::pop<realarray2 *>(Stack);
   picture * f=vm::pop<picture *>(Stack);
-#line 662 "runpicture.in"
+#line 661 "runpicture.in"
   f->append(new drawCylinder(*t,*p,opacity,shininess));
 }
 
 // PRC unit disk
-#line 667 "runpicture.in"
+#line 666 "runpicture.in"
 // void drawPRCdisk(picture *f, realarray2 *t, penarray *p, real opacity,                 real shininess);
 void gen_runpicture54(stack *Stack)
 {
@@ -1067,12 +1066,12 @@
   penarray * p=vm::pop<penarray *>(Stack);
   realarray2 * t=vm::pop<realarray2 *>(Stack);
   picture * f=vm::pop<picture *>(Stack);
-#line 669 "runpicture.in"
+#line 668 "runpicture.in"
   f->append(new drawDisk(*t,*p,opacity,shininess));
 }
 
 // General PRC tube
-#line 674 "runpicture.in"
+#line 673 "runpicture.in"
 // void drawPRCtube(picture *f, path3 center, path3 g, penarray *p, real opacity,                 real shininess);
 void gen_runpicture55(stack *Stack)
 {
@@ -1082,12 +1081,12 @@
   path3 g=vm::pop<path3>(Stack);
   path3 center=vm::pop<path3>(Stack);
   picture * f=vm::pop<picture *>(Stack);
-#line 676 "runpicture.in"
+#line 675 "runpicture.in"
   f->append(new drawTube(center,g,*p,opacity,shininess));
 }
 
 // Draw pixel
-#line 681 "runpicture.in"
+#line 680 "runpicture.in"
 // void drawpixel(picture *f, triple v, pen p, real width=1.0);
 void gen_runpicture56(stack *Stack)
 {
@@ -1095,12 +1094,12 @@
   pen p=vm::pop<pen>(Stack);
   triple v=vm::pop<triple>(Stack);
   picture * f=vm::pop<picture *>(Stack);
-#line 682 "runpicture.in"
+#line 681 "runpicture.in"
   f->append(new drawPixel(v,p,width));
 }
 
 // Draw triangles
-#line 687 "runpicture.in"
+#line 686 "runpicture.in"
 // void draw(picture *f, triplearray *v, Intarray2 *vi,          triplearray *n, Intarray2 *ni,          penarray *p, real opacity, real shininess, real PRCshininess,          penarray *c=emptyarray, Intarray2 *ci=emptyarray);
 void gen_runpicture57(stack *Stack)
 {
@@ -1115,63 +1114,63 @@
   Intarray2 * vi=vm::pop<Intarray2 *>(Stack);
   triplearray * v=vm::pop<triplearray *>(Stack);
   picture * f=vm::pop<picture *>(Stack);
-#line 691 "runpicture.in"
+#line 690 "runpicture.in"
   f->append(new drawTriangles(*v,*vi,*n,*ni,*p,opacity,shininess,PRCshininess,
                               *c,*ci));
 }
 
-#line 696 "runpicture.in"
+#line 695 "runpicture.in"
 // triple min3(picture *f);
 void gen_runpicture58(stack *Stack)
 {
   picture * f=vm::pop<picture *>(Stack);
-#line 697 "runpicture.in"
+#line 696 "runpicture.in"
   {Stack->push<triple>(f->bounds3().Min()); return;}
 }
 
-#line 701 "runpicture.in"
+#line 700 "runpicture.in"
 // triple max3(picture *f);
 void gen_runpicture59(stack *Stack)
 {
   picture * f=vm::pop<picture *>(Stack);
-#line 702 "runpicture.in"
+#line 701 "runpicture.in"
   {Stack->push<triple>(f->bounds3().Max()); return;}
 }
 
-#line 706 "runpicture.in"
+#line 705 "runpicture.in"
 // triple size3(picture *f);
 void gen_runpicture60(stack *Stack)
 {
   picture * f=vm::pop<picture *>(Stack);
-#line 707 "runpicture.in"
+#line 706 "runpicture.in"
   bbox3 b=f->bounds3();
   {Stack->push<triple>(b.Max()-b.Min()); return;}
 }
 
-#line 712 "runpicture.in"
+#line 711 "runpicture.in"
 // pair minratio(picture *f);
 void gen_runpicture61(stack *Stack)
 {
   picture * f=vm::pop<picture *>(Stack);
-#line 713 "runpicture.in"
+#line 712 "runpicture.in"
   {Stack->push<pair>(f->ratio(::min)); return;}
 }
 
-#line 717 "runpicture.in"
+#line 716 "runpicture.in"
 // pair maxratio(picture *f);
 void gen_runpicture62(stack *Stack)
 {
   picture * f=vm::pop<picture *>(Stack);
-#line 718 "runpicture.in"
+#line 717 "runpicture.in"
   {Stack->push<pair>(f->ratio(::max)); return;}
 }
 
-#line 722 "runpicture.in"
+#line 721 "runpicture.in"
 // bool is3D(picture *f);
 void gen_runpicture63(stack *Stack)
 {
   picture * f=vm::pop<picture *>(Stack);
-#line 723 "runpicture.in"
+#line 722 "runpicture.in"
   {Stack->push<bool>(f->have3D()); return;}
 }
 
@@ -1268,46 +1267,46 @@
 #line 418 "runpicture.in"
   addFunc(ve, run::gen_runpicture42, primVoid(), SYM(_shipout), formal(primString() , SYM(prefix), true, false), formal(primPicture(), SYM(f), false, false), formal(primPicture(), SYM(preamble), true, false), formal(primString() , SYM(format), true, false), formal(primBoolean(), SYM(wait), true, false), formal(primBoolean(), SYM(view), true, false), formal(primTransform(), SYM(t), true, false));
 #line 467 "runpicture.in"
-  addFunc(ve, run::gen_runpicture43, primVoid(), SYM(shipout3), formal(primString() , SYM(prefix), false, false), formal(primPicture(), SYM(f), false, false), formal(primString() , SYM(format), true, false), formal(primReal(), SYM(width), false, false), formal(primReal(), SYM(height), false, false), formal(primReal(), SYM(angle), false, false), formal(primReal(), SYM(zoom), false, false), formal(primTriple(), SYM(m), false, false), formal(primTriple(), SYM(m), false, false), formal(primPair(), SYM(shift), false, false), formal(realArray2(), SYM(t), false, false), formal(realArray(), SYM(background), false, false), formal(tripleArray(), SYM(lights), false, false), formal(realArray2(), SYM(diffuse), false, false), formal(realArray2(), SYM(ambient), false, false), formal(realArray2(), SYM(specular), false, false), formal(primBoolean(), SYM(viewportlighting), false, false), formal(primBoolean(), SYM(view), true, false));
-#line 495 "runpicture.in"
+  addFunc(ve, run::gen_runpicture43, primVoid(), SYM(shipout3), formal(primString() , SYM(prefix), false, false), formal(primPicture(), SYM(f), false, false), formal(primString() , SYM(format), true, false), formal(primReal(), SYM(width), false, false), formal(primReal(), SYM(height), false, false), formal(primReal(), SYM(angle), false, false), formal(primReal(), SYM(zoom), false, false), formal(primTriple(), SYM(m), false, false), formal(primTriple(), SYM(m), false, false), formal(primPair(), SYM(shift), false, false), formal(realArray2(), SYM(t), false, false), formal(realArray(), SYM(background), false, false), formal(tripleArray(), SYM(lights), false, false), formal(realArray2(), SYM(diffuse), false, false), formal(realArray2(), SYM(ambient), false, false), formal(realArray2(), SYM(specular), false, false), formal(primBoolean(), SYM(view), true, false));
+#line 494 "runpicture.in"
   addFunc(ve, run::gen_runpicture44, primVoid(), SYM(shipout3), formal(primString() , SYM(prefix), false, false), formal(primPicture(), SYM(f), false, false));
-#line 500 "runpicture.in"
+#line 499 "runpicture.in"
   addFunc(ve, run::gen_runpicture45, primVoid(), SYM(xmap), formal(primString() , SYM(key), false, false), formal(primTransform(), SYM(t), true, false));
-#line 513 "runpicture.in"
+#line 512 "runpicture.in"
   addFunc(ve, run::gen_runpicture46, primVoid(), SYM(deconstruct), formal(primPicture(), SYM(f), false, false), formal(primPicture(), SYM(preamble), true, false), formal(primTransform(), SYM(t), true, false));
-#line 605 "runpicture.in"
+#line 604 "runpicture.in"
   addFunc(ve, run::gen_runpicture47, primVoid(), SYM(_draw), formal(primPicture(), SYM(f), false, false), formal(primPath3(), SYM(g), false, false), formal(primTriple(), SYM(center), true, false), formal(primPen(), SYM(p), false, false), formal(primInt(), SYM(interaction), true, false));
-#line 615 "runpicture.in"
+#line 614 "runpicture.in"
   addFunc(ve, run::gen_runpicture48, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(center), false, false), formal(primBoolean(), SYM(straight), false, false), formal(penArray()  , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(prcshininess), false, false), formal(penArray()  , SYM(colors), false, false), formal(primInt(), SYM(interaction), false, false), formal(primBoolean(), SYM(prc), true, false));
-#line 625 "runpicture.in"
+#line 624 "runpicture.in"
   addFunc(ve, run::gen_runpicture49, primVoid(), SYM(drawbeziertriangle), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(center), false, false), formal(primBoolean(), SYM(straight), false, false), formal(penArray()  , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(prcshininess), false, false), formal(penArray()  , SYM(colors), false, false), formal(primInt(), SYM(interaction), false, false), formal(primBoolean(), SYM(prc), true, false));
-#line 636 "runpicture.in"
+#line 635 "runpicture.in"
   addFunc(ve, run::gen_runpicture50, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray(), SYM(p), false, false), formal(realArray(), SYM(knot), false, false), formal(realArray(), SYM(weights), true, false), formal(primPen(), SYM(p), false, false));
-#line 643 "runpicture.in"
+#line 642 "runpicture.in"
   addFunc(ve, run::gen_runpicture51, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(realArray(), SYM(uknot), false, false), formal(realArray(), SYM(vknot), false, false), formal(realArray2(), SYM(weights), true, false), formal(penArray()  , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(prcshininess), false, false), formal(penArray()  , SYM(colors), false, false));
-#line 652 "runpicture.in"
+#line 651 "runpicture.in"
   addFunc(ve, run::gen_runpicture52, primVoid(), SYM(drawPRCsphere), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(primBoolean(), SYM(half), true, false), formal(penArray()  , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primInt(), SYM(type), false, false));
-#line 659 "runpicture.in"
+#line 658 "runpicture.in"
   addFunc(ve, run::gen_runpicture53, primVoid(), SYM(drawPRCcylinder), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(penArray()  , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false));
-#line 666 "runpicture.in"
+#line 665 "runpicture.in"
   addFunc(ve, run::gen_runpicture54, primVoid(), SYM(drawPRCdisk), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(penArray()  , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false));
-#line 673 "runpicture.in"
+#line 672 "runpicture.in"
   addFunc(ve, run::gen_runpicture55, primVoid(), SYM(drawPRCtube), formal(primPicture(), SYM(f), false, false), formal(primPath3(), SYM(center), false, false), formal(primPath3(), SYM(g), false, false), formal(penArray()  , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false));
-#line 680 "runpicture.in"
+#line 679 "runpicture.in"
   addFunc(ve, run::gen_runpicture56, primVoid(), SYM(drawpixel), formal(primPicture(), SYM(f), false, false), formal(primTriple(), SYM(v), false, false), formal(primPen(), SYM(p), false, false), formal(primReal(), SYM(width), true, false));
-#line 686 "runpicture.in"
+#line 685 "runpicture.in"
   addFunc(ve, run::gen_runpicture57, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray(), SYM(v), false, false), formal(IntArray2(), SYM(vi), false, false), formal(tripleArray(), SYM(n), false, false), formal(IntArray2(), SYM(ni), false, false), formal(penArray()  , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(prcshininess), false, false), formal(penArray()  , SYM(c), true, false), formal(IntArray2(), SYM(ci), true, false));
-#line 696 "runpicture.in"
+#line 695 "runpicture.in"
   addFunc(ve, run::gen_runpicture58, primTriple(), SYM(min3), formal(primPicture(), SYM(f), false, false));
-#line 701 "runpicture.in"
+#line 700 "runpicture.in"
   addFunc(ve, run::gen_runpicture59, primTriple(), SYM(max3), formal(primPicture(), SYM(f), false, false));
-#line 706 "runpicture.in"
+#line 705 "runpicture.in"
   addFunc(ve, run::gen_runpicture60, primTriple(), SYM(size3), formal(primPicture(), SYM(f), false, false));
-#line 712 "runpicture.in"
+#line 711 "runpicture.in"
   addFunc(ve, run::gen_runpicture61, primPair(), SYM(minratio), formal(primPicture(), SYM(f), false, false));
-#line 717 "runpicture.in"
+#line 716 "runpicture.in"
   addFunc(ve, run::gen_runpicture62, primPair(), SYM(maxratio), formal(primPicture(), SYM(f), false, false));
-#line 722 "runpicture.in"
+#line 721 "runpicture.in"
   addFunc(ve, run::gen_runpicture63, primBoolean(), SYM(is3D), formal(primPicture(), SYM(f), false, false));
 }
 

Modified: trunk/Build/source/utils/asymptote/runpicture.in
===================================================================
--- trunk/Build/source/utils/asymptote/runpicture.in	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/runpicture.in	2019-03-27 22:27:57 UTC (rev 50622)
@@ -77,7 +77,6 @@
 using types::penArray2;
 
 static transform ZeroTransform=transform(0.0,0.0,0.0,0.0,0.0,0.0);
-//static int tag=0;
 
 transform getTransform(xmap_t &xmap, picture::nodelist::iterator p)
 {
@@ -84,9 +83,10 @@
     string s=(*p)->KEY;
     transform t;
     // Don't apply xmap without an explicit corresponding key
-    if(s.substr(s.length()-1) != "1") return t;
+    size_t n=s.length();
+    if(n == 0 || s.substr(n-1) != "1") return t;
 
-    xmap_t::iterator q=xmap.find(s.substr(0,s.length()-2));
+    xmap_t::iterator q=xmap.find(s.substr(0,n-2));
     if(q != xmap.end()) {
       xtransform_t& v=q->second;
       if(!v.empty()) {
@@ -468,8 +468,7 @@
               real width, real height, real angle, real zoom,
               triple m, triple M, pair shift, realarray2 *t,
               realarray *background, triplearray *lights, realarray2 *diffuse,
-              realarray2 *ambient, realarray2 *specular,
-              bool viewportlighting, bool view=true)
+              realarray2 *ambient, realarray2 *specular, bool view=true)
 {
   size_t n=checkArrays(lights,diffuse);
   checkEqual(n,checkArray(ambient));
@@ -486,7 +485,7 @@
   copyArray2C(Specular,specular,false,4,UseGC);
     
   f->shipout3(prefix,format,width,height,angle,zoom,m,M,shift,T,Background,n,
-              Lights,Diffuse,Ambient,Specular,viewportlighting,view);
+              Lights,Diffuse,Ambient,Specular,view);
   
   delete[] Background;
   delete[] T;

Modified: trunk/Build/source/utils/asymptote/settings.cc
===================================================================
--- trunk/Build/source/utils/asymptote/settings.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/settings.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -1067,14 +1067,14 @@
 // ALT LEFT: pan
   const char *leftbutton[]={"rotate","zoom","shift","pan",NULL};
   
-// MIDDLE: menu (must be unmodified; ignores Shift, Ctrl, and Alt)
-  const char *middlebutton[]={"menu",NULL};
+// MIDDLE:
+  const char *middlebutton[]={NULL};
   
-// RIGHT: zoom/menu (must be unmodified)
+// RIGHT: zoom
 // SHIFT RIGHT: rotateX
 // CTRL RIGHT: rotateY
 // ALT RIGHT: rotateZ
-  const char *rightbutton[]={"zoom/menu","rotateX","rotateY","rotateZ",NULL};
+  const char *rightbutton[]={"zoom","rotateX","rotateY","rotateZ",NULL};
   
 // WHEEL_UP: zoomin
   const char *wheelup[]={"zoomin",NULL};
@@ -1269,6 +1269,7 @@
   addOption(new userSetting("user", 'u', "string",
                             "General purpose user string"));
   
+  addOption(new IntSetting("maxvertices", 0, "n", "Maximum number of vertices to queue", 0));
   addOption(new realSetting("zoomfactor", 0, "factor", "Zoom step factor",
                             1.05));
   addOption(new realSetting("zoomstep", 0, "step", "Mouse motion zoom step",
@@ -1357,15 +1358,10 @@
 
 bool trap()
 {
-#ifdef __CYGWIN__
-// Disable until broken strtod exception is fixed.
-  return false;
-#else
   if (interact::interactive)
     return !getSetting<bool>("interactiveMask");
   else
     return !getSetting<bool>("batchMask");
-#endif  
 }
 
 string outname() 

Modified: trunk/Build/source/utils/asymptote/settings.h
===================================================================
--- trunk/Build/source/utils/asymptote/settings.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/settings.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -115,8 +115,11 @@
 string texcommand();
 string texprogram();
   
-const double inches=72;
+const double inches=72.0;
 const double cm=inches/2.54;
+const double tex2ps=72.0/72.27;
+const double ps2tex=1.0/tex2ps;
+
 }
 
 extern const char *REVISION;

Added: trunk/Build/source/utils/asymptote/shaders.cc
===================================================================
--- trunk/Build/source/utils/asymptote/shaders.cc	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/shaders.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -0,0 +1,82 @@
+// shader handling
+// Author: Supakorn "Jamie" Rassameemasmuang
+
+#include <fstream>
+#include <sstream>
+#include <vector>
+#include <string>
+#include <unordered_set>
+
+#include <iostream>
+
+#include "common.h"
+#ifdef HAVE_GL
+
+#include "shaders.h"
+
+GLuint createShaders(GLchar const* src, int shaderType)
+{
+    GLuint shader = glCreateShader(shaderType);
+    glShaderSource(shader, 1, &src, nullptr);
+    glCompileShader(shader);
+    
+    GLint status;
+    glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
+
+    if (status != GL_TRUE)
+    {
+        GLint length; 
+
+        glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
+
+        std::vector<GLchar> msg(length);
+
+        glGetShaderInfoLog(shader, length, &length, msg.data());
+
+        for(GLchar const& cha : msg)
+        {
+            std::cerr << cha;
+        }
+
+        std::cerr << std::endl << "GL Compile error" << std::endl;
+        std::cerr << src << std::endl;
+        throw 1; 
+    }
+    return shader;
+}
+
+GLuint createShaderFile(std::string file, int shaderType, size_t Nlights,
+                        size_t Nmaterials,
+                        std::unordered_set<std::string> compilerFlags)
+{
+    std::ifstream shaderFile;
+    shaderFile.open(file);
+    std::stringstream shaderSrc;
+
+    shaderSrc << "#version 130" << "\r\n";
+    shaderSrc << "#extension GL_ARB_uniform_buffer_object : enable"
+              << "\r\n";
+    shaderSrc << "#extension GL_ARB_shading_language_packing : enable"
+              << "\r\n";
+
+    for(std::string const& flag : compilerFlags)
+    {
+        shaderSrc << "#define " << flag << "\r\n";
+    }
+    
+    shaderSrc << "const int Nlights=" << Nlights << ";\r\n";
+    shaderSrc << "const int Nmaterials=" << Nmaterials << ";\r\n";
+
+    if (shaderFile)
+    {
+        shaderSrc << shaderFile.rdbuf();
+        shaderFile.close();
+    }
+    else
+    {
+        throw 1;
+    }
+
+    return createShaders(shaderSrc.str().data(), shaderType);
+}
+#endif


Property changes on: trunk/Build/source/utils/asymptote/shaders.cc
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/shaders.h
===================================================================
--- trunk/Build/source/utils/asymptote/shaders.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/shaders.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -0,0 +1,25 @@
+#ifndef __TOGL_SHADERSPROC
+#define __TOGL_SHADERSPROC
+
+#define GLEW_STATIC
+#define GLEW_NO_GLU
+
+#ifdef __APPLE__
+#include <OpenGL/glew.h>
+#else
+#include <GL/glew.h>
+#ifdef __MSDOS__
+#include<windows.h>
+#include <GL/wglew.h>
+#include <GL/wglext.h>
+#endif
+#endif
+
+#include <string>
+#include <unordered_set>
+
+GLuint createShaders(GLchar const *src, int shaderType);
+GLuint createShaderFile(std::string file, int shaderType, size_t Nlights,
+                        size_t Nmaterials,
+                        std::unordered_set<std::string> compilerFlags={});
+#endif


Property changes on: trunk/Build/source/utils/asymptote/shaders.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/utils/asymptote/texfile.cc
===================================================================
--- trunk/Build/source/utils/asymptote/texfile.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/texfile.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -13,6 +13,8 @@
 
 using std::ofstream;
 using settings::getSetting;
+using settings::ps2tex;
+using settings::tex2ps;
 using vm::array;
 using vm::read;
 
@@ -349,10 +351,11 @@
   
 void svgtexfile::begintransform()
 {
+  bbox b=box;
+  b.left=-Hoffset;
+  b=svgbbox(b);
   *out << "<g transform='matrix(" << tex2ps << " 0 0 " << tex2ps <<" "
-       << (-Hoffset+1.99*settings::cm) << " " 
-       << (1.9*settings::cm+box.top) 
-       << ")'>" << nl;
+       << b.left << " " << b.top << ")'>" << nl;
 }
     
 void svgtexfile::endtransform()

Modified: trunk/Build/source/utils/asymptote/texfile.h
===================================================================
--- trunk/Build/source/utils/asymptote/texfile.h	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/texfile.h	2019-03-27 22:27:57 UTC (rev 50622)
@@ -173,8 +173,8 @@
 bool setlatexfont(T& out, const pen& p, const pen& lastpen)
 {
   if(p.size() != lastpen.size() || p.Lineskip() != lastpen.Lineskip()) {
-    out <<  "\\fontsize{" << p.size()*ps2tex << "}{" << p.Lineskip()*ps2tex
-        << "}\\selectfont\n";
+    out <<  "\\fontsize{" << p.size()*settings::ps2tex << "}{" 
+        << p.Lineskip()*settings::ps2tex << "}\\selectfont\n";
     return true;
   }
   return false;
@@ -278,7 +278,7 @@
   void dot(path p, pen, bool newPath=true);
   
   void writeshifted(pair z) {
-    write(conj(z)*ps2tex);
+    write(conj(z)*settings::ps2tex);
   }
   
   void translate(pair z) {}

Modified: trunk/Build/source/utils/asymptote/tr.cc
===================================================================
--- trunk/Build/source/utils/asymptote/tr.cc	2019-03-27 22:01:33 UTC (rev 50621)
+++ trunk/Build/source/utils/asymptote/tr.cc	2019-03-27 22:27:57 UTC (rev 50622)
@@ -55,10 +55,8 @@
 #endif
 #ifdef __APPLE__
 #include <OpenGL/gl.h>
-#include <OpenGL/glu.h>
 #else
 #include <GL/gl.h>
-#include <GL/glu.h>
 #endif
 #include "tr.h"
 
@@ -66,7 +64,16 @@
 #define DEFAULT_TILE_HEIGHT 256
 #define DEFAULT_TILE_BORDER 0
 
+namespace gl {
+void frustum(GLdouble left, GLdouble right, GLdouble bottom,
+             GLdouble top, GLdouble nearVal, GLdouble farVal);
+void ortho(GLdouble left, GLdouble right, GLdouble bottom,
+           GLdouble top, GLdouble nearVal, GLdouble farVal);
+}
 
+using gl::frustum;
+using gl::ortho;
+
 struct _TRctx {
    /* Final image parameters */
    GLint ImageWidth, ImageHeight;
@@ -362,9 +369,9 @@
    top = bottom + (tr->Top - tr->Bottom) * tileHeight / tr->ImageHeight;
 
    if (tr->Perspective)
-      glFrustum(left, right, bottom, top, tr->Near, tr->Far);
+      frustum(left, right, bottom, top, tr->Near, tr->Far);
    else
-      glOrtho(left, right, bottom, top, tr->Near, tr->Far);
+      ortho(left, right, bottom, top, tr->Near, tr->Far);
 
    /* restore user's matrix mode */
    glMatrixMode(matrixMode);
@@ -437,60 +444,4 @@
       return 1;
 }
 
-
-/*
- * Replacement for glRastePos3f() which avoids the problem with invalid
- * raster pos.
- */
-void trRasterPos3f(TRcontext *tr, GLfloat x, GLfloat y, GLfloat z)
-{
-   if (tr->CurrentTile<0) {
-      /* not doing tile rendering right now.  Let OpenGL do this. */
-      glRasterPos3f(x, y, z);
-   }
-   else {
-      GLdouble modelview[16], proj[16];
-      GLint viewport[4];
-      GLdouble winX, winY, winZ;
-
-      /* Get modelview, projection and viewport */
-      glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
-      glGetDoublev(GL_PROJECTION_MATRIX, proj);
-      viewport[0] = 0;
-      viewport[1] = 0;
-      viewport[2] = tr->CurrentTileWidth;
-      viewport[3] = tr->CurrentTileHeight;
-
-      /* Project object coord to window coordinate */
-      if (gluProject(x, y, z, modelview, proj, viewport, &winX, &winY, &winZ)){
-
-         /* set raster pos to window coord (0,0) */
-         glMatrixMode(GL_MODELVIEW);
-         glPushMatrix();
-         glLoadIdentity();
-         glMatrixMode(GL_PROJECTION);
-         glPushMatrix();
-         glLoadIdentity();
-         glOrtho(0.0, tr->CurrentTileWidth,
-                 0.0, tr->CurrentTileHeight, 0.0, 1.0);
-         glRasterPos3f(0.0, 0.0, -winZ);
-
-         /* Now use empty bitmap to adjust raster position to (winX,winY) */
-         {
-            GLubyte bitmap[1] = {0};
-            glBitmap(1, 1, 0.0, 0.0, winX, winY, bitmap);
-         }
-
-         /* restore original matrices */
-         glPopMatrix(); /*proj*/
-         glMatrixMode(GL_MODELVIEW);
-         glPopMatrix();
-      }
-#ifdef DEBUG
-      if (glGetError())
-         printf("GL error!\n");
 #endif
-   }
-}
-
-#endif

Added: trunk/Build/source/utils/asymptote/webgl/WebGLfooter.html
===================================================================
--- trunk/Build/source/utils/asymptote/webgl/WebGLfooter.html	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/webgl/WebGLfooter.html	2019-03-27 22:27:57 UTC (rev 50622)
@@ -0,0 +1,10 @@
+    </script>
+
+</head>
+
+
+<body onload="webGLStart();">
+    <canvas id="Asymptote" style="border: none;" width="800" height="800" />
+</body>
+
+</html>


Property changes on: trunk/Build/source/utils/asymptote/webgl/WebGLfooter.html
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/webgl/WebGLheader.html
===================================================================
--- trunk/Build/source/utils/asymptote/webgl/WebGLheader.html	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/webgl/WebGLheader.html	2019-03-27 22:27:57 UTC (rev 50622)
@@ -0,0 +1,31 @@
+<html>
+
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+
+    <script id="shader-fs" type="x-shader/x-fragment">
+        precision mediump float; 
+        varying vec4 vColor; 
+        void main(void) 
+        { 
+            gl_FragColor=vColor; 
+        }
+    </script>
+
+    <script id="shader-vs" type="x-shader/x-vertex">
+        attribute vec3 aVertexPosition; 
+        attribute vec4 aVertexColor; 
+        uniform mat4 uMVMatrix; 
+        uniform mat4 uPMatrix; 
+        varying vec4 vColor; 
+        void main(void) 
+        { 
+            gl_Position=uPMatrix*uMVMatrix*vec4(aVertexPosition,1.0); 
+            vColor=aVertexColor; 
+        }
+    </script>
+
+    <script type="text/javascript" src="https://vectorgraphics.github.io/asymptote/webgl/glm-js-min-2.2.2.js"></script>
+    <script type="text/javascript" src="https://vectorgraphics.github.io/asymptote/webgl/arcball-0.01.js"></script>
+    <script type="text/javascript" src="https://vectorgraphics.github.io/asymptote/webgl/gl-0.01.js"></script>
+    <script type="text/javascript">


Property changes on: trunk/Build/source/utils/asymptote/webgl/WebGLheader.html
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/webgl/arcball-0.01.js
===================================================================
--- trunk/Build/source/utils/asymptote/webgl/arcball-0.01.js	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/webgl/arcball-0.01.js	2019-03-27 22:27:57 UTC (rev 50622)
@@ -0,0 +1,67 @@
+// double, double => rotation matrix
+// require https://cdn.rawgit.com/humbletim/glm-js/31fd034b/build/glm-js.min.js
+
+
+var arcballLib = {
+    arcball: function(oldmouse, newmouse) {
+        let oldMouseNew = [0, 0, 0];
+        let newMouseNew = [0, 0, 0];
+
+        let testNorm = this.twonorm(oldmouse);
+        if (testNorm > 1) {
+            oldMouseNew[0] = oldmouse[0] / testNorm;
+            oldMouseNew[1] = oldmouse[1] / testNorm;
+        } else {
+            oldMouseNew[0] = oldmouse[0];
+            oldMouseNew[1] = oldmouse[1];
+        }
+
+        let testNorm2 = this.twonorm(newmouse);
+        if (testNorm2 > 1) {
+            newMouseNew[0] = newmouse[0] / testNorm2;
+            newMouseNew[1] = newmouse[1] / testNorm2;
+        } else {
+            newMouseNew[0] = newmouse[0];
+            newMouseNew[1] = newmouse[1];
+        }
+
+        var z1squared = 1 - (oldMouseNew[1] ** 2) - (oldMouseNew[0] ** 2);
+        if (z1squared < 0 && z1squared > -0.00001) {
+            z1squared = 0;
+        }
+
+        var z2squared = 1 - (newMouseNew[1] ** 2) - (newMouseNew[0] ** 2);
+        if (z2squared < 0 && z2squared > -0.00001) {
+            z2squared = 0;
+        }
+
+
+        oldMouseNew[2] = Math.sqrt(z1squared);
+        newMouseNew[2] = Math.sqrt(z2squared);
+
+        if (isNaN(oldMouseNew[2]) || isNaN(newMouseNew[2])) {
+
+            alert('Error!');
+        }
+
+        
+        let oldMouseVec = glm.vec3(...oldMouseNew);
+        let newMouseVec = glm.vec3(...newMouseNew);
+        let axis = glm.normalize(glm.cross(oldMouseVec, newMouseVec));
+
+        // console.log(axis[0], axis[1], axis[2]);
+
+        let angle = Math.acos(glm.dot(oldMouseVec, newMouseVec));
+
+        return [angle, axis]
+
+    }, 
+
+    twonorm: function(v) {
+        let normSq = 0
+        for (let i = 0; i < v.length; i++) {
+            normSq += (v[i] ** 2);
+        }
+        return Math.sqrt(normSq);
+    }
+}
\ No newline at end of file

Added: trunk/Build/source/utils/asymptote/webgl/arcball.js
===================================================================
--- trunk/Build/source/utils/asymptote/webgl/arcball.js	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/webgl/arcball.js	2019-03-27 22:27:57 UTC (rev 50622)
@@ -0,0 +1,67 @@
+// double, double => rotation matrix
+// require https://cdn.rawgit.com/humbletim/glm-js/31fd034b/build/glm-js.min.js
+
+
+var arcballLib = {
+    arcball: function(oldmouse, newmouse) {
+        let oldMouseNew = [0, 0, 0];
+        let newMouseNew = [0, 0, 0];
+
+        let testNorm = this.twonorm(oldmouse);
+        if (testNorm > 1) {
+            oldMouseNew[0] = oldmouse[0] / testNorm;
+            oldMouseNew[1] = oldmouse[1] / testNorm;
+        } else {
+            oldMouseNew[0] = oldmouse[0];
+            oldMouseNew[1] = oldmouse[1];
+        }
+
+        let testNorm2 = this.twonorm(newmouse);
+        if (testNorm2 > 1) {
+            newMouseNew[0] = newmouse[0] / testNorm2;
+            newMouseNew[1] = newmouse[1] / testNorm2;
+        } else {
+            newMouseNew[0] = newmouse[0];
+            newMouseNew[1] = newmouse[1];
+        }
+
+        var z1squared = 1 - (oldMouseNew[1] ** 2) - (oldMouseNew[0] ** 2);
+        if (z1squared < 0 && z1squared > -0.00001) {
+            z1squared = 0;
+        }
+
+        var z2squared = 1 - (newMouseNew[1] ** 2) - (newMouseNew[0] ** 2);
+        if (z2squared < 0 && z2squared > -0.00001) {
+            z2squared = 0;
+        }
+
+
+        oldMouseNew[2] = Math.sqrt(z1squared);
+        newMouseNew[2] = Math.sqrt(z2squared);
+
+        if (isNaN(oldMouseNew[2]) || isNaN(newMouseNew[2])) {
+
+            alert('Error!');
+        }
+
+        
+        let oldMouseVec = glm.vec3(...oldMouseNew);
+        let newMouseVec = glm.vec3(...newMouseNew);
+        let axis = glm.normalize(glm.cross(oldMouseVec, newMouseVec));
+
+        // console.log(axis[0], axis[1], axis[2]);
+
+        let angle = Math.acos(glm.dot(oldMouseVec, newMouseVec));
+
+        return [angle, axis]
+
+    }, 
+
+    twonorm: function(v) {
+        let normSq = 0
+        for (let i = 0; i < v.length; i++) {
+            normSq += (v[i] ** 2);
+        }
+        return Math.sqrt(normSq);
+    }
+}
\ No newline at end of file

Added: trunk/Build/source/utils/asymptote/webgl/gl-0.01.js
===================================================================
--- trunk/Build/source/utils/asymptote/webgl/gl-0.01.js	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/webgl/gl-0.01.js	2019-03-27 22:27:57 UTC (rev 50622)
@@ -0,0 +1,738 @@
+// Contains code from http: //learningwebgl.com/blog/ ? p=28#triangle-vertex-positions 
+// modified to produce a subdivision algorithm for rendering Bezier
+// patches with WebGL
+var gl;
+
+function initGL(canvas) {
+    try {
+        gl=canvas.getContext("experimental-webgl");
+        gl.viewportWidth=canvas.width;
+        gl.viewportHeight=canvas.height;
+    } catch(e) {}
+    if(!gl) {
+        alert("Could not initialise WebGL, sorry : -(");
+    }
+}
+
+function getShader(gl, id) {
+    var shaderScript=document.getElementById(id);
+    if(!shaderScript) {
+        return null;
+    }
+    var str="";
+    var k=shaderScript.firstChild;
+    while(k) {
+        if(k.nodeType == 3) {
+            str += k.textContent;
+        }
+        k=k.nextSibling;
+    }
+    var shader;
+    if(shaderScript.type == "x-shader/x-fragment") {
+        shader=gl.createShader(gl.FRAGMENT_SHADER);
+    } else if(shaderScript.type == "x-shader/x-vertex") {
+        shader=gl.createShader(gl.VERTEX_SHADER);
+    } else {
+        return null;
+    }
+    gl.shaderSource(shader,str);
+    gl.compileShader(shader);
+    if(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)) {
+        alert(gl.getShaderInfoLog(shader));
+        return null;
+    }
+    return shader;
+}
+
+var shaderProgram;
+
+function initShaders() {
+    var fragmentShader=getShader(gl,"shader-fs");
+    var vertexShader=getShader(gl,"shader-vs");
+    shaderProgram=gl.createProgram();
+    gl.attachShader(shaderProgram,vertexShader);
+    gl.attachShader(shaderProgram,fragmentShader);
+    gl.linkProgram(shaderProgram);
+    if(!gl.getProgramParameter(shaderProgram,gl.LINK_STATUS)) {
+        alert("Could not initialise shaders");
+    }
+    gl.useProgram(shaderProgram);
+    shaderProgram.vertexPositionAttribute=gl.getAttribLocation(shaderProgram,"aVertexPosition");
+    gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
+    shaderProgram.vertexColorAttribute=gl.getAttribLocation(shaderProgram,"aVertexColor");
+    gl.enableVertexAttribArray(shaderProgram.vertexColorAttribute);
+    shaderProgram.pMatrixUniform=gl.getUniformLocation(shaderProgram,"uPMatrix");
+    shaderProgram.mvMatrixUniform=gl.getUniformLocation(shaderProgram,"uMVMatrix");
+}
+var mvMatrix=mat4.create();
+var pMatrix=mat4.create();
+
+function setMatrixUniforms() {
+    gl.uniformMatrix4fv(shaderProgram.pMatrixUniform,false,pMatrix);
+    gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform,false,mvMatrix);
+}
+
+var VertexBuffer;
+var ColorBuffer;
+
+var vertices=new Array();
+var colors=new Array();
+var indices=new Array();
+var nvertices=0;
+
+var mvMatrix=mat4.create();
+var translOffset=[0,0,0];
+var zoomFactor=1;
+
+var mvMatrixStack=[] ;
+var pMatrix=mat4.create();
+
+var localRotation=mat4.create();
+
+function mvPushMatrix() {
+    var copy=mat4.create();
+    mat4.set(mvMatrix,copy);
+    mvMatrixStack.push(copy);
+}
+
+function mvPopMatrix() {
+    if(mvMatrixStack.length == 0) {
+        throw "Invalid popMatrix!";
+    }
+    mvMatrix=mvMatrixStack.pop();
+}
+
+function degToRad(degrees) {
+    return degrees*Math.PI/180;
+}
+
+var redraw=true;
+var mouseDownOrTouchActive=false;
+var lastMouseX=null;
+var lastMouseY=null;
+var touchID=null;
+
+
+var center=[0,0,1];
+var centerInv=[0,0,-1];
+
+var rotationMatLocal=mat4.create();
+var rotationMatrix=mat4.create();
+mat4.identity(rotationMatrix);
+
+function handleMouseDown(event) {
+    mouseDownOrTouchActive=true;
+    lastMouseX=event.clientX;
+    lastMouseY=event.clientY;
+}
+
+function handleTouchStart(evt) {
+    evt.preventDefault();
+    var touches=evt.targetTouches;
+
+    if(touches.length == 1 && !mouseDownOrTouchActive) {
+        touchId=touches[0].identifier;
+        lastMouseX=touches[0].pageX,
+        lastMouseY=touches[0].pageY;
+    }
+}
+
+function handleMouseUpOrTouchEnd(event) {
+    mouseDownOrTouchActive=false;
+}
+
+function processDrag(newX, newY, pan=false) {
+    let lastX=(lastMouseX-400)/400;
+    let lastY=(lastMouseY-400)/400;
+
+    let rawX=(newX-400)/400;
+    let rawY=(newY-400)/400;
+
+    if(!pan) {
+        let [angle,axis]=arcballLib.arcball([lastX,-lastY],[rawX,-rawY]);
+        let tmpMatrix=mat4.create()
+        mat4.identity(tmpMatrix)
+        mat4.rotate(tmpMatrix,tmpMatrix,angle,[axis[0],axis[1],axis[2]])
+        mat4.multiply(rotationMatrix,tmpMatrix,rotationMatrix);
+    } else {
+        translOffset[0] +=(rawX-lastX);
+        translOffset[1] -=(rawY-lastY);
+    }
+    lastMouseX=newX;
+    lastMouseY=newY;
+    redraw=true;
+}
+
+function handleKey(key) {
+    var keycode=key.key;
+    var rotate=true;
+    var axis=[0,0,1];
+    switch(keycode) {
+    case "w": 
+        axis=[-1,0,0];
+        break;
+    case "d": 
+        axis=[0,1,0];
+        break;
+    case "a": 
+        axis=[0,-1,0];
+        break;
+    case "s": 
+        axis=[1,0,0];
+        break;
+
+    default: 
+        rotate=false;
+        break;
+    }
+
+    if(rotate) {
+        mat4.rotate(rotationMatrix,rotationMatrix,0.1,axis);
+        redraw=true;
+    }
+
+}
+
+function handleMouseWheel(event) {
+    zoomFactor -= event.deltaY/100;
+
+    if(zoomFactor < 0) {
+        zoomFactor=0;
+    } else if(zoomFactor > 100) {
+        zoomFactor=100;
+    }
+
+    res=zoomFactor*0.001;
+    redraw=true;
+}
+
+function handleMouseMove(event) {
+    if(!mouseDownOrTouchActive) {
+        return;
+    }
+
+    var newX=event.clientX;
+    var newY=event.clientY;
+
+    processDrag(newX,newY,event.getModifierState("Alt"));
+}
+
+function handleTouchMove(evt) {
+    evt.preventDefault();
+    var touches=evt.targetTouches;
+
+    if(touches.length == 1 && touchId == touches[0].identifier) {
+        var newX=touches[0].pageX;
+        var newY=touches[0].pageY;
+        processDrag(newX,newY);
+    }
+}
+
+// Prepare canvas for drawing
+function sceneSetup() {
+    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
+    mat4.perspective(pMatrix,45,gl.viewportWidth/gl.viewportHeight,0.1,100.0);
+    mat4.identity(mvMatrix);
+
+    mat4.translate(mvMatrix,mvMatrix,centerInv);
+    mat4.multiply(mvMatrix,mvMatrix,rotationMatrix);
+    mat4.scale(mvMatrix,mvMatrix,[zoomFactor,zoomFactor,zoomFactor]);
+    mat4.translate(mvMatrix,mvMatrix,center);
+
+    mat4.translate(mvMatrix,mvMatrix,translOffset)
+}
+
+var indexExt;
+
+// Create buffer data for the patch and its subdivisions to be pushed to the graphics card
+//Takes as an argument the array of vertices that define the patch to be drawn 
+// Using the vertex position buffer of the above function,draw patch.
+function setBuffer() {
+    VertexBuffer=gl.createBuffer();
+    VertexBuffer.itemSize=3;
+
+    ColorBuffer=gl.createBuffer();
+    ColorBuffer.itemSize=4;
+
+    indexBuffer=gl.createBuffer();
+    indexBuffer.itemSize=1;
+}
+
+function drawBuffer() {
+    gl.bindBuffer(gl.ARRAY_BUFFER,VertexBuffer);
+    gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(vertices),gl.STATIC_DRAW);
+    gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,
+                           VertexBuffer.itemSize,gl.FLOAT,false,0,0);
+    VertexBuffer.numItems=nvertices;
+
+    gl.bindBuffer(gl.ARRAY_BUFFER,ColorBuffer);
+    gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(colors),gl.STATIC_DRAW);
+    gl.vertexAttribPointer(shaderProgram.vertexColorAttribute,
+                           ColorBuffer.itemSize,gl.FLOAT,false,0,0);
+    ColorBuffer.numItems=nvertices;
+
+    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,indexBuffer);
+    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,
+                  indexExt ? new Uint32Array(indices) : new Uint16Array(indices),
+                  gl.STATIC_DRAW);
+    indexBuffer.numItems=indices.length;
+    gl.drawElements(gl.TRIANGLES,indexBuffer.numItems,
+                    indexExt ? gl.UNSIGNED_INT : gl.UNSIGNED_SHORT,0);
+    vertices=[];
+    colors=[];
+    indices=[];
+    nvertices=0;
+}
+
+var pixel=1.0; // Adaptive rendering constant.
+var FillFactor=0.1;
+var BezierFactor=0.4;
+//var res=0.0005; // Temporary
+var res=0.001; // Temporary
+var res2=res*res;
+var Epsilon=0.1*res;
+var epsilon=0;
+var Fuzz=1000*Number.EPSILON;
+var Fuzz2=Fuzz*Fuzz;
+
+function Split3(z0, c0, c1, z1) {
+    this.m0=new Array(3);
+    this.m2=new Array(3);
+    this.m3=new Array(3);
+    this.m4=new Array(3);
+    this.m5=new Array(3);
+    for(var i=0; i < 3; ++i) {
+        this.m0[i]=0.5*(z0[i]+c0[i]);
+        var m1=0.5*(c0[i]+c1[i]);
+        this.m2[i]=0.5*(c1[i]+z1[i]);
+        this.m3[i]=0.5*(this.m0[i]+m1);
+        this.m4[i]=0.5*(m1+this.m2[i]);
+        this.m5[i]=0.5*(this.m3[i]+this.m4[i]);
+    }
+}
+
+function unit(v) {
+    var norm=Math.sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
+    norm=(norm != 0) ? 1/norm : 1;
+    return [v[0]*norm,v[1]*norm,v[2]*norm];
+}
+
+// Store the vertex v and its color vector c in the buffer.
+function vertex(v,c) {
+    vertices.push(v[0]);
+    vertices.push(v[1]);
+    vertices.push(v[2]);
+
+    colors.push(c[0]);
+    colors.push(c[1]);
+    colors.push(c[2]);
+    colors.push(c[3]);
+    return nvertices++;
+}
+
+function abs2(v) {
+    return v[0]*v[0]+v[1]*v[1]+v[2]*v[2];
+}
+
+function dot(u, v) {
+    return u[0]*v[0]+u[1]*v[1]+u[2]*v[2];
+}
+
+function cross(u, v) {
+    return [u[1]*v[2]-u[2]*v[1],
+            u[2]*v[0]-u[0]*v[2],
+            u[0]*v[1]-u[1]*v[0]
+           ];
+}
+
+function normal(left3, left2, left1, middle, right1, right2, right3) {
+    var u0=right1[0]-middle[0];
+    var v0=left1[0]-middle[0];
+    var u1=right1[1]-middle[1];
+    var v1=left1[1]-middle[1];
+    var u2=right1[2]-middle[2];
+    var v2=left1[2]-middle[2];
+    var n=[
+        u1*v2-u2*v1,
+        u2*v0-u0*v2,
+        u0*v1-u1*v0
+    ];
+    if(abs2(n) > epsilon)
+        return unit(n);
+
+    var lp=[v0,v1,v2];
+    var rp=[u0,u1,u2];
+    var lpp=[middle[0]+left2[0]-2*left1[0],
+             middle[1]+left2[1]-2*left1[1],
+             middle[2]+left2[2]-2*left1[2]
+            ];
+    var rpp=[middle[0]+right2[0]-2*right1[0],
+             middle[1]+right2[1]-2*right1[1],
+             middle[2]+right2[2]-2*right1[2]
+            ];
+    var a=cross(rpp,lp);
+    var b=cross(rp,lpp);
+    n=[a[0]+b[0],
+       a[1]+b[1],
+       a[2]+b[2]
+      ];
+    if(abs2(n) > epsilon)
+        return unit(n);
+
+    var lppp=[left3[0]-middle[0]+3*(left1[0]-left2[0]),
+              left3[1]-middle[1]+3*(left1[1]-left2[1]),
+              left3[2]-middle[2]+3*(left1[2]-left2[2])
+             ];
+    var rppp=[right3[0]-middle[0]+3*(right1[0]-right2[0]),
+              right3[1]-middle[1]+3*(right1[1]-right2[1]),
+              right3[2]-middle[2]+3*(right1[2]-right2[2])
+             ];
+    a=cross(rpp,lpp);
+    b=cross(rp,lppp);
+    var c=cross(rppp,lp);
+    var d=cross(rppp,lpp);
+    var e=cross(rpp,lppp);
+    var f=cross(rppp,lppp);
+    return unit([9*a[0]+3*(b[0]+c[0]+d[0]+e[0])+f[0],
+                 9*a[1]+3*(b[1]+c[1]+d[1]+e[1])+f[1],
+                 9*a[2]+3*(b[2]+c[2]+d[2]+e[2])+f[2]
+                ]);
+}
+
+// return the maximum distance squared of points c0 and c1 from 
+// the respective internal control points of z0--z1.
+function Straightness(z0,c0,c1,z1)
+{
+    var third=1.0/3.0;
+    var v=[third*(z1[0]-z0[0]),third*(z1[1]-z0[1]),third*(z1[2]-z0[2])];
+    return Math.max(abs2([c0[0]-v[0]-z0[0],c0[1]-v[1]-z0[1],c0[2]-v[2]-z0[2]]),
+                    abs2([z1[0]-v[0]-c1[0],z1[1]-v[1]-c1[1],z1[2]-v[2]-c1[2]]));
+}
+
+// return the maximum perpendicular distance squared of points c0 and c1
+// from z0--z1.
+function Distance1(z0, c0, c1, z1) {
+    var Z0=[c0[0]-z0[0],c0[1]-z0[1],c0[2]-z0[2]];
+    var Q=unit([z1[0]-z0[0],z1[1]-z0[1],z1[2]-z0[2]]);
+    var Z1=[c1[0]-z0[0],c1[1]-z0[1],c1[2]-z0[2]];
+    var p0=dot(Z0,Q);
+    var p1=dot(Z1,Q);
+    return Math.max(abs2([Z0[0]-p0*Q[0],Z0[1]-p0*Q[1],Z0[2]-p0*Q[2]]),
+                    abs2([Z1[0]-p1*Q[0],Z1[1]-p1*Q[1],Z1[2]-p1*Q[2]]));
+}
+
+// return the perpendicular distance squared of a point z from the plane
+// through u with unit normal n.
+function Distance2(z, u, n) {
+    var d=dot([z[0]-u[0],z[1]-u[1],z[2]-u[2]],n);
+    return d*d;
+}
+
+function Distance(p) {
+    var p0=p[0];
+    var p3=p[3];
+    var p12=p[12];
+    var p15=p[15];
+
+    // Check the flatness of the quad.
+    var d=Distance2(p15,p0,normal(p3,p[2],p[1],p0,p[4],p[8],p12));
+    
+    // Determine how straight the edges are.
+    d=Math.max(d,Straightness(p0,p[1],p[2],p3));
+    d=Math.max(d,Straightness(p0,p[4],p[8],p12));
+    d=Math.max(d,Straightness(p3,p[7],p[11],p15));
+    d=Math.max(d,Straightness(p12,p[13],p[14],p15));
+    
+    // Determine how straight the interior control curves are.
+    d=Math.max(d,Straightness(p[4],p[5],p[6],p[7]));
+    d=Math.max(d,Straightness(p[8],p[9],p[10],p[11]));
+    d=Math.max(d,Straightness(p[1],p[5],p[9],p[13]));
+    return Math.max(d,Straightness(p[2],p[6],p[10],p[14]));
+}
+
+var k=1;
+// Return color associated with unit normal vector n.
+function color(n) {
+    var Ldotn=L[0]*n[0]+L[1]*n[1]+L[2]*n[2];
+    if(Ldotn < 0) Ldotn=0;
+    var p=[emissive[0]+ambient[0]*Ambient[0]+Ldotn*diffuse[0]*Diffuse[0],
+           emissive[1]+ambient[1]*Ambient[1]+Ldotn*diffuse[1]*Diffuse[1],
+           emissive[2]+ambient[2]*Ambient[2]+Ldotn*diffuse[2]*Diffuse[2]
+          ];
+    var s=shininess*128;
+    var H=unit([L[0],L[1],L[2]+1]);
+    var f=Math.pow(H[0]*n[0]+H[1]*n[1]+H[2]*n[2],s);
+
+    if(Ldotn > 0) // Phong-Blinn model of specular reflection
+        p=[p[0]+f*specular[0]*Specular[0],p[1]+f*specular[1]*Specular[1],
+           p[2]+f*specular[2]*Specular[2]
+          ];
+
+    return [p[0],p[1],p[2],1];
+}
+
+function render(p, I0, I1, I2, I3, P0, P1, P2, P3, flat0, flat1, flat2, flat3,
+                C0, C1, C2, C3) {
+    if(Distance(p) < res2) { // Patch is flat
+        indices.push(I0);
+        indices.push(I1);
+        indices.push(I2);
+
+        indices.push(I0);
+        indices.push(I2);
+        indices.push(I3);
+        return;
+    }
+
+    var p0=p[0];
+    var p3=p[3];
+    var p12=p[12];
+    var p15=p[15];
+
+    var c0=new Split3(p0,p[1],p[2],p3);
+    var c1=new Split3(p[4],p[5],p[6],p[7]);
+    var c2=new Split3(p[8],p[9],p[10],p[11]);
+    var c3=new Split3(p12,p[13],p[14],p15);
+    var c4=new Split3(p0,p[4],p[8],p12);
+    var c5=new Split3(c0.m0,c1.m0,c2.m0,c3.m0);
+    var c6=new Split3(c0.m3,c1.m3,c2.m3,c3.m3);
+    var c7=new Split3(c0.m5,c1.m5,c2.m5,c3.m5);
+    var c8=new Split3(c0.m4,c1.m4,c2.m4,c3.m4);
+    var c9=new Split3(c0.m2,c1.m2,c2.m2,c3.m2);
+    var c10=new Split3(p3,p[7],p[11],p15);
+
+    var s0=[p0,c0.m0,c0.m3,c0.m5,c4.m0,c5.m0,c6.m0,c7.m0,
+            c4.m3,c5.m3,c6.m3,c7.m3,c4.m5,c5.m5,c6.m5,c7.m5
+           ];
+    var s1=[c4.m5,c5.m5,c6.m5,c7.m5,c4.m4,c5.m4,c6.m4,c7.m4,
+            c4.m2,c5.m2,c6.m2,c7.m2,p12,c3.m0,c3.m3,c3.m5
+           ];
+    var s2=[c7.m5,c8.m5,c9.m5,c10.m5,c7.m4,c8.m4,c9.m4,c10.m4,
+            c7.m2,c8.m2,c9.m2,c10.m2,c3.m5,c3.m4,c3.m2,p15
+           ];
+    var s3=[c0.m5,c0.m4,c0.m2,p3,c7.m0,c8.m0,c9.m0,c10.m0,
+            c7.m3,c8.m3,c9.m3,c10.m3,c7.m5,c8.m5,c9.m5,c10.m5
+           ];
+
+    var m4=s0[15];
+
+    var n0=normal(s0[0],s0[4],s0[8],s0[12],s0[13],s0[14],s0[15]);
+    if(n0 == 0.0) {
+        n0=normal(s0[0],s0[4],s0[8],s0[12],s0[11],s0[7],s0[3]);
+        if(n0 == 0.0) n0=normal(s0[3],s0[2],s0[1],s0[0],s0[13],s0[14],s0[15]);
+    }
+
+    var n1=normal(s1[12],s1[13],s1[14],s1[15],s1[11],s1[7],s1[3]);
+    if(n1 == 0.0) {
+        n1=normal(s1[12],s1[13],s1[14],s1[15],s1[2],s1[1],s1[0]);
+        if(n1 == 0.0) n1=normal(s1[0],s1[4],s1[8],s1[12],s1[11],s1[7],s1[3]);
+    }
+
+    var n2=normal(s2[15],s2[11],s2[7],s2[3],s2[2],s2[1],s2[0]);
+    if(n2 == 0.0) {
+        n2=normal(s2[15],s2[11],s2[7],s2[3],s2[4],s2[8],s2[12]);
+        if(n2 == 0.0) n2=normal(s2[12],s2[13],s2[14],s2[15],s2[2],s2[1],s2[0]);
+    }
+
+    var n3=normal(s3[3],s3[2],s3[1],s3[0],s3[4],s3[8],s3[12]);
+    if(n3 == 0.0) {
+        n3=normal(s3[3],s3[2],s3[1],s3[0],s3[13],s3[14],s3[15]);
+        if(n3 == 0.0) n3=normal(s3[15],s3[11],s3[7],s3[3],s3[4],s3[8],s3[12]);
+    }
+
+    var n4=normal(s2[3],s2[2],s2[1],m4,s2[4],s2[8],s2[12]);
+
+    var m0,m1,m2,m3;
+
+    // A kludge to remove subdivision cracks, only applied the first time
+    // an edge is found to be flat before the rest of the subpatch is.
+    if(flat0)
+        m0=[0.5*(P0[0]+P1[0]),0.5*(P0[1]+P1[1]),0.5*(P0[2]+P1[2])];
+    else {
+        if((flat0=Distance1(p0,p[4],p[8],p12) < res2)) {
+            var u=s0[12];
+            var v=s2[3];
+            var e=unit([u[0]-v[0],u[1]-v[1],u[2]-v[2]]);
+            m0=[0.5*(P0[0]+P1[0])+Epsilon*e[0],0.5*(P0[1]+P1[1])+Epsilon*e[1],
+                0.5*(P0[2]+P1[2])+Epsilon*e[2]
+               ];
+        } else
+            m0=s0[12];
+    }
+
+    if(flat1)
+        m1=[0.5*(P1[0]+P2[0]),0.5*(P1[1]+P2[1]),0.5*(P1[2]+P2[2])];
+    else {
+        if((flat1=Distance1(p12,p[13],p[14],p15) < res2)) {
+            var u=s1[15];
+            var v=s3[0];
+            var e=unit([u[0]-v[0],u[1]-v[1],u[2]-v[2]]);
+            m1=[0.5*(P1[0]+P2[0])+Epsilon*e[0],0.5*(P1[1]+P2[1])+Epsilon*e[1],
+                0.5*(P1[2]+P2[2])+Epsilon*e[2]
+               ];
+        } else
+            m1=s1[15];
+    }
+
+    if(flat2)
+        m2=[0.5*(P2[0]+P3[0]),0.5*(P2[1]+P3[1]),0.5*(P2[2]+P3[2])];
+    else {
+        if((flat2=Distance1(p15,p[11],p[7],p3) < res2)) {
+            var u=s2[3];
+            var v=s0[12];
+            var e=unit([u[0]-v[0],u[1]-v[1],u[2]-v[2]]);
+            m2=[0.5*(P2[0]+P3[0])+Epsilon*e[0],0.5*(P2[1]+P3[1])+Epsilon*e[1],
+                0.5*(P2[2]+P3[2])+Epsilon*e[2]
+               ];
+        } else
+            m2=s2[3];
+    }
+
+    if(flat3)
+        m3=[0.5*(P3[0]+P0[0]),0.5*(P3[1]+P0[1]),0.5*(P3[2]+P0[2])];
+    else {
+        if((flat3=Distance1(p3,p[2],p[1],p0) < res2)) {
+            var u=s3[0];
+            var v=s1[15];
+            var e=unit([u[0]-v[0],u[1]-v[1],u[2]-v[2]]);
+            m3=[0.5*(P3[0]+P0[0])+Epsilon*e[0],
+                0.5*(P3[1]+P0[1])+Epsilon*e[1],
+                0.5*(P3[2]+P0[2])+Epsilon*e[2]
+               ];
+        } else
+            m3=s3[0];
+    }
+
+    //  document.write(n0);      
+    //  document.write(" < br > ");
+
+    {
+        /*
+          var c0=new Array(4);
+          var c1=new Array(4);
+          var c2=new Array(4);
+          var c3=new Array(4);
+          var c4=new Array(4);
+          
+          for(var i=0; i < 4; ++i) {
+          c0[i]=0.5*(C0[i]+C1[i]);
+          c1[i]=0.5*(C1[i]+C2[i]);
+          c2[i]=0.5*(C2[i]+C3[i]);
+          c3[i]=0.5*(C3[i]+C0[i]);
+          c4[i]=0.5*(c0[i]+c2[i]);
+          }
+       */
+
+        var c0=color(n0);
+        var c1=color(n1);
+        var c2=color(n2);
+        var c3=color(n3);
+        var c4=color(n4);
+
+
+        var i0=vertex(m0,c0);
+        var i1=vertex(m1,c1);
+        var i2=vertex(m2,c2);
+        var i3=vertex(m3,c3);
+        var i4=vertex(m4,c4);
+
+        render(s0,I0,i0,i4,i3,P0,m0,m4,m3,flat0,false,false,flat3,
+               C0,c0,c4,c3);
+        render(s1,i0,I1,i1,i4,m0,P1,m1,m4,flat0,flat1,false,false,
+               c0,C1,c1,c4);
+        render(s2,i4,i1,I2,i2,m4,m1,P2,m2,false,flat1,flat2,false,
+               c4,c1,C2,c2);
+        render(s3,i3,i4,i2,I3,m3,m4,m2,P3,false,false,flat2,flat3,
+               c3,c4,c2,C3);
+    }
+}
+
+
+function draw(p) {
+    var p0=p[0];
+    var p3=p[3];
+    var p12=p[12];
+    var p15=p[15];
+
+    epsilon=0;
+    for(var i=1; i < 16; ++i)
+        epsilon=Math.max(epsilon,
+                         abs2([p[i][0]-p0[0],p[i][1]-p0[1],p[i][2]-p0[2]]));
+    epsilon *= Fuzz2;
+
+    var n0=normal(p3,p[2],p[1],p0,p[4],p[8],p12);
+    var n1=normal(p0,p[4],p[8],p12,p[13],p[14],p15);
+    var n2=normal(p12,p[13],p[14],p15,p[11],p[7],p3);
+    var n3=normal(p15,p[11],p[7],p3,p[2],p[1],p0);
+
+    var c0=color(n0);
+    var c1=color(n1);
+    var c2=color(n2);
+    var c3=color(n3);
+
+    var i0=vertex(p0,c0);
+    var i1=vertex(p12,c1);
+    var i2=vertex(p15,c2);
+    var i3=vertex(p3,c3);
+
+    render(p,i0,i1,i2,i3,p0,p12,p15,p3,false,false,false,false,
+           c0,c1,c2,c3);
+
+    drawBuffer();
+}
+
+var p=[];
+
+function tick() {
+    requestAnimationFrame(tick);
+    if(redraw) {
+        sceneSetup();
+        mat4.translate(mvMatrix,mvMatrix,[-0.5,-0.5,-1.5]);
+        setMatrixUniforms();
+        for(var i=0; i < p.length; ++i)
+            draw(p[i]);
+        redraw=false;
+    }
+}
+
+function webGLStart() {
+    var canvas=document.getElementById("Asymptote");
+    initGL(canvas);
+    initShaders();
+    gl.clearColor(0.0,0.0,0.0,1.0);
+    gl.enable(gl.DEPTH_TEST);
+
+    indexExt=gl.getExtension("OES_element_index_uint");
+
+    gl.viewport(0,0,gl.viewportWidth,gl.viewportHeight);
+    setBuffer();
+
+    canvas.onmousedown=handleMouseDown;
+    document.onmouseup=handleMouseUpOrTouchEnd;
+    document.onmousemove=handleMouseMove;
+    canvas.onkeydown=handleKey;
+    document.onwheel=handleMouseWheel;
+
+    canvas.addEventListener("touchstart",handleTouchStart,false);
+    canvas.addEventListener("touchend",handleMouseUpOrTouchEnd,false);
+    canvas.addEventListener("touchcancel",handleMouseUpOrTouchEnd,false);
+    canvas.addEventListener("touchleave",handleMouseUpOrTouchEnd,false);
+    canvas.addEventListener("touchmove",handleTouchMove,false);
+
+    tick();
+}
+
+
+// Lighting parameters
+var L = [0.447735768366173, 0.497260947684137, 0.743144825477394];
+var Ambient = [0.1, 0.1, 0.1];
+var Diffuse = [0.8, 0.8, 0.8, 1];
+var Specular = [0.7, 0.7, 0.7, 1];
+var specularfactor = 3;
+
+// Material parameters
+var emissive = [0, 0, 0, 1];
+var ambient = [1, 1, 1, 1];
+var diffuse = [0, 1, 0, 1];
+var specular = [0.75, 0.75, 0.75, 1];
+var shininess = 0.5;

Added: trunk/Build/source/utils/asymptote/webgl/gl-matrix-min-2.3.2.js
===================================================================
--- trunk/Build/source/utils/asymptote/webgl/gl-matrix-min-2.3.2.js	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/webgl/gl-matrix-min-2.3.2.js	2019-03-27 22:27:57 UTC (rev 50622)
@@ -0,0 +1,29 @@
+/**
+ * @fileoverview gl-matrix - High performance matrix and vector operations
+ * @author Brandon Jones
+ * @author Colin MacKenzie IV
+ * @version 2.3.2
+ */
+
+/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE. */
+
+!function(t,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var n=a();for(var r in n)("object"==typeof exports?exports:t)[r]=n[r]}}(this,function(){return function(t){function a(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return t[r].call(o.exports,o,o.exports,a),o.loaded=!0,o.exports}var n={};return a.m=t,a.c=n,a.p="",a(0)}([function(t,a,n){a.glMatrix=n(1),a.mat2=n(2),a.mat2d=n(3),a.mat3=n(4),a.mat4=n(5),a.quat=n(6),a.vec2=n(9),a.vec3=n(7),a.vec4=n(8)},function(t,a){var n={};n.EPSILON=1e-6,n.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,n.RANDOM=Math.random,n.ENABLE_SIMD=!1,n.SIMD_AVAILABLE=n.ARRAY_TYPE===Float32Array&&"SIMD"in this,n.USE_SIMD=n.ENABLE_SIMD&&n.SIMD_AVAILABLE,n.setMatrixArrayType=function(t){n.ARRAY_TYPE=t};var r=Math.PI/180;n.toRadian=function(t){return t*r},n.equals=function(t,a){return Math.abs(t-a)<=n.EPSILON*Math.max(1,Math.abs(t),Math.abs(a))},t.exports=n},function(t,a,n){var r=n(1),o={};o.create=function(){var t=new r.ARRAY_TYPE(4);return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},o.clone=function(t){var a=new r.ARRAY_TYPE(4);return a[0]=t[0],a[1]=t[1],a[2]=t[2],a[3]=t[3],a},o.copy=function(t,a){return t[0]=a[0],t[1]=a[1],t[2]=a[2],t[3]=a[3],t},o.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},o.fromValues=function(t,a,n,o){var u=new r.ARRAY_TYPE(4);return u[0]=t,u[1]=a,u[2]=n,u[3]=o,u},o.set=function(t,a,n,r,o){return t[0]=a,t[1]=n,t[2]=r,t[3]=o,t},o.transpose=function(t,a){if(t===a){var n=a[1];t[1]=a[2],t[2]=n}else t[0]=a[0],t[1]=a[2],t[2]=a[1],t[3]=a[3];return t},o.invert=function(t,a){var n=a[0],r=a[1],o=a[2],u=a[3],l=n*u-o*r;return l?(l=1/l,t[0]=u*l,t[1]=-r*l,t[2]=-o*l,t[3]=n*l,t):null},o.adjoint=function(t,a){var n=a[0];return t[0]=a[3],t[1]=-a[1],t[2]=-a[2],t[3]=n,t},o.determinant=function(t){return t[0]*t[3]-t[2]*t[1]},o.multiply=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=a[3],e=n[0],M=n[1],s=n[2],i=n[3];return t[0]=r*e+u*M,t[1]=o*e+l*M,t[2]!
 =r*s+u*i,t[3]=o*s+l*i,t},o.mul=o.multiply,o.rotate=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=a[3],e=Math.sin(n),M=Math.cos(n);return t[0]=r*M+u*e,t[1]=o*M+l*e,t[2]=r*-e+u*M,t[3]=o*-e+l*M,t},o.scale=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=a[3],e=n[0],M=n[1];return t[0]=r*e,t[1]=o*e,t[2]=u*M,t[3]=l*M,t},o.fromRotation=function(t,a){var n=Math.sin(a),r=Math.cos(a);return t[0]=r,t[1]=n,t[2]=-n,t[3]=r,t},o.fromScaling=function(t,a){return t[0]=a[0],t[1]=0,t[2]=0,t[3]=a[1],t},o.str=function(t){return"mat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},o.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2))},o.LDU=function(t,a,n,r){return t[2]=r[2]/r[0],n[0]=r[0],n[1]=r[1],n[3]=r[3]-t[2]*n[1],[t,a,n]},o.add=function(t,a,n){return t[0]=a[0]+n[0],t[1]=a[1]+n[1],t[2]=a[2]+n[2],t[3]=a[3]+n[3],t},o.subtract=function(t,a,n){return t[0]=a[0]-n[0],t[1]=a[1]-n[1],t[2]=a[2]-n[2],t[3]=a[3]-n[3],t},o.sub=o.subtract,o.exactEquals=function(t,a){return t[0]===a[0]&&t[1]===a[1]&&t[2]===a[2]&&t[3]===a[3]},o.equals=function(t,a){var n=t[0],o=t[1],u=t[2],l=t[3],e=a[0],M=a[1],s=a[2],i=a[3];return Math.abs(n-e)<=r.EPSILON*Math.max(1,Math.abs(n),Math.abs(e))&&Math.abs(o-M)<=r.EPSILON*Math.max(1,Math.abs(o),Math.abs(M))&&Math.abs(u-s)<=r.EPSILON*Math.max(1,Math.abs(u),Math.abs(s))&&Math.abs(l-i)<=r.EPSILON*Math.max(1,Math.abs(l),Math.abs(i))},o.multiplyScalar=function(t,a,n){return t[0]=a[0]*n,t[1]=a[1]*n,t[2]=a[2]*n,t[3]=a[3]*n,t},o.multiplyScalarAndAdd=function(t,a,n,r){return t[0]=a[0]+n[0]*r,t[1]=a[1]+n[1]*r,t[2]=a[2]+n[2]*r,t[3]=a[3]+n[3]*r,t},t.exports=o},function(t,a,n){var r=n(1),o={};o.create=function(){var t=new r.ARRAY_TYPE(6);return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},o.clone=function(t){var a=new r.ARRAY_TYPE(6);return a[0]=t[0],a[1]=t[1],a[2]=t[2],a[3]=t[3],a[4]=t[4],a[5]=t[5],a},o.copy=function(t,a){return t[0]=a[0],t[1]=a[1],t[2]=a[2],t[3]=a[3],t[4]=a[4],t[5]=a[5],t},o.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},o.fromValues=function(t,a,n,o!
 ,u,l){var e=new r.ARRAY_TYPE(6);return e[0]=t,e[1]=a,e[2]=n,e[3]=o,e[4]=u,e[5]=l,e},o.set=function(t,a,n,r,o,u,l){return t[0]=a,t[1]=n,t[2]=r,t[3]=o,t[4]=u,t[5]=l,t},o.invert=function(t,a){var n=a[0],r=a[1],o=a[2],u=a[3],l=a[4],e=a[5],M=n*u-r*o;return M?(M=1/M,t[0]=u*M,t[1]=-r*M,t[2]=-o*M,t[3]=n*M,t[4]=(o*e-u*l)*M,t[5]=(r*l-n*e)*M,t):null},o.determinant=function(t){return t[0]*t[3]-t[1]*t[2]},o.multiply=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=a[3],e=a[4],M=a[5],s=n[0],i=n[1],c=n[2],h=n[3],S=n[4],I=n[5];return t[0]=r*s+u*i,t[1]=o*s+l*i,t[2]=r*c+u*h,t[3]=o*c+l*h,t[4]=r*S+u*I+e,t[5]=o*S+l*I+M,t},o.mul=o.multiply,o.rotate=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=a[3],e=a[4],M=a[5],s=Math.sin(n),i=Math.cos(n);return t[0]=r*i+u*s,t[1]=o*i+l*s,t[2]=r*-s+u*i,t[3]=o*-s+l*i,t[4]=e,t[5]=M,t},o.scale=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=a[3],e=a[4],M=a[5],s=n[0],i=n[1];return t[0]=r*s,t[1]=o*s,t[2]=u*i,t[3]=l*i,t[4]=e,t[5]=M,t},o.translate=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=a[3],e=a[4],M=a[5],s=n[0],i=n[1];return t[0]=r,t[1]=o,t[2]=u,t[3]=l,t[4]=r*s+u*i+e,t[5]=o*s+l*i+M,t},o.fromRotation=function(t,a){var n=Math.sin(a),r=Math.cos(a);return t[0]=r,t[1]=n,t[2]=-n,t[3]=r,t[4]=0,t[5]=0,t},o.fromScaling=function(t,a){return t[0]=a[0],t[1]=0,t[2]=0,t[3]=a[1],t[4]=0,t[5]=0,t},o.fromTranslation=function(t,a){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=a[0],t[5]=a[1],t},o.str=function(t){return"mat2d("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+")"},o.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+1)},o.add=function(t,a,n){return t[0]=a[0]+n[0],t[1]=a[1]+n[1],t[2]=a[2]+n[2],t[3]=a[3]+n[3],t[4]=a[4]+n[4],t[5]=a[5]+n[5],t},o.subtract=function(t,a,n){return t[0]=a[0]-n[0],t[1]=a[1]-n[1],t[2]=a[2]-n[2],t[3]=a[3]-n[3],t[4]=a[4]-n[4],t[5]=a[5]-n[5],t},o.sub=o.subtract,o.multiplyScalar=function(t,a,n){return t[0]=a[0]*n,t[1]=a[1]*n,t[2]=a[2]*n,t[3]=a[3]*n,t[4]=a[4]*n,t[5]=a[5]*n,t},o.multiplyScalarAndAdd=function(t,a,n,r){ret!
 urn t[0]=a[0]+n[0]*r,t[1]=a[1]+n[1]*r,t[2]=a[2]+n[2]*r,t[3]=a[3]+n[3]*r,t[4]=a[4]+n[4]*r,t[5]=a[5]+n[5]*r,t},o.exactEquals=function(t,a){return t[0]===a[0]&&t[1]===a[1]&&t[2]===a[2]&&t[3]===a[3]&&t[4]===a[4]&&t[5]===a[5]},o.equals=function(t,a){var n=t[0],o=t[1],u=t[2],l=t[3],e=t[4],M=t[5],s=a[0],i=a[1],c=a[2],h=a[3],S=a[4],I=a[5];return Math.abs(n-s)<=r.EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(o-i)<=r.EPSILON*Math.max(1,Math.abs(o),Math.abs(i))&&Math.abs(u-c)<=r.EPSILON*Math.max(1,Math.abs(u),Math.abs(c))&&Math.abs(l-h)<=r.EPSILON*Math.max(1,Math.abs(l),Math.abs(h))&&Math.abs(e-S)<=r.EPSILON*Math.max(1,Math.abs(e),Math.abs(S))&&Math.abs(M-I)<=r.EPSILON*Math.max(1,Math.abs(M),Math.abs(I))},t.exports=o},function(t,a,n){var r=n(1),o={};o.create=function(){var t=new r.ARRAY_TYPE(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},o.fromMat4=function(t,a){return t[0]=a[0],t[1]=a[1],t[2]=a[2],t[3]=a[4],t[4]=a[5],t[5]=a[6],t[6]=a[8],t[7]=a[9],t[8]=a[10],t},o.clone=function(t){var a=new r.ARRAY_TYPE(9);return a[0]=t[0],a[1]=t[1],a[2]=t[2],a[3]=t[3],a[4]=t[4],a[5]=t[5],a[6]=t[6],a[7]=t[7],a[8]=t[8],a},o.copy=function(t,a){return t[0]=a[0],t[1]=a[1],t[2]=a[2],t[3]=a[3],t[4]=a[4],t[5]=a[5],t[6]=a[6],t[7]=a[7],t[8]=a[8],t},o.fromValues=function(t,a,n,o,u,l,e,M,s){var i=new r.ARRAY_TYPE(9);return i[0]=t,i[1]=a,i[2]=n,i[3]=o,i[4]=u,i[5]=l,i[6]=e,i[7]=M,i[8]=s,i},o.set=function(t,a,n,r,o,u,l,e,M,s){return t[0]=a,t[1]=n,t[2]=r,t[3]=o,t[4]=u,t[5]=l,t[6]=e,t[7]=M,t[8]=s,t},o.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},o.transpose=function(t,a){if(t===a){var n=a[1],r=a[2],o=a[5];t[1]=a[3],t[2]=a[6],t[3]=n,t[5]=a[7],t[6]=r,t[7]=o}else t[0]=a[0],t[1]=a[3],t[2]=a[6],t[3]=a[1],t[4]=a[4],t[5]=a[7],t[6]=a[2],t[7]=a[5],t[8]=a[8];return t},o.invert=function(t,a){var n=a[0],r=a[1],o=a[2],u=a[3],l=a[4],e=a[5],M=a[6],s=a[7],i=a[8],c=i*l-e*s,h=-i*u+e*M,S=s*u-l*M,I=n*c+r*h+o*S;return I?(I=1/I,t[0]=c*I,t[1]=(-i*r+o*s)*I,t[2]=(e*r-o*l)*I,t[3]=h*I,t[4]=(i*n-o*!
 M)*I,t[5]=(-e*n+o*u)*I,t[6]=S*I,t[7]=(-s*n+r*M)*I,t[8]=(l*n-r*u)*I,t):null},o.adjoint=function(t,a){var n=a[0],r=a[1],o=a[2],u=a[3],l=a[4],e=a[5],M=a[6],s=a[7],i=a[8];return t[0]=l*i-e*s,t[1]=o*s-r*i,t[2]=r*e-o*l,t[3]=e*M-u*i,t[4]=n*i-o*M,t[5]=o*u-n*e,t[6]=u*s-l*M,t[7]=r*M-n*s,t[8]=n*l-r*u,t},o.determinant=function(t){var a=t[0],n=t[1],r=t[2],o=t[3],u=t[4],l=t[5],e=t[6],M=t[7],s=t[8];return a*(s*u-l*M)+n*(-s*o+l*e)+r*(M*o-u*e)},o.multiply=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=a[3],e=a[4],M=a[5],s=a[6],i=a[7],c=a[8],h=n[0],S=n[1],I=n[2],f=n[3],x=n[4],D=n[5],F=n[6],m=n[7],d=n[8];return t[0]=h*r+S*l+I*s,t[1]=h*o+S*e+I*i,t[2]=h*u+S*M+I*c,t[3]=f*r+x*l+D*s,t[4]=f*o+x*e+D*i,t[5]=f*u+x*M+D*c,t[6]=F*r+m*l+d*s,t[7]=F*o+m*e+d*i,t[8]=F*u+m*M+d*c,t},o.mul=o.multiply,o.translate=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=a[3],e=a[4],M=a[5],s=a[6],i=a[7],c=a[8],h=n[0],S=n[1];return t[0]=r,t[1]=o,t[2]=u,t[3]=l,t[4]=e,t[5]=M,t[6]=h*r+S*l+s,t[7]=h*o+S*e+i,t[8]=h*u+S*M+c,t},o.rotate=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=a[3],e=a[4],M=a[5],s=a[6],i=a[7],c=a[8],h=Math.sin(n),S=Math.cos(n);return t[0]=S*r+h*l,t[1]=S*o+h*e,t[2]=S*u+h*M,t[3]=S*l-h*r,t[4]=S*e-h*o,t[5]=S*M-h*u,t[6]=s,t[7]=i,t[8]=c,t},o.scale=function(t,a,n){var r=n[0],o=n[1];return t[0]=r*a[0],t[1]=r*a[1],t[2]=r*a[2],t[3]=o*a[3],t[4]=o*a[4],t[5]=o*a[5],t[6]=a[6],t[7]=a[7],t[8]=a[8],t},o.fromTranslation=function(t,a){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=a[0],t[7]=a[1],t[8]=1,t},o.fromRotation=function(t,a){var n=Math.sin(a),r=Math.cos(a);return t[0]=r,t[1]=n,t[2]=0,t[3]=-n,t[4]=r,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},o.fromScaling=function(t,a){return t[0]=a[0],t[1]=0,t[2]=0,t[3]=0,t[4]=a[1],t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},o.fromMat2d=function(t,a){return t[0]=a[0],t[1]=a[1],t[2]=0,t[3]=a[2],t[4]=a[3],t[5]=0,t[6]=a[4],t[7]=a[5],t[8]=1,t},o.fromQuat=function(t,a){var n=a[0],r=a[1],o=a[2],u=a[3],l=n+n,e=r+r,M=o+o,s=n*l,i=r*l,c=r*e,h=o*l,S=o*e,I=o*M,f=u*l,x=u*e,D=u*M;return t[0]=1-c-I,t[3]=i-D,t[6]=h+x,t[1]=i+D,t[4]=1-s-I,t[7]=S-f,t[2]=h-x,t[5]=S+f,t[8]=1-!
 s-c,t},o..normalFromMat4=function(t,a){var n=a[0],r=a[1],o=a[2],u=a[3],l=a[4],e=a[5],M=a[6],s=a[7],i=a[8],c=a[9],h=a[10],S=a[11],I=a[12],f=a[13],x=a[14],D=a[15],F=n*e-r*l,m=n*M-o*l,d=n*s-u*l,b=r*M-o*e,v=r*s-u*e,z=o*s-u*M,p=i*f-c*I,w=i*x-h*I,E=i*D-S*I,A=c*x-h*f,P=c*D-S*f,L=h*D-S*x,q=F*L-m*P+d*A+b*E-v*w+z*p;return q?(q=1/q,t[0]=(e*L-M*P+s*A)*q,t[1]=(M*E-l*L-s*w)*q,t[2]=(l*P-e*E+s*p)*q,t[3]=(o*P-r*L-u*A)*q,t[4]=(n*L-o*E+u*w)*q,t[5]=(r*E-n*P-u*p)*q,t[6]=(f*z-x*v+D*b)*q,t[7]=(x*d-I*z-D*m)*q,t[8]=(I*v-f*d+D*F)*q,t):null},o.str=function(t){return"mat3("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+")"},o.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2))},o.add=function(t,a,n){return t[0]=a[0]+n[0],t[1]=a[1]+n[1],t[2]=a[2]+n[2],t[3]=a[3]+n[3],t[4]=a[4]+n[4],t[5]=a[5]+n[5],t[6]=a[6]+n[6],t[7]=a[7]+n[7],t[8]=a[8]+n[8],t},o.subtract=function(t,a,n){return t[0]=a[0]-n[0],t[1]=a[1]-n[1],t[2]=a[2]-n[2],t[3]=a[3]-n[3],t[4]=a[4]-n[4],t[5]=a[5]-n[5],t[6]=a[6]-n[6],t[7]=a[7]-n[7],t[8]=a[8]-n[8],t},o.sub=o.subtract,o.multiplyScalar=function(t,a,n){return t[0]=a[0]*n,t[1]=a[1]*n,t[2]=a[2]*n,t[3]=a[3]*n,t[4]=a[4]*n,t[5]=a[5]*n,t[6]=a[6]*n,t[7]=a[7]*n,t[8]=a[8]*n,t},o.multiplyScalarAndAdd=function(t,a,n,r){return t[0]=a[0]+n[0]*r,t[1]=a[1]+n[1]*r,t[2]=a[2]+n[2]*r,t[3]=a[3]+n[3]*r,t[4]=a[4]+n[4]*r,t[5]=a[5]+n[5]*r,t[6]=a[6]+n[6]*r,t[7]=a[7]+n[7]*r,t[8]=a[8]+n[8]*r,t},o.exactEquals=function(t,a){return t[0]===a[0]&&t[1]===a[1]&&t[2]===a[2]&&t[3]===a[3]&&t[4]===a[4]&&t[5]===a[5]&&t[6]===a[6]&&t[7]===a[7]&&t[8]===a[8]},o.equals=function(t,a){var n=t[0],o=t[1],u=t[2],l=t[3],e=t[4],M=t[5],s=t[6],i=t[7],c=t[8],h=a[0],S=a[1],I=a[2],f=a[3],x=a[4],D=a[5],F=t[6],m=a[7],d=a[8];return Math.abs(n-h)<=r.EPSILON*Math.max(1,Math.abs(n),Math.abs(h))&&Math.abs(o-S)<=r.EPSILON*Math.max(1,Math.abs(o),Math.abs(S))&&Math.abs(u-I)<=r.EPSILON*Math.max(1,Math.abs(u),Math.abs(I))&&Math.!
 abs(l-f)<=r.EPSILON*Math.max(1,Math.abs(l),Math.abs(f))&&Math.abs(e-x)<=r.EPSILON*Math.max(1,Math.abs(e),Math.abs(x))&&Math.abs(M-D)<=r.EPSILON*Math.max(1,Math.abs(M),Math.abs(D))&&Math.abs(s-F)<=r.EPSILON*Math.max(1,Math.abs(s),Math.abs(F))&&Math.abs(i-m)<=r.EPSILON*Math.max(1,Math.abs(i),Math.abs(m))&&Math.abs(c-d)<=r.EPSILON*Math.max(1,Math.abs(c),Math.abs(d))},t.exports=o},function(t,a,n){var r=n(1),o={scalar:{},SIMD:{}};o.create=function(){var t=new r.ARRAY_TYPE(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.clone=function(t){var a=new r.ARRAY_TYPE(16);return a[0]=t[0],a[1]=t[1],a[2]=t[2],a[3]=t[3],a[4]=t[4],a[5]=t[5],a[6]=t[6],a[7]=t[7],a[8]=t[8],a[9]=t[9],a[10]=t[10],a[11]=t[11],a[12]=t[12],a[13]=t[13],a[14]=t[14],a[15]=t[15],a},o.copy=function(t,a){return t[0]=a[0],t[1]=a[1],t[2]=a[2],t[3]=a[3],t[4]=a[4],t[5]=a[5],t[6]=a[6],t[7]=a[7],t[8]=a[8],t[9]=a[9],t[10]=a[10],t[11]=a[11],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15],t},o.fromValues=function(t,a,n,o,u,l,e,M,s,i,c,h,S,I,f,x){var D=new r.ARRAY_TYPE(16);return D[0]=t,D[1]=a,D[2]=n,D[3]=o,D[4]=u,D[5]=l,D[6]=e,D[7]=M,D[8]=s,D[9]=i,D[10]=c,D[11]=h,D[12]=S,D[13]=I,D[14]=f,D[15]=x,D},o.set=function(t,a,n,r,o,u,l,e,M,s,i,c,h,S,I,f,x){return t[0]=a,t[1]=n,t[2]=r,t[3]=o,t[4]=u,t[5]=l,t[6]=e,t[7]=M,t[8]=s,t[9]=i,t[10]=c,t[11]=h,t[12]=S,t[13]=I,t[14]=f,t[15]=x,t},o.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.scalar.transpose=function(t,a){if(t===a){var n=a[1],r=a[2],o=a[3],u=a[6],l=a[7],e=a[11];t[1]=a[4],t[2]=a[8],t[3]=a[12],t[4]=n,t[6]=a[9],t[7]=a[13],t[8]=r,t[9]=u,t[11]=a[14],t[12]=o,t[13]=l,t[14]=e}else t[0]=a[0],t[1]=a[4],t[2]=a[8],t[3]=a[12],t[4]=a[1],t[5]=a[5],t[6]=a[9],t[7]=a[13],t[8]=a[2],t[9]=a[6],t[10]=a[10],t[11]=a[14],t[12]=a[3],t[13]=a[7],t[14]=a[11],t[15]=a[15];return t},o.SIMD.transpose=function(t,a){var n,r,o,u,l,e,M,s,i,c;return n=SIMD.Float32x4.load(a,!
 0),r=SIMD.Float32x4.load(a,4),o=SIMD.Float32x4.load(a,8),u=SIMD.Float32x4.load(a,12),l=SIMD.Float32x4.shuffle(n,r,0,1,4,5),e=SIMD.Float32x4.shuffle(o,u,0,1,4,5),M=SIMD.Float32x4.shuffle(l,e,0,2,4,6),s=SIMD.Float32x4.shuffle(l,e,1,3,5,7),SIMD.Float32x4.store(t,0,M),SIMD.Float32x4.store(t,4,s),l=SIMD.Float32x4.shuffle(n,r,2,3,6,7),e=SIMD.Float32x4.shuffle(o,u,2,3,6,7),i=SIMD.Float32x4.shuffle(l,e,0,2,4,6),c=SIMD.Float32x4.shuffle(l,e,1,3,5,7),SIMD.Float32x4.store(t,8,i),SIMD.Float32x4.store(t,12,c),t},o.transpose=r.USE_SIMD?o.SIMD.transpose:o.scalar.transpose,o.scalar.invert=function(t,a){var n=a[0],r=a[1],o=a[2],u=a[3],l=a[4],e=a[5],M=a[6],s=a[7],i=a[8],c=a[9],h=a[10],S=a[11],I=a[12],f=a[13],x=a[14],D=a[15],F=n*e-r*l,m=n*M-o*l,d=n*s-u*l,b=r*M-o*e,v=r*s-u*e,z=o*s-u*M,p=i*f-c*I,w=i*x-h*I,E=i*D-S*I,A=c*x-h*f,P=c*D-S*f,L=h*D-S*x,q=F*L-m*P+d*A+b*E-v*w+z*p;return q?(q=1/q,t[0]=(e*L-M*P+s*A)*q,t[1]=(o*P-r*L-u*A)*q,t[2]=(f*z-x*v+D*b)*q,t[3]=(h*v-c*z-S*b)*q,t[4]=(M*E-l*L-s*w)*q,t[5]=(n*L-o*E+u*w)*q,t[6]=(x*d-I*z-D*m)*q,t[7]=(i*z-h*d+S*m)*q,t[8]=(l*P-e*E+s*p)*q,t[9]=(r*E-n*P-u*p)*q,t[10]=(I*v-f*d+D*F)*q,t[11]=(c*d-i*v-S*F)*q,t[12]=(e*w-l*A-M*p)*q,t[13]=(n*A-r*w+o*p)*q,t[14]=(f*m-I*b-x*F)*q,t[15]=(i*b-c*m+h*F)*q,t):null},o.SIMD.invert=function(t,a){var n,r,o,u,l,e,M,s,i,c,h=SIMD.Float32x4.load(a,0),S=SIMD.Float32x4.load(a,4),I=SIMD.Float32x4.load(a,8),f=SIMD.Float32x4.load(a,12);return l=SIMD.Float32x4.shuffle(h,S,0,1,4,5),r=SIMD.Float32x4.shuffle(I,f,0,1,4,5),n=SIMD.Float32x4.shuffle(l,r,0,2,4,6),r=SIMD.Float32x4.shuffle(r,l,1,3,5,7),l=SIMD.Float32x4.shuffle(h,S,2,3,6,7),u=SIMD.Float32x4.shuffle(I,f,2,3,6,7),o=SIMD.Float32x4.shuffle(l,u,0,2,4,6),u=SIMD.Float32x4.shuffle(u,l,1,3,5,7),l=SIMD.Float32x4.mul(o,u),l=SIMD.Float32x4.swizzle(l,1,0,3,2),e=SIMD.Float32x4.mul(r,l),M=SIMD.Float32x4.mul(n,l),l=SIMD.Float32x4.swizzle(l,2,3,0,1),e=SIMD.Float32x4.sub(SIMD.Float32x4.mul(r,l),e),M=SIMD.Float32x4.sub(SIMD.Float32x4.mul(n,l),M),M=SIMD.Float32x4.swizzle(M,2,3,0,1),l=SIMD.Float32x4.mul(r,o),l=SIMD.Float32x4.swizzle(l,1,0,3,2),e=!
 SIMD.Float32x4.add(SIMD.Float32x4.mul(u,l),e),i=SIMD.Float32x4.mul(n,l),l=SIMD.Float32x4.swizzle(l,2,3,0,1),e=SIMD.Float32x4.sub(e,SIMD.Float32x4.mul(u,l)),i=SIMD.Float32x4.sub(SIMD.Float32x4.mul(n,l),i),i=SIMD.Float32x4.swizzle(i,2,3,0,1),l=SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(r,2,3,0,1),u),l=SIMD.Float32x4.swizzle(l,1,0,3,2),o=SIMD.Float32x4.swizzle(o,2,3,0,1),e=SIMD.Float32x4.add(SIMD.Float32x4.mul(o,l),e),s=SIMD.Float32x4.mul(n,l),l=SIMD.Float32x4.swizzle(l,2,3,0,1),e=SIMD.Float32x4.sub(e,SIMD.Float32x4.mul(o,l)),s=SIMD.Float32x4.sub(SIMD.Float32x4.mul(n,l),s),s=SIMD.Float32x4.swizzle(s,2,3,0,1),l=SIMD.Float32x4.mul(n,r),l=SIMD.Float32x4.swizzle(l,1,0,3,2),s=SIMD.Float32x4.add(SIMD.Float32x4.mul(u,l),s),i=SIMD.Float32x4.sub(SIMD.Float32x4.mul(o,l),i),l=SIMD.Float32x4.swizzle(l,2,3,0,1),s=SIMD.Float32x4.sub(SIMD.Float32x4.mul(u,l),s),i=SIMD.Float32x4.sub(i,SIMD.Float32x4.mul(o,l)),l=SIMD.Float32x4.mul(n,u),l=SIMD.Float32x4.swizzle(l,1,0,3,2),M=SIMD.Float32x4.sub(M,SIMD.Float32x4.mul(o,l)),s=SIMD.Float32x4.add(SIMD.Float32x4.mul(r,l),s),l=SIMD.Float32x4.swizzle(l,2,3,0,1),M=SIMD.Float32x4.add(SIMD.Float32x4.mul(o,l),M),s=SIMD.Float32x4.sub(s,SIMD.Float32x4.mul(r,l)),l=SIMD.Float32x4.mul(n,o),l=SIMD.Float32x4.swizzle(l,1,0,3,2),M=SIMD.Float32x4.add(SIMD.Float32x4.mul(u,l),M),i=SIMD.Float32x4.sub(i,SIMD.Float32x4.mul(r,l)),l=SIMD.Float32x4.swizzle(l,2,3,0,1),M=SIMD.Float32x4.sub(M,SIMD.Float32x4.mul(u,l)),i=SIMD.Float32x4.add(SIMD.Float32x4.mul(r,l),i),c=SIMD.Float32x4.mul(n,e),c=SIMD.Float32x4.add(SIMD.Float32x4.swizzle(c,2,3,0,1),c),c=SIMD.Float32x4.add(SIMD.Float32x4.swizzle(c,1,0,3,2),c),l=SIMD.Float32x4.reciprocalApproximation(c),c=SIMD.Float32x4.sub(SIMD.Float32x4.add(l,l),SIMD.Float32x4.mul(c,SIMD.Float32x4.mul(l,l))),(c=SIMD.Float32x4.swizzle(c,0,0,0,0))?(SIMD.Float32x4.store(t,0,SIMD.Float32x4.mul(c,e)),SIMD.Float32x4.store(t,4,SIMD.Float32x4.mul(c,M)),SIMD.Float32x4.store(t,8,SIMD.Float32x4.mul(c,s)),SIMD.Float32x4.store(t,12,SIMD.Float32x4.mul(c,i)),t):null},o.invert=r.USE_SIMD?o.SIMD.invert:o.sc!
 alar.invert,o.scalar.adjoint=function(t,a){var n=a[0],r=a[1],o=a[2],u=a[3],l=a[4],e=a[5],M=a[6],s=a[7],i=a[8],c=a[9],h=a[10],S=a[11],I=a[12],f=a[13],x=a[14],D=a[15];return t[0]=e*(h*D-S*x)-c*(M*D-s*x)+f*(M*S-s*h),t[1]=-(r*(h*D-S*x)-c*(o*D-u*x)+f*(o*S-u*h)),t[2]=r*(M*D-s*x)-e*(o*D-u*x)+f*(o*s-u*M),t[3]=-(r*(M*S-s*h)-e*(o*S-u*h)+c*(o*s-u*M)),t[4]=-(l*(h*D-S*x)-i*(M*D-s*x)+I*(M*S-s*h)),t[5]=n*(h*D-S*x)-i*(o*D-u*x)+I*(o*S-u*h),t[6]=-(n*(M*D-s*x)-l*(o*D-u*x)+I*(o*s-u*M)),t[7]=n*(M*S-s*h)-l*(o*S-u*h)+i*(o*s-u*M),t[8]=l*(c*D-S*f)-i*(e*D-s*f)+I*(e*S-s*c),t[9]=-(n*(c*D-S*f)-i*(r*D-u*f)+I*(r*S-u*c)),t[10]=n*(e*D-s*f)-l*(r*D-u*f)+I*(r*s-u*e),t[11]=-(n*(e*S-s*c)-l*(r*S-u*c)+i*(r*s-u*e)),t[12]=-(l*(c*x-h*f)-i*(e*x-M*f)+I*(e*h-M*c)),t[13]=n*(c*x-h*f)-i*(r*x-o*f)+I*(r*h-o*c),t[14]=-(n*(e*x-M*f)-l*(r*x-o*f)+I*(r*M-o*e)),t[15]=n*(e*h-M*c)-l*(r*h-o*c)+i*(r*M-o*e),t},o.SIMD.adjoint=function(t,a){var n,r,o,u,l,e,M,s,i,c,h,S,I,n=SIMD.Float32x4.load(a,0),r=SIMD.Float32x4.load(a,4),o=SIMD.Float32x4.load(a,8),u=SIMD.Float32x4.load(a,12);return i=SIMD.Float32x4.shuffle(n,r,0,1,4,5),e=SIMD.Float32x4.shuffle(o,u,0,1,4,5),l=SIMD.Float32x4.shuffle(i,e,0,2,4,6),e=SIMD.Float32x4.shuffle(e,i,1,3,5,7),i=SIMD.Float32x4.shuffle(n,r,2,3,6,7),s=SIMD.Float32x4.shuffle(o,u,2,3,6,7),M=SIMD.Float32x4.shuffle(i,s,0,2,4,6),s=SIMD.Float32x4.shuffle(s,i,1,3,5,7),i=SIMD.Float32x4.mul(M,s),i=SIMD.Float32x4.swizzle(i,1,0,3,2),c=SIMD.Float32x4.mul(e,i),h=SIMD.Float32x4.mul(l,i),i=SIMD.Float32x4.swizzle(i,2,3,0,1),c=SIMD.Float32x4.sub(SIMD.Float32x4.mul(e,i),c),h=SIMD.Float32x4.sub(SIMD.Float32x4.mul(l,i),h),h=SIMD.Float32x4.swizzle(h,2,3,0,1),i=SIMD.Float32x4.mul(e,M),i=SIMD.Float32x4.swizzle(i,1,0,3,2),c=SIMD.Float32x4.add(SIMD.Float32x4.mul(s,i),c),I=SIMD.Float32x4.mul(l,i),i=SIMD.Float32x4.swizzle(i,2,3,0,1),c=SIMD.Float32x4.sub(c,SIMD.Float32x4.mul(s,i)),I=SIMD.Float32x4.sub(SIMD.Float32x4.mul(l,i),I),I=SIMD.Float32x4.swizzle(I,2,3,0,1),i=SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(e,2,3,0,1),s),i=SIMD.Float32x4.swizzle(i,1,0,3,2),M=SIMD.Float32x4.swizzle(M,!
 2,3,0,1),c=SIMD.Float32x4.add(SIMD.Float32x4.mul(M,i),c),S=SIMD.Float32x4.mul(l,i),i=SIMD.Float32x4.swizzle(i,2,3,0,1),c=SIMD.Float32x4.sub(c,SIMD.Float32x4.mul(M,i)),S=SIMD.Float32x4.sub(SIMD.Float32x4.mul(l,i),S),S=SIMD.Float32x4.swizzle(S,2,3,0,1),i=SIMD.Float32x4.mul(l,e),i=SIMD.Float32x4.swizzle(i,1,0,3,2),S=SIMD.Float32x4.add(SIMD.Float32x4.mul(s,i),S),I=SIMD.Float32x4.sub(SIMD.Float32x4.mul(M,i),I),i=SIMD.Float32x4.swizzle(i,2,3,0,1),S=SIMD.Float32x4.sub(SIMD.Float32x4.mul(s,i),S),I=SIMD.Float32x4.sub(I,SIMD.Float32x4.mul(M,i)),i=SIMD.Float32x4.mul(l,s),i=SIMD.Float32x4.swizzle(i,1,0,3,2),h=SIMD.Float32x4.sub(h,SIMD.Float32x4.mul(M,i)),S=SIMD.Float32x4.add(SIMD.Float32x4.mul(e,i),S),i=SIMD.Float32x4.swizzle(i,2,3,0,1),h=SIMD.Float32x4.add(SIMD.Float32x4.mul(M,i),h),S=SIMD.Float32x4.sub(S,SIMD.Float32x4.mul(e,i)),i=SIMD.Float32x4.mul(l,M),i=SIMD.Float32x4.swizzle(i,1,0,3,2),h=SIMD.Float32x4.add(SIMD.Float32x4.mul(s,i),h),I=SIMD.Float32x4.sub(I,SIMD.Float32x4.mul(e,i)),i=SIMD.Float32x4.swizzle(i,2,3,0,1),h=SIMD.Float32x4.sub(h,SIMD.Float32x4.mul(s,i)),I=SIMD.Float32x4.add(SIMD.Float32x4.mul(e,i),I),SIMD.Float32x4.store(t,0,c),SIMD.Float32x4.store(t,4,h),SIMD.Float32x4.store(t,8,S),SIMD.Float32x4.store(t,12,I),t},o.adjoint=r.USE_SIMD?o.SIMD.adjoint:o.scalar.adjoint,o.determinant=function(t){var a=t[0],n=t[1],r=t[2],o=t[3],u=t[4],l=t[5],e=t[6],M=t[7],s=t[8],i=t[9],c=t[10],h=t[11],S=t[12],I=t[13],f=t[14],x=t[15],D=a*l-n*u,F=a*e-r*u,m=a*M-o*u,d=n*e-r*l,b=n*M-o*l,v=r*M-o*e,z=s*I-i*S,p=s*f-c*S,w=s*x-h*S,E=i*f-c*I,A=i*x-h*I,P=c*x-h*f;return D*P-F*A+m*E+d*w-b*p+v*z},o.SIMD.multiply=function(t,a,n){var r=SIMD.Float32x4.load(a,0),o=SIMD.Float32x4.load(a,4),u=SIMD.Float32x4.load(a,8),l=SIMD.Float32x4.load(a,12),e=SIMD.Float32x4.load(n,0),M=SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(e,0,0,0,0),r),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(e,1,1,1,1),o),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(e,2,2,2,2),u),SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(e,3,3,3,3),l))))!
 ;SIMD.Float32x4.store(t,0,M);var s=SIMD.Float32x4.load(n,4),i=SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(s,0,0,0,0),r),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(s,1,1,1,1),o),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(s,2,2,2,2),u),SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(s,3,3,3,3),l))));SIMD.Float32x4.store(t,4,i);var c=SIMD.Float32x4.load(n,8),h=SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(c,0,0,0,0),r),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(c,1,1,1,1),o),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(c,2,2,2,2),u),SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(c,3,3,3,3),l))));SIMD.Float32x4.store(t,8,h);var S=SIMD.Float32x4.load(n,12),I=SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(S,0,0,0,0),r),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(S,1,1,1,1),o),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(S,2,2,2,2),u),SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(S,3,3,3,3),l))));return SIMD.Float32x4.store(t,12,I),t},o.scalar.multiply=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=a[3],e=a[4],M=a[5],s=a[6],i=a[7],c=a[8],h=a[9],S=a[10],I=a[11],f=a[12],x=a[13],D=a[14],F=a[15],m=n[0],d=n[1],b=n[2],v=n[3];return t[0]=m*r+d*e+b*c+v*f,t[1]=m*o+d*M+b*h+v*x,t[2]=m*u+d*s+b*S+v*D,t[3]=m*l+d*i+b*I+v*F,m=n[4],d=n[5],b=n[6],v=n[7],t[4]=m*r+d*e+b*c+v*f,t[5]=m*o+d*M+b*h+v*x,t[6]=m*u+d*s+b*S+v*D,t[7]=m*l+d*i+b*I+v*F,m=n[8],d=n[9],b=n[10],v=n[11],t[8]=m*r+d*e+b*c+v*f,t[9]=m*o+d*M+b*h+v*x,t[10]=m*u+d*s+b*S+v*D,t[11]=m*l+d*i+b*I+v*F,m=n[12],d=n[13],b=n[14],v=n[15],t[12]=m*r+d*e+b*c+v*f,t[13]=m*o+d*M+b*h+v*x,t[14]=m*u+d*s+b*S+v*D,t[15]=m*l+d*i+b*I+v*F,t},o.multiply=r.USE_SIMD?o.SIMD.multiply:o.scalar.multiply,o.mul=o.multiply,o.scalar.translate=function(t,a,n){var r,o,u,l,e,M,s,i,c,h,S,I,f=n[0],x=n[1],D=n[2];return a===t?(t[12]=a[0]*f+a[4]*x+a[8]*D+a[12],t[13]=a[1]*f+a[5]*x+a[9]*D+a[13],t[14]=a[2]*f+a[6]*x+a[10]*D+a[14],t[15]=a[3]*f+a[7]*x+a[11]*D+a[15]):(r=a[0],o=a[1],u=a[2],l=a[3],e=a[4],M=a!
 [5],s=a[6],i=a[7],c=a[8],h=a[9],S=a[10],I=a[11],t[0]=r,t[1]=o,t[2]=u,t[3]=l,t[4]=e,t[5]=M,t[6]=s,t[7]=i,t[8]=c,t[9]=h,t[10]=S,t[11]=I,t[12]=r*f+e*x+c*D+a[12],t[13]=o*f+M*x+h*D+a[13],t[14]=u*f+s*x+S*D+a[14],t[15]=l*f+i*x+I*D+a[15]),t},o.SIMD.translate=function(t,a,n){var r=SIMD.Float32x4.load(a,0),o=SIMD.Float32x4.load(a,4),u=SIMD.Float32x4.load(a,8),l=SIMD.Float32x4.load(a,12),e=SIMD.Float32x4(n[0],n[1],n[2],0);a!==t&&(t[0]=a[0],t[1]=a[1],t[2]=a[2],t[3]=a[3],t[4]=a[4],t[5]=a[5],t[6]=a[6],t[7]=a[7],t[8]=a[8],t[9]=a[9],t[10]=a[10],t[11]=a[11]),r=SIMD.Float32x4.mul(r,SIMD.Float32x4.swizzle(e,0,0,0,0)),o=SIMD.Float32x4.mul(o,SIMD.Float32x4.swizzle(e,1,1,1,1)),u=SIMD.Float32x4.mul(u,SIMD.Float32x4.swizzle(e,2,2,2,2));var M=SIMD.Float32x4.add(r,SIMD.Float32x4.add(o,SIMD.Float32x4.add(u,l)));return SIMD.Float32x4.store(t,12,M),t},o.translate=r.USE_SIMD?o.SIMD.translate:o.scalar.translate,o.scalar.scale=function(t,a,n){var r=n[0],o=n[1],u=n[2];return t[0]=a[0]*r,t[1]=a[1]*r,t[2]=a[2]*r,t[3]=a[3]*r,t[4]=a[4]*o,t[5]=a[5]*o,t[6]=a[6]*o,t[7]=a[7]*o,t[8]=a[8]*u,t[9]=a[9]*u,t[10]=a[10]*u,t[11]=a[11]*u,t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15],t},o.SIMD.scale=function(t,a,n){var r,o,u,l=SIMD.Float32x4(n[0],n[1],n[2],0);return r=SIMD.Float32x4.load(a,0),SIMD.Float32x4.store(t,0,SIMD.Float32x4.mul(r,SIMD.Float32x4.swizzle(l,0,0,0,0))),o=SIMD.Float32x4.load(a,4),SIMD.Float32x4.store(t,4,SIMD.Float32x4.mul(o,SIMD.Float32x4.swizzle(l,1,1,1,1))),u=SIMD.Float32x4.load(a,8),SIMD.Float32x4.store(t,8,SIMD.Float32x4.mul(u,SIMD.Float32x4.swizzle(l,2,2,2,2))),t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15],t},o.scale=r.USE_SIMD?o.SIMD.scale:o.scalar.scale,o.rotate=function(t,a,n,o){var u,l,e,M,s,i,c,h,S,I,f,x,D,F,m,d,b,v,z,p,w,E,A,P,L=o[0],q=o[1],R=o[2],N=Math.sqrt(L*L+q*q+R*R);return Math.abs(N)<r.EPSILON?null:(N=1/N,L*=N,q*=N,R*=N,u=Math.sin(n),l=Math.cos(n),e=1-l,M=a[0],s=a[1],i=a[2],c=a[3],h=a[4],S=a[5],I=a[6],f=a[7],x=a[8],D=a[9],F=a[10],m=a[11],d=L*L*e+l,b=q*L*e+R*u,v=R*L*e-q*u,z=L*q*e-R*u,p=q*q*e+l,w=R*q*e+L*u,E=L*R*e+q*u,A=q*!
 R*e-L*u,P=R*R*e+l,t[0]=M*d+h*b+x*v,t[1]=s*d+S*b+D*v,t[2]=i*d+I*b+F*v,t[3]=c*d+f*b+m*v,t[4]=M*z+h*p+x*w,t[5]=s*z+S*p+D*w,t[6]=i*z+I*p+F*w,t[7]=c*z+f*p+m*w,t[8]=M*E+h*A+x*P,t[9]=s*E+S*A+D*P,t[10]=i*E+I*A+F*P,t[11]=c*E+f*A+m*P,a!==t&&(t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]),t)},o.scalar.rotateX=function(t,a,n){var r=Math.sin(n),o=Math.cos(n),u=a[4],l=a[5],e=a[6],M=a[7],s=a[8],i=a[9],c=a[10],h=a[11];return a!==t&&(t[0]=a[0],t[1]=a[1],t[2]=a[2],t[3]=a[3],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]),t[4]=u*o+s*r,t[5]=l*o+i*r,t[6]=e*o+c*r,t[7]=M*o+h*r,t[8]=s*o-u*r,t[9]=i*o-l*r,t[10]=c*o-e*r,t[11]=h*o-M*r,t},o.SIMD.rotateX=function(t,a,n){var r=SIMD.Float32x4.splat(Math.sin(n)),o=SIMD.Float32x4.splat(Math.cos(n));a!==t&&(t[0]=a[0],t[1]=a[1],t[2]=a[2],t[3]=a[3],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]);var u=SIMD.Float32x4.load(a,4),l=SIMD.Float32x4.load(a,8);return SIMD.Float32x4.store(t,4,SIMD.Float32x4.add(SIMD.Float32x4.mul(u,o),SIMD.Float32x4.mul(l,r))),SIMD.Float32x4.store(t,8,SIMD.Float32x4.sub(SIMD.Float32x4.mul(l,o),SIMD.Float32x4.mul(u,r))),t},o.rotateX=r.USE_SIMD?o.SIMD.rotateX:o.scalar.rotateX,o.scalar.rotateY=function(t,a,n){var r=Math.sin(n),o=Math.cos(n),u=a[0],l=a[1],e=a[2],M=a[3],s=a[8],i=a[9],c=a[10],h=a[11];return a!==t&&(t[4]=a[4],t[5]=a[5],t[6]=a[6],t[7]=a[7],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]),t[0]=u*o-s*r,t[1]=l*o-i*r,t[2]=e*o-c*r,t[3]=M*o-h*r,t[8]=u*r+s*o,t[9]=l*r+i*o,t[10]=e*r+c*o,t[11]=M*r+h*o,t},o.SIMD.rotateY=function(t,a,n){var r=SIMD.Float32x4.splat(Math.sin(n)),o=SIMD.Float32x4.splat(Math.cos(n));a!==t&&(t[4]=a[4],t[5]=a[5],t[6]=a[6],t[7]=a[7],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]);var u=SIMD.Float32x4.load(a,0),l=SIMD.Float32x4.load(a,8);return SIMD.Float32x4.store(t,0,SIMD.Float32x4.sub(SIMD.Float32x4.mul(u,o),SIMD.Float32x4.mul(l,r))),SIMD.Float32x4.store(t,8,SIMD.Float32x4.add(SIMD.Float32x4.mul(u,r),SIMD.Float32x4.mul(l,o))),t},o.rotateY=r.USE_SIMD?o.SIMD.rotateY:o.scalar.rotateY,o.scalar.rotateZ=function(t,a,n){var r=Math.sin(n),o=Math.cos(n)!
 ,u=a[0],l=a[1],e=a[2],M=a[3],s=a[4],i=a[5],c=a[6],h=a[7];return a!==t&&(t[8]=a[8],t[9]=a[9],t[10]=a[10],t[11]=a[11],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]),t[0]=u*o+s*r,t[1]=l*o+i*r,t[2]=e*o+c*r,t[3]=M*o+h*r,t[4]=s*o-u*r,t[5]=i*o-l*r,t[6]=c*o-e*r,t[7]=h*o-M*r,t},o.SIMD.rotateZ=function(t,a,n){var r=SIMD.Float32x4.splat(Math.sin(n)),o=SIMD.Float32x4.splat(Math.cos(n));a!==t&&(t[8]=a[8],t[9]=a[9],t[10]=a[10],t[11]=a[11],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]);var u=SIMD.Float32x4.load(a,0),l=SIMD.Float32x4.load(a,4);return SIMD.Float32x4.store(t,0,SIMD.Float32x4.add(SIMD.Float32x4.mul(u,o),SIMD.Float32x4.mul(l,r))),SIMD.Float32x4.store(t,4,SIMD.Float32x4.sub(SIMD.Float32x4.mul(l,o),SIMD.Float32x4.mul(u,r))),t},o.rotateZ=r.USE_SIMD?o.SIMD.rotateZ:o.scalar.rotateZ,o.fromTranslation=function(t,a){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=a[0],t[13]=a[1],t[14]=a[2],t[15]=1,t},o.fromScaling=function(t,a){return t[0]=a[0],t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a[1],t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=a[2],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.fromRotation=function(t,a,n){var o,u,l,e=n[0],M=n[1],s=n[2],i=Math.sqrt(e*e+M*M+s*s);return Math.abs(i)<r.EPSILON?null:(i=1/i,e*=i,M*=i,s*=i,o=Math.sin(a),u=Math.cos(a),l=1-u,t[0]=e*e*l+u,t[1]=M*e*l+s*o,t[2]=s*e*l-M*o,t[3]=0,t[4]=e*M*l-s*o,t[5]=M*M*l+u,t[6]=s*M*l+e*o,t[7]=0,t[8]=e*s*l+M*o,t[9]=M*s*l-e*o,t[10]=s*s*l+u,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t)},o.fromXRotation=function(t,a){var n=Math.sin(a),r=Math.cos(a);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=r,t[6]=n,t[7]=0,t[8]=0,t[9]=-n,t[10]=r,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.fromYRotation=function(t,a){var n=Math.sin(a),r=Math.cos(a);return t[0]=r,t[1]=0,t[2]=-n,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=n,t[9]=0,t[10]=r,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.fromZRotation=function(t,a){var n=Math.sin(a),r=Math.cos(a);return t[0]=r,t[1]=n,t[2]=0,t[3]=0,t[4]=-n,t[5]=r,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]!
 =0,t[15]=1,t},o.fromRotationTranslation=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=a[3],e=r+r,M=o+o,s=u+u,i=r*e,c=r*M,h=r*s,S=o*M,I=o*s,f=u*s,x=l*e,D=l*M,F=l*s;return t[0]=1-(S+f),t[1]=c+F,t[2]=h-D,t[3]=0,t[4]=c-F,t[5]=1-(i+f),t[6]=I+x,t[7]=0,t[8]=h+D,t[9]=I-x,t[10]=1-(i+S),t[11]=0,t[12]=n[0],t[13]=n[1],t[14]=n[2],t[15]=1,t},o.getTranslation=function(t,a){return t[0]=a[12],t[1]=a[13],t[2]=a[14],t},o.getRotation=function(t,a){var n=a[0]+a[5]+a[10],r=0;return n>0?(r=2*Math.sqrt(n+1),t[3]=.25*r,t[0]=(a[6]-a[9])/r,t[1]=(a[8]-a[2])/r,t[2]=(a[1]-a[4])/r):a[0]>a[5]&a[0]>a[10]?(r=2*Math.sqrt(1+a[0]-a[5]-a[10]),t[3]=(a[6]-a[9])/r,t[0]=.25*r,t[1]=(a[1]+a[4])/r,t[2]=(a[8]+a[2])/r):a[5]>a[10]?(r=2*Math.sqrt(1+a[5]-a[0]-a[10]),t[3]=(a[8]-a[2])/r,t[0]=(a[1]+a[4])/r,t[1]=.25*r,t[2]=(a[6]+a[9])/r):(r=2*Math.sqrt(1+a[10]-a[0]-a[5]),t[3]=(a[1]-a[4])/r,t[0]=(a[8]+a[2])/r,t[1]=(a[6]+a[9])/r,t[2]=.25*r),t},o.fromRotationTranslationScale=function(t,a,n,r){var o=a[0],u=a[1],l=a[2],e=a[3],M=o+o,s=u+u,i=l+l,c=o*M,h=o*s,S=o*i,I=u*s,f=u*i,x=l*i,D=e*M,F=e*s,m=e*i,d=r[0],b=r[1],v=r[2];return t[0]=(1-(I+x))*d,t[1]=(h+m)*d,t[2]=(S-F)*d,t[3]=0,t[4]=(h-m)*b,t[5]=(1-(c+x))*b,t[6]=(f+D)*b,t[7]=0,t[8]=(S+F)*v,t[9]=(f-D)*v,t[10]=(1-(c+I))*v,t[11]=0,t[12]=n[0],t[13]=n[1],t[14]=n[2],t[15]=1,t},o.fromRotationTranslationScaleOrigin=function(t,a,n,r,o){
+var u=a[0],l=a[1],e=a[2],M=a[3],s=u+u,i=l+l,c=e+e,h=u*s,S=u*i,I=u*c,f=l*i,x=l*c,D=e*c,F=M*s,m=M*i,d=M*c,b=r[0],v=r[1],z=r[2],p=o[0],w=o[1],E=o[2];return t[0]=(1-(f+D))*b,t[1]=(S+d)*b,t[2]=(I-m)*b,t[3]=0,t[4]=(S-d)*v,t[5]=(1-(h+D))*v,t[6]=(x+F)*v,t[7]=0,t[8]=(I+m)*z,t[9]=(x-F)*z,t[10]=(1-(h+f))*z,t[11]=0,t[12]=n[0]+p-(t[0]*p+t[4]*w+t[8]*E),t[13]=n[1]+w-(t[1]*p+t[5]*w+t[9]*E),t[14]=n[2]+E-(t[2]*p+t[6]*w+t[10]*E),t[15]=1,t},o.fromQuat=function(t,a){var n=a[0],r=a[1],o=a[2],u=a[3],l=n+n,e=r+r,M=o+o,s=n*l,i=r*l,c=r*e,h=o*l,S=o*e,I=o*M,f=u*l,x=u*e,D=u*M;return t[0]=1-c-I,t[1]=i+D,t[2]=h-x,t[3]=0,t[4]=i-D,t[5]=1-s-I,t[6]=S+f,t[7]=0,t[8]=h+x,t[9]=S-f,t[10]=1-s-c,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},o.frustum=function(t,a,n,r,o,u,l){var e=1/(n-a),M=1/(o-r),s=1/(u-l);return t[0]=2*u*e,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*u*M,t[6]=0,t[7]=0,t[8]=(n+a)*e,t[9]=(o+r)*M,t[10]=(l+u)*s,t[11]=-1,t[12]=0,t[13]=0,t[14]=l*u*2*s,t[15]=0,t},o.perspective=function(t,a,n,r,o){var u=1/Math.tan(a/2),l=1/(r-o);return t[0]=u/n,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=u,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=(o+r)*l,t[11]=-1,t[12]=0,t[13]=0,t[14]=2*o*r*l,t[15]=0,t},o.perspectiveFromFieldOfView=function(t,a,n,r){var o=Math.tan(a.upDegrees*Math.PI/180),u=Math.tan(a.downDegrees*Math.PI/180),l=Math.tan(a.leftDegrees*Math.PI/180),e=Math.tan(a.rightDegrees*Math.PI/180),M=2/(l+e),s=2/(o+u);return t[0]=M,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=s,t[6]=0,t[7]=0,t[8]=-((l-e)*M*.5),t[9]=(o-u)*s*.5,t[10]=r/(n-r),t[11]=-1,t[12]=0,t[13]=0,t[14]=r*n/(n-r),t[15]=0,t},o.ortho=function(t,a,n,r,o,u,l){var e=1/(a-n),M=1/(r-o),s=1/(u-l);return t[0]=-2*e,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*M,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*s,t[11]=0,t[12]=(a+n)*e,t[13]=(o+r)*M,t[14]=(l+u)*s,t[15]=1,t},o.lookAt=function(t,a,n,u){var l,e,M,s,i,c,h,S,I,f,x=a[0],D=a[1],F=a[2],m=u[0],d=u[1],b=u[2],v=n[0],z=n[1],p=n[2];return Math.abs(x-v)<r.EPSILON&&Math.abs(D-z)<r.EPSILON&&Math.abs(F-p)<r.EPSILON?o.identity(t):(h=x-v,S=D-z,I=F-p,f=1/Math.sqrt(h*h+S*S+I*I),h*=f,S*=f,I*=f,l=d*I-b*S,e=b*h-m*!
 I,M=m*S-d*h,f=Math.sqrt(l*l+e*e+M*M),f?(f=1/f,l*=f,e*=f,M*=f):(l=0,e=0,M=0),s=S*M-I*e,i=I*l-h*M,c=h*e-S*l,f=Math.sqrt(s*s+i*i+c*c),f?(f=1/f,s*=f,i*=f,c*=f):(s=0,i=0,c=0),t[0]=l,t[1]=s,t[2]=h,t[3]=0,t[4]=e,t[5]=i,t[6]=S,t[7]=0,t[8]=M,t[9]=c,t[10]=I,t[11]=0,t[12]=-(l*x+e*D+M*F),t[13]=-(s*x+i*D+c*F),t[14]=-(h*x+S*D+I*F),t[15]=1,t)},o.str=function(t){return"mat4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+", "+t[9]+", "+t[10]+", "+t[11]+", "+t[12]+", "+t[13]+", "+t[14]+", "+t[15]+")"},o.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2)+Math.pow(t[9],2)+Math.pow(t[10],2)+Math.pow(t[11],2)+Math.pow(t[12],2)+Math.pow(t[13],2)+Math.pow(t[14],2)+Math.pow(t[15],2))},o.add=function(t,a,n){return t[0]=a[0]+n[0],t[1]=a[1]+n[1],t[2]=a[2]+n[2],t[3]=a[3]+n[3],t[4]=a[4]+n[4],t[5]=a[5]+n[5],t[6]=a[6]+n[6],t[7]=a[7]+n[7],t[8]=a[8]+n[8],t[9]=a[9]+n[9],t[10]=a[10]+n[10],t[11]=a[11]+n[11],t[12]=a[12]+n[12],t[13]=a[13]+n[13],t[14]=a[14]+n[14],t[15]=a[15]+n[15],t},o.subtract=function(t,a,n){return t[0]=a[0]-n[0],t[1]=a[1]-n[1],t[2]=a[2]-n[2],t[3]=a[3]-n[3],t[4]=a[4]-n[4],t[5]=a[5]-n[5],t[6]=a[6]-n[6],t[7]=a[7]-n[7],t[8]=a[8]-n[8],t[9]=a[9]-n[9],t[10]=a[10]-n[10],t[11]=a[11]-n[11],t[12]=a[12]-n[12],t[13]=a[13]-n[13],t[14]=a[14]-n[14],t[15]=a[15]-n[15],t},o.sub=o.subtract,o.multiplyScalar=function(t,a,n){return t[0]=a[0]*n,t[1]=a[1]*n,t[2]=a[2]*n,t[3]=a[3]*n,t[4]=a[4]*n,t[5]=a[5]*n,t[6]=a[6]*n,t[7]=a[7]*n,t[8]=a[8]*n,t[9]=a[9]*n,t[10]=a[10]*n,t[11]=a[11]*n,t[12]=a[12]*n,t[13]=a[13]*n,t[14]=a[14]*n,t[15]=a[15]*n,t},o.multiplyScalarAndAdd=function(t,a,n,r){return t[0]=a[0]+n[0]*r,t[1]=a[1]+n[1]*r,t[2]=a[2]+n[2]*r,t[3]=a[3]+n[3]*r,t[4]=a[4]+n[4]*r,t[5]=a[5]+n[5]*r,t[6]=a[6]+n[6]*r,t[7]=a[7]+n[7]*r,t[8]=a[8]+n[8]*r,t[9]=a[9]+n[9]*r,t[10]=a[10]+n[10]*r,t[11]=a[11]+n[11]*r,t[12]=a[12]+n[12]*r,t[13]=a[13]+n[13]*r,t[14]=a[14]+n[14]*r,t[15]=a[15]+n[15]*r,t},o.exactEqual!
 s=function(t,a){return t[0]===a[0]&&t[1]===a[1]&&t[2]===a[2]&&t[3]===a[3]&&t[4]===a[4]&&t[5]===a[5]&&t[6]===a[6]&&t[7]===a[7]&&t[8]===a[8]&&t[9]===a[9]&&t[10]===a[10]&&t[11]===a[11]&&t[12]===a[12]&&t[13]===a[13]&&t[14]===a[14]&&t[15]===a[15]},o.equals=function(t,a){var n=t[0],o=t[1],u=t[2],l=t[3],e=t[4],M=t[5],s=t[6],i=t[7],c=t[8],h=t[9],S=t[10],I=t[11],f=t[12],x=t[13],D=t[14],F=t[15],m=a[0],d=a[1],b=a[2],v=a[3],z=a[4],p=a[5],w=a[6],E=a[7],A=a[8],P=a[9],L=a[10],q=a[11],R=a[12],N=a[13],O=a[14],Y=a[15];return Math.abs(n-m)<=r.EPSILON*Math.max(1,Math.abs(n),Math.abs(m))&&Math.abs(o-d)<=r.EPSILON*Math.max(1,Math.abs(o),Math.abs(d))&&Math.abs(u-b)<=r.EPSILON*Math.max(1,Math.abs(u),Math.abs(b))&&Math.abs(l-v)<=r.EPSILON*Math.max(1,Math.abs(l),Math.abs(v))&&Math.abs(e-z)<=r.EPSILON*Math.max(1,Math.abs(e),Math.abs(z))&&Math.abs(M-p)<=r.EPSILON*Math.max(1,Math.abs(M),Math.abs(p))&&Math.abs(s-w)<=r.EPSILON*Math.max(1,Math.abs(s),Math.abs(w))&&Math.abs(i-E)<=r.EPSILON*Math.max(1,Math.abs(i),Math.abs(E))&&Math.abs(c-A)<=r.EPSILON*Math.max(1,Math.abs(c),Math.abs(A))&&Math.abs(h-P)<=r.EPSILON*Math.max(1,Math.abs(h),Math.abs(P))&&Math.abs(S-L)<=r.EPSILON*Math.max(1,Math.abs(S),Math.abs(L))&&Math.abs(I-q)<=r.EPSILON*Math.max(1,Math.abs(I),Math.abs(q))&&Math.abs(f-R)<=r.EPSILON*Math.max(1,Math.abs(f),Math.abs(R))&&Math.abs(x-N)<=r.EPSILON*Math.max(1,Math.abs(x),Math.abs(N))&&Math.abs(D-O)<=r.EPSILON*Math.max(1,Math.abs(D),Math.abs(O))&&Math.abs(F-Y)<=r.EPSILON*Math.max(1,Math.abs(F),Math.abs(Y))},t.exports=o},function(t,a,n){var r=n(1),o=n(4),u=n(7),l=n(8),e={};e.create=function(){var t=new r.ARRAY_TYPE(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},e.rotationTo=function(){var t=u.create(),a=u.fromValues(1,0,0),n=u.fromValues(0,1,0);return function(r,o,l){var M=u.dot(o,l);return M<-.999999?(u.cross(t,a,o),u.length(t)<1e-6&&u.cross(t,n,o),u.normalize(t,t),e.setAxisAngle(r,t,Math.PI),r):M>.999999?(r[0]=0,r[1]=0,r[2]=0,r[3]=1,r):(u.cross(t,o,l),r[0]=t[0],r[1]=t[1],r[2]=t[2],r[3]=1+M,e.normalize(r,r))}}(),e.setAxes=function(){var t=o.crea!
 te();return function(a,n,r,o){return t[0]=r[0],t[3]=r[1],t[6]=r[2],t[1]=o[0],t[4]=o[1],t[7]=o[2],t[2]=-n[0],t[5]=-n[1],t[8]=-n[2],e.normalize(a,e.fromMat3(a,t))}}(),e.clone=l.clone,e.fromValues=l.fromValues,e.copy=l.copy,e.set=l.set,e.identity=function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},e.setAxisAngle=function(t,a,n){n=.5*n;var r=Math.sin(n);return t[0]=r*a[0],t[1]=r*a[1],t[2]=r*a[2],t[3]=Math.cos(n),t},e.getAxisAngle=function(t,a){var n=2*Math.acos(a[3]),r=Math.sin(n/2);return 0!=r?(t[0]=a[0]/r,t[1]=a[1]/r,t[2]=a[2]/r):(t[0]=1,t[1]=0,t[2]=0),n},e.add=l.add,e.multiply=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=a[3],e=n[0],M=n[1],s=n[2],i=n[3];return t[0]=r*i+l*e+o*s-u*M,t[1]=o*i+l*M+u*e-r*s,t[2]=u*i+l*s+r*M-o*e,t[3]=l*i-r*e-o*M-u*s,t},e.mul=e.multiply,e.scale=l.scale,e.rotateX=function(t,a,n){n*=.5;var r=a[0],o=a[1],u=a[2],l=a[3],e=Math.sin(n),M=Math.cos(n);return t[0]=r*M+l*e,t[1]=o*M+u*e,t[2]=u*M-o*e,t[3]=l*M-r*e,t},e.rotateY=function(t,a,n){n*=.5;var r=a[0],o=a[1],u=a[2],l=a[3],e=Math.sin(n),M=Math.cos(n);return t[0]=r*M-u*e,t[1]=o*M+l*e,t[2]=u*M+r*e,t[3]=l*M-o*e,t},e.rotateZ=function(t,a,n){n*=.5;var r=a[0],o=a[1],u=a[2],l=a[3],e=Math.sin(n),M=Math.cos(n);return t[0]=r*M+o*e,t[1]=o*M-r*e,t[2]=u*M+l*e,t[3]=l*M-u*e,t},e.calculateW=function(t,a){var n=a[0],r=a[1],o=a[2];return t[0]=n,t[1]=r,t[2]=o,t[3]=Math.sqrt(Math.abs(1-n*n-r*r-o*o)),t},e.dot=l.dot,e.lerp=l.lerp,e.slerp=function(t,a,n,r){var o,u,l,e,M,s=a[0],i=a[1],c=a[2],h=a[3],S=n[0],I=n[1],f=n[2],x=n[3];return u=s*S+i*I+c*f+h*x,u<0&&(u=-u,S=-S,I=-I,f=-f,x=-x),1-u>1e-6?(o=Math.acos(u),l=Math.sin(o),e=Math.sin((1-r)*o)/l,M=Math.sin(r*o)/l):(e=1-r,M=r),t[0]=e*s+M*S,t[1]=e*i+M*I,t[2]=e*c+M*f,t[3]=e*h+M*x,t},e.sqlerp=function(){var t=e.create(),a=e.create();return function(n,r,o,u,l,M){return e.slerp(t,r,l,M),e.slerp(a,o,u,M),e.slerp(n,t,a,2*M*(1-M)),n}}(),e.invert=function(t,a){var n=a[0],r=a[1],o=a[2],u=a[3],l=n*n+r*r+o*o+u*u,e=l?1/l:0;return t[0]=-n*e,t[1]=-r*e,t[2]=-o*e,t[3]=u*e,t},e.conjugate=function(t,a){return t[0]=-a[0],t[1]=-a[1],t[2]=-a[2],t[3!
 ]=a[3],t},e.length=l.length,e.len=e.length,e.squaredLength=l.squaredLength,e.sqrLen=e.squaredLength,e.normalize=l.normalize,e.fromMat3=function(t,a){var n,r=a[0]+a[4]+a[8];if(r>0)n=Math.sqrt(r+1),t[3]=.5*n,n=.5/n,t[0]=(a[5]-a[7])*n,t[1]=(a[6]-a[2])*n,t[2]=(a[1]-a[3])*n;else{var o=0;a[4]>a[0]&&(o=1),a[8]>a[3*o+o]&&(o=2);var u=(o+1)%3,l=(o+2)%3;n=Math.sqrt(a[3*o+o]-a[3*u+u]-a[3*l+l]+1),t[o]=.5*n,n=.5/n,t[3]=(a[3*u+l]-a[3*l+u])*n,t[u]=(a[3*u+o]+a[3*o+u])*n,t[l]=(a[3*l+o]+a[3*o+l])*n}return t},e.str=function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},e.exactEquals=l.exactEquals,e.equals=l.equals,t.exports=e},function(t,a,n){var r=n(1),o={};o.create=function(){var t=new r.ARRAY_TYPE(3);return t[0]=0,t[1]=0,t[2]=0,t},o.clone=function(t){var a=new r.ARRAY_TYPE(3);return a[0]=t[0],a[1]=t[1],a[2]=t[2],a},o.fromValues=function(t,a,n){var o=new r.ARRAY_TYPE(3);return o[0]=t,o[1]=a,o[2]=n,o},o.copy=function(t,a){return t[0]=a[0],t[1]=a[1],t[2]=a[2],t},o.set=function(t,a,n,r){return t[0]=a,t[1]=n,t[2]=r,t},o.add=function(t,a,n){return t[0]=a[0]+n[0],t[1]=a[1]+n[1],t[2]=a[2]+n[2],t},o.subtract=function(t,a,n){return t[0]=a[0]-n[0],t[1]=a[1]-n[1],t[2]=a[2]-n[2],t},o.sub=o.subtract,o.multiply=function(t,a,n){return t[0]=a[0]*n[0],t[1]=a[1]*n[1],t[2]=a[2]*n[2],t},o.mul=o.multiply,o.divide=function(t,a,n){return t[0]=a[0]/n[0],t[1]=a[1]/n[1],t[2]=a[2]/n[2],t},o.div=o.divide,o.ceil=function(t,a){return t[0]=Math.ceil(a[0]),t[1]=Math.ceil(a[1]),t[2]=Math.ceil(a[2]),t},o.floor=function(t,a){return t[0]=Math.floor(a[0]),t[1]=Math.floor(a[1]),t[2]=Math.floor(a[2]),t},o.min=function(t,a,n){return t[0]=Math.min(a[0],n[0]),t[1]=Math.min(a[1],n[1]),t[2]=Math.min(a[2],n[2]),t},o.max=function(t,a,n){return t[0]=Math.max(a[0],n[0]),t[1]=Math.max(a[1],n[1]),t[2]=Math.max(a[2],n[2]),t},o.round=function(t,a){return t[0]=Math.round(a[0]),t[1]=Math.round(a[1]),t[2]=Math.round(a[2]),t},o.scale=function(t,a,n){return t[0]=a[0]*n,t[1]=a[1]*n,t[2]=a[2]*n,t},o.scaleAndAdd=function(t,a,n,r){return t[0]=a[0]+n[0]*r,t[1]=a[1]+n[1]*r,t[2]=a[!
 2]+n[2]*r,t},o.distance=function(t,a){var n=a[0]-t[0],r=a[1]-t[1],o=a[2]-t[2];return Math.sqrt(n*n+r*r+o*o)},o.dist=o.distance,o.squaredDistance=function(t,a){var n=a[0]-t[0],r=a[1]-t[1],o=a[2]-t[2];return n*n+r*r+o*o},o.sqrDist=o.squaredDistance,o.length=function(t){var a=t[0],n=t[1],r=t[2];return Math.sqrt(a*a+n*n+r*r)},o.len=o.length,o.squaredLength=function(t){var a=t[0],n=t[1],r=t[2];return a*a+n*n+r*r},o.sqrLen=o.squaredLength,o.negate=function(t,a){return t[0]=-a[0],t[1]=-a[1],t[2]=-a[2],t},o.inverse=function(t,a){return t[0]=1/a[0],t[1]=1/a[1],t[2]=1/a[2],t},o.normalize=function(t,a){var n=a[0],r=a[1],o=a[2],u=n*n+r*r+o*o;return u>0&&(u=1/Math.sqrt(u),t[0]=a[0]*u,t[1]=a[1]*u,t[2]=a[2]*u),t},o.dot=function(t,a){return t[0]*a[0]+t[1]*a[1]+t[2]*a[2]},o.cross=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=n[0],e=n[1],M=n[2];return t[0]=o*M-u*e,t[1]=u*l-r*M,t[2]=r*e-o*l,t},o.lerp=function(t,a,n,r){var o=a[0],u=a[1],l=a[2];return t[0]=o+r*(n[0]-o),t[1]=u+r*(n[1]-u),t[2]=l+r*(n[2]-l),t},o.hermite=function(t,a,n,r,o,u){var l=u*u,e=l*(2*u-3)+1,M=l*(u-2)+u,s=l*(u-1),i=l*(3-2*u);return t[0]=a[0]*e+n[0]*M+r[0]*s+o[0]*i,t[1]=a[1]*e+n[1]*M+r[1]*s+o[1]*i,t[2]=a[2]*e+n[2]*M+r[2]*s+o[2]*i,t},o.bezier=function(t,a,n,r,o,u){var l=1-u,e=l*l,M=u*u,s=e*l,i=3*u*e,c=3*M*l,h=M*u;return t[0]=a[0]*s+n[0]*i+r[0]*c+o[0]*h,t[1]=a[1]*s+n[1]*i+r[1]*c+o[1]*h,t[2]=a[2]*s+n[2]*i+r[2]*c+o[2]*h,t},o.random=function(t,a){a=a||1;var n=2*r.RANDOM()*Math.PI,o=2*r.RANDOM()-1,u=Math.sqrt(1-o*o)*a;return t[0]=Math.cos(n)*u,t[1]=Math.sin(n)*u,t[2]=o*a,t},o.transformMat4=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=n[3]*r+n[7]*o+n[11]*u+n[15];return l=l||1,t[0]=(n[0]*r+n[4]*o+n[8]*u+n[12])/l,t[1]=(n[1]*r+n[5]*o+n[9]*u+n[13])/l,t[2]=(n[2]*r+n[6]*o+n[10]*u+n[14])/l,t},o.transformMat3=function(t,a,n){var r=a[0],o=a[1],u=a[2];return t[0]=r*n[0]+o*n[3]+u*n[6],t[1]=r*n[1]+o*n[4]+u*n[7],t[2]=r*n[2]+o*n[5]+u*n[8],t},o.transformQuat=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=n[0],e=n[1],M=n[2],s=n[3],i=s*r+e*u-M*o,c=s*o+M*r-l*u,h=s*u+l*o-e*r,S=-l*r-e*o-M*u;return !
 t[0]=i*s+S*-l+c*-M-h*-e,t[1]=c*s+S*-e+h*-l-i*-M,t[2]=h*s+S*-M+i*-e-c*-l,t},o.rotateX=function(t,a,n,r){var o=[],u=[];return o[0]=a[0]-n[0],o[1]=a[1]-n[1],o[2]=a[2]-n[2],u[0]=o[0],u[1]=o[1]*Math.cos(r)-o[2]*Math.sin(r),u[2]=o[1]*Math.sin(r)+o[2]*Math.cos(r),t[0]=u[0]+n[0],t[1]=u[1]+n[1],t[2]=u[2]+n[2],t},o.rotateY=function(t,a,n,r){var o=[],u=[];return o[0]=a[0]-n[0],o[1]=a[1]-n[1],o[2]=a[2]-n[2],u[0]=o[2]*Math.sin(r)+o[0]*Math.cos(r),u[1]=o[1],u[2]=o[2]*Math.cos(r)-o[0]*Math.sin(r),t[0]=u[0]+n[0],t[1]=u[1]+n[1],t[2]=u[2]+n[2],t},o.rotateZ=function(t,a,n,r){var o=[],u=[];return o[0]=a[0]-n[0],o[1]=a[1]-n[1],o[2]=a[2]-n[2],u[0]=o[0]*Math.cos(r)-o[1]*Math.sin(r),u[1]=o[0]*Math.sin(r)+o[1]*Math.cos(r),u[2]=o[2],t[0]=u[0]+n[0],t[1]=u[1]+n[1],t[2]=u[2]+n[2],t},o.forEach=function(){var t=o.create();return function(a,n,r,o,u,l){var e,M;for(n||(n=3),r||(r=0),M=o?Math.min(o*n+r,a.length):a.length,e=r;e<M;e+=n)t[0]=a[e],t[1]=a[e+1],t[2]=a[e+2],u(t,t,l),a[e]=t[0],a[e+1]=t[1],a[e+2]=t[2];return a}}(),o.angle=function(t,a){var n=o.fromValues(t[0],t[1],t[2]),r=o.fromValues(a[0],a[1],a[2]);o.normalize(n,n),o.normalize(r,r);var u=o.dot(n,r);return u>1?0:Math.acos(u)},o.str=function(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"},o.exactEquals=function(t,a){return t[0]===a[0]&&t[1]===a[1]&&t[2]===a[2]},o.equals=function(t,a){var n=t[0],o=t[1],u=t[2],l=a[0],e=a[1],M=a[2];return Math.abs(n-l)<=r.EPSILON*Math.max(1,Math.abs(n),Math.abs(l))&&Math.abs(o-e)<=r.EPSILON*Math.max(1,Math.abs(o),Math.abs(e))&&Math.abs(u-M)<=r.EPSILON*Math.max(1,Math.abs(u),Math.abs(M))},t.exports=o},function(t,a,n){var r=n(1),o={};o.create=function(){var t=new r.ARRAY_TYPE(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t},o.clone=function(t){var a=new r.ARRAY_TYPE(4);return a[0]=t[0],a[1]=t[1],a[2]=t[2],a[3]=t[3],a},o.fromValues=function(t,a,n,o){var u=new r.ARRAY_TYPE(4);return u[0]=t,u[1]=a,u[2]=n,u[3]=o,u},o.copy=function(t,a){return t[0]=a[0],t[1]=a[1],t[2]=a[2],t[3]=a[3],t},o.set=function(t,a,n,r,o){return t[0]=a,t[1]=n,t[2]=r,t[3]=o,t},o.add=function(t,a,n){ret!
 urn t[0]=a[0]+n[0],t[1]=a[1]+n[1],t[2]=a[2]+n[2],t[3]=a[3]+n[3],t},o.subtract=function(t,a,n){return t[0]=a[0]-n[0],t[1]=a[1]-n[1],t[2]=a[2]-n[2],t[3]=a[3]-n[3],t},o.sub=o.subtract,o.multiply=function(t,a,n){return t[0]=a[0]*n[0],t[1]=a[1]*n[1],t[2]=a[2]*n[2],t[3]=a[3]*n[3],t},o.mul=o.multiply,o.divide=function(t,a,n){return t[0]=a[0]/n[0],t[1]=a[1]/n[1],t[2]=a[2]/n[2],t[3]=a[3]/n[3],t},o.div=o.divide,o.ceil=function(t,a){return t[0]=Math.ceil(a[0]),t[1]=Math.ceil(a[1]),t[2]=Math.ceil(a[2]),t[3]=Math.ceil(a[3]),t},o.floor=function(t,a){return t[0]=Math.floor(a[0]),t[1]=Math.floor(a[1]),t[2]=Math.floor(a[2]),t[3]=Math.floor(a[3]),t},o.min=function(t,a,n){return t[0]=Math.min(a[0],n[0]),t[1]=Math.min(a[1],n[1]),t[2]=Math.min(a[2],n[2]),t[3]=Math.min(a[3],n[3]),t},o.max=function(t,a,n){return t[0]=Math.max(a[0],n[0]),t[1]=Math.max(a[1],n[1]),t[2]=Math.max(a[2],n[2]),t[3]=Math.max(a[3],n[3]),t},o.round=function(t,a){return t[0]=Math.round(a[0]),t[1]=Math.round(a[1]),t[2]=Math.round(a[2]),t[3]=Math.round(a[3]),t},o.scale=function(t,a,n){return t[0]=a[0]*n,t[1]=a[1]*n,t[2]=a[2]*n,t[3]=a[3]*n,t},o.scaleAndAdd=function(t,a,n,r){return t[0]=a[0]+n[0]*r,t[1]=a[1]+n[1]*r,t[2]=a[2]+n[2]*r,t[3]=a[3]+n[3]*r,t},o.distance=function(t,a){var n=a[0]-t[0],r=a[1]-t[1],o=a[2]-t[2],u=a[3]-t[3];return Math.sqrt(n*n+r*r+o*o+u*u)},o.dist=o.distance,o.squaredDistance=function(t,a){var n=a[0]-t[0],r=a[1]-t[1],o=a[2]-t[2],u=a[3]-t[3];return n*n+r*r+o*o+u*u},o.sqrDist=o.squaredDistance,o.length=function(t){var a=t[0],n=t[1],r=t[2],o=t[3];return Math.sqrt(a*a+n*n+r*r+o*o)},o.len=o.length,o.squaredLength=function(t){var a=t[0],n=t[1],r=t[2],o=t[3];return a*a+n*n+r*r+o*o},o.sqrLen=o.squaredLength,o.negate=function(t,a){return t[0]=-a[0],t[1]=-a[1],t[2]=-a[2],t[3]=-a[3],t},o.inverse=function(t,a){return t[0]=1/a[0],t[1]=1/a[1],t[2]=1/a[2],t[3]=1/a[3],t},o.normalize=function(t,a){var n=a[0],r=a[1],o=a[2],u=a[3],l=n*n+r*r+o*o+u*u;return l>0&&(l=1/Math.sqrt(l),t[0]=n*l,t[1]=r*l,t[2]=o*l,t[3]=u*l),t},o.dot=function(t,a){return t[0]*a[0]+t[1]*a[1]+t!
 [2]*a[2]+t[3]*a[3]},o.lerp=function(t,a,n,r){var o=a[0],u=a[1],l=a[2],e=a[3];return t[0]=o+r*(n[0]-o),t[1]=u+r*(n[1]-u),t[2]=l+r*(n[2]-l),t[3]=e+r*(n[3]-e),t},o.random=function(t,a){return a=a||1,t[0]=r.RANDOM(),t[1]=r.RANDOM(),t[2]=r.RANDOM(),t[3]=r.RANDOM(),o.normalize(t,t),o.scale(t,t,a),t},o.transformMat4=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=a[3];return t[0]=n[0]*r+n[4]*o+n[8]*u+n[12]*l,t[1]=n[1]*r+n[5]*o+n[9]*u+n[13]*l,t[2]=n[2]*r+n[6]*o+n[10]*u+n[14]*l,t[3]=n[3]*r+n[7]*o+n[11]*u+n[15]*l,t},o.transformQuat=function(t,a,n){var r=a[0],o=a[1],u=a[2],l=n[0],e=n[1],M=n[2],s=n[3],i=s*r+e*u-M*o,c=s*o+M*r-l*u,h=s*u+l*o-e*r,S=-l*r-e*o-M*u;return t[0]=i*s+S*-l+c*-M-h*-e,t[1]=c*s+S*-e+h*-l-i*-M,t[2]=h*s+S*-M+i*-e-c*-l,t[3]=a[3],t},o.forEach=function(){var t=o.create();return function(a,n,r,o,u,l){var e,M;for(n||(n=4),r||(r=0),M=o?Math.min(o*n+r,a.length):a.length,e=r;e<M;e+=n)t[0]=a[e],t[1]=a[e+1],t[2]=a[e+2],t[3]=a[e+3],u(t,t,l),a[e]=t[0],a[e+1]=t[1],a[e+2]=t[2],a[e+3]=t[3];return a}}(),o.str=function(t){return"vec4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},o.exactEquals=function(t,a){return t[0]===a[0]&&t[1]===a[1]&&t[2]===a[2]&&t[3]===a[3]},o.equals=function(t,a){var n=t[0],o=t[1],u=t[2],l=t[3],e=a[0],M=a[1],s=a[2],i=a[3];return Math.abs(n-e)<=r.EPSILON*Math.max(1,Math.abs(n),Math.abs(e))&&Math.abs(o-M)<=r.EPSILON*Math.max(1,Math.abs(o),Math.abs(M))&&Math.abs(u-s)<=r.EPSILON*Math.max(1,Math.abs(u),Math.abs(s))&&Math.abs(l-i)<=r.EPSILON*Math.max(1,Math.abs(l),Math.abs(i))},t.exports=o},function(t,a,n){var r=n(1),o={};o.create=function(){var t=new r.ARRAY_TYPE(2);return t[0]=0,t[1]=0,t},o.clone=function(t){var a=new r.ARRAY_TYPE(2);return a[0]=t[0],a[1]=t[1],a},o.fromValues=function(t,a){var n=new r.ARRAY_TYPE(2);return n[0]=t,n[1]=a,n},o.copy=function(t,a){return t[0]=a[0],t[1]=a[1],t},o.set=function(t,a,n){return t[0]=a,t[1]=n,t},o.add=function(t,a,n){return t[0]=a[0]+n[0],t[1]=a[1]+n[1],t},o.subtract=function(t,a,n){return t[0]=a[0]-n[0],t[1]=a[1]-n[1],t},o.sub=o.subtract,o.multiply=function(t,a,n){return t[!
 0]=a[0]*n[0],t[1]=a[1]*n[1],t},o.mul=o.multiply,o.divide=function(t,a,n){return t[0]=a[0]/n[0],t[1]=a[1]/n[1],t},o.div=o.divide,o.ceil=function(t,a){return t[0]=Math.ceil(a[0]),t[1]=Math.ceil(a[1]),t},o.floor=function(t,a){return t[0]=Math.floor(a[0]),t[1]=Math.floor(a[1]),t},o.min=function(t,a,n){return t[0]=Math.min(a[0],n[0]),t[1]=Math.min(a[1],n[1]),t},o.max=function(t,a,n){return t[0]=Math.max(a[0],n[0]),t[1]=Math.max(a[1],n[1]),t},o.round=function(t,a){return t[0]=Math.round(a[0]),t[1]=Math.round(a[1]),t},o.scale=function(t,a,n){return t[0]=a[0]*n,t[1]=a[1]*n,t},o.scaleAndAdd=function(t,a,n,r){return t[0]=a[0]+n[0]*r,t[1]=a[1]+n[1]*r,t},o.distance=function(t,a){var n=a[0]-t[0],r=a[1]-t[1];return Math.sqrt(n*n+r*r)},o.dist=o.distance,o.squaredDistance=function(t,a){var n=a[0]-t[0],r=a[1]-t[1];return n*n+r*r},o.sqrDist=o.squaredDistance,o.length=function(t){var a=t[0],n=t[1];return Math.sqrt(a*a+n*n)},o.len=o.length,o.squaredLength=function(t){var a=t[0],n=t[1];return a*a+n*n},o.sqrLen=o.squaredLength,o.negate=function(t,a){return t[0]=-a[0],t[1]=-a[1],t},o.inverse=function(t,a){return t[0]=1/a[0],t[1]=1/a[1],t},o.normalize=function(t,a){var n=a[0],r=a[1],o=n*n+r*r;return o>0&&(o=1/Math.sqrt(o),t[0]=a[0]*o,t[1]=a[1]*o),t},o.dot=function(t,a){return t[0]*a[0]+t[1]*a[1]},o.cross=function(t,a,n){var r=a[0]*n[1]-a[1]*n[0];return t[0]=t[1]=0,t[2]=r,t},o.lerp=function(t,a,n,r){var o=a[0],u=a[1];return t[0]=o+r*(n[0]-o),t[1]=u+r*(n[1]-u),t},o.random=function(t,a){a=a||1;var n=2*r.RANDOM()*Math.PI;return t[0]=Math.cos(n)*a,t[1]=Math.sin(n)*a,t},o.transformMat2=function(t,a,n){var r=a[0],o=a[1];return t[0]=n[0]*r+n[2]*o,t[1]=n[1]*r+n[3]*o,t},o.transformMat2d=function(t,a,n){var r=a[0],o=a[1];return t[0]=n[0]*r+n[2]*o+n[4],t[1]=n[1]*r+n[3]*o+n[5],t},o.transformMat3=function(t,a,n){var r=a[0],o=a[1];return t[0]=n[0]*r+n[3]*o+n[6],t[1]=n[1]*r+n[4]*o+n[7],t},o.transformMat4=function(t,a,n){var r=a[0],o=a[1];return t[0]=n[0]*r+n[4]*o+n[12],t[1]=n[1]*r+n[5]*o+n[13],t},o.forEach=function(){var t=o.create();return function(a!
 ,n,r,o,u,l){var e,M;for(n||(n=2),r||(r=0),M=o?Math.min(o*n+r,a.length):a.length,e=r;e<M;e+=n)t[0]=a[e],t[1]=a[e+1],u(t,t,l),a[e]=t[0],a[e+1]=t[1];return a}}(),o.str=function(t){return"vec2("+t[0]+", "+t[1]+")"},o.exactEquals=function(t,a){return t[0]===a[0]&&t[1]===a[1]},o.equals=function(t,a){var n=t[0],o=t[1],u=a[0],l=a[1];return Math.abs(n-u)<=r.EPSILON*Math.max(1,Math.abs(n),Math.abs(u))&&Math.abs(o-l)<=r.EPSILON*Math.max(1,Math.abs(o),Math.abs(l))},t.exports=o}])});
\ No newline at end of file

Added: trunk/Build/source/utils/asymptote/webgl/gl.js
===================================================================
--- trunk/Build/source/utils/asymptote/webgl/gl.js	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/webgl/gl.js	2019-03-27 22:27:57 UTC (rev 50622)
@@ -0,0 +1,738 @@
+// Contains code from http: //learningwebgl.com/blog/ ? p=28#triangle-vertex-positions 
+// modified to produce a subdivision algorithm for rendering Bezier
+// patches with WebGL
+var gl;
+
+function initGL(canvas) {
+    try {
+        gl=canvas.getContext("experimental-webgl");
+        gl.viewportWidth=canvas.width;
+        gl.viewportHeight=canvas.height;
+    } catch(e) {}
+    if(!gl) {
+        alert("Could not initialise WebGL, sorry : -(");
+    }
+}
+
+function getShader(gl, id) {
+    var shaderScript=document.getElementById(id);
+    if(!shaderScript) {
+        return null;
+    }
+    var str="";
+    var k=shaderScript.firstChild;
+    while(k) {
+        if(k.nodeType == 3) {
+            str += k.textContent;
+        }
+        k=k.nextSibling;
+    }
+    var shader;
+    if(shaderScript.type == "x-shader/x-fragment") {
+        shader=gl.createShader(gl.FRAGMENT_SHADER);
+    } else if(shaderScript.type == "x-shader/x-vertex") {
+        shader=gl.createShader(gl.VERTEX_SHADER);
+    } else {
+        return null;
+    }
+    gl.shaderSource(shader,str);
+    gl.compileShader(shader);
+    if(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)) {
+        alert(gl.getShaderInfoLog(shader));
+        return null;
+    }
+    return shader;
+}
+
+var shaderProgram;
+
+function initShaders() {
+    var fragmentShader=getShader(gl,"shader-fs");
+    var vertexShader=getShader(gl,"shader-vs");
+    shaderProgram=gl.createProgram();
+    gl.attachShader(shaderProgram,vertexShader);
+    gl.attachShader(shaderProgram,fragmentShader);
+    gl.linkProgram(shaderProgram);
+    if(!gl.getProgramParameter(shaderProgram,gl.LINK_STATUS)) {
+        alert("Could not initialise shaders");
+    }
+    gl.useProgram(shaderProgram);
+    shaderProgram.vertexPositionAttribute=gl.getAttribLocation(shaderProgram,"aVertexPosition");
+    gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
+    shaderProgram.vertexColorAttribute=gl.getAttribLocation(shaderProgram,"aVertexColor");
+    gl.enableVertexAttribArray(shaderProgram.vertexColorAttribute);
+    shaderProgram.pMatrixUniform=gl.getUniformLocation(shaderProgram,"uPMatrix");
+    shaderProgram.mvMatrixUniform=gl.getUniformLocation(shaderProgram,"uMVMatrix");
+}
+var mvMatrix=mat4.create();
+var pMatrix=mat4.create();
+
+function setMatrixUniforms() {
+    gl.uniformMatrix4fv(shaderProgram.pMatrixUniform,false,pMatrix);
+    gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform,false,mvMatrix);
+}
+
+var VertexBuffer;
+var ColorBuffer;
+
+var vertices=new Array();
+var colors=new Array();
+var indices=new Array();
+var nvertices=0;
+
+var mvMatrix=mat4.create();
+var translOffset=[0,0,0];
+var zoomFactor=1;
+
+var mvMatrixStack=[] ;
+var pMatrix=mat4.create();
+
+var localRotation=mat4.create();
+
+function mvPushMatrix() {
+    var copy=mat4.create();
+    mat4.set(mvMatrix,copy);
+    mvMatrixStack.push(copy);
+}
+
+function mvPopMatrix() {
+    if(mvMatrixStack.length == 0) {
+        throw "Invalid popMatrix!";
+    }
+    mvMatrix=mvMatrixStack.pop();
+}
+
+function degToRad(degrees) {
+    return degrees*Math.PI/180;
+}
+
+var redraw=true;
+var mouseDownOrTouchActive=false;
+var lastMouseX=null;
+var lastMouseY=null;
+var touchID=null;
+
+
+var center=[0,0,1];
+var centerInv=[0,0,-1];
+
+var rotationMatLocal=mat4.create();
+var rotationMatrix=mat4.create();
+mat4.identity(rotationMatrix);
+
+function handleMouseDown(event) {
+    mouseDownOrTouchActive=true;
+    lastMouseX=event.clientX;
+    lastMouseY=event.clientY;
+}
+
+function handleTouchStart(evt) {
+    evt.preventDefault();
+    var touches=evt.targetTouches;
+
+    if(touches.length == 1 && !mouseDownOrTouchActive) {
+        touchId=touches[0].identifier;
+        lastMouseX=touches[0].pageX,
+        lastMouseY=touches[0].pageY;
+    }
+}
+
+function handleMouseUpOrTouchEnd(event) {
+    mouseDownOrTouchActive=false;
+}
+
+function processDrag(newX, newY, pan=false) {
+    let lastX=(lastMouseX-400)/400;
+    let lastY=(lastMouseY-400)/400;
+
+    let rawX=(newX-400)/400;
+    let rawY=(newY-400)/400;
+
+    if(!pan) {
+        let [angle,axis]=arcballLib.arcball([lastX,-lastY],[rawX,-rawY]);
+        let tmpMatrix=mat4.create()
+        mat4.identity(tmpMatrix)
+        mat4.rotate(tmpMatrix,tmpMatrix,angle,[axis[0],axis[1],axis[2]])
+        mat4.multiply(rotationMatrix,tmpMatrix,rotationMatrix);
+    } else {
+        translOffset[0] +=(rawX-lastX);
+        translOffset[1] -=(rawY-lastY);
+    }
+    lastMouseX=newX;
+    lastMouseY=newY;
+    redraw=true;
+}
+
+function handleKey(key) {
+    var keycode=key.key;
+    var rotate=true;
+    var axis=[0,0,1];
+    switch(keycode) {
+    case "w": 
+        axis=[-1,0,0];
+        break;
+    case "d": 
+        axis=[0,1,0];
+        break;
+    case "a": 
+        axis=[0,-1,0];
+        break;
+    case "s": 
+        axis=[1,0,0];
+        break;
+
+    default: 
+        rotate=false;
+        break;
+    }
+
+    if(rotate) {
+        mat4.rotate(rotationMatrix,rotationMatrix,0.1,axis);
+        redraw=true;
+    }
+
+}
+
+function handleMouseWheel(event) {
+    zoomFactor -= event.deltaY/100;
+
+    if(zoomFactor < 0) {
+        zoomFactor=0;
+    } else if(zoomFactor > 100) {
+        zoomFactor=100;
+    }
+
+    res=zoomFactor*0.001;
+    redraw=true;
+}
+
+function handleMouseMove(event) {
+    if(!mouseDownOrTouchActive) {
+        return;
+    }
+
+    var newX=event.clientX;
+    var newY=event.clientY;
+
+    processDrag(newX,newY,event.getModifierState("Alt"));
+}
+
+function handleTouchMove(evt) {
+    evt.preventDefault();
+    var touches=evt.targetTouches;
+
+    if(touches.length == 1 && touchId == touches[0].identifier) {
+        var newX=touches[0].pageX;
+        var newY=touches[0].pageY;
+        processDrag(newX,newY);
+    }
+}
+
+// Prepare canvas for drawing
+function sceneSetup() {
+    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
+    mat4.perspective(pMatrix,45,gl.viewportWidth/gl.viewportHeight,0.1,100.0);
+    mat4.identity(mvMatrix);
+
+    mat4.translate(mvMatrix,mvMatrix,centerInv);
+    mat4.multiply(mvMatrix,mvMatrix,rotationMatrix);
+    mat4.scale(mvMatrix,mvMatrix,[zoomFactor,zoomFactor,zoomFactor]);
+    mat4.translate(mvMatrix,mvMatrix,center);
+
+    mat4.translate(mvMatrix,mvMatrix,translOffset)
+}
+
+var indexExt;
+
+// Create buffer data for the patch and its subdivisions to be pushed to the graphics card
+//Takes as an argument the array of vertices that define the patch to be drawn 
+// Using the vertex position buffer of the above function,draw patch.
+function setBuffer() {
+    VertexBuffer=gl.createBuffer();
+    VertexBuffer.itemSize=3;
+
+    ColorBuffer=gl.createBuffer();
+    ColorBuffer.itemSize=4;
+
+    indexBuffer=gl.createBuffer();
+    indexBuffer.itemSize=1;
+}
+
+function drawBuffer() {
+    gl.bindBuffer(gl.ARRAY_BUFFER,VertexBuffer);
+    gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(vertices),gl.STATIC_DRAW);
+    gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,
+                           VertexBuffer.itemSize,gl.FLOAT,false,0,0);
+    VertexBuffer.numItems=nvertices;
+
+    gl.bindBuffer(gl.ARRAY_BUFFER,ColorBuffer);
+    gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(colors),gl.STATIC_DRAW);
+    gl.vertexAttribPointer(shaderProgram.vertexColorAttribute,
+                           ColorBuffer.itemSize,gl.FLOAT,false,0,0);
+    ColorBuffer.numItems=nvertices;
+
+    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,indexBuffer);
+    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,
+                  indexExt ? new Uint32Array(indices) : new Uint16Array(indices),
+                  gl.STATIC_DRAW);
+    indexBuffer.numItems=indices.length;
+    gl.drawElements(gl.TRIANGLES,indexBuffer.numItems,
+                    indexExt ? gl.UNSIGNED_INT : gl.UNSIGNED_SHORT,0);
+    vertices=[];
+    colors=[];
+    indices=[];
+    nvertices=0;
+}
+
+var pixel=1.0; // Adaptive rendering constant.
+var FillFactor=0.1;
+var BezierFactor=0.4;
+//var res=0.0005; // Temporary
+var res=0.001; // Temporary
+var res2=res*res;
+var Epsilon=0.1*res;
+var epsilon=0;
+var Fuzz=1000*Number.EPSILON;
+var Fuzz2=Fuzz*Fuzz;
+
+function Split3(z0, c0, c1, z1) {
+    this.m0=new Array(3);
+    this.m2=new Array(3);
+    this.m3=new Array(3);
+    this.m4=new Array(3);
+    this.m5=new Array(3);
+    for(var i=0; i < 3; ++i) {
+        this.m0[i]=0.5*(z0[i]+c0[i]);
+        var m1=0.5*(c0[i]+c1[i]);
+        this.m2[i]=0.5*(c1[i]+z1[i]);
+        this.m3[i]=0.5*(this.m0[i]+m1);
+        this.m4[i]=0.5*(m1+this.m2[i]);
+        this.m5[i]=0.5*(this.m3[i]+this.m4[i]);
+    }
+}
+
+function unit(v) {
+    var norm=Math.sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
+    norm=(norm != 0) ? 1/norm : 1;
+    return [v[0]*norm,v[1]*norm,v[2]*norm];
+}
+
+// Store the vertex v and its color vector c in the buffer.
+function vertex(v,c) {
+    vertices.push(v[0]);
+    vertices.push(v[1]);
+    vertices.push(v[2]);
+
+    colors.push(c[0]);
+    colors.push(c[1]);
+    colors.push(c[2]);
+    colors.push(c[3]);
+    return nvertices++;
+}
+
+function abs2(v) {
+    return v[0]*v[0]+v[1]*v[1]+v[2]*v[2];
+}
+
+function dot(u, v) {
+    return u[0]*v[0]+u[1]*v[1]+u[2]*v[2];
+}
+
+function cross(u, v) {
+    return [u[1]*v[2]-u[2]*v[1],
+            u[2]*v[0]-u[0]*v[2],
+            u[0]*v[1]-u[1]*v[0]
+           ];
+}
+
+function normal(left3, left2, left1, middle, right1, right2, right3) {
+    var u0=right1[0]-middle[0];
+    var v0=left1[0]-middle[0];
+    var u1=right1[1]-middle[1];
+    var v1=left1[1]-middle[1];
+    var u2=right1[2]-middle[2];
+    var v2=left1[2]-middle[2];
+    var n=[
+        u1*v2-u2*v1,
+        u2*v0-u0*v2,
+        u0*v1-u1*v0
+    ];
+    if(abs2(n) > epsilon)
+        return unit(n);
+
+    var lp=[v0,v1,v2];
+    var rp=[u0,u1,u2];
+    var lpp=[middle[0]+left2[0]-2*left1[0],
+             middle[1]+left2[1]-2*left1[1],
+             middle[2]+left2[2]-2*left1[2]
+            ];
+    var rpp=[middle[0]+right2[0]-2*right1[0],
+             middle[1]+right2[1]-2*right1[1],
+             middle[2]+right2[2]-2*right1[2]
+            ];
+    var a=cross(rpp,lp);
+    var b=cross(rp,lpp);
+    n=[a[0]+b[0],
+       a[1]+b[1],
+       a[2]+b[2]
+      ];
+    if(abs2(n) > epsilon)
+        return unit(n);
+
+    var lppp=[left3[0]-middle[0]+3*(left1[0]-left2[0]),
+              left3[1]-middle[1]+3*(left1[1]-left2[1]),
+              left3[2]-middle[2]+3*(left1[2]-left2[2])
+             ];
+    var rppp=[right3[0]-middle[0]+3*(right1[0]-right2[0]),
+              right3[1]-middle[1]+3*(right1[1]-right2[1]),
+              right3[2]-middle[2]+3*(right1[2]-right2[2])
+             ];
+    a=cross(rpp,lpp);
+    b=cross(rp,lppp);
+    var c=cross(rppp,lp);
+    var d=cross(rppp,lpp);
+    var e=cross(rpp,lppp);
+    var f=cross(rppp,lppp);
+    return unit([9*a[0]+3*(b[0]+c[0]+d[0]+e[0])+f[0],
+                 9*a[1]+3*(b[1]+c[1]+d[1]+e[1])+f[1],
+                 9*a[2]+3*(b[2]+c[2]+d[2]+e[2])+f[2]
+                ]);
+}
+
+// return the maximum distance squared of points c0 and c1 from 
+// the respective internal control points of z0--z1.
+function Straightness(z0,c0,c1,z1)
+{
+    var third=1.0/3.0;
+    var v=[third*(z1[0]-z0[0]),third*(z1[1]-z0[1]),third*(z1[2]-z0[2])];
+    return Math.max(abs2([c0[0]-v[0]-z0[0],c0[1]-v[1]-z0[1],c0[2]-v[2]-z0[2]]),
+                    abs2([z1[0]-v[0]-c1[0],z1[1]-v[1]-c1[1],z1[2]-v[2]-c1[2]]));
+}
+
+// return the maximum perpendicular distance squared of points c0 and c1
+// from z0--z1.
+function Distance1(z0, c0, c1, z1) {
+    var Z0=[c0[0]-z0[0],c0[1]-z0[1],c0[2]-z0[2]];
+    var Q=unit([z1[0]-z0[0],z1[1]-z0[1],z1[2]-z0[2]]);
+    var Z1=[c1[0]-z0[0],c1[1]-z0[1],c1[2]-z0[2]];
+    var p0=dot(Z0,Q);
+    var p1=dot(Z1,Q);
+    return Math.max(abs2([Z0[0]-p0*Q[0],Z0[1]-p0*Q[1],Z0[2]-p0*Q[2]]),
+                    abs2([Z1[0]-p1*Q[0],Z1[1]-p1*Q[1],Z1[2]-p1*Q[2]]));
+}
+
+// return the perpendicular distance squared of a point z from the plane
+// through u with unit normal n.
+function Distance2(z, u, n) {
+    var d=dot([z[0]-u[0],z[1]-u[1],z[2]-u[2]],n);
+    return d*d;
+}
+
+function Distance(p) {
+    var p0=p[0];
+    var p3=p[3];
+    var p12=p[12];
+    var p15=p[15];
+
+    // Check the flatness of the quad.
+    var d=Distance2(p15,p0,normal(p3,p[2],p[1],p0,p[4],p[8],p12));
+    
+    // Determine how straight the edges are.
+    d=Math.max(d,Straightness(p0,p[1],p[2],p3));
+    d=Math.max(d,Straightness(p0,p[4],p[8],p12));
+    d=Math.max(d,Straightness(p3,p[7],p[11],p15));
+    d=Math.max(d,Straightness(p12,p[13],p[14],p15));
+    
+    // Determine how straight the interior control curves are.
+    d=Math.max(d,Straightness(p[4],p[5],p[6],p[7]));
+    d=Math.max(d,Straightness(p[8],p[9],p[10],p[11]));
+    d=Math.max(d,Straightness(p[1],p[5],p[9],p[13]));
+    return Math.max(d,Straightness(p[2],p[6],p[10],p[14]));
+}
+
+var k=1;
+// Return color associated with unit normal vector n.
+function color(n) {
+    var Ldotn=L[0]*n[0]+L[1]*n[1]+L[2]*n[2];
+    if(Ldotn < 0) Ldotn=0;
+    var p=[emissive[0]+ambient[0]*Ambient[0]+Ldotn*diffuse[0]*Diffuse[0],
+           emissive[1]+ambient[1]*Ambient[1]+Ldotn*diffuse[1]*Diffuse[1],
+           emissive[2]+ambient[2]*Ambient[2]+Ldotn*diffuse[2]*Diffuse[2]
+          ];
+    var s=shininess*128;
+    var H=unit([L[0],L[1],L[2]+1]);
+    var f=Math.pow(H[0]*n[0]+H[1]*n[1]+H[2]*n[2],s);
+
+    if(Ldotn > 0) // Phong-Blinn model of specular reflection
+        p=[p[0]+f*specular[0]*Specular[0],p[1]+f*specular[1]*Specular[1],
+           p[2]+f*specular[2]*Specular[2]
+          ];
+
+    return [p[0],p[1],p[2],1];
+}
+
+function render(p, I0, I1, I2, I3, P0, P1, P2, P3, flat0, flat1, flat2, flat3,
+                C0, C1, C2, C3) {
+    if(Distance(p) < res2) { // Patch is flat
+        indices.push(I0);
+        indices.push(I1);
+        indices.push(I2);
+
+        indices.push(I0);
+        indices.push(I2);
+        indices.push(I3);
+        return;
+    }
+
+    var p0=p[0];
+    var p3=p[3];
+    var p12=p[12];
+    var p15=p[15];
+
+    var c0=new Split3(p0,p[1],p[2],p3);
+    var c1=new Split3(p[4],p[5],p[6],p[7]);
+    var c2=new Split3(p[8],p[9],p[10],p[11]);
+    var c3=new Split3(p12,p[13],p[14],p15);
+    var c4=new Split3(p0,p[4],p[8],p12);
+    var c5=new Split3(c0.m0,c1.m0,c2.m0,c3.m0);
+    var c6=new Split3(c0.m3,c1.m3,c2.m3,c3.m3);
+    var c7=new Split3(c0.m5,c1.m5,c2.m5,c3.m5);
+    var c8=new Split3(c0.m4,c1.m4,c2.m4,c3.m4);
+    var c9=new Split3(c0.m2,c1.m2,c2.m2,c3.m2);
+    var c10=new Split3(p3,p[7],p[11],p15);
+
+    var s0=[p0,c0.m0,c0.m3,c0.m5,c4.m0,c5.m0,c6.m0,c7.m0,
+            c4.m3,c5.m3,c6.m3,c7.m3,c4.m5,c5.m5,c6.m5,c7.m5
+           ];
+    var s1=[c4.m5,c5.m5,c6.m5,c7.m5,c4.m4,c5.m4,c6.m4,c7.m4,
+            c4.m2,c5.m2,c6.m2,c7.m2,p12,c3.m0,c3.m3,c3.m5
+           ];
+    var s2=[c7.m5,c8.m5,c9.m5,c10.m5,c7.m4,c8.m4,c9.m4,c10.m4,
+            c7.m2,c8.m2,c9.m2,c10.m2,c3.m5,c3.m4,c3.m2,p15
+           ];
+    var s3=[c0.m5,c0.m4,c0.m2,p3,c7.m0,c8.m0,c9.m0,c10.m0,
+            c7.m3,c8.m3,c9.m3,c10.m3,c7.m5,c8.m5,c9.m5,c10.m5
+           ];
+
+    var m4=s0[15];
+
+    var n0=normal(s0[0],s0[4],s0[8],s0[12],s0[13],s0[14],s0[15]);
+    if(n0 == 0.0) {
+        n0=normal(s0[0],s0[4],s0[8],s0[12],s0[11],s0[7],s0[3]);
+        if(n0 == 0.0) n0=normal(s0[3],s0[2],s0[1],s0[0],s0[13],s0[14],s0[15]);
+    }
+
+    var n1=normal(s1[12],s1[13],s1[14],s1[15],s1[11],s1[7],s1[3]);
+    if(n1 == 0.0) {
+        n1=normal(s1[12],s1[13],s1[14],s1[15],s1[2],s1[1],s1[0]);
+        if(n1 == 0.0) n1=normal(s1[0],s1[4],s1[8],s1[12],s1[11],s1[7],s1[3]);
+    }
+
+    var n2=normal(s2[15],s2[11],s2[7],s2[3],s2[2],s2[1],s2[0]);
+    if(n2 == 0.0) {
+        n2=normal(s2[15],s2[11],s2[7],s2[3],s2[4],s2[8],s2[12]);
+        if(n2 == 0.0) n2=normal(s2[12],s2[13],s2[14],s2[15],s2[2],s2[1],s2[0]);
+    }
+
+    var n3=normal(s3[3],s3[2],s3[1],s3[0],s3[4],s3[8],s3[12]);
+    if(n3 == 0.0) {
+        n3=normal(s3[3],s3[2],s3[1],s3[0],s3[13],s3[14],s3[15]);
+        if(n3 == 0.0) n3=normal(s3[15],s3[11],s3[7],s3[3],s3[4],s3[8],s3[12]);
+    }
+
+    var n4=normal(s2[3],s2[2],s2[1],m4,s2[4],s2[8],s2[12]);
+
+    var m0,m1,m2,m3;
+
+    // A kludge to remove subdivision cracks, only applied the first time
+    // an edge is found to be flat before the rest of the subpatch is.
+    if(flat0)
+        m0=[0.5*(P0[0]+P1[0]),0.5*(P0[1]+P1[1]),0.5*(P0[2]+P1[2])];
+    else {
+        if((flat0=Distance1(p0,p[4],p[8],p12) < res2)) {
+            var u=s0[12];
+            var v=s2[3];
+            var e=unit([u[0]-v[0],u[1]-v[1],u[2]-v[2]]);
+            m0=[0.5*(P0[0]+P1[0])+Epsilon*e[0],0.5*(P0[1]+P1[1])+Epsilon*e[1],
+                0.5*(P0[2]+P1[2])+Epsilon*e[2]
+               ];
+        } else
+            m0=s0[12];
+    }
+
+    if(flat1)
+        m1=[0.5*(P1[0]+P2[0]),0.5*(P1[1]+P2[1]),0.5*(P1[2]+P2[2])];
+    else {
+        if((flat1=Distance1(p12,p[13],p[14],p15) < res2)) {
+            var u=s1[15];
+            var v=s3[0];
+            var e=unit([u[0]-v[0],u[1]-v[1],u[2]-v[2]]);
+            m1=[0.5*(P1[0]+P2[0])+Epsilon*e[0],0.5*(P1[1]+P2[1])+Epsilon*e[1],
+                0.5*(P1[2]+P2[2])+Epsilon*e[2]
+               ];
+        } else
+            m1=s1[15];
+    }
+
+    if(flat2)
+        m2=[0.5*(P2[0]+P3[0]),0.5*(P2[1]+P3[1]),0.5*(P2[2]+P3[2])];
+    else {
+        if((flat2=Distance1(p15,p[11],p[7],p3) < res2)) {
+            var u=s2[3];
+            var v=s0[12];
+            var e=unit([u[0]-v[0],u[1]-v[1],u[2]-v[2]]);
+            m2=[0.5*(P2[0]+P3[0])+Epsilon*e[0],0.5*(P2[1]+P3[1])+Epsilon*e[1],
+                0.5*(P2[2]+P3[2])+Epsilon*e[2]
+               ];
+        } else
+            m2=s2[3];
+    }
+
+    if(flat3)
+        m3=[0.5*(P3[0]+P0[0]),0.5*(P3[1]+P0[1]),0.5*(P3[2]+P0[2])];
+    else {
+        if((flat3=Distance1(p3,p[2],p[1],p0) < res2)) {
+            var u=s3[0];
+            var v=s1[15];
+            var e=unit([u[0]-v[0],u[1]-v[1],u[2]-v[2]]);
+            m3=[0.5*(P3[0]+P0[0])+Epsilon*e[0],
+                0.5*(P3[1]+P0[1])+Epsilon*e[1],
+                0.5*(P3[2]+P0[2])+Epsilon*e[2]
+               ];
+        } else
+            m3=s3[0];
+    }
+
+    //  document.write(n0);      
+    //  document.write(" < br > ");
+
+    {
+        /*
+          var c0=new Array(4);
+          var c1=new Array(4);
+          var c2=new Array(4);
+          var c3=new Array(4);
+          var c4=new Array(4);
+          
+          for(var i=0; i < 4; ++i) {
+          c0[i]=0.5*(C0[i]+C1[i]);
+          c1[i]=0.5*(C1[i]+C2[i]);
+          c2[i]=0.5*(C2[i]+C3[i]);
+          c3[i]=0.5*(C3[i]+C0[i]);
+          c4[i]=0.5*(c0[i]+c2[i]);
+          }
+       */
+
+        var c0=color(n0);
+        var c1=color(n1);
+        var c2=color(n2);
+        var c3=color(n3);
+        var c4=color(n4);
+
+
+        var i0=vertex(m0,c0);
+        var i1=vertex(m1,c1);
+        var i2=vertex(m2,c2);
+        var i3=vertex(m3,c3);
+        var i4=vertex(m4,c4);
+
+        render(s0,I0,i0,i4,i3,P0,m0,m4,m3,flat0,false,false,flat3,
+               C0,c0,c4,c3);
+        render(s1,i0,I1,i1,i4,m0,P1,m1,m4,flat0,flat1,false,false,
+               c0,C1,c1,c4);
+        render(s2,i4,i1,I2,i2,m4,m1,P2,m2,false,flat1,flat2,false,
+               c4,c1,C2,c2);
+        render(s3,i3,i4,i2,I3,m3,m4,m2,P3,false,false,flat2,flat3,
+               c3,c4,c2,C3);
+    }
+}
+
+
+function draw(p) {
+    var p0=p[0];
+    var p3=p[3];
+    var p12=p[12];
+    var p15=p[15];
+
+    epsilon=0;
+    for(var i=1; i < 16; ++i)
+        epsilon=Math.max(epsilon,
+                         abs2([p[i][0]-p0[0],p[i][1]-p0[1],p[i][2]-p0[2]]));
+    epsilon *= Fuzz2;
+
+    var n0=normal(p3,p[2],p[1],p0,p[4],p[8],p12);
+    var n1=normal(p0,p[4],p[8],p12,p[13],p[14],p15);
+    var n2=normal(p12,p[13],p[14],p15,p[11],p[7],p3);
+    var n3=normal(p15,p[11],p[7],p3,p[2],p[1],p0);
+
+    var c0=color(n0);
+    var c1=color(n1);
+    var c2=color(n2);
+    var c3=color(n3);
+
+    var i0=vertex(p0,c0);
+    var i1=vertex(p12,c1);
+    var i2=vertex(p15,c2);
+    var i3=vertex(p3,c3);
+
+    render(p,i0,i1,i2,i3,p0,p12,p15,p3,false,false,false,false,
+           c0,c1,c2,c3);
+
+    drawBuffer();
+}
+
+var p=[];
+
+function tick() {
+    requestAnimationFrame(tick);
+    if(redraw) {
+        sceneSetup();
+        mat4.translate(mvMatrix,mvMatrix,[-0.5,-0.5,-1.5]);
+        setMatrixUniforms();
+        for(var i=0; i < p.length; ++i)
+            draw(p[i]);
+        redraw=false;
+    }
+}
+
+function webGLStart() {
+    var canvas=document.getElementById("Asymptote");
+    initGL(canvas);
+    initShaders();
+    gl.clearColor(0.0,0.0,0.0,1.0);
+    gl.enable(gl.DEPTH_TEST);
+
+    indexExt=gl.getExtension("OES_element_index_uint");
+
+    gl.viewport(0,0,gl.viewportWidth,gl.viewportHeight);
+    setBuffer();
+
+    canvas.onmousedown=handleMouseDown;
+    document.onmouseup=handleMouseUpOrTouchEnd;
+    document.onmousemove=handleMouseMove;
+    canvas.onkeydown=handleKey;
+    document.onwheel=handleMouseWheel;
+
+    canvas.addEventListener("touchstart",handleTouchStart,false);
+    canvas.addEventListener("touchend",handleMouseUpOrTouchEnd,false);
+    canvas.addEventListener("touchcancel",handleMouseUpOrTouchEnd,false);
+    canvas.addEventListener("touchleave",handleMouseUpOrTouchEnd,false);
+    canvas.addEventListener("touchmove",handleTouchMove,false);
+
+    tick();
+}
+
+
+// Lighting parameters
+var L = [0.447735768366173, 0.497260947684137, 0.743144825477394];
+var Ambient = [0.1, 0.1, 0.1];
+var Diffuse = [0.8, 0.8, 0.8, 1];
+var Specular = [0.7, 0.7, 0.7, 1];
+var specularfactor = 3;
+
+// Material parameters
+var emissive = [0, 0, 0, 1];
+var ambient = [1, 1, 1, 1];
+var diffuse = [0, 1, 0, 1];
+var specular = [0.75, 0.75, 0.75, 1];
+var shininess = 0.5;

Added: trunk/Build/source/utils/asymptote/webgl/glm-js-min-2.2.2.js
===================================================================
--- trunk/Build/source/utils/asymptote/webgl/glm-js-min-2.2.2.js	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/webgl/glm-js-min-2.2.2.js	2019-03-27 22:27:57 UTC (rev 50622)
@@ -0,0 +1,273 @@
+/*! glm-js built 2017-03-20 16:45:23-04:00 | (c) humbletim | http://humbletim.github.io/glm-js */
+(function declare_glmjs_glmatrix(globals, $GLM_log, $GLM_console_log) { var GLM, GLMAT, GLMAT_VERSION, GLMJS_PREFIX, $GLM_console_factory, glm; ArrayBuffer.exists;
+/*
+
+ --------------------------------------------------------------------------
+ glm-js | (c) humbletim | http://humbletim.github.io/glm-js
+ --------------------------------------------------------------------------
+
+ The MIT License (MIT)
+
+ Copyright (c) 2015-2016 humbletim
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+
+ --------------------------------------------------------------------------
+ gl-matrix | (c) Brandon Jones, Colin MacKenzie IV | http://glmatrix.net/
+ --------------------------------------------------------------------------
+
+ Copyright (c) 2013 Brandon Jones, Colin MacKenzie IV
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+
+  2. Altered source versions must be plainly marked as such, and must not
+     be misrepresented as being the original software.
+
+  3. This notice may not be removed or altered from any source distribution.
+*/
+GLMAT={};GLMAT_VERSION="2.2.2";
+(function(a){a.VERSION=GLMAT_VERSION;if(!b)var b=1E-6;if(!c)var c="undefined"!==typeof Float32Array?Float32Array:Array;if(!e)var e=Math.random;var d={setMatrixArrayType:function(y){c=y}};"undefined"!==typeof a&&(a.glMatrix=d);var h=Math.PI/180;d.toRadian=function(y){return y*h};d={create:function(){var y=new c(2);y[0]=0;y[1]=0;return y},clone:function(y){var a=new c(2);a[0]=y[0];a[1]=y[1];return a},fromValues:function(y,a){var v=new c(2);v[0]=y;v[1]=a;return v},copy:function(y,a){y[0]=a[0];y[1]=a[1];
+return y},set:function(y,a,v){y[0]=a;y[1]=v;return y},add:function(y,a,v){y[0]=a[0]+v[0];y[1]=a[1]+v[1];return y},subtract:function(y,a,v){y[0]=a[0]-v[0];y[1]=a[1]-v[1];return y}};d.sub=d.subtract;d.multiply=function(y,a,v){y[0]=a[0]*v[0];y[1]=a[1]*v[1];return y};d.mul=d.multiply;d.divide=function(y,a,v){y[0]=a[0]/v[0];y[1]=a[1]/v[1];return y};d.div=d.divide;d.min=function(y,a,v){y[0]=Math.min(a[0],v[0]);y[1]=Math.min(a[1],v[1]);return y};d.max=function(y,a,v){y[0]=Math.max(a[0],v[0]);y[1]=Math.max(a[1],
+v[1]);return y};d.scale=function(y,a,v){y[0]=a[0]*v;y[1]=a[1]*v;return y};d.scaleAndAdd=function(y,a,v,b){y[0]=a[0]+v[0]*b;y[1]=a[1]+v[1]*b;return y};d.distance=function(a,f){var v=f[0]-a[0],b=f[1]-a[1];return Math.sqrt(v*v+b*b)};d.dist=d.distance;d.squaredDistance=function(a,f){var v=f[0]-a[0],b=f[1]-a[1];return v*v+b*b};d.sqrDist=d.squaredDistance;d.length=function(a){var f=a[0];a=a[1];return Math.sqrt(f*f+a*a)};d.len=d.length;d.squaredLength=function(a){var f=a[0];a=a[1];return f*f+a*a};d.sqrLen=
+d.squaredLength;d.negate=function(a,f){a[0]=-f[0];a[1]=-f[1];return a};d.inverse=function(a,f){a[0]=1/f[0];a[1]=1/f[1];return a};d.normalize=function(a,f){var v=f[0],b=f[1],v=v*v+b*b;0<v&&(v=1/Math.sqrt(v),a[0]=f[0]*v,a[1]=f[1]*v);return a};d.dot=function(a,f){return a[0]*f[0]+a[1]*f[1]};d.cross=function(a,f,v){f=f[0]*v[1]-f[1]*v[0];a[0]=a[1]=0;a[2]=f;return a};d.lerp=function(a,f,v,b){var c=f[0];f=f[1];a[0]=c+b*(v[0]-c);a[1]=f+b*(v[1]-f);return a};d.random=function(a,f){f=f||1;var v=2*e()*Math.PI;
+a[0]=Math.cos(v)*f;a[1]=Math.sin(v)*f;return a};d.transformMat2=function(a,f,v){var b=f[0];f=f[1];a[0]=v[0]*b+v[2]*f;a[1]=v[1]*b+v[3]*f;return a};d.transformMat2d=function(a,f,v){var b=f[0];f=f[1];a[0]=v[0]*b+v[2]*f+v[4];a[1]=v[1]*b+v[3]*f+v[5];return a};d.transformMat3=function(a,f,b){var c=f[0];f=f[1];a[0]=b[0]*c+b[3]*f+b[6];a[1]=b[1]*c+b[4]*f+b[7];return a};d.transformMat4=function(a,f,b){var c=f[0];f=f[1];a[0]=b[0]*c+b[4]*f+b[12];a[1]=b[1]*c+b[5]*f+b[13];return a};var j=d.create();d.forEach=function(a,
+f,b,c,d,e){f||(f=2);b||(b=0);for(c=c?Math.min(c*f+b,a.length):a.length;b<c;b+=f)j[0]=a[b],j[1]=a[b+1],d(j,j,e),a[b]=j[0],a[b+1]=j[1];return a};d.str=function(a){return"vec2("+a[0]+", "+a[1]+")"};"undefined"!==typeof a&&(a.vec2=d);var g={create:function(){var a=new c(3);a[0]=0;a[1]=0;a[2]=0;return a},clone:function(a){var f=new c(3);f[0]=a[0];f[1]=a[1];f[2]=a[2];return f},fromValues:function(a,f,b){var P=new c(3);P[0]=a;P[1]=f;P[2]=b;return P},copy:function(a,f){a[0]=f[0];a[1]=f[1];a[2]=f[2];return a},
+set:function(a,f,b,c){a[0]=f;a[1]=b;a[2]=c;return a},add:function(a,f,b){a[0]=f[0]+b[0];a[1]=f[1]+b[1];a[2]=f[2]+b[2];return a},subtract:function(a,f,b){a[0]=f[0]-b[0];a[1]=f[1]-b[1];a[2]=f[2]-b[2];return a}};g.sub=g.subtract;g.multiply=function(a,f,b){a[0]=f[0]*b[0];a[1]=f[1]*b[1];a[2]=f[2]*b[2];return a};g.mul=g.multiply;g.divide=function(a,f,b){a[0]=f[0]/b[0];a[1]=f[1]/b[1];a[2]=f[2]/b[2];return a};g.div=g.divide;g.min=function(a,f,b){a[0]=Math.min(f[0],b[0]);a[1]=Math.min(f[1],b[1]);a[2]=Math.min(f[2],
+b[2]);return a};g.max=function(a,f,b){a[0]=Math.max(f[0],b[0]);a[1]=Math.max(f[1],b[1]);a[2]=Math.max(f[2],b[2]);return a};g.scale=function(a,f,b){a[0]=f[0]*b;a[1]=f[1]*b;a[2]=f[2]*b;return a};g.scaleAndAdd=function(a,f,b,c){a[0]=f[0]+b[0]*c;a[1]=f[1]+b[1]*c;a[2]=f[2]+b[2]*c;return a};g.distance=function(a,f){var b=f[0]-a[0],c=f[1]-a[1],d=f[2]-a[2];return Math.sqrt(b*b+c*c+d*d)};g.dist=g.distance;g.squaredDistance=function(a,f){var b=f[0]-a[0],c=f[1]-a[1],d=f[2]-a[2];return b*b+c*c+d*d};g.sqrDist=
+g.squaredDistance;g.length=function(a){var f=a[0],b=a[1];a=a[2];return Math.sqrt(f*f+b*b+a*a)};g.len=g.length;g.squaredLength=function(a){var f=a[0],b=a[1];a=a[2];return f*f+b*b+a*a};g.sqrLen=g.squaredLength;g.negate=function(a,f){a[0]=-f[0];a[1]=-f[1];a[2]=-f[2];return a};g.inverse=function(a,f){a[0]=1/f[0];a[1]=1/f[1];a[2]=1/f[2];return a};g.normalize=function(a,f){var b=f[0],c=f[1],d=f[2],b=b*b+c*c+d*d;0<b&&(b=1/Math.sqrt(b),a[0]=f[0]*b,a[1]=f[1]*b,a[2]=f[2]*b);return a};g.dot=function(a,f){return a[0]*
+f[0]+a[1]*f[1]+a[2]*f[2]};g.cross=function(a,f,b){var c=f[0],d=f[1];f=f[2];var e=b[0],l=b[1];b=b[2];a[0]=d*b-f*l;a[1]=f*e-c*b;a[2]=c*l-d*e;return a};g.lerp=function(a,f,b,c){var d=f[0],e=f[1];f=f[2];a[0]=d+c*(b[0]-d);a[1]=e+c*(b[1]-e);a[2]=f+c*(b[2]-f);return a};g.random=function(a,f){f=f||1;var b=2*e()*Math.PI,c=2*e()-1,d=Math.sqrt(1-c*c)*f;a[0]=Math.cos(b)*d;a[1]=Math.sin(b)*d;a[2]=c*f;return a};g.transformMat4=function(a,f,b){var c=f[0],d=f[1];f=f[2];var e=b[3]*c+b[7]*d+b[11]*f+b[15],e=e||1;a[0]=
+(b[0]*c+b[4]*d+b[8]*f+b[12])/e;a[1]=(b[1]*c+b[5]*d+b[9]*f+b[13])/e;a[2]=(b[2]*c+b[6]*d+b[10]*f+b[14])/e;return a};g.transformMat3=function(a,f,b){var c=f[0],d=f[1];f=f[2];a[0]=c*b[0]+d*b[3]+f*b[6];a[1]=c*b[1]+d*b[4]+f*b[7];a[2]=c*b[2]+d*b[5]+f*b[8];return a};g.transformQuat=function(a,f,b){var c=f[0],d=f[1],e=f[2];f=b[0];var l=b[1],x=b[2];b=b[3];var u=b*c+l*e-x*d,J=b*d+x*c-f*e,g=b*e+f*d-l*c,c=-f*c-l*d-x*e;a[0]=u*b+c*-f+J*-x-g*-l;a[1]=J*b+c*-l+g*-f-u*-x;a[2]=g*b+c*-x+u*-l-J*-f;return a};g.rotateX=
+function(a,f,b,c){var d=[],e=[];d[0]=f[0]-b[0];d[1]=f[1]-b[1];d[2]=f[2]-b[2];e[0]=d[0];e[1]=d[1]*Math.cos(c)-d[2]*Math.sin(c);e[2]=d[1]*Math.sin(c)+d[2]*Math.cos(c);a[0]=e[0]+b[0];a[1]=e[1]+b[1];a[2]=e[2]+b[2];return a};g.rotateY=function(a,f,b,c){var d=[],e=[];d[0]=f[0]-b[0];d[1]=f[1]-b[1];d[2]=f[2]-b[2];e[0]=d[2]*Math.sin(c)+d[0]*Math.cos(c);e[1]=d[1];e[2]=d[2]*Math.cos(c)-d[0]*Math.sin(c);a[0]=e[0]+b[0];a[1]=e[1]+b[1];a[2]=e[2]+b[2];return a};g.rotateZ=function(a,f,b,c){var d=[],e=[];d[0]=f[0]-
+b[0];d[1]=f[1]-b[1];d[2]=f[2]-b[2];e[0]=d[0]*Math.cos(c)-d[1]*Math.sin(c);e[1]=d[0]*Math.sin(c)+d[1]*Math.cos(c);e[2]=d[2];a[0]=e[0]+b[0];a[1]=e[1]+b[1];a[2]=e[2]+b[2];return a};var k=g.create();g.forEach=function(a,f,b,c,d,e){f||(f=3);b||(b=0);for(c=c?Math.min(c*f+b,a.length):a.length;b<c;b+=f)k[0]=a[b],k[1]=a[b+1],k[2]=a[b+2],d(k,k,e),a[b]=k[0],a[b+1]=k[1],a[b+2]=k[2];return a};g.str=function(a){return"vec3("+a[0]+", "+a[1]+", "+a[2]+")"};"undefined"!==typeof a&&(a.vec3=g);var i={create:function(){var a=
+new c(4);a[0]=0;a[1]=0;a[2]=0;a[3]=0;return a},clone:function(a){var f=new c(4);f[0]=a[0];f[1]=a[1];f[2]=a[2];f[3]=a[3];return f},fromValues:function(a,f,b,d){var e=new c(4);e[0]=a;e[1]=f;e[2]=b;e[3]=d;return e},copy:function(a,f){a[0]=f[0];a[1]=f[1];a[2]=f[2];a[3]=f[3];return a},set:function(a,f,b,c,d){a[0]=f;a[1]=b;a[2]=c;a[3]=d;return a},add:function(a,f,b){a[0]=f[0]+b[0];a[1]=f[1]+b[1];a[2]=f[2]+b[2];a[3]=f[3]+b[3];return a},subtract:function(a,f,b){a[0]=f[0]-b[0];a[1]=f[1]-b[1];a[2]=f[2]-b[2];
+a[3]=f[3]-b[3];return a}};i.sub=i.subtract;i.multiply=function(a,f,b){a[0]=f[0]*b[0];a[1]=f[1]*b[1];a[2]=f[2]*b[2];a[3]=f[3]*b[3];return a};i.mul=i.multiply;i.divide=function(a,f,b){a[0]=f[0]/b[0];a[1]=f[1]/b[1];a[2]=f[2]/b[2];a[3]=f[3]/b[3];return a};i.div=i.divide;i.min=function(a,f,b){a[0]=Math.min(f[0],b[0]);a[1]=Math.min(f[1],b[1]);a[2]=Math.min(f[2],b[2]);a[3]=Math.min(f[3],b[3]);return a};i.max=function(a,f,b){a[0]=Math.max(f[0],b[0]);a[1]=Math.max(f[1],b[1]);a[2]=Math.max(f[2],b[2]);a[3]=
+Math.max(f[3],b[3]);return a};i.scale=function(a,f,b){a[0]=f[0]*b;a[1]=f[1]*b;a[2]=f[2]*b;a[3]=f[3]*b;return a};i.scaleAndAdd=function(a,f,b,c){a[0]=f[0]+b[0]*c;a[1]=f[1]+b[1]*c;a[2]=f[2]+b[2]*c;a[3]=f[3]+b[3]*c;return a};i.distance=function(a,f){var b=f[0]-a[0],c=f[1]-a[1],d=f[2]-a[2],e=f[3]-a[3];return Math.sqrt(b*b+c*c+d*d+e*e)};i.dist=i.distance;i.squaredDistance=function(a,f){var b=f[0]-a[0],c=f[1]-a[1],d=f[2]-a[2],e=f[3]-a[3];return b*b+c*c+d*d+e*e};i.sqrDist=i.squaredDistance;i.length=function(a){var f=
+a[0],b=a[1],c=a[2];a=a[3];return Math.sqrt(f*f+b*b+c*c+a*a)};i.len=i.length;i.squaredLength=function(a){var f=a[0],b=a[1],c=a[2];a=a[3];return f*f+b*b+c*c+a*a};i.sqrLen=i.squaredLength;i.negate=function(a,f){a[0]=-f[0];a[1]=-f[1];a[2]=-f[2];a[3]=-f[3];return a};i.inverse=function(a,f){a[0]=1/f[0];a[1]=1/f[1];a[2]=1/f[2];a[3]=1/f[3];return a};i.normalize=function(a,f){var b=f[0],c=f[1],d=f[2],e=f[3],b=b*b+c*c+d*d+e*e;0<b&&(b=1/Math.sqrt(b),a[0]=f[0]*b,a[1]=f[1]*b,a[2]=f[2]*b,a[3]=f[3]*b);return a};
+i.dot=function(a,f){return a[0]*f[0]+a[1]*f[1]+a[2]*f[2]+a[3]*f[3]};i.lerp=function(a,f,b,c){var d=f[0],e=f[1],l=f[2];f=f[3];a[0]=d+c*(b[0]-d);a[1]=e+c*(b[1]-e);a[2]=l+c*(b[2]-l);a[3]=f+c*(b[3]-f);return a};i.random=function(a,f){f=f||1;a[0]=e();a[1]=e();a[2]=e();a[3]=e();i.normalize(a,a);i.scale(a,a,f);return a};i.transformMat4=function(a,f,b){var c=f[0],d=f[1],e=f[2];f=f[3];a[0]=b[0]*c+b[4]*d+b[8]*e+b[12]*f;a[1]=b[1]*c+b[5]*d+b[9]*e+b[13]*f;a[2]=b[2]*c+b[6]*d+b[10]*e+b[14]*f;a[3]=b[3]*c+b[7]*d+
+b[11]*e+b[15]*f;return a};i.transformQuat=function(a,b,c){var d=b[0],e=b[1],n=b[2];b=c[0];var l=c[1],x=c[2];c=c[3];var u=c*d+l*n-x*e,J=c*e+x*d-b*n,g=c*n+b*e-l*d,d=-b*d-l*e-x*n;a[0]=u*c+d*-b+J*-x-g*-l;a[1]=J*c+d*-l+g*-b-u*-x;a[2]=g*c+d*-x+u*-l-J*-b;return a};var w=i.create();i.forEach=function(a,b,c,d,e,n){b||(b=4);c||(c=0);for(d=d?Math.min(d*b+c,a.length):a.length;c<d;c+=b)w[0]=a[c],w[1]=a[c+1],w[2]=a[c+2],w[3]=a[c+3],e(w,w,n),a[c]=w[0],a[c+1]=w[1],a[c+2]=w[2],a[c+3]=w[3];return a};i.str=function(a){return"vec4("+
+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};"undefined"!==typeof a&&(a.vec4=i);d={create:function(){var a=new c(4);a[0]=1;a[1]=0;a[2]=0;a[3]=1;return a},clone:function(a){var b=new c(4);b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];return b},copy:function(a,b){a[0]=b[0];a[1]=b[1];a[2]=b[2];a[3]=b[3];return a},identity:function(a){a[0]=1;a[1]=0;a[2]=0;a[3]=1;return a},transpose:function(a,b){if(a===b){var c=b[1];a[1]=b[2];a[2]=c}else a[0]=b[0],a[1]=b[2],a[2]=b[1],a[3]=b[3];return a},invert:function(a,b){var c=
+b[0],d=b[1],e=b[2],n=b[3],l=c*n-e*d;if(!l)return null;l=1/l;a[0]=n*l;a[1]=-d*l;a[2]=-e*l;a[3]=c*l;return a},adjoint:function(a,b){var c=b[0];a[0]=b[3];a[1]=-b[1];a[2]=-b[2];a[3]=c;return a},determinant:function(a){return a[0]*a[3]-a[2]*a[1]},multiply:function(a,b,c){var d=b[0],e=b[1],n=b[2];b=b[3];var l=c[0],x=c[1],u=c[2];c=c[3];a[0]=d*l+n*x;a[1]=e*l+b*x;a[2]=d*u+n*c;a[3]=e*u+b*c;return a}};d.mul=d.multiply;d.rotate=function(a,b,c){var d=b[0],e=b[1],n=b[2];b=b[3];var l=Math.sin(c);c=Math.cos(c);a[0]=
+d*c+n*l;a[1]=e*c+b*l;a[2]=d*-l+n*c;a[3]=e*-l+b*c;return a};d.scale=function(a,b,c){var d=b[1],e=b[2],n=b[3],l=c[0];c=c[1];a[0]=b[0]*l;a[1]=d*l;a[2]=e*c;a[3]=n*c;return a};d.str=function(a){return"mat2("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};d.frob=function(a){return Math.sqrt(Math.pow(a[0],2)+Math.pow(a[1],2)+Math.pow(a[2],2)+Math.pow(a[3],2))};d.LDU=function(a,b,c,d){a[2]=d[2]/d[0];c[0]=d[0];c[1]=d[1];c[3]=d[3]-a[2]*c[1];return[a,b,c]};"undefined"!==typeof a&&(a.mat2=d);d={create:function(){var a=
+new c(6);a[0]=1;a[1]=0;a[2]=0;a[3]=1;a[4]=0;a[5]=0;return a},clone:function(a){var b=new c(6);b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];return b},copy:function(a,b){a[0]=b[0];a[1]=b[1];a[2]=b[2];a[3]=b[3];a[4]=b[4];a[5]=b[5];return a},identity:function(a){a[0]=1;a[1]=0;a[2]=0;a[3]=1;a[4]=0;a[5]=0;return a},invert:function(a,b){var c=b[0],d=b[1],e=b[2],n=b[3],l=b[4],x=b[5],u=c*n-d*e;if(!u)return null;u=1/u;a[0]=n*u;a[1]=-d*u;a[2]=-e*u;a[3]=c*u;a[4]=(e*x-n*l)*u;a[5]=(d*l-c*x)*u;return a},
+determinant:function(a){return a[0]*a[3]-a[1]*a[2]},multiply:function(a,b,c){var d=b[0],e=b[1],n=b[2],l=b[3],x=b[4];b=b[5];var u=c[0],g=c[1],h=c[2],K=c[3],j=c[4];c=c[5];a[0]=d*u+n*g;a[1]=e*u+l*g;a[2]=d*h+n*K;a[3]=e*h+l*K;a[4]=d*j+n*c+x;a[5]=e*j+l*c+b;return a}};d.mul=d.multiply;d.rotate=function(a,b,c){var d=b[0],e=b[1],n=b[2],l=b[3],x=b[4];b=b[5];var u=Math.sin(c);c=Math.cos(c);a[0]=d*c+n*u;a[1]=e*c+l*u;a[2]=d*-u+n*c;a[3]=e*-u+l*c;a[4]=x;a[5]=b;return a};d.scale=function(a,b,c){var d=b[1],e=b[2],
+n=b[3],l=b[4],x=b[5],u=c[0];c=c[1];a[0]=b[0]*u;a[1]=d*u;a[2]=e*c;a[3]=n*c;a[4]=l;a[5]=x;return a};d.translate=function(a,b,c){var d=b[0],e=b[1],n=b[2],l=b[3],x=b[4];b=b[5];var u=c[0];c=c[1];a[0]=d;a[1]=e;a[2]=n;a[3]=l;a[4]=d*u+n*c+x;a[5]=e*u+l*c+b;return a};d.str=function(a){return"mat2d("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+")"};d.frob=function(a){return Math.sqrt(Math.pow(a[0],2)+Math.pow(a[1],2)+Math.pow(a[2],2)+Math.pow(a[3],2)+Math.pow(a[4],2)+Math.pow(a[5],2)+1)};"undefined"!==
+typeof a&&(a.mat2d=d);d={create:function(){var a=new c(9);a[0]=1;a[1]=0;a[2]=0;a[3]=0;a[4]=1;a[5]=0;a[6]=0;a[7]=0;a[8]=1;return a},fromMat4:function(a,b){a[0]=b[0];a[1]=b[1];a[2]=b[2];a[3]=b[4];a[4]=b[5];a[5]=b[6];a[6]=b[8];a[7]=b[9];a[8]=b[10];return a},clone:function(a){var b=new c(9);b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return b},copy:function(a,b){a[0]=b[0];a[1]=b[1];a[2]=b[2];a[3]=b[3];a[4]=b[4];a[5]=b[5];a[6]=b[6];a[7]=b[7];a[8]=b[8];return a},
+identity:function(a){a[0]=1;a[1]=0;a[2]=0;a[3]=0;a[4]=1;a[5]=0;a[6]=0;a[7]=0;a[8]=1;return a},transpose:function(a,b){if(a===b){var c=b[1],d=b[2],e=b[5];a[1]=b[3];a[2]=b[6];a[3]=c;a[5]=b[7];a[6]=d;a[7]=e}else a[0]=b[0],a[1]=b[3],a[2]=b[6],a[3]=b[1],a[4]=b[4],a[5]=b[7],a[6]=b[2],a[7]=b[5],a[8]=b[8];return a},invert:function(a,b){var c=b[0],d=b[1],e=b[2],n=b[3],l=b[4],x=b[5],u=b[6],g=b[7],h=b[8],K=h*l-x*g,j=-h*n+x*u,m=g*n-l*u,i=c*K+d*j+e*m;if(!i)return null;i=1/i;a[0]=K*i;a[1]=(-h*d+e*g)*i;a[2]=(x*
+d-e*l)*i;a[3]=j*i;a[4]=(h*c-e*u)*i;a[5]=(-x*c+e*n)*i;a[6]=m*i;a[7]=(-g*c+d*u)*i;a[8]=(l*c-d*n)*i;return a},adjoint:function(a,b){var c=b[0],d=b[1],e=b[2],n=b[3],l=b[4],x=b[5],u=b[6],g=b[7],h=b[8];a[0]=l*h-x*g;a[1]=e*g-d*h;a[2]=d*x-e*l;a[3]=x*u-n*h;a[4]=c*h-e*u;a[5]=e*n-c*x;a[6]=n*g-l*u;a[7]=d*u-c*g;a[8]=c*l-d*n;return a},determinant:function(a){var b=a[3],c=a[4],d=a[5],e=a[6],n=a[7],l=a[8];return a[0]*(l*c-d*n)+a[1]*(-l*b+d*e)+a[2]*(n*b-c*e)},multiply:function(a,b,c){var d=b[0],e=b[1],n=b[2],l=b[3],
+x=b[4],u=b[5],g=b[6],h=b[7];b=b[8];var j=c[0],m=c[1],i=c[2],k=c[3],q=c[4],t=c[5],s=c[6],r=c[7];c=c[8];a[0]=j*d+m*l+i*g;a[1]=j*e+m*x+i*h;a[2]=j*n+m*u+i*b;a[3]=k*d+q*l+t*g;a[4]=k*e+q*x+t*h;a[5]=k*n+q*u+t*b;a[6]=s*d+r*l+c*g;a[7]=s*e+r*x+c*h;a[8]=s*n+r*u+c*b;return a}};d.mul=d.multiply;d.translate=function(a,b,c){var d=b[0],e=b[1],n=b[2],l=b[3],x=b[4],u=b[5],g=b[6],h=b[7];b=b[8];var j=c[0];c=c[1];a[0]=d;a[1]=e;a[2]=n;a[3]=l;a[4]=x;a[5]=u;a[6]=j*d+c*l+g;a[7]=j*e+c*x+h;a[8]=j*n+c*u+b;return a};d.rotate=
+function(a,b,c){var d=b[0],e=b[1],n=b[2],l=b[3],x=b[4],u=b[5],g=b[6],h=b[7];b=b[8];var j=Math.sin(c);c=Math.cos(c);a[0]=c*d+j*l;a[1]=c*e+j*x;a[2]=c*n+j*u;a[3]=c*l-j*d;a[4]=c*x-j*e;a[5]=c*u-j*n;a[6]=g;a[7]=h;a[8]=b;return a};d.scale=function(a,b,c){var d=c[0];c=c[1];a[0]=d*b[0];a[1]=d*b[1];a[2]=d*b[2];a[3]=c*b[3];a[4]=c*b[4];a[5]=c*b[5];a[6]=b[6];a[7]=b[7];a[8]=b[8];return a};d.fromMat2d=function(a,b){a[0]=b[0];a[1]=b[1];a[2]=0;a[3]=b[2];a[4]=b[3];a[5]=0;a[6]=b[4];a[7]=b[5];a[8]=1;return a};d.fromQuat=
+function(a,b){var c=b[0],d=b[1],e=b[2],n=b[3],l=c+c,x=d+d,u=e+e,c=c*l,g=d*l,d=d*x,h=e*l,j=e*x,e=e*u,l=n*l,x=n*x,n=n*u;a[0]=1-d-e;a[3]=g-n;a[6]=h+x;a[1]=g+n;a[4]=1-c-e;a[7]=j-l;a[2]=h-x;a[5]=j+l;a[8]=1-c-d;return a};d.normalFromMat4=function(a,b){var c=b[0],d=b[1],e=b[2],n=b[3],l=b[4],x=b[5],u=b[6],g=b[7],h=b[8],j=b[9],m=b[10],i=b[11],k=b[12],q=b[13],t=b[14],s=b[15],r=c*x-d*l,z=c*u-e*l,w=c*g-n*l,A=d*u-e*x,E=d*g-n*x,F=e*g-n*u,G=h*q-j*k,H=h*t-m*k,h=h*s-i*k,I=j*t-m*q,j=j*s-i*q,m=m*s-i*t,i=r*m-z*j+w*I+
+A*h-E*H+F*G;if(!i)return null;i=1/i;a[0]=(x*m-u*j+g*I)*i;a[1]=(u*h-l*m-g*H)*i;a[2]=(l*j-x*h+g*G)*i;a[3]=(e*j-d*m-n*I)*i;a[4]=(c*m-e*h+n*H)*i;a[5]=(d*h-c*j-n*G)*i;a[6]=(q*F-t*E+s*A)*i;a[7]=(t*w-k*F-s*z)*i;a[8]=(k*E-q*w+s*r)*i;return a};d.str=function(a){return"mat3("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+")"};d.frob=function(a){return Math.sqrt(Math.pow(a[0],2)+Math.pow(a[1],2)+Math.pow(a[2],2)+Math.pow(a[3],2)+Math.pow(a[4],2)+Math.pow(a[5],2)+Math.pow(a[6],
+2)+Math.pow(a[7],2)+Math.pow(a[8],2))};"undefined"!==typeof a&&(a.mat3=d);var r={create:function(){var a=new c(16);a[0]=1;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=1;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=1;a[11]=0;a[12]=0;a[13]=0;a[14]=0;a[15]=1;return a},clone:function(a){var b=new c(16);b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return b},copy:function(a,b){a[0]=b[0];a[1]=b[1];a[2]=
+b[2];a[3]=b[3];a[4]=b[4];a[5]=b[5];a[6]=b[6];a[7]=b[7];a[8]=b[8];a[9]=b[9];a[10]=b[10];a[11]=b[11];a[12]=b[12];a[13]=b[13];a[14]=b[14];a[15]=b[15];return a},identity:function(a){a[0]=1;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=1;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=1;a[11]=0;a[12]=0;a[13]=0;a[14]=0;a[15]=1;return a},transpose:function(a,b){if(a===b){var c=b[1],d=b[2],e=b[3],n=b[6],l=b[7],g=b[11];a[1]=b[4];a[2]=b[8];a[3]=b[12];a[4]=c;a[6]=b[9];a[7]=b[13];a[8]=d;a[9]=n;a[11]=b[14];a[12]=e;a[13]=l;a[14]=g}else a[0]=
+b[0],a[1]=b[4],a[2]=b[8],a[3]=b[12],a[4]=b[1],a[5]=b[5],a[6]=b[9],a[7]=b[13],a[8]=b[2],a[9]=b[6],a[10]=b[10],a[11]=b[14],a[12]=b[3],a[13]=b[7],a[14]=b[11],a[15]=b[15];return a},invert:function(a,b){var c=b[0],d=b[1],e=b[2],n=b[3],l=b[4],g=b[5],u=b[6],h=b[7],j=b[8],m=b[9],i=b[10],k=b[11],q=b[12],t=b[13],s=b[14],r=b[15],z=c*g-d*l,w=c*u-e*l,B=c*h-n*l,A=d*u-e*g,E=d*h-n*g,F=e*h-n*u,G=j*t-m*q,H=j*s-i*q,I=j*r-k*q,L=m*s-i*t,M=m*r-k*t,O=i*r-k*s,D=z*O-w*M+B*L+A*I-E*H+F*G;if(!D)return null;D=1/D;a[0]=(g*O-u*
+M+h*L)*D;a[1]=(e*M-d*O-n*L)*D;a[2]=(t*F-s*E+r*A)*D;a[3]=(i*E-m*F-k*A)*D;a[4]=(u*I-l*O-h*H)*D;a[5]=(c*O-e*I+n*H)*D;a[6]=(s*B-q*F-r*w)*D;a[7]=(j*F-i*B+k*w)*D;a[8]=(l*M-g*I+h*G)*D;a[9]=(d*I-c*M-n*G)*D;a[10]=(q*E-t*B+r*z)*D;a[11]=(m*B-j*E-k*z)*D;a[12]=(g*H-l*L-u*G)*D;a[13]=(c*L-d*H+e*G)*D;a[14]=(t*w-q*A-s*z)*D;a[15]=(j*A-m*w+i*z)*D;return a},adjoint:function(a,b){var c=b[0],d=b[1],e=b[2],n=b[3],l=b[4],g=b[5],h=b[6],j=b[7],m=b[8],i=b[9],k=b[10],q=b[11],t=b[12],s=b[13],r=b[14],z=b[15];a[0]=g*(k*z-q*r)-
+i*(h*z-j*r)+s*(h*q-j*k);a[1]=-(d*(k*z-q*r)-i*(e*z-n*r)+s*(e*q-n*k));a[2]=d*(h*z-j*r)-g*(e*z-n*r)+s*(e*j-n*h);a[3]=-(d*(h*q-j*k)-g*(e*q-n*k)+i*(e*j-n*h));a[4]=-(l*(k*z-q*r)-m*(h*z-j*r)+t*(h*q-j*k));a[5]=c*(k*z-q*r)-m*(e*z-n*r)+t*(e*q-n*k);a[6]=-(c*(h*z-j*r)-l*(e*z-n*r)+t*(e*j-n*h));a[7]=c*(h*q-j*k)-l*(e*q-n*k)+m*(e*j-n*h);a[8]=l*(i*z-q*s)-m*(g*z-j*s)+t*(g*q-j*i);a[9]=-(c*(i*z-q*s)-m*(d*z-n*s)+t*(d*q-n*i));a[10]=c*(g*z-j*s)-l*(d*z-n*s)+t*(d*j-n*g);a[11]=-(c*(g*q-j*i)-l*(d*q-n*i)+m*(d*j-n*g));a[12]=
+-(l*(i*r-k*s)-m*(g*r-h*s)+t*(g*k-h*i));a[13]=c*(i*r-k*s)-m*(d*r-e*s)+t*(d*k-e*i);a[14]=-(c*(g*r-h*s)-l*(d*r-e*s)+t*(d*h-e*g));a[15]=c*(g*k-h*i)-l*(d*k-e*i)+m*(d*h-e*g);return a},determinant:function(a){var b=a[0],c=a[1],d=a[2],e=a[3],n=a[4],l=a[5],g=a[6],h=a[7],j=a[8],i=a[9],m=a[10],k=a[11],q=a[12],s=a[13],t=a[14];a=a[15];return(b*l-c*n)*(m*a-k*t)-(b*g-d*n)*(i*a-k*s)+(b*h-e*n)*(i*t-m*s)+(c*g-d*l)*(j*a-k*q)-(c*h-e*l)*(j*t-m*q)+(d*h-e*g)*(j*s-i*q)},multiply:function(a,b,c){var d=b[0],e=b[1],n=b[2],
+l=b[3],g=b[4],h=b[5],j=b[6],i=b[7],m=b[8],k=b[9],q=b[10],s=b[11],t=b[12],r=b[13],z=b[14];b=b[15];var w=c[0],C=c[1],B=c[2],A=c[3];a[0]=w*d+C*g+B*m+A*t;a[1]=w*e+C*h+B*k+A*r;a[2]=w*n+C*j+B*q+A*z;a[3]=w*l+C*i+B*s+A*b;w=c[4];C=c[5];B=c[6];A=c[7];a[4]=w*d+C*g+B*m+A*t;a[5]=w*e+C*h+B*k+A*r;a[6]=w*n+C*j+B*q+A*z;a[7]=w*l+C*i+B*s+A*b;w=c[8];C=c[9];B=c[10];A=c[11];a[8]=w*d+C*g+B*m+A*t;a[9]=w*e+C*h+B*k+A*r;a[10]=w*n+C*j+B*q+A*z;a[11]=w*l+C*i+B*s+A*b;w=c[12];C=c[13];B=c[14];A=c[15];a[12]=w*d+C*g+B*m+A*t;a[13]=
+w*e+C*h+B*k+A*r;a[14]=w*n+C*j+B*q+A*z;a[15]=w*l+C*i+B*s+A*b;return a}};r.mul=r.multiply;r.translate=function(a,b,c){var d=c[0],e=c[1];c=c[2];var n,l,g,h,j,i,m,k,q,s,t,r;b===a?(a[12]=b[0]*d+b[4]*e+b[8]*c+b[12],a[13]=b[1]*d+b[5]*e+b[9]*c+b[13],a[14]=b[2]*d+b[6]*e+b[10]*c+b[14],a[15]=b[3]*d+b[7]*e+b[11]*c+b[15]):(n=b[0],l=b[1],g=b[2],h=b[3],j=b[4],i=b[5],m=b[6],k=b[7],q=b[8],s=b[9],t=b[10],r=b[11],a[0]=n,a[1]=l,a[2]=g,a[3]=h,a[4]=j,a[5]=i,a[6]=m,a[7]=k,a[8]=q,a[9]=s,a[10]=t,a[11]=r,a[12]=n*d+j*e+q*c+
+b[12],a[13]=l*d+i*e+s*c+b[13],a[14]=g*d+m*e+t*c+b[14],a[15]=h*d+k*e+r*c+b[15]);return a};r.scale=function(a,b,c){var d=c[0],e=c[1];c=c[2];a[0]=b[0]*d;a[1]=b[1]*d;a[2]=b[2]*d;a[3]=b[3]*d;a[4]=b[4]*e;a[5]=b[5]*e;a[6]=b[6]*e;a[7]=b[7]*e;a[8]=b[8]*c;a[9]=b[9]*c;a[10]=b[10]*c;a[11]=b[11]*c;a[12]=b[12];a[13]=b[13];a[14]=b[14];a[15]=b[15];return a};r.rotate=function(a,c,d,e){var g=e[0],n=e[1];e=e[2];var l=Math.sqrt(g*g+n*n+e*e),h,j,i,m,k,q,s,t,r,z,w,Q,C,B,A,E,F,G,H,I;if(Math.abs(l)<b)return null;l=1/l;g*=
+l;n*=l;e*=l;h=Math.sin(d);j=Math.cos(d);i=1-j;d=c[0];l=c[1];m=c[2];k=c[3];q=c[4];s=c[5];t=c[6];r=c[7];z=c[8];w=c[9];Q=c[10];C=c[11];B=g*g*i+j;A=n*g*i+e*h;E=e*g*i-n*h;F=g*n*i-e*h;G=n*n*i+j;H=e*n*i+g*h;I=g*e*i+n*h;g=n*e*i-g*h;n=e*e*i+j;a[0]=d*B+q*A+z*E;a[1]=l*B+s*A+w*E;a[2]=m*B+t*A+Q*E;a[3]=k*B+r*A+C*E;a[4]=d*F+q*G+z*H;a[5]=l*F+s*G+w*H;a[6]=m*F+t*G+Q*H;a[7]=k*F+r*G+C*H;a[8]=d*I+q*g+z*n;a[9]=l*I+s*g+w*n;a[10]=m*I+t*g+Q*n;a[11]=k*I+r*g+C*n;c!==a&&(a[12]=c[12],a[13]=c[13],a[14]=c[14],a[15]=c[15]);return a};
+r.rotateX=function(a,b,c){var d=Math.sin(c);c=Math.cos(c);var e=b[4],g=b[5],l=b[6],h=b[7],j=b[8],i=b[9],m=b[10],k=b[11];b!==a&&(a[0]=b[0],a[1]=b[1],a[2]=b[2],a[3]=b[3],a[12]=b[12],a[13]=b[13],a[14]=b[14],a[15]=b[15]);a[4]=e*c+j*d;a[5]=g*c+i*d;a[6]=l*c+m*d;a[7]=h*c+k*d;a[8]=j*c-e*d;a[9]=i*c-g*d;a[10]=m*c-l*d;a[11]=k*c-h*d;return a};r.rotateY=function(a,b,c){var d=Math.sin(c);c=Math.cos(c);var e=b[0],g=b[1],l=b[2],h=b[3],j=b[8],i=b[9],m=b[10],k=b[11];b!==a&&(a[4]=b[4],a[5]=b[5],a[6]=b[6],a[7]=b[7],
+a[12]=b[12],a[13]=b[13],a[14]=b[14],a[15]=b[15]);a[0]=e*c-j*d;a[1]=g*c-i*d;a[2]=l*c-m*d;a[3]=h*c-k*d;a[8]=e*d+j*c;a[9]=g*d+i*c;a[10]=l*d+m*c;a[11]=h*d+k*c;return a};r.rotateZ=function(a,b,c){var d=Math.sin(c);c=Math.cos(c);var e=b[0],g=b[1],l=b[2],h=b[3],j=b[4],i=b[5],m=b[6],k=b[7];b!==a&&(a[8]=b[8],a[9]=b[9],a[10]=b[10],a[11]=b[11],a[12]=b[12],a[13]=b[13],a[14]=b[14],a[15]=b[15]);a[0]=e*c+j*d;a[1]=g*c+i*d;a[2]=l*c+m*d;a[3]=h*c+k*d;a[4]=j*c-e*d;a[5]=i*c-g*d;a[6]=m*c-l*d;a[7]=k*c-h*d;return a};r.fromRotationTranslation=
+function(a,b,c){var d=b[0],e=b[1],g=b[2],h=b[3],j=d+d,i=e+e,m=g+g;b=d*j;var k=d*i,d=d*m,q=e*i,e=e*m,g=g*m,j=h*j,i=h*i,h=h*m;a[0]=1-(q+g);a[1]=k+h;a[2]=d-i;a[3]=0;a[4]=k-h;a[5]=1-(b+g);a[6]=e+j;a[7]=0;a[8]=d+i;a[9]=e-j;a[10]=1-(b+q);a[11]=0;a[12]=c[0];a[13]=c[1];a[14]=c[2];a[15]=1;return a};r.fromQuat=function(a,b){var c=b[0],d=b[1],e=b[2],g=b[3],h=c+c,j=d+d,i=e+e,c=c*h,m=d*h,d=d*j,k=e*h,q=e*j,e=e*i,h=g*h,j=g*j,g=g*i;a[0]=1-d-e;a[1]=m+g;a[2]=k-j;a[3]=0;a[4]=m-g;a[5]=1-c-e;a[6]=q+h;a[7]=0;a[8]=k+j;
+a[9]=q-h;a[10]=1-c-d;a[11]=0;a[12]=0;a[13]=0;a[14]=0;a[15]=1;return a};r.frustum=function(a,b,c,d,e,g,h){var j=1/(c-b),i=1/(e-d),m=1/(g-h);a[0]=2*g*j;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=2*g*i;a[6]=0;a[7]=0;a[8]=(c+b)*j;a[9]=(e+d)*i;a[10]=(h+g)*m;a[11]=-1;a[12]=0;a[13]=0;a[14]=2*(h*g)*m;a[15]=0;return a};r.perspective=function(a,b,c,d,e){b=1/Math.tan(b/2);var g=1/(d-e);a[0]=b/c;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=b;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=(e+d)*g;a[11]=-1;a[12]=0;a[13]=0;a[14]=2*e*d*g;a[15]=0;
+return a};r.ortho=function(a,b,c,d,e,g,h){var j=1/(b-c),i=1/(d-e),m=1/(g-h);a[0]=-2*j;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=-2*i;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=2*m;a[11]=0;a[12]=(b+c)*j;a[13]=(e+d)*i;a[14]=(h+g)*m;a[15]=1;return a};r.lookAt=function(a,c,d,e){var g,h,j,i,m,k,q,s,t=c[0],z=c[1];c=c[2];j=e[0];i=e[1];h=e[2];q=d[0];e=d[1];g=d[2];if(Math.abs(t-q)<b&&Math.abs(z-e)<b&&Math.abs(c-g)<b)return r.identity(a);d=t-q;e=z-e;q=c-g;s=1/Math.sqrt(d*d+e*e+q*q);d*=s;e*=s;q*=s;g=i*q-h*e;h=h*d-j*q;j=j*e-i*
+d;(s=Math.sqrt(g*g+h*h+j*j))?(s=1/s,g*=s,h*=s,j*=s):j=h=g=0;i=e*j-q*h;m=q*g-d*j;k=d*h-e*g;(s=Math.sqrt(i*i+m*m+k*k))?(s=1/s,i*=s,m*=s,k*=s):k=m=i=0;a[0]=g;a[1]=i;a[2]=d;a[3]=0;a[4]=h;a[5]=m;a[6]=e;a[7]=0;a[8]=j;a[9]=k;a[10]=q;a[11]=0;a[12]=-(g*t+h*z+j*c);a[13]=-(i*t+m*z+k*c);a[14]=-(d*t+e*z+q*c);a[15]=1;return a};r.str=function(a){return"mat4("+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]+")"};r.frob=function(a){return Math.sqrt(Math.pow(a[0],2)+Math.pow(a[1],2)+Math.pow(a[2],2)+Math.pow(a[3],2)+Math.pow(a[4],2)+Math.pow(a[5],2)+Math.pow(a[6],2)+Math.pow(a[7],2)+Math.pow(a[8],2)+Math.pow(a[9],2)+Math.pow(a[10],2)+Math.pow(a[11],2)+Math.pow(a[12],2)+Math.pow(a[13],2)+Math.pow(a[14],2)+Math.pow(a[15],2))};"undefined"!==typeof a&&(a.mat4=r);var m={create:function(){var a=new c(4);a[0]=0;a[1]=0;a[2]=0;a[3]=1;return a}},q=g.create(),s=g.fromValues(1,0,0),t=g.fromValues(0,1,0);m.rotationTo=
+function(a,b,c){var d=g.dot(b,c);if(-0.999999>d)return g.cross(q,s,b),1E-6>g.length(q)&&g.cross(q,t,b),g.normalize(q,q),m.setAxisAngle(a,q,Math.PI),a;if(0.999999<d)return a[0]=0,a[1]=0,a[2]=0,a[3]=1,a;g.cross(q,b,c);a[0]=q[0];a[1]=q[1];a[2]=q[2];a[3]=1+d;return m.normalize(a,a)};var z=d.create();m.setAxes=function(a,b,c,d){z[0]=c[0];z[3]=c[1];z[6]=c[2];z[1]=d[0];z[4]=d[1];z[7]=d[2];z[2]=-b[0];z[5]=-b[1];z[8]=-b[2];return m.normalize(a,m.fromMat3(a,z))};m.clone=i.clone;m.fromValues=i.fromValues;m.copy=
+i.copy;m.set=i.set;m.identity=function(a){a[0]=0;a[1]=0;a[2]=0;a[3]=1;return a};m.setAxisAngle=function(a,b,c){c*=0.5;var d=Math.sin(c);a[0]=d*b[0];a[1]=d*b[1];a[2]=d*b[2];a[3]=Math.cos(c);return a};m.add=i.add;m.multiply=function(a,b,c){var d=b[0],e=b[1],g=b[2];b=b[3];var h=c[0],j=c[1],i=c[2];c=c[3];a[0]=d*c+b*h+e*i-g*j;a[1]=e*c+b*j+g*h-d*i;a[2]=g*c+b*i+d*j-e*h;a[3]=b*c-d*h-e*j-g*i;return a};m.mul=m.multiply;m.scale=i.scale;m.rotateX=function(a,b,c){c*=0.5;var d=b[0],e=b[1],g=b[2];b=b[3];var h=Math.sin(c);
+c=Math.cos(c);a[0]=d*c+b*h;a[1]=e*c+g*h;a[2]=g*c-e*h;a[3]=b*c-d*h;return a};m.rotateY=function(a,b,c){c*=0.5;var d=b[0],e=b[1],g=b[2];b=b[3];var h=Math.sin(c);c=Math.cos(c);a[0]=d*c-g*h;a[1]=e*c+b*h;a[2]=g*c+d*h;a[3]=b*c-e*h;return a};m.rotateZ=function(a,b,c){c*=0.5;var d=b[0],e=b[1],g=b[2];b=b[3];var h=Math.sin(c);c=Math.cos(c);a[0]=d*c+e*h;a[1]=e*c-d*h;a[2]=g*c+b*h;a[3]=b*c-g*h;return a};m.calculateW=function(a,b){var c=b[0],d=b[1],e=b[2];a[0]=c;a[1]=d;a[2]=e;a[3]=Math.sqrt(Math.abs(1-c*c-d*d-
+e*e));return a};m.dot=i.dot;m.lerp=i.lerp;m.slerp=function(a,b,c,d){var e=b[0],g=b[1],h=b[2];b=b[3];var j=c[0],i=c[1],m=c[2];c=c[3];var k,q,s;q=e*j+g*i+h*m+b*c;0>q&&(q=-q,j=-j,i=-i,m=-m,c=-c);1E-6<1-q?(k=Math.acos(q),s=Math.sin(k),q=Math.sin((1-d)*k)/s,d=Math.sin(d*k)/s):q=1-d;a[0]=q*e+d*j;a[1]=q*g+d*i;a[2]=q*h+d*m;a[3]=q*b+d*c;return a};m.invert=function(a,b){var c=b[0],d=b[1],e=b[2],g=b[3],h=c*c+d*d+e*e+g*g,h=h?1/h:0;a[0]=-c*h;a[1]=-d*h;a[2]=-e*h;a[3]=g*h;return a};m.conjugate=function(a,b){a[0]=
+-b[0];a[1]=-b[1];a[2]=-b[2];a[3]=b[3];return a};m.length=i.length;m.len=m.length;m.squaredLength=i.squaredLength;m.sqrLen=m.squaredLength;m.normalize=i.normalize;m.fromMat3=function(a,b){var c=b[0]+b[4]+b[8];if(0<c)c=Math.sqrt(c+1),a[3]=0.5*c,c=0.5/c,a[0]=(b[5]-b[7])*c,a[1]=(b[6]-b[2])*c,a[2]=(b[1]-b[3])*c;else{var d=0;b[4]>b[0]&&(d=1);b[8]>b[3*d+d]&&(d=2);var e=(d+1)%3,g=(d+2)%3,c=Math.sqrt(b[3*d+d]-b[3*e+e]-b[3*g+g]+1);a[d]=0.5*c;c=0.5/c;a[3]=(b[3*e+g]-b[3*g+e])*c;a[e]=(b[3*e+d]+b[3*d+e])*c;a[g]=
+(b[3*g+d]+b[3*d+g])*c}return a};m.str=function(a){return"quat("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};"undefined"!==typeof a&&(a.quat=m)})(GLMAT);try{module.exports=GLMAT}catch(e$$10){}try{glm.exists&&alert("glm.common.js loaded over exist glm instance: "+glm)}catch(e$$11){}glm=null;GLMJS_PREFIX="glm-js: ";
+GLM={$DEBUG:"undefined"!==typeof $GLM_DEBUG&&$GLM_DEBUG,version:"0.0.6b",GLM_VERSION:96,$outer:{polyfills:GLM_polyfills(),functions:{},intern:function(a,b){if(a)if(void 0===b&&"object"===typeof a)for(var c in a)GLM.$outer.intern(c,a[c]);else return GLM.$DEBUG&&GLM.$outer.console.debug("intern "+a,b&&(b.name||typeof b)),GLM.$outer[a]=b},$import:function(a){GLM.$outer.$import=function(){throw Error("glm.$outer.$import already called...");};GLM.$outer.intern(a.statics);GLM.$template.extend(GLM,GLM.$template["declare<T,V,number>"](a["declare<T,V,number>"]),
+GLM.$template["declare<T,V,...>"](a["declare<T,V,...>"]),GLM.$template["declare<T,...>"](a["declare<T,...>"]),GLM.$template["declare<T>"](a["declare<T>"]));GLM.$init(a)},console:$GLM_reset_logging(),quat_array_from_xyz:function(a){var b=glm.quat(),c=glm.mat3(1);b["*="](glm.angleAxis(a.x,c[0]));b["*="](glm.angleAxis(a.y,c[1]));b["*="](glm.angleAxis(a.z,c[2]));return b.elements},Array:Array,ArrayBuffer:ArrayBuffer,Float32Array:Float32Array,Float64Array:Float64Array,Uint8Array:Uint8Array,Uint16Array:Uint16Array,
+Uint32Array:Uint32Array,Int8Array:Int8Array,Int16Array:Int16Array,Int32Array:Int32Array,DataView:"undefined"!==typeof DataView&&DataView,$rebindTypedArrays:function(a){var b=Object.keys(GLM.$outer).filter(RegExp.prototype.test.bind(/.Array$|^ArrayBuffer$|^DataView$/)).map(function(b){var e=a.call(this,b,GLM.$outer[b]);e!==GLM.$outer[b]&&(GLM.$outer.console.warn("$rebindTypedArrays("+b+")... replacing"),GLM.$outer[b]=e);return e});GLM.$subarray=GLM.patch_subarray();return b}},$extern:$GLM_extern,$log:$GLM_log,
+GLMJSError:$GLM_GLMJSError("GLMJSError"),_radians:function(a){return a*this.PI/180}.bind(Math),_degrees:function(a){return 180*a/this.PI}.bind(Math),normalize:$GLM_extern("normalize"),inverse:$GLM_extern("inverse"),distance:$GLM_extern("distance"),length:$GLM_extern("length"),length2:$GLM_extern("length2"),transpose:$GLM_extern("transpose"),slerp:$GLM_extern("slerp"),mix:$GLM_extern("mix"),clamp:$GLM_extern("clamp"),angleAxis:$GLM_extern("angleAxis"),rotate:$GLM_extern("rotate"),scale:$GLM_extern("scale"),
+translate:$GLM_extern("translate"),lookAt:$GLM_extern("lookAt"),cross:$GLM_extern("cross"),dot:$GLM_extern("dot"),perspective:function(a,b,c,e){return GLM.$outer.mat4_perspective(a,b,c,e)},ortho:function(a,b,c,e,d,h){return GLM.$outer.mat4_ortho(a,b,c,e,d,h)},_eulerAngles:function(a){return GLM.$outer.vec3_eulerAngles(a)},angle:function(a){return 2*Math.acos(a.w)},axis:function(a){var b=1-a.w*a.w;if(0>=b)return glm.vec3(0,0,1);b=1/Math.sqrt(b);return glm.vec3(a.x*b,a.y*b,a.z*b)},$from_ptr:function(a,
+b,c){if(this!==GLM)throw new GLM.GLMJSError("... use glm.make_<type>() (not new glm.make<type>())");b=new GLM.$outer.Float32Array(b.buffer||b,c||0,a.componentLength);b=new GLM.$outer.Float32Array(b);return new a(b)},make_vec2:function(a,b){return GLM.$from_ptr.call(this,GLM.vec2,a,2===arguments.length?b:a.byteOffset)},make_vec3:function(a,b){return GLM.$from_ptr.call(this,GLM.vec3,a,2===arguments.length?b:a.byteOffset)},make_vec4:function(a,b){return GLM.$from_ptr.call(this,GLM.vec4,a,2===arguments.length?
+b:a.byteOffset)},make_quat:function(a,b){return GLM.$from_ptr.call(this,GLM.quat,a,2===arguments.length?b:a.byteOffset)},make_mat3:function(a,b){return GLM.$from_ptr.call(this,GLM.mat3,a,2===arguments.length?b:a.byteOffset)},make_mat4:function(a,b){return GLM.$from_ptr.call(this,GLM.mat4,a,2===arguments.length?b:a.byteOffset)},diagonal4x4:function(a){if("vec4"!==GLM.$typeof(a))throw new GLM.GLMJSError("unsupported argtype to GLM.diagonal4x4: "+["type:"+GLM.$typeof(a)]);a=a.elements;return new GLM.mat4([a[0],
+0,0,0,0,a[1],0,0,0,0,a[2],0,0,0,0,a[3]])},diagonal3x3:function(a){if("vec3"!==GLM.$typeof(a))throw new GLM.GLMJSError("unsupported argtype to GLM.diagonal3x3: "+["type:"+GLM.$typeof(a)]);a=a.elements;return new GLM.mat3([a[0],0,0,0,a[1],0,0,0,a[2]])},_toMat4:function(a){return new GLM.mat4(GLM.$outer.mat4_array_from_quat(a))},FAITHFUL:!0,to_string:function(a,b){try{var c=a.$type||typeof a;if(!GLM[c])throw new GLM.GLMJSError("unsupported argtype to GLM.to_string: "+["type:"+c,a]);return GLM.FAITHFUL?
+GLM.$to_string(a,b).replace(/[\t\n]/g,""):GLM.$to_string(a,b)}catch(e){return GLM.$DEBUG&&GLM.$outer.console.error("to_string error: ",c,a+"",e),e+""}},$sizeof:function(a){return a.BYTES_PER_ELEMENT},$types:[],$isGLMConstructor:function(a){return!!(a&&a.prototype instanceof GLM.$GLMBaseType)},$getGLMType:function(a){return a instanceof GLM.$GLMBaseType&&a.constructor||"string"===typeof a&&GLM[a]},$isGLMObject:function(a){return!!(a instanceof GLM.$GLMBaseType&&a.$type)},$typeof:function(a){return a instanceof
+GLM.$GLMBaseType?a.$type:"undefined"},$to_array:function(a){return[].slice.call(a.elements)},$to_json:function(a,b,c){this instanceof GLM.$GLMBaseType&&(c=b,b=a,a=this);return JSON.stringify(GLM.$to_object(a),b,c)},$inspect:function(a){this instanceof GLM.$GLMBaseType&&(a=this);return GLM.$to_json(a,null,2)},_clamp:function(a,b,c){return a<b?b:a>c?c:a},_abs:function(a){return Math.abs(a)},_equal:function(a,b){return a===b},_epsilonEqual:function(a,b,c){return Math.abs(a-b)<c},_fract:function(a){return a-
+Math.floor(a)},_frexp:function(){function a(b,c){var e=GLM.$outer.DataView||a._DataView;if(0==b)return c&&Array.isArray(c)?c[0]=c[1]=0:[0,0];e=new e(new GLM.$outer.ArrayBuffer(8));e.setFloat64(0,b);var d=e.getUint32(0)>>>20&2047;0===d&&(e.setFloat64(0,b*Math.pow(2,64)),d=(e.getUint32(0)>>>20&2047)-64);e=d-1022;d=GLM.ldexp(b,-e);return c&&Array.isArray(c)?(c[0]=e,c[1]=d):[d,e]}a._DataView=function(a){this.buffer=a;this.setFloat64=function(a,b){if(0!==a)throw Error("...this is a very limited DataView emulator");
+(new Uint8Array(this.buffer)).set([].reverse.call(new Uint8Array((new Float64Array([b])).buffer)),a)};this.getUint32=function(a){if(0!==a)throw Error("...this is a very limited DataView emulator");return(new Uint32Array((new Uint8Array([].slice.call(new Uint8Array(this.buffer)).reverse())).buffer))[1]}};return a}(),_ldexp:function(a,b){return 1023<b?a*Math.pow(2,1023)*Math.pow(2,b-1023):-1074>b?a*Math.pow(2,-1074)*Math.pow(2,b+1074):a*Math.pow(2,b)},_max:Math.max,_min:Math.min,sqrt:Math.sqrt,__sign:function(a){return 0<
+a?1:0>a?-1:+a},$constants:{epsilon:1E-6,euler:0.5772156649015329,e:Math.E,ln_ten:Math.LN10,ln_two:Math.LN2,pi:Math.PI,half_pi:Math.PI/2,quarter_pi:Math.PI/4,one_over_pi:1/Math.PI,two_over_pi:2/Math.PI,root_pi:Math.sqrt(Math.PI),root_two:Math.sqrt(2),root_three:Math.sqrt(3),two_over_root_pi:2/Math.sqrt(Math.PI),one_over_root_two:Math.SQRT1_2,root_two:Math.SQRT2},FIXEDPRECISION:6,$toFixedString:function(a,b,c,e){void 0===e&&(e=GLM.FIXEDPRECISION);if(!c||!c.map)throw Error("unsupported argtype to $toFixedString(..,..,props="+
+typeof c+")");try{var d="";c.map(function(c){c=b[d=c];if(!c.toFixed)throw Error("!toFixed in w"+[c,a,JSON.stringify(b)]);return c.toFixed(0)})}catch(h){throw GLM.$DEBUG&&GLM.$outer.console.error("$toFixedString error",a,typeof b,Object.prototype.toString.call(b),d),GLM.$DEBUG&&glm.$log("$toFixedString error",a,typeof b,Object.prototype.toString.call(b),d),new GLM.GLMJSError(h);}c=c.map(function(a){return b[a].toFixed(e)});return a+"("+c.join(", ")+")"}};GLM._sign=Math.sign||GLM.__sign;
+for(var p in GLM.$constants)(function(a,b){GLM[b]=function(){return a};GLM[b].valueOf=GLM[b]})(GLM.$constants[p],p);
+GLM.$GLMBaseType=function(){function a(a,c){var e=a.$||{};this.$type=c;this.$type_name=e.name||"<"+c+">";e.components&&(this.$components=e.components[0]);this.$len=this.components=a.componentLength;this.constructor=a;this.byteLength=a.BYTES_PER_ELEMENT;GLM.$types.push(c)}a.prototype={clone:function(){return new this.constructor(new this.elements.constructor(this.elements))},toString:function(){return GLM.$to_string(this)},inspect:function(){return GLM.$inspect(this)},toJSON:function(){return GLM.$to_object(this)}};
+Object.defineProperty(a.prototype,"address",{get:function(){var a=this.elements.byteOffset.toString(16);return"0x00000000".substr(0,10-a.length)+a}});return a}();
+(function(){function a(a,b,c){return a.subarray(b,c||a.length)}function b(a,b,c){var e=a.constructor;c=c||a.length;return new e(a.buffer,a.byteOffset+b*e.BYTES_PER_ELEMENT,c-b)}function c(){var a=new GLM.$outer.Float32Array([0,0]);a.subarray(1).subarray(0)[0]=1;var b=c.result=[a[1],(new GLM.$outer.Float32Array(16)).subarray(12,16).length];return!(a[1]!==b[0]||4!==b[1])}function e(a){var b=new GLM.$outer.Float32Array([0,0]);a(a(b,1),0)[0]=1;a=e.result=[b[1],a(new GLM.$outer.Float32Array(16),12,16).length];
+return!(b[1]!==a[0]||4!==a[1])}Object.defineProperty(GLM,"patch_subarray",{configurable:!0,value:function(){var d=!c()?b:a;d.workaround_broken_spidermonkey_subarray=b;d.native_subarray=a;if(!e(d))throw Error("failed to resolve working TypedArray.subarray implementation... "+e.result);return d}})})();GLM.$subarray=GLM.patch_subarray();
+var GLM_template=GLM.$template={_genArgError:function(a,b,c,e){~e.indexOf(void 0)&&(e=e.slice(0,e.indexOf(void 0)));var d=RegExp.prototype.test.bind(/^[^$_]/);return new GLM.GLMJSError("unsupported argtype to "+b+" "+a.$sig+": [typ="+c+"] :: got arg types: "+e.map(GLM.$template.jstypes.get)+" // supported types: "+Object.keys(a).filter(d).join("||"))},jstypes:{get:function(a){return null===a?"null":void 0===a?"undefined":a.$type||GLM.$template.jstypes[typeof a]||GLM.$template.jstypes[a+""]||function(a){if("object"===
+typeof a){if(a instanceof GLM.$outer.Float32Array)return"Float32Array";if(a instanceof GLM.$outer.ArrayBuffer)return"ArrayBuffer";if(Array.isArray(a))return"array"}return"<unknown "+[typeof a,a]+">"}(a)},"0":"float","boolean":"bool",number:"float",string:"string","[object Float32Array]":"Float32Array","[object ArrayBuffer]":"ArrayBuffer","function":"function"},_add_overrides:function(a,b){for(var c in b)b[c]&&GLM[c].override(a,b[c])},_add_inline_override:function(a,b,c){this[b]=eval(GLM.$template._traceable("glm_"+
+a+"_"+b,c))();return this},_inline_helpers:function(a,b){Object.defineProperty(a,"GLM",{value:GLM});return{$type:"built-in",$type_name:b,$template:a,F:a,dbg:b,override:this._add_inline_override.bind(a,b),link:function(c){var e=a[c];e||(e=a[[c,"undefined"]]);if(!e)throw new GLM.GLMJSError("error linking direct function for "+b+"<"+c+"> or "+b+"<"+[c,void 0]+">");return/\bthis[\[.]/.test(e+"")?e.bind(a):e}}},"template<T>":function(a,b){a.$sig="template<T>";var c=GLM.$template.jstypes,e=GLM.$template._genArgError,
+d=GLM.$GLMBaseType;return this.slingshot(this._inline_helpers(a,b),eval(this._traceable("Tglm_"+b,function(b){this instanceof d&&(b=this);var j=[b&&b.$type||c[typeof b]||c.get(b)||"null"];if(!a[j])throw e(a,arguments.callee.dbg,j,[b]);return a[j](b)}))())},"template<T,...>":function(a,b){a.$sig="template<T,...>";var c=GLM.$template.jstypes,e=GLM.$template._genArgError,d=GLM.$GLMBaseType;return this.slingshot(this._inline_helpers(a,b),eval(this._traceable("Tdotglm_"+b,function(b){for(var j=Array(arguments.length),
+g=0;g<j.length;g++)j[g]=arguments[g];this instanceof d&&j.unshift(b=this);g=[b&&b.$type||c[typeof b]||c.get(b)||"null"];if(!a[g])throw e(a,arguments.callee.dbg,g,j);return a[g].apply(a,j)}))())},"template<T,V,number>":function(a,b){a.$sig="template<T,V,number>";var c=GLM.$template.jstypes,e=GLM.$template._genArgError,d=GLM.GLMJSError,h=GLM.$GLMBaseType;return this.slingshot(this._inline_helpers(a,b),eval(this._traceable("TVnglm_"+b,function(){for(var b=Array(arguments.length),g=0;g<b.length;g++)b[g]=
+arguments[g];this instanceof h&&b.unshift(this);var g=b[0],k=b[1],b=b[2],i=[g&&g.$type||c[typeof g]||c[g+""]||"<unknown "+g+">",k&&k.$type||c[typeof k]||c[k+""]||"<unknown "+k+">"];if(!a[i])throw e(a,arguments.callee.dbg,i,[g,k,b]);if("number"!==typeof b)throw new d(arguments.callee.dbg+a.$sig+": unsupported n type: "+[typeof b,b]);return a[i](g,k,b)}))())},"template<T,V,...>":function(a,b){a.$sig="template<T,V,...>";var c=GLM.$template.jstypes,e=GLM.$GLMBaseType,d=GLM.$template._genArgError,h=GLM.$outer.Array;
+return this.slingshot(this._inline_helpers(a,b),eval(this._traceable("TVglm_"+b,function(){for(var b=new h(arguments.length),g=0;g<b.length;g++)b[g]=arguments[g];this instanceof e&&b.unshift(this);var g=b[0],k=b[1],g=[g&&g.$type||c[typeof g],k&&k.$type||c[typeof k]||c[k+""]||h.isArray(k)&&"array"+k.length+""||""+k+""];if(!a[g])throw d(a,arguments.callee.dbg,g,b);return a[g].apply(a,b)}))())},override:function(a,b,c,e,d){function h(a,c){GLM.$outer.console.debug("glm.$template.override: "+b+" ... "+
+Object.keys(a.$template).filter(function(a){return!~a.indexOf("$")}).map(function(a){return!~c.indexOf(a)?"*"+a+"*":a}).join(" | "))}GLM.$DEBUG&&GLM.$outer.console.debug("glm.$template.override: ",a,b,c.$op?'$op: ["'+c.$op+'"]':"");if(!e)throw Error("unspecified target group "+e+' (expected override(<TV>, "p", {TSP}, ret={GROUP}))');var j=e[b];if(j&&j.$op!==c.$op)throw Error('glm.$template.override: mismatch merging existing override: .$op "'+[j.$op,"!=",c.$op].join(" ")+'"  p='+[b,j.$op,c.$op,"||"+
+Object.keys(j.$template).join("||")]);var g=GLM.$template[a](GLM.$template.deNify(c,b),b);if(j&&j.F.$sig!==g.F.$sig)throw Error('glm.$template.override: mismatch merging existing override: .$sig "'+[j&&j.F.$sig,"!=",g.F.$sig].join(" ")+'"  p='+[b,j&&j.F.$sig,g.F.$sig,"||"+Object.keys(j&&j.$template||{}).join("||")]);g.$op=c.$op;if(j){for(var k in g.$template)"$op"===k||"$sig"===k||(a=k in j.$template,!a||!0===d?(GLM.$DEBUG&&GLM.$outer.console.debug("glm.$template.override: "+b+" ... "+k+" merged"),
+j.$template[k]=g.$template[k]):a&&GLM.$DEBUG&&GLM.$outer.console.debug("glm.$template.override: "+b+" ... "+k+" skipped"));if(GLM.$DEBUG){var i=[];Object.keys(j.$template).forEach(function(a){a in g.$template||(GLM.$DEBUG&&GLM.$outer.console.debug("glm.$template.override: "+b+" ... "+a+" carried-forward"),i.push(a))});h(e[b],i)}}else e[b]=g,GLM.$DEBUG&&h(e[b],[]);return e},_override:function(a,b,c){for(var e in b){if("mat4_scale"!==e&&"object"!==typeof b[e])throw new GLM.GLMJSError("expect object property overrides"+
+[e,b[e],Object.keys(c)]);"object"===typeof b[e]?this.override(a,e,b[e],c,!0):ret_scale=5}return c},slingshot:function(){return this.extend.apply(this,[].reverse.call(arguments))},extend:function(a,b){[].slice.call(arguments,1).forEach(function(b){if(b)for(var e in b)b.hasOwnProperty(e)&&(a[e]=b[e])});return a},"declare<T,V,...>":function(a){return!a?{}:this._override("template<T,V,...>",a,GLM.$outer.functions)},"declare<T>":function(a){return!a?{}:this._override("template<T>",a,GLM.$outer.functions)},
+"declare<T,...>":function(a){return!a?{}:this._override("template<T,...>",a,GLM.$outer.functions)},"declare<T,V,number>":function(a){return!a?{}:this._override("template<T,V,number>",a,GLM.$outer.functions)},_tojsname:function(a){return(a||"_").replace(/[^$a-zA-Z0-9_]/g,"_")},_traceable:function(a,b){var c=b;if("function"!==typeof c)throw new GLM.GLMJSError("_traceable expects tidy function as second arg "+c);if(!a)throw new GLM.GLMJSError("_traceable expects hint or what's the point"+[c,a]);a=this._tojsname(a||
+"_traceable");c=c.toString().replace(/^(\s*var\s*(\w+)\s*=\s*)__VA_ARGS__;/mg,function(a,b,c){return b+"new Array(arguments.length);for(var I=0;I<varname.length;I++)varname[I]=arguments[I];".replace(/I/g,"__VA_ARGS__I").replace(/varname/g,c)}).replace(/\barguments[.]callee\b/g,a);if(/^function _traceable/.test(c))throw new GLM.GLMJSError("already wrapped in a _traceable: "+[c,a]);c='function _traceable(){ "use strict"; SRC; return HINT; }'.replace("HINT",a.replace(/[$]/g,"$$$$")).replace("SRC",c.replace(/[$]/g,
+"$$$$").replace(/^function\s*\(/,"function "+a+"("));c="1,"+c;if(GLM.$DEBUG)try{eval(c)}catch(e){throw console.error("_traceable error",a,c,b,e),e;}return c},deNify:function(a,b){var c={vec:[2,3,4],mat:[3,4]},e=this._tojsname.bind(this),d;for(d in a){var h=!1;d.replace(/([vV]ec|[mM]at)(?:\w*)<N>/,function(j,g){h=!0;var k=a[d];delete a[d];c[g.toLowerCase()].forEach(function(c){var g=d.replace(/<N[*]N>/g,c*c).replace(/<N>/g,c);if(!(g in a)){var h=e("glm_"+b+"_"+g);a[g]=eval("'use strict'; 1,"+(k+"").replace(/^function\s*\(/,
+"function "+h+"(").replace(/N[*]N/g,c*c).replace(/N/g,c))}})}.bind(this));/^[$]/.test(d)?GLM.$DEBUG&&GLM.$outer.console.debug("@ NOT naming "+d):!h&&("function"===typeof a[d]&&!a[d].name)&&(GLM.$DEBUG&&GLM.$outer.console.debug("naming "+e(b+"_"+d)),a[d]=eval(this._traceable("glm_"+b+"_"+d,a[d]))())}return a},$_module_stamp:+new Date,_iso:"/[*][^/*]*[*]/",_get_argnames:function(a){return(a+"").replace(/\s+/g,"").replace(RegExp(this._iso,"g"),"").split("){",1)[0].replace(/^[^(]*[(]/,"").replace(/=[^,]+/g,
+"").split(",").filter(Boolean)},_fix_$_names:function(a,b){Object.keys(b).filter(function(a){return"function"===typeof b[a]&&!b[a].name}).map(function(c){var e=a+"_"+c;GLM.$DEBUG&&GLM.$outer.console.debug("naming $."+c+" == "+e,this._traceable(e,b[c]));b[c]=eval(this._traceable("glm_"+e,b[c]))()}.bind(this));return b},_typedArrayMaker:function(a,b){return function(c){if(c.length===a)return new b(c);var e=new b(a);e.set(c);return e}},GLMType:function(a,b){var c=this._fix_$_names(a,b),e=c.identity.length,
+d,h=Object,j=GLM.$template._get_argnames.bind(GLM.$template),g=GLM.GLMJSError,k={},i;for(i in c)"function"===typeof c[i]&&function(a){k[i]=function(b){return a.apply(c,b)}}(c[i]);d=function(b){var d=k[typeof b[0]+b.length];if(!d){var e="glm."+a;b=e+"("+b.map(function(a){return typeof a})+")";d=h.keys(c).filter(function(a){return"function"===typeof c[a]&&/^\w+\d+$/.test(a)}).map(function(a){return e+"("+j(c[a])+")"});throw new g("no constructor found for: "+b+"\nsupported signatures:\n\t"+d.join("\n\t"));
+}return d};var w,r=GLM;GLM.$template._get_argnames.bind(GLM.$template);w=function(b,c){2<r.$DEBUG&&r.$outer.console.info("adopting elements...",typeof b);if(b.length!=e){if(!1===c)return c;r.$outer.console.error(a+" elements size mismatch: "+["wanted:"+e,"handed:"+b.length]);var d=r.$subarray(b,0,e);throw new r.GLMJSError(a+" elements size mismatch: "+["wanted:"+e,"handed:"+b.length,"theoreticaly-correctable?:"+(d.length===e)]);}return b};var m=this._typedArrayMaker(e,GLM.$outer.Float32Array),q,s=
+GLM.$outer;q=function(a){return a instanceof s.Float32Array};var t=function(a,b,c,g,h,i,j,k){return eval(k("glm_"+h+"$class",function(c){for(var f=new a(arguments.length),g=0;g<f.length;g++)f[g]=arguments[g];var h=d(f),g=t;if(this instanceof g)f=q(c)?w(c):m(h(f)),b.defineProperty(this,"elements",{enumerable:!1,configurable:!0,value:f});else return f=q(c)&&c.length===e?m(c):h(f),new g(f)}))()}(Array,Object,GLM,c,a,GLM.$template._get_argnames.bind(GLM.$template),GLM.GLMJSError,GLM.$template._traceable.bind(GLM.$template));
+c.components=c.components?c.components.map(function(a){return"string"===typeof a?a.split(""):a}):[];t.$=c;t.componentLength=e;t.BYTES_PER_ELEMENT=e*GLM.$outer.Float32Array.BYTES_PER_ELEMENT;t.prototype=new GLM.$GLMBaseType(t,a);t.toJSON=function(){var b={glm$type:a,glm$class:t.prototype.$type_name,glm$eg:(new t).object},c;for(c in t)/function |^[$]/.test(c+t[c])||(b[c]=t[c]);return b};return t}};
+GLM.$template["declare<T,V,...>"]({cross:{"vec2,vec2":function(a,b){return this.GLM.vec3(0,0,a.x*b.y-a.y*b.x)}},distance:{"vec<N>,vec<N>":function(a,b){return this.GLM.length(b.sub(a))}}});
+GLM.$template["declare<T,V,number>"]({mix:{"float,float":function(a,b,c){return b*c+a*(1-c)},"vec<N>,vec<N>":function(a,b,c){var e=1-c,d=new this.GLM.vecN(new a.elements.constructor(N)),h=d.elements;a=a.elements;b=b.elements;for(var j=0;j<N;j++)h[j]=b[j]*c+a[j]*e;return d}},clamp:{"float,float":function(a,b,c){return GLM._clamp(a,b,c)},"vec<N>,float":function(a,b,c){return new GLM.vecN(GLM.$to_array(a).map(function(a){return GLM._clamp(a,b,c)}))}},epsilonEqual:{"float,float":GLM._epsilonEqual,"vec<N>,vec<N>":function(a,
+b,c){for(var e=this["float,float"],d=glm.bvecN(),h=0;h<N;h++)d[h]=e(a[h],b[h],c);return d},"ivec<N>,ivec<N>":function(a,b,c){return this["vecN,vecN"](a,b,c)},"uvec<N>,uvec<N>":function(a,b,c){return this["vecN,vecN"](a,b,c)},"quat,quat":function(a,b,c){for(var e=this["float,float"],d=glm.bvec4(),h=0;4>h;h++)d[h]=e(a[h],b[h],c);return d},"mat<N>,mat<N>":function(){throw new GLM.GLMJSError("error: 'epsilonEqual' only accept floating-point and integer scalar or vector inputs");}}});
+GLM.$template.extend(GLM,GLM.$template["declare<T>"]({degrees:{"float":function(a){return this.GLM._degrees(a)},"vec<N>":function(a){return new this.GLM.vecN(this.GLM.$to_array(a).map(this.GLM._degrees))}},radians:{"float":function(a){return this.GLM._radians(a)},"vec<N>":function(a){return new this.GLM.vecN(this.GLM.$to_array(a).map(this.GLM._radians))}},sign:{"null":function(){return 0},undefined:function(){return NaN},string:function(){return NaN},"float":function(a){return GLM._sign(a)},"vec<N>":function(a){return new GLM.vecN(GLM.$to_array(a).map(GLM._sign))},
+"ivec<N>":function(a){return new GLM.ivecN(GLM.$to_array(a).map(GLM._sign))}},abs:{"float":function(a){return GLM._abs(a)},"vec<N>":function(a){return new GLM.vecN(GLM.$to_array(a).map(GLM._abs))}},fract:{"float":function(a){return GLM._fract(a)},"vec<N>":function(a){return new GLM.vecN(GLM.$to_array(a).map(GLM._fract))}},all:{"vec<N>":function(a){return N===GLM.$to_array(a).filter(Boolean).length},"bvec<N>":function(a){return N===GLM.$to_array(a).filter(Boolean).length},"ivec<N>":function(a){return N===
+GLM.$to_array(a).filter(Boolean).length},"uvec<N>":function(a){return N===GLM.$to_array(a).filter(Boolean).length},quat:function(a){return 4===GLM.$to_array(a).filter(Boolean).length}},$to_object:{vec2:function(a){return{x:a.x,y:a.y}},vec3:function(a){return{x:a.x,y:a.y,z:a.z}},vec4:function(a){return{x:a.x,y:a.y,z:a.z,w:a.w}},uvec2:function(a){return{x:a.x,y:a.y}},uvec3:function(a){return{x:a.x,y:a.y,z:a.z}},uvec4:function(a){return{x:a.x,y:a.y,z:a.z,w:a.w}},ivec2:function(a){return{x:a.x,y:a.y}},
+ivec3:function(a){return{x:a.x,y:a.y,z:a.z}},ivec4:function(a){return{x:a.x,y:a.y,z:a.z,w:a.w}},bvec2:function(a){return{x:!!a.x,y:!!a.y}},bvec3:function(a){return{x:!!a.x,y:!!a.y,z:!!a.z}},bvec4:function(a){return{x:!!a.x,y:!!a.y,z:!!a.z,w:!!a.w}},quat:function(a){return{w:a.w,x:a.x,y:a.y,z:a.z}},mat3:function(a){return{"0":this.vec3(a[0]),1:this.vec3(a[1]),2:this.vec3(a[2])}},mat4:function(a){return{"0":this.vec4(a[0]),1:this.vec4(a[1]),2:this.vec4(a[2]),3:this.vec4(a[3])}}},roll:{$atan2:Math.atan2,
+quat:function(a){return this.$atan2(2*(a.x*a.y+a.w*a.z),a.w*a.w+a.x*a.x-a.y*a.y-a.z*a.z)}},pitch:{$atan2:Math.atan2,quat:function(a){return this.$atan2(2*(a.y*a.z+a.w*a.x),a.w*a.w-a.x*a.x-a.y*a.y+a.z*a.z)}},yaw:{$asin:Math.asin,quat:function(a){return this.$asin(this.GLM.clamp(-2*(a.x*a.z-a.w*a.y),-1,1))}},eulerAngles:{quat:function(a){return this.GLM.vec3(this.GLM.pitch(a),this.GLM.yaw(a),this.GLM.roll(a))}}}),GLM.$template["declare<T,...>"]({$from_glsl:{string:function(a,b){var c;a.replace(/^([$\w]+)\(([-.0-9ef, ]+)\)$/,
+function(a,d,h){a=glm[d]||glm["$"+d];if(!a)throw new GLM.GLMJSError("glsl decoding issue: unknown type '"+d+"'");c=h.split(",").map(parseFloat);if(!b||b===a)c=a.apply(glm,c);else{if(!0===b||b===Array){for(;c.length<a.componentLength;)c.push(c[c.length-1]);return c}throw new GLM.GLMJSError("glsl decoding issue: second argument expected to be undefined|true|Array");}});return c}},$to_glsl:{"vec<N>":function(a,b){var c=GLM.$to_array(a);b&&("object"===typeof b&&"precision"in b)&&(c=c.map(function(a){return a.toFixed(b.precision)}));
+for(;c.length&&c[c.length-2]===c[c.length-1];)c.pop();return a.$type+"("+c+")"},"uvec<N>":function(a,b){return this.vecN(a,b)},"ivec<N>":function(a,b){return this.vecN(a,b)},"bvec<N>":function(a,b){return this.vecN(a,b)},quat:function(a,b){var c;b&&("object"===typeof b&&"precision"in b)&&(c=b.precision);return 0===a.x+a.y+a.z?"quat("+(void 0===c?a.w:a.w.toFixed(c))+")":this.vec4(a,b)},"mat<N>":function(a,b){var c;b&&("object"===typeof b&&"precision"in b)&&(c=b.precision);var e=GLM.$to_array(a);void 0!==
+c&&(e=e.map(function(a){return a.toFixed(c)}));return e.reduce(function(a,b){return a+1*b},0)===e[0]*N?"matN("+e[0]+")":"matN("+e+")"}},frexp:{"float":function(a,b){return 1===arguments.length?this["float,undefined"](a):this["float,array"](a,b)},"vec<N>":function(a,b){if(2>arguments.length)throw new GLM.GLMJSError("frexp(vecN, ivecN) expected ivecN as second parameter");return GLM.vecN(GLM.$to_array(a).map(function(a,e){var d=GLM._frexp(a);b[e]=d[1];return d[0]}))},"float,undefined":function(a){return GLM._frexp(a)},
+"float,array":function(a,b){return GLM._frexp(a,b)}},ldexp:{"float":GLM._ldexp,"vec<N>":function(a,b){return GLM.vecN(GLM.$to_array(a).map(function(a,e){return GLM._ldexp(a,b[e])}))}}}));
+GLM.$template["declare<T,V,...>"]({rotate:{"float,vec3":function(a,b){return this.GLM.$outer.mat4_angleAxis(a,b)},"mat4,float":function(a,b,c){return a.mul(this.GLM.$outer.mat4_angleAxis(b,c))}},scale:{$outer:GLM.$outer,"mat4,vec3":function(a,b){return a.mul(this.$outer.mat4_scale(b))},"vec3,undefined":function(a){return this.$outer.mat4_scale(a)}},translate:{"mat4,vec3":function(a,b){return a.mul(this.GLM.$outer.mat4_translation(b))},"vec3,undefined":function(a){return this.GLM.$outer.mat4_translation(a)}},
+angleAxis:{"float,vec3":function(a,b){return this.GLM.$outer.quat_angleAxis(a,b)}},min:{"float,float":function(a,b){return this.GLM._min(a,b)},"vec<N>,float":function(a,b){return new this.GLM.vecN(this.GLM.$to_array(a).map(function(a){return this.GLM._min(a,b)}.bind(this)))}},max:{"float,float":function(a,b){return this.GLM._max(a,b)},"vec<N>,float":function(a,b){return new this.GLM.vecN(this.GLM.$to_array(a).map(function(a){return this.GLM._max(a,b)}.bind(this)))}},equal:{"float,float":GLM._equal,
+"vec<N>,vec<N>":function(a,b){for(var c=this["float,float"],e=glm.bvecN(),d=0;d<N;d++)e[d]=c(a[d],b[d]);return e},"bvec<N>,bvec<N>":function(a,b){return this["vecN,vecN"](a,b)},"ivec<N>,ivec<N>":function(a,b){return this["vecN,vecN"](a,b)},"uvec<N>,uvec<N>":function(a,b){return this["vecN,vecN"](a,b)},"quat,quat":function(a,b){for(var c=this["float,float"],e=glm.bvec4(),d=0;4>d;d++)e[d]=c(a[d],b[d]);return e}},_slerp:{"quat,quat":function(a,b,c){var e=b,d=glm.dot(glm.vec4(a),glm.vec4(b));0>d&&(e=
+b.mul(-1),d=-d);if(d>1-glm.epsilon())return glm.quat(glm.mix(a.w,e.w,c),glm.mix(a.x,e.x,c),glm.mix(a.y,e.y,c),glm.mix(a.z,e.z,c));b=Math.acos(d);return(a.mul(Math.sin((1-c)*b))+e.mul(Math.sin(c*b)))/Math.sin(b)}},rotation:{"vec3,vec3":function(a,b){var c=this.$dot(a,b),e=new a.constructor(new a.elements.constructor(3));if(c>=1-this.$epsilon)return this.$quat();if(c<-1+this.$epsilon)return e=this.$cross(this.$m[2],a),this.$length2(e)<this.$epsilon&&(e=this.$cross(this.$m[0],a)),e=this.$normalize(e),
+this.$angleAxis(this.$pi,e);var e=this.$cross(a,b),c=this.$sqrt(2*(1+c)),d=1/c;return this.$quat(0.5*c,e.x*d,e.y*d,e.z*d)}},project:{"vec3,mat4":function(a,b,c,e){a=glm.vec4(a,1);a=b["*"](a);a=c["*"](a);a["/="](a.w);a=a["*"](0.5)["+"](0.5);a[0]=a[0]*e[2]+e[0];a[1]=a[1]*e[3]+e[1];return glm.vec3(a)}},unProject:{"vec3,mat4":function(a,b,c,e){b=glm.inverse(c["*"](b));a=glm.vec4(a,1);a.x=(a.x-e[0])/e[2];a.y=(a.y-e[1])/e[3];a=a["*"](2)["-"](glm.vec4(1));e=b["*"](a);e["/="](e.w);return glm.vec3(e)}},orientedAngle:{"vec3,vec3":function(a,
+b,c){var e=Math.acos(glm.clamp(glm.dot(a,b),0,1));return glm.mix(e,-e,0>glm.dot(c,glm.cross(a,b))?1:0)}}});
+GLM.$to_string=GLM.$template["declare<T,...>"]({$to_string:{"function":function(a){return"[function "+(a.name||"anonymous")+"]"},ArrayBuffer:function(a){return"[object ArrayBuffer "+JSON.stringify({byteLength:a.byteLength})+"]"},Float32Array:function(a){return"[object Float32Array "+JSON.stringify({length:a.length,byteOffset:a.byteOffset,byteLength:a.byteLength,BPE:a.BYTES_PER_ELEMENT})+"]"},"float":function(a,b){return GLM.$toFixedString("float",{value:a},["value"],b&&b.precision)},string:function(a){return a},
+bool:function(a){return"bool("+a+")"},"vec<N>":function(a,b){return GLM.$toFixedString(a.$type_name,a,a.$components,b&&b.precision)},"uvec<N>":function(a,b){return GLM.$toFixedString(a.$type_name,a,a.$components,b&&"object"===typeof b&&b.precision||0)},"ivec<N>":function(a,b){return GLM.$toFixedString(a.$type_name,a,a.$components,b&&"object"===typeof b&&b.precision||0)},"bvec<N>":function(a){return a.$type_name+"("+GLM.$to_array(a).map(Boolean).join(", ")+")"},"mat<N>":function(a,b){var c=[0,1,2,
+3].slice(0,N).map(function(b){return a[b]}).map(function(a){return GLM.$toFixedString("\t",a,a.$components,b&&b.precision)});return a.$type_name+"(\n"+c.join(", \n")+"\n)"},quat:function(a,b){a=GLM.degrees(GLM.eulerAngles(a));return GLM.$toFixedString("<quat>"+a.$type_name,a,["x","y","z"],b&&b.precision)}}}).$to_string;
+GLM.$template["declare<T,V,...>"]({copy:{$op:"=","vec<N>,vec<N>":function(a,b){a.elements.set(b.elements);return a},"vec<N>,array<N>":function(a,b){a.elements.set(b);return a},"vec<N>,uvec<N>":function(a,b){a.elements.set(b.elements);return a},"vec<N>,ivec<N>":function(a,b){a.elements.set(b.elements);return a},"vec<N>,bvec<N>":function(a,b){a.elements.set(b.elements);return a},"uvec<N>,uvec<N>":function(a,b){a.elements.set(b.elements);return a},"uvec<N>,array<N>":function(a,b){a.elements.set(b);return a},
+"uvec<N>,vec<N>":function(a,b){a.elements.set(b.elements);return a},"uvec<N>,ivec<N>":function(a,b){a.elements.set(b.elements);return a},"uvec<N>,bvec<N>":function(a,b){a.elements.set(b.elements);return a},"ivec<N>,ivec<N>":function(a,b){a.elements.set(b.elements);return a},"ivec<N>,array<N>":function(a,b){a.elements.set(b);return a},"ivec<N>,vec<N>":function(a,b){a.elements.set(b.elements);return a},"ivec<N>,uvec<N>":function(a,b){a.elements.set(b.elements);return a},"ivec<N>,bvec<N>":function(a,
+b){a.elements.set(b.elements);return a},"bvec<N>,ivec<N>":function(a,b){a.elements.set(b.elements);return a},"bvec<N>,array<N>":function(a,b){a.elements.set(b);return a},"bvec<N>,vec<N>":function(a,b){a.elements.set(b.elements);return a},"bvec<N>,uvec<N>":function(a,b){a.elements.set(b.elements);return a},"bvec<N>,bvec<N>":function(a,b){a.elements.set(b.elements);return a},"quat,quat":function(a,b){a.elements.set(b.elements);return a},"mat<N>,mat<N>":function(a,b){a.elements.set(b.elements);return a},
+"mat<N>,array<N>":function(a,b){b=b.reduce(function(a,b){if(!a.concat)throw new GLM.GLMJSError("matN,arrayN -- [[.length===4] x 4] expected");return a.concat(b)});if(b===N)throw new GLM.GLMJSError("matN,arrayN -- [[N],[N],[N],[N]] expected");return a["="](b)},"mat<N>,array<N*N>":function(a,b){a.elements.set(b);return a},"mat4,array9":function(a,b){a.elements.set((new GLM.mat4(b)).elements);return a}},sub:{$op:"-",_sub:function(a,b){return this.GLM.$to_array(a).map(function(a,e){return a-b[e]})},"vec<N>,vec<N>":function(a,
+b){return new this.GLM.vecN(this._sub(a,b))},"vec<N>,uvec<N>":function(a,b){return new this.GLM.vecN(this._sub(a,b))},"uvec<N>,uvec<N>":function(a,b){return new this.GLM.uvecN(this._sub(a,b))},"uvec<N>,ivec<N>":function(a,b){return new this.GLM.uvecN(this._sub(a,b))},"vec<N>,ivec<N>":function(a,b){return new this.GLM.vecN(this._sub(a,b))},"ivec<N>,uvec<N>":function(a,b){return new this.GLM.ivecN(this._sub(a,b))},"ivec<N>,ivec<N>":function(a,b){return new this.GLM.ivecN(this._sub(a,b))}},sub_eq:{$op:"-=",
+"vec<N>,vec<N>":function(a,b){for(var c=a.elements,e=b.elements,d=0;d<N;d++)c[d]-=e[d];return a},"vec<N>,uvec<N>":function(a,b){return this["vecN,vecN"](a,b)},"uvec<N>,uvec<N>":function(a,b){return this["vecN,vecN"](a,b)},"uvec<N>,ivec<N>":function(a,b){return this["vecN,vecN"](a,b)},"vec<N>,ivec<N>":function(a,b){return this["vecN,vecN"](a,b)},"ivec<N>,ivec<N>":function(a,b){return this["vecN,vecN"](a,b)},"ivec<N>,uvec<N>":function(a,b){return this["vecN,vecN"](a,b)}},add:{$op:"+",_add:function(a,
+b){return this.GLM.$to_array(a).map(function(a,e){return a+b[e]})},"vec<N>,float":function(a,b){return new this.GLM.vecN(this._add(a,[b,b,b,b]))},"vec<N>,vec<N>":function(a,b){return new this.GLM.vecN(this._add(a,b))},"vec<N>,uvec<N>":function(a,b){return new this.GLM.vecN(this._add(a,b))},"uvec<N>,uvec<N>":function(a,b){return new this.GLM.uvecN(this._add(a,b))},"uvec<N>,ivec<N>":function(a,b){return new this.GLM.uvecN(this._add(a,b))},"vec<N>,ivec<N>":function(a,b){return new this.GLM.vecN(this._add(a,
+b))},"ivec<N>,ivec<N>":function(a,b){return new this.GLM.ivecN(this._add(a,b))},"ivec<N>,uvec<N>":function(a,b){return new this.GLM.ivecN(this._add(a,b))}},add_eq:{$op:"+=","vec<N>,vec<N>":function(a,b){for(var c=a.elements,e=b.elements,d=0;d<N;d++)c[d]+=e[d];return a},"vec<N>,uvec<N>":function(a,b){return this["vecN,vecN"](a,b)},"uvec<N>,uvec<N>":function(a,b){return this["vecN,vecN"](a,b)},"uvec<N>,ivec<N>":function(a,b){return this["vecN,vecN"](a,b)},"vec<N>,ivec<N>":function(a,b){return this["vecN,vecN"](a,
+b)},"ivec<N>,ivec<N>":function(a,b){return this["vecN,vecN"](a,b)},"ivec<N>,uvec<N>":function(a,b){return this["vecN,vecN"](a,b)}},div:{$op:"/","vec<N>,float":function(a,b){return new this.GLM.vecN(this.GLM.$to_array(a).map(function(a){return a/b}))}},div_eq:{$op:"/=","vec<N>,float":function(a,b){for(var c=0;c<N;c++)a.elements[c]/=b;return a}},mul:{$op:"*","vec<N>,vec<N>":function(a,b){return new this.GLM.vecN(this.GLM.$to_array(a).map(function(a,e){return a*b[e]}))}},eql_epsilon:function(a){return{$op:"~=",
+"vec<N>,vec<N>":a,"mat<N>,mat<N>":a,"quat,quat":a,"uvec<N>,uvec<N>":a,"ivec<N>,ivec<N>":a}}(function(a,b){return this.GLM.all(this.GLM.epsilonEqual(a,b,this.GLM.epsilon()))}),eql:function(a){return{$op:"==","mat<N>,mat<N>":function(a,c){return c.elements.length===glm.$to_array(a).filter(function(a,b){return a===c.elements[b]}).length},"vec<N>,vec<N>":a,"quat,quat":a,"uvec<N>,uvec<N>":a,"ivec<N>,ivec<N>":a,"bvec<N>,bvec<N>":a}}(function(a,b){return GLM.all(GLM.equal(a,b))})});
+GLM.string={$type_name:"string",$:{}};GLM.number={$type_name:"float",$:{}};GLM["boolean"]={$type:"bool",$type_name:"bool",$:{}};
+GLM.vec2=GLM.$template.GLMType("vec2",{name:"fvec2",identity:[0,0],components:["xy","01"],undefined0:function(){return this.identity},number1:function(a){return[a,a]},number2:function(a,b){return[a,b]},object1:function(a){if(null!==a)switch(a.length){case 4:case 3:case 2:return[a[0],a[1]];default:if("y"in a&&"x"in a){if(typeof a.x!==typeof a.y)throw new GLM.GLMJSError("unrecognized .x-ish object passed to GLM.vec2: "+a);return"string"===typeof a.x?[1*a.x,1*a.y]:[a.x,a.y]}}throw new GLM.GLMJSError("unrecognized object passed to GLM.vec2: "+
+a);}});
+GLM.uvec2=GLM.$template.GLMType("uvec2",{name:"uvec2",identity:[0,0],components:["xy","01"],_clamp:function(a){return~~a},undefined0:function(){return this.identity},number1:function(a){a=this._clamp(a);return[a,a]},number2:function(a,b){a=this._clamp(a);b=this._clamp(b);return[a,b]},object1:function(a){switch(a.length){case 4:case 3:case 2:return[a[0],a[1]].map(this._clamp);default:if("y"in a&&"x"in a){if(typeof a.x!==typeof a.y)throw new GLM.GLMJSError("unrecognized .x-ish object passed to GLM."+this.name+
+": "+a);return[a.x,a.y].map(this._clamp)}}throw new GLM.GLMJSError("unrecognized object passed to GLM."+this.name+": "+a);}});
+GLM.vec3=GLM.$template.GLMType("vec3",{name:"fvec3",identity:[0,0,0],components:["xyz","012","rgb"],undefined0:function(){return GLM.vec3.$.identity},number1:function(a){return[a,a,a]},number2:function(a,b){return[a,b,b]},number3:function(a,b,c){return[a,b,c]},Error:GLM.GLMJSError,object1:function(a){if(a)switch(a.length){case 4:case 3:return[a[0],a[1],a[2]];case 2:return[a[0],a[1],a[1]];default:if("z"in a&&"x"in a){if(typeof a.x!==typeof a.y)throw new this.Error("unrecognized .x-ish object passed to GLM.vec3: "+
+a);return"string"===typeof a.x?[1*a.x,1*a.y,1*a.z]:[a.x,a.y,a.z]}}throw new this.Error("unrecognized object passed to GLM.vec3: "+a);},object2:function(a,b){if(a instanceof GLM.vec2||a instanceof GLM.uvec2||a instanceof GLM.ivec2||a instanceof GLM.bvec2)return[a.x,a.y,b];throw new GLM.GLMJSError("unrecognized object passed to GLM.vec3(o,z): "+[a,b]);}});
+GLM.uvec3=GLM.$template.GLMType("uvec3",{name:"uvec3",identity:[0,0,0],components:["xyz","012"],_clamp:GLM.uvec2.$._clamp,undefined0:function(){return this.identity},number1:function(a){a=this._clamp(a);return[a,a,a]},number2:function(a,b){a=this._clamp(a);b=this._clamp(b);return[a,b,b]},number3:function(a,b,c){a=this._clamp(a);b=this._clamp(b);c=this._clamp(c);return[a,b,c]},object1:function(a){if(a)switch(a.length){case 4:case 3:return[a[0],a[1],a[2]].map(this._clamp);case 2:return[a[0],a[1],a[1]].map(this._clamp);
+default:if("z"in a&&"x"in a){if(typeof a.x!==typeof a.y)throw new GLM.GLMJSError("unrecognized .x-ish object passed to GLM."+this.name+": "+a);return[a.x,a.y,a.z].map(this._clamp)}}throw new GLM.GLMJSError("unrecognized object passed to GLM."+this.name+": "+a);},object2:function(a,b){if(a instanceof GLM.vec2)return[a.x,a.y,b].map(this._clamp);if(a instanceof GLM.uvec2||a instanceof GLM.ivec2||a instanceof GLM.bvec2)return[a.x,a.y,this._clamp(b)];throw new GLM.GLMJSError("unrecognized object passed to GLM."+
+this.name+"(o,z): "+[a,b]);}});
+GLM.vec4=GLM.$template.GLMType("vec4",{name:"fvec4",identity:[0,0,0,0],components:["xyzw","0123","rgba"],undefined0:function(){return this.identity},number1:function(a){return[a,a,a,a]},number2:function(a,b){return[a,b,b,b]},number3:function(a,b,c){return[a,b,c,c]},number4:function(a,b,c,e){return[a,b,c,e]},Error:GLM.GLMJSError,object1:function(a){if(a)switch(a.length){case 4:return[a[0],a[1],a[2],a[3]];case 3:return[a[0],a[1],a[2],a[2]];case 2:return[a[0],a[1],a[1],a[1]];default:if("w"in a&&"x"in
+a){if(typeof a.x!==typeof a.w)throw new this.Error("unrecognized .x-ish object passed to GLM.vec4: "+a);return"string"===typeof a.x?[1*a.x,1*a.y,1*a.z,1*a.w]:[a.x,a.y,a.z,a.w]}}throw new this.Error("unrecognized object passed to GLM.vec4: "+[a,a&&a.$type]);},$GLM:GLM,object2:function(a,b){if(a instanceof this.$GLM.vec3||a instanceof this.$GLM.uvec3||a instanceof this.$GLM.ivec3||a instanceof this.$GLM.bvec3)return[a.x,a.y,a.z,b];throw new this.$GLM.GLMJSError("unrecognized object passed to GLM.vec4(o,w): "+
+[a,b]);},object3:function(a,b,c){if(a instanceof this.$GLM.vec2||a instanceof this.$GLM.uvec2||a instanceof this.$GLM.ivec2||a instanceof this.$GLM.bvec2)return[a.x,a.y,b,c];throw new this.$GLM.GLMJSError("unrecognized object passed to GLM.vec4(o,z,w): "+[a,b,c]);}});
+GLM.uvec4=GLM.$template.GLMType("uvec4",{name:"uvec4",identity:[0,0,0,0],components:["xyzw","0123"],_clamp:GLM.uvec2.$._clamp,undefined0:function(){return this.identity},number1:function(a){a=this._clamp(a);return[a,a,a,a]},number2:function(a,b){a=this._clamp(a);b=this._clamp(b);return[a,b,b,b]},number3:function(a,b,c){a=this._clamp(a);b=this._clamp(b);c=this._clamp(c);return[a,b,c,c]},number4:function(a,b,c,e){return[a,b,c,e].map(this._clamp)},Error:GLM.GLMJSError,object1:function(a){if(a)switch(a.length){case 4:return[a[0],
+a[1],a[2],a[3]].map(this._clamp);case 3:return[a[0],a[1],a[2],a[2]].map(this._clamp);case 2:return[a[0],a[1],a[1],a[1]].map(this._clamp);default:if("w"in a&&"x"in a){if(typeof a.x!==typeof a.y)throw new this.Error("unrecognized .x-ish object passed to GLM."+this.name+": "+a);return[a.x,a.y,a.z,a.w].map(this._clamp)}}throw new GLM.GLMJSError("unrecognized object passed to GLM."+this.name+": "+[a,a&&a.$type]);},object2:function(a,b){if(a instanceof GLM.vec3)return[a.x,a.y,a.z,b].map(this._clamp);if(a instanceof
+GLM.uvec3||a instanceof GLM.ivec3||a instanceof GLM.bvec3)return[a.x,a.y,a.z,this._clamp(b)];throw new GLM.GLMJSError("unrecognized object passed to GLM."+this.name+"(o,w): "+[a,b]);},object3:function(a,b,c){if(a instanceof GLM.vec2)return[a.x,a.y,b,c].map(this._clamp);if(a instanceof GLM.uvec2||a instanceof GLM.ivec2||a instanceof GLM.bvec2)return[a.x,a.y,this._clamp(b),this._clamp(c)];throw new GLM.GLMJSError("unrecognized object passed to GLM."+this.name+"(o,z,w): "+[a,b,c]);}});
+GLM.ivec2=GLM.$template.GLMType("ivec2",GLM.$template.extend({},GLM.uvec2.$,{name:"ivec2"}));GLM.ivec3=GLM.$template.GLMType("ivec3",GLM.$template.extend({},GLM.uvec3.$,{name:"ivec3"}));GLM.ivec4=GLM.$template.GLMType("ivec4",GLM.$template.extend({},GLM.uvec4.$,{name:"ivec4"}));GLM.bvec2=GLM.$template.GLMType("bvec2",GLM.$template.extend({},GLM.uvec2.$,{name:"bvec2",boolean1:GLM.uvec2.$.number1,boolean2:GLM.uvec2.$.number2}));
+GLM.bvec3=GLM.$template.GLMType("bvec3",GLM.$template.extend({},GLM.uvec3.$,{name:"bvec3",boolean1:GLM.uvec3.$.number1,boolean2:GLM.uvec3.$.number2,boolean3:GLM.uvec3.$.number3}));GLM.bvec4=GLM.$template.GLMType("bvec4",GLM.$template.extend({},GLM.uvec4.$,{name:"bvec4",boolean1:GLM.uvec4.$.number1,boolean2:GLM.uvec4.$.number2,boolean3:GLM.uvec4.$.number3,boolean4:GLM.uvec4.$.number4}));GLM.bvec2.$._clamp=GLM.bvec3.$._clamp=GLM.bvec4.$._clamp=function(a){return!!a};
+GLM.mat3=GLM.$template.GLMType("mat3",{name:"mat3x3",identity:[1,0,0,0,1,0,0,0,1],undefined0:function(){return this.identity},number1:function(a){return 1===a?this.identity:[a,0,0,0,a,0,0,0,a]},number9:function(a,b,c,e,d,h,j,g,k){return arguments},Error:GLM.GLMJSError,$vec3:GLM.vec3,object1:function(a){if(a){var b=a.elements||a;if(16===b.length)return[b[0],b[1],b[2],b[4],b[5],b[6],b[8],b[9],b[10]];if(9===b.length)return b;if(0 in b&&1 in b&&2 in b&&!(3 in b)&&"object"===typeof b[2])return[b[0],b[1],
+b[2]].map(this.$vec3.$.object1).reduce(function(a,b){return a.concat(b)})}throw new this.Error("unrecognized object passed to GLM.mat3: "+a);},object3:function(a,b,c){return[a,b,c].map(glm.$to_array).reduce(function(a,b){return a.concat(b)})}});
+GLM.mat4=GLM.$template.GLMType("mat4",{name:"mat4x4",identity:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],undefined0:function(){return this.identity},number16:function(a,b,c,e,d,h,j,g,k,i,w,r,m,q,s,t){return arguments},number1:function(a){return 1===a?this.identity:[a,0,0,0,0,a,0,0,0,0,a,0,0,0,0,a]},Error:GLM.GLMJSError,$vec4:GLM.vec4,object1:function(a){var b;if(a){b=a.elements||a;if(9===b.length)return[b[0],b[1],b[2],0,b[3],b[4],b[5],0,b[6],b[7],b[8],0,0,0,0,1];if(4===b.length&&b[0]&&4===b[0].length)return b[0].concat(b[1],
+b[2],b[3]);if(16===b.length)return b;if(0 in b&&1 in b&&2 in b&&3 in b&&!(4 in b)&&"object"===typeof b[3])return[b[0],b[1],b[2],b[3]].map(this.$vec4.$.object1).reduce(function(a,b){return a.concat(b)})}throw new this.Error("unrecognized object passed to GLM.mat4: "+[a,b&&b.length]);},object4:function(a,b,c,e){return[a,b,c,e].map(glm.$to_array).reduce(function(a,b){return a.concat(b)})}});
+GLM.quat=GLM.$template.GLMType("quat",{identity:[0,0,0,1],components:["xyzw","0123"],undefined0:function(){return this.identity},number1:function(a){if(1!==a)throw Error("only quat(1) syntax supported for quat(number1 args)...");return this.identity},number4:function(a,b,c,e){return[b,c,e,a]},$GLM:GLM,$M3:GLM.mat3(),$quat_array_from_zyx:function(a){var b=this.$M3;return this.$GLM.$outer.quat_angleAxis(a.z,b[2]).mul(this.$GLM.$outer.quat_angleAxis(a.y,b[1])).mul(this.$GLM.$outer.quat_angleAxis(a.x,
+b[0])).elements},object1:function(a){if(a){if(a instanceof this.$GLM.mat4)return this.$GLM.$outer.quat_array_from_mat4(a);if(4===a.length)return[a[0],a[1],a[2],a[3]];if(a instanceof this.$GLM.quat)return[a.x,a.y,a.z,a.w];if(a instanceof this.$GLM.vec3)return this.$quat_array_from_zyx(a);if("w"in a&&"x"in a)return"string"===typeof a.x?[1*a.x,1*a.y,1*a.z,1*a.w]:[a.x,a.y,a.z,a.w]}throw new this.$GLM.GLMJSError("unrecognized object passed to GLM.quat.object1: "+[a,a&&a.$type,typeof a,a&&a.constructor]);
+}});
+(function(){var a=function(a,b,c,e){var k={def:function(b,c){this[b]=c;Object.defineProperty(a.prototype,b,c)}};a.$properties=a.$properties||k;var i=a.$properties.def.bind(a.$properties),w=[0,1,2,3].map(function(a){return{enumerable:c,get:function(){return this.elements[a]},set:function(b){this.elements[a]=b}}});b.forEach(function(a,b){i(a,w[b])});if(isNaN(b[0])&&!/^_/.test(b[0])){var k=b.slice(),r=GLM.$subarray;do(function(a,b,c){"quat"===b&&(b="vec"+c);var d=GLM[b];i(a,{enumerable:!1,get:function(){return new d(r(this.elements,0*
+c,1*c))},set:function(a){return(new d(r(this.elements,0*c,1*c)))["="](a)}})})(k.join(""),a.prototype.$type.replace(/[1-9]$/,k.length),k.length);while(k[1]!=k.pop());if(e)return a.$properties;k=b.slice();if(b={xyz:{yz:1},xyzw:{yzw:1,yz:1,zw:2}}[k.join("")])for(var m in b)(function(a,b,c,d){i(a,{enumerable:!1,get:function(){return new GLM[b](GLM.$subarray(this.elements,0*c+d,1*c+d))},set:function(a){return(new GLM[b](GLM.$subarray(this.elements,0*c+d,1*c+d)))["="](a)}})})(m,a.prototype.$type.replace(/[1-9]$/,
+m.length),m.length,b[m])}return a.$properties};a(GLM.vec2,GLM.vec2.$.components[0],!0);a(GLM.vec2,GLM.vec2.$.components[1]);a(GLM.vec3,GLM.vec3.$.components[0],!0);a(GLM.vec3,GLM.vec3.$.components[1]);a(GLM.vec3,GLM.vec3.$.components[2]);a(GLM.vec4,GLM.vec4.$.components[0],!0);a(GLM.vec4,GLM.vec4.$.components[1]);a(GLM.vec4,GLM.vec4.$.components[2]);a(GLM.quat,GLM.quat.$.components[0],!0,"noswizzles");a(GLM.quat,GLM.quat.$.components[1]);GLM.quat.$properties.def("wxyz",{enumerable:!1,get:function(){return new GLM.vec4(this.w,
+this.x,this.y,this.z)},set:function(a){a=GLM.vec4(a);return this["="](GLM.quat(a.x,a.y,a.z,a.w))}});"uvec2 uvec3 uvec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4".split(" ").forEach(function(b){a(GLM[b],GLM[b].$.components[0],!0);a(GLM[b],GLM[b].$.components[1])});Object.defineProperty(GLM.quat.prototype,"_x",{get:function(){throw Error("erroneous quat._x access");}});var b={2:{yx:{enumerable:!1,get:function(){return new GLM.vec2(this.y,this.x)},set:function(a){a=GLM.vec2(a);this.y=a[0];this.x=a[1]}}},3:{xz:{enumerable:!1,
+get:function(){return new GLM.vec2(this.x,this.z)},set:function(a){a=GLM.vec2(a);this.x=a[0];this.z=a[1]}},zx:{enumerable:!1,get:function(){return new GLM.vec2(this.z,this.x)},set:function(a){a=GLM.vec2(a);this.z=a[0];this.x=a[1]}},xzy:{enumerable:!1,get:function(){return new GLM.vec3(this.x,this.z,this.y)},set:function(a){a=GLM.vec3(a);this.x=a[0];this.z=a[1];this.y=a[2]}}},4:{xw:{enumerable:!1,get:function(){return new GLM.vec2(this.x,this.w)},set:function(a){a=GLM.vec2(a);this.x=a[0];this.w=a[1]}},
+wz:{enumerable:!1,get:function(){return new GLM.vec2(this.w,this.z)},set:function(a){a=GLM.vec2(a);this.w=a[0];this.z=a[1]}},wxz:{enumerable:!1,get:function(){return new GLM.vec3(this.w,this.x,this.z)},set:function(a){a=GLM.vec3(a);this.w=a[0];this.x=a[1];this.z=a[2];return this}},xyw:{enumerable:!1,get:function(){return new GLM.vec3(this.x,this.y,this.w)},set:function(a){a=GLM.vec3(a);this.x=a[0];this.y=a[1];this.w=a[2];return this}},xzw:{enumerable:!1,get:function(){return new GLM.vec3(this.x,this.z,
+this.w)},set:function(a){a=GLM.vec3(a);this.x=a[0];this.z=a[1];this.w=a[2]}},wxyz:{enumerable:!1,get:function(){return new GLM.vec4(this.w,this.x,this.y,this.z)},set:function(a){a=GLM.vec4(a);this.w=a[0];this.x=a[1];this.y=a[2];this.z=a[3];return this}}}},c;for(c in b)for(var e in b[c])2>=c&&GLM.vec2.$properties.def(e,b[c][e]),3>=c&&GLM.vec3.$properties.def(e,b[c][e]),4>=c&&GLM.vec4.$properties.def(e,b[c][e]);GLM.$partition=function(a,b,c,e){if(void 0===c)throw new GLM.GLMJSError("nrows is undefined");
+var k=b.$.identity.length;c=c||k;for(var i=function(a){3<GLM.$DEBUG&&GLM.$outer.console.debug("CACHEDBG: "+a)},w=0;w<c;w++)(function(c){var j=e&&e+c,q=c*k;Object.defineProperty(a,c,{configurable:!0,enumerable:!0,set:function(e){if(e instanceof b)this.elements.set(e.elements,q);else if(e&&e.length===k)this.elements.set(e,q);else throw new GLM.GLMJSError("unsupported argtype to "+(a&&a.$type)+"["+c+"] setter: "+[typeof e,e]);},get:function(){if(e){if(this[j])return c||i("cache hit "+j),this[j];c||i("cache miss "+
+j)}var a,d=new b(a=GLM.$subarray(this.elements,q,q+k));if(d.elements!==a)throw new GLM.GLMJSError("v.elements !== t "+[GLM.$subarray,d.elements.constructor===a.constructor,d.elements.buffer===a.buffer]);e&&Object.defineProperty(this,j,{configurable:!0,enumerable:!1,value:d});return d}})})(w)};GLM.$partition(GLM.mat4.prototype,GLM.vec4,4,"_cache_");GLM.$partition(GLM.mat3.prototype,GLM.vec3,3,"_cache_")})();
+GLM.$dumpTypes=function(a){GLM.$types.forEach(function(b){GLM[b].componentLength&&a("GLM."+b,JSON.stringify({"#type":GLM[b].prototype.$type_name,"#floats":GLM[b].componentLength,"#bytes":GLM[b].BYTES_PER_ELEMENT}))})};
+GLM.$init=function(a){a.prefix&&(GLMJS_PREFIX=a.prefix);GLM.$prefix=GLMJS_PREFIX;var b=a.log||function(){};try{b("GLM-js: ENV: "+_ENV._VERSION)}catch(c){}b("GLM-JS: initializing: "+JSON.stringify(a,0,2));b(JSON.stringify({functions:Object.keys(GLM.$outer.functions)}));var e=GLM.mat4,d=GLM.$outer;GLM.toMat4=function(a){return new e(d.mat4_array_from_quat(a))};GLM.$template.extend(GLM.rotation.$template,{$quat:GLM.quat,$dot:GLM.dot.link("vec3,vec3"),$epsilon:GLM.epsilon(),$m:GLM.mat3(),$pi:GLM.pi(),
+$length2:GLM.length2.link("vec3"),$cross:GLM.cross.link("vec3,vec3"),$normalize:GLM.normalize.link("vec3"),$angleAxis:GLM.angleAxis.link("float,vec3"),$sqrt:GLM.sqrt});GLM.$symbols=[];for(var h in GLM)"function"===typeof GLM[h]&&/^[a-z]/.test(h)&&GLM.$symbols.push(h);GLM.$types.forEach(function(a){var b=GLM[a].prototype.$type,c;for(c in GLM.$outer.functions){var d=GLM.$outer.functions[c];d.$op&&(GLM.$DEBUG&&GLM.$outer.console.debug("mapping operator<"+b+"> "+c+" / "+d.$op),GLM[a].prototype[c]=d,GLM[a].prototype[d.$op]=
+d)}});b("GLM-JS: "+GLM.version+" emulating GLM_VERSION="+GLM.GLM_VERSION+" vendor_name="+a.vendor_name+" vendor_version="+a.vendor_version);glm.vendor=a};
+GLM.using_namespace=function(a){GLM.$DEBUG&&GLM.$outer.console.debug("GLM.using_namespace munges globals; it should probably not be used!");GLM.using_namespace.$tmp={ret:void 0,tpl:a,names:GLM.$symbols,saved:{},evals:[],restore:[],before:[],after:[]};eval(GLM.using_namespace.$tmp.names.map(function(a,c){return"GLM.using_namespace.$tmp.saved['"+a+"'] = GLM.using_namespace.$tmp.before["+c+"] = 'undefined' !== typeof "+a+";"}).join("\n"));GLM.$DEBUG&&console.warn("GLM.using_namespace before #globals: "+
+GLM.using_namespace.$tmp.before.length);GLM.using_namespace.$tmp.names.map(function(a){GLM.using_namespace.$tmp.restore.push(a+"=GLM.using_namespace.$tmp.saved['"+a+"'];"+("GLM.using_namespace.$tmp.saved['"+a+"']=undefined;delete GLM.using_namespace.$tmp.saved['"+a+"'];"));GLM.using_namespace.$tmp.evals.push(a+"=GLM."+a+";")});eval(GLM.using_namespace.$tmp.evals.join("\n"));GLM.using_namespace.$tmp.ret=a();eval(GLM.using_namespace.$tmp.restore.join("\n"));eval(GLM.using_namespace.$tmp.names.map(function(a,
+c){return"GLM.using_namespace.$tmp.after["+c+"] = 'undefined' !== typeof "+a+";"}).join("\n"));GLM.$DEBUG&&console.warn("GLM.using_namespace after #globals: "+GLM.using_namespace.$tmp.after.length);a=GLM.using_namespace.$tmp.ret;delete GLM.using_namespace.$tmp;return a};
+function $GLM_extern(a,b){b=b||a;return function(){GLM[b]=GLM.$outer.functions[a]||GLM.$outer[a];if(!GLM[b])throw new GLM.GLMJSError("$GLM_extern: unresolved external symbol: "+a);GLM.$DEBUG&&GLM.$outer.console.debug("$GLM_extern: resolved external symbol "+a+" "+typeof GLM[b]);return GLM[b].apply(this,arguments)}}
+function GLM_polyfills(){var a={};"bind"in Function.prototype||(a.bind=Function.prototype.bind=function(a){function c(){}if("function"!==typeof this)throw new TypeError("not callable");var e=[].slice,d=e.call(arguments,1),h=this,j=function(){return h.apply(this instanceof c?this:a||global,d.concat(e.call(arguments)))};c.prototype=this.prototype||c.prototype;j.prototype=new c;return j});return a}
+$GLM_reset_logging.current=function(){return{$GLM_log:"undefined"!==typeof $GLM_log&&$GLM_log,$GLM_console_log:"undefined"!==typeof $GLM_console_log&&$GLM_console_log,$GLM_console_prefixed:"undefined"!==typeof $GLM_console_prefixed&&$GLM_console_prefixed,console:GLM.$outer.console}};
+function $GLM_reset_logging(a){a&&"object"===typeof a&&($GLM_log=a.$GLM_log,$GLM_console_log=a.$GLM_console_log,$GLM_console_factory=a.$GLM_console_factory,GLM.$outer.console=a.console,a=!1);if(a||"undefined"===typeof $GLM_log)$GLM_log=function(a,b){GLM.$outer.console.log.apply(GLM.$outer.console,[].slice.call(arguments).map(function(a){var b=typeof a;return"xboolean"===b||"string"===b?a+"":GLM.$isGLMObject(a)||!isNaN(a)?GLM.to_string(a):a+""}))};if(a||"undefined"===typeof $GLM_console_log)$GLM_console_log=
+function(a,b){(console[a]||function(){}).apply(console,[].slice.call(arguments,1))};if(a||"undefined"===typeof $GLM_console_factory)$GLM_console_factory=function(a){return $GLM_console_log.bind($GLM_console_log,a)};var b=$GLM_console_factory,c={};"debug,warn,info,error,log,write".replace(/\w+/g,function(a){c[a]=b(a)});"object"===typeof GLM&&(GLM.$outer&&(GLM.$outer.console=c),GLM.$log=$GLM_log);return c}try{window.$GLM_reset_logging=this.$GLM_reset_logging=$GLM_reset_logging}catch(e$$19){}
+GLM.$reset_logging=$GLM_reset_logging;GLM.$log=GLM.$log||$GLM_log;function $GLM_GLMJSError(a,b){function c(c){this.name=a;this.stack=Error().stack;Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor);this.message=c;b&&b.apply(this,arguments)}c.prototype=Error();c.prototype.name=a;return c.prototype.constructor=c}GLMAT.mat4.exists;glm=GLM;var DLL={_version:"0.0.2",_name:"glm.gl-matrix.js",_glm_version:glm.version,prefix:"glm-js[glMatrix]: ",vendor_version:GLMAT.VERSION,vendor_name:"glMatrix"};
+DLL.statics={$outer:GLM.$outer,$typeArray:function(a){return new this.$outer.Float32Array(a)},$mat4:GLM.mat4,$quat:GLM.quat,$mat4$perspective:GLMAT.mat4.perspective,$mat4$ortho:GLMAT.mat4.ortho,mat4_perspective:function(a,b,c,e){return new this.$mat4(this.$mat4$perspective(this.$typeArray(16),a,b,c,e))},mat4_ortho:function(a,b,c,e,d,h){return new this.$mat4(this.$mat4$ortho(this.$typeArray(16),a,b,c,e,d||-1,h||1))},$quat$setAxisAngle:GLMAT.quat.setAxisAngle,$mat4$fromQuat:GLMAT.mat4.fromQuat,mat4_angleAxis:function(a,
+b){var c=this.$quat$setAxisAngle(this.$typeArray(4),b,a);return new this.$mat4(this.$mat4$fromQuat(this.$typeArray(16),c))},quat_angleAxis:function(a,b){return new this.$quat(this.$quat$setAxisAngle(this.$typeArray(4),b,a))},$mat4$translate:GLMAT.mat4.translate,mat4_translation:function(a){var b=new this.$mat4;this.$mat4$translate(b.elements,b.elements,a.elements);return b},$mat4$scale:GLMAT.mat4.scale,mat4_scale:function(a){var b=new this.$mat4;this.$mat4$scale(b.elements,b.elements,a.elements);
+return b},toJSON:function(){var a={},b;for(b in this)0!==b.indexOf("$")&&(a[b]=this[b]);return a},$vec3:GLM.vec3,$clamp:GLM.clamp,mat4_array_from_quat:function(a){return this.$mat4$fromQuat(this.$typeArray(16),a.elements)},$qtmp:new GLM.$outer.Float32Array(9),$quat$fromMat3:GLMAT.quat.fromMat3,$mat3$fromMat4:GLMAT.mat3.fromMat4,quat_array_from_mat4:function(a){return this.$quat$fromMat3(this.$typeArray(4),this.$mat3$fromMat4(this.$qtmp,a.elements))}};
+DLL["declare<T,V,...>"]={mul:{$op:"*",$typeArray:function(a){return new this.GLM.$outer.Float32Array(a)},$vec3$transformQuat:GLMAT.vec3.transformQuat,"quat,vec3":function(a,b){return new this.GLM.vec3(this.$vec3$transformQuat(this.$typeArray(3),b.elements,a.elements))},"vec3,quat":function(a,b){return this["quat,vec3"](this.GLM.inverse(b),a)},"quat,vec4":function(a,b){return this["mat4,vec4"](this.GLM.toMat4(a),b)},"vec4,quat":function(a,b){return this["quat,vec4"](this.GLM.inverse(b),a)},"$vec<N>$scale":"GLMAT.vecN.scale",
+"vec<N>,float":function(a,b){return new this.GLM.vecN(this.$vecN$scale(this.$typeArray(N),a.elements,b))},"quat,float":function(a,b){return new a.constructor(this["vec4,float"](a,b).elements)},$vec4$transformMat4:GLMAT.vec4.transformMat4,"mat4,vec4":function(a,b){return new GLM.vec4(this.$vec4$transformMat4(this.$typeArray(4),b.elements,a.elements))},"vec4,mat4":function(a,b){return this["mat4,vec4"](GLM.inverse(b),a)},"$mat<N>mul":"GLMAT.matN.mul","mat<N>,mat<N>":function(a,b){return new a.constructor(this.$matNmul(this.$typeArray(N*
+N),a.elements,b.elements))},$quat$multiply:GLMAT.quat.multiply,"quat,quat":function(a,b){return new a.constructor(this.$quat$multiply(this.$typeArray(4),a.elements,b.elements))}},mul_eq:{$op:"*=","$mat<N>$multiply":"GLMAT.matN.multiply","mat<N>,mat<N>":function(a,b){this.$matN$multiply(a.elements,a.elements,b.elements);return a},"$vec<N>$scale":"GLMAT.vecN.scale","vec<N>,float":function(a,b){this.$vecN$scale(a.elements,a.elements,b);return a},$quat$multiply:GLMAT.quat.multiply,"quat,quat":function(a,
+b){this.$quat$multiply(a.elements,a.elements,b.elements);return a},$quat$invert:GLMAT.quat.invert,$vec3$transformQuat:GLMAT.vec3.transformQuat,"inplace:vec3,quat":function(a,b){var c=this.$quat$invert(new this.GLM.$outer.Float32Array(4),b.elements);this.$vec3$transformQuat(a.elements,a.elements,c);return a},$mat4$invert:GLMAT.mat4.invert,$vec4$transformMat4:GLMAT.vec4.transformMat4,"inplace:vec4,mat4":function(a,b){var c=this.$mat4$invert(new this.GLM.$outer.Float32Array(16),b.elements);this.$vec4$transformMat4(a.elements,
+a.elements,c);return a}},cross:{$vec2$cross:GLMAT.vec2.cross,"vec2,vec2":function(a,b){return new this.GLM.vec3(this.$vec2$cross(new this.GLM.$outer.Float32Array(3),a,b))},$vec3$cross:GLMAT.vec3.cross,"vec3,vec3":function(a,b){return new this.GLM.vec3(this.$vec3$cross(new this.GLM.$outer.Float32Array(3),a,b))}},dot:{"$vec<N>$dot":"GLMAT.vecN.dot","vec<N>,vec<N>":function(a,b){return this.$vecN$dot(a,b)}},lookAt:{$mat4$lookAt:GLMAT.mat4.lookAt,"vec3,vec3":function(a,b,c){return new this.GLM.mat4(this.$mat4$lookAt(new this.GLM.$outer.Float32Array(16),
+a.elements,b.elements,c.elements))}}};DLL["declare<T,V,number>"]={mix:{$quat$slerp:GLMAT.quat.slerp,"quat,quat":function(a,b,c){return new GLM.quat(this.$quat$slerp(new GLM.$outer.Float32Array(4),a.elements,b.elements,c))}}};DLL["declare<T,V,number>"].slerp=DLL["declare<T,V,number>"].mix;
+DLL["declare<T>"]={normalize:{"$vec<N>normalize":"GLMAT.vecN.normalize",$typeArray:function(a){return new this.GLM.$outer.Float32Array(a)},"vec<N>":function(a){return new this.GLM.vecN(this.$vecNnormalize(this.$typeArray(N),a))},$quat$normalize:GLMAT.quat.normalize,quat:function(a){return new this.GLM.quat(this.$quat$normalize(new this.GLM.$outer.Float32Array(4),a.elements))}},length:{$quat$length:GLMAT.quat.length,quat:function(a){return this.$quat$length(a.elements)},"$vec<N>$length":"GLMAT.vecN.length",
+"vec<N>":function(a){return this.$vecN$length(a.elements)}},length2:{$quat$squaredLength:GLMAT.quat.squaredLength,quat:function(a){return this.$quat$squaredLength(a.elements)},"$vec<N>$squaredLength":"GLMAT.vecN.squaredLength","vec<N>":function(a){return this.$vecN$squaredLength(a.elements)}},inverse:{$quatinvert:GLMAT.quat.invert,quat:function(a){return this.GLM.quat(this.$quatinvert(new this.GLM.$outer.Float32Array(4),a.elements))},$mat4invert:GLMAT.mat4.invert,mat4:function(a){a=a.clone();return null===
+this.$mat4invert(a.elements,a.elements)?a["="](this.GLM.mat4()):a}},transpose:{$mat4$transpose:GLMAT.mat4.transpose,mat4:function(a){a=a.clone();this.$mat4$transpose(a.elements,a.elements);return a}}};glm.$outer.$import(DLL);try{module.exports=glm}catch(e$$20){}
+function $GLMVector(a,b,c){this.typearray=c=c||GLM.$outer.Float32Array;if(!(this instanceof $GLMVector))throw new GLM.GLMJSError("use new");if("function"!==typeof a||!GLM.$isGLMConstructor(a))throw new GLM.GLMJSError("expecting typ to be GLM.$isGLMConstructor: "+[typeof a,a?a.$type:a]+" // "+GLM.$isGLMConstructor(a));if(1===a.componentLength&&GLM[a.prototype.$type.replace("$","$$v")])throw new GLM.GLMJSError("unsupported argtype to glm.$vectorType - for single-value types use glm."+a.prototype.$type.replace("$",
+"$$v")+"..."+a.prototype.$type);this.glmtype=a;if(!this.glmtype.componentLength)throw Error("need .componentLength "+[a,b,c]);this.componentLength=this.glmtype.componentLength;this.BYTES_PER_ELEMENT=this.glmtype.BYTES_PER_ELEMENT;this._set_$elements=function(a){Object.defineProperty(this,"$elements",{enumerable:!1,configurable:!0,value:a});return this.$elements};Object.defineProperty(this,"elements",{enumerable:!0,configurable:!0,get:function(){return this.$elements},set:function(a){this._kv&&!this._kv.dynamic&&
+GLM.$DEBUG&&GLM.$outer.console.warn("WARNING: setting .elements on frozen (non-dynamic) GLMVector...");if(a){var b=this.length;this.length=a.length/this.componentLength;this.byteLength=a.length*this.BYTES_PER_ELEMENT;if(this.length!==Math.round(this.length))throw new GLM.GLMJSError("$vectorType.length alignment mismatch "+JSON.stringify({componentLength:this.componentLength,length:this.length,rounded_length:Math.round(this.length),elements_length:a.length,old_length:b}));}else this.length=this.byteLength=
+0;return this._set_$elements(a)}});this.elements=b&&new c(b*a.componentLength)}GLM.$vectorType=$GLMVector;GLM.$vectorType.version="0.0.2";
+$GLMVector.prototype=GLM.$template.extend(new GLM.$GLMBaseType($GLMVector,"$vectorType"),{toString:function(){return"[$GLMVector .elements=#"+(this.elements&&this.elements.length)+" .elements[0]="+(this.elements&&this.elements[0])+" ->[0]"+(this["->"]&&this["->"][0])+"]"},"=":function(a){if(a instanceof this.constructor||glm.$isGLMObject(a))a=a.elements;return this._set(new this.typearray(a))},_typed_concat:function(a,b,c){var e=a.length+b.length;c=c||new a.constructor(e);c.set(a);c.set(b,a.length);
+return c},"+":function(a){if(a instanceof this.constructor||glm.$isGLMObject(a))a=a.elements;return new this.constructor(this._typed_concat(this.elements,a))},"+=":function(a){if(a instanceof this.constructor||glm.$isGLMObject(a))a=a.elements;return this._set(this._typed_concat(this.elements,a))},_set:function(a){a instanceof this.constructor&&(a=new this.typearray(a.elements));if(!(a instanceof this.typearray))throw new GLM.GLMJSError("unsupported argtype to $GLMVector._set "+(a&&a.constructor));
+GLM.$DEBUG&&GLM.$outer.console.debug("$GLMVector.prototype.set...this.elements:"+[this.elements&&this.elements.constructor.name,this.elements&&this.elements.length]+"elements:"+[a.constructor.name,a.length]);var b=this._kv;this._kv=void 0;this.elements=a;if(this.elements!==a)throw new GLM.GLMJSError("err with .elements: "+[this.glmtype.prototype.$type,this.elements,a]);b&&this._setup(b);return this},arrayize:function(a,b){return this._setup({dynamic:b,setters:a},this.length)},$destroy:function(a){if(a){for(var b=
+Array.isArray(a),c=function(c){Object.defineProperty(a,c,{enumerable:!0,configurable:!0,value:void 0});delete a[c];b||(a[c]=void 0,delete a[c])},e=0;e<a.length;e++)e in a&&c(e);for(;e in a;)GLM.$DEBUG&&GLM.$outer.console.debug("$destroy",this.name,e),c(e++);b&&(a.length=0)}},_arrlike_toJSON:function(){return this.slice(0)},_mixinArray:function(a){a.toJSON=this._arrlike_toJSON;"forEach map slice filter join reduce".split(" ").forEach(function(b){a[b]=Array.prototype[b]});return a},_setup:function(a,
+b){var c=this.glmtype,e=this.typearray,d=this.length;this._kv=a;var h=a.stride||this.glmtype.BYTES_PER_ELEMENT,j=a.offset||this.elements.byteOffset,g=a.elements||this.elements,k=a.container||this.arr||[],i=a.setters||!1,w=a.dynamic||!1;"self"===k&&(k=this);if(!g)throw new GLMJSError("GLMVector._setup - neither kv.elements nor this.elements...");this.$destroy(this.arr,b);var r=this.arr=this["->"]=k;Array.isArray(r)||this._mixinArray(r);var m=this.componentLength;if(!m)throw new GLM.GLMJSError("no componentLength!?"+
+Object.keys(this));for(var q=g.buffer.byteLength,s=this,t=0;t<d;t++){var k=j+t*h,z=k+this.glmtype.BYTES_PER_ELEMENT,y=function(){a.i=t;a.next=z;a.last=q;a.offset=a.offset||j;a.stride=a.stride||h;return JSON.stringify(a)};if(k>q)throw Error("["+t+"] off "+k+" > last "+q+" "+y());if(z>q)throw Error("["+t+"] next "+z+" > last "+q+" "+y());r[t]=null;var f=function(a,b){var d=new c(new e(a.buffer,b,m));w&&Object.defineProperty(d,"$elements",{value:a});return d},y=f(g,k);!i&&!w?r[t]=y:function(a,b,c){Object.defineProperty(r,
+b,{enumerable:!0,configurable:!0,get:w?function(){a.$elements!==s.elements&&(GLM.$log("dynoget rebinding ti",b,c,a.$elements===s.elements),a=f(s.elements,c));return a}:function(){return a},set:i&&(w?function(d){GLM.$log("dynoset",b,c,a.$elements===s.elements);a.$elements!==s.elements&&(GLM.$log("dynoset rebinding ti",b,c,a.$elements===s.elements),a=f(s.elements,c));return a.copy(d)}:function(b){return a.copy(b)})||void 0})}(y,t,k)}return this},setFromBuffers:function(a){var b=this.elements,c=0;a.forEach(function(a){var d=
+a.length;if(c+d>b.length){d=Math.min(b.length-c,a.length);if(0>=d)return;a=glm.$subarray(a,0,d);d=a.length}if(c+d>b.length)throw new glm.GLMJSError("$vectorType.fromBuffers mismatch "+[c,d,b.length]);b.set(a,c);c+=a.length});return c},setFromPointer:function(a){if(!(a instanceof GLM.$outer.ArrayBuffer))throw new glm.GLMJSError("unsupported argtype "+[typeof a]+" - $GLMVector.setFromPointer");return this._set(new this.typearray(a))}});GLM.exists;GLM.$vectorType.exists;
+if(GLM.$toTypedArray)throw"error: glm.experimental.js double-included";
+GLM.$toTypedArray=function(a,b,c){var e=b||0,d=typeof e;if("number"===d){if("number"!==typeof c)throw new GLM.GLMJSError("GLM.$toTypedArray: unsupported argtype for componentLength ("+typeof c+")");return new a(e*c)}if("object"!==d)throw new GLM.GLMJSError("GLM.$toTypedArray: unsupported arrayType: "+[typeof a,a]);if(e instanceof a)return e;if(e instanceof GLM.$outer.ArrayBuffer||Array.isArray(e))return new a(e);GLM.$isGLMObject(e)&&(d=e.elements,e=new a(d.length),e.set(d));if(!(e instanceof a)&&
+"byteOffset"in e&&"buffer"in e)return GLM.$DEBUG&&GLM.$outer.console.warn("coercing "+e.constructor.name+".buffer into "+[a.name,e.byteOffset,e.byteLength+" bytes","~"+e.byteLength/a.BYTES_PER_ELEMENT+" coerced elements"]+"...",{byteOffset:e.byteOffset,byteLength:e.byteLength,ecount:e.byteLength/a.BYTES_PER_ELEMENT}),new a(e.buffer,e.byteOffset,e.byteLength/a.BYTES_PER_ELEMENT);if(e instanceof a)return e;throw new GLM.GLMJSError("GLM.$toTypedArray: unsupported argtype initializers: "+[a,b,c]);};
+GLM.$make_primitive=function(a,b){GLM[a]=function(c){if(!(this instanceof GLM[a]))return new GLM[a](c);"object"!==typeof c&&(c=[c]);this.elements=GLM.$toTypedArray(b,c,1)};GLM[a]=eval(GLM.$template._traceable("glm_"+a+"$class",GLM[a]))();GLM.$template._add_overrides(a,{$to_string:function(a){return a.$type.replace(/[^a-z]/g,"")+"("+a.elements[0]+")"},$to_object:function(a){return a.elements[0]},$to_glsl:function(a){return a.$type.replace(/[^a-z]/g,"")+"("+a.elements[0]+")"}});GLM.$template._add_overrides(a.substr(1),
+{$to_string:!(a.substr(1)in GLM.$to_string.$template)&&function(a){return a.$type.replace(/[^a-z]/g,"")+"("+a.elements[0]+")"},$to_object:function(a){return a},$to_glsl:function(a){return a.$type.replace(/[^a-z]/g,"")+"("+a+")"}});GLM.$template.extend(GLM[a],{componentLength:1,BYTES_PER_ELEMENT:b.BYTES_PER_ELEMENT,prototype:GLM.$template.extend(new GLM.$GLMBaseType(GLM[a],a),{copy:function(a){this.elements.set(GLM.$isGLMObject(a)?a.elements:[a]);return this},valueOf:function(){return this.elements[0]}})});
+GLM[a].prototype["="]=GLM[a].prototype.copy;return GLM[a]};GLM.$make_primitive("$bool",GLM.$outer.Int32Array);GLM.$template._add_overrides("$bool",{$to_object:function(a){return!!a}});GLM.$make_primitive("$int32",GLM.$outer.Int32Array);GLM.$make_primitive("$uint32",GLM.$outer.Uint32Array);GLM.$make_primitive("$uint16",GLM.$outer.Uint16Array);GLM.$make_primitive("$uint8",GLM.$outer.Uint8Array);GLM.$float32=GLM.$make_primitive("$float",GLM.$outer.Float32Array);
+GLM.$make_primitive_vector=function(a,b,c){c=c||(new b).elements.constructor;var e=function(d){if(!(this instanceof e))return new e(d);this.$type=a;this.$type_name="vector<"+a+">";(d=GLM.$toTypedArray(c,d,b.componentLength))&&this._set(d)},e=eval(GLM.$template._traceable("glm_"+a+"$class",e))();e.prototype=new GLM.$vectorType(b,0,c);GLM.$template._add_overrides(a,{$to_string:function(a){return"[GLM."+a.$type+" elements[0]="+(a.elements&&a.elements[0])+"]"},$to_object:function(a){return a.map(GLM.$to_object)},
+$to_glsl:function(a,b){var c=a.$type.substr(2).replace(/[^a-z]/g,"");b="string"===typeof b?b:"example";var e=[];b&&e.push(c+" "+b+"["+a.length+"]");return e.concat(a.map(function(a,c){return b+"["+c+"] = "+a})).join(";")+";"}});GLM.$types.push(a);GLM.$template.extend(e.prototype,{$type:a,constructor:e,_setup:function(){throw new GLM.GLMJSError("._setup not available on primitive vectors yet...");},_set:function(a){this.elements=a;this.length=!this.elements?0:this.elements.length/this.glmtype.componentLength;
+this.arrayize();return this},arrayize:function(){for(var a=Object.defineProperty.bind(Object,this),b=0;b<this.length;b++)(function(b){a(b,{configurable:!0,enumerable:!0,get:function(){return this.elements[b]},set:function(a){return this.elements[b]=a}})})(b);return this._mixinArray(this)},toString:function(){return"[vector<"+a+"> {"+[].slice.call(this.elements,0,5)+(5<this.elements.length?",...":"")+"}]"}});return e};GLM.$vint32=GLM.$make_primitive_vector("$vint32",GLM.$int32);
+GLM.$vfloat=GLM.$vfloat32=GLM.$make_primitive_vector("$vfloat32",GLM.$float32);GLM.$vuint8=GLM.$make_primitive_vector("$vuint8",GLM.$uint8);GLM.$vuint16=GLM.$make_primitive_vector("$vuint16",GLM.$uint16);GLM.$vuint32=GLM.$make_primitive_vector("$vuint32",GLM.$uint32);
+GLM.$make_componentized_vector=function(a,b,c){c=c||(new b).elements.constructor;var e=function(a,h){if(!(this instanceof e))return new e(a,h);this._set(GLM.$toTypedArray(c,a,b.componentLength));if(!this.elements)throw new GLM.GLMJSError("!this.elements: "+[GLM.$toTypedArray(c,a,b.componentLength)]);this._setup({setters:!0,dynamic:h,container:"self"})},e=eval(GLM.$template._traceable("glm_"+a+"$class",e))();e.prototype=new GLM.$vectorType(b,0,c);GLM.$template._add_overrides(a,{$to_string:function(a){return"[GLM."+
+a.$type+" elements[0]="+(a.elements&&a.elements[0])+"]"},$to_object:function(a){return a.map(GLM.$to_object)},$to_glsl:function(a,b){var c=a.$type.substr(2);b="string"===typeof b?b:"example";var e=[];b&&e.push(c+" "+b+"["+a.length+"]");return e.concat(a.map(GLM.$to_glsl).map(function(a,c){return b+"["+c+"] = "+a})).join(";\n ")+";"}});GLM.$types.push(a);GLM.$template.extend(e.prototype,{$type:a,constructor:e});e.prototype.componentLength||alert("!cmop "+p);return e};
+(function(){var a=GLM.$template.deNify({"$vvec<N>":function(){return GLM.$make_componentized_vector("$vvecN",GLM.vecN)},"$vuvec<N>":function(){return GLM.$make_componentized_vector("$vuvecN",GLM.uvecN)},"$vmat<N>":function(){return GLM.$make_componentized_vector("$vmatN",GLM.matN)},$vquat:function(){return GLM.$make_componentized_vector("$vquat",GLM.quat)}},"$v"),b;for(b in a)GLM[b]=a[b]()})();
+(GLM._redefine_base64_helpers=function define_base64_helpers(b,c){function e(b){return(b+"").replace(/\s/g,"")}function d(b){return new k(b.split("").map(function(b){return b.charCodeAt(0)}))}function h(b){b instanceof k||(b=new k(b));return[].map.call(b,function(b){return String.fromCharCode(b)}).join("")}function j(b){b=b instanceof i?b:d(b).buffer;return GLM.$b64.encode(b,b.byteOffset,b.byteLength)}function g(b){b=new String(h(GLM.$b64.decode(b)));b.array=d(b);b.buffer=b.array.buffer;return b}
+b=define_base64_helpers.atob=b||define_base64_helpers.atob||g;c=define_base64_helpers.btoa=c||define_base64_helpers.btoa||j;var k=GLM.$outer.Uint8Array,i=GLM.$outer.ArrayBuffer,w,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf.bind("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");w={encode:function(b,c,d){b=new k(b,c,d);d=b.length;var e="";for(c=0;c<d;c+=3)e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[b[c]>>2],e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(b[c]&
+3)<<4|b[c+1]>>4],e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(b[c+1]&15)<<2|b[c+2]>>6],e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[b[c+2]&63];2===d%3?e=e.substring(0,e.length-1)+"=":1===d%3&&(e=e.substring(0,e.length-2)+"==");return e},decode:function(b){b=e(b);var c=b.length,d=0.75*c,g=0,h,j,f,v;"="===b[c-1]&&(d--,"="===b[c-2]&&d--);for(var w=new i(d),R=new k(w),d=0;d<c;d+=4)h=r(b[d]),j=r(b[d+1]),f=r(b[d+2]),v=r(b[d+3]),R[g++]=h<<2|j>>4,R[g++]=
+(j&15)<<4|f>>2,R[g++]=(f&3)<<6|v&63;return w}};GLM.$template.extend(w,{trim:e,atob:b,btoa:c,$atob:g,$btoa:j,toCharCodes:d,fromCharCodes:h,b64_to_utf8:function(c){return decodeURIComponent(escape(b(e(c))))},utf8_to_b64:function(b){return c(unescape(encodeURIComponent(b)))}});GLM.$template.extend(GLM,{$b64:w,$to_base64:function(b){return GLM.$b64.encode(b.elements.buffer,b.elements.byteOffset,b.elements.byteLength)},$from_base64:function(b,c){var d=GLM.$b64.decode(b);if(!0===c||c==GLM.$outer.ArrayBuffer)return d;
+void 0===c&&(c=GLM.$outer.Float32Array);return new c(d);throw new GLM.GLMJSError("TODO: $from_base64 not yet supported second argument type: ("+[typeof c,c]+")");}})})("function"===typeof atob&&atob.bind(this),"function"===typeof btoa&&btoa.bind(this));
+(function(){function a(a,c){return{get:function(){return a.call(this)},set:function(a){if(this.copy)return this.copy(new this.constructor(c.call(this,a)));this.elements.set(c.call(this,a))}}}"$bool $float32 $vfloat32 $vuint8 $vuint16 $vuint32 $vvec2 $vvec3 $vvec4 $vmat3 $vmat4 $vquat vec2 vec3 vec4 mat3 mat4 uvec2 uvec3 uvec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 quat".split(" ").map(GLM.$getGLMType).forEach(function(b){Object.defineProperty(b.prototype,"array",a(function(){return GLM.$to_array(this)},
+function(a){return a}));Object.defineProperty(b.prototype,"base64",a(function(){return GLM.$to_base64(this)},function(a){return GLM.$from_base64(a,this.elements.constructor)}));Object.defineProperty(b.prototype,"buffer",a(function(){return this.elements.buffer},function(a){return new this.elements.constructor(a)}));Object.defineProperty(b.prototype,"json",a(function(){return GLM.$to_json(this)},function(a){return JSON.parse(a)}));Object.defineProperty(b.prototype,"object",a(function(){return GLM.$to_object(this)},
+function(a){return a}));Object.defineProperty(b.prototype,"glsl",a(function(){return GLM.$to_glsl(this)},function(a){return GLM.$from_glsl(a,Array)}))})})();
+glm.GLMAT = GLMAT; globals.glm = glm; try { module.exports = glm; } catch(e) { }; try { window.glm = glm; } catch(e) {} ; try { declare.amd && declare(function() { return glm; }); } catch(e) {}; return this.glm = glm; })(this, typeof $GLM_log !== "undefined" ? $GLM_log : undefined, typeof $GLM_console_log !== "undefined" ? $GLM_console_log : undefined);



More information about the tex-live-commits mailing list