texlive[52300] Build/source/utils: asy 2.56 sources

commits+karl at tug.org commits+karl at tug.org
Sun Oct 6 19:17:35 CEST 2019


Revision: 52300
          http://tug.org/svn/texlive?view=revision&revision=52300
Author:   karl
Date:     2019-10-06 19:17:34 +0200 (Sun, 06 Oct 2019)
Log Message:
-----------
asy 2.56 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/Makefile.in
    trunk/Build/source/utils/asymptote/README
    trunk/Build/source/utils/asymptote/ReleaseNotes
    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/shaders/fragment.glsl
    trunk/Build/source/utils/asymptote/base/shaders/vertex.glsl
    trunk/Build/source/utils/asymptote/base/solids.asy
    trunk/Build/source/utils/asymptote/base/three.asy
    trunk/Build/source/utils/asymptote/base/three_surface.asy
    trunk/Build/source/utils/asymptote/bbox3.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/config.guess
    trunk/Build/source/utils/asymptote/config.h.in
    trunk/Build/source/utils/asymptote/config.sub
    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/FAQ/install-sh
    trunk/Build/source/utils/asymptote/doc/Makefile.in
    trunk/Build/source/utils/asymptote/doc/TeXShopAndAsymptote.pdf
    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.texi
    trunk/Build/source/utils/asymptote/doc/install-sh
    trunk/Build/source/utils/asymptote/doc/png/Makefile.in
    trunk/Build/source/utils/asymptote/doc/png/asymptote.info
    trunk/Build/source/utils/asymptote/drawelement.h
    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/Klein.asy
    trunk/Build/source/utils/asymptote/examples/Sierpinski.asy
    trunk/Build/source/utils/asymptote/examples/SierpinskiSponge.asy
    trunk/Build/source/utils/asymptote/examples/animations/earthmoon.asy
    trunk/Build/source/utils/asymptote/examples/fequlogo.asy
    trunk/Build/source/utils/asymptote/examples/logo3.asy
    trunk/Build/source/utils/asymptote/examples/pdb.asy
    trunk/Build/source/utils/asymptote/examples/shellmethod.asy
    trunk/Build/source/utils/asymptote/examples/triangles.asy
    trunk/Build/source/utils/asymptote/examples/vertexshading.asy
    trunk/Build/source/utils/asymptote/examples/washermethod.asy
    trunk/Build/source/utils/asymptote/fileio.h
    trunk/Build/source/utils/asymptote/glew.c
    trunk/Build/source/utils/asymptote/glrender.cc
    trunk/Build/source/utils/asymptote/glrender.h
    trunk/Build/source/utils/asymptote/install-sh
    trunk/Build/source/utils/asymptote/material.h
    trunk/Build/source/utils/asymptote/memory.h
    trunk/Build/source/utils/asymptote/pair.h
    trunk/Build/source/utils/asymptote/patches/README
    trunk/Build/source/utils/asymptote/path3.h
    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/prcfile.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/runmath.cc
    trunk/Build/source/utils/asymptote/runmath.in
    trunk/Build/source/utils/asymptote/runpicture.cc
    trunk/Build/source/utils/asymptote/runpicture.in
    trunk/Build/source/utils/asymptote/runtime.cc
    trunk/Build/source/utils/asymptote/runtime.in
    trunk/Build/source/utils/asymptote/settings.cc
    trunk/Build/source/utils/asymptote/settings.h
    trunk/Build/source/utils/asymptote/shaders.cc
    trunk/Build/source/utils/asymptote/shaders.h
    trunk/Build/source/utils/asymptote/tests/gc/array.asy
    trunk/Build/source/utils/asymptote/tests/gc/file.asy
    trunk/Build/source/utils/asymptote/tests/gc/funcall.asy
    trunk/Build/source/utils/asymptote/tests/gc/guide.asy
    trunk/Build/source/utils/asymptote/tests/gc/label.asy
    trunk/Build/source/utils/asymptote/tests/gc/shipout.asy
    trunk/Build/source/utils/asymptote/tests/gc/struct.asy
    trunk/Build/source/utils/asymptote/tr.cc
    trunk/Build/source/utils/asymptote/tr.h
    trunk/Build/source/utils/asymptote/triple.h
    trunk/Build/source/utils/asymptote/util.h
    trunk/Build/source/utils/asymptote/webgl/gl.js

Added Paths:
-----------
    trunk/Build/source/utils/asymptote/base/webgl/
    trunk/Build/source/utils/asymptote/base/webgl/WebGLfooter.html
    trunk/Build/source/utils/asymptote/base/webgl/WebGLheader.html
    trunk/Build/source/utils/asymptote/base/webgl/asygl-1.00.js
    trunk/Build/source/utils/asymptote/build-scripts/build-asygl
    trunk/Build/source/utils/asymptote/examples/uhrturm.obj
    trunk/Build/source/utils/asymptote/gl.js
    trunk/Build/source/utils/asymptote/jsfile.cc
    trunk/Build/source/utils/asymptote/jsfile.h
    trunk/Build/source/utils/asymptote/patches/cygwin_freeglut-3.0.0.patch
    trunk/Build/source/utils/asymptote/patches/gl-matrix-2.4.0-pruned.patch

Removed Paths:
-------------
    trunk/Build/source/utils/asymptote/algebra3.cc
    trunk/Build/source/utils/asymptote/algebra3.h
    trunk/Build/source/utils/asymptote/arcball.cc
    trunk/Build/source/utils/asymptote/arcball.h
    trunk/Build/source/utils/asymptote/build-scripts/build-freeglut
    trunk/Build/source/utils/asymptote/quaternion.h
    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/glm-js-min-2.2.2.js

Modified: trunk/Build/source/utils/README
===================================================================
--- trunk/Build/source/utils/README	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/README	2019-10-06 17:17:34 UTC (rev 52300)
@@ -4,7 +4,7 @@
 Extra utilities we (optionally) compile for TeX Live.
 See comments in ../texk/README.
 
-asymptote 2.52 - checked 10aug19
+asymptote 2.56 - checked 6oct19
   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-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/ChangeLog	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,3 +1,1648 @@
+commit be2e06c3b0c223338cb8b88906ff84db67690e71
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Oct 3 10:41:51 2019 -0600
+
+    Remove suffix argument from build-script.
+
+commit b2558d9e829450fee2baa7c5017c505e99c1a53a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Oct 3 09:49:13 2019 -0600
+
+    Update required dvisgm version in documentation.
+
+commit 09715350e4873b76339f06de179fb45868037553
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Oct 2 15:51:20 2019 -0600
+
+    Update documentation and example.
+
+commit 7614a954e5f4f81ff8dd004475afb2486c5a4fd4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Oct 2 00:49:42 2019 -0600
+
+    Document physically based rendering and transparent background option for WebGL.
+
+commit 499ae43068ae3cb8c31e3e4a94dd0b10a9bae77a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Oct 2 00:01:03 2019 -0600
+
+    Remove unused code.
+
+commit c8238140ab01cbe3c960fb55b36d17ba01c98d82
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Oct 1 22:58:29 2019 -0600
+
+    Fix array bounds.
+
+commit 6a3d04c27ac85cb862bbe4d9ae7968941da9785b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Oct 1 21:56:04 2019 -0600
+
+    Disable scrolling within viewport.
+
+commit 76aebefd6557f5590e61dfbe32b5391176e2e935
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Oct 1 21:55:25 2019 -0600
+
+    Update asygl.
+
+commit 0b49c13bfd465d55bdd96baf9ac273ffe98fe10b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Oct 1 14:46:58 2019 -0600
+
+    Update asygl.
+
+commit 437223b1a10947e0496a7cf810796d3081cfb2f9
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Oct 1 14:38:09 2019 -0600
+
+    Allow transparent background in webgl.
+
+commit f35a22b836d0c4b2fa3f4182ff852c8aeb3cb44d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Oct 1 09:54:28 2019 -0600
+
+    Implement background color in webgl.
+
+commit c3b7f41f9be0dcbca35296aa8ff172a99c63c2f8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Oct 1 09:54:05 2019 -0600
+
+    Update asygl.
+
+commit 451be75316e09552b424bf11612db9a0404bbd9f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 30 23:54:36 2019 -0600
+
+    Fix handling of missing glm library.
+
+commit 17694a76cfac4212110f5d9ae271e66222f7d2d4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 29 16:21:30 2019 -0600
+
+    Increment version to 2.56.
+
+commit a8198d8ff1c6742469d0b913adaa6645628fc005
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 29 15:53:20 2019 -0600
+
+    Fix MSDOS portability issue.
+
+commit 48f83b023681d7d4bbe7364dab146cb5128c520f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 29 14:58:32 2019 -0600
+
+    Fix compilation without OpenGL.
+
+commit 74c3182f0b704858a6557da909d7722129aa7042
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 29 14:41:41 2019 -0600
+
+    Fix test for tr1/unordered_map.
+
+commit bd1c855c82d1bd19a1b88724d2511a3fa5d6ae34
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 29 13:51:56 2019 -0600
+
+    Tighten up test for std::tr1::unordered_map on legacy systems.
+
+commit f6cd098b98fb8c1be1ac1795cc515a734cd8f20b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 29 12:41:25 2019 -0600
+
+    Fix viewMat initialization.
+
+commit b13df4e01c8a015f8937e86adf788e6683fccd08
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 29 04:37:49 2019 -0600
+
+    Increment version to 2.55.
+
+commit 1c26011ea8a7fdfba9725ae52ac308970bf2df24
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 29 03:04:36 2019 -0600
+
+    Silence Apple's OpenGL deprecation warning.
+
+commit bd6cef0ac6a2e4bce49c92a8ecc792473286b7d9
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 29 03:02:07 2019 -0600
+
+    Silence Apple's OpenGL deprecation warning.
+
+commit 908bfa8c1114af3098367b8a87866f3a08951d02
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 29 02:41:34 2019 -0600
+
+    If lighting is enabled, ignore specified vertex colors for PRC. To override
+    this backwards incompatibility and recover the previous behaviour,
+    manually disable lighting when drawing a surface s:
+    draw(s,prc() ? nolight : currentlight);
+
+commit 5beec3197c5692b45dfe487d55a1d6eaddeb0a6f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 29 01:22:14 2019 -0600
+
+    Ignore null surfaces; restore example.
+
+commit 7e2cf9efabb7506649c401ece5f80c4178177b73
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 28 23:09:43 2019 -0600
+
+    Port to MSDOS.
+
+commit bcf31e3f3e9ed3fb876312f793d89543f2e70d17
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 28 02:42:53 2019 -0600
+
+    Install webgl files; clean up GUI files on uninstall.
+
+commit 1b6150e70bc601c65af304d12f286cc64363557f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 28 01:54:30 2019 -0600
+
+    Document WebGL interface.
+
+commit 8c94986e48dcb1d4ec88ff7c0c87f4ac4d5757d3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 28 00:13:44 2019 -0600
+
+    Use aspect ratio for fitting; adjust arcball radius to account for viewportmargin; make interaction constants asy settings.
+
+commit 5c5ce0424f990db9fa8da644bab334b4b74cbe0c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 28 00:13:16 2019 -0600
+
+    Update asygl.
+
+commit 3d1242fc2f31aac1d4e5e297feb403b8e1ca1a51
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 27 18:12:02 2019 -0600
+
+    Define absolute in gl.js.
+
+commit 77deba7f33213ae0cba2c34b0d26878d0baf28ce
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 27 18:10:49 2019 -0600
+
+    Update asygl.
+
+commit 9c4690bf1114f9d0526c72619826176c74ad82da
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 27 17:47:01 2019 -0600
+
+    Reduce size of asygl by including only required subset of gl-matrix.
+
+commit 1208b33104c5b5b7a2a6fc3f3ad9165dfea92909
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 27 17:43:13 2019 -0600
+
+    Update asygl.
+
+commit 77206a8af882bd1f7388df810c9c9c30e6b56f06
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 27 13:04:09 2019 -0600
+
+    Expand webgl viewport to fit window; remove webglscale; rename devicepixel to absolute; add WindowTrim.
+
+commit 0ca3d60f01986f0ea89ccfd328bf361f29d73680
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 27 13:02:49 2019 -0600
+
+    Update asygl.
+
+commit 34977d2b4808156d276bcbb976ed9c9ec5a8b97b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 27 02:55:05 2019 -0600
+
+    Add webglscale and devicepixels options; implement shrink/expand viewport keys.
+
+commit 1ddada67255f9e61349bb5d7f2ce667108bba9db
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 27 02:54:17 2019 -0600
+
+    Update asygl.
+
+commit 9b0f5a6ae6cd37d337ae2637d1c71d289f239c15
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 26 03:32:37 2019 -0600
+
+    Avoid dvipdf dependency for building documentation.
+
+commit ff4b38c9e101ece6d2c6ba21e93bc1f7d8c15364
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 26 03:10:01 2019 -0600
+
+    Support --disable-gl again; ignore settings.render for WebGL output; account for devicePixelRatio; increase default viewportmargin to 0.5.
+
+commit ff25ef4b12699218459b62273c775b421f8f0fe9
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 26 03:06:38 2019 -0600
+
+    Update asygl.
+
+commit 19528ced5dec8cdb502fcb63ffa6ae0b457b2f04
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 25 22:52:43 2019 -0600
+
+    Replace arcball with simpler version backported from webgl; fix RotateX and Y.
+
+commit b1f630df463467db272330d9136915681bf1e30c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 25 21:06:36 2019 -0600
+
+    Fix segmentation fault.
+
+commit b232cc52137473a9db16f56c2d275c96b9d7f748
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 25 19:22:57 2019 -0600
+
+    Change rotation matrix back to 4x4.
+
+commit 848376cb50be96143325607f05e0d7a081f0867c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 25 11:45:33 2019 -0600
+
+    Move webgl files to base directory.
+
+commit 0224793b9a347e5d2ca7985e76783bdee2bb598b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 25 11:15:59 2019 -0600
+
+    Fix vector length in normMouse; improve build-asygl.
+
+commit 8388736d5dffa20d4a10886de99a08a3e18dc6b5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 25 03:32:59 2019 -0600
+
+    Add offline WebGL option.
+
+commit 37425ee28f676e2da11d9be7052b0dab28ea4c36
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 25 03:03:22 2019 -0600
+
+    Combine javascript libaries for faster loading; remove obsolete files;
+    add asygl environment variable to specify asygl library.
+
+commit 9e815e6e659fa873ae5b665566ae3691c8caa57f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 25 02:59:36 2019 -0600
+
+    Add LGPL license; avoid multiple matrix creations; simplify arcball.
+
+commit 0f30a12889852d3d9dc83437ed0e19d048128230
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 24 14:48:39 2019 -0600
+
+    Simplify webgl output of indexed triangles.
+
+commit 994c14bb4ac4c6bc00b986b5297c267cdb98bb92
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 24 10:43:25 2019 -0600
+
+    By default, use vertex indices for normal and color indices of indexed triangles.
+
+commit f5c79f97e5dc64a3183e1e6fd0a8f2a7417c1f7b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 24 01:06:04 2019 -0600
+
+    Include html comments.
+
+commit ca37df6f334784f278ac0edf708670c2bdcf49b9
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 24 00:12:45 2019 -0600
+
+    Add viewportmargin setting.
+
+commit e2aca7045e65c11e4a1250f99eb9002803ebcdf9
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 23 23:20:01 2019 -0600
+
+    Add missing offscreen checks.
+
+commit 6defe942af805b4ff7659f56ea43784a5193ef7b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 23 23:03:31 2019 -0600
+
+    Simplify code.
+
+commit 6fe7fc69fe8e49eed45b6acaa59bc2b1dee7ddc2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 23 22:48:09 2019 -0600
+
+    Add offscreen detection to indexed triangles.
+
+commit a8bc5263f72d87ca005d3d97f2a13037770b56ee
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 23 21:54:04 2019 -0600
+
+    Simplify code.
+
+commit 25b87d0dedc04180e36678963f59d6d0ed075cd2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 23 21:37:21 2019 -0600
+
+    Fix tiling.
+
+commit 1c442690870ffe6499012f799b97a41f6f6a8efc
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 23 21:23:17 2019 -0600
+
+    Implement webgl indexed triangles.
+
+commit a05450337791d59966d12fedecb19e73bebc2415
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 23 03:11:35 2019 -0600
+
+    Implement faster WebGL and OpenGL rendering, with improved offscreen detection.
+
+commit 07ee50be15e9968de2e1a6f70c00392785bb5028
+Merge: 4dcd549b 5e911430
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 23 01:27:26 2019 -0600
+
+    Merge branch 'master' into webgl.
+
+commit 5e91143045a807b6c6ba60a125b4220dad6a65bd
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 23 01:11:37 2019 -0600
+
+    Fix default value of file word() and documentation.
+
+commit 4dcd549b91ff8afe8855ddc20e6756b1e9c9d42e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 20 23:01:28 2019 -0600
+
+    Simplify code.
+
+commit fe2cab3b8086e3de638efc1008f69325f6bac8de
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 20 22:57:39 2019 -0600
+
+    Minor optimization.
+
+commit 6c30c8662563b66a724a1a0dddae20e60bd497ad
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 20 08:11:05 2019 -0600
+
+    Don't test for pow and sqrt which are sometimes implemented in hardware.
+
+commit 150d007d0a0c9e5fc40fd85f660a0377aab67b1f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 19 10:19:21 2019 -0600
+
+    Simplify code.
+
+commit 902fc9bf7e01b270492a2f51260646b3fdef06f1
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 19 09:32:18 2019 -0600
+
+    Optimize bbox2; rename norender to remesh and add missing return value.
+
+commit 077d8fd4e631da44cc93fb4a8c94f55841989dac
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 19 02:49:28 2019 -0600
+
+    Fix offscreen detection; discard rendered data once it goes offscreen.
+
+commit 49e21b13812931778e1385d82412373723b3b1bf
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 17 23:39:07 2019 -0600
+
+    Shrink nonbillboard material buffer by 7%.
+
+commit 9177fba6a47e79f9e2c21c5f1f76c483e55a4d02
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 16 16:46:26 2019 -0600
+
+    Conditionally view html file.
+
+commit a2bb8be9c68dc825477dd03db772b9a0abbeae02
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 16 16:18:43 2019 -0600
+
+    Optimize bounding box computation.
+
+commit a0f04aa0c2971e89161e6c459829edb0aefdca7d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 16 13:52:35 2019 -0600
+
+    Improve OpenGL straight optimization for curves.
+
+commit 25a04e41dc579c5a2ef66110500aea587abd09b6
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 16 13:21:21 2019 -0600
+
+    Fix order of PRC and webgl quad colors.
+
+commit 73b8974d343dc370ec459acf0bc2718165313b71
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 16 00:03:39 2019 -0600
+
+    Optimize offscreen in bezierpatch.h; remove unused code.
+
+commit b9866ef6ab0faa0c713cab7b03fe276257cb5217
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 15 22:24:41 2019 -0600
+
+    Add interface to html viewer.
+
+commit 24a3e54cd3e06d89869444eb6c8e07487dafe911
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 15 21:43:45 2019 -0600
+
+    Reformat webgl header and footer.
+
+commit 573369c22e52e2b4d3424ef1e0e8e4607572f7b4
+Merge: e6580bf3 221e1542
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 15 18:52:46 2019 -0600
+
+    Merge branch 'webgl'.
+
+commit 221e154209664025595ab423df0220649c084b5f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 15 18:50:45 2019 -0600
+
+    Optimize straight webgl lines.
+
+commit 7b36db5c4d07a7632a613c9652e5480ecaf022cb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 15 18:33:14 2019 -0600
+
+    Fix webgl quad normal.
+
+commit 712af1c6a75d2d19d85e8b5a4cd71604bc5feb33
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 15 18:14:40 2019 -0600
+
+    Add straight optimization to webgl.
+
+commit a33ade59a16fea0df08ee9b7bbc1d06440b0b859
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 15 16:28:34 2019 -0600
+
+    Implement webgl pixel shader.
+
+commit 75ec09fc0bb7195580b57e40657ec0e00d46064e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 15 12:20:22 2019 -0600
+
+    Remove duplicate code.
+
+commit e6580bf30d1ecd8f96a4b7e48adfcaa2a5d24fd5
+Merge: f40bd919 cc4115dd
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 15 01:03:28 2019 -0600
+
+    Merge branch 'webgl'.
+
+commit cc4115dd23fd4fb69951d5053ce615551b07cc86
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 14 23:50:33 2019 -0600
+
+    Pass asy lighting parameters; don't composite canvas with background.
+
+commit f55f0def02b723db059ddc790d29db077986e1ea
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 14 23:46:31 2019 -0600
+
+    Use 4x4 viewMat again (for correct lighting under rotation).
+
+commit a9146b8722a727d1daa11580609189e2ba3a8bf0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 14 18:17:41 2019 -0600
+
+    Fix ViewPosition; use a 3x3 view matrix.
+
+commit 31d49e55e82774285ac015b16f8969579c43d7c3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 14 11:09:55 2019 -0600
+
+    Add settings.digits to control default output file precision.
+
+commit bd8cd4877ebb7c73cb83a767721dfc858dfe8d57
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 14 01:00:33 2019 -0600
+
+    Standardize matrix names.
+
+commit 5ea4aaeae21c21e86535e5d5552a181be7222552
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 14 00:51:19 2019 -0600
+
+    Replace var by let.
+
+commit a1fdac350066487d3ffd66733ca59ce6dc11f6ea
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 14 00:49:53 2019 -0600
+
+    Further optimize Split3.
+
+commit a1a7a736a2e5ea3baaf66eec2d4df27984b2ba36
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 14 00:46:40 2019 -0600
+
+    Optimize split.
+
+commit 8b46c31c8ae3d5d681f49d546e1bc8165ac96f0c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 14 00:31:23 2019 -0600
+
+    Add webgl support for Bezier curves.
+
+commit 3975ba5416d9708e4c208ef508490571e7bdf985
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 13 17:42:45 2019 -0600
+
+    Detect navigator.vibrate.
+
+commit 381f82e9a2e7f220945d83b721832c157d4f4ac6
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 13 02:51:20 2019 -0600
+
+    Indicate shift mode with vibration.
+
+commit 9d8b6c4f188ccc7539fb1ab4a6db2439e78567de
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 12 09:59:01 2019 -0600
+
+    Remove unused arguments.
+
+commit f40bd919b1a2772f8ea696c0004b447ef6f21b11
+Merge: a6b55307 76978127
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 12 09:08:25 2019 -0600
+
+    Merge branch 'webgl'.
+
+commit 76978127a7d8b3dd68eb44e10ecf5c9c05c53972
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 12 09:07:57 2019 -0600
+
+    Allow for negative dot product.
+
+commit a6b5530720e91c8aa3b8ef2798ac24b0e814afec
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 12 00:58:34 2019 -0600
+
+    Restore example.
+
+commit 56936ea472caf20f8e3d5e5420f35e8d35d62451
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 12 00:48:50 2019 -0600
+
+    Fix arcball radius; improve mobile interaction.
+
+commit 3b3b1b2efae71b494eadb4eb4b41fd0f1476d353
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 12 00:26:20 2019 -0600
+
+    Fix arcball numerical precision issues.
+
+commit e519ea37e36e4c1027b1b296b28a8d2e946c9f1d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 11 23:16:09 2019 -0600
+
+    Add mobile shift; fix arcball normalization.
+
+commit 79abc5f0b321befc032d4eb7d15b75329d202b3a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 11 19:34:02 2019 -0600
+
+    Improve zoom.
+
+commit 25e234d15a8ce05874f0951952aed0122532def8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 11 11:32:34 2019 -0600
+
+    Override scroll bar.
+
+commit 86de97f2460dc8a125e18772c31e750251481b22
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 11 11:08:39 2019 -0600
+
+    Implement pinch zoom.
+
+commit a9069b5771cf62effa2b6a5f46ac30b5766eb4ca
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 11 00:20:36 2019 -0600
+
+    Fix initial projection.
+
+commit f37794e9c12fbdd588f9afa8e2400f4c4cae3acd
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 10 23:59:16 2019 -0600
+
+    Disable mobile scaling.
+
+commit 605c952986ab864f2d6ca8bea0b11fc5cd4ccb0f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 10 23:58:03 2019 -0600
+
+    Disable mobile scaling.
+
+commit 2d0ed08cb4fabff9f7b5621feb3853902865d422
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 10 11:20:46 2019 -0600
+
+    Remove scroll bar.
+
+commit a3a319b856e16a71b228090ecf24dc735cc7248e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 10 10:44:59 2019 -0600
+
+    Remove webgl directory prefix from link to gl.js; add symbolic link.
+
+commit fcc609805e810ffe8e4775cc114297c60319a1de
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 10 10:03:32 2019 -0600
+
+    Implement Bezier triangles in webgl.
+
+commit c532199499eec51b79c33a8a23d19daddceeeb93
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 10 08:42:02 2019 -0600
+
+    Fix epsilon; move derivative and normal into BezierPatch.
+
+commit fa59a4840c2dcbdb54e8188f905460a32745576d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 10 08:27:53 2019 -0600
+
+    Fix undefined variable.
+
+commit 1341bf7f83a82780b98826c83f1619794a08a027
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 10 08:25:53 2019 -0600
+
+    Factor code.
+
+commit 99b00e26147feae6aff24b94ae83a5ac99c817e7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 10 01:20:07 2019 -0600
+
+    Begin porting Bezier triangle code to webgl.
+
+commit 033ba1eb3a0aca3a46de957c89fad9c33ce8da4b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 10 00:45:52 2019 -0600
+
+    Fix lighting after mode change.
+
+commit 2a174661224adc2fbc229b786baef60924761d74
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 10 00:12:22 2019 -0600
+
+    Accumulate onscreen and partially offscreen triangles separately to avoid duplicate rendering.
+
+commit 49ea03ddbf861df3edcb3dcdae3922761cb5d785
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 9 19:40:59 2019 -0600
+
+    Clear buffers on construction.
+
+commit e3bd396ed745dae9171e44b89d2554ce67e5b0cb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 9 18:30:00 2019 -0600
+
+    Simplify code.
+
+commit 5b1b569f3fb253000e7728419d2f9f9612fdc7e8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 9 14:07:35 2019 -0600
+
+    Fix transparency bug; optimize colorShader and implement generalSHader.
+
+commit 61049a4ccd87e0aacd7498dd5c4d3c84960a7d18
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 9 11:51:27 2019 -0600
+
+    Sort transparent webgl triangles (based on centroid; to be improved).
+
+commit 0ec8f1841797c62a9a1ea83372f4fcb0880f3c00
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 9 09:34:28 2019 -0600
+
+    Fix missing initialization.
+
+commit 40ab227ba04a7e8ea1464af6864a074860e6fc3d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 9 09:22:53 2019 -0600
+
+    Add transparent buffers.
+
+commit a401de1b5d3532f6d30c133eed0f4d07a0d8b182
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 8 23:40:43 2019 -0600
+
+    Fix webgl billboard labels.
+
+commit 503ba73bb4605ba5030f3d78c71f378ce654031b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 8 23:17:56 2019 -0600
+
+    Avoid depth check in offscreen computations.
+
+commit 5c4dcb69f3908b57333ee90af3408cbe857b891a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 8 21:50:08 2019 -0600
+
+    Optimize transpose away.
+
+commit a6132b5e1d7a93c43c37d4eb2e238900bc93ff0e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 8 17:47:34 2019 -0600
+
+    Update temporary hard-wired teapot light parameters.
+
+commit f2ffc7b52ed3d4a7e375d66fc827f25973afac39
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 8 17:29:20 2019 -0600
+
+    Standardize code.
+
+commit f008f017aa1cfce1bb9bb34d91ca8857a20cea7b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 8 16:12:12 2019 -0600
+
+    Remove unwanted code.
+
+commit f8c22220b7dee93b97bca2a793df59e6e83ef664
+Merge: 4972f905 f1254f8d
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sun Sep 8 14:39:32 2019 -0600
+
+    Merge branch 'webgl' of github.com:vectorgraphics/asymptote into webgl
+
+commit 4972f90530c591c09030ae84e1f3118dff2d047d
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sun Sep 8 14:39:27 2019 -0600
+
+    Clean up gl.js again.
+
+commit f1254f8d7fa19053fc483231053d16103679a2e9
+Merge: cc7eb276 bad6b6d5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 8 14:34:04 2019 -0600
+
+    Merge branch 'webgl' of github.com:vectorgraphics/asymptote into webgl.
+
+commit cc7eb276596404eba061fee63da9440db518ad03
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 8 14:28:30 2019 -0600
+
+    Optimize bounding box computation; simplify code.
+
+commit bad6b6d57c23cddbe4fd823d6ca480997dab65c6
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sun Sep 8 14:25:09 2019 -0600
+
+    Minor fixes to norm matrix.
+
+commit 0c1da0e0dad92876e6254fec9d4625afb09c9614
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 8 02:36:18 2019 -0600
+
+    Batch calls to drawElements.
+
+commit 2106227eb55336e1189d99092258730b7583d403
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 8 01:03:59 2019 -0600
+
+    Prepare for batch drawing.
+
+commit 108509b7b304267883ac24081f8c7b8149773bab
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 7 21:11:57 2019 -0600
+
+    Fix -noautobillboard.
+
+commit a9e980f35e2955ec58891850bac3258bb7b9b880
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 7 20:47:42 2019 -0600
+
+    Fix typos.
+
+commit 7ffa52cafeed9ff412a4c8dd79f894f6c001de5d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 7 19:23:48 2019 -0600
+
+    Use separate material and center index for each vertex again (to support batch drawing and sorting).
+
+commit 17566e437c18c5cba8af049b03e064a0471006a3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 7 14:24:13 2019 -0600
+
+    Use a 3x3 rotation matrix.
+
+commit b57b6298818cb7c561258c5f8f8e8d4724b1f0b2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 7 03:52:50 2019 -0600
+
+    Simply billboard code and port to webgl.
+
+commit 9c34d1e914fc8033f0dce670db80017c40244f66
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 6 15:08:28 2019 -0600
+
+    Enable webgl keyboard input.
+
+commit 4cddee557a7ee99117398522b64d532f8e34e9fc
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 6 14:31:46 2019 -0600
+
+    Standardize code.
+
+commit 3ad3e9447237dba8d2cbd643ecec931ce1c88aef
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 6 13:05:09 2019 -0600
+
+    Fix conditional.
+
+commit b157bb70ab46e4e67060c838a7aa986c96a9a8a1
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 6 12:59:21 2019 -0600
+
+    Change shaders only when needed; remove duplicate code; improve OpenGL framerate calculation.
+
+commit 2b5a4e583a912357b95dd922a414590eae1ec421
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 6 10:57:51 2019 -0600
+
+    Remove extension requirement.
+
+commit 52e3053c3b2d9a78e54d24a456b5ac74f1f7f71b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 6 10:56:36 2019 -0600
+
+    Simplify code.
+
+commit 309bfd90f3d274d7763de078772faacd7151292a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 6 03:27:03 2019 -0600
+
+    Reduce size of webgl data buffers.
+
+commit c33716757576e0534bad2615b1a608bed98059f8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 5 10:24:18 2019 -0600
+
+    Fix material index for explicit colors; standardize code.
+
+commit 1bd14971f286c5c83e0f1732523923d3da08b37f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 5 03:02:03 2019 -0600
+
+    Simplify code.
+
+commit f40c3eda4725acecd410cac7243e84053a78d233
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 5 02:53:35 2019 -0600
+
+    Support vertex shading.
+
+commit f2e5df6d331708c01f374feef5f70f0d75999c7d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 4 18:19:47 2019 -0600
+
+    Optimize webgl buffers.
+
+commit ef1cd85d7183d8399e150fdd8d4633fa8cb7adfd
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 3 22:09:30 2019 -0600
+
+    Simplify and optimize code.
+
+commit 7b3cd7101983c837c866eaa5540f26718b797d76
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 3 18:58:12 2019 -0600
+
+    Recompute offscreen limits at every render.
+
+commit ee547cbd9facf472ea5ef6a504f7103f1aaec51b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 3 08:26:47 2019 -0600
+
+    Optimize shader communication.
+
+commit 68f921caf3a603603616f82175916eb768c2161b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 3 01:11:20 2019 -0600
+
+    Reimplement billboard labels to allow remesh suppression.
+
+commit 1e2d7c8f77dcd4dbf9cc0e3f7147ef1c492b51f6
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 3 01:02:10 2019 -0600
+
+    Fix typo.
+
+commit 7192656cca9bb3607ed5b62b7330e6a7e4e0e97e
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Sep 2 15:19:19 2019 -0600
+
+    Fix almost all problem, except for offscreen glitch.
+
+commit 173a2c40056c9a23470d2ad8e931a97251471a6e
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Sep 2 14:17:37 2019 -0600
+
+    Also reset ship.
+
+commit 1bde5bc6489562642c4eaf6e68ac92413ef4fcae
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Sep 2 14:16:54 2019 -0600
+
+    Fix zoom clipping issue alongside translation.
+
+commit fe8e538c7109073442967cb638af94279788fc86
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Sep 2 14:01:30 2019 -0600
+
+    Add in revised zoom from asy.
+
+commit 78044058c643aa5e66bed5c70b0db55a5953b919
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 1 23:50:54 2019 -0600
+
+    Simplify code.
+
+commit 144f4615291a6486fdd7c2f16026240f18216538
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 1 22:02:22 2019 -0600
+
+    Output field-of-view angle.
+
+commit 1c116f53a002b66b43b315fd2e2730dc1eed6d3e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 1 20:10:49 2019 -0600
+
+    Add missing offscreen code.
+
+commit c255024cc0a6d66dd3ce2e5279e1a65fb0b0e828
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 1 11:57:17 2019 -0600
+
+    Compute pMatrix from b and B bounds.
+
+commit faf496185b9b48688f9e68b0882f16ec01d5b806
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 1 11:36:40 2019 -0600
+
+    Fix duplicate multiply.
+
+commit eb75489e0f7d739b6f2ce707ae3ae7a9176ded19
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 1 11:35:04 2019 -0600
+
+    Port offscreen code to webgl.
+
+commit 7a2fe8d7e409f33d19f860083ee71060866d8304
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 1 03:53:55 2019 -0600
+
+    Re-enable remesh suppression with offscreen check.
+
+commit fb3e1aa648c78d0c8f3c156b8f68971049c77085
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 31 19:14:37 2019 -0600
+
+    Improve zoom.
+
+commit aa2f9e5bcdb6aaf4fc960a0448bbd04c6c174e53
+Merge: 11577411 11b7f3b4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 31 14:21:25 2019 -0600
+
+    Merge branch 'master' into webgl.
+
+commit 11b7f3b4400f6c648ad2ccabe9ab06c275fd1f3f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 31 14:21:16 2019 -0600
+
+    Fix pipeclose (cf. 0d057d35cb30d52f33db9f155c880ed8f8a1d7d2).
+
+commit 115774110bd39a7609620600999c63eb0823ffb9
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 31 13:17:52 2019 -0600
+
+    Remove unused argument.
+
+commit 389543c6b829bab8b8aa1c3f852263d41101079c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 31 12:57:29 2019 -0600
+
+    Optimize and simplify OpenGL shaders.
+
+commit 9ce5cfef9a1c6ea054b1d141d8b7d766c0b8f3cb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 31 03:13:24 2019 -0600
+
+    Port to webgl1.0.
+
+commit 26f329d066b8b291adf7b63b61301b6f69e288a0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 31 00:45:49 2019 -0600
+
+    Remove duplicate constants.
+
+commit 16a912ce5563f6436094a0f8e2bbb878cadccd9b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 31 00:39:34 2019 -0600
+
+    Support rendering on mobile devices.
+
+commit d0e14808336642f9eabc38d66d357bbf13486f4d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 30 14:38:21 2019 -0600
+
+    Fix normals.
+
+commit cbccb294ccc2f27a4d0924b3f7337c432e3b98b0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 30 14:04:45 2019 -0600
+
+    Standardize code.
+
+commit 3d4ded0b3b871a6331dd14ae3479ebb1c15ceb8f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 30 13:40:45 2019 -0600
+
+    Simplify normal code.
+
+commit b5a083516a854317e9e88e7def584a3f9a907c57
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 30 01:35:03 2019 -0600
+
+    Update normal code.
+
+commit 78e4ac384d904e09c05684da6d0eb723878f73bb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 30 01:18:09 2019 -0600
+
+    Remove unused variable.
+
+commit 699dd53413ad111d211ed2f616bab85f6162f0cc
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 30 01:16:47 2019 -0600
+
+    Update subdivision crack code.
+
+commit 9958d795eead1be55e3014fec378695682b5b202
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 30 00:05:08 2019 -0600
+
+    Support webgl output with -V -threads.
+
+commit 385c61e1b211b019641c5cd50ce54b71551f7943
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 29 21:33:58 2019 -0600
+
+    Simplify code.
+
+commit 35442f0834befc227b88c26ed7deb79e14f7628a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 29 21:12:10 2019 -0600
+
+    Fix nMaterials; remove generated file.
+
+commit 1839307bfa3cb7521293ccdd05ec1507cf7ebe53
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 29 19:47:01 2019 -0600
+
+    Revert broken commit "Add back nMaterials."
+    
+    This reverts commit ef0b19a7d1ccd37b80705c0cbaf42f8eb5470b1c.
+
+commit ef0b19a7d1ccd37b80705c0cbaf42f8eb5470b1c
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Aug 29 19:24:02 2019 -0600
+
+    Add back nMaterials.
+
+commit 71d59116a67658e8bb078c79f6f1e59fcf6e1060
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Aug 29 19:15:54 2019 -0600
+
+    Update Author's name.
+
+commit 8964dd0782bff658a3f2d475e10c3c38964ef607
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Aug 29 19:14:55 2019 -0600
+
+    Add in authors names.
+
+commit afc2a146dd755fc19adbdba7f7aa28aab5a9b45d
+Merge: 04feea56 306f6df4
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Aug 29 19:08:19 2019 -0600
+
+    Merge branch 'webgl' of github.com:vectorgraphics/asymptote into webgl
+
+commit 04feea5687b53250825e77356b5aad4961f17884
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Aug 29 19:08:14 2019 -0600
+
+    Fix vViewPosition.
+
+commit 306f6df4e77d854c9890d4a14f8679e7e16f4ebf
+Merge: 63fb75af ff8cc6d3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 29 19:07:05 2019 -0600
+
+    Merge branch 'webgl' of github.com:vectorgraphics/asymptote into webgl
+
+commit 63fb75aff713b84b005076aa50d141b2c7d88f3d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 29 19:06:55 2019 -0600
+
+    Move further parameters into BezierPatch class; fix index.
+
+commit ff8cc6d326d163de250f28a2557f61701788037c
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Aug 29 19:05:07 2019 -0600
+
+    Add in orthographic/persp view directions.
+
+commit acb3196c4d37930b0ef6d3fb2bee214222789593
+Merge: 60dd5701 ce412f94
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Aug 29 18:49:49 2019 -0600
+
+    Merge conflict.
+
+commit 60dd5701d70540245e36d6f3d39594db39f2def6
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Aug 29 18:49:15 2019 -0600
+
+    Make res per class.
+
+commit ce412f946f8b4736bcabe6bf2b462dd76bd933e2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 29 18:46:40 2019 -0600
+
+    Fix resolution.
+
+commit 80c920eb626193a2aec793c01a7fb81f405466c2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 29 17:58:12 2019 -0600
+
+    Pass resolution data to webgl.
+
+commit f494c725fb05f8245d1d3833028edb74a23cd184
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Aug 29 15:46:50 2019 -0600
+
+    Remove cpy2web.
+
+commit 3037b5620c6263a1b001c45c1bcc029f1e29ed0b
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Aug 29 15:04:23 2019 -0600
+
+    Allow for custom vertex structures.
+
+commit 88d8ea20543c476bde8d41d8c9132e03b64078c7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 29 11:06:17 2019 -0600
+
+    Support webgl output with threads.
+
+commit 5f47e4e35ddd76d7bcae651aa1ef956e200cb12f
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 23:23:29 2019 -0600
+
+    Add in blend func.
+
+commit 072db3837ccd0526f6bbc3437ec411f1a12fab5d
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 23:18:33 2019 -0600
+
+    Add in preliminary transparency.
+
+commit d1fdc0c19df823ab6bd79420b457197ffc6abcec
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 28 23:10:25 2019 -0600
+
+    Remove diagnostic.
+
+commit 51c17fc6062f43818eb0e7456bd4e52941875fba
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 28 23:03:01 2019 -0600
+
+    Add material index.
+
+commit c63b11b282a018eab64aebb87a22e96dbe1d6394
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 28 21:40:20 2019 -0600
+
+    Begin material support.
+
+commit 9a31b248de24ad18dc988ca9cbbcc536f4bc9f58
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 17:54:03 2019 -0600
+
+    FIx gitignore.
+
+commit 864ec8c2519da4a4576be291a554342a0eddd332
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 17:52:35 2019 -0600
+
+    Minor cleanups and enable emissive.
+
+commit ac2aa94fa9d59a879d84025ca74804812bcf7fa1
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 17:32:58 2019 -0600
+
+    Fix float arrays flag.
+
+commit 3de4371ce380c2185d7f483f02e2abd48abc55f1
+Merge: dc9692dd 2ad31cb3
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 17:31:23 2019 -0600
+
+    Merge branch 'webgl' of github.com:vectorgraphics/asymptote into webgl
+
+commit dc9692dde857f1e57fc097adee2041443a2b1134
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 17:31:10 2019 -0600
+
+    Only create array when needed.
+
+commit 2ad31cb325dc8106ce4dc8f711dd1864f3f1ddda
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 28 17:29:42 2019 -0600
+
+    Simplify code; remove generated file.
+
+commit 3b7616ab660d553032d4f0d35a21d0a4c47ca39d
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 17:03:15 2019 -0600
+
+    Add a DrawableObject for general drawables.
+
+commit 4c06bf02ebba1bd20d30fb00edea9afac2e1e408
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 16:59:05 2019 -0600
+
+    Even more refractoring of code.
+
+commit 3c831c65c004549b1ad50cf21aae0bb0bf658074
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 16:51:44 2019 -0600
+
+    More refractorings of gl.js.
+
+commit 00bda50add1752053360384b34a80b519060ee4b
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 16:31:59 2019 -0600
+
+    Refractor gl.js code.
+
+commit c62534e2dac23166a0905bff68a2956f64cc7600
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 15:50:45 2019 -0600
+
+    Clean up gl.js.
+
+commit f5068d75f0891a5968c98cfe53e352b4def86aef
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 15:01:52 2019 -0600
+
+    Expose model Matrix transformation and more docs.
+
+commit 3d48b756c0f593fb63e54a991ce5e4b1bd0da9ed
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 02:50:00 2019 -0600
+
+    Add in zooming back.
+
+commit 2d362a692aa7105cc7020bba15bde86508dc9006
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 28 02:20:09 2019 -0600
+
+    Reglue back translation routine.
+
+commit 53c16fcd22a2f19cbea8f07c7054d1d9519d4806
+Merge: 4c9342e9 df4b5699
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 28 01:41:15 2019 -0600
+
+    Merge branch 'master' of github.com:vectorgraphics/asymptote.
+
+commit 4c9342e9dd114f4baeb94612f7bc85755aaba0f9
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 28 01:40:03 2019 -0600
+
+    Fix last commit.
+
+commit df4b5699744d668ae4cb4367d2ab5f5cf039cc1b
+Merge: 5b876724 52d3e4d6
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 28 01:36:05 2019 -0600
+
+    Merge branch 'master' of github.com:vectorgraphics/asymptote
+
+commit 5b87672473974e5dc32c2f11b2afd81ffdc22372
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 28 01:35:54 2019 -0600
+
+    Simplify glew compilation.
+
+commit b2a6fff4e97192c5bd42b5eed689d3aa0e0c7b14
+Merge: 64d3f620 52d3e4d6
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 28 01:07:42 2019 -0600
+
+    Remove DOS line terminators.
+
+commit 52d3e4d670a8ca843302280c7b02462eb672945d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 28 01:04:23 2019 -0600
+
+    Remove spurious DOS line terminators from shader files.
+
+commit 64d3f620dc2d49924b1ac9a14cc5c520d2d43d9b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 27 22:44:54 2019 -0600
+
+    Output canvas dimensions; support threads.
+
+commit 78e5646fc84ec2609bbe22850ccb82eb568ee8d7
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Aug 27 17:32:12 2019 -0600
+
+    Add in temporary canvas height/width.
+
+commit ac8cbda3cc382a0ceb632fe3930cb5351a50468f
+Merge: 8f7b2711 97e03e6d
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Aug 27 17:27:08 2019 -0600
+
+    Merge branch 'webgl' of github.com:vectorgraphics/asymptote into webgl
+
+commit 8f7b271188a337569ed5510434cdef82c5c19503
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Aug 27 17:27:03 2019 -0600
+
+    Allow dynamic setting of canvas size.
+
+commit 97e03e6de3b7599dc4d78f28438f956c327b94aa
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 27 17:26:32 2019 -0600
+
+    Output target to webgl.
+
+commit 601ebbadadb2ef652ec4b9062443e412b7a1f314
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 27 16:52:06 2019 -0600
+
+    Fix warning message.
+
+commit bff8f83e6b6b72a977a63576e27672d4cb445b8b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 27 16:36:30 2019 -0600
+
+    Compile glew library with -O1 to help out clang compiler.
+
+commit ebe09e1b398b244c3a1163e2dea804829fe2d63f
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Aug 27 16:36:22 2019 -0600
+
+    Split jsfile into its own cc file.
+
+commit d7cfc3e099ff4b094a2b864c3f43559d7257b8ba
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 23 17:27:53 2019 -0600
+
+    Change jsfile to handle new p properly.
+
+commit 6fc0875e2ed6c3ef9108d0103615d8f1f5264ca7
+Merge: 2fe6c372 fa9cfab0
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 23 17:22:06 2019 -0600
+
+    Merge in jsfile changes.
+
+commit 2fe6c372d13a67e4da203aeeffec99c0a5725fd2
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 23 17:20:41 2019 -0600
+
+    Add multiple materials detection and shader generation.
+
+commit fa9cfab02ccda80ffae9de90f0dcd5291d1a6d14
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 23 17:16:32 2019 -0600
+
+    Add multiple patch support.
+
+commit 40aeca47850dd5dd3295abb77d8c3d5c06347624
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 23 16:10:38 2019 -0600
+
+    Add arcball rotation.
+
+commit 7325cd22c2ae15edc47dbc3685ea7bed775b1c86
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 23 14:45:42 2019 -0600
+
+    Add in material index data.
+
+commit 23846f565b4575b0ac410a9ec2d795ecb2978442
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 23 00:08:40 2019 -0600
+
+    Change resolution and minor cleanups.
+
+commit 85b3fd03061bcf3e8d0703295ec32d24a8792111
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 21 16:37:20 2019 -0600
+
+    Add webgl option to glrender.
+
+commit 9bfd0c90ef80dfcbd28422cc6348f1bf943a5cd7
+Merge: 05461c69 3d714156
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 21 16:28:09 2019 -0600
+
+    Merge branch 'webgl' of github.com:vectorgraphics/asymptote into webgl
+
+commit 05461c6965b795aec295c3d40bbdcb766b652bbf
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 21 16:27:10 2019 -0600
+
+    Update settings to prevent autoformat.
+
+commit 3d714156611362e7a919c7bdedee31eb52f51ef3
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 21 16:27:10 2019 -0600
+
+    Update .gitignore.
+
+commit 3ca5d56f78d8c559cd76f5e3b76b147e58203425
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 21 16:23:42 2019 -0600
+
+    Fix gl.js vertex function.
+
+commit 98a67e304b975c141ff16011fa9ea5eee15c671f
+Merge: 56076839 7f1fba23
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 21 15:58:08 2019 -0600
+
+    Update webgl files.
+
+commit 7f1fba235a28189d306312c09b43352e1d047932
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 21 10:47:38 2019 -0600
+
+    Generalize popcount to systems that lack 64-bit integers.
+
+commit 4500dd6b84fae216df649a32c57b70f225883fd1
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 21 02:53:55 2019 -0600
+
+    Update HOWTO-MSWindows.
+
+commit c9ee6dc1dbb22d65311639c28ceb5c7bb1391431
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 21 01:36:17 2019 -0600
+
+    Increment version to 2.54.
+
+commit 35867d43297d07045d52916bcd3d906f62f7b023
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 20 22:50:54 2019 -0600
+
+    Update example.
+
+commit 6570978b49f65c708ea8921ca5fd95a1dab0954b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 20 22:06:06 2019 -0600
+
+    Improve diagnostic about unimplemented feature.
+
+commit d741dd1701c53b6ab697b75bc280ced837611669
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 20 16:49:25 2019 -0600
+
+    Fix memory leak.
+
+commit 767b059789cd375336d6f2ad42f5c49a9b7d387e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 20 14:52:15 2019 -0600
+
+    Check for lgamma instead of gamma, in both libm and libc.
+
+commit d12068ef272111b0831187f2906fecaca1b5fa9d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 20 14:10:23 2019 -0600
+
+    Use gc_allocator_ignore_off_page.
+
+commit ea6ec5dc839626629062044ae9291f1289875aeb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 20 14:03:43 2019 -0600
+
+    Only initialize glew once.
+
+commit 437acdd38d4c73eaabf8b52f3cec77247b58fe91
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 20 12:44:19 2019 -0600
+
+    Update gc tests.
+
+commit f01f7ed4f10ee092be2208e8e3fd63f11d1cd6ce
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Aug 19 03:33:53 2019 -0600
+
+    Fix gc struct test.
+
+commit bd88b6dcd02dd442a9765195f28502ee9255490c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 15 23:22:19 2019 -0600
+
+    Disable bulky and leaky OpenImageIO library by default.
+
+commit 56076839adb43e1a0bc99aa0019a4ff4c275f86b
+Merge: 46461352 94ac15f8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 14 14:51:57 2019 -0600
+
+    Begin multiple patch support.
+
+commit d84dd8cb79c8b0b85211643427eaa6ad1dba0a99
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 14 12:15:13 2019 -0600
+
+    Add in development WebGL version.
+
+commit 4646135212088ec1c2572481c628b58f671b7ac8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 14 12:06:51 2019 -0600
+
+    Import webgl development files.
+
+commit 94ac15f88e5723e38d4e4f3231944b538d8c17ec
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 14 01:36:04 2019 -0600
+
+    Fix operator *(transform, revolution).
+
+commit fbef675f843d99f46475fbe92a01fe214a03d146
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 14 00:39:44 2019 -0600
+
+    Fix skeletons of transformed solids of revolution.
+
+commit f4ac68fd0660655a055c3bc41115e8f8a7752d8c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 13 19:29:04 2019 -0600
+
+    Fix documentation.
+
+commit c694474b38ecb4057cb6380441732a6a2bb6018d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 13 18:02:47 2019 -0600
+
+    Add border to OpenGL tiles to remove antialiasing artifacts.
+
+commit 74172faf075afc446556df90acf3966931e82679
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 13 10:24:29 2019 -0600
+
+    Remove obsolete MacOS X workaround.
+
+commit 05f68ab80e7caa521c967b32ba672fa58bcaae3c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Aug 12 00:49:22 2019 -0600
+
+    Fix DEFINE calls in configure.ac; simplify compilation under CYGWIN.
+
+commit 38280e0f75fedc2fe9e9cc1b3e5336d05bba6e56
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Aug 11 23:56:34 2019 -0600
+
+    Prioritize tr/unorderedmap over unorderedmap (for Centos 7).
+
+commit 64121726ecd13cda057699758020d7e94c289465
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Aug 11 23:08:15 2019 -0600
+
+    Handle oblique projections as orthographic projections in PRC.
+
+commit 557ff750b0043c3bce5fc998bf601211c7bcafa5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Aug 11 00:37:06 2019 -0600
+
+    Simplify code.
+
+commit 7c4367160de72d618382f5a164078a11d9d07edc
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 9 03:30:03 2019 -0600
+
+    Increment version to 2.53.
+
 commit c1db74235565570e829b865756794a0c5ab0f5fb
 Author: John Bowman <bowman at ualberta.ca>
 Date:   Fri Aug 9 02:23:28 2019 -0600
@@ -1646,6 +3291,12 @@
 
     Allow for proper buffer data transfer.
 
+commit 83c2b62df0132a310ce3d234fcc7be463b7795d6
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 31 22:11:50 2018 -0600
+
+    Begin development of webgl output.
+
 commit adbb32fdd380304839cb401c76ea2ab662edfe65
 Merge: 23c4bd2d df015058
 Author: John Bowman <bowman at ualberta.ca>

Modified: trunk/Build/source/utils/asymptote/GUI/icons_rc.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/icons_rc.py	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/GUI/icons_rc.py	2019-10-06 17:17:34 UTC (rev 52300)
@@ -9,7 +9,7 @@
 from PyQt5 import QtCore
 
 qt_resource_data = b"\
-\x00\x00\x05\x27\
+\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\
@@ -41,60 +41,17 @@
 \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\x04\xbd\
+\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\x04\x22\
 \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\
@@ -115,122 +72,85 @@
 \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\
+\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\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\
+\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\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\x03\x65\
+\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\x01\x20\
 \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\
-\x00\x00\x03\x46\
+\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\x34\x2e\x33\x34\x20\x31\x35\x2e\x36\x36\x41\
+\x37\x2e\x39\x37\x20\x37\x2e\x39\x37\x20\x30\x20\x30\x20\x30\x20\
+\x39\x20\x31\x37\x2e\x39\x34\x56\x31\x30\x48\x35\x56\x38\x68\x34\
+\x56\x35\x2e\x38\x33\x61\x33\x20\x33\x20\x30\x20\x31\x20\x31\x20\
+\x32\x20\x30\x56\x38\x68\x34\x76\x32\x68\x2d\x34\x76\x37\x2e\x39\
+\x34\x61\x37\x2e\x39\x37\x20\x37\x2e\x39\x37\x20\x30\x20\x30\x20\
+\x30\x20\x34\x2e\x36\x36\x2d\x32\x2e\x32\x38\x6c\x2d\x31\x2e\x34\
+\x32\x2d\x31\x2e\x34\x32\x68\x35\x2e\x36\x36\x6c\x2d\x32\x2e\x38\
+\x33\x20\x32\x2e\x38\x33\x61\x31\x30\x20\x31\x30\x20\x30\x20\x30\
+\x20\x31\x2d\x31\x34\x2e\x31\x34\x20\x30\x4c\x2e\x31\x20\x31\x34\
+\x2e\x32\x34\x68\x35\x2e\x36\x36\x6c\x2d\x31\x2e\x34\x32\x20\x31\
+\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\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\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\
@@ -256,63 +176,24 @@
 \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\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\x01\x20\
-\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\x34\x2e\x33\x34\x20\x31\x35\x2e\x36\x36\x41\
-\x37\x2e\x39\x37\x20\x37\x2e\x39\x37\x20\x30\x20\x30\x20\x30\x20\
-\x39\x20\x31\x37\x2e\x39\x34\x56\x31\x30\x48\x35\x56\x38\x68\x34\
-\x56\x35\x2e\x38\x33\x61\x33\x20\x33\x20\x30\x20\x31\x20\x31\x20\
-\x32\x20\x30\x56\x38\x68\x34\x76\x32\x68\x2d\x34\x76\x37\x2e\x39\
-\x34\x61\x37\x2e\x39\x37\x20\x37\x2e\x39\x37\x20\x30\x20\x30\x20\
-\x30\x20\x34\x2e\x36\x36\x2d\x32\x2e\x32\x38\x6c\x2d\x31\x2e\x34\
-\x32\x2d\x31\x2e\x34\x32\x68\x35\x2e\x36\x36\x6c\x2d\x32\x2e\x38\
-\x33\x20\x32\x2e\x38\x33\x61\x31\x30\x20\x31\x30\x20\x30\x20\x30\
-\x20\x31\x2d\x31\x34\x2e\x31\x34\x20\x30\x4c\x2e\x31\x20\x31\x34\
-\x2e\x32\x34\x68\x35\x2e\x36\x36\x6c\x2d\x31\x2e\x34\x32\x20\x31\
-\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\
+\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\x26\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
@@ -366,7 +247,7 @@
 \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\x02\x7d\
+\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\
@@ -397,18 +278,29 @@
 \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\x02\xf7\
+\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\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\
@@ -440,93 +332,23 @@
 \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\x04\x10\
+\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\x52\
 \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\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\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\
@@ -556,49 +378,32 @@
 \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\
+\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\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\
@@ -629,36 +434,24 @@
 \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\
+\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\x02\xbd\
 \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\
@@ -670,31 +463,35 @@
 \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\
+\x3d\x22\x43\x69\x72\x63\x6c\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\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\x03\xc4\
+\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\x30\x2c\x30\x2e\x34\x43\x34\x2e\x36\x39\x38\x2c\x30\
+\x2e\x34\x2c\x30\x2e\x34\x2c\x34\x2e\x36\x39\x38\x2c\x30\x2e\x34\
+\x2c\x31\x30\x43\x30\x2e\x34\x2c\x31\x35\x2e\x33\x30\x32\x2c\x34\
+\x2e\x36\x39\x38\x2c\x31\x39\x2e\x36\x2c\x31\x30\x2c\x31\x39\x2e\
+\x36\x63\x35\x2e\x33\x30\x31\x2c\x30\x2c\x39\x2e\x36\x2d\x34\x2e\
+\x32\x39\x38\x2c\x39\x2e\x36\x2d\x39\x2e\x36\x30\x31\x0d\x0a\x09\
+\x43\x31\x39\x2e\x36\x2c\x34\x2e\x36\x39\x38\x2c\x31\x35\x2e\x33\
+\x30\x31\x2c\x30\x2e\x34\x2c\x31\x30\x2c\x30\x2e\x34\x7a\x20\x4d\
+\x31\x30\x2c\x31\x37\x2e\x35\x39\x39\x63\x2d\x34\x2e\x31\x39\x37\
+\x2c\x30\x2d\x37\x2e\x36\x2d\x33\x2e\x34\x30\x32\x2d\x37\x2e\x36\
+\x2d\x37\x2e\x36\x53\x35\x2e\x38\x30\x32\x2c\x32\x2e\x34\x2c\x31\
+\x30\x2c\x32\x2e\x34\x63\x34\x2e\x31\x39\x37\x2c\x30\x2c\x37\x2e\
+\x36\x30\x31\x2c\x33\x2e\x34\x30\x32\x2c\x37\x2e\x36\x30\x31\x2c\
+\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\xb5\
 \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\
@@ -713,51 +510,50 @@
 \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\x03\x52\
+\x64\x5f\x72\x69\x67\x68\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\x2c\x31\x30\x4c\x38\x2e\x36\x39\x38\x2c\x37\x2e\x34\
+\x39\x34\x63\x2d\x30\x2e\x31\x39\x36\x2d\x30\x2e\x31\x39\x38\x2d\
+\x30\x2e\x31\x39\x36\x2d\x30\x2e\x35\x31\x39\x2c\x30\x2d\x30\x2e\
+\x37\x31\x38\x63\x30\x2e\x31\x39\x36\x2d\x30\x2e\x31\x39\x37\x2c\
+\x30\x2e\x35\x31\x35\x2d\x30\x2e\x31\x39\x37\x2c\x30\x2e\x37\x31\
+\x2c\x30\x6c\x32\x2e\x38\x30\x37\x2c\x32\x2e\x38\x36\x34\x0d\x0a\
+\x09\x63\x30\x2e\x31\x39\x36\x2c\x30\x2e\x31\x39\x39\x2c\x30\x2e\
+\x31\x39\x36\x2c\x30\x2e\x35\x32\x2c\x30\x2c\x30\x2e\x37\x31\x37\
+\x6c\x2d\x32\x2e\x38\x30\x37\x2c\x32\x2e\x38\x36\x34\x63\x2d\x30\
+\x2e\x31\x39\x35\x2c\x30\x2e\x31\x39\x39\x2d\x30\x2e\x35\x31\x34\
+\x2c\x30\x2e\x31\x39\x38\x2d\x30\x2e\x37\x31\x2c\x30\x63\x2d\x30\
+\x2e\x31\x39\x36\x2d\x30\x2e\x31\x39\x37\x2d\x30\x2e\x31\x39\x36\
+\x2d\x30\x2e\x35\x31\x38\x2c\x30\x2d\x30\x2e\x37\x31\x37\x4c\x31\
+\x31\x2c\x31\x30\x7a\x20\x4d\x31\x30\x2c\x30\x2e\x34\x0d\x0a\x09\
+\x63\x35\x2e\x33\x30\x32\x2c\x30\x2c\x39\x2e\x36\x2c\x34\x2e\x32\
+\x39\x38\x2c\x39\x2e\x36\x2c\x39\x2e\x36\x63\x30\x2c\x35\x2e\x33\
+\x30\x33\x2d\x34\x2e\x32\x39\x38\x2c\x39\x2e\x36\x2d\x39\x2e\x36\
+\x2c\x39\x2e\x36\x53\x30\x2e\x34\x2c\x31\x35\x2e\x33\x30\x33\x2c\
+\x30\x2e\x34\x2c\x31\x30\x43\x30\x2e\x34\x2c\x34\x2e\x36\x39\x38\
+\x2c\x34\x2e\x36\x39\x38\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\x34\x2e\x36\x31\x33\x2c\x30\x2c\x38\x2e\x33\x35\x34\x2d\x33\
+\x2e\x37\x34\x2c\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\
+\x30\x2d\x34\x2e\x36\x31\x34\x2d\x33\x2e\x37\x34\x31\x2d\x38\x2e\
+\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\
+\x2d\x34\x2e\x36\x31\x35\x2c\x30\x2d\x38\x2e\x33\x35\x34\x2c\x33\
+\x2e\x37\x34\x2d\x38\x2e\x33\x35\x34\x2c\x38\x2e\x33\x35\x34\x0d\
+\x0a\x09\x43\x31\x2e\x36\x34\x35\x2c\x31\x34\x2e\x36\x31\x34\x2c\
+\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\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\
@@ -784,37 +580,52 @@
 \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\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\x02\xa2\
+\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\
 \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\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\
 \x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
@@ -840,25 +651,66 @@
 \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\x02\x7d\
+\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\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\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\
@@ -890,114 +742,53 @@
 \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\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\x03\x93\
+\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\x4c\
 \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\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\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\
@@ -1024,28 +815,190 @@
 \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\
+\x22\x49\x63\x6f\x6e\x5f\x32\x31\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\
+\x35\x36\x2c\x31\x35\x32\x63\x2d\x35\x37\x2e\x32\x2c\x30\x2d\x31\
+\x30\x34\x2c\x34\x36\x2e\x38\x2d\x31\x30\x34\x2c\x31\x30\x34\x73\
+\x34\x36\x2e\x38\x2c\x31\x30\x34\x2c\x31\x30\x34\x2c\x31\x30\x34\
+\x73\x31\x30\x34\x2d\x34\x36\x2e\x38\x2c\x31\x30\x34\x2d\x31\x30\
+\x34\x53\x33\x31\x33\x2e\x32\x2c\x31\x35\x32\x2c\x32\x35\x36\x2c\
+\x31\x35\x32\x7a\x20\x4d\x32\x35\x36\x2c\x34\x38\x0d\x0a\x09\x09\
+\x09\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\x34\x0d\x0a\x09\x09\x09\x63\x2d\x39\x31\x2e\x35\x31\x38\x2c\
+\x30\x2d\x31\x36\x36\x2e\x34\x2d\x37\x34\x2e\x38\x38\x33\x2d\x31\
+\x36\x36\x2e\x34\x2d\x31\x36\x36\x2e\x34\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\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\x03\x6c\
+\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\
+\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\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\
@@ -1074,32 +1027,97 @@
 \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\
-\x0d\x0a\x09\x09\x3c\x72\x65\x63\x74\x20\x78\x3d\x22\x31\x37\x38\
-\x2e\x38\x34\x36\x22\x20\x79\x3d\x22\x39\x32\x2e\x30\x38\x37\x22\
-\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\
-\x69\x78\x28\x2d\x30\x2e\x37\x30\x37\x31\x20\x2d\x30\x2e\x37\x30\
-\x37\x31\x20\x30\x2e\x37\x30\x37\x31\x20\x2d\x30\x2e\x37\x30\x37\
-\x31\x20\x32\x32\x34\x2e\x33\x34\x37\x36\x20\x36\x33\x31\x2e\x31\
-\x34\x39\x38\x29\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x31\x32\x38\
-\x2e\x30\x38\x35\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x35\
-\x34\x2e\x30\x34\x39\x22\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\
-\x20\x64\x3d\x22\x4d\x34\x37\x31\x2e\x37\x32\x33\x2c\x38\x38\x2e\
-\x33\x39\x33\x6c\x2d\x34\x38\x2e\x31\x31\x35\x2d\x34\x38\x2e\x31\
-\x31\x34\x63\x2d\x31\x31\x2e\x37\x32\x33\x2d\x31\x31\x2e\x37\x32\
-\x34\x2d\x33\x31\x2e\x35\x35\x38\x2d\x31\x30\x2e\x38\x39\x36\x2d\
-\x34\x34\x2e\x33\x30\x34\x2c\x31\x2e\x38\x35\x6c\x2d\x34\x35\x2e\
-\x32\x30\x32\x2c\x34\x35\x2e\x32\x30\x33\x6c\x39\x30\x2e\x35\x36\
-\x39\x2c\x39\x30\x2e\x35\x36\x38\x6c\x34\x35\x2e\x32\x30\x32\x2d\
-\x34\x35\x2e\x32\x30\x32\x0d\x0a\x09\x09\x43\x34\x38\x32\x2e\x36\
-\x31\x36\x2c\x31\x31\x39\x2e\x39\x35\x32\x2c\x34\x38\x33\x2e\x34\
-\x34\x35\x2c\x31\x30\x30\x2e\x31\x31\x36\x2c\x34\x37\x31\x2e\x37\
-\x32\x33\x2c\x38\x38\x2e\x33\x39\x33\x7a\x22\x2f\x3e\x0d\x0a\x09\
-\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\
-\x22\x36\x34\x2e\x30\x32\x31\x2c\x33\x36\x33\x2e\x32\x35\x32\x20\
-\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\x7f\
+\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\x02\xb7\
 \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\
@@ -1126,164 +1144,31 @@
 \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\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\x8d\
+\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\x35\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
+\x0d\x0a\x09\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\
+\x6e\x74\x73\x3d\x22\x34\x30\x35\x2c\x31\x33\x36\x2e\x37\x39\x38\
+\x20\x33\x37\x35\x2e\x32\x30\x32\x2c\x31\x30\x37\x20\x32\x35\x36\
+\x2c\x32\x32\x36\x2e\x32\x30\x32\x20\x31\x33\x36\x2e\x37\x39\x38\
+\x2c\x31\x30\x37\x20\x31\x30\x37\x2c\x31\x33\x36\x2e\x37\x39\x38\
+\x20\x32\x32\x36\x2e\x32\x30\x32\x2c\x32\x35\x36\x20\x31\x30\x37\
+\x2c\x33\x37\x35\x2e\x32\x30\x32\x20\x31\x33\x36\x2e\x37\x39\x38\
+\x2c\x34\x30\x35\x20\x32\x35\x36\x2c\x32\x38\x35\x2e\x37\x39\x38\
+\x20\x0d\x0a\x09\x09\x09\x33\x37\x35\x2e\x32\x30\x32\x2c\x34\x30\
+\x35\x20\x34\x30\x35\x2c\x33\x37\x35\x2e\x32\x30\x32\x20\x32\x38\
+\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\x05\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\x39\x2e\x38\x31\x32\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\x43\x20\x2d\x39\x2e\x33\x32\x32\x35\x37\
-\x20\x2d\x33\x2e\x37\x37\x37\x38\x33\x20\x2d\x38\x2e\x33\x34\x33\
-\x32\x34\x20\x2d\x37\x2e\x33\x38\x34\x34\x34\x20\x2d\x36\x2e\x36\
-\x34\x30\x35\x37\x20\x2d\x31\x30\x2e\x31\x32\x39\x38\x43\x20\x2d\
-\x31\x2e\x32\x36\x32\x31\x39\x20\x2d\x31\x38\x2e\x38\x30\x31\x37\
-\x20\x37\x2e\x36\x38\x39\x37\x31\x20\x2d\x31\x35\x2e\x35\x33\x35\
-\x31\x20\x38\x2e\x36\x37\x36\x33\x32\x20\x2d\x35\x2e\x34\x38\x32\
-\x32\x43\x20\x39\x2e\x31\x38\x36\x37\x39\x20\x2d\x30\x2e\x32\x38\
-\x30\x38\x37\x37\x20\x36\x2e\x37\x34\x39\x33\x37\x20\x34\x2e\x35\
-\x31\x38\x38\x37\x20\x33\x2e\x33\x32\x30\x32\x38\x20\x35\x2e\x30\
-\x36\x34\x38\x39\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\x38\x31\x32\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\x39\x2e\
-\x38\x31\x32\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\x30\x2e\x31\x32\x39\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\x38\x31\x32\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\x35\x2e\x34\x38\x32\x32\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\x38\x31\x32\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\x35\x2e\x30\x36\x34\x38\x39\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\xb5\
-\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\x72\x69\x67\x68\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\x2c\x31\x30\x4c\x38\x2e\x36\x39\x38\x2c\x37\x2e\x34\
-\x39\x34\x63\x2d\x30\x2e\x31\x39\x36\x2d\x30\x2e\x31\x39\x38\x2d\
-\x30\x2e\x31\x39\x36\x2d\x30\x2e\x35\x31\x39\x2c\x30\x2d\x30\x2e\
-\x37\x31\x38\x63\x30\x2e\x31\x39\x36\x2d\x30\x2e\x31\x39\x37\x2c\
-\x30\x2e\x35\x31\x35\x2d\x30\x2e\x31\x39\x37\x2c\x30\x2e\x37\x31\
-\x2c\x30\x6c\x32\x2e\x38\x30\x37\x2c\x32\x2e\x38\x36\x34\x0d\x0a\
-\x09\x63\x30\x2e\x31\x39\x36\x2c\x30\x2e\x31\x39\x39\x2c\x30\x2e\
-\x31\x39\x36\x2c\x30\x2e\x35\x32\x2c\x30\x2c\x30\x2e\x37\x31\x37\
-\x6c\x2d\x32\x2e\x38\x30\x37\x2c\x32\x2e\x38\x36\x34\x63\x2d\x30\
-\x2e\x31\x39\x35\x2c\x30\x2e\x31\x39\x39\x2d\x30\x2e\x35\x31\x34\
-\x2c\x30\x2e\x31\x39\x38\x2d\x30\x2e\x37\x31\x2c\x30\x63\x2d\x30\
-\x2e\x31\x39\x36\x2d\x30\x2e\x31\x39\x37\x2d\x30\x2e\x31\x39\x36\
-\x2d\x30\x2e\x35\x31\x38\x2c\x30\x2d\x30\x2e\x37\x31\x37\x4c\x31\
-\x31\x2c\x31\x30\x7a\x20\x4d\x31\x30\x2c\x30\x2e\x34\x0d\x0a\x09\
-\x63\x35\x2e\x33\x30\x32\x2c\x30\x2c\x39\x2e\x36\x2c\x34\x2e\x32\
-\x39\x38\x2c\x39\x2e\x36\x2c\x39\x2e\x36\x63\x30\x2c\x35\x2e\x33\
-\x30\x33\x2d\x34\x2e\x32\x39\x38\x2c\x39\x2e\x36\x2d\x39\x2e\x36\
-\x2c\x39\x2e\x36\x53\x30\x2e\x34\x2c\x31\x35\x2e\x33\x30\x33\x2c\
-\x30\x2e\x34\x2c\x31\x30\x43\x30\x2e\x34\x2c\x34\x2e\x36\x39\x38\
-\x2c\x34\x2e\x36\x39\x38\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\x34\x2e\x36\x31\x33\x2c\x30\x2c\x38\x2e\x33\x35\x34\x2d\x33\
-\x2e\x37\x34\x2c\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\
-\x30\x2d\x34\x2e\x36\x31\x34\x2d\x33\x2e\x37\x34\x31\x2d\x38\x2e\
-\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\
-\x2d\x34\x2e\x36\x31\x35\x2c\x30\x2d\x38\x2e\x33\x35\x34\x2c\x33\
-\x2e\x37\x34\x2d\x38\x2e\x33\x35\x34\x2c\x38\x2e\x33\x35\x34\x0d\
-\x0a\x09\x43\x31\x2e\x36\x34\x35\x2c\x31\x34\x2e\x36\x31\x34\x2c\
-\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\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\
-\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\
@@ -1305,44 +1190,74 @@
 \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\
+\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\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\x30\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
@@ -1412,8 +1327,75 @@
 \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\x22\
+\x00\x00\x04\x10\
 \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\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\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\
@@ -1443,30 +1425,84 @@
 \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\x07\x80\
+\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\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\
+\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\
+\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\
@@ -1496,97 +1532,253 @@
 \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\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\
+\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\
+\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\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\
+\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\
+\x00\x00\x04\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\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\x6f\x64\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\
+\x35\x2e\x37\x31\x39\x2c\x31\x34\x2e\x37\x35\x63\x2d\x30\x2e\x32\
+\x33\x36\x2c\x30\x2d\x30\x2e\x34\x37\x34\x2d\x30\x2e\x30\x38\x33\
+\x2d\x30\x2e\x36\x36\x34\x2d\x30\x2e\x32\x35\x32\x4c\x2d\x30\x2e\
+\x30\x30\x35\x2c\x31\x30\x6c\x35\x2e\x33\x34\x31\x2d\x34\x2e\x37\
+\x34\x38\x43\x35\x2e\x37\x34\x38\x2c\x34\x2e\x38\x38\x37\x2c\x36\
+\x2e\x33\x38\x2c\x34\x2e\x39\x32\x32\x2c\x36\x2e\x37\x34\x37\x2c\
+\x35\x2e\x33\x33\x35\x0d\x0a\x09\x63\x30\x2e\x33\x36\x37\x2c\x30\
+\x2e\x34\x31\x33\x2c\x30\x2e\x33\x33\x2c\x31\x2e\x30\x34\x35\x2d\
+\x30\x2e\x30\x38\x33\x2c\x31\x2e\x34\x31\x32\x4c\x33\x2e\x30\x30\
+\x35\x2c\x31\x30\x6c\x33\x2e\x33\x37\x38\x2c\x33\x2e\x30\x30\x32\
+\x63\x30\x2e\x34\x31\x33\x2c\x30\x2e\x33\x36\x37\x2c\x30\x2e\x34\
+\x35\x2c\x30\x2e\x39\x39\x39\x2c\x30\x2e\x30\x38\x33\x2c\x31\x2e\
+\x34\x31\x32\x0d\x0a\x09\x43\x36\x2e\x32\x36\x39\x2c\x31\x34\x2e\
+\x36\x33\x37\x2c\x35\x2e\x39\x39\x34\x2c\x31\x34\x2e\x37\x35\x2c\
+\x35\x2e\x37\x31\x39\x2c\x31\x34\x2e\x37\x35\x7a\x20\x4d\x31\x34\
+\x2e\x36\x36\x34\x2c\x31\x34\x2e\x37\x34\x38\x4c\x32\x30\x2e\x30\
+\x30\x35\x2c\x31\x30\x6c\x2d\x35\x2e\x30\x36\x2d\x34\x2e\x34\x39\
+\x38\x63\x2d\x30\x2e\x34\x31\x33\x2d\x30\x2e\x33\x36\x37\x2d\x31\
+\x2e\x30\x34\x35\x2d\x30\x2e\x33\x33\x2d\x31\x2e\x34\x31\x31\x2c\
+\x30\x2e\x30\x38\x33\x0d\x0a\x09\x63\x2d\x30\x2e\x33\x36\x37\x2c\
+\x30\x2e\x34\x31\x33\x2d\x30\x2e\x33\x33\x2c\x31\x2e\x30\x34\x35\
+\x2c\x30\x2e\x30\x38\x33\x2c\x31\x2e\x34\x31\x32\x4c\x31\x36\x2e\
+\x39\x39\x35\x2c\x31\x30\x6c\x2d\x33\x2e\x36\x35\x39\x2c\x33\x2e\
+\x32\x35\x32\x63\x2d\x30\x2e\x34\x31\x33\x2c\x30\x2e\x33\x36\x37\
+\x2d\x30\x2e\x34\x35\x2c\x30\x2e\x39\x39\x39\x2d\x30\x2e\x30\x38\
+\x33\x2c\x31\x2e\x34\x31\x32\x43\x31\x33\x2e\x34\x35\x2c\x31\x34\
+\x2e\x38\x38\x37\x2c\x31\x33\x2e\x37\x32\x35\x2c\x31\x35\x2c\x31\
+\x34\x2c\x31\x35\x0d\x0a\x09\x43\x31\x34\x2e\x32\x33\x36\x2c\x31\
+\x35\x2c\x31\x34\x2e\x34\x37\x34\x2c\x31\x34\x2e\x39\x31\x37\x2c\
+\x31\x34\x2e\x36\x36\x34\x2c\x31\x34\x2e\x37\x34\x38\x7a\x20\x4d\
+\x39\x2e\x39\x38\x36\x2c\x31\x36\x2e\x31\x36\x35\x6c\x32\x2d\x31\
+\x32\x63\x30\x2e\x30\x39\x31\x2d\x30\x2e\x35\x34\x35\x2d\x30\x2e\
+\x32\x37\x37\x2d\x31\x2e\x30\x36\x2d\x30\x2e\x38\x32\x32\x2d\x31\
+\x2e\x31\x35\x31\x0d\x0a\x09\x63\x2d\x30\x2e\x35\x34\x37\x2d\x30\
+\x2e\x30\x39\x32\x2d\x31\x2e\x30\x36\x31\x2c\x30\x2e\x32\x37\x37\
+\x2d\x31\x2e\x31\x35\x2c\x30\x2e\x38\x32\x32\x6c\x2d\x32\x2c\x31\
+\x32\x63\x2d\x30\x2e\x30\x39\x31\x2c\x30\x2e\x35\x34\x35\x2c\x30\
+\x2e\x32\x37\x37\x2c\x31\x2e\x30\x36\x2c\x30\x2e\x38\x32\x32\x2c\
+\x31\x2e\x31\x35\x31\x43\x38\x2e\x38\x39\x32\x2c\x31\x36\x2e\x39\
+\x39\x36\x2c\x38\x2e\x39\x34\x36\x2c\x31\x37\x2c\x39\x2e\x30\x30\
+\x31\x2c\x31\x37\x0d\x0a\x09\x43\x39\x2e\x34\x38\x31\x2c\x31\x37\
+\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\x05\xb7\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
@@ -1681,107 +1873,12 @@
 \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\x05\xca\
+\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\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\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\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\
@@ -1794,30 +1891,52 @@
 \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\
+\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\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\
+\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\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\x02\xc9\
+\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\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\
@@ -1844,149 +1963,27 @@
 \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\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\x03\x4c\
-\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\x31\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\x31\x35\x32\x63\x2d\x35\x37\x2e\x32\x2c\x30\x2d\x31\
-\x30\x34\x2c\x34\x36\x2e\x38\x2d\x31\x30\x34\x2c\x31\x30\x34\x73\
-\x34\x36\x2e\x38\x2c\x31\x30\x34\x2c\x31\x30\x34\x2c\x31\x30\x34\
-\x73\x31\x30\x34\x2d\x34\x36\x2e\x38\x2c\x31\x30\x34\x2d\x31\x30\
-\x34\x53\x33\x31\x33\x2e\x32\x2c\x31\x35\x32\x2c\x32\x35\x36\x2c\
-\x31\x35\x32\x7a\x20\x4d\x32\x35\x36\x2c\x34\x38\x0d\x0a\x09\x09\
-\x09\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\x34\x0d\x0a\x09\x09\x09\x63\x2d\x39\x31\x2e\x35\x31\x38\x2c\
-\x30\x2d\x31\x36\x36\x2e\x34\x2d\x37\x34\x2e\x38\x38\x33\x2d\x31\
-\x36\x36\x2e\x34\x2d\x31\x36\x36\x2e\x34\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\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\x02\xbd\
+\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\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\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\x69\x72\x63\x6c\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\x30\x2c\x30\x2e\x34\x43\x34\x2e\x36\x39\x38\x2c\x30\
-\x2e\x34\x2c\x30\x2e\x34\x2c\x34\x2e\x36\x39\x38\x2c\x30\x2e\x34\
-\x2c\x31\x30\x43\x30\x2e\x34\x2c\x31\x35\x2e\x33\x30\x32\x2c\x34\
-\x2e\x36\x39\x38\x2c\x31\x39\x2e\x36\x2c\x31\x30\x2c\x31\x39\x2e\
-\x36\x63\x35\x2e\x33\x30\x31\x2c\x30\x2c\x39\x2e\x36\x2d\x34\x2e\
-\x32\x39\x38\x2c\x39\x2e\x36\x2d\x39\x2e\x36\x30\x31\x0d\x0a\x09\
-\x43\x31\x39\x2e\x36\x2c\x34\x2e\x36\x39\x38\x2c\x31\x35\x2e\x33\
-\x30\x31\x2c\x30\x2e\x34\x2c\x31\x30\x2c\x30\x2e\x34\x7a\x20\x4d\
-\x31\x30\x2c\x31\x37\x2e\x35\x39\x39\x63\x2d\x34\x2e\x31\x39\x37\
-\x2c\x30\x2d\x37\x2e\x36\x2d\x33\x2e\x34\x30\x32\x2d\x37\x2e\x36\
-\x2d\x37\x2e\x36\x53\x35\x2e\x38\x30\x32\x2c\x32\x2e\x34\x2c\x31\
-\x30\x2c\x32\x2e\x34\x63\x34\x2e\x31\x39\x37\x2c\x30\x2c\x37\x2e\
-\x36\x30\x31\x2c\x33\x2e\x34\x30\x32\x2c\x37\x2e\x36\x30\x31\x2c\
-\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\x02\xb7\
-\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\
@@ -2012,21 +2009,64 @@
 \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\x35\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
-\x0d\x0a\x09\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\
-\x6e\x74\x73\x3d\x22\x34\x30\x35\x2c\x31\x33\x36\x2e\x37\x39\x38\
-\x20\x33\x37\x35\x2e\x32\x30\x32\x2c\x31\x30\x37\x20\x32\x35\x36\
-\x2c\x32\x32\x36\x2e\x32\x30\x32\x20\x31\x33\x36\x2e\x37\x39\x38\
-\x2c\x31\x30\x37\x20\x31\x30\x37\x2c\x31\x33\x36\x2e\x37\x39\x38\
-\x20\x32\x32\x36\x2e\x32\x30\x32\x2c\x32\x35\x36\x20\x31\x30\x37\
-\x2c\x33\x37\x35\x2e\x32\x30\x32\x20\x31\x33\x36\x2e\x37\x39\x38\
-\x2c\x34\x30\x35\x20\x32\x35\x36\x2c\x32\x38\x35\x2e\x37\x39\x38\
-\x20\x0d\x0a\x09\x09\x09\x33\x37\x35\x2e\x32\x30\x32\x2c\x34\x30\
-\x35\x20\x34\x30\x35\x2c\x33\x37\x35\x2e\x32\x30\x32\x20\x32\x38\
-\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\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
+\x0d\x0a\x09\x09\x3c\x72\x65\x63\x74\x20\x78\x3d\x22\x31\x37\x38\
+\x2e\x38\x34\x36\x22\x20\x79\x3d\x22\x39\x32\x2e\x30\x38\x37\x22\
+\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\
+\x69\x78\x28\x2d\x30\x2e\x37\x30\x37\x31\x20\x2d\x30\x2e\x37\x30\
+\x37\x31\x20\x30\x2e\x37\x30\x37\x31\x20\x2d\x30\x2e\x37\x30\x37\
+\x31\x20\x32\x32\x34\x2e\x33\x34\x37\x36\x20\x36\x33\x31\x2e\x31\
+\x34\x39\x38\x29\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x31\x32\x38\
+\x2e\x30\x38\x35\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x35\
+\x34\x2e\x30\x34\x39\x22\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\
+\x20\x64\x3d\x22\x4d\x34\x37\x31\x2e\x37\x32\x33\x2c\x38\x38\x2e\
+\x33\x39\x33\x6c\x2d\x34\x38\x2e\x31\x31\x35\x2d\x34\x38\x2e\x31\
+\x31\x34\x63\x2d\x31\x31\x2e\x37\x32\x33\x2d\x31\x31\x2e\x37\x32\
+\x34\x2d\x33\x31\x2e\x35\x35\x38\x2d\x31\x30\x2e\x38\x39\x36\x2d\
+\x34\x34\x2e\x33\x30\x34\x2c\x31\x2e\x38\x35\x6c\x2d\x34\x35\x2e\
+\x32\x30\x32\x2c\x34\x35\x2e\x32\x30\x33\x6c\x39\x30\x2e\x35\x36\
+\x39\x2c\x39\x30\x2e\x35\x36\x38\x6c\x34\x35\x2e\x32\x30\x32\x2d\
+\x34\x35\x2e\x32\x30\x32\x0d\x0a\x09\x09\x43\x34\x38\x32\x2e\x36\
+\x31\x36\x2c\x31\x31\x39\x2e\x39\x35\x32\x2c\x34\x38\x33\x2e\x34\
+\x34\x35\x2c\x31\x30\x30\x2e\x31\x31\x36\x2c\x34\x37\x31\x2e\x37\
+\x32\x33\x2c\x38\x38\x2e\x33\x39\x33\x7a\x22\x2f\x3e\x0d\x0a\x09\
+\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\
+\x22\x36\x34\x2e\x30\x32\x31\x2c\x33\x36\x33\x2e\x32\x35\x32\x20\
+\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\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\x03\x0c\
 \x3c\
 \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
@@ -2078,197 +2118,73 @@
 \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\x04\x22\
+\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\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\
+\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\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\
+\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\
-\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\xca\
+\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\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\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\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\
-\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\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\
@@ -2280,7 +2196,7 @@
 \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\x6f\x64\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\
+\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\
@@ -2292,50 +2208,134 @@
 \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\
-\x35\x2e\x37\x31\x39\x2c\x31\x34\x2e\x37\x35\x63\x2d\x30\x2e\x32\
-\x33\x36\x2c\x30\x2d\x30\x2e\x34\x37\x34\x2d\x30\x2e\x30\x38\x33\
-\x2d\x30\x2e\x36\x36\x34\x2d\x30\x2e\x32\x35\x32\x4c\x2d\x30\x2e\
-\x30\x30\x35\x2c\x31\x30\x6c\x35\x2e\x33\x34\x31\x2d\x34\x2e\x37\
-\x34\x38\x43\x35\x2e\x37\x34\x38\x2c\x34\x2e\x38\x38\x37\x2c\x36\
-\x2e\x33\x38\x2c\x34\x2e\x39\x32\x32\x2c\x36\x2e\x37\x34\x37\x2c\
-\x35\x2e\x33\x33\x35\x0d\x0a\x09\x63\x30\x2e\x33\x36\x37\x2c\x30\
-\x2e\x34\x31\x33\x2c\x30\x2e\x33\x33\x2c\x31\x2e\x30\x34\x35\x2d\
-\x30\x2e\x30\x38\x33\x2c\x31\x2e\x34\x31\x32\x4c\x33\x2e\x30\x30\
-\x35\x2c\x31\x30\x6c\x33\x2e\x33\x37\x38\x2c\x33\x2e\x30\x30\x32\
-\x63\x30\x2e\x34\x31\x33\x2c\x30\x2e\x33\x36\x37\x2c\x30\x2e\x34\
-\x35\x2c\x30\x2e\x39\x39\x39\x2c\x30\x2e\x30\x38\x33\x2c\x31\x2e\
-\x34\x31\x32\x0d\x0a\x09\x43\x36\x2e\x32\x36\x39\x2c\x31\x34\x2e\
-\x36\x33\x37\x2c\x35\x2e\x39\x39\x34\x2c\x31\x34\x2e\x37\x35\x2c\
-\x35\x2e\x37\x31\x39\x2c\x31\x34\x2e\x37\x35\x7a\x20\x4d\x31\x34\
-\x2e\x36\x36\x34\x2c\x31\x34\x2e\x37\x34\x38\x4c\x32\x30\x2e\x30\
-\x30\x35\x2c\x31\x30\x6c\x2d\x35\x2e\x30\x36\x2d\x34\x2e\x34\x39\
-\x38\x63\x2d\x30\x2e\x34\x31\x33\x2d\x30\x2e\x33\x36\x37\x2d\x31\
-\x2e\x30\x34\x35\x2d\x30\x2e\x33\x33\x2d\x31\x2e\x34\x31\x31\x2c\
-\x30\x2e\x30\x38\x33\x0d\x0a\x09\x63\x2d\x30\x2e\x33\x36\x37\x2c\
-\x30\x2e\x34\x31\x33\x2d\x30\x2e\x33\x33\x2c\x31\x2e\x30\x34\x35\
-\x2c\x30\x2e\x30\x38\x33\x2c\x31\x2e\x34\x31\x32\x4c\x31\x36\x2e\
-\x39\x39\x35\x2c\x31\x30\x6c\x2d\x33\x2e\x36\x35\x39\x2c\x33\x2e\
-\x32\x35\x32\x63\x2d\x30\x2e\x34\x31\x33\x2c\x30\x2e\x33\x36\x37\
-\x2d\x30\x2e\x34\x35\x2c\x30\x2e\x39\x39\x39\x2d\x30\x2e\x30\x38\
-\x33\x2c\x31\x2e\x34\x31\x32\x43\x31\x33\x2e\x34\x35\x2c\x31\x34\
-\x2e\x38\x38\x37\x2c\x31\x33\x2e\x37\x32\x35\x2c\x31\x35\x2c\x31\
-\x34\x2c\x31\x35\x0d\x0a\x09\x43\x31\x34\x2e\x32\x33\x36\x2c\x31\
-\x35\x2c\x31\x34\x2e\x34\x37\x34\x2c\x31\x34\x2e\x39\x31\x37\x2c\
-\x31\x34\x2e\x36\x36\x34\x2c\x31\x34\x2e\x37\x34\x38\x7a\x20\x4d\
-\x39\x2e\x39\x38\x36\x2c\x31\x36\x2e\x31\x36\x35\x6c\x32\x2d\x31\
-\x32\x63\x30\x2e\x30\x39\x31\x2d\x30\x2e\x35\x34\x35\x2d\x30\x2e\
-\x32\x37\x37\x2d\x31\x2e\x30\x36\x2d\x30\x2e\x38\x32\x32\x2d\x31\
-\x2e\x31\x35\x31\x0d\x0a\x09\x63\x2d\x30\x2e\x35\x34\x37\x2d\x30\
-\x2e\x30\x39\x32\x2d\x31\x2e\x30\x36\x31\x2c\x30\x2e\x32\x37\x37\
-\x2d\x31\x2e\x31\x35\x2c\x30\x2e\x38\x32\x32\x6c\x2d\x32\x2c\x31\
-\x32\x63\x2d\x30\x2e\x30\x39\x31\x2c\x30\x2e\x35\x34\x35\x2c\x30\
-\x2e\x32\x37\x37\x2c\x31\x2e\x30\x36\x2c\x30\x2e\x38\x32\x32\x2c\
-\x31\x2e\x31\x35\x31\x43\x38\x2e\x38\x39\x32\x2c\x31\x36\x2e\x39\
-\x39\x36\x2c\x38\x2e\x39\x34\x36\x2c\x31\x37\x2c\x39\x2e\x30\x30\
-\x31\x2c\x31\x37\x0d\x0a\x09\x43\x39\x2e\x34\x38\x31\x2c\x31\x37\
-\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\
+\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\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\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\x8d\
+\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\x38\x31\x32\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\x43\x20\x2d\x39\x2e\x33\x32\x32\x35\x37\
+\x20\x2d\x33\x2e\x37\x37\x37\x38\x33\x20\x2d\x38\x2e\x33\x34\x33\
+\x32\x34\x20\x2d\x37\x2e\x33\x38\x34\x34\x34\x20\x2d\x36\x2e\x36\
+\x34\x30\x35\x37\x20\x2d\x31\x30\x2e\x31\x32\x39\x38\x43\x20\x2d\
+\x31\x2e\x32\x36\x32\x31\x39\x20\x2d\x31\x38\x2e\x38\x30\x31\x37\
+\x20\x37\x2e\x36\x38\x39\x37\x31\x20\x2d\x31\x35\x2e\x35\x33\x35\
+\x31\x20\x38\x2e\x36\x37\x36\x33\x32\x20\x2d\x35\x2e\x34\x38\x32\
+\x32\x43\x20\x39\x2e\x31\x38\x36\x37\x39\x20\x2d\x30\x2e\x32\x38\
+\x30\x38\x37\x37\x20\x36\x2e\x37\x34\x39\x33\x37\x20\x34\x2e\x35\
+\x31\x38\x38\x37\x20\x33\x2e\x33\x32\x30\x32\x38\x20\x35\x2e\x30\
+\x36\x34\x38\x39\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\x38\x31\x32\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\x39\x2e\
+\x38\x31\x32\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\x30\x2e\x31\x32\x39\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\x38\x31\x32\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\x35\x2e\x34\x38\x32\x32\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\x38\x31\x32\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\x35\x2e\x30\x36\x34\x38\x39\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\
 "
 
 qt_resource_name = b"\
@@ -2343,79 +2343,155 @@
 \x00\x6f\xa6\x53\
 \x00\x69\
 \x00\x63\x00\x6f\x00\x6e\x00\x73\
-\x00\x19\
-\x0f\xef\x7b\xe7\
+\x00\x10\
+\x08\xe4\xaf\x47\
 \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\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\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\
+\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\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\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\
+\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\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\x0a\
-\x0f\x68\x53\xe7\
+\x00\x12\
+\x08\x55\xef\xc7\
 \x00\x61\
-\x00\x6e\x00\x63\x00\x68\x00\x6f\x00\x72\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\x65\x00\x6c\x00\x65\x00\x74\x00\x65\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\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\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\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\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\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\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\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\x74\
+\x00\x65\x00\x78\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\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\
+\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\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\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\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\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\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\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\x10\
+\x06\xe3\xaf\xe7\
+\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\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\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\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\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\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\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\x10\
-\x08\xe4\xaf\x47\
-\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\x07\
+\x0c\xf8\x5a\x07\
+\x00\x65\
+\x00\x79\x00\x65\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\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\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\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\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\x16\
 \x01\xfb\x76\x27\
 \x00\x61\
@@ -2422,23 +2498,26 @@
 \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\x08\
+\x0b\x07\x57\xa7\
+\x00\x65\
+\x00\x64\x00\x69\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\x09\
+\x0b\x9e\x89\x07\
+\x00\x63\
+\x00\x68\x00\x65\x00\x63\x00\x6b\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\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\x08\
-\x0b\x07\x57\xa7\
-\x00\x65\
-\x00\x64\x00\x69\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x08\xc8\x55\xe7\
+\x00\x73\
+\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
 \x00\x10\
 \x0c\x57\x65\x47\
 \x00\x61\
@@ -2447,131 +2526,52 @@
 \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\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\x07\
-\x0c\xf8\x5a\x07\
-\x00\x65\
-\x00\x79\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\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\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\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\x10\
-\x06\xe3\xaf\xe7\
-\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\x08\
-\x08\xc8\x55\xe7\
-\x00\x73\
-\x00\x61\x00\x76\x00\x65\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\x08\
-\x0c\xf7\x55\x87\
-\x00\x74\
-\x00\x65\x00\x78\x00\x74\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\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\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\x09\
-\x0b\x9e\x89\x07\
-\x00\x63\
-\x00\x68\x00\x65\x00\x63\x00\x6b\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\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\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\
 "
 
 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\x04\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x57\x4f\
-\x00\x00\x04\x94\x00\x00\x00\x00\x00\x01\x00\x00\x5e\xd3\
-\x00\x00\x02\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x32\xd0\
-\x00\x00\x00\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x12\x33\
-\x00\x00\x02\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x29\x0c\
-\x00\x00\x06\x10\x00\x01\x00\x00\x00\x01\x00\x00\x85\x4a\
-\x00\x00\x01\xca\x00\x00\x00\x00\x00\x01\x00\x00\x23\x55\
-\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x05\x2b\
-\x00\x00\x03\xa6\x00\x00\x00\x00\x00\x01\x00\x00\x43\xbc\
-\x00\x00\x06\x36\x00\x00\x00\x00\x00\x01\x00\x00\x87\x6e\
-\x00\x00\x04\xea\x00\x00\x00\x00\x00\x01\x00\x00\x6c\xcc\
-\x00\x00\x05\xdc\x00\x00\x00\x00\x00\x01\x00\x00\x80\x7c\
-\x00\x00\x04\xae\x00\x00\x00\x00\x00\x01\x00\x00\x64\x8e\
-\x00\x00\x03\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x48\x4d\
-\x00\x00\x05\xb8\x00\x00\x00\x00\x00\x01\x00\x00\x7c\x56\
-\x00\x00\x02\x58\x00\x00\x00\x00\x00\x01\x00\x00\x2c\xd4\
-\x00\x00\x02\x8c\x00\x00\x00\x00\x00\x01\x00\x00\x30\x2a\
-\x00\x00\x04\x42\x00\x00\x00\x00\x00\x01\x00\x00\x54\x29\
-\x00\x00\x01\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x1a\xd9\
-\x00\x00\x03\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x3a\xc9\
-\x00\x00\x04\xd4\x00\x00\x00\x00\x00\x01\x00\x00\x6a\x5c\
-\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x26\x8f\
-\x00\x00\x02\xe8\x00\x01\x00\x00\x00\x01\x00\x00\x35\x51\
-\x00\x00\x00\x86\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x55\
-\x00\x00\x05\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x73\xca\
-\x00\x00\x01\x20\x00\x00\x00\x00\x00\x01\x00\x00\x15\x5d\
-\x00\x00\x00\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x09\xec\
-\x00\x00\x03\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x3d\xc9\
-\x00\x00\x05\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x79\x46\
-\x00\x00\x03\x80\x00\x00\x00\x00\x00\x01\x00\x00\x41\x39\
-\x00\x00\x01\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x1e\xed\
-\x00\x00\x04\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x4f\xf5\
-\x00\x00\x05\x78\x00\x00\x00\x00\x00\x01\x00\x00\x76\x8b\
-\x00\x00\x05\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x6f\x99\
-\x00\x00\x04\x06\x00\x00\x00\x00\x00\x01\x00\x00\x4c\x06\
-\x00\x00\x05\x22\x00\x00\x00\x00\x00\x01\x00\x00\x70\x7a\
-\x00\x00\x00\xda\x00\x00\x00\x00\x00\x01\x00\x00\x11\x0f\
-\x00\x00\x02\xfe\x00\x00\x00\x00\x00\x01\x00\x00\x37\x32\
-\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x10\x9f\
-\x00\x00\x01\x58\x00\x00\x00\x00\x00\x01\x00\x00\x17\xde\
+\x00\x00\x03\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x3a\xdc\
+\x00\x00\x04\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x6a\x6b\
+\x00\x00\x05\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x73\xee\
+\x00\x00\x00\xce\x00\x00\x00\x00\x00\x01\x00\x00\x0a\xdd\
+\x00\x00\x05\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x70\x26\
+\x00\x00\x02\x68\x00\x01\x00\x00\x00\x01\x00\x00\x27\x71\
+\x00\x00\x04\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x5e\xc5\
+\x00\x00\x03\x28\x00\x00\x00\x00\x00\x01\x00\x00\x36\x1b\
+\x00\x00\x06\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x87\x5a\
+\x00\x00\x04\xde\x00\x00\x00\x00\x00\x01\x00\x00\x65\xee\
+\x00\x00\x01\x24\x00\x00\x00\x00\x00\x01\x00\x00\x11\x2d\
+\x00\x00\x02\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x31\x4d\
+\x00\x00\x03\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x45\x1b\
+\x00\x00\x01\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x1c\x92\
+\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x02\x7d\
+\x00\x00\x01\x46\x00\x00\x00\x00\x00\x01\x00\x00\x13\xfa\
+\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x01\x00\x00\x08\x37\
+\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x01\x00\x00\x0e\x07\
+\x00\x00\x03\xea\x00\x00\x00\x00\x00\x01\x00\x00\x4f\x1d\
+\x00\x00\x04\x10\x00\x00\x00\x00\x00\x01\x00\x00\x53\x31\
+\x00\x00\x05\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x82\x67\
 \x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x05\x94\x00\x01\x00\x00\x00\x01\x00\x00\x79\xdf\
+\x00\x00\x02\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x20\x4b\
+\x00\x00\x01\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x19\xd1\
+\x00\x00\x01\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x17\x50\
+\x00\x00\x04\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x56\x31\
+\x00\x00\x05\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x76\x6f\
+\x00\x00\x05\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x7b\xc0\
+\x00\x00\x06\x06\x00\x00\x00\x00\x00\x01\x00\x00\x84\xd7\
+\x00\x00\x02\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x29\x95\
+\x00\x00\x03\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x4a\xe9\
+\x00\x00\x03\x74\x00\x00\x00\x00\x00\x01\x00\x00\x42\x60\
+\x00\x00\x02\x30\x00\x00\x00\x00\x00\x01\x00\x00\x23\x95\
+\x00\x00\x04\xca\x00\x00\x00\x00\x00\x01\x00\x00\x61\xff\
+\x00\x00\x02\xb8\x00\x00\x00\x00\x00\x01\x00\x00\x2d\xfd\
+\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x06\xa3\
+\x00\x00\x05\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x7e\xd0\
+\x00\x00\x00\x74\x00\x00\x00\x00\x00\x01\x00\x00\x07\xc7\
+\x00\x00\x02\x46\x00\x00\x00\x00\x00\x01\x00\x00\x24\x76\
+\x00\x00\x04\x68\x00\x00\x00\x00\x00\x01\x00\x00\x59\x9a\
 "
 
 qt_resource_struct_v2 = b"\
@@ -2579,88 +2579,88 @@
 \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\x04\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x57\x4f\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x04\x94\x00\x00\x00\x00\x00\x01\x00\x00\x5e\xd3\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x02\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x32\xd0\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x00\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x12\x33\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x02\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x29\x0c\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x06\x10\x00\x01\x00\x00\x00\x01\x00\x00\x85\x4a\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x01\xca\x00\x00\x00\x00\x00\x01\x00\x00\x23\x55\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x05\x2b\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x03\xa6\x00\x00\x00\x00\x00\x01\x00\x00\x43\xbc\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x06\x36\x00\x00\x00\x00\x00\x01\x00\x00\x87\x6e\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x04\xea\x00\x00\x00\x00\x00\x01\x00\x00\x6c\xcc\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x05\xdc\x00\x00\x00\x00\x00\x01\x00\x00\x80\x7c\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x04\xae\x00\x00\x00\x00\x00\x01\x00\x00\x64\x8e\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x03\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x48\x4d\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x05\xb8\x00\x00\x00\x00\x00\x01\x00\x00\x7c\x56\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x02\x58\x00\x00\x00\x00\x00\x01\x00\x00\x2c\xd4\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x02\x8c\x00\x00\x00\x00\x00\x01\x00\x00\x30\x2a\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x04\x42\x00\x00\x00\x00\x00\x01\x00\x00\x54\x29\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x01\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x1a\xd9\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x03\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x3a\xc9\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x04\xd4\x00\x00\x00\x00\x00\x01\x00\x00\x6a\x5c\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x26\x8f\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x02\xe8\x00\x01\x00\x00\x00\x01\x00\x00\x35\x51\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x00\x86\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x55\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x05\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x73\xca\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x01\x20\x00\x00\x00\x00\x00\x01\x00\x00\x15\x5d\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x00\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x09\xec\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x03\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x3d\xc9\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x05\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x79\x46\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x03\x80\x00\x00\x00\x00\x00\x01\x00\x00\x41\x39\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x01\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x1e\xed\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x04\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x4f\xf5\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x05\x78\x00\x00\x00\x00\x00\x01\x00\x00\x76\x8b\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x05\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x6f\x99\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x04\x06\x00\x00\x00\x00\x00\x01\x00\x00\x4c\x06\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x05\x22\x00\x00\x00\x00\x00\x01\x00\x00\x70\x7a\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x00\xda\x00\x00\x00\x00\x00\x01\x00\x00\x11\x0f\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
-\x00\x00\x02\xfe\x00\x00\x00\x00\x00\x01\x00\x00\x37\x32\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x10\x9f\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
-\x00\x00\x01\x58\x00\x00\x00\x00\x00\x01\x00\x00\x17\xde\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9f\
+\x00\x00\x03\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x3a\xdc\
+\x00\x00\x01\x6d\x92\x80\xf5\xcc\
+\x00\x00\x04\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x6a\x6b\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x05\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x73\xee\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x00\xce\x00\x00\x00\x00\x00\x01\x00\x00\x0a\xdd\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x05\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x70\x26\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x02\x68\x00\x01\x00\x00\x00\x01\x00\x00\x27\x71\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x04\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x5e\xc5\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x03\x28\x00\x00\x00\x00\x00\x01\x00\x00\x36\x1b\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x06\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x87\x5a\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x04\xde\x00\x00\x00\x00\x00\x01\x00\x00\x65\xee\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x01\x24\x00\x00\x00\x00\x00\x01\x00\x00\x11\x2d\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x02\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x31\x4d\
+\x00\x00\x01\x6d\x92\x80\xf5\xcc\
+\x00\x00\x03\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x45\x1b\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x01\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x1c\x92\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x02\x7d\
+\x00\x00\x01\x6d\x92\x80\xf5\xcc\
+\x00\x00\x01\x46\x00\x00\x00\x00\x00\x01\x00\x00\x13\xfa\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x01\x00\x00\x08\x37\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x01\x00\x00\x0e\x07\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x03\xea\x00\x00\x00\x00\x00\x01\x00\x00\x4f\x1d\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x04\x10\x00\x00\x00\x00\x00\x01\x00\x00\x53\x31\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x05\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x82\x67\
+\x00\x00\x01\x6d\x92\x80\xf5\xcc\
 \x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01\x6c\x75\x7a\xaf\x9e\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x05\x94\x00\x01\x00\x00\x00\x01\x00\x00\x79\xdf\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x02\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x20\x4b\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x01\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x19\xd1\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x01\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x17\x50\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x04\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x56\x31\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x05\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x76\x6f\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x05\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x7b\xc0\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x06\x06\x00\x00\x00\x00\x00\x01\x00\x00\x84\xd7\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x02\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x29\x95\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x03\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x4a\xe9\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x03\x74\x00\x00\x00\x00\x00\x01\x00\x00\x42\x60\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x02\x30\x00\x00\x00\x00\x00\x01\x00\x00\x23\x95\
+\x00\x00\x01\x6d\x92\x80\xf5\xcc\
+\x00\x00\x04\xca\x00\x00\x00\x00\x00\x01\x00\x00\x61\xff\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x02\xb8\x00\x00\x00\x00\x00\x01\x00\x00\x2d\xfd\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x06\xa3\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
+\x00\x00\x05\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x7e\xd0\
+\x00\x00\x01\x6d\x92\x80\xf5\xcb\
+\x00\x00\x00\x74\x00\x00\x00\x00\x00\x01\x00\x00\x07\xc7\
+\x00\x00\x01\x6d\x92\x80\xf5\xcc\
+\x00\x00\x02\x46\x00\x00\x00\x00\x00\x01\x00\x00\x24\x76\
+\x00\x00\x01\x6d\x92\x80\xf5\xcc\
+\x00\x00\x04\x68\x00\x00\x00\x00\x00\x01\x00\x00\x59\x9a\
+\x00\x00\x01\x6d\x92\x80\xf5\xca\
 "
 
 qt_version = [int(v) for v in QtCore.qVersion().split('.')]

Modified: trunk/Build/source/utils/asymptote/Makefile.in
===================================================================
--- trunk/Build/source/utils/asymptote/Makefile.in	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/Makefile.in	2019-10-06 17:17:34 UTC (rev 52300)
@@ -43,7 +43,7 @@
 	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 shaders
+	$(PRC) glrender tr shaders jsfile
 
 FILES = $(COREFILES) main
 
@@ -69,7 +69,7 @@
 DEFS = @DEFS@ @OPTIONS@ @PTHREAD_CFLAGS@ -DFFTWPP_SINGLE_THREAD
 CFLAGS = @CFLAGS@
 OPTS = $(DEFS) @CPPFLAGS@ @CXXFLAGS@ $(CFLAGS)
-GLEWOPTS = $(DEFS) @CPPFLAGS@ $(CFLAGS) -D GLEW_NO_GLU
+GLEWOPTS = $(DEFS) @CPPFLAGS@ $(CFLAGS) -DGLEW_NO_GLU -DGLEW_BUILD -O1
 
 # 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
@@ -95,6 +95,7 @@
 asydir = $(datadir)/asymptote
 GUIdir = $(asydir)/GUI
 shaderdir = $(asydir)/shaders
+webgldir = $(asydir)/webgl
 docdir = $(DESTDIR)@docdir@
 exampledir = $(docdir)/examples
 animationsdir = $(exampledir)/animations
@@ -245,7 +246,8 @@
 install-asy: asy sty
 	${INSTALL} -d $(bindir) $(asydir) $(exampledir) $(animationsdir)
 	${INSTALL} -d $(GUIdir) $(GUIdir)/pyUIClass $(GUIdir)/configs \
-			$(GUIdir)/res $(GUIdir)/res/icons $(shaderdir)
+			$(GUIdir)/res $(GUIdir)/res/icons $(shaderdir) \
+			$(webgldir)
 	-${INSTALL} -d $(latexdir)
 	-${INSTALL} -d $(contextdir)
 	${INSTALL} -p -m 755 $(NAME) $(bindir)
@@ -253,6 +255,7 @@
 		asy-keywords.el $(asydir)
 	${INSTALL} -p -m 755 GUI/*.py $(GUIdir)
 	${INSTALL} -p -m 755 base/shaders/*.glsl $(shaderdir)
+	${INSTALL} -p -m 644 base/webgl/*.html base/webgl/*.js $(webgldir)
 	-${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
@@ -285,9 +288,19 @@
 	-cd $(exampledir) && rm -f $(EXEXTRA) $(DOCEXTRA)
 	-rmdir $(exampledir)
 	-cd $(GUIdir) && rm -f *.py
+	-cd $(GUIdir)/pyUIClass && rm -f *.py
+	-rmdir $(GUIdir)/pyUIClass
+	-cd $(GUIdir)/configs && rm -f *.cson
+	-rmdir $(GUIdir)/configs
+	-cd $(GUIdir)/res/icons && rm -f *.svg
+	-rmdir $(GUIdir)/res/icons
+	-cd $(GUIdir)/res && rm -f icons.qrc
+	-rmdir $(GUIdir)/res
 	-rmdir $(GUIdir)
 	-cd $(shaderdir) && rm -f *.glsl
 	-rmdir $(shaderdir)
+	-cd $(webgldir) && rm -f *.html *.js
+	-rmdir $(webgldir)
 	-cd $(asydir) && rm -f asy-keywords.el *.asy $(EXTRA)
 	-rmdir $(asydir)
 	-cd $(latexdir) && rm -f $(LATEXFILES)
@@ -338,11 +351,7 @@
 	$(MAKE) -C tests all
 
 glew.o: glew.c GL/glew.h
-	if test -n "$(MSDOS)"; then \
-	  $(CC) -I. $(GLEWOPTS) -o glew.o -D_WIN32 -D GLEW_BUILD -c glew.c; \
-	else \
-	  $(CC) -I. $(GLEWOPTS) -o glew.o -c glew.c; \
-	fi
+	$(CC) -I. $(GLEWOPTS) -o glew.o -c glew.c
 
 .SUFFIXES: .c .cc .o .d .ui .py
 %.o: %.cc

Modified: trunk/Build/source/utils/asymptote/README
===================================================================
--- trunk/Build/source/utils/asymptote/README	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/README	2019-10-06 17:17:34 UTC (rev 52300)
@@ -60,7 +60,3 @@
 http://www.entypo.com/
 and under a CC license:
 http://www.zondicons.com/zondicons.zip
-
-Uses OpenImageIO, which the source is available at
-https://github.com/OpenImageIO/oiio.
-Copyright 2008-2018 Larry Gritz et al. All Rights Reserved.
\ No newline at end of file

Modified: trunk/Build/source/utils/asymptote/ReleaseNotes
===================================================================
--- trunk/Build/source/utils/asymptote/ReleaseNotes	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/ReleaseNotes	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,3 +1,35 @@
+Release Notes for Version 2.56
+
+An array bounds error was fixed. WebGL output now supports background
+colors, including transparent backgrounds. Preprocessor conditionals were
+fixed. Scrolling of webgl images is now disabled within the viewport.
+
+Release Notes for Version 2.55
+
+An initialization bug in the OpenGL renderer and portability issues were
+fixed. 
+
+Release Notes for Version 2.54
+
+Support for generating and embedding interactive 3D WebGL vector graphics
+within an HTML file has been added, allowing Asymptote figures
+to be displayed on modern mobile and desktop browsers. The OpenGL rendering
+routines were further optimized, yielding higher frame rates and
+lower memory usage. The view position for perspective projection was fixed.
+The default value of file word() was fixed. Installation issues were
+addressed. A new digits setting controls the default output file precision.
+A hanging pipe was fixed. The popcount function was extended to
+systems that lack 64-bit integers. The order of PRC quad colours was fixed.
+If lighting is enabled, vertex colors are now ignored in PRC images;
+when drawing a surface s, use draw(s,prc() ? nolight : currentlight);
+to disable lighting manually and recover the old behaviour.
+
+Release Notes for Version 2.53
+
+A memory leak and antialiasing artifacts in the 3D rendering engine were fixed.
+For PRC content, oblique projections are now converted to orthographic
+projections. Portability issues were addressed.
+
 Release Notes for Version 2.52
 
 Under MacOS X, 3D rendering is supported again, the xasy menubar is

Deleted: trunk/Build/source/utils/asymptote/algebra3.cc
===================================================================
--- trunk/Build/source/utils/asymptote/algebra3.cc	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/algebra3.cc	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,1610 +0,0 @@
-/*
-
-  algebra3.cpp, algebra3.h -  C++ Vector and Matrix Algebra routines
-
-  GLUI User Interface Toolkit (LGPL)
-  Copyright (c) 1998 Paul Rademacher
-
-  WWW:    http://sourceforge.net/projects/glui/
-  Forums: http://sourceforge.net/forum/?group_id=92496
-
-  This library is free software; you can redistribute it and/or
-  modify it under the terms of the GNU Lesser General Public
-  License as published by the Free Software Foundation; either
-  version 2.1 of the License, or (at your option) any later version.
-
-  This library is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  Lesser General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public
-  License along with this library; if not, write to the Free Software
-  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-*/
-
-/**************************************************************************
-    
-  There are three vector classes and two matrix classes: vec2, vec3,
-  vec4, mat3, and mat4.
-
-  All the standard arithmetic operations are defined, with '*'
-  for dot product of two vectors and multiplication of two matrices,
-  and '^' for cross product of two vectors.
-
-  Additional functions include length(), normalize(), homogenize for
-  vectors, and print(), set(), apply() for all classes.
-
-  There is a function transpose() for matrices, but note that it 
-  does not actually change the matrix, 
-
-  When multiplied with a matrix, a vector is treated as a row vector
-  if it precedes the matrix (v*M), and as a column vector if it
-  follows the matrix (M*v).
-
-  Matrices are stored in row-major form.
-
-  A vector of one dimension (2d, 3d, or 4d) can be cast to a vector
-  of a higher or lower dimension.  If casting to a higher dimension,
-  the new component is set by default to 1.0, unless a value is
-  specified:
-     vec3 a(1.0, 2.0, 3.0 );
-     vec4 b( a, 4.0 );       // now b == {1.0, 2.0, 3.0, 4.0};
-  When casting to a lower dimension, the vector is homogenized in
-  the lower dimension.  E.g., if a 4d {X,Y,Z,W} is cast to 3d, the
-  resulting vector is {X/W, Y/W, Z/W}.  It is up to the user to 
-  insure the fourth component is not zero before casting.
-
-  There are also the following function for building matrices:
-     identity2D(), translation2D(), rotation2D(),
-     scaling2D(),  identity3D(),    translation3D(),
-     rotation3D(), rotation3Drad(),  scaling3D(),
-     perspective3D()
-
- 
-  ---------------------------------------------------------------------
-  
-  Author: Jean-Francois DOUEg                   
-  Revised: Paul Rademacher                                      
-  Version 3.2 - Feb 1998
-  Revised: Nigel Stewart (GLUI Code Cleaning)
-                                
-**************************************************************************/
-
-#include "algebra3.h"
-#include <cmath>
-
-static const double radians=std::acos(-1)/180.0;
-
-#ifdef VEC_ERROR_FATAL
-#ifndef VEC_ERROR
-#define VEC_ERROR(E) { printf( "VERROR %s\n", E ); exit(1); }
-#endif
-#else
-#ifndef VEC_ERROR
-#define VEC_ERROR(E) { printf( "VERROR %s\n", E ); }
-#endif
-#endif
-
-/****************************************************************
- *                                                              *
- *          vec2 Member functions                               *
- *                                                              *
- ****************************************************************/
-
-/******************** vec2 CONSTRUCTORS ********************/
-
-vec2::vec2() 
-{
-    n[VX] = n[VY] = 0.0; 
-}
-
-vec2::vec2(float x, float y)
-{ 
-    n[VX] = x; 
-    n[VY] = y; 
-}
-
-vec2::vec2(const vec2 &v)
-{ 
-    n[VX] = v.n[VX]; 
-    n[VY] = v.n[VY]; 
-}
-
-vec2::vec2(const vec3 &v) // it is up to caller to avoid divide-by-zero
-{ 
-    n[VX] = v.n[VX]/v.n[VZ]; 
-    n[VY] = v.n[VY]/v.n[VZ]; 
-}
-
-vec2::vec2(const vec3 &v, int dropAxis) 
-{
-    switch (dropAxis) 
-    {
-        case VX: n[VX] = v.n[VY]; n[VY] = v.n[VZ]; break;
-        case VY: n[VX] = v.n[VX]; n[VY] = v.n[VZ]; break;
-        default: n[VX] = v.n[VX]; n[VY] = v.n[VY]; break;
-    }
-}
-
-/******************** vec2 ASSIGNMENT OPERATORS ******************/
-
-vec2 & vec2::operator=(const vec2 &v)
-{ 
-    n[VX] = v.n[VX]; 
-    n[VY] = v.n[VY]; 
-    return *this; 
-}
-
-vec2 & vec2::operator+=(const vec2 &v)
-{ 
-    n[VX] += v.n[VX]; 
-    n[VY] += v.n[VY]; 
-    return *this; 
-}
-
-vec2 & vec2::operator-=(const vec2 &v)
-{ 
-    n[VX] -= v.n[VX]; 
-    n[VY] -= v.n[VY]; 
-    return *this; 
-}
-
-vec2 &vec2::operator*=(float d)
-{ 
-    n[VX] *= d; 
-    n[VY] *= d; 
-    return *this; 
-}
-
-vec2 &vec2::operator/=(float d)
-{ 
-    float d_inv = 1.0f/d; 
-    n[VX] *= d_inv; 
-    n[VY] *= d_inv; 
-    return *this; 
-}
-
-float &vec2::operator[](int i) 
-{
-    if (i < VX || i > VY)
-      //VEC_ERROR("vec2 [] operator: illegal access; index = " << i << '\n')
-      VEC_ERROR("vec2 [] operator: illegal access" );
-    return n[i];
-}
-
-const float &vec2::operator[](int i) const
-{
-    if (i < VX || i > VY)
-      //VEC_ERROR("vec2 [] operator: illegal access; index = " << i << '\n')
-      VEC_ERROR("vec2 [] operator: illegal access" );
-
-    return n[i];
-}
-
-/******************** vec2 SPECIAL FUNCTIONS ********************/
-
-float vec2::length() const 
-{ 
-    return (float) sqrt(length2()); 
-}
-
-float vec2::length2() const 
-{ 
-    return n[VX]*n[VX] + n[VY]*n[VY]; 
-}
-
-vec2 &vec2::normalize() // it is up to caller to avoid divide-by-zero
-{ 
-    *this /= length(); 
-    return *this; 
-}
-
-vec2 &vec2::apply(V_FCT_PTR fct)
-{ 
-    n[VX] = (*fct)(n[VX]); 
-    n[VY] = (*fct)(n[VY]); 
-    return *this; 
-}
-
-void vec2::set( float x, float y )
-{
-  n[VX] = x;   n[VY] = y; 
-}
-
-/******************** vec2 FRIENDS *****************************/
-
-vec2 operator-(const vec2 &a)
-{ 
-    return vec2(-a.n[VX],-a.n[VY]); 
-}
-
-vec2 operator+(const vec2 &a, const vec2& b)
-{ 
-    return vec2(a.n[VX]+b.n[VX], a.n[VY]+b.n[VY]); 
-}
-
-vec2 operator-(const vec2 &a, const vec2& b)
-{ 
-    return vec2(a.n[VX]-b.n[VX], a.n[VY]-b.n[VY]); 
-}
-
-vec2 operator*(const vec2 &a, float d)
-{ 
-    return vec2(d*a.n[VX], d*a.n[VY]); 
-}
-
-vec2 operator*(float d, const vec2 &a)
-{ 
-    return a*d; 
-}
-
-vec2 operator*(const mat3 &a, const vec2 &v) 
-{
-  vec3 av;
-
-  av.n[VX] = a.v[0].n[VX]*v.n[VX] + a.v[0].n[VY]*v.n[VY] + a.v[0].n[VZ];
-  av.n[VY] = a.v[1].n[VX]*v.n[VX] + a.v[1].n[VY]*v.n[VY] + a.v[1].n[VZ];
-  av.n[VZ] = a.v[2].n[VX]*v.n[VX] + a.v[2].n[VY]*v.n[VY] + a.v[2].n[VZ];
-
-  return av;
-}
-
-vec2 operator*(const vec2 &v, const mat3 &a)
-{ 
-    return a.transpose() * v; 
-}
-
-vec3 operator*(const mat3 &a, const vec3 &v) 
-{
-    vec3 av;
-
-    av.n[VX] = a.v[0].n[VX]*v.n[VX] + a.v[0].n[VY]*v.n[VY] + a.v[0].n[VZ]*v.n[VZ];
-    av.n[VY] = a.v[1].n[VX]*v.n[VX] + a.v[1].n[VY]*v.n[VY] + a.v[1].n[VZ]*v.n[VZ];
-    av.n[VZ] = a.v[2].n[VX]*v.n[VX] + a.v[2].n[VY]*v.n[VY] + a.v[2].n[VZ]*v.n[VZ];
-
-    return av;
-}
-
-vec3 operator*(const vec3 &v, const mat3 &a) 
-{ 
-    return a.transpose() * v; 
-}
-
-float operator*(const vec2 &a, const vec2 &b)
-{ 
-    return a.n[VX]*b.n[VX] + a.n[VY]*b.n[VY]; 
-}
-
-vec2 operator/(const vec2 &a, float d)
-{ 
-    float d_inv = 1.0f/d; 
-    return vec2(a.n[VX]*d_inv, a.n[VY]*d_inv); 
-}
-
-vec3 operator^(const vec2 &a, const vec2 &b)
-{ 
-    return vec3(0.0, 0.0, a.n[VX] * b.n[VY] - b.n[VX] * a.n[VY]); 
-}
-
-int operator==(const vec2 &a, const vec2 &b)
-{ 
-    return (a.n[VX] == b.n[VX]) && (a.n[VY] == b.n[VY]); 
-}
-
-int operator!=(const vec2 &a, const vec2 &b)
-{ 
-    return !(a == b); 
-}
-
-/*ostream& operator << (ostream& s, vec2& v)
-{ return s << "| " << v.n[VX] << ' ' << v.n[VY] << " |"; }
-*/
-
-/*istream& operator >> (istream& s, vec2& v) {
-    vec2    v_tmp;
-    char    c = ' ';
-
-    while (isspace(c))
-    s >> c;
-    // The vectors can be formatted either as x y or | x y |
-    if (c == '|') {
-    s >> v_tmp[VX] >> v_tmp[VY];
-    while (s >> c && isspace(c)) ;
-    if (c != '|')
-        ;//s.set(_bad);
-    }
-    else {
-    s.putback(c);
-    s >> v_tmp[VX] >> v_tmp[VY];
-    }
-    if (s)
-    v = v_tmp;
-    return s;
-}
-*/
-
-void swap(vec2 &a, vec2 &b)
-{ 
-    vec2 tmp(a);
-    a = b; 
-    b = tmp; 
-}
-
-vec2 min_vec(const vec2 &a, const vec2 &b)
-{ 
-    return vec2(MIN(a.n[VX], b.n[VX]), MIN(a.n[VY], b.n[VY])); 
-}
-
-vec2 max_vec(const vec2 &a, const vec2 &b)
-{ 
-    return vec2(MAX(a.n[VX], b.n[VX]), MAX(a.n[VY], b.n[VY])); 
-}
-
-vec2 prod(const vec2 &a, const vec2 &b)
-{ 
-    return vec2(a.n[VX] * b.n[VX], a.n[VY] * b.n[VY]); 
-}
-
-/****************************************************************
- *                                                              *
- *          vec3 Member functions                               *
- *                                                              *
- ****************************************************************/
-
-// CONSTRUCTORS
-
-vec3::vec3() 
-{
-    n[VX] = n[VY] = n[VZ] = 0.0;
-}
-
-vec3::vec3(float x, float y, float z)
-{ 
-    n[VX] = x; 
-    n[VY] = y; 
-    n[VZ] = z; 
-}
-
-vec3::vec3(const vec3 &v)
-{ 
-    n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; 
-}
-
-vec3::vec3(const vec2 &v)
-{ 
-    n[VX] = v.n[VX]; 
-    n[VY] = v.n[VY]; 
-    n[VZ] = 1.0; 
-}
-
-vec3::vec3(const vec2 &v, float d)
-{ 
-    n[VX] = v.n[VX]; 
-    n[VY] = v.n[VY]; 
-    n[VZ] = d; 
-}
-
-vec3::vec3(const vec4 &v) // it is up to caller to avoid divide-by-zero
-{ 
-    n[VX] = v.n[VX] / v.n[VW]; 
-    n[VY] = v.n[VY] / v.n[VW];
-    n[VZ] = v.n[VZ] / v.n[VW]; 
-}
-
-vec3::vec3(const vec4 &v, int dropAxis) 
-{
-    switch (dropAxis) 
-    {
-        case VX: n[VX] = v.n[VY]; n[VY] = v.n[VZ]; n[VZ] = v.n[VW]; break;
-        case VY: n[VX] = v.n[VX]; n[VY] = v.n[VZ]; n[VZ] = v.n[VW]; break;
-        case VZ: n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VW]; break;
-        default: n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; break;
-    }
-}
-
-
-// ASSIGNMENT OPERATORS
-
-vec3 &vec3::operator=(const vec3 &v)
-{ 
-    n[VX] = v.n[VX]; 
-    n[VY] = v.n[VY]; 
-    n[VZ] = v.n[VZ]; 
-    return *this; 
-}
-
-vec3 &vec3::operator+=(const vec3 &v)
-{ 
-    n[VX] += v.n[VX]; 
-    n[VY] += v.n[VY]; 
-    n[VZ] += v.n[VZ]; 
-    return *this; 
-}
-
-vec3 &vec3::operator-=(const vec3& v)
-{ 
-    n[VX] -= v.n[VX]; 
-    n[VY] -= v.n[VY]; 
-    n[VZ] -= v.n[VZ];
-    return *this; 
-}
-
-vec3 &vec3::operator*=(float d)
-{ 
-    n[VX] *= d; 
-    n[VY] *= d; 
-    n[VZ] *= d; 
-    return *this; 
-}
-
-vec3 &vec3::operator/=(float d)
-{ 
-    float d_inv = 1.0f/d; 
-    n[VX] *= d_inv; 
-    n[VY] *= d_inv; 
-    n[VZ] *= d_inv;
-    return *this; 
-}
-
-float &vec3::operator[](int i) 
-{
-    if (i < VX || i > VZ)
-        //VEC_ERROR("vec3 [] operator: illegal access; index = " << i << '\n')
-        VEC_ERROR("vec3 [] operator: illegal access" );
-
-    return n[i];
-}
-
-const float &vec3::operator[](int i) const
-{
-    if (i < VX || i > VZ)
-        //VEC_ERROR("vec3 [] operator: illegal access; index = " << i << '\n')
-        VEC_ERROR("vec3 [] operator: illegal access" );
-
-    return n[i];
-}
-
-// SPECIAL FUNCTIONS
-
-float vec3::length() const
-{  
-    return (float) sqrt(length2()); 
-}
-
-float vec3::length2() const
-{  
-    return n[VX]*n[VX] + n[VY]*n[VY] + n[VZ]*n[VZ]; 
-}
-
-vec3 &vec3::normalize() // it is up to caller to avoid divide-by-zero
-{ 
-    *this /= length(); 
-    return *this; 
-}
-
-vec3 &vec3::homogenize(void) // it is up to caller to avoid divide-by-zero
-{ 
-    n[VX] /= n[VZ];  
-    n[VY] /= n[VZ];  
-    n[VZ] = 1.0; 
-    return *this; 
-}
-
-vec3 &vec3::apply(V_FCT_PTR fct)
-{ 
-    n[VX] = (*fct)(n[VX]); 
-    n[VY] = (*fct)(n[VY]); 
-    n[VZ] = (*fct)(n[VZ]);
-    return *this; 
-}
-
-void vec3::set(float x, float y, float z)   // set vector
-{ 
-    n[VX] = x; 
-    n[VY] = y; 
-    n[VZ] = z;  
-}
-
-void vec3::print(FILE *file, const char *name) const  // print vector to a file
-{
-    fprintf( file, "%s: <%f, %f, %f>\n", name, n[VX], n[VY], n[VZ] );
-}
-
-// FRIENDS
-
-vec3 operator-(const vec3 &a)
-{  
-    return vec3(-a.n[VX],-a.n[VY],-a.n[VZ]); 
-}
-
-vec3 operator+(const vec3 &a, const vec3 &b)
-{ 
-    return vec3(a.n[VX]+ b.n[VX], a.n[VY] + b.n[VY], a.n[VZ] + b.n[VZ]); 
-}
-
-vec3 operator-(const vec3 &a, const vec3 &b)
-{ 
-    return vec3(a.n[VX]-b.n[VX], a.n[VY]-b.n[VY], a.n[VZ]-b.n[VZ]); 
-}
-
-vec3 operator*(const vec3 &a, float d)
-{ 
-    return vec3(d*a.n[VX], d*a.n[VY], d*a.n[VZ]); 
-}
-
-vec3 operator*(float d, const vec3 &a)
-{ 
-    return a*d; 
-}
-
-vec3 operator*(const mat4 &a, const vec3 &v)
-{ 
-    return a*vec4(v); 
-}
-
-vec3 operator*(const vec3 &v, mat4 &a)
-{ 
-    return a.transpose()*v; 
-}
-
-float operator*(const vec3 &a, const vec3 &b)
-{ 
-    return a.n[VX]*b.n[VX] + a.n[VY]*b.n[VY] + a.n[VZ]*b.n[VZ]; 
-}
-
-vec3 operator/(const vec3 &a, float d)
-{ 
-    float d_inv = 1.0f/d; 
-    return vec3(a.n[VX]*d_inv, a.n[VY]*d_inv, a.n[VZ]*d_inv); 
-}
-
-vec3 operator^(const vec3 &a, const vec3 &b) 
-{
-    return 
-        vec3(a.n[VY]*b.n[VZ] - a.n[VZ]*b.n[VY],
-             a.n[VZ]*b.n[VX] - a.n[VX]*b.n[VZ],
-             a.n[VX]*b.n[VY] - a.n[VY]*b.n[VX]);
-}
-
-int operator==(const vec3 &a, const vec3 &b)
-{ 
-    return (a.n[VX] == b.n[VX]) && (a.n[VY] == b.n[VY]) && (a.n[VZ] == b.n[VZ]);
-}
-
-int operator!=(const vec3 &a, const vec3 &b)
-{ 
-    return !(a == b); 
-}
-
-/*ostream& operator << (ostream& s, vec3& v)
-{ return s << "| " << v.n[VX] << ' ' << v.n[VY] << ' ' << v.n[VZ] << " |"; }
-
-istream& operator >> (istream& s, vec3& v) {
-    vec3    v_tmp;
-    char    c = ' ';
-
-    while (isspace(c))
-    s >> c;
-    // The vectors can be formatted either as x y z or | x y z |
-    if (c == '|') {
-    s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ];
-    while (s >> c && isspace(c)) ;
-    if (c != '|')
-        ;//s.set(_bad);
-    }
-    else {
-    s.putback(c);
-    s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ];
-    }
-    if (s)
-    v = v_tmp;
-    return s;
-}
-*/
-
-void swap(vec3 &a, vec3 &b)
-{ 
-    vec3 tmp(a); 
-    a = b; 
-    b = tmp; 
-}
-
-vec3 min_vec(const vec3 &a, const vec3 &b)
-{ 
-    return vec3(
-        MIN(a.n[VX], b.n[VX]), 
-        MIN(a.n[VY], b.n[VY]), 
-        MIN(a.n[VZ], b.n[VZ])); 
-}
-
-vec3 max_vec(const vec3 &a, const vec3 &b)
-{ 
-    return vec3(
-        MAX(a.n[VX], b.n[VX]), 
-        MAX(a.n[VY], b.n[VY]), 
-        MAX(a.n[VZ], b.n[VZ])); 
-}
-
-vec3 prod(const vec3 &a, const vec3 &b)
-{ 
-    return vec3(a.n[VX]*b.n[VX], a.n[VY]*b.n[VY], a.n[VZ]*b.n[VZ]); 
-}
-
-/****************************************************************
- *                                                              *
- *          vec4 Member functions                               *
- *                                                              *
- ****************************************************************/
-
-// CONSTRUCTORS
-
-vec4::vec4() 
-{
-    n[VX] = n[VY] = n[VZ] = 0.0; 
-    n[VW] = 1.0; 
-}
-
-vec4::vec4(float x, float y, float z, float w)
-{ 
-    n[VX] = x; 
-    n[VY] = y; 
-    n[VZ] = z; 
-    n[VW] = w; 
-}
-
-vec4::vec4(const vec4 &v)
-{ 
-    n[VX] = v.n[VX]; 
-    n[VY] = v.n[VY]; 
-    n[VZ] = v.n[VZ]; 
-    n[VW] = v.n[VW]; 
-}
-
-vec4::vec4(const vec3 &v)
-{ 
-    n[VX] = v.n[VX]; 
-    n[VY] = v.n[VY]; 
-    n[VZ] = v.n[VZ]; 
-    n[VW] = 1.0; 
-}
-
-vec4::vec4(const vec3 &v, float d)
-{ 
-    n[VX] = v.n[VX]; 
-    n[VY] = v.n[VY]; 
-    n[VZ] = v.n[VZ];  
-    n[VW] = d; 
-}
-
-// ASSIGNMENT OPERATORS
-
-vec4 &vec4::operator=(const vec4 &v)
-{ 
-    n[VX] = v.n[VX]; 
-    n[VY] = v.n[VY]; 
-    n[VZ] = v.n[VZ]; 
-    n[VW] = v.n[VW];
-    return *this; 
-}
-
-vec4 &vec4::operator+=(const vec4 &v)
-{ 
-    n[VX] += v.n[VX]; 
-    n[VY] += v.n[VY]; 
-    n[VZ] += v.n[VZ]; 
-    n[VW] += v.n[VW];
-    return *this; 
-}
-
-vec4 &vec4::operator-=(const vec4 &v)
-{ 
-    n[VX] -= v.n[VX]; 
-    n[VY] -= v.n[VY]; 
-    n[VZ] -= v.n[VZ]; 
-    n[VW] -= v.n[VW];
-    return *this; 
-}
-
-vec4 &vec4::operator*=(float d)
-{ 
-    n[VX] *= d; 
-    n[VY] *= d; 
-    n[VZ] *= d; 
-    n[VW] *= d; 
-    return *this; 
-}
-
-vec4 &vec4::operator/=(float d)
-{ 
-    float d_inv = 1.0f/d; 
-    n[VX] *= d_inv; 
-    n[VY] *= d_inv; 
-    n[VZ] *= d_inv;
-    n[VW] *= d_inv; 
-    return *this; 
-}
-
-float &vec4::operator[](int i) 
-{
-    if (i < VX || i > VW)
-        //VEC_ERROR("vec4 [] operator: illegal access; index = " << i << '\n')
-        VEC_ERROR("vec4 [] operator: illegal access" );
-
-    return n[i];
-}
-
-const float &vec4::operator[](int i) const
-{
-    if (i < VX || i > VW)
-        //VEC_ERROR("vec4 [] operator: illegal access; index = " << i << '\n')
-        VEC_ERROR("vec4 [] operator: illegal access" );
-
-    return n[i];
-}
-
-// SPECIAL FUNCTIONS
-
-float vec4::length() const
-{ 
-    return (float) sqrt(length2()); 
-}
-
-float vec4::length2() const
-{ 
-    return n[VX]*n[VX] + n[VY]*n[VY] + n[VZ]*n[VZ] + n[VW]*n[VW]; 
-}
-
-vec4 &vec4::normalize() // it is up to caller to avoid divide-by-zero
-{ 
-    *this /= length(); 
-    return *this; 
-}
-
-vec4 &vec4::homogenize() // it is up to caller to avoid divide-by-zero
-{ 
-    n[VX] /= n[VW];  
-    n[VY] /= n[VW];  
-    n[VZ] /= n[VW]; 
-    n[VW] = 1.0;  
-    return *this; 
-}
-
-vec4 &vec4::apply(V_FCT_PTR fct)
-{ 
-    n[VX] = (*fct)(n[VX]); 
-    n[VY] = (*fct)(n[VY]); 
-    n[VZ] = (*fct)(n[VZ]);
-    n[VW] = (*fct)(n[VW]); 
-    return *this; 
-}
-
-void vec4::print(FILE *file, const char *name) const // print vector to a file
-{
-    fprintf( file, "%s: <%f, %f, %f, %f>\n", name, n[VX], n[VY], n[VZ], n[VW]);
-}
-
-void vec4::set(float x, float y, float z, float a)
-{
-    n[0] = x; 
-    n[1] = y; 
-    n[2] = z; 
-    n[3] = a;
-}
-
-
-// FRIENDS
-
-vec4 operator-(const vec4 &a)
-{ 
-    return vec4(-a.n[VX],-a.n[VY],-a.n[VZ],-a.n[VW]);
-}
-
-vec4 operator+(const vec4 &a, const vec4 &b)
-{ 
-    return vec4(
-        a.n[VX] + b.n[VX], 
-        a.n[VY] + b.n[VY], 
-        a.n[VZ] + b.n[VZ],
-        a.n[VW] + b.n[VW]); 
-}
-
-vec4 operator-(const vec4 &a, const vec4 &b)
-{  
-    return vec4(
-        a.n[VX] - b.n[VX], 
-        a.n[VY] - b.n[VY], 
-        a.n[VZ] - b.n[VZ],
-        a.n[VW] - b.n[VW]); 
-}
-
-vec4 operator*(const vec4 &a, float d)
-{ 
-    return vec4(d*a.n[VX], d*a.n[VY], d*a.n[VZ], d*a.n[VW]); 
-}
-
-vec4 operator*(float d, const vec4 &a)
-{ 
-    return a*d; 
-}
-
-vec4 operator*(const mat4 &a, const vec4 &v) 
-{
-    #define ROWCOL(i) \
-        a.v[i].n[0]*v.n[VX] + \
-        a.v[i].n[1]*v.n[VY] + \
-        a.v[i].n[2]*v.n[VZ] + \
-        a.v[i].n[3]*v.n[VW]
-
-    return vec4(ROWCOL(0), ROWCOL(1), ROWCOL(2), ROWCOL(3));
-
-    #undef ROWCOL
-}
-
-vec4 operator*(const vec4 &v, const mat4 &a)
-{ 
-    return a.transpose()*v; 
-}
-
-float operator*(const vec4 &a, const vec4 &b)
-{ 
-    return 
-        a.n[VX]*b.n[VX] + 
-        a.n[VY]*b.n[VY] + 
-        a.n[VZ]*b.n[VZ] +
-        a.n[VW]*b.n[VW]; 
-}
-
-vec4 operator/(const vec4 &a, float d)
-{ 
-    float d_inv = 1.0f/d; 
-    return vec4(
-        a.n[VX]*d_inv, 
-        a.n[VY]*d_inv, 
-        a.n[VZ]*d_inv,
-        a.n[VW]*d_inv); 
-}
-
-int operator==(const vec4 &a, const vec4 &b)
-{ 
-    return 
-        (a.n[VX] == b.n[VX]) && 
-        (a.n[VY] == b.n[VY]) && 
-        (a.n[VZ] == b.n[VZ]) && 
-        (a.n[VW] == b.n[VW]); 
-}
-
-int operator!=(const vec4 &a, const vec4 &b)
-{ 
-    return !(a == b); 
-}
-
-/*ostream& operator << (ostream& s, vec4& v)
-{ return s << "| " << v.n[VX] << ' ' << v.n[VY] << ' ' << v.n[VZ] << ' '
-  << v.n[VW] << " |"; }
-
-istream& operator >> (istream& s, vec4& v) {
-    vec4    v_tmp;
-    char    c = ' ';
-
-    while (isspace(c))
-    s >> c;
-    // The vectors can be formatted either as x y z w or | x y z w |
-    if (c == '|') {
-    s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ] >> v_tmp[VW];
-    while (s >> c && isspace(c)) ;
-    if (c != '|')
-        ;//s.set(_bad);
-    }
-    else {
-    s.putback(c);
-    s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ] >> v_tmp[VW];
-    }
-    if (s)
-    v = v_tmp;
-    return s;
-}
-*/
-
-void swap(vec4 &a, vec4 &b)
-{ 
-    vec4 tmp(a); 
-    a = b; 
-    b = tmp; 
-}
-
-vec4 min_vec(const vec4 &a, const vec4 &b)
-{ 
-    return vec4(
-        MIN(a.n[VX], b.n[VX]), 
-        MIN(a.n[VY], b.n[VY]), 
-        MIN(a.n[VZ], b.n[VZ]), 
-        MIN(a.n[VW], b.n[VW])); 
-}
-
-vec4 max_vec(const vec4 &a, const vec4 &b)
-{ 
-    return vec4(
-        MAX(a.n[VX], b.n[VX]), 
-        MAX(a.n[VY], b.n[VY]), 
-        MAX(a.n[VZ], b.n[VZ]), 
-        MAX(a.n[VW], b.n[VW])); 
-}
-
-vec4 prod(const vec4 &a, const vec4 &b)
-{ 
-    return vec4(
-        a.n[VX] * b.n[VX], 
-        a.n[VY] * b.n[VY], 
-        a.n[VZ] * b.n[VZ],
-        a.n[VW] * b.n[VW]); 
-}
-
-/****************************************************************
- *                                                              *
- *          mat3 member functions                               *
- *                                                              *
- ****************************************************************/
-
-// CONSTRUCTORS
-
-mat3::mat3() 
-{ 
-    *this = identity2D(); 
-}
-
-mat3::mat3(const vec3 &v0, const vec3 &v1, const vec3 &v2)
-{ 
-    set(v0, v1, v2); 
-}
-
-mat3::mat3(const mat3 &m)
-{ 
-    v[0] = m.v[0]; 
-    v[1] = m.v[1]; 
-    v[2] = m.v[2]; 
-}
-
-// ASSIGNMENT OPERATORS
-
-mat3 &mat3::operator=(const mat3 &m)
-{ 
-    v[0] = m.v[0]; 
-    v[1] = m.v[1]; 
-    v[2] = m.v[2]; 
-    return *this; 
-}
-
-mat3 &mat3::operator+=(const mat3& m)
-{ 
-    v[0] += m.v[0]; 
-    v[1] += m.v[1]; 
-    v[2] += m.v[2]; 
-    return *this; 
-}
-
-mat3 &mat3::operator-=(const mat3& m)
-{ 
-    v[0] -= m.v[0]; 
-    v[1] -= m.v[1]; 
-    v[2] -= m.v[2]; 
-    return *this; 
-}
-
-mat3 &mat3::operator*=(float d)
-{ 
-    v[0] *= d; 
-    v[1] *= d; 
-    v[2] *= d;
-    return *this; 
-}
-
-mat3 &mat3::operator/=(float d)
-{ 
-    v[0] /= d; 
-    v[1] /= d; 
-    v[2] /= d; 
-    return *this; 
-}
-
-vec3 &mat3::operator[](int i) 
-{
-    if (i < VX || i > VZ)
-      //VEC_ERROR("mat3 [] operator: illegal access; index = " << i << '\n')
-      VEC_ERROR("mat3 [] operator: illegal access" );
-
-    return v[i];
-}
-
-const vec3 &mat3::operator[](int i) const
-{
-    if (i < VX || i > VZ)
-      //VEC_ERROR("mat3 [] operator: illegal access; index = " << i << '\n')
-      VEC_ERROR("mat3 [] operator: illegal access" );
-
-    return v[i];
-}
-
-void mat3::set(const vec3 &v0, const vec3 &v1, const vec3 &v2) 
-{
-    v[0] = v0; 
-    v[1] = v1; 
-    v[2] = v2; 
-}
-
-// SPECIAL FUNCTIONS
-
-mat3 mat3::transpose() const 
-{
-    return mat3(
-        vec3(v[0][0], v[1][0], v[2][0]),
-        vec3(v[0][1], v[1][1], v[2][1]),
-        vec3(v[0][2], v[1][2], v[2][2]));
-}
-
-mat3 mat3::inverse() const       // Gauss-Jordan elimination with partial pivoting
-{
-    mat3 a(*this);          // As a evolves from original mat into identity
-    mat3 b(identity2D());   // b evolves from identity into inverse(a)
-    int  i, j, i1;
-
-    // Loop over cols of a from left to right, eliminating above and below diag
-    for (j=0; j<3; j++)     // Find largest pivot in column j among rows j..2
-    {
-        i1 = j;         // Row with largest pivot candidate
-        for (i=j+1; i<3; i++)
-            if (fabs(a.v[i].n[j]) > fabs(a.v[i1].n[j]))
-                i1 = i;
-
-        // Swap rows i1 and j in a and b to put pivot on diagonal
-        swap(a.v[i1], a.v[j]);
-        swap(b.v[i1], b.v[j]);
-
-        // Scale row j to have a unit diagonal
-        if (a.v[j].n[j]==0.)
-            VEC_ERROR("mat3::inverse: singular matrix; can't invert\n");
-
-        b.v[j] /= a.v[j].n[j];
-        a.v[j] /= a.v[j].n[j];
-
-        // Eliminate off-diagonal elems in col j of a, doing identical ops to b
-        for (i=0; i<3; i++)
-            if (i!=j) 
-            {
-                b.v[i] -= a.v[i].n[j]*b.v[j];
-                a.v[i] -= a.v[i].n[j]*a.v[j];
-            }
-    }
-
-    return b;
-}
-
-mat3 &mat3::apply(V_FCT_PTR fct) 
-{
-    v[VX].apply(fct);
-    v[VY].apply(fct);
-    v[VZ].apply(fct);
-    return *this;
-}
-
-
-// FRIENDS
-
-mat3 operator-(const mat3 &a)
-{ 
-    return mat3(-a.v[0], -a.v[1], -a.v[2]); 
-}
-
-mat3 operator+(const mat3 &a, const mat3 &b)
-{ 
-    return mat3(a.v[0]+b.v[0], a.v[1]+b.v[1], a.v[2]+b.v[2]); 
-}
-
-mat3 operator-(const mat3 &a, const mat3 &b)
-{ 
-    return mat3(a.v[0]-b.v[0], a.v[1]-b.v[1], a.v[2]-b.v[2]); 
-}
-
-mat3 operator*(const mat3 &a, const mat3 &b) 
-{
-    #define ROWCOL(i, j) \
-    a.v[i].n[0]*b.v[0][j] + a.v[i].n[1]*b.v[1][j] + a.v[i].n[2]*b.v[2][j]
-
-    return mat3(
-        vec3(ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2)),
-        vec3(ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2)),
-        vec3(ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2)));
-    
-    #undef ROWCOL
-}
-
-mat3 operator*(const mat3 &a, float d)
-{ 
-    return mat3(a.v[0]*d, a.v[1]*d, a.v[2]*d); 
-}
-
-mat3 operator*(float d, const mat3 &a)
-{ 
-    return a*d; 
-}
-
-mat3 operator/(const mat3 &a, float d)
-{ 
-    return mat3(a.v[0]/d, a.v[1]/d, a.v[2]/d); 
-}
-
-int operator==(const mat3 &a, const mat3 &b)
-{ 
-    return 
-        (a.v[0] == b.v[0]) && 
-        (a.v[1] == b.v[1]) && 
-        (a.v[2] == b.v[2]); 
-}
-
-int operator!=(const mat3 &a, const mat3 &b)
-{ 
-    return !(a == b); 
-}
-
-/*ostream& operator << (ostream& s, mat3& m)
-{ return s << m.v[VX] << '\n' << m.v[VY] << '\n' << m.v[VZ]; }
-
-istream& operator >> (istream& s, mat3& m) {
-    mat3    m_tmp;
-
-    s >> m_tmp[VX] >> m_tmp[VY] >> m_tmp[VZ];
-    if (s)
-    m = m_tmp;
-    return s;
-}
-*/
-
-void swap(mat3 &a, mat3 &b)
-{ 
-    mat3 tmp(a); 
-    a = b; 
-    b = tmp; 
-}
-
-void mat3::print(FILE *file, const char *name) const 
-{
-    int i, j;
-
-    fprintf( stderr, "%s:\n", name );
-
-    for( i = 0; i < 3; i++ )
-    {
-        fprintf( stderr, "   " );
-        for( j = 0; j < 3; j++ )
-        {
-            fprintf( stderr, "%f  ", v[i][j] );
-        }
-        fprintf( stderr, "\n" );
-    }
-}
-
-
-
-/****************************************************************
- *                                                              *
- *          mat4 member functions                               *
- *                                                              *
- ****************************************************************/
-
-// CONSTRUCTORS
-
-mat4::mat4() 
-{ 
-    *this = identity3D();
-}
-
-mat4::mat4(const vec4& v0, const vec4& v1, const vec4& v2, const vec4& v3)
-{ 
-    v[0] = v0; 
-    v[1] = v1; 
-    v[2] = v2; 
-    v[3] = v3; 
-}
-
-mat4::mat4(const mat4 &m)
-{ 
-    v[0] = m.v[0]; 
-    v[1] = m.v[1]; 
-    v[2] = m.v[2]; 
-    v[3] = m.v[3]; 
-}
-
-mat4::mat4(
-     float a00, float a01, float a02, float a03,
-     float a10, float a11, float a12, float a13,
-     float a20, float a21, float a22, float a23,
-     float a30, float a31, float a32, float a33 )
-{
-  v[0][0] = a00;  v[0][1] = a01;  v[0][2] = a02;  v[0][3] = a03;
-  v[1][0] = a10;  v[1][1] = a11;  v[1][2] = a12;  v[1][3] = a13;
-  v[2][0] = a20;  v[2][1] = a21;  v[2][2] = a22;  v[2][3] = a23;
-  v[3][0] = a30;  v[3][1] = a31;  v[3][2] = a32;  v[3][3] = a33;
-}
-
-// ASSIGNMENT OPERATORS
-
-mat4 &mat4::operator=(const mat4 &m)
-{ 
-    v[0] = m.v[0]; 
-    v[1] = m.v[1]; 
-    v[2] = m.v[2]; 
-    v[3] = m.v[3];
-    return *this; 
-}
-
-mat4 &mat4::operator+=(const mat4 &m)
-{ 
-    v[0] += m.v[0]; 
-    v[1] += m.v[1]; 
-    v[2] += m.v[2]; 
-    v[3] += m.v[3];
-    return *this; 
-}
-
-mat4 &mat4::operator-=(const mat4 &m)
-{ 
-    v[0] -= m.v[0]; 
-    v[1] -= m.v[1]; 
-    v[2] -= m.v[2]; 
-    v[3] -= m.v[3];
-    return *this; 
-}
-
-mat4 &mat4::operator*=(float d)
-{ 
-    v[0] *= d; 
-    v[1] *= d; 
-    v[2] *= d; 
-    v[3] *= d; 
-    return *this; 
-}
-
-mat4 &mat4::operator/=(float d)
-{ 
-    v[0] /= d; 
-    v[1] /= d; 
-    v[2] /= d; 
-    v[3] /= d; 
-    return *this; 
-}
-
-vec4 &mat4::operator[](int i) 
-{
-    if (i < VX || i > VW)
-        //VEC_ERROR("mat4 [] operator: illegal access; index = " << i << '\n')
-        VEC_ERROR("mat4 [] operator: illegal access" );
-    return v[i];
-}
-
-const vec4 &mat4::operator[](int i) const
-{
-    if (i < VX || i > VW)
-        //VEC_ERROR("mat4 [] operator: illegal access; index = " << i << '\n')
-        VEC_ERROR("mat4 [] operator: illegal access" );
-    return v[i];
-}
-
-// SPECIAL FUNCTIONS;
-
-mat4 mat4::transpose() const  
-{
-    return mat4(
-        vec4(v[0][0], v[1][0], v[2][0], v[3][0]),
-        vec4(v[0][1], v[1][1], v[2][1], v[3][1]),
-        vec4(v[0][2], v[1][2], v[2][2], v[3][2]),
-        vec4(v[0][3], v[1][3], v[2][3], v[3][3]));
-}
-
-mat4 mat4::inverse() const       // Gauss-Jordan elimination with partial pivoting
-{
-    mat4 a(*this);          // As a evolves from original mat into identity
-    mat4 b(identity3D());   // b evolves from identity into inverse(a)
-    int i, j, i1;
-
-    // Loop over cols of a from left to right, eliminating above and below diag
-    for (j=0; j<4; j++)    // Find largest pivot in column j among rows j..3
-    {
-        i1 = j;         // Row with largest pivot candidate
-        for (i=j+1; i<4; i++)
-            if (fabs(a.v[i].n[j]) > fabs(a.v[i1].n[j]))
-                i1 = i;
-
-        // Swap rows i1 and j in a and b to put pivot on diagonal
-        swap(a.v[i1], a.v[j]);
-        swap(b.v[i1], b.v[j]);
-
-        // Scale row j to have a unit diagonal
-        if (a.v[j].n[j]==0.)
-            VEC_ERROR("mat4::inverse: singular matrix; can't invert\n");
-
-        b.v[j] /= a.v[j].n[j];
-        a.v[j] /= a.v[j].n[j];
-
-        // Eliminate off-diagonal elems in col j of a, doing identical ops to b
-        for (i=0; i<4; i++)
-            if (i!=j) 
-            {
-                b.v[i] -= a.v[i].n[j]*b.v[j];
-                a.v[i] -= a.v[i].n[j]*a.v[j];
-            }
-    }
-
-    return b;
-}
-
-mat4 &mat4::apply(V_FCT_PTR fct)
-{ 
-    v[VX].apply(fct); 
-    v[VY].apply(fct); 
-    v[VZ].apply(fct); 
-    v[VW].apply(fct);
-    return *this; 
-}
-
-void mat4::print(FILE *file, const char *name) const 
-{
-    int i, j;
-
-    fprintf( stderr, "%s:\n", name );
-
-    for( i = 0; i < 4; i++ )
-    {
-        fprintf( stderr, "   " );
-        for( j = 0; j < 4; j++ )
-        {
-            fprintf( stderr, "%f  ", v[i][j] );
-        }
-        fprintf( stderr, "\n" );
-    }
-}
-
-void mat4::swap_rows(int i, int j)
-{
-    vec4 t;
-
-    t    = v[i];
-    v[i] = v[j];
-    v[j] = t;
-}
-
-void mat4::swap_cols(int i, int j)
-{
-    float t;
-    int k;
-
-    for (k=0; k<4; k++) 
-    {
-        t       = v[k][i];
-        v[k][i] = v[k][j];
-        v[k][j] = t;
-    }
-}
-
-
-// FRIENDS
-
-mat4 operator-(const mat4 &a)
-{ 
-    return mat4(-a.v[0],-a.v[1],-a.v[2],-a.v[3]); 
-}
-
-mat4 operator+(const mat4 &a, const mat4 &b)
-{ 
-    return mat4(
-        a.v[0] + b.v[0], 
-        a.v[1] + b.v[1], 
-        a.v[2] + b.v[2],
-        a.v[3] + b.v[3]);
-}
-
-mat4 operator-(const mat4 &a, const mat4 &b)
-{ 
-    return mat4(
-        a.v[0] - b.v[0], 
-        a.v[1] - b.v[1], 
-        a.v[2] - b.v[2], 
-        a.v[3] - b.v[3]); 
-}
-
-mat4 operator*(const mat4 &a, const mat4 &b) 
-{
-    #define ROWCOL(i, j) \
-        a.v[i].n[0]*b.v[0][j] + \
-        a.v[i].n[1]*b.v[1][j] + \
-        a.v[i].n[2]*b.v[2][j] + \
-        a.v[i].n[3]*b.v[3][j]
-    
-    return mat4(
-        vec4(ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2), ROWCOL(0,3)),
-        vec4(ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2), ROWCOL(1,3)),
-        vec4(ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2), ROWCOL(2,3)),
-        vec4(ROWCOL(3,0), ROWCOL(3,1), ROWCOL(3,2), ROWCOL(3,3))
-        );
-
-    #undef ROWCOL
-}
-
-mat4 operator*(const mat4 &a, float d)
-{ 
-    return mat4(a.v[0]*d, a.v[1]*d, a.v[2]*d, a.v[3]*d); 
-}
-
-mat4 operator*(float d, const mat4 &a)
-{ 
-    return a*d; 
-}
-
-mat4 operator/(const mat4 &a, float d)
-{ 
-    return mat4(a.v[0]/d, a.v[1]/d, a.v[2]/d, a.v[3]/d); 
-}
-
-int operator==(const mat4 &a, const mat4 &b)
-{ 
-    return
-        (a.v[0] == b.v[0]) && 
-        (a.v[1] == b.v[1]) && 
-        (a.v[2] == b.v[2]) &&
-        (a.v[3] == b.v[3]); 
-}
-
-int operator!=(const mat4 &a, const mat4 &b)
-{ 
-    return !(a == b); 
-}
-
-/*ostream& operator << (ostream& s, mat4& m)
-{ return s << m.v[VX] << '\n' << m.v[VY] << '\n' << m.v[VZ] << '\n' << m.v[VW]; }
-
-istream& operator >> (istream& s, mat4& m)
-{
-    mat4    m_tmp;
-
-    s >> m_tmp[VX] >> m_tmp[VY] >> m_tmp[VZ] >> m_tmp[VW];
-    if (s)
-    m = m_tmp;
-    return s;
-}
-*/
-
-void swap(mat4 &a, mat4 &b)
-{ 
-    mat4 tmp(a); 
-    a = b; 
-    b = tmp; 
-}
-
-/****************************************************************
- *                                                              *
- *         2D functions and 3D functions                        *
- *                                                              *
- ****************************************************************/
-
-mat3 identity2D()
-{   
-    return mat3(
-        vec3(1.0, 0.0, 0.0),
-        vec3(0.0, 1.0, 0.0),
-        vec3(0.0, 0.0, 1.0)); 
-}
-
-mat3 translation2D(const vec2 &v)
-{   
-    return mat3(
-        vec3(1.0, 0.0, v[VX]),
-        vec3(0.0, 1.0, v[VY]),
-        vec3(0.0, 0.0, 1.0)); 
-}
-
-mat3 rotation2D(const vec2 &Center, float angleDeg) 
-{
-    float angleRad = (float) (angleDeg * radians);
-    float c = (float) cos(angleRad);
-    float s = (float) sin(angleRad);
-
-    return mat3(
-        vec3(c,    -s, Center[VX] * (1.0f-c) + Center[VY] * s),
-        vec3(s,     c, Center[VY] * (1.0f-c) - Center[VX] * s),
-        vec3(0.0, 0.0, 1.0));
-}
-
-mat3 scaling2D(const vec2 &scaleVector)
-{   
-    return mat3(
-        vec3(scaleVector[VX], 0.0, 0.0),
-        vec3(0.0, scaleVector[VY], 0.0),
-        vec3(0.0, 0.0, 1.0)); 
-}
-
-mat4 identity3D()
-{   
-    return mat4(
-        vec4(1.0, 0.0, 0.0, 0.0),
-        vec4(0.0, 1.0, 0.0, 0.0),
-        vec4(0.0, 0.0, 1.0, 0.0),
-        vec4(0.0, 0.0, 0.0, 1.0)); 
-}
-
-mat4 translation3D(const vec3 &v)
-{   
-    return mat4(
-        vec4(1.0, 0.0, 0.0, v[VX]),
-        vec4(0.0, 1.0, 0.0, v[VY]),
-        vec4(0.0, 0.0, 1.0, v[VZ]),
-        vec4(0.0, 0.0, 0.0, 1.0)); 
-}
-
-mat4 rotation3D(const vec3 &Axis, float angleDeg) 
-{
-    float angleRad = (float) (angleDeg * radians);
-    float c = (float) cos(angleRad);
-    float s = (float) sin(angleRad);
-    float t = 1.0f - c;
-
-    vec3 axis(Axis);
-    axis.normalize();
-
-    return mat4(
-        vec4(t * axis[VX] * axis[VX] + c,
-             t * axis[VX] * axis[VY] - s * axis[VZ],
-             t * axis[VX] * axis[VZ] + s * axis[VY],
-             0.0),
-        vec4(t * axis[VX] * axis[VY] + s * axis[VZ],
-             t * axis[VY] * axis[VY] + c,
-             t * axis[VY] * axis[VZ] - s * axis[VX],
-             0.0),
-        vec4(t * axis[VX] * axis[VZ] - s * axis[VY],
-             t * axis[VY] * axis[VZ] + s * axis[VX],
-             t * axis[VZ] * axis[VZ] + c,
-             0.0),
-        vec4(0.0, 0.0, 0.0, 1.0));
-}
-
-mat4 rotation3Drad(const vec3 &Axis, float angleRad) 
-{
-    float c = (float) cos(angleRad);
-    float s = (float) sin(angleRad);
-    float t = 1.0f - c;
-
-    vec3 axis(Axis);
-    axis.normalize();
-
-    return mat4(
-        vec4(t * axis[VX] * axis[VX] + c,
-             t * axis[VX] * axis[VY] - s * axis[VZ],
-             t * axis[VX] * axis[VZ] + s * axis[VY],
-             0.0),
-        vec4(t * axis[VX] * axis[VY] + s * axis[VZ],
-             t * axis[VY] * axis[VY] + c,
-             t * axis[VY] * axis[VZ] - s * axis[VX],
-             0.0),
-        vec4(t * axis[VX] * axis[VZ] - s * axis[VY],
-             t * axis[VY] * axis[VZ] + s * axis[VX],
-             t * axis[VZ] * axis[VZ] + c,
-             0.0),
-        vec4(0.0, 0.0, 0.0, 1.0));
-}
-
-mat4 scaling3D(const vec3 &scaleVector)
-{   
-    return mat4(
-        vec4(scaleVector[VX], 0.0, 0.0, 0.0),
-        vec4(0.0, scaleVector[VY], 0.0, 0.0),
-        vec4(0.0, 0.0, scaleVector[VZ], 0.0),
-        vec4(0.0, 0.0, 0.0, 1.0)); 
-}
-
-mat4 perspective3D(float d)
-{   
-    return mat4(
-        vec4(1.0f, 0.0f, 0.0f,   0.0f),
-        vec4(0.0f, 1.0f, 0.0f,   0.0f),
-        vec4(0.0f, 0.0f, 1.0f,   0.0f),
-        vec4(0.0f, 0.0f, 1.0f/d, 0.0f)); 
-}

Deleted: trunk/Build/source/utils/asymptote/algebra3.h
===================================================================
--- trunk/Build/source/utils/asymptote/algebra3.h	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/algebra3.h	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,480 +0,0 @@
-/*
-
-  algebra3.cc, algebra3.h -  C++ Vector and Matrix Algebra routines
-
-  GLUI User Interface Toolkit (LGPL)
-  Copyright (c) 1998 Paul Rademacher
-
-  WWW:    http://sourceforge.net/projects/glui/
-  Forums: http://sourceforge.net/forum/?group_id=92496
-
-  This library is free software; you can redistribute it and/or
-  modify it under the terms of the GNU Lesser General Public
-  License as published by the Free Software Foundation; either
-  version 2.1 of the License, or (at your option) any later version.
-
-  This library is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  Lesser General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public
-  License along with this library; if not, write to the Free Software
-  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-*/
-
-/**************************************************************************
-    
-  There are three vector classes and two matrix classes: vec2, vec3,
-  vec4, mat3, and mat4.
-
-  All the standard arithmetic operations are defined, with '*'
-  for dot product of two vectors and multiplication of two matrices,
-  and '^' for cross product of two vectors.
-
-  Additional functions include length(), normalize(), homogenize for
-  vectors, and print(), set(), apply() for all classes.
-
-  There is a function transpose() for matrices, but note that it 
-  does not actually change the matrix, 
-
-  When multiplied with a matrix, a vector is treated as a row vector
-  if it precedes the matrix (v*M), and as a column vector if it
-  follows the matrix (M*v).
-
-  Matrices are stored in row-major form.
-
-  A vector of one dimension (2d, 3d, or 4d) can be cast to a vector
-  of a higher or lower dimension.  If casting to a higher dimension,
-  the new component is set by default to 1.0, unless a value is
-  specified:
-     vec3 a(1.0, 2.0, 3.0 );
-     vec4 b( a, 4.0 );       // now b == {1.0, 2.0, 3.0, 4.0};
-  When casting to a lower dimension, the vector is homogenized in
-  the lower dimension.  E.g., if a 4d {X,Y,Z,W} is cast to 3d, the
-  resulting vector is {X/W, Y/W, Z/W}.  It is up to the user to 
-  insure the fourth component is not zero before casting.
-
-  There are also the following function for building matrices:
-     identity2D(), translation2D(), rotation2D(),
-     scaling2D(),  identity3D(),    translation3D(),
-     rotation3D(), rotation3Drad(),  scaling3D(),
-     perspective3D()
-
-  NOTE: When compiling for Windows, include this file first, to avoid
-        certain name conflicts
- 
-  ---------------------------------------------------------------------
-  
-  Author: Jean-Francois DOUEg                   
-  Revised: Paul Rademacher                                      
-  Version 3.2 - Feb 1998
-  Revised: Nigel Stewart (GLUI Code Cleaning)
-  
-**************************************************************************/
-
-#ifndef GLUI_ALGEBRA3_H
-#define GLUI_ALGEBRA3_H
-
-#include <cmath>
-#include <cstdio>
-#include <cstdlib>
-
-#ifndef MAX
-#define MAX(a,b)  ((a)>(b) ? (a) : (b))
-#define MIN(a,b)  ((a)<(b) ? (a) : (b))
-#endif
-
-#define FUDGE .00001
-
-// this line defines a new type: pointer to a function which returns a
-// float and takes as argument a float
-typedef float (*V_FCT_PTR)(float);
-
-class vec2;
-class vec3;
-class vec4;
-class mat3;
-class mat4;
-
-enum axes {VX, VY, VZ, VW};
-/*
-enum planes {PA, PB, PC, PD};
-enum colors {RED, GREEN, BLUE, ALPHA};
-enum phong {KA, KD, KS, ES};
-*/
-
-/****************************************************************
- *                                                              *
- *              2D Vector                                       *
- *                                                              *
- ****************************************************************/
-
-class vec2
-{
-  friend class vec3;
-
-protected:
-
-  float n[2];
-
-public:
-
-  // Constructors
-
-  vec2();
-  vec2(float x, float y);
-  vec2(const vec2 &v);                   // copy constructor
-  vec2(const vec3 &v);                   // cast v3 to v2
-  vec2(const vec3 &v, int dropAxis);     // cast v3 to v2
-
-  // Assignment operators
-
-  vec2  &operator  = (const vec2 &v);    // assignment of a vec2
-  vec2  &operator += (const vec2 &v);    // incrementation by a vec2
-  vec2  &operator -= (const vec2 &v);    // decrementation by a vec2
-  vec2  &operator *= (float d);    // multiplication by a constant
-  vec2  &operator /= (float d);    // division by a constant
-
-  // special functions
-
-  float  length()  const;                   // length of a vec2
-  float  length2() const;                   // squared length of a vec2
-  vec2  &normalize();                       // normalize a vec2
-  vec2  &apply(V_FCT_PTR fct);              // apply a func. to each component
-  void   set(float x, float y);             // set vector
-
-  float &operator [] (int i);         // indexing
-  const float &operator [] (int i) const;   // indexing
-
-  // friends
-
-  friend vec2  operator -  (const vec2 &v);                   // -v1
-  friend vec2  operator +  (const vec2 &a, const vec2 &b);    // v1 + v2
-  friend vec2  operator -  (const vec2 &a, const vec2 &b);    // v1 - v2
-  friend vec2  operator *  (const vec2 &a, float d);          // v1 * 3.0
-  friend vec2  operator *  (float d, const vec2 &a);          // 3.0 * v1
-  friend vec2  operator *  (const mat3 &a, const vec2 &v);    // M . v
-  friend vec2  operator *  (const vec2 &v, const mat3 &a);    // v . M
-  friend float operator *  (const vec2 &a, const vec2 &b);    // dot product
-  friend vec2  operator /  (const vec2 &a, float d);          // v1 / 3.0
-  friend vec3  operator ^  (const vec2 &a, const vec2 &b);    // cross product
-  friend int   operator == (const vec2 &a, const vec2 &b);    // v1 == v2 ?
-  friend int   operator != (const vec2 &a, const vec2 &b);    // v1 != v2 ?
-  //friend ostream& operator << (ostream& s, vec2& v);        // output to stream
-  //friend istream& operator >> (istream& s, vec2& v);        // input from strm.
-  friend void swap(vec2 &a, vec2 &b);                         // swap v1 & v2
-  friend vec2 min_vec(const vec2 &a, const vec2 &b);          // min(v1, v2)
-  friend vec2 max_vec(const vec2 &a, const vec2 &b);          // max(v1, v2)
-  friend vec2 prod   (const vec2 &a, const vec2 &b);          // term by term *
-};
-
-/****************************************************************
- *                                                              *
- *               3D Vector                                      *
- *                                                              *
- ****************************************************************/
-
-class vec3
-{
-  friend class vec2;
-  friend class vec4;
-  friend class mat3;
-
-protected:
-
-  float n[3];
-
-public:
-
-  // Constructors
-
-  vec3();
-  vec3(float x, float y, float z);
-  vec3(const vec3 &v);               // copy constructor
-  vec3(const vec2 &v);               // cast v2 to v3
-  vec3(const vec2 &v, float d);      // cast v2 to v3
-  vec3(const vec4 &v);               // cast v4 to v3
-  vec3(const vec4 &v, int dropAxis); // cast v4 to v3
-
-  // Assignment operators
-
-  vec3  &operator  = (const vec3 &v);      // assignment of a vec3
-  vec3  &operator += (const vec3 &v);      // incrementation by a vec3
-  vec3  &operator -= (const vec3 &v);      // decrementation by a vec3
-  vec3  &operator *= (float d);      // multiplication by a constant
-  vec3  &operator /= (float d);      // division by a constant
-
-  // special functions
-
-  float  length()  const;                     // length of a vec3
-  float  length2() const;                     // squared length of a vec3
-  vec3&  normalize();                         // normalize a vec3
-  vec3&  homogenize();                        // homogenize (div by Z)
-  vec3&  apply(V_FCT_PTR fct);                // apply a func. to each component
-  void   set(float x, float y, float z);      // set vector
-
-  void   print(FILE *file, const char *name) const; // print vector to a file
-
-
-  float &operator [] (int i);       // indexing
-  const float &operator [] (int i) const; // indexing
-
-  // friends
-
-  friend vec3  operator -  (const vec3 &v);                 // -v1
-  friend vec3  operator +  (const vec3 &a, const vec3 &b);  // v1 + v2
-  friend vec3  operator -  (const vec3 &a, const vec3 &b);  // v1 - v2
-  friend vec3  operator *  (const vec3 &a, float d);        // v1 * 3.0
-  friend vec3  operator *  (float d, const vec3 &a);        // 3.0 * v1
-  friend vec3  operator *  (const mat4 &a, const vec3 &v);  // M . v
-  friend vec3  operator *  (const vec3 &v, const mat4 &a);  // v . M
-  friend float operator *  (const vec3 &a, const vec3 &b);  // dot product
-  friend vec3  operator /  (const vec3 &a, float d);  // v1 / 3.0
-  friend vec3  operator ^  (const vec3 &a, const vec3 &b);  // cross product
-  friend int   operator == (const vec3 &a, const vec3 &b);  // v1 == v2 ?
-  friend int   operator != (const vec3 &a, const vec3 &b);  // v1 != v2 ?
-  //friend ostream& operator << (ostream& s, vec3& v);      // output to stream
-  //friend istream& operator >> (istream& s, vec3& v);      // input from strm.
-  friend void swap(vec3 &a, vec3 &b);                       // swap v1 & v2
-  friend vec3 min_vec(const vec3 &a, const vec3 &b);        // min(v1, v2)
-  friend vec3 max_vec(const vec3 &a, const vec3 &b);        // max(v1, v2)
-  friend vec3 prod(const vec3 &a, const vec3 &b);           // term by term *
-
-  // necessary friend declarations
-
-  friend vec2 operator * (const mat3 &a, const vec2 &v);    // linear transform
-  friend vec3 operator * (const mat3 &a, const vec3 &v);    // linear transform
-  friend mat3 operator * (const mat3 &a, const mat3 &b);    // matrix 3 product
-};
-
-/****************************************************************
- *                                                              *
- *              4D Vector                                       *
- *                                                              *
- ****************************************************************/
-
-class vec4
-{
-  friend class vec3;
-  friend class mat4;
-
-protected:
-
-  float n[4];
-
-public:
-
-  // Constructors
-
-  vec4();
-  vec4(float x, float y, float z, float w);
-  vec4(const vec4 &v);             // copy constructor
-  vec4(const vec3 &v);             // cast vec3 to vec4
-  vec4(const vec3 &v, float d);    // cast vec3 to vec4
-
-  // Assignment operators
-
-  vec4  &operator  = (const vec4 &v);    // assignment of a vec4
-  vec4  &operator += (const vec4 &v);    // incrementation by a vec4
-  vec4  &operator -= (const vec4 &v);    // decrementation by a vec4
-  vec4  &operator *= (float d);    // multiplication by a constant
-  vec4  &operator /= (float d);    // division by a constant
-
-  // special functions
-
-  float  length()  const;                     // length of a vec4
-  float  length2() const;                     // squared length of a vec4
-  vec4  &normalize();                         // normalize a vec4
-  vec4  &apply(V_FCT_PTR fct);                // apply a func. to each component
-  vec4  &homogenize();
-
-  void   print(FILE *file, const char *name) const; // print vector to a file
-
-  void   set(float x, float y, float z, float a);                        
-
-  float &operator [] (int i);             // indexing
-  const float &operator [] (int i) const; // indexing
-
-  // friends
-
-  friend vec4  operator -  (const vec4 &v);                  // -v1
-  friend vec4  operator +  (const vec4 &a, const vec4 &b);   // v1 + v2
-  friend vec4  operator -  (const vec4 &a, const vec4 &b);   // v1 - v2
-  friend vec4  operator *  (const vec4 &a, float d);         // v1 * 3.0
-  friend vec4  operator *  (float d, const vec4 &a);         // 3.0 * v1
-  friend vec4  operator *  (const mat4 &a, const vec4 &v);   // M . v
-  friend vec4  operator *  (const vec4 &v, const mat4 &a);   // v . M
-  friend float operator *  (const vec4 &a, const vec4 &b);   // dot product
-  friend vec4  operator /  (const vec4 &a, float d);   // v1 / 3.0
-  friend int   operator == (const vec4 &a, const vec4 &b);   // v1 == v2 ?
-  friend int   operator != (const vec4 &a, const vec4 &b);   // v1 != v2 ?
-  //friend ostream& operator << (ostream& s, vec4& v);       // output to stream
-  //friend istream& operator >> (istream& s, vec4& v);       // input from strm.
-  friend void swap(vec4 &a, vec4 &b);                        // swap v1 & v2
-  friend vec4 min_vec(const vec4 &a, const vec4 &b);         // min(v1, v2)
-  friend vec4 max_vec(const vec4 &a, const vec4 &b);         // max(v1, v2)
-  friend vec4 prod   (const vec4 &a, const vec4 &b);         // term by term *
-
-  // necessary friend declarations
-
-  friend vec3 operator * (const mat4 &a, const vec3 &v);     // linear transform
-  friend mat4 operator * (const mat4 &a, const mat4 &b);     // matrix 4 product
-};
-
-/****************************************************************
- *                                                              *
- *             3x3 Matrix                                       *
- *                                                              *
- ****************************************************************/
-
-class mat3
-{
-protected:
-
-  vec3 v[3];
-
-public:
-
-  // Constructors
-
-  mat3();
-  mat3(const vec3 &v0, const vec3 &v1, const vec3 &v2);
-  mat3(const mat3 &m);
-
-  // Assignment operators
-
-  mat3 &operator  = (const mat3  &m);        // assignment of a mat3
-  mat3 &operator += (const mat3  &m);        // incrementation by a mat3
-  mat3 &operator -= (const mat3  &m);        // decrementation by a mat3
-  mat3 &operator *= (float  d);        // multiplication by a constant
-  mat3 &operator /= (float  d);        // division by a constant
-
-  // special functions
-
-  mat3  transpose() const;                    // transpose
-  mat3  inverse() const;                      // inverse
-  mat3 &apply(V_FCT_PTR fct);                 // apply a func. to each element
-
-  void  print(FILE *file, const char *name ) const; // print matrix to a file
-
-  void  set(const vec3 &v0, const vec3 &v1, const vec3 &v2);
-
-  vec3 &operator [] (int i);       // indexing
-  const vec3 &operator [] (int i) const; // indexing
-
-  // friends
-
-  friend mat3 operator -  (const mat3 &a);                     // -m1
-  friend mat3 operator +  (const mat3 &a, const mat3 &b);      // m1 + m2
-  friend mat3 operator -  (const mat3 &a, const mat3 &b);      // m1 - m2
-  friend mat3 operator *  (const mat3 &a, const mat3 &b);      // m1 * m2
-  friend mat3 operator *  (const mat3 &a, float d);            // m1 * 3.0
-  friend mat3 operator *  (float d, const mat3 &a);            // 3.0 * m1
-  friend mat3 operator /  (const mat3 &a, float d);            // m1 / 3.0
-  friend int  operator == (const mat3 &a, const mat3 &b);      // m1 == m2 ?
-  friend int  operator != (const mat3 &a, const mat3 &b);      // m1 != m2 ?
-  //friend ostream& operator << (ostream& s, mat3& m);         // output to stream
-  //friend istream& operator >> (istream& s, mat3& m);         // input from strm.
-  friend void swap(mat3 &a, mat3 &b);                          // swap m1 & m2
-
-  // necessary friend declarations
-
-  friend vec3 operator * (const mat3 &a, const vec3 &v);     // linear transform
-  friend vec2 operator * (const mat3 &a, const vec2 &v);     // linear transform
-};
-
-/****************************************************************
- *                                                              *
- *             4x4 Matrix                                       *
- *                                                              *
- ****************************************************************/
-
-class mat4
-{
-protected:
-
-  vec4 v[4];
-
-public:
-
-  // Constructors
-
-  mat4();
-  mat4(const vec4 &v0, const vec4 &v1, const vec4 &v2, const vec4 &v3);
-  mat4(const mat4 &m);
-  mat4(float a00, float a01, float a02, float a03,
-       float a10, float a11, float a12, float a13,
-       float a20, float a21, float a22, float a23,
-       float a30, float a31, float a32, float a33 );
-
-
-  // Assignment operators
-
-  mat4 &operator  = (const mat4 &m);        // assignment of a mat4
-  mat4 &operator += (const mat4 &m);        // incrementation by a mat4
-  mat4 &operator -= (const mat4 &m);        // decrementation by a mat4
-  mat4 &operator *= (float d);        // multiplication by a constant
-  mat4 &operator /= (float d);        // division by a constant
-
-  // special functions
-
-  mat4  transpose() const;                   // transpose
-  mat4  inverse() const;                     // inverse
-  mat4 &apply(V_FCT_PTR fct);                // apply a func. to each element
-
-  void  print(FILE *file, const char *name) const; // print matrix to a file
-    
-  vec4 &operator [] (int i);       // indexing
-  const vec4 &operator [] (int i) const; // indexing
-
-  void  swap_rows(int i, int j); // swap rows i and j
-  void  swap_cols(int i, int j); // swap cols i and j
-
-  // friends
-
-  friend mat4 operator -  (const mat4 &a);                     // -m1
-  friend mat4 operator +  (const mat4 &a, const mat4 &b);      // m1 + m2
-  friend mat4 operator -  (const mat4 &a, const mat4 &b);      // m1 - m2
-  friend mat4 operator *  (const mat4 &a, const mat4 &b);      // m1 * m2
-  friend mat4 operator *  (const mat4 &a, float d);            // m1 * 4.0
-  friend mat4 operator *  (float d, const mat4 &a);            // 4.0 * m1
-  friend mat4 operator /  (const mat4 &a, float d);            // m1 / 3.0
-  friend int  operator == (const mat4 &a, const mat4 &b);      // m1 == m2 ?
-  friend int  operator != (const mat4 &a, const mat4 &b);      // m1 != m2 ?
-  //friend ostream& operator << (ostream& s, mat4& m);         // output to stream
-  //friend istream& operator >> (istream& s, mat4& m);         // input from strm.
-  friend void swap(mat4 &a, mat4 &b);                          // swap m1 & m2
-
-  // necessary friend declarations
-
-  friend vec4 operator * (const mat4 &a, const vec4 &v);      // linear transform
-  //friend vec4 operator * (const vec4& v, const mat4& a);    // linear transform
-  friend vec3 operator * (const mat4 &a, const vec3 &v);      // linear transform
-  friend vec3 operator * (const vec3 &v, const mat4 &a);      // linear transform
-};
-
-/****************************************************************
- *                                                              *
- *         2D functions and 3D functions                        *
- *                                                              *
- ****************************************************************/
-
-mat3 identity2D   ();                                   // identity 2D
-mat3 translation2D(const vec2 &v);                      // translation 2D
-mat3 rotation2D   (const vec2 &Center, float angleDeg); // rotation 2D
-mat3 scaling2D    (const vec2 &scaleVector);            // scaling 2D
-mat4 identity3D   ();                                   // identity 3D
-mat4 translation3D(const vec3 &v);                      // translation 3D
-mat4 rotation3D   (const vec3 &Axis, float angleDeg);   // rotation 3D
-mat4 rotation3Drad(const vec3 &Axis, float angleRad);   // rotation 3D
-mat4 scaling3D    (const vec3 &scaleVector);            // scaling 3D
-mat4 perspective3D(float d);                            // perspective 3D
-
-vec3 operator * (const vec3 &v, const mat3 &a);
-vec2 operator * (const vec2 &v, const mat3 &a);
-vec3 operator * (const vec3 &v, const mat4 &a);
-vec4 operator * (const vec4 &v, const mat4 &a);
-
-#endif

Deleted: trunk/Build/source/utils/asymptote/arcball.cc
===================================================================
--- trunk/Build/source/utils/asymptote/arcball.cc	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/arcball.cc	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,237 +0,0 @@
-/**********************************************************************
-
-  arcball.cc
-
-
-          --------------------------------------------------
-
-  GLUI User Interface Toolkit (LGPL)
-  Copyright (c) 1998 Paul Rademacher
-     Feb 1998, Paul Rademacher (rademach at cs.unc.edu)
-     Oct 2003, Nigel Stewart - GLUI Code Cleaning
-
-  WWW:    http://sourceforge.net/projects/glui/
-  Forums: http://sourceforge.net/forum/?group_id=92496
-
-  This library is free software; you can redistribute it and/or
-  modify it under the terms of the GNU Lesser General Public
-  License as published by the Free Software Foundation; either
-  version 2.1 of the License, or (at your option) any later version.
-
-  This library is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  Lesser General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public
-  License along with this library; if not, write to the Free Software
-  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-**********************************************************************/
-
-#include "arcball.h"
-
-#include <cstdio>
-
-
-/**************************************** Arcball::Arcball() ****/
-/* Default (void) constructor for Arcball                         */
-
-Arcball::Arcball() 
-{
-    rot_ptr = &rot;
-    init();
-}
-
-/**************************************** Arcball::Arcball() ****/
-/* Takes as argument a mat4 to use instead of the internal rot  */
-
-Arcball::Arcball(mat4 *mtx) 
-{
-    rot_ptr = mtx;
-}
-
-
-/**************************************** Arcball::Arcball() ****/
-/* A constructor that accepts the screen center and arcball radius*/
-
-Arcball::Arcball(const vec2 &_center, float _radius)
-{
-    rot_ptr = &rot;
-    init();
-    set_params(_center, _radius);
-}
-
-
-/************************************** Arcball::set_params() ****/
-
-void Arcball::set_params(const vec2 &_center, float _radius)
-{
-    center      = _center;
-    radius      = _radius;
-}
-
-/*************************************** Arcball::init() **********/
-
-void Arcball::init()
-{
-    center.set( 0.0, 0.0 );
-    radius         = 1.0;
-    q_now          = quat_identity();
-    *rot_ptr       = identity3D();
-    q_increment    = quat_identity();
-    rot_increment  = identity3D();
-    is_mouse_down  = false;
-    is_spinning    = false;
-    damp_factor    = 0.0;
-    zero_increment = true;
-}
-
-/*********************************** Arcball::mouse_to_sphere() ****/
-
-vec3 Arcball::mouse_to_sphere(const vec2 &p)
-{
-    float mag;
-    vec2  v2 = (p - center) / radius;
-    vec3  v3( v2[0], v2[1], 0.0 );
-
-    mag = v2*v2;
-
-    if ( mag > 1.0 ) 
-        v3.normalize();
-    else 
-        v3[VZ] = (float) sqrt( 1.0 - mag );
-
-    /* Now we add constraints - X takes precedence over Y */
-    if ( constraint_x ) 
-    {
-        v3 = constrain_vector( v3, vec3( 1.0, 0.0, 0.0 ));
-    } 
-    else if ( constraint_y ) 
-        {
-            v3 = constrain_vector( v3, vec3( 0.0, 1.0, 0.0 ));
-        }
-
-    return v3;
-}
-
-
-/************************************ Arcball::constrain_vector() ****/
-
-vec3 Arcball::constrain_vector(const vec3 &vector, const vec3 &axis)
-{
-    return (vector-(vector*axis)*axis).normalize();
-}
-
-/************************************ Arcball::mouse_down() **********/
-
-void Arcball::mouse_down(int x, int y)
-{
-    down_pt.set( (float)x, (float) y );
-    is_mouse_down = true;
-
-    q_increment   = quat_identity();
-    rot_increment = identity3D();
-    zero_increment = true;
-}
-
-
-/************************************ Arcball::mouse_up() **********/
-
-void Arcball::mouse_up()
-{
-    q_now = q_drag * q_now;
-    is_mouse_down = false;
-}
-
-
-/********************************** Arcball::mouse_motion() **********/
-
-void Arcball::mouse_motion(int x, int y, int shift, int ctrl, int alt)
-{
-    /* Set the X constraint if CONTROL key is pressed, Y if ALT key */
-    set_constraints( ctrl != 0, alt != 0 );
-
-    vec2 new_pt( (float)x, (float) y );
-    vec3 v0 = mouse_to_sphere( down_pt );
-    vec3 v1 = mouse_to_sphere( new_pt );
-
-    vec3 cross = v0^v1;
-
-    q_drag.set( cross, v0 * v1 );
-
-    //    *rot_ptr = (q_drag * q_now).to_mat4();
-    mat4 temp = q_drag.to_mat4();
-    *rot_ptr = *rot_ptr * temp;
-
-    down_pt = new_pt;
-
-    /* We keep a copy of the current incremental rotation (= q_drag) */
-    q_increment   = q_drag;
-    rot_increment = q_increment.to_mat4();
-
-    set_constraints(false, false);
-
-    if ( q_increment.s < .999999 ) 
-    {
-        is_spinning = true;
-        zero_increment = false;
-    }
-    else 
-    {
-        is_spinning = false;
-        zero_increment = true;
-    }
-}
-
-
-/********************************** Arcball::mouse_motion() **********/
-
-void Arcball::mouse_motion(int x, int y)
-{
-    mouse_motion(x, y, 0, 0, 0);
-}
-
-
-/***************************** Arcball::set_constraints() **********/
-
-void Arcball::set_constraints(bool _constraint_x, bool _constraint_y)
-{
-    constraint_x = _constraint_x;
-    constraint_y = _constraint_y;
-}
-
-/***************************** Arcball::idle() *********************/
-
-void Arcball::idle()
-{
-    if (is_mouse_down) 
-    {
-        is_spinning = false;
-        zero_increment = true;
-    }
-
-    if (damp_factor < 1.0f) 
-        q_increment.scale_angle(1.0f - damp_factor);
-
-    rot_increment = q_increment.to_mat4();
-
-    if (q_increment.s >= .999999f) 
-    {
-        is_spinning = false;
-        zero_increment = true;
-    }
-}
-
-
-/************************ Arcball::set_damping() *********************/
-
-void Arcball::set_damping(float d)
-{
-    damp_factor = d;
-}
-
-
-
-
-

Deleted: trunk/Build/source/utils/asymptote/arcball.h
===================================================================
--- trunk/Build/source/utils/asymptote/arcball.h	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/arcball.h	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,95 +0,0 @@
-/**********************************************************************
-
-  arcball.h
-
-  GLUI User Interface Toolkit (LGPL)
-  Copyright (c) 1998 Paul Rademacher
-     Feb 1998, Paul Rademacher (rademach at cs.unc.edu)
-     Oct 2003, Nigel Stewart - GLUI Code Cleaning
-
-
-  WWW:    http://sourceforge.net/projects/glui/
-  Forums: http://sourceforge.net/forum/?group_id=92496
-
-  This library is free software; you can redistribute it and/or
-  modify it under the terms of the GNU Lesser General Public
-  License as published by the Free Software Foundation; either
-  version 2.1 of the License, or (at your option) any later version.
-
-  This library is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  Lesser General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public
-  License along with this library; if not, write to the Free Software
-  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
- ---------------------------------------------------------------------
-
-  A C++ class that implements the Arcball, as described by Ken
-  Shoemake in Graphics Gems IV.  
-  This class takes as input mouse events (mouse down, mouse drag,
-  mouse up), and creates the appropriate quaternions and 4x4 matrices
-  to represent the rotation given by the mouse.  
-  
-  This class is used as follows:
-  - initialize [either in the constructor or with set_params()], the
-    center position (x,y) of the arcball on the screen, and the radius
-  - on mouse down, call mouse_down(x,y) with the mouse position
-  - as the mouse is dragged, repeatedly call mouse_motion() with the
-    current x and y positions.  One can optionally pass in the current
-    state of the SHIFT, ALT, and CONTROL keys (passing zero if keys
-    are not pressed, non-zero otherwise), which constrains
-    the rotation to certain axes (X for CONTROL, Y for ALT).
-  - when the mouse button is released, call mouse_up()
-
-  Axis constraints can also be explicitly set with the 
-  set_constraints() function.
-
-  The current rotation is stored in the 4x4 float matrix 'rot'.
-  It is also stored in the quaternion 'q_now'.  
-
-**********************************************************************/
-
-#ifndef GLUI_ARCBALL_H
-#define GLUI_ARCBALL_H
-
-#include "algebra3.h"
-#include "quaternion.h"
-
-class Arcball 
-{
-public:
-    Arcball();
-    Arcball(mat4 *mtx);
-    Arcball(const vec2 &center, float radius);
-
-    void  set_damping(float d);
-    void  idle();
-    void  mouse_down(int x, int y);
-    void  mouse_up();
-    void  mouse_motion(int x, int y, int shift, int ctrl, int alt);
-    void  mouse_motion(int x, int y);
-    void  set_constraints(bool constrain_x, bool constrain_y);
-    void  set_params(const vec2 &center, float radius);  
-    void  init();
-
-    vec3  constrain_vector(const vec3 &vector, const vec3 &axis);
-    vec3  mouse_to_sphere(const vec2 &p);
- 
-  //public:
-    int   is_mouse_down;  /* true for down, false for up */
-    int   is_spinning;
-    quat  q_now, q_down, q_drag, q_increment;
-    vec2  down_pt;
-    mat4  rot, rot_increment;
-    mat4  *rot_ptr;
-
-    bool  constraint_x, constraint_y;
-    vec2  center;
-    float radius, damp_factor;
-    int   zero_increment;
-};
-
-#endif

Modified: trunk/Build/source/utils/asymptote/asy-keywords.el
===================================================================
--- trunk/Build/source/utils/asymptote/asy-keywords.el	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/asy-keywords.el	2019-10-06 17:17:34 UTC (rev 52300)
@@ -2,7 +2,7 @@
 ;; This file is automatically generated by asy-list.pl.
 ;; Changes will be overwritten.
 ;;
-(defvar asy-keywords-version "2.52")
+(defvar asy-keywords-version "2.56")
 
 (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 ))

Modified: trunk/Build/source/utils/asymptote/asy.list
===================================================================
--- trunk/Build/source/utils/asymptote/asy.list	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/asy.list	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,1189 +1,180 @@
-void drawstrokepath(picture pic=<default>, path g, pen strokepen, pen p=<default>);
-real legendlinelength;
-bool prc(string format=<default>);
-light currentlight;
-pen royalblue;
-real arrowdir;
-filltype filltype(int type=<default>, pen fillpen=<default>, pen drawpen=<default>, void fill2(frame f, path[] g, pen fillpen));
-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;
-pen mean(pen[] p, real opacity(real[])=<default>);
-pen[] mean(pen[][] palette, real opacity(real[])=<default>);
-pen squarecap;
-string[] split(string s, string delimiter=<default>);
-path[] plus;
+string stripfile(string s);
+string stripsuffix(string f, string suffix=<default>);
+real cbrt(real x);
+real[] cbrt(real[] a);
+pen RGB(int r, int g, int b);
 cputime cputime();
-real inches;
-pair SW;
-real inch;
-picture legenditem(Legend legenditem, real linelength);
-marginT EndMargin(path, pen);
-pen mediumgrey;
-pen darkcyan;
-coord[] maxcoords(coord[] in, bool operator <=(coord, coord));
-coord[] maxcoords(coord[] in, bool operator <=(coord, coord));
-real legendhskip;
-void addSaveFunction(void s()());
-pen olive;
-void copyPairOrTriple(pairOrTriple dest, pairOrTriple src);
-pen zerowinding;
-pen deepmagenta;
-path[] margin(path[] g, real xmargin, real ymargin);
-string file(string s);
-plain_bounds plain_bounds;
-pen mediumyellow;
-slice lastcut(path p, path knife);
-pen darkgreen;
+string stripdirectory(string s);
+real sqrtEpsilon;
+string stripextension(string s);
+version version;
+void nosetpagesize();
+void texpreamble(string s);
+pen beveljoin;
+string cputimeformat;
+real Cos(real deg);
+string insert(string s, int pos, string t);
+marginT EndDotMargin(path, pen);
+pen heavyred;
+pen black;
+pen heavyblue;
+filltype dotfilltype;
+pen heavygreen;
+pen heavycyan;
+marginT PenMargin(path, pen)(real begin, real end);
+marginT PenMargin(path, pen);
+int realDigits;
+pen heavymagenta;
+marginT PenMargins(path, pen);
+void newl(file file);
+void seek(file f, int pos);
 string verbatim(string s);
 pen heavygray;
-pen darkred;
-pair E;
-plain_scaling plain_scaling;
-pen darkgray;
-frame orientation(frame);
-void progress(bool3 init=<default>);
-pen salmon;
-pen mediummagenta;
-pair arcdir(path p, real L);
-pen mediumcyan;
-pen Pentype(int n);
-triple gettriple(string name=<default>, triple default=<default>, string prompt=<default>, bool store=<default>);
-pen Yellow;
-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));
-pair[] pairs(real[] x, real[] y);
-void eval(code s, bool embedded=<default>);
-void eval(string s, bool embedded=<default>);
-real cm;
-pen mediumgreen;
-pen heavygreen;
-pen dashdotted;
-pen deepblue;
-string graphicscale(real x);
-pen mediumblue;
-transform invert;
-pair NNW;
-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>);
-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));
-filltype RadialShadeDraw(real xmargin=<default>, real ymargin=<default>, pen penc, pen penr, pen drawpen=<default>);
-marginT BeginDotMargin(path, pen);
-marker[] Mark;
-marker Mark(int n);
-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 darkolive;
-pen Dotted;
-pen Dotted(pen p=<default>);
-string math(string s);
-transform fixedscaling(picture pic=<default>, pair min, pair max, pen p=<default>, bool warn=<default>);
-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>);
-path unitcircle;
-arrowhead DefaultHead;
-pen white;
-position EndPoint;
-transform Rotate(transform)(pair z);
-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;
-void bar(picture pic, pair a, pair d, pen p=<default>);
-picture bar(pair a, pair d, pen p=<default>);
-pen deepcyan;
-pen dotted;
-pair reldir(path p, real l);
-pen pink;
-pen TimesRoman(string series=<default>, string shape=<default>);
-pen palemagenta;
-int mantissaBits;
-pen lightolive;
-path arrowbase(path r, pair y, real t, real size);
-pen[] monoPen;
-bool CW;
-pen Cyan;
-string outprefix(string prefix=<default>);
-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);
-object object(Label L);
-marginT EndPenMargin(path, pen);
-pair NNE;
-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));
-pen roundjoin;
-void addArrow(picture pic, arrowhead arrowhead, path g, pen p, real size, real angle, filltype filltype, real position);
-pen lightgray;
-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;
-pen lightyellow;
-marginT Margin(path, pen)(real begin, real end);
-marginT Margin(path, pen);
-side NoSide;
-file stdout;
-frame Seascape(frame f);
-pair up;
-pen ZapfChancery(string series=<default>, string shape=<default>);
-pair left;
-bool prconly(string format=<default>);
-pen deepgreen;
-pen lightmagenta;
-real bracedefaultratio;
-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;
-pen deepgray;
-string defaultformat(int n, string trailingzero=<default>, bool fixed=<default>, bool signed=<default>);
-string defaultformat;
-pen lightcyan;
-pen paleblue;
-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);
-transform scaleless(transform t);
-pen RGB(int r, int g, int b);
-pen thin();
-real arcarrowangle;
-void restoredefaults();
-pen longdashdotted;
-void usepackage(string s, string options=<default>);
-pen dashed;
-string TeXify(string s);
-string graphic(string name, string options=<default>);
-frame Portrait(frame f);
-real braceinnerangle;
-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);
-void usersetting();
-bool prc0(string format=<default>);
-pair rectify(pair dir);
-arrowhead TeXHead;
-void beep();
-real labelmargin;
-real labelmargin(pen p=<default>);
-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);
-pair W;
-pen magenta;
-pair WSW;
-pen nobasealign;
-frame Landscape(frame f);
-real camerafactor;
-pen lightred;
-path trim(path g, real begin, real end);
-marginT DotMargin(path, pen)(real begin, real end);
-marginT DotMargin(path, pen);
-pen squarepen;
-pen deepyellow;
-real barsize(pen p=<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>);
-string ask(string prompt);
-frame[] fit2(picture[] pictures, picture all);
-pen Pen(int n);
-pair ENE;
-pen Courier(string series=<default>, string shape=<default>);
-void makedraw(frame f, path g, pen p, int depth=<default>);
-pair down;
-path arc(pair c, real r, real angle1, real angle2);
-path arc(pair c, explicit pair z1, explicit pair z2, bool direction=<default>);
-path arc(pair c, real r, real angle1, real angle2, bool direction);
-pair right;
-string outformat(string format=<default>);
-filltype Fill;
-filltype Fill(real xmargin=<default>, real ymargin=<default>, pen p=<default>);
-pen Palatino(string series=<default>, string shape=<default>);
-pair[] intersectionpoints(path p, path q, real fuzz=<default>);
-pair[] intersectionpoints(explicit path[] p, explicit path[] q, real fuzz=<default>);
-real arcarrowsize(pen p=<default>);
-real calculateScaling(string dir, coord[] coords, real size, bool warn=<default>);
-real calculateScaling(string dir, coord[] coords, real size, bool warn=<default>);
-real calculateScaling(string dir, coord[] m, coord[] M, real size, bool warn=<default>);
-real calculateScaling(string dir, coord[] m, coord[] M, real size, bool warn=<default>);
-real expansionfactor;
-bool BeginArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
-bool BeginArcArrow(picture, path, pen, marginT(path, pen));
-position BeginPoint;
-real arrowhookfactor;
-bool finite(real x);
-bool finite(pair z);
-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);
-pair intersectionpoint(path p, path q, real fuzz=<default>);
-real getreal(string name=<default>, real default=<default>, string prompt=<default>, bool store=<default>);
-pen darkbrown;
-int sourceline(string file, string text);
-void updatefunction();
-bool implicitshipout;
-void buildRestoreDefaults()();
-path[] operator ^^(path p, path q);
-path[] operator ^^(explicit path[] p, path q);
-path[] operator ^^(path p, explicit path[] q);
-path[] operator ^^(explicit path[] p, explicit path[] q);
-real arrow2sizelimit;
-filltype FillDraw;
-filltype FillDraw(real xmargin=<default>, real ymargin=<default>, pen fillpen=<default>, pen drawpen=<default>);
-void pause(string w=<default>);
-int ocgindex;
-pen springgreen;
 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>);
-real circlescale;
-bool ignore;
-pen darkblue;
-real reltime(path p, real l);
-void marknodes(picture pic=<default>, frame f, path g);
-int JOIN_OUT;
-projection currentprojection;
-real arrowsizelimit;
-pair endpoint(path p);
-slice firstcut(path p, path knife);
-frame UpsideDown(frame f);
-pair viewportmargin;
-pen nullpen;
-void save()();
-real dotfactor;
-pen palecyan;
-node node(void d(frame f, transform t, transform T, pair lb, pair rt), string key=<default>);
-frame pack(pair align=<default> ... object[] inset);
-marginT BeginMargin(path, pen);
-path buildcycle(... path[] p);
-marker markthin(path g, pen p=<default>, real thin(real fraction)=<default>, filltype filltype=<default>);
-void activatequote(picture pic=<default>);
-int undefined;
-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>);
-bool BeginArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
-bool BeginArrow(picture, path, pen, marginT(path, pen));
-pen roundcap;
-void buildRestoreThunk()();
-void overloadedMessage(file file);
-frame currentpatterns;
-real arrowfactor;
-pen heavyred;
-pen black;
-void Draw(picture pic=<default>, path g, pen p=<default>);
-filltype Draw;
-void Draw(picture pic=<default>, explicit path[] g, pen p=<default>);
-filltype Draw(real xmargin=<default>, real ymargin=<default>, pen p=<default>);
-void tab(file file);
-marker marker(frame f=<default>, void markroutine(picture pic=<default>, frame f, path g)=<default>, bool above=<default>);
-marker marker(path[] g, void markroutine(picture pic=<default>, frame f, path g)=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-bool CCW;
-void usetypescript(string s, string encoding=<default>);
-path randompath(int n, bool cumulate=<default>, guide join(... guide[])=<default>);
-void()()[] array(int n, void value()(), int depth=<default>);
-bool[] array(int n, bool value, int depth=<default>);
-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>);
-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>);
-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>);
-path[] array(int n, path value, int depth=<default>);
-frame[] array(int n, frame value, int depth=<default>);
-pen[][] array(int n, pen[] 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>);
-guide[] array(int n, guide value, int depth=<default>);
-pen[] array(int n, pen value, int depth=<default>);
-string[] array(string s);
-real[] uniform(real a, real b, int n);
-pair viewportsize;
-picture currentpicture;
-pen palegreen;
-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(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>);
-picture[] concat(... picture[][]);
-real[] concat(... real[][]);
-object[] concat(... object[][]);
-pair[] concat(... pair[][]);
-Label[] concat(... Label[][]);
-pen[] concat(... pen[][]);
-coord[] concat(... coord[][]);
-coord[] concat(... coord[][]);
-Legend[] concat(... Legend[][]);
-path[] concat(... path[][]);
-int[] concat(... int[][]);
-void()()[] concat(... void()()[][]);
-bool3[] concat(... bool3[][]);
-string[] concat(... string[][]);
-triple[] concat(... triple[][]);
-marker[] concat(... marker[][]);
-frame[] concat(... frame[][]);
-guide[] concat(... guide[][]);
-bool[] concat(... bool[][]);
-pair N;
+real[] mintimes(path p);
+real[] mintimes(path3 p);
+bool straight(path p, int t);
+bool straight(path3 p, int t);
+pen makepen(path p);
 real dotsize(pen p=<default>);
-real pt;
-settings settings;
-int MoveQuiet;
-pair WNW;
-pen palegray;
-pen miterjoin;
-arrowhead SimpleHead;
-real arrowangle;
-frame dotframe(pen p=<default>, filltype filltype=<default>);
-frame dotframe;
-real arcarrowfactor;
-real mm;
-pen heavyblue;
-filltype dotfilltype;
-plain plain;
-int getint(string name=<default>, int default=<default>, string prompt=<default>, bool store=<default>);
-int bitreverse(int a, int bits);
-int popcount(int a);
-int NOT(int a);
-int XOR(int a, int b);
-int OR(int a, int b);
-real[][] scale3(real s);
-int AND(int a, int b);
-real[] cubicroots(real a, real b, real c, real d);
+real[] curlSpecifier(guide g, int t);
+real straightness(path3 p, int t);
+real straightness(triple z0, triple c0, triple c1, triple z1);
+real log10(real x);
+real[] log10(real[] a);
+pen paleblue;
+bool prc0(string format=<default>);
+string xasyKEY();
+void xasyKEY(string s);
+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>);
+real barfactor;
+pen Magenta;
+real cos(real x);
+real[] cos(real[] a);
+pair cos(explicit pair z);
+int intMax;
+bool cyclic(guide g);
+bool cyclic(path p);
+bool cyclic(path3 p);
+void printBytecode(<open>);
+transform Rotate(transform)(pair z);
+transform Rotate(transform t);
+path subpath(path p, int a, int b);
+path subpath(path p, real a, real b);
+path3 subpath(path3 p, int a, int b);
+path3 subpath(path3 p, real a, real b);
+bool isnan(real x);
+string jobname(string name);
+void print_random_addresses(int n=<default>);
 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>);
 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>);
-real erf(real x);
-real Yn(int n, real x);
-real Jn(int n, real x);
-light light(pen diffuse=<default>, pen specular=<default>, pen background=<default>, real x, real y, real z);
-light light(explicit light light);
-light light(pen diffuse=<default>, pen specular=<default>, pen background=<default>, real specularfactor=<default> ... triple[] position);
-light light(pen[] diffuse, 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);
-int Round(real x);
-int Ceil(real x);
-marginT BeginPenMargin(path, pen);
-int round(real x);
-int floor(real x);
-pen extendcap;
-int ceil(real x);
-int rand();
-int sgn(real x);
-int quotient(int x, int y);
-real insphere(triple a, triple b, triple c, triple d, triple e);
-path3 path3(triple[] pre, triple[] point, triple[] post, bool[] straight, bool cyclic);
-real incircle(pair a, pair b, pair c, pair d);
-real atan2(real y, real x);
-bool inside(explicit path[] g, pair z, pen fillrule=<default>);
-bool inside(path g, pair z, pen fillrule=<default>);
-int inside(path p, path q, pen fillrule=<default>);
-pair inside(path p, pen fillrule=<default>);
-real erfc(real x);
-int windingnumber(path[] p, pair z);
-real relativedistance(real theta, real phi, real t, bool atleast);
+pen darkcyan;
 string[] file3;
 real[] maxtimes(path p);
 real[] maxtimes(path3 p);
-real[] mintimes(path p);
-real[] mintimes(path3 p);
-pair maxAfterTransform(transform t, path[] p);
-pair minAfterTransform(transform t, path[] p);
-pair extension(pair p, pair q, pair p, pair q);
-real[][] intersections(path p, path q, real fuzz=<default>);
-real[] intersections(path p, explicit pair a, explicit pair b, real fuzz=<default>);
-real[][] intersections(path3 p, path3 q, real fuzz=<default>);
-real[][] intersections(path3 p, triple[][] p, real fuzz=<default>);
-real[] intersect(path p, path q, real fuzz=<default>);
-real[] intersect(path3 p, path3 q, real fuzz=<default>);
-real[] intersect(path3 p, triple[][] p, real fuzz=<default>);
-real dirtime(path p, pair z);
-real arctime(path p, real l);
-real arctime(path3 p, real dval);
-position Relative(real position);
-side Relative(explicit pair align);
-marginT Margins(path, pen);
-pair truepoint(picture pic=<default>, pair dir, bool user=<default>);
-real arclength(path p);
-real arclength(path3 p);
-bool piecewisestraight(path p);
-bool piecewisestraight(path3 p);
-path nurb(pair z0, pair z1, pair z2, pair z3, real w0, real w1, real w2, real w3, int m);
-path subpath(path p, int a, int b);
-path subpath(path p, real a, real b);
-path3 subpath(path3 p, int a, int b);
-path3 subpath(path3 p, real a, real b);
-real radius(path p, real t);
-real radius(path3 p, real t);
-real radius(triple z0, triple c0, triple c1, triple z1, real t);
-pair accel(path p, int t, int sign=<default>);
-pair accel(path p, real t);
-triple accel(path3 p, int t, int sign=<default>);
-triple accel(path3 p, real t);
-pair precontrol(path p, int t);
-pair precontrol(path p, real t);
-triple precontrol(path3 p, int t);
-triple precontrol(path3 p, real t);
-string defaultfilename;
-real longitude(triple v, bool warn=<default>);
-filltype NoFill;
-real colatitude(triple v, bool warn=<default>);
-marker nomarker;
-pair beginpoint(path p);
-real azimuth(triple v, bool warn=<default>);
-real polar(triple v, bool warn=<default>);
-real zpart(triple v);
-pair bezierPPP(pair a, pair b, pair c, pair d);
-triple bezierPPP(triple a, triple b, triple c, triple d);
-pair SSE;
-pair bezierP(pair a, pair b, pair c, pair d, real t);
-triple bezierP(triple a, triple b, triple c, triple d, real t);
-marginT TrueMargin(path, pen)(real begin, real end);
-pair bezier(pair a, pair b, pair c, pair d, real t);
-triple bezier(triple a, triple b, triple c, triple d, real t);
-pair realmult(pair z, pair w);
-triple realmult(triple u, triple v);
-int Floor(real x);
-pair gamma(explicit pair z);
-real gamma(real x);
-pair expi(real angle);
-triple expi(real polar, real azimuth);
-pair dir(real degrees);
-pair dir(explicit pair z);
-triple dir(explicit triple z);
-triple dir(real colatitude, real longitude);
-pair dir(path p, int t, int sign=<default>, bool normalize=<default>);
-pair dir(path p, real t, bool normalize=<default>);
-triple dir(path3 p, int t, int sign=<default>, bool normalize=<default>);
-triple dir(path3 p, real t, bool normalize=<default>);
-pair dir(path p);
-pair dir(path p, path q);
-real aTan(real x);
-real aCos(real x);
-real aSin(real x);
-real arrowsize(pen p=<default>);
-real Tan(real deg);
-real Cos(real deg);
-frame legend(picture pic=<default>, int perline=<default>, real xmargin=<default>, real ymargin=<default>, real linelength=<default>, real hskip=<default>, real vskip=<default>, real maxwidth=<default>, real maxheight=<default>, bool hstretch=<default>, bool vstretch=<default>, pen p=<default>);
-picture legend(Legend[] Legend, int perline=<default>, real linelength, real hskip, real vskip, real maxwidth=<default>, real maxheight=<default>, bool hstretch=<default>, bool vstretch=<default>);
-real Degrees(real radians);
-real radians(real degrees);
-real angle(pair z, bool warn=<default>);
-real angle(transform t);
-side Center;
-real ypart(pair z);
-real ypart(triple v);
-real xpart(pair z);
-real xpart(triple v);
-int seconds(string t=<default>, string format=<default>);
-pen rgba(real[] a);
-real[] rgba(pen p);
-string time(string format=<default>);
-string time(int seconds, string format=<default>);
-string string(int x);
-string string(real x, int digits=<default>);
-int ascii(string s);
-side RightSide;
-string replace(string s, string[][] translate);
-string replace(string s, string before, string after);
-pen lightgrey;
-string upcase(string s);
-pen mediumgray;
-string downcase(string s);
-string substr(string s, int pos, int n=<default>);
-string insert(string s, int pos, string t);
-int rfind(string s, string t, int pos=<default>);
-void purge(int divisor=<default>);
-int animate(string args=<default>, string file=<default>, string format=<default>);
-int convert(string args=<default>, string file=<default>, string format=<default>);
-real sqrtEpsilon;
-string stripextension(string s);
-string stripfile(string s);
-string stripdirectory(string s);
-void warning(string s, string t, bool position=<default>);
+filltype FillDraw;
+filltype FillDraw(real xmargin=<default>, real ymargin=<default>, pen fillpen=<default>, pen drawpen=<default>);
+void initdefaults();
+void erase(frame f);
+string erase(string s, int pos, int n);
+void erase(picture pic=<default>);
+pair E;
+int Ceil(real x);
+pair I;
+pair SSW;
+pen magenta;
+pair WSW;
+pair N;
+bool view();
+void usersetting();
 pair S;
 void nowarn(string s);
-void warn(string s);
-void breakpoints();
-void stop(string file, int line, code s=<default>);
-void stop(string file, string text, code s=<default>);
-string locatefile(string file);
-void breakpoint(code s=<default>);
-void atbreakpoint(string f(string, int, int, code));
-string phantom(string s);
-void atexit(void f());
-void atexit()();
+transform rotate(real angle, pair z=<default>);
+int quotient(int x, int y);
+transform rotation(transform t);
+pair W;
+int rand();
+pen ZapfChancery(string series=<default>, string shape=<default>);
+int XOR(int a, int b);
 void atupdate(void f());
 void atupdate()();
-string outname();
-string mktemp(string s);
-int rename(string from, string to);
-real arrowbarb;
-pen yellow;
-int delete(string s);
-void seekeof(file f);
-pen heavymagenta;
-marginT PenMargins(path, pen);
-void newl(file file);
-void seek(file f, int pos);
-bool Arrows(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
-bool Arrows(picture, path, pen, marginT(path, pen));
-int tell(file f);
-void DOSendl(file file);
-string debugger(string file, int line, int column, code s=<default>);
-string getc(file f);
-void flush(file f);
-pen blue;
-pen evenodd;
-int precision(file f=<default>, int digits=<default>);
-void close(file f);
-void clear(file f);
-void clear(string file, int line);
-void clear();
-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 eol(file f);
-bool eof(file f);
-pen paleyellow;
-file output(string name=<default>, bool update=<default>, string comment=<default>, string mode=<default>);
+pen zerowinding;
+void atbreakpoint(string f(string, int, int, code));
+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));
+bool MidArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
+bool MidArcArrow(picture, path, pen, marginT(path, pen));
+void grestore(frame f);
+pair extension(pair p, pair q, pair p, pair q);
+pen extendcap;
+int ceil(real x);
+pen thick(pen p=<default>);
+pair left;
+int Suppress;
 file input(string name=<default>, bool check=<default>, string comment=<default>, string mode=<default>);
-pair bezierPP(pair a, pair b, pair c, pair d, real t);
-triple bezierPP(triple a, triple b, triple c, triple d, real t);
-real[] _projection();
-triple maxbezier(triple[][] p, triple b);
-triple minbezier(triple[][] p, triple b);
-real legendvskip;
-pen darkmagenta;
-real change2(triple[][] a);
-pair NW;
-real norm(real[] a);
-real norm(real[][] a);
-real norm(triple[][] a);
-int[][] triangulate(pair[] z);
-pair[] fft(pair[] a, int sign=<default>);
-real simpson(real f(real), real a, real b, real acc=<default>, real dxmax=<default>);
-pen[] colorPen;
-real _findroot(real f(real), real a, real b, real tolerance, real fa, real fb);
-real newton(int iterations=<default>, real f(real), real fprime(real), real x, bool verbose=<default>);
-real newton(int iterations=<default>, real f(real), real fprime(real), real x1, real x2, bool verbose=<default>);
-real[] tridiagonal(real[] a, real[] b, real[] c, real[] f);
-void filldraw(picture pic=<default>, path[] g, pen fillpen=<default>, pen drawpen=<default>);
-void filldraw(frame f, path[] g, pen fillpen=<default>, pen drawpen=<default>);
-real dot(real[] a, real[] b);
-pair dot(pair[] a, pair[] b);
-real dot(explicit pair z, explicit pair w);
-real dot(triple u, triple v);
-void dot(picture pic=<default>, Label[] L=<default>, explicit path g, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
-marker dot(pen p=<default>, filltype filltype=<default>);
-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>);
-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);
-real[][] AtA(real[][] a);
-real[] solve(real[][] a, real[] b, bool warn=<default>);
-real[][] solve(real[][] a, real[][] b, bool warn=<default>);
-scaleT scaleT(real T(real x), real Tinv(real x), bool logarithmic=<default>, bool automin=<default>, bool automax=<default>);
-string baseline(string s, string template=<default>);
-int[] findall(bool[] a);
-bool BeginBar(picture, path, pen, marginT(path, pen));
-bool BeginBar(picture, path, pen, marginT(path, pen))(real size=<default>);
-triple perp(triple v, triple u);
-int find(bool[] a, int n=<default>);
-int find(string s, string t, int pos=<default>);
-real degrees(pair z, bool warn=<default>);
-real degrees(real radians);
-bool[] operator !(bool[] a);
-bool operator !(bool b);
-int[] sequence(int n);
-pen[][] sequence(pen[] 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);
-guide[] sequence(guide f(int), int n);
-pen[] sequence(pen f(int), int n);
-void()()[] sequence(void f()()(int), int n);
-bool[] sequence(bool f(int), int n);
-string[] sequence(string f(int), int n);
-pair[][] sequence(pair[] f(int), int n);
-bool3[] sequence(bool3 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);
-real[][] sequence(real[] f(int), int n);
-real[] sequence(real f(int), int n);
-int[] sequence(int n, int m);
-triple[] sequence(triple f(int), int n);
-path[] sequence(path f(int), int n);
-frame[] sequence(frame f(int), int n);
-int[] complement(int[] a, int n);
-path[] complement(frame f, path[] g);
-void saveline(string name, string value, bool store=<default>);
-string readline(string prompt=<default>, string name=<default>, bool tabcompletion=<default>);
-real unitrand();
-string[] history(string name, int n=<default>);
-string[] history(int n=<default>);
-path[] _strokepath(path g, pen p=<default>);
-path[][] textpath(string[] s, pen[] p);
-marginT NoMargin(path, pen);
-marginT NoMargin(path, pen)();
-path[][] _texpath(string[] s, pen[] p);
 int SuppressQuiet;
 real[] texsize(string s, pen p=<default>);
-bool labels(frame f);
-slice cut(path p, path knife, int n);
-bool is3D(frame f);
-bool is3D(string format=<default>);
-transformation transformation(real[][] modelview);
-transformation transformation(real[][] modelview, real[][] projection);
-pair maxratio(frame f);
-pair maxratio(triple[][] p, pair b);
-pair maxratio(path3 g);
-pair minratio(frame f);
-pair minratio(triple[][] p, pair b);
-pair minratio(path3 g);
-triple size3(frame f);
-void size3(picture pic=<default>, real x, real y=<default>, real z=<default>, bool keepAspect=<default>);
-triple max3(frame f);
-triple max3(pen p);
-pair unit(pair z);
-triple unit(triple v);
-triple min3(frame f);
-triple min3(pen p);
-void drawpixel(frame f, triple v, pen p, real width=<default>);
-void drawPRCtube(frame f, path3 center, path3 g, pen[] p, real opacity, real shininess);
-void begin(picture pic=<default>, string name, string id=<default>, bool visible=<default>);
-void drawPRCdisk(frame f, real[][] t, pen[] p, real opacity, real shininess);
-int CLZ(int a);
-void drawPRCsphere(frame f, real[][] t, bool half=<default>, pen[] p, real opacity, real shininess, int type);
-string[] spinner;
-real[] times(path p, real x);
-real[] times(path p, explicit pair z);
-void drawbeziertriangle(frame f, triple[][] p, triple center, bool straight, pen[] p, real opacity, real shininess, real metallic, real fresnel0, real prcshininess, pen[] colors, int interaction, bool prc=<default>);
-void draw(frame f, triple[][] p, triple center, bool straight, pen[] p, real opacity, real shininess, real metallic, real fresnel0, real prcshininess, pen[] colors, int interaction, bool prc=<default>);
-void draw(frame f, triple[] p, real[] knot, real[] weights=<default>, pen p);
-void draw(frame f, triple[][] p, real[] uknot, real[] vknot, real[][] weights=<default>, pen[] p, real opacity, real shininess, real metallic, real fresnel0, real prcshininess, pen[] colors);
-void draw(frame f, triple[] v, int[][] vi, triple[] n, int[][] ni, pen[] p, real opacity, real shininess, real metallic, real fresnel0, 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>), pair position, 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(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>);
-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(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, guide[] 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>);
-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[][] 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>);
-void asy(string format, bool overwrite=<default> ... string[] s);
-bool latex();
 string nativeformat();
-path unstraighten(path p);
-path3 unstraighten(path3 p);
-void _image(frame f, real[][] data, pair initial, pair final, pen[] palette=<default>, transform t=<default>, bool copy=<default>, bool antialias=<default>);
-void _image(frame f, pen[][] data, pair initial, pair final, transform t=<default>, bool copy=<default>, bool antialias=<default>);
-void _image(frame f, pen f(int, int), int width, int height, pair initial, pair final, transform t=<default>, bool antialias=<default>);
-void layer(frame f);
-void layer(picture pic=<default>);
-void texreset();
-void _labelpath(frame f, string s, string size, path g, string justify, pair offset, pen p);
-real arrowtexfactor;
-void comma(file file);
-void deletepreamble();
-version version;
-void nosetpagesize();
-void texpreamble(string s);
-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 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 pic=<default>, Label L);
-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(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(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(frame f, transform t=<default>, Label L);
-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 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);
-void endgroup(picture pic=<default>);
-void begingroup(frame f);
-void begingroup(picture pic=<default>);
-bool MidArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
-bool MidArcArrow(picture, path, pen, marginT(path, pen));
-void grestore(frame f);
-void drawPRCcylinder(frame f, real[][] t, pen[] p, real opacity, real shininess);
-void beginclip(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
-void beginclip(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
-pen palegrey;
-void clip(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
-void clip(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
-int Allow;
-real determinant(real[][] a);
-void functionshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, string shader=<default>, bool copy=<default>);
-void functionshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, string shader, bool copy=<default>);
-bool EndArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
-bool EndArcArrow(picture, path, pen, marginT(path, pen));
-void tensorshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, path[] b=<default>, pair[][] z=<default>, bool copy=<default>);
-void tensorshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, path[] b=<default>, pair[][] z=<default>, bool copy=<default>);
-void tensorshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>, pair[] z);
-void tensorshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>, pair[] z);
-void tensorshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>);
-void tensorshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>);
-file _outpipe;
-void gouraudshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, pair[] z, int[] edges, bool copy=<default>);
-void gouraudshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, int[] edges, bool copy=<default>);
-void gouraudshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, pair[] z, int[] edges, bool copy=<default>);
-void gouraudshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, int[] edges, bool copy=<default>);
-pair getpair(string name=<default>, pair default=<default>, string prompt=<default>, bool store=<default>);
-void axialshade(frame f, path[] g, bool stroke=<default>, pen pena, pair a, bool extenda=<default>, pen penb, pair b, bool extendb=<default>, bool copy=<default>);
-void axialshade(picture pic=<default>, path[] g, bool stroke=<default>, pen pena, pair a, bool extenda=<default>, pen penb, pair b, bool extendb=<default>, bool copy=<default>);
-pen chartreuse;
-void latticeshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, transform t=<default>, bool copy=<default>);
-void latticeshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, bool copy=<default>);
-void fill(frame f, path[] g, pen p=<default>, bool copy=<default>);
-path fill(frame dest, frame src, filltype filltype=<default>, real xmargin=<default>, real ymargin=<default>);
-void fill(picture pic=<default>, path[] g, pen p=<default>, bool copy=<default>);
-void fill(pair origin, picture pic=<default>, path[] g, pen p=<default>);
-void _draw(frame f, path g, pen p);
-void _draw(frame f, path3 g, triple center=<default>, pen p, int interaction=<default>);
-void _draw(picture pic, path g, pen p, marginT margin(path, pen));
-void initdefaults();
-void erase(frame f);
-string erase(string s, int pos, int n);
-void erase(picture pic=<default>);
-string jobname(string name);
-void print_random_addresses(int n=<default>);
-void generate_random_backtrace();
-guide operator ::(... guide[]);
-pen Helvetica(string series=<default>, string shape=<default>);
-transform reflect(pair a, pair b);
-transform rotate(real angle, pair z=<default>);
-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);
-transform slant(real s);
-transform yscale(real y);
-transform inverse(transform t);
-real[][] inverse(real[][] a);
-pen darkgrey;
-transform xscale(real x);
-transform shiftless(transform t);
-real[][] shiftless(real[][] t);
-real[] _cputime();
-guide reverse(guide g);
-string reverse(string s);
-path reverse(path p);
-path3 reverse(path3 p);
-triple[] reverse(triple[] a);
-int[] reverse(int[] a);
-real[] reverse(real[] a);
-int[] reverse(int n);
-string[] reverse(string[] a);
-pair[] reverse(pair[] a);
-bool[] reverse(bool[] a);
-real[] curlSpecifier(guide g, int t);
-bool Blank(picture, path, pen, marginT(path, pen));
-tensionSpecifier tensionSpecifier(guide g, int t);
-bool3 default;
-pair[] controlSpecifier(guide g, int t);
-pen red;
-pair[] dirSpecifier(guide g, int t);
-pen longdashed;
-pair point(guide g, int t);
-pair point(path p, int t);
-pair point(path p, real t);
-triple point(path3 p, int t);
-triple point(path3 p, real t);
-pair point(picture pic=<default>, pair dir, bool user=<default>);
-pair point(object F, pair dir, transform t=<default>);
-pair point(frame f, pair dir);
-int length(guide g);
-int length(string s);
-real length(pair z);
-real length(triple v);
-int length(path p);
-int length(path3 p);
-int size(guide g);
-pair size(frame f);
-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 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);
-guide operator controls(pair zout, pair zin);
-guide operator controls(pair z);
-bool empty(frame f);
-tensionSpecifier operator tension(real tout, real tin, bool atleast);
-tensionSpecifier operator tension(real t, bool atLeast);
-void end(picture pic=<default>);
-curlSpecifier operator curl(real gamma, int p);
-guide operator spec(pair z, int p);
-void list(string s, bool imports=<default>);
-string cd(string s=<default>);
-int Move;
-string location();
-string toplocation();
-string xasyKEY();
-void xasyKEY(string s);
-bool pdf();
-void _eval(string s, bool embedded, bool interactivewrite=<default>);
-void _eval(code s, bool embedded);
-void usleep(int microseconds);
-void sleep(int seconds);
-real Sin(real deg);
-void assert(bool b, string s=<default>);
-pair Align;
-void exit();
-void abort(string s=<default>);
-string locale(string s=<default>);
-string defaultseparator;
-string asydir();
-bool view();
+bool invisible(pen p);
+pen invisible();
+pen invisible;
+bool CCW;
+void usetypescript(string s, string encoding=<default>);
+path randompath(int n, bool cumulate=<default>, guide join(... guide[])=<default>);
 int system(string[] s);
 int system(string s);
-bool interactive();
-pen colorless(pen p);
-bool straight(path p, int t);
-bool straight(path3 p, int t);
-pen makepen(path p);
-path nib(pen p);
-transform transform(pen p);
-pair relpoint(path p, real l);
-pair[][] transpose(pair[][] a);
-pen[][] transpose(pen[][] a);
-string[][] transpose(string[][] a);
-real[][] transpose(real[][] a);
-pen overwrite(int n);
-int overwrite(pen p=<default>);
-real lineskip(pen p=<default>);
-pen fontsize(real size, real lineskip);
-real fontsize(pen p=<default>);
-pen fontsize(real size);
-string font(pen p=<default>);
-pen font(string name, string options=<default>);
-pen font(string encoding, string family, string series, string shape);
-pen font(string name, real size, string options=<default>);
-void newpage(frame f);
-void newpage(picture pic=<default>);
-pen fontcommand(string s);
-pen linewidth(real x);
-real linewidth(pen p=<default>);
-real arrowlength;
-pen miterlimit(real x);
-real miterlimit(pen p=<default>);
-pen linecap(int n);
-int linecap(pen p=<default>);
-bool adjust(pen p);
-pen adjust(pen p, real arclength, bool cyclic);
-bool scale(pen p);
-transform scale(real x);
-transform scale(real x, real y);
-real[][] scale(real x, real y, real z);
+void bar(picture pic, pair a, pair d, pen p=<default>);
+picture bar(pair a, pair d, pen p=<default>);
+side NoSide;
+file stdout;
 transform Shift(transform t);
 real fmod(real x, real y);
 real offset(pen p);
+pen rgb(pen p);
+pen rgb(real r, real g, real b);
+pen rgb(string s);
+real inch;
+bool ArcArrow(picture, path, pen, marginT(path, pen));
+bool ArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+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 currentpen;
+pair precontrol(path p, int t);
+pair precontrol(path p, real t);
+triple precontrol(path3 p, int t);
+triple precontrol(path3 p, real t);
+light currentlight;
+pen royalblue;
+picture currentpicture;
+frame currentpatterns;
+int JOIN_IN;
+int JOIN_OUT;
+projection currentprojection;
 real orient(pair a, pair b, pair c);
 real orient(triple a, triple b, triple c, triple d);
 pen linetype(real[] pattern, real offset=<default>, bool scale=<default>, bool adjust=<default>);
 real[] linetype(pen p=<default>);
 pen linetype(string pattern, real offset=<default>, bool scale=<default>, bool adjust=<default>);
-string blend(pen p);
-void endclip(frame f);
-void endclip(picture pic=<default>);
-pen opacity(real opacity=<default>, string blend=<default>);
-real opacity(pen p);
-pen fillrule(int n);
-int fillrule(pen p);
-real[][] identity4;
-marker[] MarkFill;
-pen pattern(string s);
-string pattern(pen p);
-pen solid;
-string colorspace(pen p);
-int byte(real x);
-bool Aspect;
-string hex(pen p);
-int hex(string s);
-real[] colors(pen p);
-void DOSnewl(file file);
-pen cmyk(pen p);
-pen cmyk(real c, real m, real y, real k);
-pen rgb(pen p);
-pen rgb(real r, real g, real b);
-pen rgb(string s);
-pen gray(pen p);
-pen gray(real gray);
-pen gray;
-bool invisible(pen p);
-pen invisible();
-pen invisible;
-void defaultpen(pen p);
-pen defaultpen();
-pen defaultpen;
-void defaultpen(real w);
-void resetdefaultpen();
-bool isnan(real x);
-bool cyclic(guide g);
-bool cyclic(path p);
-bool cyclic(path3 p);
-void printBytecode(<open>);
-pen currentpen;
-string VERSION;
-bool alias(pair[][] a, pair[][] b);
-bool alias(guide[] a, guide[] b);
-bool alias(marginT a, marginT b);
-bool alias(simplex a, simplex b);
-bool alias(scaleT a, scaleT b);
-bool alias(arrowhead a, arrowhead b);
-bool alias(pair[] a, pair[] 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(marker[] a, marker[] b);
-bool alias(int[] a, int[] b);
-bool alias(string[][] a, string[][] b);
-bool alias(slice a, slice b);
-bool alias(freezableBounds a, freezableBounds b);
-bool alias(projection a, projection b);
-bool alias(picture a, picture b);
-bool alias(Label[] a, Label[] b);
-bool alias(real[][] a, real[][] b);
-bool alias(bool3 a, bool3 b);
-bool alias(bool3[] a, bool3[] b);
-bool alias(autoscaleT a, autoscaleT b);
-bool alias(align a, align b);
-bool alias(processtime a, processtime b);
-bool alias(string[] a, string[] b);
-bool alias(frame[] a, frame[] b);
-bool alias(scaling a, scaling b);
-bool alias(scaling a, scaling b);
-bool alias(bounds a, bounds b);
-bool alias(light a, light b);
-bool alias(node a, node b);
-bool alias(Label a, Label b);
-bool alias(picture[] a, picture[] b);
-bool alias(bool[] a, bool[] b);
-bool alias(void()()[] a, void()()[] b);
-bool alias(pen[][] a, pen[][] b);
-bool alias(filltype a, filltype b);
-bool alias(coord[] a, coord[] b);
-bool alias(coord[] a, coord[] b);
-bool alias(coords3 a, coords3 b);
-bool alias(marker a, marker b);
-bool alias(Legend[] a, Legend[] b);
-bool alias(path[] a, path[] b);
-bool alias(triple[] a, triple[] 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(pen[] a, pen[] 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(object[] a, object[] b);
-real pi;
-int randMax;
-pen heavycyan;
-marginT PenMargin(path, pen)(real begin, real end);
-marginT PenMargin(path, pen);
-int realDigits;
-real realEpsilon;
-pair NE;
-real realMin;
-real realMax;
-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;
-real infinity;
-void xmap(string key, transform t=<default>);
-real inf;
-int intMin;
-int intMax;
-pen palered;
-real[] map(real f(pair), pair[] a);
-int[] map(int f(real), real[] a);
-bool3[] map(bool3 f(bool3), bool3[] a);
-frame[] map(frame f(frame), frame[] a);
-pen[][] map(pen[] f(pen[]), pen[][] a);
-triple[] map(triple f(triple), triple[] a);
-pen[] map(pen f(pen), pen[] a);
-coord[] map(coord f(coord), coord[] a);
-coord[] map(coord f(coord), coord[] a);
-Legend[] map(Legend f(Legend), Legend[] a);
-pair[] map(pair f(pair), pair[] a);
-Label[] map(Label f(Label), Label[] a);
-string[] map(string f(string), string[] a);
-object[] map(object f(object), object[] a);
-void()()[] map(void f()()(void()()), void()()[] a);
-pair[][] map(pair[] f(pair[]), pair[][] a);
-real[] map(real f(real), real[] a);
-picture[] map(picture f(picture), picture[] a);
-int[] map(int f(int), int[] a);
-string[][] map(string[] f(string[]), string[][] a);
-marker[] map(marker f(marker), marker[] a);
-bool[] map(bool f(bool), bool[] a);
-path[] map(path f(path), path[] a);
-real[][] map(real[] f(real[]), real[][] a);
-guide[] map(guide f(guide), guide[] a);
-real identity(real x);
-real[] identity(real[] a);
-transform identity();
-real[][] identity(int n);
-transform identity;
-real pow10(real x);
-real[] pow10(real[] a);
-pen linejoin(int n);
-int linejoin(pen p=<default>);
-real ldexp(real x, int e);
-real log1p(real x);
-real[] log1p(real[] a);
-path brace(pair a, pair b, real amplitude=<default>);
-void deactivatequote(picture pic=<default>);
-string format(string format, int x, string locale=<default>);
-string format(string format, bool forcemath=<default>, string separator, real x, string locale=<default>);
-string format(string format=<default>, bool forcemath=<default>, real x, string locale=<default>);
-real expm1(real x);
-real[] expm1(real[] a);
-void label(frame f, string s, string size, transform t, pair position, pair align, pen p);
-void label(picture pic=<default>, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
-void label(pair origin, picture pic=<default>, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
-void label(frame f, Label L, pair position, align align=<default>, pen p=<default>, filltype filltype=<default>);
-void label(picture pic=<default>, Label L, pair position, align align=<default>, pen p=<default>, filltype filltype=<default>);
-void label(frame f, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
-void label(picture pic=<default>, Label L, explicit guide g, align align=<default>, pen p=<default>, filltype filltype=<default>);
-void label(picture pic=<default>, Label L, explicit path g, align align=<default>, pen p=<default>, filltype filltype=<default>);
-real fabs(real x);
-real[] fabs(real[] a);
-string stripsuffix(string f, string suffix=<default>);
-real cbrt(real x);
-real[] cbrt(real[] a);
-real sqrt(real x);
-real[] sqrt(real[] a);
-pair sqrt(explicit pair z);
-bool all(bool[] a);
-real atanh(real x);
-real[] atanh(real[] a);
-real acosh(real x);
-real[] acosh(real[] a);
+real xpart(pair z);
+real xpart(triple v);
+side Center;
+real ypart(pair z);
+real ypart(triple v);
+real zpart(triple v);
+frame orientation(frame);
+pen Courier(string series=<default>, string shape=<default>);
+real simpson(real f(real), real a, real b, real acc=<default>, real dxmax=<default>);
 transform shift(transform t);
 transform shift(pair z);
 transform shift(real x, real y);
@@ -1190,21 +181,24 @@
 transform shift(frame f, pair align);
 real asinh(real x);
 real[] asinh(real[] a);
-pen ZapfDingbats(string series=<default>, string shape=<default>);
-real tanh(real x);
-real[] tanh(real[] a);
+pen orange;
+pen darkgray;
+slice lastcut(path p, path knife);
+pen darkgreen;
+pen darkgrey;
+transform xscale(real x);
+transform shiftless(transform t);
+real[][] shiftless(real[][] t);
+transform yscale(real y);
+void usleep(int microseconds);
 real cosh(real x);
 real[] cosh(real[] a);
-real sinh(real x);
-real[] sinh(real[] a);
-real straightness(path3 p, int t);
-real straightness(triple z0, triple c0, triple c1, triple z1);
-real log10(real x);
-real[] log10(real[] a);
-pair midpoint(path p);
-real exp(real x);
-real[] exp(real[] a);
-pair exp(explicit pair z);
+position MidPoint;
+real Sin(real deg);
+void assert(bool b, string s=<default>);
+pen Palatino(string series=<default>, string shape=<default>);
+real incircle(pair a, pair b, pair c, pair d);
+frame Landscape(frame f);
 pen purple;
 string italic(string s);
 real atan(real x);
@@ -1211,100 +205,116 @@
 real[] atan(real[] a);
 real acos(real x);
 real[] acos(real[] a);
-path roundbox(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-path roundbox(frame f, Label L, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-real asin(real x);
-real[] asin(real[] a);
-real tan(real x);
-real[] tan(real[] a);
-pen Magenta;
-real cos(real x);
-real[] cos(real[] a);
-pair cos(explicit pair z);
-real sin(real x);
-real[] sin(real[] a);
-pair sin(explicit pair z);
-path polygon(int n);
-guide operator --(... guide[]);
-void none(file file);
-int factorial(int n);
-real log(real x);
-real[] log(real[] a);
-pair log(explicit pair z);
-guide operator ..(... guide[]);
-guide operator ..(... guide[])(tensionSpecifier t);
-pair operator tuple(real x, real y);
-triple operator tuple(real x, real y, real z);
-transform operator tuple(real x, real y, real xx, real xy, real yx, real yy);
-int[][] diagonal(... int[]);
-real[][] diagonal(... real[]);
-pair[][] diagonal(... pair[]);
-path[] texpath(string s, pen p, bool tex=<default>, bool bbox=<default>);
-path[] texpath(Label L, bool tex=<default>, bool bbox=<default>);
-bool uptodate();
-int operator #(int a, int b);
-int[] operator #(int a, int[] b);
-int[] operator #(int[] a, int b);
-int[] operator #(int[] a, int[] b);
-int operator %(int a, int b);
-int[] operator %(int a, int[] b);
-int[] operator %(int[] a, int b);
-int[] operator %(int[] a, int[] b);
-real operator %(real a, real b);
-real[] operator %(real a, real[] b);
-real[] operator %(real[] a, real b);
-real[] operator %(real[] a, real[] b);
+int popcount(int a);
+pair minbound(pair a, pair b);
+triple minbound(triple a, triple b);
+pair minbound(pair[] a);
+pair minbound(pair[][] a);
+pair minbound(pair[][][] a);
+triple minbound(triple[] a);
+triple minbound(triple[][] a);
+triple minbound(triple[][][] a);
+void restore();
+pen basealign(int n);
+int basealign(pen p=<default>);
+pen basealign;
+int min(int a, int b);
+int[] min(int a, int[] b);
+int[] min(int[] a, int b);
+int[] min(int[] a, int[] b);
+int min(int[] a);
+int min(int[][] a);
+int min(int[][][] a);
+real min(real a, real b);
+real[] min(real a, real[] b);
+real[] min(real[] a, real b);
+real[] min(real[] a, real[] b);
+real min(real[] a);
+real min(real[][] a);
+real min(real[][][] a);
+string min(string a, string b);
+string[] min(string a, string[] b);
+string[] min(string[] a, string b);
+string[] min(string[] a, string[] b);
+string min(string[] a);
+string min(string[][] a);
+string min(string[][][] a);
+pair min(pen p);
+pair min(frame f);
+pair min(explicit path p);
+pair min(path[] p);
+triple min(path3 p);
+real min(... real[] a);
+real min(real m, scaling s, coord[] c);
+pair min(picture pic, bool user=<default>);
+real min(real m, scaling s, coord[] c);
+int min(... int[] a);
+filltype RadialShade(pen penc, pen penr);
 int search(int[] a, int key);
 int search(real[] a, real key);
 int search(string[] a, string key);
 int search(void()()[] a, void key()(), bool less(void()(), void()()));
-int search(object[] a, object key, bool less(object, object));
 int search(real[] a, real key, bool less(real, real));
 int search(guide[] a, guide key, bool less(guide, guide));
-int search(Label[] a, Label key, bool less(Label, Label));
+int search(object[] a, object key, bool less(object, object));
 int search(pair[] a, pair key, bool less(pair, pair));
 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(Label[] a, Label key, bool less(Label, Label));
 int search(frame[] a, frame key, bool less(frame, frame));
+int search(coord[] a, coord key, bool less(coord, coord));
 int search(int[] a, int key, bool less(int, int));
 int search(bool3[] a, bool3 key, bool less(bool3, bool3));
 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(marker[] a, marker key, bool less(marker, marker));
 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 search(picture[] a, picture key, bool less(picture, picture));
-int[] sort(int[] a);
-int[][] sort(int[][] a);
-real[] sort(real[] a);
-real[][] sort(real[][] a);
-string[] sort(string[] a);
-string[][] sort(string[][] a);
-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>);
-pen[] sort(pen[] a, bool less(pen, pen), bool stable=<default>);
-bool[] sort(bool[] a, bool less(bool, bool), bool stable=<default>);
-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>);
-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>);
-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>);
-string[] sort(string[] a, bool less(string, string), bool stable=<default>);
-pair[] sort(pair[] a, bool less(pair, pair), bool stable=<default>);
-real[][] sort(real[][] a, bool less(real[], real[]), bool stable=<default>);
-triple[] sort(triple[] a, bool less(triple, triple), bool stable=<default>);
-guide[] sort(guide[] a, bool less(guide, guide), bool stable=<default>);
+filltype RadialShadeDraw(real xmargin=<default>, real ymargin=<default>, pen penc, pen penr, pen drawpen=<default>);
+real sin(real x);
+real[] sin(real[] a);
+pair sin(explicit pair z);
+pen deepcyan;
+void restoredefaults();
+path[] plus;
+pair expi(real angle);
+triple expi(real polar, real azimuth);
+void endclip(frame f);
+void endclip(picture pic=<default>);
+pen opacity(real opacity=<default>, string blend=<default>);
+real opacity(pen p);
+real[] solve(real[][] a, real[] b, bool warn=<default>);
+real[][] solve(real[][] a, real[][] b, bool warn=<default>);
+int rename(string from, string to);
+void DOSendl(file file);
+string debugger(string file, int line, int column, code s=<default>);
+string getc(file f);
+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 shipout3(string prefix, frame f, string format=<default>, real width, real height, real angle, real zoom, triple m, triple m, pair shift, pair margin, real[][] t, real[] background, triple[] lights, real[][] diffuse, real[][] specular, bool view=<default>);
+void shipout3(string prefix, frame f, string format=<default>);
+string getstring(string name=<default>, string default=<default>, string prompt=<default>, bool store=<default>);
+int debuggerlines;
+frame bbox(picture pic=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>);
+real radians(real degrees);
+bool pdf();
+void _eval(string s, bool embedded, bool interactivewrite=<default>);
+void _eval(code s, bool embedded);
+path[][] textpath(string[] s, pen[] p);
+void radialshade(frame f, path[] g, bool stroke=<default>, pen pena, pair a, real ra, bool extenda=<default>, pen penb, pair b, real rb, bool extendb=<default>, bool copy=<default>);
+void radialshade(picture pic=<default>, path[] g, bool stroke=<default>, pen pena, pair a, real ra, bool extenda=<default>, pen penb, pair b, real rb, bool extendb=<default>, bool copy=<default>);
+pair maxbound(pair a, pair b);
+triple maxbound(triple a, triple b);
+pair maxbound(pair[] a);
+pair maxbound(pair[][] a);
+pair maxbound(pair[][][] a);
+triple maxbound(triple[] a);
+triple maxbound(triple[][] a);
+triple maxbound(triple[][][] a);
+string Embed(string name, string text=<default>, string options=<default>, real width=<default>, real height=<default>);
 pair postcontrol(path p, int t);
 pair postcontrol(path p, real t);
 triple postcontrol(path3 p, int t);
@@ -1336,101 +346,176 @@
 pair max(path[] p);
 triple max(path3 p);
 pair max(picture pic, bool user=<default>);
+real max(real M, scaling s, coord[] c);
 int max(... int[] a);
 real max(... real[] a);
 real max(real M, scaling s, coord[] c);
-real max(real M, scaling s, coord[] c);
-void restore();
-pen basealign(int n);
-int basealign(pen p=<default>);
-pen basealign;
-int min(int a, int b);
-int[] min(int a, int[] b);
-int[] min(int[] a, int b);
-int[] min(int[] a, int[] b);
-int min(int[] a);
-int min(int[][] a);
-int min(int[][][] a);
-real min(real a, real b);
-real[] min(real a, real[] b);
-real[] min(real[] a, real b);
-real[] min(real[] a, real[] b);
-real min(real[] a);
-real min(real[][] a);
-real min(real[][][] a);
-string min(string a, string b);
-string[] min(string a, string[] b);
-string[] min(string[] a, string b);
-string[] min(string[] a, string[] b);
-string min(string[] a);
-string min(string[][] a);
-string min(string[][][] a);
-pair min(pen p);
-pair min(frame f);
-pair min(explicit path p);
-pair min(path[] p);
-triple min(path3 p);
-real min(... real[] a);
-real min(real m, scaling s, coord[] c);
-real min(real m, scaling s, coord[] c);
-pair min(picture pic, bool user=<default>);
-int min(... int[] a);
-void srand(int seed);
-bool operator >(int a, int b);
-bool[] operator >(int a, int[] b);
-bool[] operator >(int[] a, int b);
-bool[] operator >(int[] a, int[] b);
-bool operator >(real a, real b);
-bool[] operator >(real a, real[] b);
-bool[] operator >(real[] a, real b);
-bool[] operator >(real[] a, real[] b);
-bool operator >(string a, string b);
-bool[] operator >(string a, string[] b);
-bool[] operator >(string[] a, string b);
-bool[] operator >(string[] a, string[] b);
-bool operator >=(int a, int b);
-bool[] operator >=(int a, int[] b);
-bool[] operator >=(int[] a, int b);
-bool[] operator >=(int[] a, int[] b);
-bool operator >=(real a, real b);
-bool[] operator >=(real a, real[] b);
-bool[] operator >=(real[] a, real b);
-bool[] operator >=(real[] a, real[] b);
-bool operator >=(string a, string b);
-bool[] operator >=(string a, string[] b);
-bool[] operator >=(string[] a, string b);
-bool[] operator >=(string[] a, string[] b);
-bool operator >=(coord a, coord b);
-bool operator >=(coord a, coord b);
-bool operator <=(int a, int b);
-bool[] operator <=(int a, int[] b);
-bool[] operator <=(int[] a, int b);
-bool[] operator <=(int[] a, int[] b);
-bool operator <=(real a, real b);
-bool[] operator <=(real a, real[] b);
-bool[] operator <=(real[] a, real b);
-bool[] operator <=(real[] a, real[] b);
-bool operator <=(string a, string b);
-bool[] operator <=(string a, string[] b);
-bool[] operator <=(string[] a, string b);
-bool[] operator <=(string[] a, string[] b);
-bool operator <=(coord a, coord b);
-bool operator <=(coord a, coord b);
-bool operator <(int a, int b);
-bool[] operator <(int a, int[] b);
-bool[] operator <(int[] a, int b);
-bool[] operator <(int[] a, int[] b);
-bool operator <(real a, real b);
-bool[] operator <(real a, real[] b);
-bool[] operator <(real[] a, real b);
-bool[] operator <(real[] a, real[] b);
-bool operator <(string a, string b);
-bool[] operator <(string a, string[] b);
-bool[] operator <(string[] a, string b);
-bool[] operator <(string[] a, string[] b);
+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(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>);
+string font(pen p=<default>);
+pen font(string name, string options=<default>);
+pen font(string encoding, string family, string series, string shape);
+pen font(string name, real size, string options=<default>);
+marker markthin(path g, pen p=<default>, real thin(real fraction)=<default>, filltype filltype=<default>);
+int intMin;
+pen white;
+side RightSide;
+string replace(string s, string[][] translate);
+string replace(string s, string before, string after);
+transform fixedscaling(picture pic=<default>, pair min, pair max, pen p=<default>, bool warn=<default>);
+pen Symbol(string series=<default>, string shape=<default>);
+slice firstcut(path p, path knife);
+pen squarecap;
+pen squarepen;
+pen deepyellow;
+real barsize(pen p=<default>);
+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>);
+bool EndArcArrow(picture, path, pen, marginT(path, pen));
+bool EndArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+void tensorshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, path[] b=<default>, pair[][] z=<default>, bool copy=<default>);
+void tensorshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, path[] b=<default>, pair[][] z=<default>, bool copy=<default>);
+void tensorshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>, pair[] z);
+void tensorshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>, pair[] z);
+void tensorshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>);
+void tensorshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>);
+string[] split(string s, string delimiter=<default>);
+void addSaveFunction(void s()());
+object embed3(string, frame, string, string, string, light, projection);
+filltype NoFill;
+real colatitude(triple v, bool warn=<default>);
+void label(frame f, string s, string size, transform t, pair position, pair align, pen p);
+void label(picture pic=<default>, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
+void label(pair origin, picture pic=<default>, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
+void label(frame f, Label L, pair position, align align=<default>, pen p=<default>, filltype filltype=<default>);
+void label(picture pic=<default>, Label L, pair position, align align=<default>, pen p=<default>, filltype filltype=<default>);
+void label(frame f, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
+void label(picture pic=<default>, Label L, explicit guide g, align align=<default>, pen p=<default>, filltype filltype=<default>);
+void label(picture pic=<default>, Label L, explicit path g, align align=<default>, pen p=<default>, filltype filltype=<default>);
+real fabs(real x);
+real[] fabs(real[] a);
+bool labels(frame f);
+light light(pen diffuse=<default>, pen specular=<default>, pen background=<default>, real x, real y, real z);
+light light(pen diffuse=<default>, pen specular=<default>, pen background=<default>, real specularfactor=<default> ... triple[] position);
+light light(pen[] diffuse, pen[] specular=<default>, pen background=<default>, real specularfactor=<default>, triple[] position);
+light light(explicit light light);
+real remainder(real x, real y);
+int byte(real x);
+real camerafactor;
+pen lightred;
+real labelmargin;
+real labelmargin(pen p=<default>);
+pen lightblue;
+pen lightgreen;
+pair right;
+string outformat(string format=<default>);
+pen lightcyan;
+pen lightmagenta;
+pen lightyellow;
+pen lightgray;
+pen lightolive;
+pen lightgrey;
+string upcase(string s);
+pen darkblue;
+pen darkbrown;
+path[] strokepath(path g, pen p=<default>);
+real erf(real x);
+void saveline(string name, string value, bool store=<default>);
+pen fuchsia;
+filltype filltype(int type=<default>, pen fillpen=<default>, pen drawpen=<default>, void fill2(frame f, path[] g, pen fillpen));
+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>);
+void seekeof(file f);
+path unitcircle;
 pair[] conj(pair[] a);
 pair[][] conj(pair[][] a);
 pair conj(pair z);
+pen deepgray;
+pen deepgreen;
+pen deepgrey;
+marker[] Mark;
+marker Mark(int n);
+real aTan(real x);
+void _begingroup3(frame f, string name, real compression, real granularity, bool closed, bool tessellate, bool dobreak, bool nobreak, triple center, int interaction);
+path[] MarkPath;
+string graphic(string name, string options=<default>);
+real aCos(real x);
+void texreset();
+string graphicscale(real x);
+int[] complement(int[] a, int n);
+path[] complement(frame f, path[] g);
+pen Cyan;
+marginT NoMargin(path, pen);
+marginT NoMargin(path, pen)();
+path[][] _texpath(string[] s, pen[] p);
+real sinh(real x);
+real[] sinh(real[] a);
+real[] _cputime();
+position EndPoint;
+hsv hsv(real h, real s, real v);
+hsv hsv(pen p);
+void deconstruct(frame f, frame preamble=<default>, transform t=<default>);
+void deconstruct(picture pic=<default>);
+int sgn(real x);
+node node(void d(frame f, transform t, transform T, pair lb, pair rt), string key=<default>);
+pair minAfterTransform(transform t, path[] p);
+int seconds(string t=<default>, string format=<default>);
+pen cyan;
+pen grey;
+real cm;
+filltype Fill;
+filltype Fill(real xmargin=<default>, real ymargin=<default>, pen p=<default>);
+pen olive;
+pen darkolive;
+int ascii(string s);
+real arcarrowangle;
+real arcarrowfactor;
+real mm;
+real arcarrowsize(pen p=<default>);
+real calculateScaling(string dir, coord[] coords, real size, bool warn=<default>);
+real calculateScaling(string dir, coord[] coords, real size, bool warn=<default>);
+real calculateScaling(string dir, coord[] m, coord[] M, real size, bool warn=<default>);
+real calculateScaling(string dir, coord[] m, coord[] M, real size, bool warn=<default>);
+triple gettriple(string name=<default>, triple default=<default>, string prompt=<default>, bool store=<default>);
+void drawpixel(frame f, triple v, pen p, real width=<default>);
+pen fontsize(real size, real lineskip);
+real fontsize(pen p=<default>);
+pen fontsize(real size);
+void close(file f);
+real lineskip(pen p=<default>);
+pen dashed;
+pair maxAfterTransform(transform t, path[] p);
+int[][] triangulate(pair[] z);
+void fill(frame f, path[] g, pen p=<default>, bool copy=<default>);
+path fill(frame dest, frame src, filltype filltype=<default>, real xmargin=<default>, real ymargin=<default>);
+void fill(picture pic=<default>, path[] g, pen p=<default>, bool copy=<default>);
+void fill(pair origin, picture pic=<default>, path[] g, pen p=<default>);
+pair midpoint(path p);
+real exp(real x);
+real[] exp(real[] a);
+pair exp(explicit pair z);
+pen linejoin(int n);
+int linejoin(pen p=<default>);
+real ldexp(real x, int e);
+pen rgba(real[] a);
+real[] rgba(pen p);
+string time(string format=<default>);
+string time(int seconds, string format=<default>);
+void prepend(frame dest, frame src);
+real pt;
+settings settings;
+int MoveQuiet;
+marginT EndMargin(path, pen);
+pen nullpen;
 side LeftSide;
 path nullpath;
 guide[] copy(guide[] a, int depth=<default>);
@@ -1439,7 +524,9 @@
 bool[] copy(bool[] a, int depth=<default>);
 real[][] copy(real[][] a, int depth=<default>);
 pen[] copy(pen[] a, int depth=<default>);
-Label[] copy(Label[] 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>);
 picture[] copy(picture[] a, int depth=<default>);
 pen[][] copy(pen[][] a, int depth=<default>);
 path[] copy(path[] a, int depth=<default>);
@@ -1451,10 +538,8 @@
 pair[] copy(pair[] a, int depth=<default>);
 bool3[] copy(bool3[] 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>);
 pair[][] copy(pair[][] a, int depth=<default>);
 real[] abs(pair[] a);
 real[] abs(triple[] a);
@@ -1463,92 +548,248 @@
 real abs(pair z);
 real abs(triple v);
 int abs(int x);
-void radialshade(frame f, path[] g, bool stroke=<default>, pen pena, pair a, real ra, bool extenda=<default>, pen penb, pair b, real rb, bool extendb=<default>, bool copy=<default>);
-void radialshade(picture pic=<default>, path[] g, bool stroke=<default>, pen pena, pair a, real ra, bool extenda=<default>, pen penb, pair b, real rb, bool extendb=<default>, bool copy=<default>);
-pair maxbound(pair a, pair b);
-triple maxbound(triple a, triple b);
-pair maxbound(pair[] a);
-pair maxbound(pair[][] a);
-pair maxbound(pair[][][] a);
-triple maxbound(triple[] a);
-triple maxbound(triple[][] a);
-triple maxbound(triple[][][] a);
-pair minbound(pair a, pair b);
-triple minbound(triple a, triple b);
-pair minbound(pair[] a);
-pair minbound(pair[][] a);
-pair minbound(pair[][][] a);
-triple minbound(triple[] a);
-triple minbound(triple[][] a);
-triple minbound(triple[][][] a);
-real operator /(real a, real b);
-real[] operator /(real a, real[] b);
-real[] operator /(real[] a, real b);
-real[] operator /(real[] a, real[] b);
-real[][] operator /(real[][] a, real b);
-pair operator /(pair a, pair b);
-pair[] operator /(pair a, pair[] b);
-pair[] operator /(pair[] a, pair b);
-pair[] operator /(pair[] a, pair[] b);
-pair[][] operator /(pair[][] a, pair b);
-triple[] operator /(triple[] a, real b);
-real operator /(int a, int b);
-real[] operator /(int[] a, int b);
-real[] operator /(int a, int[] b);
-real[] operator /(int[] a, int[] b);
-triple operator /(triple v, real x);
-real interp(real a, real b, real t);
-pair interp(explicit pair a, explicit pair b, real t);
-triple interp(triple a, triple b, real t);
-pen interp(pen a, pen b, real t);
-int operator *(int a, int b);
-int[] operator *(int a, int[] b);
-int[] operator *(int[] a, int b);
-int[] operator *(int[] a, int[] b);
-int[][] operator *(int a, int[][] b);
-int[][] operator *(int[][] a, int b);
-real operator *(real a, real b);
-real[] operator *(real a, real[] b);
-real[] operator *(real[] a, real b);
-real[] operator *(real[] a, real[] b);
-real[][] operator *(real a, real[][] b);
-real[][] operator *(real[][] a, real b);
-pair operator *(pair a, pair b);
-pair[] operator *(pair a, pair[] b);
-pair[] operator *(pair[] a, pair b);
-pair[] operator *(pair[] a, pair[] b);
-pair[][] operator *(pair a, pair[][] b);
-pair[][] operator *(pair[][] a, pair b);
-triple[] operator *(real a, triple[] b);
-triple[][] operator *(real a, triple[][] b);
-triple[] operator *(triple[] a, real b);
-triple[][] operator *(triple[][] a, real b);
-pen operator *(real a, pen b);
-pen operator *(pen a, real b);
-transform operator *(transform a, transform b);
-pair operator *(transform t, pair z);
-path operator *(transform t, path g);
-pen operator *(transform t, pen p);
-frame operator *(transform t, frame f);
-frame operator *(real[][] t, frame f);
-real[] operator *(real[][] a, real[] b);
-real[] operator *(real[] a, real[][] b);
-int[][] operator *(int[][] a, int[][] b);
-real[][] operator *(real[][] a, real[][] b);
-pair[][] operator *(pair[][] a, pair[][] b);
-triple operator *(real[][] t, triple v);
-triple operator *(real x, triple v);
-triple operator *(triple v, real x);
-path3 operator *(real[][] t, path3 g);
-picture operator *(transform t, picture orig);
-object operator *(transform t, explicit object F);
-bounds operator *(transform t, bounds b);
-Label operator *(transform t, Label L);
-path[] operator *(transform t, explicit path[] p);
-pair[] operator *(transform t, pair[] z);
-picture operator *(real[][] t, picture orig);
-side operator *(real x, side s);
-Label operator *(real[][] t, Label L);
+pen pink;
+real inches;
+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);
+pair getpair(string name=<default>, pair default=<default>, string prompt=<default>, bool store=<default>);
+void axialshade(frame f, path[] g, bool stroke=<default>, pen pena, pair a, bool extenda=<default>, pen penb, pair b, bool extendb=<default>, bool copy=<default>);
+void axialshade(picture pic=<default>, path[] g, bool stroke=<default>, pen pena, pair a, bool extenda=<default>, pen penb, pair b, bool extendb=<default>, bool copy=<default>);
+string locale(string s=<default>);
+real dirtime(path p, pair z);
+void copyPairOrTriple(pairOrTriple dest, pairOrTriple src);
+real[] colors(pen p);
+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>);
+pen[] colorPen;
+real _findroot(real f(real), real a, real b, real tolerance, real fa, real fb);
+pen colorless(pen p);
+pen solid;
+string colorspace(pen p);
+void warn(string s);
+pen deepblue;
+pen palered;
+real[] map(real f(pair), pair[] a);
+int[] map(int f(real), real[] a);
+bool3[] map(bool3 f(bool3), bool3[] a);
+frame[] map(frame f(frame), frame[] a);
+coord[] map(coord f(coord), coord[] a);
+pen[][] map(pen[] f(pen[]), pen[][] a);
+triple[] map(triple f(triple), triple[] a);
+pen[] map(pen f(pen), pen[] a);
+coord[] map(coord f(coord), coord[] a);
+Legend[] map(Legend f(Legend), Legend[] a);
+Label[] map(Label f(Label), Label[] a);
+pair[] map(pair f(pair), pair[] a);
+object[] map(object f(object), object[] a);
+string[] map(string f(string), string[] 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);
+picture[] map(picture f(picture), picture[] a);
+int[] map(int f(int), int[] a);
+string[][] map(string[] f(string[]), string[][] a);
+bool[] map(bool f(bool), bool[] a);
+path[] map(path f(path), path[] a);
+real[][] map(real[] f(real[]), real[][] a);
+guide[] map(guide f(guide), guide[] a);
+path unstraighten(path p);
+path3 unstraighten(path3 p);
+void _image(frame f, real[][] data, pair initial, pair final, pen[] palette=<default>, transform t=<default>, bool copy=<default>, bool antialias=<default>);
+void _image(frame f, pen[][] data, pair initial, pair final, transform t=<default>, bool copy=<default>, bool antialias=<default>);
+void _image(frame f, pen f(int, int), int width, int height, pair initial, pair final, transform t=<default>, bool antialias=<default>);
+pair arcpoint(path p, real L);
+pen Pen(int n);
+int rfind(string s, string t, int pos=<default>);
+pair minratio(frame f);
+pair minratio(triple[][] p, pair b);
+pair minratio(path3 g);
+string toplocation();
+int[] sequence(int n);
+pen[][] sequence(pen[] 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);
+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);
+guide[] sequence(guide f(int), int n);
+pen[] sequence(pen f(int), int n);
+void()()[] sequence(void f()()(int), int n);
+bool[] sequence(bool f(int), int n);
+string[] sequence(string f(int), int n);
+pair[][] sequence(pair[] f(int), int n);
+bool3[] sequence(bool3 f(int), int n);
+coord[] sequence(coord f(int), int n);
+Legend[] sequence(Legend f(int), int n);
+Label[] sequence(Label f(int), int n);
+real[][] sequence(real[] f(int), int n);
+real[] sequence(real f(int), int n);
+int[] sequence(int n, int m);
+triple[] sequence(triple f(int), int n);
+path[] sequence(path f(int), int n);
+frame[] sequence(frame f(int), int n);
+triple minbezier(triple[][] p, triple b);
+path trim(path g, real begin, real end);
+marginT DotMargin(path, pen)(real begin, real end);
+marginT DotMargin(path, pen);
+marginT DotMargins(path, pen);
+string string(int x);
+string string(real x, int digits=<default>);
+string cd(string s=<default>);
+int size(guide g);
+pair size(frame f);
+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 pic=<default>, real x, real y=<default>, bool keepAspect=<default>);
+void size(picture pic=<default>, real xsize, real ysize, pair min, pair max);
+void clear(file f);
+void clear(string file, int line);
+void clear();
+void clear(string file, string text);
+pen mediumred;
+pen mediumblue;
+pen mediumgreen;
+pen mediumcyan;
+pen mediummagenta;
+pair arcdir(path p, real L);
+pen mediumyellow;
+pen mediumgray;
+string downcase(string s);
+pen mediumgrey;
+transform transform(pen p);
+string readline(string prompt=<default>, string name=<default>, bool tabcompletion=<default>);
+void beep();
+pair relpoint(path p, real l);
+pair[][] transpose(pair[][] a);
+pen[][] transpose(pen[][] a);
+string[][] transpose(string[][] a);
+real[][] transpose(real[][] a);
+pen overwrite(int n);
+int overwrite(pen p=<default>);
+pen linewidth(real x);
+real linewidth(pen p=<default>);
+transformation transformation(real[][] modelview);
+transformation transformation(real[][] modelview, real[][] projection);
+pair maxratio(frame f);
+pair maxratio(triple[][] p, pair b);
+pair maxratio(path3 g);
+triple maxbezier(triple[][] p, triple b);
+void layer(frame f);
+void layer(picture pic=<default>);
+void DOSnewl(file file);
+pen cmyk(pen p);
+pen cmyk(real c, real m, real y, real k);
+pen blue;
+pen evenodd;
+int precision(file f=<default>, int digits=<default>);
+path3 path3(triple[] pre, triple[] point, triple[] post, bool[] straight, bool cyclic);
+bool piecewisestraight(path p);
+bool piecewisestraight(path3 p);
+void stop(string file, int line, code s=<default>);
+void stop(string file, string text, code s=<default>);
+pair reldir(path p, real l);
+pen TimesRoman(string series=<default>, string shape=<default>);
+slice cut(path p, path knife, int n);
+bool is3D(frame f);
+bool is3D(string format=<default>);
+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(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(picture pic=<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(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(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(frame f, transform t=<default>, Label L);
+void add(picture src, pair position, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+plain plain;
+void purge(int divisor=<default>);
+int Round(real x);
+real sqrt(real x);
+real[] sqrt(real[] a);
+pair sqrt(explicit pair z);
+string[] spinner;
+real[] times(path p, real x);
+real[] times(path p, explicit pair z);
+void drawbeziertriangle(frame f, triple[][] p, triple center, bool straight, pen[] p, real opacity, real shininess, real metallic, real fresnel0, real prcshininess, pen[] colors, int interaction, bool prc=<default>);
+void Draw(picture pic=<default>, path g, pen p=<default>);
+filltype Draw;
+void Draw(picture pic=<default>, explicit path[] g, pen p=<default>);
+filltype Draw(real xmargin=<default>, real ymargin=<default>, pen p=<default>);
+void tab(file file);
+plain_scaling plain_scaling;
+string file(string s);
+plain_bounds plain_bounds;
+string outprefix(string prefix=<default>);
+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);
+object object(Label L);
+file stdin;
+void()()[] array(int n, void value()(), int depth=<default>);
+bool[] array(int n, bool value, int depth=<default>);
+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>);
+coord[] array(int n, coord value, int depth=<default>);
+Legend[] array(int n, Legend value, int depth=<default>);
+Label[] array(int n, Label 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>);
+path[] array(int n, path value, int depth=<default>);
+frame[] array(int n, frame value, int depth=<default>);
+pen[][] array(int n, pen[] 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>);
+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>);
+guide[] array(int n, guide value, int depth=<default>);
+pen[] array(int n, pen value, int depth=<default>);
+string[] array(string s);
+bool BeginBar(picture, path, pen, marginT(path, pen));
+bool BeginBar(picture, path, pen, marginT(path, pen))(real size=<default>);
+triple perp(triple v, triple u);
+int find(bool[] a, int n=<default>);
+int find(string s, string t, int pos=<default>);
+position BeginPoint;
+marginT BeginMargin(path, pen);
+path buildcycle(... path[] p);
+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>);
+marginT BeginPenMargin(path, pen);
+int round(real x);
+marginT BeginDotMargin(path, pen);
+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>);
+pen roundcap;
+void buildRestoreThunk()();
+pen roundjoin;
+int sourceline(string file, string text);
+void buildRestoreDefaults()();
+path roundbox(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+path roundbox(frame f, Label L, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+real asin(real x);
+real[] asin(real[] a);
+pair endpoint(path p);
 real latitude(triple v, bool warn=<default>);
 int sum(int[] a);
 real sum(real[] a);
@@ -1555,42 +796,63 @@
 pair sum(pair[] a);
 triple sum(triple[] a);
 int sum(bool[] a);
-bool initialized(int a);
-bool initialized(real a);
-bool initialized(pair a);
-bool initialized(triple a);
-int operator -(int a, int b);
-int[] operator -(int a, int[] b);
-int[] operator -(int[] a, int b);
-int[] operator -(int[] a, int[] b);
-int[][] operator -(int[][] a, int[][] b);
-int operator -(int a);
-int[] operator -(int[] a);
-int[][] operator -(int[][] a);
-real operator -(real a, real b);
-real[] operator -(real a, real[] b);
-real[] operator -(real[] a, real b);
-real[] operator -(real[] a, real[] b);
-real[][] operator -(real[][] a, real[][] b);
-real operator -(real a);
-real[] operator -(real[] a);
-real[][] operator -(real[][] a);
-pair operator -(pair a, pair b);
-pair[] operator -(pair a, pair[] b);
-pair[] operator -(pair[] a, pair b);
-pair[] operator -(pair[] a, pair[] b);
-pair[][] operator -(pair[][] a, pair[][] b);
-pair operator -(pair a);
-pair[] operator -(pair[] a);
-pair[][] operator -(pair[][] a);
-triple operator -(triple a, triple b);
-triple[] operator -(triple a, triple[] b);
-triple[] operator -(triple[] a, triple b);
-triple[] operator -(triple[] a, triple[] b);
-triple[][] operator -(triple[][] a, triple[][] b);
-triple operator -(triple a);
-triple[] operator -(triple[] a);
-triple[][] operator -(triple[][] a);
+void xmap(string key, transform t=<default>);
+real inf;
+real arctime(path p, real l);
+real arctime(path3 p, real dval);
+pen palemagenta;
+void draw(frame f, triple[][] p, triple center, bool straight, pen[] p, real opacity, real shininess, real metallic, real fresnel0, real prcshininess, pen[] colors, int interaction, bool prc=<default>);
+void draw(frame f, triple[] p, real[] knot, real[] weights=<default>, pen p);
+void draw(frame f, triple[][] p, real[] uknot, real[] vknot, real[][] weights=<default>, pen[] p, real opacity, real shininess, real metallic, real fresnel0, real prcshininess, pen[] colors);
+void draw(frame f, triple[] v, int[][] vi, triple[] n, int[][] ni, pen[] p, real opacity, real shininess, real metallic, real fresnel0, 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>), pair position, 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(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(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>), 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>, bool arrow(picture, path, pen, marginT(path, pen)));
+int mantissaBits;
+real identity(real x);
+real[] identity(real[] a);
+transform identity();
+real[][] identity(int n);
+transform identity;
+real[][] identity4;
+marker[] MarkFill;
+pen pattern(string s);
+string pattern(pen p);
+transform invert;
+transform inverse(transform t);
+real[][] inverse(real[][] a);
+pair unit(pair z);
+triple unit(triple v);
+triple min3(frame f);
+triple min3(pen p);
+void begin(picture pic=<default>, string name, string id=<default>, bool visible=<default>);
+void drawPRCdisk(frame f, real[][] t, pen[] p, real opacity, real shininess);
+void drawPRCtube(frame f, path3 center, path3 g, pen[] p, real opacity, real shininess);
+int CLZ(int a);
+void drawPRCsphere(frame f, real[][] t, bool half=<default>, pen[] p, real opacity, real shininess, int type);
+arrowhead DefaultHead;
+void drawPRCcylinder(frame f, real[][] t, pen[] p, real opacity, real shininess);
+void beginclip(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
+void beginclip(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
+void begingroup(frame f);
+void begingroup(picture pic=<default>);
+marker nomarker;
+pair beginpoint(path p);
+real azimuth(triple v, bool warn=<default>);
+real angle(pair z, bool warn=<default>);
+real angle(transform t);
+pair ENE;
+frame pack(pair align=<default> ... object[] inset);
 void gsave(frame f);
 void write(file file=<default>, string s=<default>, bool x, void suffix(file)=<default> ... bool[]);
 void write(file file=<default>, string s=<default>, explicit bool[] a ... bool[][]);
@@ -1628,188 +890,370 @@
 void write(void suffix(file)=<default>);
 void write(pairOrTriple a);
 void write(file file, string s=<default>, explicit path[] 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>);
 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(string s=<default>, explicit guide[] x, 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);
-bool[] operator !=(bool[] a, bool[] b);
-bool operator !=(bool[][] a, bool[][] b);
-bool operator !=(int a, int b);
-bool[] operator !=(int a, int[] b);
-bool[] operator !=(int[] a, int b);
-bool[] operator !=(int[] a, int[] b);
-bool operator !=(int[][] a, int[][] b);
-bool operator !=(real a, real b);
-bool[] operator !=(real a, real[] b);
-bool[] operator !=(real[] a, real b);
-bool[] operator !=(real[] a, real[] b);
-bool operator !=(real[][] a, real[][] b);
-bool operator !=(pair a, pair b);
-bool[] operator !=(pair a, pair[] b);
-bool[] operator !=(pair[] a, pair b);
-bool[] operator !=(pair[] a, pair[] b);
-bool operator !=(pair[][] a, pair[][] b);
-bool operator !=(triple a, triple b);
-bool[] operator !=(triple a, triple[] b);
-bool[] operator !=(triple[] a, triple b);
-bool[] operator !=(triple[] a, triple[] b);
-bool operator !=(triple[][] a, triple[][] b);
-bool operator !=(string a, string b);
-bool[] operator !=(string a, string[] b);
-bool[] operator !=(string[] a, string b);
-bool[] operator !=(string[] a, string[] b);
-bool operator !=(string[][] a, string[][] b);
-bool[] operator !=(pen[] a, pen[] b);
-bool operator !=(pen a, pen b);
-bool operator !=(transform a, transform b);
-bool operator !=(file a, file b);
-bool operator !=(path a, path b);
-bool operator !=(path3 a, path3 b);
-bool operator !=(bool3 a, bool3 b);
-bool operator !=(autoscaleT a, autoscaleT b);
-bool operator !=(align a, align b);
-bool operator !=(processtime a, processtime b);
-bool operator !=(scaling a, scaling b);
-bool operator !=(scaling a, scaling b);
-bool operator !=(bounds a, bounds b);
-bool operator !=(light a, light b);
-bool operator !=(node a, node b);
-bool operator !=(Label a, Label b);
-bool operator !=(filltype a, filltype b);
-bool operator !=(coords3 a, coords3 b);
-bool operator !=(marker a, marker b);
-bool operator !=(ScaleT a, ScaleT b);
-bool operator !=(side a, side b);
-bool operator !=(cputime a, cputime b);
-bool operator !=(hsv a, hsv 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 !=(bool3 a, bool b);
-bool operator !=(marginT a, marginT b);
-bool operator !=(simplex a, simplex b);
-bool operator !=(scaleT a, scaleT b);
-bool operator !=(arrowhead a, arrowhead 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 !=(bool a, bool3 b);
-bool operator !=(slice a, slice b);
-bool operator !=(freezableBounds a, freezableBounds b);
-bool operator !=(projection a, projection b);
-bool operator !=(picture a, picture b);
-bool operator ==(bool a, bool b);
-bool[] operator ==(bool a, bool[] b);
-bool[] operator ==(bool[] a, bool b);
-bool[] operator ==(bool[] a, bool[] b);
-bool operator ==(bool[][] a, bool[][] b);
-bool operator ==(int a, int b);
-bool[] operator ==(int a, int[] b);
-bool[] operator ==(int[] a, int b);
-bool[] operator ==(int[] a, int[] b);
-bool operator ==(int[][] a, int[][] b);
-bool operator ==(real a, real b);
-bool[] operator ==(real a, real[] b);
-bool[] operator ==(real[] a, real b);
-bool[] operator ==(real[] a, real[] b);
-bool operator ==(real[][] a, real[][] b);
-bool operator ==(pair a, pair b);
-bool[] operator ==(pair a, pair[] b);
-bool[] operator ==(pair[] a, pair b);
-bool[] operator ==(pair[] a, pair[] b);
-bool operator ==(pair[][] a, pair[][] b);
-bool operator ==(triple a, triple b);
-bool[] operator ==(triple a, triple[] b);
-bool[] operator ==(triple[] a, triple b);
-bool[] operator ==(triple[] a, triple[] b);
-bool operator ==(triple[][] a, triple[][] b);
-bool operator ==(string a, string b);
-bool[] operator ==(string a, string[] b);
-bool[] operator ==(string[] a, string b);
-bool[] operator ==(string[] a, string[] b);
-bool operator ==(string[][] a, string[][] b);
-bool[] operator ==(pen[] a, pen[] b);
-bool operator ==(pen a, pen b);
-bool operator ==(transform a, transform b);
-bool operator ==(file a, file b);
-bool operator ==(path a, path b);
-bool operator ==(path3 a, path3 b);
-bool operator ==(bool3 a, bool3 b);
-bool operator ==(autoscaleT a, autoscaleT b);
-bool operator ==(align a, align b);
-bool operator ==(processtime a, processtime b);
-bool operator ==(scaling a, scaling b);
-bool operator ==(scaling a, scaling b);
-bool operator ==(bounds a, bounds b);
-bool operator ==(light a, light b);
-bool operator ==(node a, node b);
-bool operator ==(Label a, Label b);
-bool operator ==(filltype a, filltype b);
-bool operator ==(coords3 a, coords3 b);
-bool operator ==(marker a, marker b);
-bool operator ==(ScaleT a, ScaleT b);
-bool operator ==(side a, side b);
-bool operator ==(cputime a, cputime b);
-bool operator ==(hsv a, hsv 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 ==(bool3 a, bool b);
-bool operator ==(marginT a, marginT b);
-bool operator ==(simplex a, simplex b);
-bool operator ==(scaleT a, scaleT b);
-bool operator ==(arrowhead a, arrowhead 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 ==(bool a, bool3 b);
-bool operator ==(slice a, slice b);
-bool operator ==(freezableBounds a, freezableBounds b);
-bool operator ==(projection a, projection b);
-bool operator ==(picture a, picture b);
-bool operator ^(bool a, bool b);
-bool[] operator ^(bool a, bool[] b);
-bool[] operator ^(bool[] a, bool b);
-bool[] operator ^(bool[] a, bool[] b);
-int operator ^(int a, int b);
-int[] operator ^(int a, int[] b);
-int[] operator ^(int[] a, int b);
-int[] operator ^(int[] a, int[] b);
-real operator ^(real a, real b);
-real[] operator ^(real a, real[] b);
-real[] operator ^(real[] a, real b);
-real[] operator ^(real[] a, real[] b);
-pair operator ^(pair a, pair b);
-pair[] operator ^(pair a, pair[] b);
-pair[] operator ^(pair[] a, pair b);
-pair[] operator ^(pair[] a, pair[] b);
-transform operator ^(transform t, int n);
-real operator ^(real x, int y);
-pair operator ^(pair z, int y);
-bool operator |(bool a, bool b);
-bool[] operator |(bool a, bool[] b);
-bool[] operator |(bool[] a, bool b);
-bool[] operator |(bool[] a, bool[] b);
-pen NewCenturySchoolBook(string series=<default>, string shape=<default>);
-void()()[] saveFunctions;
-bool operator &(bool a, bool b);
-bool[] operator &(bool a, bool[] b);
-bool[] operator &(bool[] a, bool b);
-bool[] operator &(bool[] a, bool[] b);
-path operator &(path p, path q);
-path3 operator &(path3 p, path3 q);
-path operator &(path p, cycleToken tok);
+void write(file file=<default>, Label L, void suffix(file)=<default>);
+void save()();
+marginT EndPenMargin(path, pen);
+pair NNE;
+real[] tridiagonal(real[] a, real[] b, real[] c, real[] f);
+pen Dotted;
+pen Dotted(pen p=<default>);
+pair dir(real degrees);
+pair dir(explicit pair z);
+triple dir(explicit triple z);
+triple dir(real colatitude, real longitude);
+pair dir(path p, int t, int sign=<default>, bool normalize=<default>);
+pair dir(path p, real t, bool normalize=<default>);
+triple dir(path3 p, int t, int sign=<default>, bool normalize=<default>);
+triple dir(path3 p, real t, bool normalize=<default>);
+pair dir(path p);
+pair dir(path p, path q);
+int[][] diagonal(... int[]);
+real[][] diagonal(... real[]);
+pair[][] diagonal(... pair[]);
+real reltime(path p, real l);
+void marknodes(picture pic=<default>, frame f, path g);
+real newton(int iterations=<default>, real f(real), real fprime(real), real x, bool verbose=<default>);
+real newton(int iterations=<default>, real f(real), real fprime(real), real x1, real x2, bool verbose=<default>);
+string TeXify(string s);
+bool3 default;
+pair[] controlSpecifier(guide g, int t);
+void defaultpen(pen p);
+pen defaultpen();
+pen defaultpen;
+void defaultpen(real w);
+transform Slant(transform t);
+triple max3(frame f);
+triple max3(pen p);
+string defaultformat(int n, string trailingzero=<default>, bool fixed=<default>, bool signed=<default>);
+string defaultformat;
+pen dashdotted;
+string defaultseparator;
+string asydir();
+string defaultfilename;
+real longitude(triple v, bool warn=<default>);
+bool Blank(picture, path, pen, marginT(path, pen));
+tensionSpecifier tensionSpecifier(guide g, int t);
+marker marker(frame f=<default>, void markroutine(picture pic=<default>, frame f, path g)=<default>, bool above=<default>);
+marker marker(path[] g, void markroutine(picture pic=<default>, frame f, path g)=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+int Move;
+string location();
+string locatefile(string file);
+pen dotted;
+string blend(pen p);
+arrowhead HookHead;
+arrowhead HookHead(real dir=<default>, real barb=<default>);
+marker[] concat(... marker[][]);
+picture[] concat(... picture[][]);
+real[] concat(... real[][]);
+pair[] concat(... pair[][]);
+object[] concat(... object[][]);
+pen[] concat(... pen[][]);
+coord[] concat(... coord[][]);
+Legend[] concat(... Legend[][]);
+Label[] concat(... Label[][]);
+path[] concat(... path[][]);
+coord[] concat(... coord[][]);
+int[] concat(... int[][]);
+void()()[] concat(... void()()[][]);
+bool3[] concat(... bool3[][]);
+string[] concat(... string[][]);
+triple[] concat(... triple[][]);
+frame[] concat(... frame[][]);
+guide[] concat(... guide[][]);
+bool[] concat(... bool[][]);
+int OR(int a, int b);
+real log1p(real x);
+real[] log1p(real[] a);
+real infinity;
+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(light a, light b);
+bool alias(align a, align b);
+bool alias(processtime a, processtime b);
+bool alias(pair[] a, pair[] b);
+bool alias(scaling a, scaling b);
+bool alias(coord a, coord b);
+bool alias(scaleT a, scaleT b);
+bool alias(Legend a, Legend b);
+bool alias(Label a, Label b);
+bool alias(int[] a, int[] b);
+bool alias(string[][] a, string[][] b);
+bool alias(slice a, slice b);
+bool alias(freezableBounds a, freezableBounds b);
+bool alias(transformation a, transformation b);
+bool alias(picture a, picture b);
+bool alias(object[] a, object[] b);
+bool alias(marker a, marker b);
+bool alias(real[][] a, real[][] b);
+bool alias(bool3 a, bool3 b);
+bool alias(bool3[] a, bool3[] b);
+bool alias(coords3 a, coords3 b);
+bool alias(autoscaleT a, autoscaleT b);
+bool alias(side a, side b);
+bool alias(cputime a, cputime b);
+bool alias(string[] a, string[] b);
+bool alias(frame[] a, frame[] b);
+bool alias(coords2 a, coords2 b);
+bool alias(scaling a, scaling b);
+bool alias(node a, node b);
+bool alias(object a, object b);
+bool alias(marker[] a, marker[] b);
+bool alias(picture[] a, picture[] b);
+bool alias(bool[] a, bool[] b);
+bool alias(void()()[] a, void()()[] b);
+bool alias(pen[][] a, pen[][] b);
+bool alias(filltype a, filltype b);
+bool alias(simplex a, simplex b);
+bool alias(coord[] a, coord[] b);
+bool alias(projection a, projection b);
+bool alias(Legend[] a, Legend[] b);
+bool alias(Label[] a, Label[] b);
+bool alias(arrowhead a, arrowhead b);
+bool alias(path[] a, path[] b);
+bool alias(triple[] a, triple[] b);
+bool alias(coord a, coord b);
+bool alias(bounds a, bounds b);
+bool alias(ScaleT a, ScaleT b);
+bool alias(position a, position b);
+bool alias(real[] a, real[] b);
+bool alias(pen[] a, pen[] b);
+bool alias(hsv a, hsv b);
+bool alias(coords2 a, coords2 b);
+bool alias(pairOrTriple a, pairOrTriple b);
+real pi;
+int getint(string name=<default>, int default=<default>, string prompt=<default>, bool store=<default>);
+int bitreverse(int a, int bits);
+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);
+transform slant(real s);
+void breakpoint(code s=<default>);
+void breakpoints();
+void endgroup(frame f);
+void endgroup(picture pic=<default>);
+void endgroup3(frame f);
+int Floor(real x);
+pair gamma(explicit pair z);
+real gamma(real x);
+real pow10(real x);
+real[] pow10(real[] a);
+real[][] AtA(real[][] a);
+real bp;
+int[] sort(int[] a);
+int[][] sort(int[][] a);
+real[] sort(real[] a);
+real[][] sort(real[][] a);
+string[] sort(string[] a);
+string[][] sort(string[][] a);
+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>);
+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>);
+pen[] sort(pen[] a, bool less(pen, pen), bool stable=<default>);
+bool[] sort(bool[] a, bool less(bool, bool), bool stable=<default>);
+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>);
+coord[] sort(coord[] a, bool less(coord, coord), 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>);
+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>);
+string[] sort(string[] a, bool less(string, string), bool stable=<default>);
+pair[] sort(pair[] a, bool less(pair, pair), bool stable=<default>);
+real[][] sort(real[][] a, bool less(real[], real[]), bool stable=<default>);
+triple[] sort(triple[] a, bool less(triple, triple), bool stable=<default>);
+guide[] sort(guide[] a, bool less(guide, guide), bool stable=<default>);
+pen salmon;
+bool ignore;
+pen Pentype(int n);
+pen chartreuse;
+void latticeshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, transform t=<default>, bool copy=<default>);
+void latticeshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, bool copy=<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));
+bool Arrows(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
+bool Arrows(picture, path, pen, marginT(path, pen));
+int tell(file f);
+pen Yellow;
+pair up;
+guide reverse(guide g);
+string reverse(string s);
+path reverse(path p);
+path3 reverse(path3 p);
+triple[] reverse(triple[] a);
+int[] reverse(int[] a);
+real[] reverse(real[] a);
+int[] reverse(int n);
+string[] reverse(string[] a);
+pair[] reverse(pair[] a);
+bool[] reverse(bool[] a);
+void _labelpath(frame f, string s, string size, path g, string justify, pair offset, pen p);
+int floor(real x);
+void resetdefaultpen();
+real aSin(real x);
+pen darkred;
+transform Scale(transform t);
+pen mean(pen[] p, real opacity(real[])=<default>);
+pen[] mean(pen[][] palette, real opacity(real[])=<default>);
+string mktemp(string s);
+void sleep(int seconds);
+void drawstrokepath(picture pic=<default>, path g, pen strokepen, pen p=<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>);
+void unitsize(picture pic=<default>, real x, real y=<default>, real z=<default>);
+picture arrow2(arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>);
+path unitsquare;
+real arrowdir;
+real arrowbarb;
+pen yellow;
+int delete(string s);
+pen miterjoin;
+arrowhead SimpleHead;
+real arrowangle;
+real arrowlength;
+pen miterlimit(real x);
+real miterlimit(pen p=<default>);
+real arrowfactor;
+real arrowsize(pen p=<default>);
+real Tan(real deg);
+real arrowsizelimit;
+real arrow2sizelimit;
+real arrowhookfactor;
+real arrowtexfactor;
+void comma(file file);
+void deletepreamble();
+real[] arrowbasepoints(path base, path left, path right, real default=<default>);
+path arrowbase(path r, pair y, real t, real size);
+int choose(int n, int k);
+real hypot(real x, real y);
+path[] _strokepath(path g, pen p=<default>);
+void pause(string w=<default>);
+int ocgindex;
+pen springgreen;
+pen brown;
+bool scale(pen p);
+transform scale(real x);
+transform scale(real x, real y);
+real[][] scale(real x, real y, real z);
+scaleT scaleT(real T(real x), real Tinv(real x), bool logarithmic=<default>, bool automin=<default>, bool automax=<default>);
+string baseline(string s, string template=<default>);
+int[] findall(bool[] a);
+real[][] scale3(real s);
+int AND(int a, int b);
+real polar(triple v, bool warn=<default>);
+real radius(path p, real t);
+real radius(path3 p, real t);
+real radius(triple z0, triple c0, triple c1, triple z1, real t);
+transform scaleless(transform t);
+void makedraw(frame f, path g, pen p, int depth=<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;
+pair down;
+path arc(pair c, real r, real angle1, real angle2);
+path arc(pair c, explicit pair z1, explicit pair z2, bool direction=<default>);
+path arc(pair c, real r, real angle1, real angle2, bool direction);
+real[] cubicroots(real a, real b, real c, real d);
+pen green;
+real tan(real x);
+real[] tan(real[] a);
+pen longdashed;
+pair point(guide g, int t);
+pair point(path p, int t);
+pair point(path p, real t);
+triple point(path3 p, int t);
+triple point(path3 p, real t);
+pair point(picture pic=<default>, pair dir, bool user=<default>);
+pair point(object F, pair dir, transform t=<default>);
+pair point(frame f, pair dir);
+void progress(bool3 init=<default>);
+pen longdashdotted;
+void usepackage(string s, string options=<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>);
+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 fillrule(int n);
+int fillrule(pen p);
+pair ESE;
+pair project(triple v, real[][] t);
+bool prc(string format=<default>);
+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));
+void endl(file file);
+marginT TrueMargin(path, pen)(real begin, real end);
+pair bezier(pair a, pair b, pair c, pair d, real t);
+triple bezier(triple a, triple b, triple c, triple d, real t);
+pair SSE;
+pair bezierP(pair a, pair b, pair c, pair d, real t);
+triple bezierP(triple a, triple b, triple c, triple d, real t);
+pair bezierPP(pair a, pair b, pair c, pair d, real t);
+triple bezierPP(triple a, triple b, triple c, triple d, real t);
+real[] _projection();
+pair bezierPPP(pair a, pair b, pair c, pair d);
+triple bezierPPP(triple a, triple b, triple c, triple d);
+real Jn(int n, real x);
+int randMax;
+path nurb(pair z0, pair z1, pair z2, pair z3, real w0, real w1, real w2, real w3, int m);
+align NoAlign;
+bool EndBar(picture, path, pen, marginT(path, pen));
+bool EndBar(picture, path, pen, marginT(path, pen))(real size=<default>);
+Legend Legend(string label, pen plabel=<default>, pen p=<default>, frame mark=<default>, bool above=<default>);
+real Yn(int n, real x);
+int NOT(int a);
+pen[] monoPen;
+bool CW;
+bool all(bool[] a);
+real atanh(real x);
+real[] atanh(real[] a);
+frame UpsideDown(frame f);
+pair realmult(pair z, pair w);
+triple realmult(triple u, triple v);
+real acosh(real x);
+real[] acosh(real[] a);
+real realEpsilon;
+pair NW;
+real norm(real[] a);
+real norm(real[][] a);
+real norm(triple[][] a);
+int length(guide g);
+int length(string s);
+real length(pair z);
+real length(triple v);
+int length(path p);
+int length(path3 p);
+pair SW;
+void flush(file f);
+pen thin();
+pen palecyan;
+void warning(string s, string t, bool position=<default>);
+frame legend(picture pic=<default>, int perline=<default>, real xmargin=<default>, real ymargin=<default>, real linelength=<default>, real hskip=<default>, real vskip=<default>, real maxwidth=<default>, real maxheight=<default>, bool hstretch=<default>, bool vstretch=<default>, pen p=<default>);
+picture legend(Legend[] Legend, int perline=<default>, real linelength, real hskip, real vskip, real maxwidth=<default>, real maxheight=<default>, bool hstretch=<default>, bool vstretch=<default>);
+real Degrees(real radians);
+picture legenditem(Legend legenditem, real linelength);
+real legendhskip;
+real legendvskip;
+pen darkmagenta;
+real change2(triple[][] a);
+real legendmargin;
+bool None(picture, path, pen, marginT(path, pen));
+real dotfactor;
+real legendlinelength;
 string minipage(string s, real width=<default>);
 real legendmaxrelativewidth;
 real cross(explicit pair z, explicit pair w);
@@ -1852,6 +1296,132 @@
 string operator +(... string[] a);
 marginT operator +(path, pen)(marginT ma(path, pen), marginT mb(path, pen));
 pen[] operator +(pen[] a, pen b);
+int operator -(int a, int b);
+int[] operator -(int a, int[] b);
+int[] operator -(int[] a, int b);
+int[] operator -(int[] a, int[] b);
+int[][] operator -(int[][] a, int[][] b);
+int operator -(int a);
+int[] operator -(int[] a);
+int[][] operator -(int[][] a);
+real operator -(real a, real b);
+real[] operator -(real a, real[] b);
+real[] operator -(real[] a, real b);
+real[] operator -(real[] a, real[] b);
+real[][] operator -(real[][] a, real[][] b);
+real operator -(real a);
+real[] operator -(real[] a);
+real[][] operator -(real[][] a);
+pair operator -(pair a, pair b);
+pair[] operator -(pair a, pair[] b);
+pair[] operator -(pair[] a, pair b);
+pair[] operator -(pair[] a, pair[] b);
+pair[][] operator -(pair[][] a, pair[][] b);
+pair operator -(pair a);
+pair[] operator -(pair[] a);
+pair[][] operator -(pair[][] a);
+triple operator -(triple a, triple b);
+triple[] operator -(triple a, triple[] b);
+triple[] operator -(triple[] a, triple b);
+triple[] operator -(triple[] a, triple[] b);
+triple[][] operator -(triple[][] a, triple[][] b);
+triple operator -(triple a);
+triple[] operator -(triple[] a);
+triple[][] operator -(triple[][] a);
+int operator *(int a, int b);
+int[] operator *(int a, int[] b);
+int[] operator *(int[] a, int b);
+int[] operator *(int[] a, int[] b);
+int[][] operator *(int a, int[][] b);
+int[][] operator *(int[][] a, int b);
+real operator *(real a, real b);
+real[] operator *(real a, real[] b);
+real[] operator *(real[] a, real b);
+real[] operator *(real[] a, real[] b);
+real[][] operator *(real a, real[][] b);
+real[][] operator *(real[][] a, real b);
+pair operator *(pair a, pair b);
+pair[] operator *(pair a, pair[] b);
+pair[] operator *(pair[] a, pair b);
+pair[] operator *(pair[] a, pair[] b);
+pair[][] operator *(pair a, pair[][] b);
+pair[][] operator *(pair[][] a, pair b);
+triple[] operator *(real a, triple[] b);
+triple[][] operator *(real a, triple[][] b);
+triple[] operator *(triple[] a, real b);
+triple[][] operator *(triple[][] a, real b);
+pen operator *(real a, pen b);
+pen operator *(pen a, real b);
+transform operator *(transform a, transform b);
+pair operator *(transform t, pair z);
+path operator *(transform t, path g);
+pen operator *(transform t, pen p);
+frame operator *(transform t, frame f);
+frame operator *(real[][] t, frame f);
+real[] operator *(real[][] a, real[] b);
+real[] operator *(real[] a, real[][] b);
+int[][] operator *(int[][] a, int[][] b);
+real[][] operator *(real[][] a, real[][] b);
+pair[][] operator *(pair[][] a, pair[][] b);
+triple operator *(real[][] t, triple v);
+triple operator *(real x, triple v);
+triple operator *(triple v, real x);
+path3 operator *(real[][] t, path3 g);
+side operator *(real x, side s);
+Label operator *(real[][] t, Label L);
+picture operator *(transform t, picture orig);
+object operator *(transform t, explicit object F);
+path[] operator *(transform t, explicit path[] p);
+Label operator *(transform t, Label L);
+pair[] operator *(transform t, pair[] z);
+bounds operator *(transform t, bounds b);
+picture operator *(real[][] t, picture orig);
+bool operator init();
+int operator init();
+real operator init();
+string operator init();
+pair operator init();
+triple operator init();
+transform operator init();
+guide operator init();
+path operator init();
+path3 operator init();
+pen operator init();
+frame operator init();
+file operator init();
+marginT operator init();
+light operator init();
+align operator init();
+processtime operator init();
+filltype operator init();
+simplex operator init();
+projection operator init();
+arrowhead operator init();
+slice operator init();
+transformation operator init();
+picture operator init();
+marker operator init();
+hsv operator init();
+coords2 operator init();
+pairOrTriple operator init();
+coords2 operator init();
+scaling operator init();
+node operator init();
+object operator init();
+scaling operator init();
+coord operator init();
+scaleT operator init();
+Legend operator init();
+Label operator init();
+coord operator init();
+bounds operator init();
+ScaleT operator init();
+position operator init();
+bool3 operator init();
+coords3 operator init();
+autoscaleT operator init();
+side operator init();
+cputime operator init();
 real operator cast(int);
 pair operator cast(int);
 pair operator cast(real);
@@ -1893,33 +1463,33 @@
 guide operator cast(cycleToken tok);
 guide operator cast(curlSpecifier spec);
 guide operator cast(tensionSpecifier t);
-object operator cast(Label L);
-Label operator cast(object F);
+align operator cast(side side);
 guide[] operator cast(path[] g);
+frame operator cast(object F);
 hsv operator cast(pen p);
+bool3[] operator cast(bool[] b);
 position operator cast(pair x);
+object operator cast(Label L);
+Label operator cast(object F);
 pair operator cast(position P);
-bool3[] operator cast(bool[] b);
 object operator cast(frame f);
-align operator cast(pair dir);
 guide[] operator cast(pair[] z);
 path[] operator cast(guide[] g);
 bool operator cast(bool3 b);
-align operator cast(triple dir);
+align operator cast(pair dir);
 path[] operator cast(guide g);
 path[] operator cast(pair[] z);
+align operator cast(triple dir);
 path[] operator cast(path p);
 bool[] operator cast(bool3[] b);
+bool3 operator cast(bool b);
 position operator cast(int x);
 object operator cast(string s);
-align operator cast(side side);
-bool3 operator cast(bool b);
-position operator cast(real x);
-Label operator cast(string s);
 pair operator cast(pairOrTriple a);
 triple operator cast(pairOrTriple a);
 pen operator cast(hsv hsv);
-frame operator cast(object F);
+position operator cast(real x);
+Label operator cast(string s);
 pen deepred;
 bool error(file f);
 string operator ecast(int);
@@ -1934,90 +1504,521 @@
 int[] operator ecast(real[]);
 real[] operator ecast(string[] a);
 int[] operator ecast(string[] a);
-bool operator init();
-int operator init();
-real operator init();
-string operator init();
-pair operator init();
-triple operator init();
-transform operator init();
-guide operator init();
-path operator init();
-path3 operator init();
-pen operator init();
-frame operator init();
-file operator init();
-marginT operator init();
-simplex operator init();
-scaleT operator init();
-arrowhead operator init();
-filltype operator init();
-coords3 operator init();
-marker operator init();
-slice operator init();
-projection operator init();
-picture operator init();
-hsv operator init();
-coords2 operator init();
-coords2 operator init();
-transformation operator init();
-pairOrTriple operator init();
-object operator init();
-scaling operator init();
-scaling operator init();
-bounds operator init();
-light operator init();
-node operator init();
-Label operator init();
-coord operator init();
-coord operator init();
-Legend operator init();
-position operator init();
-ScaleT operator init();
-side operator init();
-cputime operator init();
-bool3 operator init();
-autoscaleT operator init();
-align operator init();
-processtime operator init();
+pair operator tuple(real x, real y);
+triple operator tuple(real x, real y, real z);
+transform operator tuple(real x, real y, real xx, real xy, real yx, real yy);
+real operator /(real a, real b);
+real[] operator /(real a, real[] b);
+real[] operator /(real[] a, real b);
+real[] operator /(real[] a, real[] b);
+real[][] operator /(real[][] a, real b);
+pair operator /(pair a, pair b);
+pair[] operator /(pair a, pair[] b);
+pair[] operator /(pair[] a, pair b);
+pair[] operator /(pair[] a, pair[] b);
+pair[][] operator /(pair[][] a, pair b);
+triple[] operator /(triple[] a, real b);
+real operator /(int a, int b);
+real[] operator /(int[] a, int b);
+real[] operator /(int a, int[] b);
+real[] operator /(int[] a, int[] b);
+triple operator /(triple v, real x);
+path[] texpath(string s, pen p, bool tex=<default>, bool bbox=<default>);
+path[] texpath(Label L, bool tex=<default>, bool bbox=<default>);
+bool uptodate();
+int operator #(int a, int b);
+int[] operator #(int a, int[] b);
+int[] operator #(int[] a, int b);
+int[] operator #(int[] a, int[] b);
+int operator %(int a, int b);
+int[] operator %(int a, int[] b);
+int[] operator %(int[] a, int b);
+int[] operator %(int[] a, int[] b);
+real operator %(real a, real b);
+real[] operator %(real a, real[] b);
+real[] operator %(real[] a, real b);
+real[] operator %(real[] a, real[] b);
+bool operator ^(bool a, bool b);
+bool[] operator ^(bool a, bool[] b);
+bool[] operator ^(bool[] a, bool b);
+bool[] operator ^(bool[] a, bool[] b);
+int operator ^(int a, int b);
+int[] operator ^(int a, int[] b);
+int[] operator ^(int[] a, int b);
+int[] operator ^(int[] a, int[] b);
+real operator ^(real a, real b);
+real[] operator ^(real a, real[] b);
+real[] operator ^(real[] a, real b);
+real[] operator ^(real[] a, real[] b);
+pair operator ^(pair a, pair b);
+pair[] operator ^(pair a, pair[] b);
+pair[] operator ^(pair[] a, pair b);
+pair[] operator ^(pair[] a, pair[] b);
+transform operator ^(transform t, int n);
+real operator ^(real x, int y);
+pair operator ^(pair z, int y);
+bool operator ==(bool a, bool b);
+bool[] operator ==(bool a, bool[] b);
+bool[] operator ==(bool[] a, bool b);
+bool[] operator ==(bool[] a, bool[] b);
+bool operator ==(bool[][] a, bool[][] b);
+bool operator ==(int a, int b);
+bool[] operator ==(int a, int[] b);
+bool[] operator ==(int[] a, int b);
+bool[] operator ==(int[] a, int[] b);
+bool operator ==(int[][] a, int[][] b);
+bool operator ==(real a, real b);
+bool[] operator ==(real a, real[] b);
+bool[] operator ==(real[] a, real b);
+bool[] operator ==(real[] a, real[] b);
+bool operator ==(real[][] a, real[][] b);
+bool operator ==(pair a, pair b);
+bool[] operator ==(pair a, pair[] b);
+bool[] operator ==(pair[] a, pair b);
+bool[] operator ==(pair[] a, pair[] b);
+bool operator ==(pair[][] a, pair[][] b);
+bool operator ==(triple a, triple b);
+bool[] operator ==(triple a, triple[] b);
+bool[] operator ==(triple[] a, triple b);
+bool[] operator ==(triple[] a, triple[] b);
+bool operator ==(triple[][] a, triple[][] b);
+bool operator ==(string a, string b);
+bool[] operator ==(string a, string[] b);
+bool[] operator ==(string[] a, string b);
+bool[] operator ==(string[] a, string[] b);
+bool operator ==(string[][] a, string[][] b);
+bool[] operator ==(pen[] a, pen[] b);
+bool operator ==(pen a, pen b);
+bool operator ==(transform a, transform b);
+bool operator ==(file a, file b);
+bool operator ==(path a, path b);
+bool operator ==(path3 a, path3 b);
+bool operator ==(bool3 a, bool3 b);
+bool operator ==(coords3 a, coords3 b);
+bool operator ==(autoscaleT a, autoscaleT b);
+bool operator ==(side a, side b);
+bool operator ==(cputime a, cputime b);
+bool operator ==(coords2 a, coords2 b);
+bool operator ==(scaling a, scaling b);
+bool operator ==(node a, node b);
+bool operator ==(object a, object b);
+bool operator ==(filltype a, filltype b);
+bool operator ==(simplex a, simplex b);
+bool operator ==(projection a, projection b);
+bool operator ==(arrowhead a, arrowhead b);
+bool operator ==(coord a, coord b);
+bool operator ==(bounds a, bounds b);
+bool operator ==(ScaleT a, ScaleT b);
+bool operator ==(position a, position b);
+bool operator ==(hsv a, hsv b);
+bool operator ==(coords2 a, coords2 b);
+bool operator ==(pairOrTriple a, pairOrTriple b);
+bool operator ==(bool3 a, bool b);
+bool operator ==(marginT a, marginT b);
+bool operator ==(light a, light b);
+bool operator ==(align a, align b);
+bool operator ==(processtime a, processtime b);
+bool operator ==(scaling a, scaling b);
+bool operator ==(coord a, coord b);
+bool operator ==(scaleT a, scaleT b);
+bool operator ==(Legend a, Legend b);
+bool operator ==(Label a, Label b);
+bool operator ==(bool a, bool3 b);
+bool operator ==(slice a, slice b);
+bool operator ==(freezableBounds a, freezableBounds b);
+bool operator ==(transformation a, transformation b);
+bool operator ==(picture a, picture b);
+bool operator ==(marker a, marker b);
+bool operator !=(bool a, bool b);
+bool[] operator !=(bool a, bool[] b);
+bool[] operator !=(bool[] a, bool b);
+bool[] operator !=(bool[] a, bool[] b);
+bool operator !=(bool[][] a, bool[][] b);
+bool operator !=(int a, int b);
+bool[] operator !=(int a, int[] b);
+bool[] operator !=(int[] a, int b);
+bool[] operator !=(int[] a, int[] b);
+bool operator !=(int[][] a, int[][] b);
+bool operator !=(real a, real b);
+bool[] operator !=(real a, real[] b);
+bool[] operator !=(real[] a, real b);
+bool[] operator !=(real[] a, real[] b);
+bool operator !=(real[][] a, real[][] b);
+bool operator !=(pair a, pair b);
+bool[] operator !=(pair a, pair[] b);
+bool[] operator !=(pair[] a, pair b);
+bool[] operator !=(pair[] a, pair[] b);
+bool operator !=(pair[][] a, pair[][] b);
+bool operator !=(triple a, triple b);
+bool[] operator !=(triple a, triple[] b);
+bool[] operator !=(triple[] a, triple b);
+bool[] operator !=(triple[] a, triple[] b);
+bool operator !=(triple[][] a, triple[][] b);
+bool operator !=(string a, string b);
+bool[] operator !=(string a, string[] b);
+bool[] operator !=(string[] a, string b);
+bool[] operator !=(string[] a, string[] b);
+bool operator !=(string[][] a, string[][] b);
+bool[] operator !=(pen[] a, pen[] b);
+bool operator !=(pen a, pen b);
+bool operator !=(transform a, transform b);
+bool operator !=(file a, file b);
+bool operator !=(path a, path b);
+bool operator !=(path3 a, path3 b);
+bool operator !=(bool3 a, bool3 b);
+bool operator !=(coords3 a, coords3 b);
+bool operator !=(autoscaleT a, autoscaleT b);
+bool operator !=(side a, side b);
+bool operator !=(cputime a, cputime b);
+bool operator !=(coords2 a, coords2 b);
+bool operator !=(scaling a, scaling b);
+bool operator !=(node a, node b);
+bool operator !=(object a, object b);
+bool operator !=(filltype a, filltype b);
+bool operator !=(simplex a, simplex b);
+bool operator !=(projection a, projection b);
+bool operator !=(arrowhead a, arrowhead b);
+bool operator !=(coord a, coord b);
+bool operator !=(bounds a, bounds b);
+bool operator !=(ScaleT a, ScaleT b);
+bool operator !=(position a, position b);
+bool operator !=(hsv a, hsv b);
+bool operator !=(coords2 a, coords2 b);
+bool operator !=(pairOrTriple a, pairOrTriple b);
+bool operator !=(bool3 a, bool b);
+bool operator !=(marginT a, marginT b);
+bool operator !=(light a, light b);
+bool operator !=(align a, align b);
+bool operator !=(processtime a, processtime b);
+bool operator !=(scaling a, scaling b);
+bool operator !=(coord a, coord b);
+bool operator !=(scaleT a, scaleT b);
+bool operator !=(Legend a, Legend b);
+bool operator !=(Label a, Label b);
+bool operator !=(bool a, bool3 b);
+bool operator !=(slice a, slice b);
+bool operator !=(freezableBounds a, freezableBounds b);
+bool operator !=(transformation a, transformation b);
+bool operator !=(picture a, picture b);
+bool operator !=(marker a, marker b);
+bool operator <(int a, int b);
+bool[] operator <(int a, int[] b);
+bool[] operator <(int[] a, int b);
+bool[] operator <(int[] a, int[] b);
+bool operator <(real a, real b);
+bool[] operator <(real a, real[] b);
+bool[] operator <(real[] a, real b);
+bool[] operator <(real[] a, real[] b);
+bool operator <(string a, string b);
+bool[] operator <(string a, string[] b);
+bool[] operator <(string[] a, string b);
+bool[] operator <(string[] a, string[] b);
+bool operator <=(int a, int b);
+bool[] operator <=(int a, int[] b);
+bool[] operator <=(int[] a, int b);
+bool[] operator <=(int[] a, int[] b);
+bool operator <=(real a, real b);
+bool[] operator <=(real a, real[] b);
+bool[] operator <=(real[] a, real b);
+bool[] operator <=(real[] a, real[] b);
+bool operator <=(string a, string b);
+bool[] operator <=(string a, string[] b);
+bool[] operator <=(string[] a, string b);
+bool[] operator <=(string[] a, string[] b);
+bool operator <=(coord a, coord b);
+bool operator <=(coord a, coord b);
+void srand(int seed);
+bool operator >(int a, int b);
+bool[] operator >(int a, int[] b);
+bool[] operator >(int[] a, int b);
+bool[] operator >(int[] a, int[] b);
+bool operator >(real a, real b);
+bool[] operator >(real a, real[] b);
+bool[] operator >(real[] a, real b);
+bool[] operator >(real[] a, real[] b);
+bool operator >(string a, string b);
+bool[] operator >(string a, string[] b);
+bool[] operator >(string[] a, string b);
+bool[] operator >(string[] a, string[] b);
+bool operator >=(int a, int b);
+bool[] operator >=(int a, int[] b);
+bool[] operator >=(int[] a, int b);
+bool[] operator >=(int[] a, int[] b);
+bool operator >=(real a, real b);
+bool[] operator >=(real a, real[] b);
+bool[] operator >=(real[] a, real b);
+bool[] operator >=(real[] a, real[] b);
+bool operator >=(string a, string b);
+bool[] operator >=(string a, string[] b);
+bool[] operator >=(string[] a, string b);
+bool[] operator >=(string[] a, string[] b);
+bool operator >=(coord a, coord b);
+bool operator >=(coord a, coord b);
+filltype UnFill(real xmargin=<default>, real ymargin=<default>);
+filltype UnFill;
+real degrees(pair z, bool warn=<default>);
+real degrees(real radians);
+bool[] operator !(bool[] a);
+bool operator !(bool b);
+path[] operator ^^(path p, path q);
+path[] operator ^^(explicit path[] p, path q);
+path[] operator ^^(path p, explicit path[] q);
+path[] operator ^^(explicit path[] p, explicit path[] q);
+guide operator ::(... guide[]);
+pen Helvetica(string series=<default>, string shape=<default>);
+transform reflect(pair a, pair b);
+bool Bars(picture, path, pen, marginT(path, pen));
+bool Bars(picture, path, pen, marginT(path, pen))(real size=<default>);
+void none(file file);
+int factorial(int n);
+real log(real x);
+real[] log(real[] a);
+pair log(explicit pair z);
+guide operator ..(... guide[]);
+guide operator ..(... guide[])(tensionSpecifier t);
+path polygon(int n);
+guide operator --(... guide[]);
+guide operator ---(... guide[]);
+pen NewCenturySchoolBook(string series=<default>, string shape=<default>);
+void()()[] saveFunctions;
+bool operator &(bool a, bool b);
+bool[] operator &(bool a, bool[] b);
+bool[] operator &(bool[] a, bool b);
+bool[] operator &(bool[] a, bool[] b);
+path operator &(path p, path q);
+path3 operator &(path3 p, path3 q);
+path operator &(path p, cycleToken tok);
+bool operator |(bool a, bool b);
+bool[] operator |(bool a, bool[] b);
+bool[] operator |(bool[] a, bool b);
+bool[] operator |(bool[] a, bool[] b);
+string texify(string s);
+guide operator controls(pair zout, pair zin);
+guide operator controls(pair z);
+bool empty(frame f);
+tensionSpecifier operator tension(real tout, real tin, bool atleast);
+tensionSpecifier operator tension(real t, bool atLeast);
+void end(picture pic=<default>);
+curlSpecifier operator curl(real gamma, int p);
+guide operator spec(pair z, int p);
+string substr(string s, int pos, int n=<default>);
+pen paleyellow;
+file output(string name=<default>, bool update=<default>, string comment=<default>, string mode=<default>);
+pen ZapfDingbats(string series=<default>, string shape=<default>);
+real tanh(real x);
+real[] tanh(real[] a);
+real interp(real a, real b, real t);
+pair interp(explicit pair a, explicit pair b, real t);
+triple interp(triple a, triple b, real t);
+pen interp(pen a, pen b, real t);
+frame Seascape(frame f);
+bool interior(int windingnumber, pen fillrule);
+real[] intersect(path p, path q, real fuzz=<default>);
+real[] intersect(path3 p, path3 q, real fuzz=<default>);
+real[] intersect(path3 p, triple[][] p, real fuzz=<default>);
+bool interactive();
+real[][] intersections(path p, path q, real fuzz=<default>);
+real[] intersections(path p, explicit pair a, explicit pair b, real fuzz=<default>);
+real[][] intersections(path3 p, path3 q, real fuzz=<default>);
+real[][] intersections(path3 p, triple[][] p, real fuzz=<default>);
+int animate(string args=<default>, string file=<default>, string format=<default>);
+void generate_random_backtrace();
+pair intersectionpoint(path p, path q, real fuzz=<default>);
+pair[] intersectionpoints(path p, path q, real fuzz=<default>);
+pair[] intersectionpoints(explicit path[] p, explicit path[] q, real fuzz=<default>);
+void asy(string format, bool overwrite=<default> ... string[] s);
+bool latex();
+bool adjust(pen p);
+pen adjust(pen p, real arclength, bool cyclic);
+pair Align;
+void exit();
+real[] uniform(real a, real b, int n);
+pair viewportsize;
+pair viewportmargin;
+string VERSION;
+real insphere(triple a, triple b, triple c, triple d, triple e);
+void filldraw(picture pic=<default>, path[] g, pen fillpen=<default>, pen drawpen=<default>);
+void filldraw(frame f, path[] g, pen fillpen=<default>, pen drawpen=<default>);
+real dot(real[] a, real[] b);
+pair dot(pair[] a, pair[] b);
+real dot(explicit pair z, explicit pair w);
+real dot(triple u, triple v);
+void dot(picture pic=<default>, Label[] L=<default>, explicit path g, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
+marker dot(pen p=<default>, filltype filltype=<default>);
+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>);
+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>);
+void list(string s, bool imports=<default>);
+pair NNW;
+string phantom(string s);
+void atexit(void f());
+void atexit()();
+real getreal(string name=<default>, real default=<default>, string prompt=<default>, bool store=<default>);
+int convert(string args=<default>, string file=<default>, string format=<default>);
+pair WNW;
+pen palegray;
+pen palegreen;
+pen palegrey;
+void clip(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
+void clip(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
+marginT Margin(path, pen)(real begin, real end);
+marginT Margin(path, pen);
+position Relative(real position);
+side Relative(explicit pair align);
+marginT Margins(path, pen);
+pair truepoint(picture pic=<default>, pair dir, bool user=<default>);
+real arclength(path p);
+real arclength(path3 p);
+bool finite(real x);
+bool finite(pair z);
+bool finite(triple v);
+void updatefunction();
+bool implicitshipout;
+void _draw(frame f, path g, pen p);
+void _draw(frame f, path3 g, triple center=<default>, pen p, int interaction=<default>);
+void _draw(picture pic, path g, pen p, marginT margin(path, pen));
+frame align(frame f, pair align);
+object align(object F, pair align);
+path[] align(path[] g, transform t=<default>, pair position, pair align, pen p=<default>);
+real unitrand();
+string[] history(string name, int n=<default>);
+string[] history(int n=<default>);
+coord[] maxcoords(coord[] in, bool operator <=(coord, coord));
+coord[] maxcoords(coord[] in, bool operator <=(coord, coord));
+pen AvantGarde(string series=<default>, string shape=<default>);
+frame enclose(string prefix=<default>, object F, string format=<default>);
+int count;
+real atan2(real y, real x);
+bool inside(explicit path[] g, pair z, pen fillrule=<default>);
+bool inside(path g, pair z, pen fillrule=<default>);
+int inside(path p, path q, pen fillrule=<default>);
+pair inside(path p, pen fillrule=<default>);
+pair rectify(pair dir);
+arrowhead TeXHead;
+bool initialized(int a);
+bool initialized(real a);
+bool initialized(pair a);
+bool initialized(triple a);
+path[] margin(path[] g, real xmargin, real ymargin);
+pair relative(picture pic=<default>, pair z);
+real erfc(real x);
+int windingnumber(path[] p, pair z);
+real expansionfactor;
+void addArrow(picture pic, arrowhead arrowhead, path g, pen p, real size, real angle, filltype filltype, real position);
+void exitfunction();
+pen gray(pen p);
+pen gray(real gray);
+pen gray;
+real relativedistance(real theta, real phi, real t, bool atleast);
+path circle(pair c, real r);
+void overloadedMessage(file file);
+pen deepmagenta;
+real circlescale;
+string math(string s);
+real circleprecision;
+int Allow;
+real determinant(real[][] a);
+void functionshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, string shader=<default>, bool copy=<default>);
+void functionshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, string shader, bool copy=<default>);
+pen red;
+pair[] dirSpecifier(guide g, int t);
+void abort(string s=<default>);
+bool Aspect;
+string hex(pen p);
+int hex(string s);
+path brace(pair a, pair b, real amplitude=<default>);
+void deactivatequote(picture pic=<default>);
+string format(string format, int x, string locale=<default>);
+string format(string format, bool forcemath=<default>, string separator, real x, string locale=<default>);
+string format(string format=<default>, bool forcemath=<default>, real x, string locale=<default>);
+real expm1(real x);
+real[] expm1(real[] a);
+void activatequote(picture pic=<default>);
+int undefined;
+transform zeroTransform;
+string ask(string prompt);
+frame[] fit2(picture[] pictures, picture all);
+pen linecap(int n);
+int linecap(pen p=<default>);
+string outname();
+void newpage(frame f);
+void newpage(picture pic=<default>);
+pen fontcommand(string s);
+real bracemidangle;
+pair accel(path p, int t, int sign=<default>);
+pair accel(path p, real t);
+triple accel(path3 p, int t, int sign=<default>);
+triple accel(path3 p, real t);
+frame Portrait(frame f);
+real braceinnerangle;
+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);
+real bracedefaultratio;
+bool prconly(string format=<default>);
+pen Black;
+triple size3(frame f);
+void size3(picture pic=<default>, real x, real y=<default>, real z=<default>, bool keepAspect=<default>);
+bool eof(file f);
+frame dotframe(pen p=<default>, filltype filltype=<default>);
+frame dotframe;
+real realMax;
+pair NE;
+real realMin;
+path nib(pen p);
+file _outpipe;
+void gouraudshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, pair[] z, int[] edges, bool copy=<default>);
+void gouraudshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, int[] edges, bool copy=<default>);
+void gouraudshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, pair[] z, int[] edges, bool copy=<default>);
+void gouraudshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, int[] edges, bool copy=<default>);
+pair[] fft(pair[] a, int sign=<default>);
+pair SE;
+pen nobasealign;
 sCAD operator init();
-frame NoBox(frame f);
 real animationdelay;
 animation operator init();
+frame NoBox(frame f);
 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 removeDuplicates(path p);
+path uncycle(path p, real t);
 path[] bezulate(path[] p);
-bool checkSegment(path g, pair p, pair q);
+real[][] intersections(pair a, pair b, path p);
 void connect(path[] paths, path[] result, path[] patch);
-path uncycle(path p, real t);
-path section(path p, real t1, real t2, bool loop=<default>);
-real[][] intersections(pair a, pair b, path p);
-real maxrefinements;
+int countIntersections(path[] p, pair start, pair end);
 real duplicateFuzz;
 path subdivide(path p);
 bool isDuplicate(pair a, pair b, real relSize);
+bool checkSegment(path g, pair p, pair q);
+path section(path p, real t1, real t2, bool loop=<default>);
+real fuzz;
+real maxrefinements;
 path[][] containmentTree(path[] paths);
-real fuzz;
-path removeDuplicates(path p);
-int countIntersections(path[] p, pair start, pair end);
-binarytree binarytree(... key[] keys);
-key nil;
-key key(int n, bool active=<default>);
-real minDistDefault;
+binarytree searchtree(... int[] keys);
 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>);
 real nodeMarginDefault;
-key operator cast(int n);
-int operator cast(key k);
-int[] operator cast(key[] k);
+key key(int n, bool active=<default>);
+binarytree binarytree(... key[] keys);
 binarytreeNode binarytreeNode(int key);
+key nil;
+real minDistDefault;
 binarytreeNode operator init();
 key operator init();
 binarytree operator init();
-binarytree searchtree(... int[] keys);
+key operator cast(int n);
+int operator cast(key k);
+int[] operator cast(key[] k);
+line intersection(face a, face b);
 real epsilon;
-void add(picture pic=<default>, face[] faces, projection P=<default>);
+splitface split(face a, face cut, projection P);
 face operator init();
 line operator init();
 half operator init();
@@ -2025,227 +2026,333 @@
 bsp operator init();
 picture operator cast(face f);
 face operator cast(path3 p);
-line intersection(face a, face b);
-splitface split(face a, face cut, projection P);
-list_data viridis;
-list_data magma;
-list_data inferno;
-list_data cividis;
-seg_data wistia;
-seg_data winter;
-list_data tab20c;
-list_data tab20;
-list_data tab10;
-seg_data nipy_spectral;
-seg_data gist_stern;
-seg_data gist_ncar;
-seg_data gist_earth;
-list_data bwr;
-list_data brg;
+void add(picture pic=<default>, face[] faces, projection P=<default>);
+list_data Set2;
 list_data YlOrBr;
 list_data YlGn;
-list_data RdGy;
-list_data Purples;
-list_data Paired;
-list_data Oranges;
-list_data OrRd;
-seg_data CMRmap;
 list_data BuPu;
+list_data tab20;
+list_data tab20b;
+list_data tab20c;
+seg_data gist_earth;
+seg_data gist_ncar;
+seg_data gist_stern;
+list_data PuBuGn;
+seg_data hot;
 list_data Blues;
-real[] makeMappingArray(int N, triple[] data, real gamma=<default>);
-list_data Accent;
-list_data twilight;
-seg_data binary;
-list_data YlGnBu;
-list_data PiYG;
+seg_data autumn;
+list_data PuBu;
+list_data plasma;
+seg_data nipy_spectral;
+seg_data spring;
+list_data Set3;
+list_data Dark2;
+seg_data bone;
+seg_data hsv;
+list_data bwr;
+list_data viridis;
+list_data Reds;
+list_data inferno;
 seg_data copper;
+seg_data pink;
+list_data YlOrRd;
 seg_data gray;
-seg_data summer;
-list_data Spectral;
-list_data PRGn;
-list_data RdPu;
 list_data RdYlGn;
+seg_data CMRmap;
+seg_data winter;
+list_data Greys;
+list_data Purples;
+list_data BuGn;
+list_data Oranges;
+list_data RdGy;
+seg_data binary;
+list_data magma;
+list_data cividis;
+seg_data operator init();
+list_data operator init();
+list_data BrBG;
 list_data seismic;
-list_data PuOr;
-list_data PuBu;
+list_data Greens;
+list_data YlGnBu;
+list_data PuRd;
+real[] makeMappingArray(int N, triple[] data, real gamma=<default>);
 seg_data coolwarm;
-seg_data jet;
-list_data Reds;
-list_data Set1;
-list_data Set3;
+list_data RdPu;
+list_data RdBu;
+list_data twilight;
 list_data twilight_shifted;
-seg_data cool;
+seg_data wistia;
+list_data brg;
 list_data Pastel1;
-seg_data operator init();
-list_data operator init();
-list_data BuGn;
+list_data Pastel2;
 list_data GnBu;
-list_data Pastel2;
-list_data Greens;
-seg_data autumn;
-seg_data hsv;
-list_data Dark2;
+list_data Accent;
+list_data PuOr;
+list_data Spectral;
+list_data PiYG;
+list_data OrRd;
+seg_data cool;
+list_data PRGn;
+list_data Set1;
+list_data tab10;
+list_data Paired;
+seg_data jet;
+seg_data summer;
 list_data RdYlBu;
-list_data RdBu;
-seg_data bone;
-seg_data spring;
-list_data YlOrRd;
-list_data BrBG;
-seg_data pink;
-list_data Set2;
-list_data PuBuGn;
-list_data Greys;
-list_data plasma;
-list_data PuRd;
-list_data tab20b;
-seg_data hot;
-void addseg(pair[][] gds, segment seg);
+segment case1(pair p0, pair p1, int edge);
+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>);
+pen[][] interior(picture pic=<default>, guide[][] g, pen[] palette);
 pen[] extend(pen[] palette, pen below, pen above);
 guide[][] connect(pair[][][] points, real[] c, guide join(... guide[]));
+segment case2(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge);
 void collect(pair[][][] points, real[] c);
 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);
+segment operator init();
+void addseg(pair[][] gds, segment seg);
+void fill(picture pic=<default>, guide[][] g, pen[][] palette);
 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>);
-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>);
-vertex[][] contour3(real[][][] f, real[][][] midpoint=<default>, triple a, triple b, projection P=<default>);
-vertex[][] contour3(real f(real, real, real), triple a, triple b, int nx=<default>, int ny=<default>, int nz=<default>, projection P=<default>);
+real eps;
+surface surface(vertex[][] g);
 weighted operator init();
 bucket operator init();
 vertex operator init();
 object operator init();
-surface surface(vertex[][] g);
+vertex[][] contour3(triple[][][] v, real[][][] f, real[][][] midpoint=<default>, projection P=<default>);
+vertex[][] contour3(real[][][] f, real[][][] midpoint=<default>, triple a, triple b, projection P=<default>);
+vertex[][] contour3(real f(real, real, real), triple a, triple b, int nx=<default>, int ny=<default>, int nz=<default>, projection P=<default>);
 real eps;
-real treeMinNodeWidth;
+void draw(TreeNode root, pair pos);
+real treeNodeStep;
 void drawAll(TreeNode node, frame f);
-real treeNodeStep;
-void draw(TreeNode root, pair pos);
-TreeNode makeNode(TreeNode parent=<default>, frame f);
-TreeNode makeNode(TreeNode parent=<default>, Label label);
+real layout(int level, TreeNode node);
 TreeNode operator init();
 void add(TreeNode child, TreeNode parent);
 real treeLevelStep;
-real layout(int level, TreeNode node);
+real treeMinNodeWidth;
+TreeNode makeNode(TreeNode parent=<default>, frame f);
+TreeNode makeNode(TreeNode parent=<default>, Label label);
 string link(string label, string text=<default>);
 string embed(string name, string text=<default>, string options=<default>, real width=<default>, real height=<default>);
 string embedplayer(string name, string text=<default>, string options=<default>, real width=<default>, real height=<default>);
 string link(string label, string text=<default>);
+string embed(string name, string text=<default>, string options=<default>, real width=<default>, real height=<default>, string image=<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>);
+real gluonratio;
+real gluonamplitude;
+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>);
+void drawGhost(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 drawVertex(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
+void drawVertexO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
+void drawVertexX(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
+void drawVertexBox(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
+void drawVertexBoxO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<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>);
-void drawVertexBox(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
 void drawVertexTriangle(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
-void drawVertex(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
+void drawVertexTriangleO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
+void drawVertexBoxX(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
+void do_overpaint(picture pic, path p, pen bgpen, real halfwidth, real vertexangle);
+void texshipout(string stem, picture pic=<default>, bool xalign=<default>);
+pen doublelinepen;
+real doublelinespacing;
 void drawDoubleLine(picture pic=<default>, path p, pen fgpen=<default>, real dlspacing=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
-void drawGhost(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>);
-real momarrowmargin;
-real momarrowoffset;
-pen momarrowpen;
-bool currentmomarrow(picture, path, pen, marginT(path, pen));
-real vertexsize;
-real minvertexangle;
-real linemargin;
+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>);
 bool overpaint;
-bool currentarrow(picture, path, pen, marginT(path, pen));
-real doublelinespacing;
+path photon(path p, real amp=<default>, real width=<default>);
+pen photonpen;
+real photonratio;
 real photonamplitude;
-real gluonamplitude;
-real photonratio;
-pen gluonpen;
+string includegraphicscommand;
+pen momarrowpen;
 real momarrowsize(pen p=<default>);
-void drawVertexX(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
-void drawVertexO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
-real bigvertexsize;
 real momarrowlength;
-path photon(path p, real amp=<default>, real width=<default>);
-path gluon(path p, real amp=<default>, real width=<default>);
-bool YAlign;
-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>);
-pen backgroundpen;
-bool appendsuffix;
-void drawVertexTriangleO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
+real momarrowoffset;
+real momarrowmargin;
 real momarrowfactor;
+bool XYAlign;
 pen vertexpen;
+real vertexsize;
+path momArrowPath(path p, align align, position pos, real offset=<default>, real length=<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>);
-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>);
-path momArrowPath(path p, align align, position pos, real offset=<default>, real length=<default>);
-real gluonratio;
-void texshipout(string stem, picture pic=<default>, bool xalign=<default>);
-void fmdefaults();
-pen doublelinepen;
-pen ghostpen;
+bool YAlign;
+pen backgroundpen;
 pen scalarpen;
-void drawVertexBoxX(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
-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>);
 pen fermionpen;
-void do_overpaint(picture pic, path p, pen bgpen, real halfwidth, real vertexangle);
-string includegraphicscommand;
-pen photonpen;
 pen bigvertexpen;
-Dir Down;
+real bigvertexsize;
+real minvertexangle;
+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 fmdefaults();
+real linemargin;
+pen ghostpen;
+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>);
+bool currentarrow(picture, path, pen, marginT(path, pen));
+bool currentmomarrow(picture, path, pen, marginT(path, pen));
+bool appendsuffix;
+path gluon(path p, real amp=<default>, real width=<default>);
+pen gluonpen;
 Dir Left;
-block bevel(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dh=<default>, real dw=<default>, real minwidth=<default>, real minheight=<default>);
 block roundrectangle(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real ds=<default>, real dw=<default>, real minwidth=<default>, real minheight=<default>);
 block diamond(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real ds=<default>, real dw=<default>, real height=<default>, real minwidth=<default>, real minheight=<default>);
+void draw(picture pic=<default>, block block, pen p=<default>);
+real minblockwidth;
+real minblockheight;
 real defaultexcursion;
+path path(pair[] point ... flowdir[] dir);
+Dir Up;
 real mincirclediameter;
-real minblockheight;
-Dir Up;
-Dir Right;
-real minblockwidth;
-block circle(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dr=<default>, real mindiameter=<default>);
-block operator --(block b1, Label label);
-block operator --(block b1, Dir dir);
-block operator --(block b, bool arrowbar(picture, path, pen, marginT(path, pen)));
+flowdir Vertical;
 block rectangle(object header, object body, pair center=<default>, pen headerpen=<default>, pen bodypen=<default>, pen drawpen=<default>, real dx=<default>, real minheaderwidth=<default>, real minheaderheight=<default>, real minbodywidth=<default>, real minbodyheight=<default>);
 block rectangle(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dx=<default>, real minwidth=<default>, real minheight=<default>);
-path path(pair[] point ... flowdir[] dir);
-void draw(picture pic=<default>, block block, pen p=<default>);
-flowdir Vertical;
+block parallelogram(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dx=<default>, real slope=<default>, real minwidth=<default>, real minheight=<default>);
+block blockconnector(block, block)(picture pic, transform t, pen p=<default>, marginT margin(path, pen)=<default>);
+block circle(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dr=<default>, real mindiameter=<default>);
 flowdir operator init();
 block operator init();
 Dir operator init();
-block blockconnector(block, block)(picture pic, transform t, pen p=<default>, marginT margin(path, pen)=<default>);
-block parallelogram(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dx=<default>, real slope=<default>, real minwidth=<default>, real minheight=<default>);
+block operator --(block b1, Label label);
+block operator --(block b1, Dir dir);
+block operator --(block b, bool arrowbar(picture, path, pen, marginT(path, pen)));
 flowdir Horizontal;
-arc arccircle(point A, point M, point B);
-arc arccircle(point A, point B, real angle, bool direction=<default>);
-void lineinversion();
+block bevel(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dh=<default>, real dw=<default>, real minwidth=<default>, real minheight=<default>);
+Dir Right;
+Dir Down;
+int[] numarray;
+point midpoint(segment s);
+point midpoint(side side);
+point isotomicconjugate(triangle t, point M);
+real rd(real x, real y, real z);
+point circumcenter(point A, point B, point C);
+point circumcenter(triangle t);
+circle circumcircle(point A, point B, point C);
+circle circumcircle(triangle t);
+point point(coordsys R, pair p, real m=<default>);
+point point(explicit pair p, real m);
+point point(coordsys R, explicit point M, real m=<default>);
+point point(explicit vector u);
+point point(circle c, abscissa l);
+point point(ellipse el, abscissa l);
+point point(parabola p, abscissa l);
+point point(hyperbola h, abscissa l);
+point point(explicit conic co, abscissa l);
+point point(line l, abscissa x);
+point point(line l, explicit real x);
+point point(line l, explicit int x);
+point point(explicit circle c, explicit real x);
+point point(explicit circle c, explicit int x);
+point point(explicit ellipse el, explicit real x);
+point point(explicit ellipse el, explicit int x);
+point point(explicit parabola p, explicit real x);
+point point(explicit parabola p, explicit int x);
+point point(explicit hyperbola h, explicit real x);
+point point(explicit hyperbola h, explicit int x);
+point point(explicit conic co, explicit real x);
+point point(explicit conic co, explicit int x);
+point point(arc a, abscissa l);
+point point(arc a, real x);
+pair point(explicit arc a, int x);
+point point(explicit mass m);
+point point(explicit vertex V);
+point point(trilinear tri);
+point point(circle c, point M);
+point point(circle c, explicit vector v);
+bool finite(explicit point p);
+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);
+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[] realquarticroots(real a, real b, real c, real d, real e);
+point origin;
+point origin(coordsys R=<default>);
+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>);
+void draw(picture pic=<default>, Label L=<default>, circle c, 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>, Label L=<default>, ellipse el, 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>, Label L=<default>, parabola parabola, 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>, Label L=<default>, hyperbola h, 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>, Label L=<default>, explicit conic co, 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>, 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>);
+coordsys defaultcoordsys;
+string defaultmassformat;
 line radicalline(circle c1, circle c2);
 point radicalcenter(circle c1, circle c2);
 point radicalcenter(circle c1, circle c2, circle c3);
-point inverse(real k, point A, point M);
-circle inverse(real k, point A, line l);
-circle inverse(real k, point A, circle c);
-arc inverse(real k, point A, segment s);
-triangle anticomplementary(triangle t);
-triangle symmedial(triangle t);
-triangle orthic(triangle t);
-triangle medial(triangle t);
-point intouch(side side);
-triangle intouch(triangle t);
-triangle extouch(triangle t);
-triangle extouch(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);
+path arctopath(arc a, int n);
+bool inside(ellipse el, point M);
+bool inside(parabola p, point M);
+int ellipsenodesnumber(real a, real b);
+int ellipsenodesnumber(real a, real b, real angle1, real angle2, bool dir);
+int ellipsenodesnumberfactor;
+bool byfoci;
+transform reflect(line l);
+transform reflect(line l1, line l2, bool safe=<default>);
+real[] bangles(picture pic=<default>, parabola p);
+real[][] bangles(picture pic=<default>, hyperbola h);
+abscissa relabscissa(real x);
+abscissa relabscissa(int x);
+abscissa relabscissa(line l, point M);
+abscissa relabscissa(circle c, point M);
+abscissa relabscissa(ellipse el, point M);
+abscissa relabscissa(conic co, point M);
+abscissa relabscissa(arc a, point M);
+circle incircle(point A, point B, point C);
+circle incircle(triangle t);
+mass masscenter(... mass[] M);
+vector unit(point M);
+vector unit(vector u);
+line Ox(coordsys R=<default>);
+line Ox;
+conic conic(point F, line l, real e);
+conic conic(point M1, point M2, point M3, point M4, point M5);
+conic conic(bqe bqe);
+bool defined(point P);
+string conictype(bqe bqe);
 triangle antipedal(triangle t, point M);
-triangle pedal(triangle t, point M);
-line pedal(side side, point M);
+void clipdraw(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>, real xmargin=<default>, real ymargin=<default>, Label legend=<default>, marker marker=<default>);
+real perpfactor;
+int conicnodesfactor;
+int conicnodesnumber(conic co, real angle1, real angle2, bool dir=<default>);
+line altitude(vertex V);
+line altitude(side side);
 point isogonalconjugate(triangle t, point M);
-point isotomicconjugate(triangle t, point M);
-point[] fermat(triangle t);
+point isogonal(side side, point M);
+line isogonal(vertex V, point M);
+triangle isogonal(triangle t, point M);
+line hline(coordsys R=<default>);
+line hline;
+int[] tricoef(side side);
+path arcfromfocus(conic co, real angle1, real angle2, int n=<default>, bool direction=<default>);
+line sector(int n=<default>, int p=<default>, line l1, line l2, real angle=<default>, bool sharp=<default>);
+path arcfromcenter(ellipse el, real angle1, real angle2, bool direction=<default>, int n=<default>);
+path arcfromcenter(hyperbola h, real angle1, real angle2, int n=<default>, bool direction=<default>);
+path arcfromcenter(explicit conic co, real angle1, real angle2, int n, bool direction=<default>);
+line vline(coordsys R=<default>);
+line vline;
+vector vector(coordsys R=<default>, pair v);
+vector vector(point M);
+real[] intersect(path g, explicit pair p, real fuzz=<default>);
+real[] intersect(path g, explicit point P, real fuzz=<default>);
+int sgnd(real x);
+int sgnd(int x);
+circle excircle(point A, point B, point C);
+circle excircle(side side);
+line extend(line l);
+point intersectionpoint(line l1, line l2);
 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);
@@ -2286,10 +2393,247 @@
 point[] intersectionpoints(arc a1, arc a2);
 point[] intersectionpoints(line l, arc a);
 point[] intersectionpoints(arc a, line l);
+point intouch(side side);
+triangle intouch(triangle t);
+point orthocentercenter(point A, point B, point C);
+point orthocentercenter(triangle t);
+real rf(real x, real y, real z);
+bool concurrent(... line[] l);
+real inradius(point A, point B, point C);
+real inradius(triangle t);
+pen addpenline;
+pen addpenline(pen p);
+pen addpenarc;
+pen addpenarc(pen p);
+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>);
+real abs(coordsys R, pair m);
+real abs(explicit point M);
+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);
+line bisector(line l1, line l2, real angle=<default>, bool sharp=<default>);
+line bisector(point A, point B, point C, point D, real angle=<default>, bool sharp=<default>);
+line bisector(segment s, real angle=<default>);
+line bisector(point A, point B, real angle=<default>);
+line bisector(vertex V, real angle=<default>);
+line bisector(side side);
+bqe canonical(bqe bqe);
+point bisectorpoint(side side);
+abscissa angabscissa(real x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
+abscissa angabscissa(int x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
+abscissa angabscissa(circle c, point M);
+abscissa angabscissa(ellipse el, point M, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
+abscissa angabscissa(hyperbola h, point M, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
+abscissa angabscissa(parabola p, point M);
+abscissa angabscissa(explicit conic co, point M);
+abscissa angabscissa(arc a, point M);
+pair locate(point P);
+point locate(pair p);
+pair locate(explicit vector v);
+bool samecoordsys(bool warn=<default> ... point[] M);
+bool samecoordsys(bool warn=<default> ... bqe[] bqes);
+triangle extouch(triangle t);
+triangle extouch(side side);
+coordsys canonicalcartesiansystem(ellipse el);
+coordsys canonicalcartesiansystem(parabola p);
+coordsys canonicalcartesiansystem(hyperbola h);
+coordsys canonicalcartesiansystem(explicit conic co);
+arc arc(ellipse el, real angle1, real angle2, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>, bool direction=<default>);
+arc arc(ellipse el, explicit abscissa x1, explicit abscissa x2, bool direction=<default>);
+arc arc(ellipse el, point M, point N, bool direction=<default>);
+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);
+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>);
+real epsgeo;
+real sharpangle(line l1, line l2);
+bool isparabola(bqe bqe);
+real sharpdegrees(line l1, line l2);
+real exradius(point A, point B, point C);
+real exradius(side side);
+abscissa nodabscissa(real x);
+abscissa nodabscissa(int x);
+abscissa nodabscissa(line l, point M);
+abscissa nodabscissa(circle c, point M);
+abscissa nodabscissa(ellipse el, point M);
+abscissa nodabscissa(parabola p, point M);
+abscissa nodabscissa(conic co, point M);
+abscissa nodabscissa(arc a, point M);
+coordsys coordsys(line l);
+coordsys coordsys(conic co);
+coordsys coordsys(ellipse el);
+pair coordinates(point M);
+real length(explicit point M);
+real length(segment s);
+int arcnodesnumber(explicit arc a);
+point[] standardizecoordsys(coordsys R=<default>, bool warn=<default> ... point[] M);
+int nodesystem;
+bool collinear(vector u, vector v);
+point centroid(point A, point B, point C);
+point centroid(triangle t);
+int angularsystem;
+path square(pair z1, pair z2);
+point symmedian(triangle t);
+point symmedian(side side);
+line symmedian(vertex V);
+triangle symmedial(triangle t);
+int curvilinearsystem;
+bqe bqe(coordsys R=<default>, real a, real b, real c, real d, real e, real f);
+bqe bqe(point M1, point M2, point M3, point M4, point M5);
+arc arccircle(point A, point M, point B);
+arc arccircle(point A, point B, real angle, bool direction=<default>);
+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);
+point changecoordsys(coordsys R, point M);
+vector changecoordsys(coordsys R, vector v);
+line changecoordsys(coordsys R, line l);
+bqe changecoordsys(coordsys R, bqe bqe);
+conic changecoordsys(coordsys R, conic co);
+real angle(explicit point M, coordsys R=<default>, bool warn=<default>);
+real angle(explicit vector v, coordsys R=<default>, bool warn=<default>);
+real angle(line l, coordsys R=<default>);
+real angle(line l1, line l2);
+real angle(arc a);
+point[] fermat(triangle t);
+real arclength(circle c);
+real arclength(ellipse el);
+real arclength(ellipse el, real angle1, real angle2, bool direction=<default>, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
+real arclength(parabola p, real angle);
+real arclength(parabola p, real angle1, real angle2);
+real arclength(parabola p);
+real arclength(arc a);
+line reverse(line l);
+arc reverse(arc a);
+point gergonne(triangle t);
+real focusToCenter(ellipse el, real a);
+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);
+side opposite(vertex V);
+vertex opposite(side side);
+int hyperbolanodesnumber(hyperbola h, real angle1, real angle2);
+path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)(conic co);
+int hyperbolanodesnumberfactor;
+line parallel(point M, line l);
+line parallel(point M, explicit vector dir);
+line parallel(point M, explicit pair dir);
+bool parallel(line l1, line l2, bool strictly=<default>);
 transform projection(point A, point B);
 transform projection(point A, point B, point C, point D, bool safe=<default>);
 transform projection(line l);
 transform projection(line l1, line l2, bool safe=<default>);
+bool degenerate(conic c);
+bool degenerate(circle c);
+bool degenerate(ellipse el);
+line line(point A, bool extendA=<default>, point B, bool extendB=<default>);
+line line(segment s);
+line line(real a, point A=<default>);
+line line(point A=<default>, real a);
+line line(int a, point A=<default>);
+line line(coordsys R=<default>, real slope, real origin);
+line line(coordsys R=<default>, real a, real b, real c);
+line line(circle c);
+line line(explicit side side);
+line complementary(explicit line l);
+line[] complementary(explicit segment s);
+arc complementary(arc a);
+point ppoint(arc a, real x);
+bool between(point M, point O, point N);
+path fromFocus(conic co, real angle1, real angle2, int n, bool direction);
+bool sameside(point M, point N, point O);
+bool sameside(point M, point P, line l);
+point[] sameside(point M, line l1, line l2);
+arc arcsubtended(point A, point B, real angle);
+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);
+point incenter(point A, point B, point C);
+point incenter(triangle t);
+void write(explicit line l);
+void write(explicit segment s);
+void write(trilinear tri);
+triangle incentral(triangle t);
+point arcsubtendedcenter(point A, point B, real angle);
+circle circle(explicit point C, real r);
+circle circle(point A, point B);
+circle circle(segment s);
+circle circle(point A, point B, point C);
+circle circle(triangle t);
+circle circle(inversion i);
+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);
+triangle orthic(triangle t);
+int circlenodesnumber(real r);
+int circlenodesnumber(real r, real angle1, real angle2);
+path compassmark(pair O, pair A, real position, real angle=<default>);
+bool byvertices;
+int circlenodesnumberfactor;
+transform xscale(real k, point M);
+transform yscale(real k, point M);
+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 operator +(explicit point P1, explicit point P2);
+point operator +(explicit point P1, explicit pair p2);
+point operator +(explicit pair p1, explicit point p2);
+point operator +(point M, explicit vector v);
+point operator +(explicit pair m, explicit vector v);
+vector operator +(explicit vector v1, explicit vector v2);
+line operator +(line l, vector u);
+conic operator +(conic c, explicit point M);
+conic operator +(conic c, explicit pair m);
+conic operator +(conic c, vector v);
+circle operator +(explicit circle c, explicit point M);
+circle operator +(explicit circle c, pair m);
+circle operator +(explicit circle c, vector m);
+abscissa operator +(real x, explicit abscissa a);
+abscissa operator +(explicit abscissa a, real x);
+abscissa operator +(int x, explicit abscissa a);
+arc operator +(explicit arc a, point M);
+arc operator +(explicit arc a, vector v);
+mass operator +(mass M1, mass M2);
+mass operator +(explicit mass M, real x);
+mass operator +(explicit mass M, int x);
+point operator -(explicit point P);
+point operator -(explicit point P1, explicit point P2);
+point operator -(explicit point P1, explicit pair p2);
+point operator -(explicit pair p1, explicit point P2);
+point operator -(point M, explicit vector v);
+vector operator -(explicit vector v);
+point operator -(explicit pair m, explicit vector v);
+vector operator -(explicit vector v1, explicit vector v2);
+line operator -(line l, vector u);
+conic operator -(conic c, explicit point M);
+conic operator -(conic c, explicit pair m);
+conic operator -(conic c, vector v);
+circle operator -(explicit circle c, explicit point M);
+circle operator -(explicit circle c, pair m);
+circle operator -(explicit circle c, vector m);
+abscissa operator -(explicit abscissa a);
+abscissa operator -(real x, explicit abscissa a);
+abscissa operator -(explicit abscissa a, real x);
+abscissa operator -(int x, explicit abscissa a);
+arc operator -(explicit arc a, point M);
+arc operator -(explicit arc a, vector v);
+mass operator -(mass M1, mass M2);
+mass operator -(explicit mass M, real x);
+mass operator -(explicit mass M, int x);
 pair operator *(coordsys R, pair p);
 path operator *(coordsys R, path g);
 coordsys operator *(transform t, coordsys R);
@@ -2327,120 +2671,23 @@
 circle operator *(inversion i, circle c);
 arc operator *(inversion i, segment s);
 path operator *(inversion i, triangle t);
-abscissa angabscissa(real x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
-abscissa angabscissa(int x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
-abscissa angabscissa(circle c, point M);
-abscissa angabscissa(ellipse el, point M, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
-abscissa angabscissa(hyperbola h, point M, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
-abscissa angabscissa(parabola p, point M);
-abscissa angabscissa(explicit conic co, point M);
-abscissa angabscissa(arc a, point M);
-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);
-path compassmark(pair O, pair A, real position, real angle=<default>);
-vector vector(coordsys R=<default>, pair v);
-vector vector(point M);
-path square(pair z1, pair z2);
-line isotomic(vertex V, point M);
-point isotomic(side side, point M);
-triangle isotomic(triangle t, point M);
-transform hprojection(line l, bool safe=<default>);
-line median(vertex V);
-line median(side side);
-real arclength(circle c);
-real arclength(ellipse el);
-real arclength(ellipse el, real angle1, real angle2, bool direction=<default>, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
-real arclength(parabola p, real angle);
-real arclength(parabola p, real angle1, real angle2);
-real arclength(parabola p);
-real arclength(arc a);
-pair attract(pair m, path g, real fuzz=<default>);
-point attract(point M, path g, real fuzz=<default>);
-bool degenerate(conic c);
-bool degenerate(circle c);
-bool degenerate(ellipse el);
-void perpendicularmark(picture pic=<default>, point z, explicit pair align, explicit pair dir=<default>, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
-void perpendicularmark(picture pic=<default>, point z, vector align, vector dir=<default>, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
-void perpendicularmark(picture pic=<default>, point z, explicit pair align, path g, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
-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>);
-line hline(coordsys R=<default>);
-line hline;
-point circumcenter(point A, point B, point C);
-point circumcenter(triangle t);
-real binomial(real n, real k);
-point point(coordsys R, pair p, real m=<default>);
-point point(explicit pair p, real m);
-point point(coordsys R, explicit point M, real m=<default>);
-point point(explicit vector u);
-point point(circle c, abscissa l);
-point point(ellipse el, abscissa l);
-point point(parabola p, abscissa l);
-point point(hyperbola h, abscissa l);
-point point(explicit conic co, abscissa l);
-point point(line l, abscissa x);
-point point(line l, explicit real x);
-point point(line l, explicit int x);
-point point(explicit circle c, explicit real x);
-point point(explicit circle c, explicit int x);
-point point(explicit ellipse el, explicit real x);
-point point(explicit ellipse el, explicit int x);
-point point(explicit parabola p, explicit real x);
-point point(explicit parabola p, explicit int x);
-point point(explicit hyperbola h, explicit real x);
-point point(explicit hyperbola h, explicit int x);
-point point(explicit conic co, explicit real x);
-point point(explicit conic co, explicit int x);
-point point(arc a, abscissa l);
-point point(arc a, real x);
-pair point(explicit arc a, int x);
-point point(explicit mass m);
-point point(explicit vertex V);
-point point(trilinear tri);
-point point(circle c, point M);
-point point(circle c, explicit vector v);
-point bisectorpoint(side side);
-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>);
-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);
-point arcsubtendedcenter(point A, point B, real angle);
-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 EPS;
-point isogonal(side side, point M);
-line isogonal(vertex V, point M);
-triangle isogonal(triangle t, point M);
-bqe canonical(bqe bqe);
-void clipdraw(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>, real xmargin=<default>, real ymargin=<default>, Label legend=<default>, marker marker=<default>);
-real sharpdegrees(line l1, line l2);
-triangle incentral(triangle t);
-point origin;
-point origin(coordsys R=<default>);
-string massformat(string format=<default>, string s, mass M);
-line complementary(explicit line l);
-line[] complementary(explicit segment s);
-arc complementary(arc a);
-void write(explicit line l);
-void write(explicit segment s);
-void write(trilinear tri);
-point midpoint(segment s);
-point midpoint(side side);
-int ellipsenodesnumberfactor;
+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();
 pair operator cast(point P);
 pair[] operator cast(point[] P);
 point operator cast(pair p);
@@ -2486,89 +2733,32 @@
 point operator cast(trilinear tri);
 circle operator cast(inversion i);
 inversion operator cast(circle c);
-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 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);
-pair coordinates(point M);
-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();
-point excenter(point A, point B, point C);
-point excenter(side side);
-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>);
-real degrees(line l1, line l2);
-real degrees(arc a);
-point foot(vertex V);
-point foot(side side);
+void lineinversion();
+pair operator /(pair p, coordsys R);
+point operator /(explicit point P, real x);
+point operator /(real x, explicit point P);
+vector operator /(explicit vector v, real x);
+line operator /(line l, real x);
+line operator /(line l, int x);
+circle operator /(explicit circle c, real x);
+circle operator /(explicit circle c, int x);
+ellipse operator /(ellipse el, real x);
+abscissa operator /(real x, explicit abscissa a);
+abscissa operator /(explicit abscissa a, real x);
+abscissa operator /(int x, explicit abscissa a);
+arc operator /(explicit arc a, real x);
+mass operator /(explicit mass M, real x);
+mass operator /(explicit mass M, int x);
+transform scaleO(real x);
+real operator ^(point M, explicit circle c);
+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);
 bool operator !=(explicit point M, explicit point N);
 bool operator !=(line l1, line l2);
-arc arcsubtended(point A, point B, real angle);
-int parabolanodesnumber(parabola p, real angle1, real angle2);
-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>);
-void draw(picture pic=<default>, Label L=<default>, circle c, 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>, Label L=<default>, ellipse el, 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>, Label L=<default>, parabola parabola, 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>, Label L=<default>, hyperbola h, 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>, Label L=<default>, explicit conic co, 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>, 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>);
-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);
-void drawline(picture pic=<default>, triangle t, pen p=<default>);
-circle incircle(point A, point B, point C);
-circle incircle(triangle t);
-real[] intersect(path g, explicit pair p, real fuzz=<default>);
-real[] intersect(path g, explicit point P, real fuzz=<default>);
-side opposite(vertex V);
-vertex opposite(side side);
+transform xscaleO(real x);
+transform yscaleO(real x);
 line[] operator ^^(line l1, line l2);
 line[] operator ^^(line l1, line[] l2);
 line[] operator ^^(line[] l2, line l1);
@@ -2576,103 +2766,92 @@
 triangle[] operator ^^(triangle[] t1, triangle t2);
 triangle[] operator ^^(... triangle[] t);
 real elle(real phi, real k);
-point conj(explicit point M);
-vector conj(explicit vector u);
-hyperbola conj(hyperbola h);
+point excenter(point A, point B, point C);
+point excenter(side side);
 mass mass(point M, real m);
 mass mass(explicit point P);
 mass mass(coordsys R, explicit pair p, real m);
-point operator +(explicit point P1, explicit point P2);
-point operator +(explicit point P1, explicit pair p2);
-point operator +(explicit pair p1, explicit point p2);
-point operator +(point M, explicit vector v);
-point operator +(explicit pair m, explicit vector v);
-vector operator +(explicit vector v1, explicit vector v2);
-line operator +(line l, vector u);
-conic operator +(conic c, explicit point M);
-conic operator +(conic c, explicit pair m);
-conic operator +(conic c, vector v);
-circle operator +(explicit circle c, explicit point M);
-circle operator +(explicit circle c, pair m);
-circle operator +(explicit circle c, vector m);
-abscissa operator +(real x, explicit abscissa a);
-abscissa operator +(explicit abscissa a, real x);
-abscissa operator +(int x, explicit abscissa a);
-arc operator +(explicit arc a, point M);
-arc operator +(explicit arc a, vector v);
-mass operator +(mass M1, mass M2);
-mass operator +(explicit mass M, real x);
-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);
-circle circle(point A, point B, point C);
-circle circle(triangle t);
-circle circle(inversion i);
+bool operator @(point m, line l);
+bool operator @(point M, conic co);
+bool operator @(point M, explicit circle c);
+bool operator @(point M, arc a);
+triangle triangle(line l1, line l2, line l3);
+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>);
+triangle triangleAbc(real alpha, real b, real c, real angle=<default>, point A=<default>);
+triangle triangleabc(real a, real b, real c, real angle=<default>, point A=<default>);
+triangle anticomplementary(triangle t);
+vector dir(vertex V);
+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>);
+real degrees(line l1, line l2);
+real degrees(arc a);
 segment segment(point A, point B);
 segment segment(line l);
 segment segment(explicit side side);
-transform yscale(real k, point M);
-int sgnd(real x);
-int sgnd(int x);
-line line(point A, bool extendA=<default>, point B, bool extendB=<default>);
-line line(segment s);
-line line(real a, point A=<default>);
-line line(point A=<default>, real a);
-line line(int a, point A=<default>);
-line line(coordsys R=<default>, real slope, real origin);
-line line(coordsys R=<default>, real a, real b, real c);
-line line(circle c);
-line line(explicit side side);
-arc arc(ellipse el, real angle1, real angle2, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>, bool direction=<default>);
-arc arc(ellipse el, explicit abscissa x1, explicit abscissa x2, bool direction=<default>);
-arc arc(ellipse el, point M, point N, bool direction=<default>);
-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);
-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);
-line vline(coordsys R=<default>);
-line vline;
+real linemargin;
+real linemargin();
+line Oy(coordsys R=<default>);
+line Oy;
+path fromCenter(conic co, real angle1, real angle2, int n, bool direction);
+void markarc(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, arc a, pen sectorpen=<default>, pen markpen=<default>, marginT margin(path, pen)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marker marker=<default>);
+real approximate(real t);
+real[] approximate(real[] T);
+void markangle(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, explicit line l1, explicit line l2, explicit pair align=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, pen p=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>, marker marker=<default>);
+void markangle(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, explicit line l1, explicit line l2, explicit vector align, bool arrow(picture, path, pen, marginT(path, pen))=<default>, pen p=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>, marker marker=<default>);
+transform hprojection(line l, bool safe=<default>);
+point conj(explicit point M);
+vector conj(explicit vector u);
+hyperbola conj(hyperbola h);
+transform vprojection(line l, bool safe=<default>);
+parabola parabola(point F, line l);
+parabola parabola(point F, point vertex);
+parabola parabola(point F, real a, real angle);
+parabola parabola(bqe bqe);
+parabola parabola(point M1, point M2, point M3, line l);
+parabola parabola(point M1, point M2, point M3, point M4, point M5);
+bool onpath(picture pic=<default>, path g, point M, pen p=<default>);
+int parabolanodesnumber(parabola p, real angle1, real angle2);
+int parabolanodesnumberfactor;
+path NoModifier(path);
+coordsys currentcoordsys;
+point foot(vertex V);
+point foot(side side);
+path currentpolarconicroutine(conic co, real angle1, real angle2, int n, bool direction);
 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);
-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);
-abscissa nodabscissa(line l, point M);
-abscissa nodabscissa(circle c, point M);
-abscissa nodabscissa(ellipse el, point M);
-abscissa nodabscissa(parabola p, point M);
-abscissa nodabscissa(conic co, point M);
-abscissa nodabscissa(arc a, point M);
-transform xscale(real k, point M);
-bool between(point M, point O, point N);
-triangle cevian(triangle t, point P);
-point cevian(side side, point P);
-line cevian(vertex V, point P);
-line Ox(coordsys R=<default>);
-line Ox;
-real abs(coordsys R, pair m);
-real abs(explicit point M);
+real EPS;
+transform rotateO(real a);
+line perpendicular(point M, line l);
+line perpendicular(point M, explicit vector normal);
+line perpendicular(point M, explicit pair normal);
+bool perpendicular(line l1, line l2);
+void perpendicular(picture pic=<default>, pair z, pair align, pair dir=<default>, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+void perpendicular(picture pic=<default>, pair z, pair align, path g, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+real binomial(real n, real k);
+void perpendicularmark(picture pic=<default>, point z, explicit pair align, explicit pair dir=<default>, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+void perpendicularmark(picture pic=<default>, point z, vector align, vector dir=<default>, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+void perpendicularmark(picture pic=<default>, point z, explicit pair align, path g, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+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>);
+pair attract(pair m, path g, real fuzz=<default>);
+point attract(point M, path g, real fuzz=<default>);
+void Drawline(picture pic=<default>, Label L=<default>, pair P, bool dirP=<default>, pair Q, bool dirQ=<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>);
+bool simeq(point A, point B, real fuzz=<default>);
+bool simeq(point a, real b, real fuzz=<default>);
+point inverse(real k, point A, point M);
+circle inverse(real k, point A, line l);
+circle inverse(real k, point A, circle c);
+arc inverse(real k, point A, segment s);
+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);
+coordsys cartesiansystem(pair O=<default>, pair i, pair j);
 line tangent(circle c, abscissa x);
 line tangent(circle c, point M);
 line tangent(circle c, explicit vector v);
@@ -2681,60 +2860,35 @@
 line tangent(hyperbola h, abscissa x);
 line tangent(explicit arc a, abscissa x);
 line tangent(explicit arc a, point M);
-line altitude(vertex V);
-line altitude(side side);
-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>);
-vector dir(vertex V);
-real angle(explicit point M, coordsys R=<default>, bool warn=<default>);
-real angle(explicit vector v, coordsys R=<default>, bool warn=<default>);
-real angle(line l, coordsys R=<default>);
-real angle(line l1, line l2);
-real angle(arc a);
-mass masscenter(... mass[] M);
-triangle tangential(triangle t);
-point operator -(explicit point P);
-point operator -(explicit point P1, explicit point P2);
-point operator -(explicit point P1, explicit pair p2);
-point operator -(explicit pair p1, explicit point P2);
-point operator -(point M, explicit vector v);
-vector operator -(explicit vector v);
-point operator -(explicit pair m, explicit vector v);
-vector operator -(explicit vector v1, explicit vector v2);
-line operator -(line l, vector u);
-conic operator -(conic c, explicit point M);
-conic operator -(conic c, explicit pair m);
-conic operator -(conic c, vector v);
-circle operator -(explicit circle c, explicit point M);
-circle operator -(explicit circle c, pair m);
-circle operator -(explicit circle c, vector m);
-abscissa operator -(explicit abscissa a);
-abscissa operator -(real x, explicit abscissa a);
-abscissa operator -(explicit abscissa a, real x);
-abscissa operator -(int x, explicit abscissa a);
-arc operator -(explicit arc a, point M);
-arc operator -(explicit arc a, vector v);
-mass operator -(mass M1, mass M2);
-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);
 line[] tangents(circle c, point M);
 line[] tangents(ellipse el, point M);
 line[] tangents(parabola p, point M);
 line[] tangents(hyperbola h, point M);
-triangle triangleabc(real a, real b, real c, real angle=<default>, point A=<default>);
-void markangle(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, explicit line l1, explicit line l2, explicit pair align=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, pen p=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>, marker marker=<default>);
-void markangle(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, explicit line l1, explicit line l2, explicit vector align, bool arrow(picture, path, pen, marginT(path, pen))=<default>, pen p=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>, marker marker=<default>);
-bool isparabola(bqe bqe);
-point[] standardizecoordsys(coordsys R=<default>, bool warn=<default> ... point[] M);
-transform scaleO(real x);
-real approximate(real t);
-real[] approximate(real[] T);
-bool simeq(point A, point B, real fuzz=<default>);
-bool simeq(point a, real b, real fuzz=<default>);
-real epsgeo;
-real rf(real x, real y, real z);
+real centerToFocus(ellipse el, real a);
+bqe equation(ellipse el);
+bqe equation(parabola p);
+bqe equation(hyperbola h);
+bqe equation(explicit conic co);
+triangle tangential(triangle t);
+triangle pedal(triangle t, point M);
+line pedal(side side, point M);
+string massformat(string format=<default>, string s, mass M);
+triangle cevian(triangle t, point P);
+point cevian(side side, point P);
+line cevian(vertex V, point P);
+int relativesystem;
+void drawline(picture pic=<default>, triangle t, pen p=<default>);
+void addMargins(picture pic=<default>, real lmargin=<default>, real bmargin=<default>, real rmargin=<default>, real tmargin=<default>, bool rigid=<default>, bool allObject=<default>);
+triangle medial(triangle t);
+line median(vertex V);
+line median(side side);
+void show(picture pic=<default>, Label lo=<default>, Label li=<default>, Label lj=<default>, coordsys R, pen dotpen=<default>, pen xpen=<default>, pen ypen=<default>, pen ipen=<default>, pen jpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>);
+void show(Label L, vector v, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>);
+void show(picture pic=<default>, line l, pen p=<default>);
+void show(picture pic=<default>, Label LA=<default>, Label LB=<default>, Label LC=<default>, Label La=<default>, Label Lb=<default>, Label Lc=<default>, triangle t, pen p=<default>, filltype filltype=<default>);
+line isotomic(vertex V, point M);
+point isotomic(side side, point M);
+triangle isotomic(triangle t, point M);
 abscissa curabscissa(real x);
 abscissa curabscissa(int x);
 abscissa curabscissa(line l, point M);
@@ -2743,169 +2897,9 @@
 abscissa curabscissa(parabola p, point M);
 abscissa curabscissa(conic co, point M);
 abscissa curabscissa(arc a, point M);
-real rd(real x, real y, real z);
-coordsys cartesiansystem(pair O=<default>, pair i, pair j);
-void show(picture pic=<default>, Label lo=<default>, Label li=<default>, Label lj=<default>, coordsys R, pen dotpen=<default>, pen xpen=<default>, pen ypen=<default>, pen ipen=<default>, pen jpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>);
-void show(Label L, vector v, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>);
-void show(picture pic=<default>, line l, pen p=<default>);
-void show(picture pic=<default>, Label LA=<default>, Label LB=<default>, Label LC=<default>, Label La=<default>, Label Lb=<default>, Label Lc=<default>, triangle t, pen p=<default>, filltype filltype=<default>);
-pair operator /(pair p, coordsys R);
-point operator /(explicit point P, real x);
-point operator /(real x, explicit point P);
-vector operator /(explicit vector v, real x);
-line operator /(line l, real x);
-line operator /(line l, int x);
-circle operator /(explicit circle c, real x);
-circle operator /(explicit circle c, int x);
-ellipse operator /(ellipse el, real x);
-abscissa operator /(real x, explicit abscissa a);
-abscissa operator /(explicit abscissa a, real x);
-abscissa operator /(int x, explicit abscissa a);
-arc operator /(explicit arc a, real x);
-mass operator /(explicit mass M, real x);
-mass operator /(explicit mass M, int x);
-coordsys defaultcoordsys;
-coordsys currentcoordsys;
-point changecoordsys(coordsys R, point M);
-vector changecoordsys(coordsys R, vector v);
-line changecoordsys(coordsys R, line l);
-bqe changecoordsys(coordsys R, bqe bqe);
-conic changecoordsys(coordsys R, conic co);
-bool samecoordsys(bool warn=<default> ... point[] M);
-bool samecoordsys(bool warn=<default> ... bqe[] bqes);
-pair locate(point P);
-point locate(pair p);
-pair locate(explicit vector v);
-real length(explicit point M);
-real length(segment s);
-conic conic(point F, line l, real e);
-conic conic(point M1, point M2, point M3, point M4, point M5);
-conic conic(bqe bqe);
-transform rotateO(real a);
-transform xscaleO(real x);
-bool byvertices;
-transform yscaleO(real x);
-real linemargin;
-real linemargin();
-string defaultmassformat;
-bool defined(point P);
-bool finite(explicit point p);
-point orthocentercenter(point A, point B, point C);
-point orthocentercenter(triangle t);
-bool onpath(picture pic=<default>, path g, point M, pen p=<default>);
-bool sameside(point M, point N, point O);
-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);
-int ellipsenodesnumber(real a, real b);
-int ellipsenodesnumber(real a, real b, real angle1, real angle2, bool dir);
-path NoModifier(path);
-void Drawline(picture pic=<default>, Label L=<default>, pair P, bool dirP=<default>, pair Q, bool dirQ=<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 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);
-bool operator @(point m, line l);
-bool operator @(point M, conic co);
-bool operator @(point M, explicit circle c);
-bool operator @(point M, arc a);
-coordsys coordsys(line l);
-coordsys coordsys(conic co);
-coordsys coordsys(ellipse el);
-line extend(line l);
-line Oy(coordsys R=<default>);
-line Oy;
-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);
-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);
-bool parallel(line l1, line l2, bool strictly=<default>);
-line perpendicular(point M, line l);
-line perpendicular(point M, explicit vector normal);
-line perpendicular(point M, explicit pair normal);
-bool perpendicular(line l1, line l2);
-void perpendicular(picture pic=<default>, pair z, pair align, pair dir=<default>, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
-void perpendicular(picture pic=<default>, pair z, pair align, path g, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
-real sharpangle(line l1, line l2);
-line bisector(line l1, line l2, real angle=<default>, bool sharp=<default>);
-line bisector(point A, point B, point C, point D, real angle=<default>, bool sharp=<default>);
-line bisector(segment s, real angle=<default>);
-line bisector(point A, point B, real angle=<default>);
-line bisector(vertex V, real angle=<default>);
-line bisector(side side);
-bqe bqe(coordsys R=<default>, real a, real b, real c, real d, real e, real f);
-bqe bqe(point M1, point M2, point M3, point M4, point M5);
-int conicnodesfactor;
-int conicnodesnumber(conic co, real angle1, real angle2, bool dir=<default>);
-int circlenodesnumber(real r);
-int circlenodesnumber(real r, real angle1, real angle2);
-int parabolanodesnumberfactor;
-real perpfactor;
-int hyperbolanodesnumberfactor;
-int hyperbolanodesnumber(hyperbola h, real angle1, real angle2);
-path arcfromfocus(conic co, real angle1, real angle2, int n=<default>, bool direction=<default>);
-bool byfoci;
-parabola parabola(point F, line l);
-parabola parabola(point F, point vertex);
-parabola parabola(point F, real a, real angle);
-parabola parabola(bqe bqe);
-parabola parabola(point M1, point M2, point M3, line l);
-parabola parabola(point M1, point M2, point M3, point M4, point M5);
-real operator ^(point M, explicit circle c);
-path arcfromcenter(ellipse el, real angle1, real angle2, bool direction=<default>, int n=<default>);
-path arcfromcenter(hyperbola h, real angle1, real angle2, int n=<default>, bool direction=<default>);
-path arcfromcenter(explicit conic co, real angle1, real angle2, int n, bool direction=<default>);
-path fromFocus(conic co, real angle1, real angle2, int n, bool direction);
-bqe equation(ellipse el);
-bqe equation(parabola p);
-bqe equation(hyperbola h);
-bqe equation(explicit conic co);
-real[] bangles(picture pic=<default>, parabola p);
-real[][] bangles(picture pic=<default>, hyperbola h);
-real focusToCenter(ellipse el, real a);
-int relativesystem;
-int curvilinearsystem;
-int nodesystem;
-abscissa relabscissa(real x);
-abscissa relabscissa(int x);
-abscissa relabscissa(line l, point M);
-abscissa relabscissa(circle c, point M);
-abscissa relabscissa(ellipse el, point M);
-abscissa relabscissa(conic co, point M);
-abscissa relabscissa(arc a, point M);
-path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)(conic co);
-void markarc(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, arc a, pen sectorpen=<default>, pen markpen=<default>, marginT margin(path, pen)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marker marker=<default>);
-int arcnodesnumber(explicit arc a);
-path arctopath(arc a, int n);
-point incenter(point A, point B, point C);
-point incenter(triangle t);
-real inradius(point A, point B, point C);
-real inradius(triangle t);
-real exradius(point A, point B, point C);
-real exradius(side side);
-circle excircle(point A, point B, point C);
-circle excircle(side side);
-int[] numarray;
-int[] tricoef(side side);
-point symmedian(triangle t);
-point symmedian(side side);
-line symmedian(vertex V);
-int angularsystem;
-point gergonne(triangle t);
-path Arc(pair c, real r, real angle1, real angle2, bool direction, int n=<default>);
-path Arc(pair c, real r, real angle1, real angle2, int n=<default>);
-path Arc(pair c, explicit pair z1, explicit pair z2, bool direction=<default>, int n=<default>);
-guide polargraph(picture pic=<default>, real r(real), real a, real b, int n=<default>, guide join(... guide[])=<default>);
-guide polargraph(picture pic=<default>, real[] r, real[] theta, guide join(... guide[])=<default>);
-pair polar(real r, real theta);
-string conditionlength;
-guide Hermite(... guide[])(real[] splinetype(real[], real[]));
-guide Hermite(... guide[]);
+string DefaultFormat(real);
+string DefaultLogFormat(real)(int base);
+string DefaultLogFormat(real);
 guide graph(pair f(real), real, real, int)(guide join(... guide[]));
 guide[] graph(pair f(real), real, real, int)(guide join(... guide[]), bool3 cond(real));
 guide graph(picture pic=<default>, real f(real), real a, real b, int n=<default>, real T(real)=<default>, guide join(... guide[])=<default>);
@@ -2918,93 +2912,107 @@
 guide[] graph(picture pic=<default>, pair[] z, bool3[] cond, guide join(... guide[])=<default>);
 guide graph(picture pic=<default>, real[] x, real[] y, guide join(... guide[])=<default>);
 guide[] graph(picture pic=<default>, real[] x, real[] y, bool3[] cond, guide join(... guide[])=<default>);
-picture secondaryY(picture primary=<default>, void f(picture));
-picture secondaryX(picture primary=<default>, void f(picture));
-string noprimary;
+scientific scientific(real x);
+void Left(picture, axisT)(bool extend=<default>);
+void Left(picture, axisT);
+autoscaleT defaultS;
+void XEquals(picture, axisT)(real x, bool extend=<default>);
+void YEquals(picture, axisT)(real y, bool extend=<default>);
+string LogFormat(real)(int base);
+string LogFormat(real);
+axisT axis;
+void axis(picture pic=<default>, Label L=<default>, path g, path g2=<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>), ticklocate locate, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, int[] divisor=<default>, bool above=<default>, bool opposite=<default>);
+void drawtick(frame f, transform T, path g, path g2, ticklocate locate, real val, real Size, int sign, pen p, bool extend);
+real maxlength(pair a, pair b, int nx, int ny);
+void errorbar(picture pic, pair z, pair dp, pair dm, pen p=<default>, real size=<default>);
+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 xlimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
+string conditionlength;
+void ylimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
+tickvalues None(tickvalues v);
+scaleT Logarithmic;
+void limits(picture pic=<default>, pair min, pair max, bool crop=<default>);
+void crop(picture pic=<default>);
+picture vectorfield(path vector(real), path g, int n, bool truesize=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>);
+picture vectorfield(path vector(pair), pair a, pair b, int nx=<default>, int ny=<default>, bool truesize=<default>, real maxlength=<default>, bool cond(pair z)=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>);
+string OmitFormat(real)(string s=<default> ... real[] x);
+guide Straight(... guide[]);
+int Min;
+string trailingzero;
+void label(picture pic, Label L, pair z, real x, align align, string format, pen p);
+void labelx(picture pic=<default>, Label L=<default>, explicit pair z, align align=<default>, string format=<default>, pen p=<default>);
+void labelx(picture pic=<default>, Label L=<default>, real x, align align=<default>, string format=<default>, pen p=<default>);
+void labelx(picture pic=<default>, Label L, string format=<default>, explicit pen p=<default>);
+path Arc(pair c, real r, real angle1, real angle2, bool direction, int n=<default>);
+path Arc(pair c, real r, real angle1, real angle2, int n=<default>);
+path Arc(pair c, explicit pair z1, explicit pair z2, bool direction=<default>, int n=<default>);
 void labely(picture pic=<default>, Label L=<default>, explicit pair z, align align=<default>, string format=<default>, pen p=<default>);
 void labely(picture pic=<default>, Label L=<default>, real y, align align=<default>, string format=<default>, pen p=<default>);
 void labely(picture pic=<default>, Label L, string format=<default>, explicit pen p=<default>);
-void labelx(picture pic=<default>, Label L=<default>, explicit pair z, align align=<default>, string format=<default>, pen p=<default>);
-void labelx(picture pic=<default>, Label L=<default>, real x, align align=<default>, string format=<default>, pen p=<default>);
-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 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 YZero(picture, axisT)(bool extend=<default>);
-void YZero(picture, axisT);
-void YEquals(picture, axisT)(real y, bool extend=<default>);
-void XEquals(picture, axisT)(real x, bool extend=<default>);
-void LeftRight(picture, axisT)(bool extend=<default>);
-void LeftRight(picture, axisT);
-void Left(picture, axisT)(bool extend=<default>);
-void Left(picture, axisT);
-int Min;
-void RightTicks(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 RightTicks(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 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>);
+pair labeltick(frame d, transform T, path g, ticklocate locate, real val, pair side, int sign, real Size, string ticklabel(real), Label F, real norm=<default>);
+void labelaxis(frame f, transform T, Label L, path g, ticklocate locate=<default>, int sign=<default>, bool ticklabels=<default>);
+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>);
+void xtick(picture pic=<default>, Label L, real x, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+void ytick(picture pic=<default>, explicit pair z, pair dir=<default>, real size=<default>, pen p=<default>);
+void ytick(picture pic=<default>, real y, pair dir=<default>, real size=<default>, pen p=<default>);
+void ytick(picture pic=<default>, Label L, explicit pair z, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+void ytick(picture pic=<default>, Label L, real y, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+picture secondaryX(picture primary=<default>, void f(picture));
+picture secondaryY(picture primary=<default>, void f(picture));
+tickvalues OmitTickIntervals(tickvalues)(real[] a, real[] b);
+tickvalues OmitTickInterval(tickvalues)(real a, real b);
+tickvalues OmitTick(tickvalues)(... real[] x);
+Label Break;
+tickvalues Break(tickvalues)(real, real);
+scaleT Linear;
+scaleT Linear(bool automin=<default>, bool automax=<default>, real s=<default>, real intercept=<default>);
+pair tickMin(picture pic);
+pair tickMax(picture pic);
+string autoformat(string format=<default>, real norm ... real[] a);
+real linear(real)(real S(real x)=<default>, real Min, real Max);
+pair polar(real r, real theta);
+string Format(real)(string s=<default>);
+guide polargraph(picture pic=<default>, real r(real), real a, real b, int n=<default>, guide join(... guide[])=<default>);
+guide polargraph(picture pic=<default>, real[] r, real[] theta, guide join(... guide[])=<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>);
 tickvalues NoZero(tickvalues);
-tickvalues OmitTickIntervals(tickvalues)(real[] a, real[] b);
+string NoZeroFormat(real);
+guide Hermite(... guide[])(real[] splinetype(real[], real[]));
+guide Hermite(... guide[]);
+path Circle(pair c, real r, int n=<default>);
+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);
+scaleT Broken(real a, real b, bool automin=<default>, bool automax=<default>);
+scaleT BrokenLog(real a, real b, bool automin=<default>, bool automax=<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>, 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>);
 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>, real[] Ticks, real[] ticks=<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>);
-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>);
-string DefaultFormat(real);
-string Format(real)(string s=<default>);
-real upscale(real b, real a);
-bool logaxiscoverage(int N, transform T, path g, ticklocate locate, pair side, int sign, real Size, Label F, string ticklabel(real), real limit, int first, int last);
-pair labeltick(frame d, transform T, path g, ticklocate locate, real val, pair side, int sign, real Size, string ticklabel(real), Label F, real norm=<default>);
-int[] divisors(int a, int b);
-scientific scientific(real x);
-Label Break;
-tickvalues Break(tickvalues)(real, real);
-scaleT Linear;
-scaleT Linear(bool automin=<default>, bool automax=<default>, real s=<default>, real intercept=<default>);
-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);
+string noprimary;
+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>);
+void yequals(picture pic=<default>, Label L=<default>, real y, bool extend=<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>);
+pair Scale(picture pic=<default>, pair z);
+real ScaleX(picture pic=<default>, real x);
+real ScaleY(picture pic=<default>, real y);
+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>);
+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);
 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 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>);
-autoscaleT defaultS;
-real ScaleY(picture pic=<default>, real y);
 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>);
-void yequals(picture pic=<default>, Label L=<default>, real y, bool extend=<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>);
-guide Spline(... guide[]);
-bounds autoscale(real Min, real Max, scaleT scale=<default>);
-void autoscale(picture pic=<default>, void axis(picture, axisT));
-void Right(picture, axisT)(bool extend=<default>);
-void Right(picture, axisT);
-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 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>);
-string LogFormat(real)(int base);
-string LogFormat(real);
 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);
-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;
-scaleT Logarithmic;
+real xtrans(transform t, real x);
 void Top(picture, axisT)(bool extend=<default>);
 void Top(picture, axisT);
-string NoZeroFormat(real);
-string trailingzero;
-path[] segment(pair[] z, bool[] cond, guide join(... guide[])=<default>);
-picture vectorfield(path vector(real), path g, int n, bool truesize=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>);
-picture vectorfield(path vector(pair), pair a, pair b, int nx=<default>, int ny=<default>, bool truesize=<default>, real maxlength=<default>, bool cond(pair z)=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>);
-tickvalues OmitTickInterval(tickvalues)(real a, real b);
-pair tickMax(picture pic);
+real ytrans(transform t, real y);
+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[] divisors(int a, int b);
 scientific operator init();
 bounds operator init();
 ticklocate operator init();
@@ -3011,123 +3019,46 @@
 locateT operator init();
 tickvalues operator init();
 axisT operator init();
-real ScaleX(picture pic=<default>, real x);
-real xtrans(transform t, real x);
-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);
-void XZero(picture, axisT)(bool extend=<default>);
-void XZero(picture, axisT);
-real maxlength(pair a, pair b, int nx, int ny);
-real ytrans(transform t, real y);
 int Both;
-tickvalues None(tickvalues v);
-scaleT BrokenLog(real a, real b, bool automin=<default>, bool automax=<default>);
-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>);
-tickvalues OmitTick(tickvalues)(... real[] x);
-scaleT Log;
-scaleT Log(bool automin=<default>, bool automax=<default>);
+void axes(picture pic=<default>, Label xlabel=<default>, Label ylabel=<default>, bool extend=<default>, pair min=<default>, pair max=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
 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>);
+path[] segment(pair[] z, bool[] cond, guide join(... guide[])=<default>);
+ticklocate ticklocate(real a, real b, autoscaleT S=<default>, real tickmin=<default>, real tickmax=<default>, real time(real)=<default>, pair dir(real)=<default>);
+pair ticklabelshift(pair align, pen p=<default>);
+pair zero(real);
 void Bottom(picture, axisT)(bool extend=<default>);
 void Bottom(picture, axisT);
-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>);
-void xtick(picture pic=<default>, Label L, real x, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void axes(picture pic=<default>, Label xlabel=<default>, Label ylabel=<default>, bool extend=<default>, pair min=<default>, pair max=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
-string autoformat(string format=<default>, real norm ... real[] a);
-void ytick(picture pic=<default>, explicit pair z, pair dir=<default>, real size=<default>, pen p=<default>);
-void ytick(picture pic=<default>, real y, pair dir=<default>, real size=<default>, pen p=<default>);
-void ytick(picture pic=<default>, Label L, explicit pair z, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void ytick(picture pic=<default>, Label L, real y, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-guide Straight(... guide[]);
-scaleT Broken(real a, real b, bool automin=<default>, bool automax=<default>);
 void BottomTop(picture, axisT)(bool extend=<default>);
 void BottomTop(picture, axisT);
-axisT axis;
-void axis(picture pic=<default>, Label L=<default>, path g, path g2=<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>), ticklocate locate, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, int[] divisor=<default>, bool above=<default>, bool opposite=<default>);
-string DefaultLogFormat(real)(int base);
-string DefaultLogFormat(real);
-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>);
+real zerotickfuzz;
+real upscale(real b, real a);
+bool logaxiscoverage(int N, transform T, path g, ticklocate locate, pair side, int sign, real Size, Label F, string ticklabel(real), real limit, int first, int last);
+string baselinetemplate;
+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>);
+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>);
 int Value;
-string OmitFormat(real)(string s=<default> ... real[] x);
-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>);
-void ztick3(picture pic=<default>, Label L, real z, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void ztick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
-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 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));
-triple defaultdir(triple X, triple Y, triple Z, bool opposite=<default>, projection P);
-real ztrans(real[][] t, real z);
-void XYZero(picture, axisT)(triple align=<default>, bool extend=<default>);
-void XYZero(picture, axisT);
-void YZZero(picture, axisT)(triple align=<default>, bool extend=<default>);
-void YZZero(picture, axisT);
-void XZEquals(picture, axisT)(real x, real z, triple align=<default>, bool extend=<default>);
-void YZEquals(picture, axisT)(real y, real z, triple align=<default>, bool extend=<default>);
-void Bounds(picture, axisT)(int type=<default>, int type2=<default>, triple align=<default>, bool extend=<default>);
-void Bounds(picture, axisT);
-void InTicks(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 InTicks(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 InTicks(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>);
-void NoTicks3(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>)();
-void NoTicks3(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>);
-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>, 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 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 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 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 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>);
-real xtrans(real[][] t, real x);
-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>);
-real maxlength(triple f(pair z), pair a, pair b, int nu, int nv);
-triple Dir(real)(triple dir);
-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>);
+scaleT Log;
+scaleT Log(bool automin=<default>, bool automax=<default>);
+void Right(picture, axisT)(bool extend=<default>);
+void Right(picture, axisT);
+void RightTicks(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 RightTicks(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 RightTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
+int Max;
+void XZero(picture, axisT)(bool extend=<default>);
+void XZero(picture, axisT);
+void YZero(picture, axisT)(bool extend=<default>);
+void YZero(picture, axisT);
+bounds autoscale(real Min, real Max, scaleT scale=<default>);
+void autoscale(picture pic=<default>, void axis(picture, axisT));
+guide Spline(... guide[]);
+void LeftRight(picture, axisT)(bool extend=<default>);
+void LeftRight(picture, axisT);
+path3[] segment(triple[] v, bool[] cond, void join(flatguide3)(... void(flatguide3)[])=<default>);
 locateT operator init();
-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 labely3(picture pic=<default>, Label L=<default>, real y, align align=<default>, string format=<default>, pen p=<default>);
-void xtick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
-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>);
-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);
-void XZZero(picture, axisT)(triple align=<default>, bool extend=<default>);
-void XZZero(picture, axisT);
-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 Straight(flatguide3)(... void(flatguide3)[]);
-real ytrans(real[][] t, real y);
-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 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 XYEquals(picture, axisT)(real x, real y, triple align=<default>, bool extend=<default>);
-real ScaleZ(picture pic=<default>, real z);
-void xaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), 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>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>);
-void Spline(flatguide3)(... void(flatguide3)[]);
-void labelz3(picture pic=<default>, Label L=<default>, real z, align align=<default>, string format=<default>, pen p=<default>);
 void graph(flatguide3)(triple F(real), real, real, int)(void join(flatguide3)(... void(flatguide3)[]));
 void(flatguide3)[] graph(triple F(real), real, real, int)(void join(flatguide3)(... void(flatguide3)[]), bool3 cond(real));
 void graph(flatguide3)(picture pic=<default>, real x(real), real y(real), real z(real), real a, real b, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
@@ -3142,23 +3073,28 @@
 void graph(flatguide3)(triple F(pair), path p, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
 void graph(flatguide3)(picture pic=<default>, real f(pair), path p, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
 void graph(flatguide3)(real f(pair), path p, int n=<default>, real T(pair), void join(flatguide3)(... void(flatguide3)[])=<default>);
-path3 Arc(triple c, triple v1, triple v2, triple normal=<default>, bool direction=<default>, int n=<default>);
-path3 Arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=<default>, bool direction, int n=<default>);
-path3 Arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=<default>, int n=<default>);
-void labeltick(picture pic, real[][] T, path3 g, ticklocate locate, real val, int sign, real Size, string ticklabel(real), Label F, real norm=<default>);
-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);
-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(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>);
+triple polar(real r, real theta, real phi);
 void polargraph(flatguide3)(real r(real, real), real theta(real), real phi(real), int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
-triple ticklabelshift(triple align, pen p=<default>);
-triple polar(real r, real theta, real phi);
-triple Scale(picture pic=<default>, triple v);
-void limits(picture pic=<default>, triple min, triple max);
-void InOutTicks(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 InOutTicks(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 InOutTicks(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>);
+bool uperiodic(triple[][] a);
+bool vperiodic(triple[][] a);
+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>);
+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>);
+void Bounds(picture, axisT)(int type=<default>, int type2=<default>, triple align=<default>, bool extend=<default>);
+void Bounds(picture, axisT);
+void XZZero(picture, axisT)(triple align=<default>, bool extend=<default>);
+void XZZero(picture, axisT);
+void YZZero(picture, axisT)(triple align=<default>, bool extend=<default>);
+void YZZero(picture, axisT);
+void xaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), 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>, 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>);
+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 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 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>);
 surface surface(triple[][] f, bool[][] cond=<default>);
 surface surface(real[][] f, real[] x, real[] y, real[] xsplinetype(real[], real[])=<default>, real[] ysplinetype(real[], real[])=<default>, bool[][] cond=<default>);
 surface surface(real[][] f, pair a, pair b, real[] xsplinetype(real[], real[]), real[] ysplinetype(real[], real[])=<default>, bool[][] cond=<default>);
@@ -3167,119 +3103,177 @@
 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 XYEquals(picture, axisT)(real x, real y, triple align=<default>, bool extend=<default>);
+triple Dir(real)(triple dir);
+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 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>, 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 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>);
+real maxlength(triple f(pair z), pair a, pair b, int nu, int nv);
+void drawtick(picture pic, real[][] T, path3 g, path3 g2, ticklocate locate, real val, real Size, int sign, pen p, bool extend);
+triple tickMin3(picture pic);
+triple tickMax3(picture pic);
+triple Scale(picture pic=<default>, triple v);
+real ScaleZ(picture pic=<default>, real z);
+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 Circle(triple c, real r, triple normal=<default>, int n=<default>);
+void InTicks(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 InTicks(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 InTicks(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>);
+void Spline(flatguide3)(... void(flatguide3)[]);
+void InOutTicks(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 InOutTicks(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 InOutTicks(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>);
+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 label(picture pic, Label L, triple v, real x, align align, string format, pen p);
+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 labeltick(picture pic, real[][] T, path3 g, ticklocate locate, real val, int sign, real Size, string ticklabel(real), Label F, real norm=<default>);
+void labelaxis(picture pic, real[][] T, Label L, path3 g, ticklocate locate=<default>, int sign=<default>, bool ticklabels=<default>);
+void labelx3(picture pic=<default>, Label L=<default>, real x, align align=<default>, string format=<default>, pen p=<default>);
+void labely3(picture pic=<default>, Label L=<default>, real y, align align=<default>, string format=<default>, pen p=<default>);
+void labelz(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
+void labelz3(picture pic=<default>, Label L=<default>, real z, align align=<default>, string format=<default>, pen p=<default>);
+void autoscale3(picture pic=<default>, void axis(picture, axisT));
+void xtick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
+void xtick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<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 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>);
+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 ztick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
+void ztick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+void ztick3(picture pic=<default>, real z, triple dir=<default>, real size=<default>, pen p=<default>);
+void ztick3(picture pic=<default>, Label L, real z, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+triple defaultdir(triple X, triple Y, triple Z, bool opposite=<default>, projection P);
+real xtrans(real[][] t, real x);
+real ytrans(real[][] t, real y);
+real ztrans(real[][] t, real z);
+ticklocate ticklocate(real a, real b, autoscaleT S=<default>, real tickmin=<default>, real tickmax=<default>, real time(real)=<default>, triple dir(real));
+triple ticklabelshift(triple align, pen p=<default>);
+path3 Arc(triple c, triple v1, triple v2, triple normal=<default>, bool direction=<default>, int n=<default>);
+path3 Arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=<default>, bool direction, int n=<default>);
+path3 Arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=<default>, int n=<default>);
+void limits(picture pic=<default>, triple min, triple max);
+void XZEquals(picture, axisT)(real x, real z, triple align=<default>, bool extend=<default>);
+void YZEquals(picture, axisT)(real y, real z, triple align=<default>, bool extend=<default>);
+void XYZero(picture, axisT)(triple align=<default>, bool extend=<default>);
+void XYZero(picture, axisT);
+void zlimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
+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>);
+surface bispline(real[][] z, real[][] p, real[][] q, real[][] r, real[] x, real[] y, bool[][] cond=<default>);
+void NoTicks3(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>)();
+void NoTicks3(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>);
+bool Crop;
+int ngraph;
+real epsilon;
 real axiscoverage;
 real Ticksize;
+bool NoCrop;
 real ticksize;
 int nmesh;
 int nCircle;
 real ylabelwidth;
-real epsilon;
 real axislabelfactor;
-bool NoCrop;
-int ngraph;
-bool Crop;
-guide hermite(real[] x, real[] y, real[] splinetype(real[], real[])=<default>);
+real[] clamped(real[], real[])(real slopea, real slopeb);
+real[] natural(real[] x, real[] y);
 real[] monotonic(real[] x, real[] y);
-real[] clamped(real[], real[])(real slopea, real slopeb);
+real[] notaknot(real[] x, real[] y);
 real[] linear(real[] x, real[] y);
+string morepoints;
+guide hermite(real[] x, real[] y, real[] splinetype(real[], real[])=<default>);
+void checklengths(int x, int y, string text=<default>);
+void checkincreasing(real[] x);
+real[] periodic(real[] x, real[] y);
 string differentlengths;
-string morepoints;
 real[] Spline(real[] x, real[] y);
 real[](real[], real[])[] Spline;
-real[] notaknot(real[] x, real[] y);
-real[] periodic(real[] x, real[] y);
-real[] natural(real[] x, real[] y);
-void checklengths(int x, int y, string text=<default>);
-void checkincreasing(real[] x);
-grid3(picture pic)[] YX_YZgrid(position posa=<default>, position posb=<default>);
-grid3(picture pic)[] YX_YZgrid;
-grid3(picture pic)[] YZYgrid(position pos=<default>);
-grid3(picture pic)[] YZYgrid;
-grid3(picture pic)[] XZXgrid(position pos=<default>);
-grid3(picture pic)[] XZXgrid;
-grid3(picture pic)[] ZXZgrid(position pos=<default>);
-grid3(picture pic)[] ZXZgrid;
-grid3 ZYgrid(picture pic)(position pos=<default>);
-grid3 ZYgrid(picture pic);
-grid3 ZXgrid(picture pic)(position pos=<default>);
-grid3 ZXgrid(picture pic);
-grid3 XZgrid(picture pic)(position pos=<default>);
-grid3 XZgrid(picture pic);
-grid3 YXgrid(picture pic)(position pos=<default>);
-grid3 YXgrid(picture pic);
-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(picture pic)[][] XYZgrid(position pos=<default>);
-grid3(picture pic)[][] XYZgrid;
 grid3(picture pic)[] YXYgrid(position pos=<default>);
 grid3(picture pic)[] YXYgrid;
+grid3 operator init();
+ticksgridT operator init();
+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));
+triple X(picture pic);
+triple Y(picture pic);
+triple Z(picture pic);
+grid3(picture pic)[] XYXgrid(position pos=<default>);
+grid3(picture pic)[] XYXgrid;
+grid3(picture pic)[] XY_XZgrid(position posa=<default>, position posb=<default>);
+grid3(picture pic)[] XY_XZgrid;
 grid3(picture pic)[] ZX_ZYgrid(position posa=<default>, position posb=<default>);
 grid3(picture pic)[] ZX_ZYgrid;
+grid3 XYgrid(picture pic)(position pos=<default>);
+grid3 XYgrid(picture pic);
+grid3 ZYgrid(picture pic)(position pos=<default>);
+grid3 ZYgrid(picture pic);
 position middle;
 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 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>);
 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>);
+triple YZ(picture pic);
+triple ZX(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 YZgrid(picture pic)(position pos=<default>);
-grid3 YZgrid(picture pic);
+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(picture pic)[] ZXZgrid(position pos=<default>);
+grid3(picture pic)[] ZXZgrid;
 position top;
-grid3 operator init();
-ticksgridT operator init();
-triple ZX(picture pic);
-triple X(picture pic);
-triple Y(picture pic);
-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));
+grid3(picture pic)[] XZXgrid(position pos=<default>);
+grid3(picture pic)[] XZXgrid;
+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>);
+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>);
+grid3(picture pic)[] YX_YZgrid(position posa=<default>, position posb=<default>);
+grid3(picture pic)[] YX_YZgrid;
 position bottom;
-grid3(picture pic)[] XY_XZgrid(position posa=<default>, position posb=<default>);
-grid3(picture pic)[] XY_XZgrid;
+grid3 YXgrid(picture pic)(position pos=<default>);
+grid3 YXgrid(picture pic);
+grid3 ZXgrid(picture pic)(position pos=<default>);
+grid3 ZXgrid(picture pic);
+triple XY(picture pic);
+grid3(picture pic)[][] XYZgrid(position pos=<default>);
+grid3(picture pic)[][] XYZgrid;
 grid3(picture pic)[] ZYZgrid(position pos=<default>);
 grid3(picture pic)[] ZYZgrid;
-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 YZ(picture pic);
-triple XY(picture pic);
-triple Z(picture pic);
-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 XZgrid(picture pic)(position pos=<default>);
+grid3 XZgrid(picture pic);
+grid3 YZgrid(picture pic)(position pos=<default>);
+grid3 YZgrid(picture pic);
+grid3(picture pic)[] YZYgrid(position pos=<default>);
+grid3(picture pic)[] YZYgrid;
 real fspline(real)(real[] x, real[] y, real[] splinetype(real[], real[])=<default>);
-real fhorner(real)(horner sh);
+real pwhermite(real)(real[] x, real[] y, real[] dy);
+horner diffdiv(real[] x, real[] y);
 horner hdiffdiv(real[] x, real[] y, real[] dy);
 horner operator init();
-real pwhermite(real)(real[] x, real[] y, real[] dy);
-horner diffdiv(real[] x, real[] y);
+real fhorner(real)(horner sh);
 void labelpath(frame f, Label L, path g, string justify=<default>, pen p=<default>);
 void labelpath(picture pic=<default>, Label L, path g, string justify=<default>, pen p=<default>);
+string LeftJustified;
+string Centered;
 string RightJustified;
-string Centered;
-string LeftJustified;
 surface labelpath(string s, path3 p, real angle=<default>, triple optional=<default>);
-triple nextnormal(triple p, triple q);
+triple[] firstframe(path3 p, triple optional=<default>);
 triple[] nextframe(path3 p, real reltimestart, triple[] start, real reltimeend, int subdiv=<default>);
-triple[] firstframe(path3 p, triple optional=<default>);
 real eps;
-void lm_lmpar(int n, real[] r, int ldr, int[] ipvt, real[] diag, real[] qtb, real delta, lm_real_type par, real[] x, real[] sdiag, real[] wa1, real[] wa2);
+triple nextnormal(triple p, triple q);
+string[] lm_infmsg;
 void lm_qrfac(int m, int n, real[] a, bool pivot, int[] ipvt, real[] rdiag, real[] acnorm, real[] wa);
-void lm_print_quiet(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev);
-void lm_print_default(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev);
-string pad(string str, int count, string pad=<default>);
-string pad(int num, int digits, string pad=<default>);
-string pad(real num, int digits, string pad=<default>);
-real lm_enorm(int n, real[] x, int offset=<default>);
-real SQR(real x);
-void lm_lmdif(int m, int n, real[] x, real[] fvec, real ftol, real xtol, real gtol, int maxfev, real epsfcn, real[] diag, int mode, real factor, lm_int_type info, lm_int_type nfev, real[] fjac, int[] ipvt, real[] qtf, real[] wa1, real[] wa2, real[] wa3, real[] wa4, void evaluate(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info), void printout(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev), lm_data_type data);
-string[] lm_shortmsg;
-real LM_USERTOL;
-real LM_DWARF;
+void lm_qrsolv(int n, real[] r, int ldr, int[] ipvt, real[] diag, real[] qtb, real[] x, real[] sdiag, real[] wa);
+FitControl defaultControl;
 real LM_MACHEP;
-FitControl defaultControl;
+real LM_SQRT_DWARF;
 real LM_SQRT_GIANT;
-string[] lm_infmsg;
-void lm_evaluate_default(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info);
-void lm_qrsolv(int n, real[] r, int ldr, int[] ipvt, real[] diag, real[] qtb, real[] x, real[] sdiag, real[] wa);
+void lm_lmpar(int n, real[] r, int ldr, int[] ipvt, real[] diag, real[] qtb, real delta, lm_real_type par, real[] x, real[] sdiag, real[] wa1, real[] wa2);
+void lm_lmdif(int m, int n, real[] x, real[] fvec, real ftol, real xtol, real gtol, int maxfev, real epsfcn, real[] diag, int mode, real factor, lm_int_type info, lm_int_type nfev, real[] fjac, int[] ipvt, real[] qtf, real[] wa1, real[] wa2, real[] wa3, real[] wa4, void evaluate(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info), void printout(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev), lm_data_type data);
+void lm_minimize(int m_dat, int n_par, real[] par, void evaluate(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info), void printout(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev), lm_data_type data, lm_control_type control);
+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_enorm(int n, real[] x, int offset=<default>);
 lm_data_type operator init();
 lm_int_type operator init();
 lm_real_type operator init();
@@ -3286,134 +3280,138 @@
 lm_control_type operator init();
 FitControl operator init();
 FitResult operator init();
-void lm_minimize(int m_dat, int n_par, real[] par, void evaluate(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info), void printout(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev), lm_data_type data, lm_control_type control);
-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 SQR(real x);
+string[] lm_shortmsg;
+void lm_evaluate_default(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info);
+string pad(string str, int count, string pad=<default>);
+string pad(int num, int digits, string pad=<default>);
+string pad(real num, int digits, string pad=<default>);
+real LM_USERTOL;
+real LM_DWARF;
+void lm_print_quiet(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev);
+void lm_print_default(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev);
+real barmarksize(pen p=<default>);
+real barmarksizefactor;
 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>);
-real markanglespace(pen p=<default>);
-real markanglespace;
 frame crossframe(int n=<default>, real size=<default>, pair space=<default>, real angle=<default>, pair offset=<default>, pen p=<default>);
 real crossmarksize(pen p=<default>);
-real barmarksize(pen p=<default>);
-real barmarksizefactor;
+real crossmarksizefactor;
+frame stickframe(int n=<default>, real size=<default>, pair space=<default>, real angle=<default>, pair offset=<default>, pen p=<default>);
+frame stickframe;
+real stickmarksize(pen p=<default>);
+real stickmarkspace(pen p=<default>);
+real stickmarksizefactor;
+real stickmarkspacefactor;
+frame duplicate(path g, int n=<default>, pair space=<default>, pen p=<default>);
+marker CircleBarIntervalMarker(int i=<default>, int n=<default>, real barsize=<default>, real radius=<default>, real angle=<default>, pair offset=<default>, bool rotated=<default>, pen p=<default>, filltype filltype=<default>, bool circleabove=<default>, frame uniform=<default>, bool above=<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 circlemarkradius(pen p=<default>);
 real circlemarkradiusfactor;
+marker operator *(transform T, marker m);
+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>);
 frame tildeframe(int n=<default>, real size=<default>, pair space=<default>, real angle=<default>, pair offset=<default>, pen p=<default>);
 frame tildeframe;
-frame duplicate(path g, int n=<default>, pair space=<default>, pen p=<default>);
-void markinterval(picture pic=<default>, frame f, path g)(int n=<default>, frame f, bool rotated=<default>);
-marker CircleBarIntervalMarker(int i=<default>, int n=<default>, real barsize=<default>, real radius=<default>, real angle=<default>, pair offset=<default>, bool rotated=<default>, pen p=<default>, filltype filltype=<default>, bool circleabove=<default>, frame uniform=<default>, bool above=<default>);
-real crossmarksizefactor;
-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;
-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>);
-real stickmarkspacefactor;
-real stickmarkspace(pen p=<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>);
+real markanglespace(pen p=<default>);
+real markanglespace;
 real markangleradius(pen p=<default>);
 real markangleradius;
-marker operator *(transform T, marker m);
-real[] leastsquares(real[][] A, real[] b, bool warn=<default>);
-pair[][] fft(pair[][] a, int sign=<default>);
-pair[] quarticroots(real a, real b, real c, real d, real e);
-real slope(path g, real x, int n=<default>);
-real slope(path g, explicit pair z, int n=<default>);
-real value(path g, real x, int n=<default>);
-real value(path g, explicit pair z, int n=<default>);
-real time(path g, real x, int n=<default>);
-real time(path g, explicit pair z, int n=<default>);
+real markanglespacefactor;
+real markangleradiusfactor;
+void markinterval(picture pic=<default>, frame f, path g)(int n=<default>, frame f, bool rotated=<default>);
+real[] partialsum(real[] a);
+real[] partialsum(real[] a, real[] dx);
+int[] partialsum(int[] a);
+int[] partialsum(int[] a, int[] dx);
+real cot(real x);
+int unique(real[] a, real x);
+int unique(string[] a, string x);
+int quadrant(real degrees);
+pair exp(explicit pair z);
+string nopoint;
+real intersect(pair p, pair q, pair z);
+real intersect(triple P, triple Q, triple n, triple Z);
 real interpolate(real[] x, real[] y, real x0, int i);
 real interpolate(real[] x, real[] y, real x0);
+triple intersectionpoint(triple n0, triple P0, triple n1, triple P1);
+pair[] quarticroots(real a, real b, real c, real d, real e);
+bool lexorder(pair a, pair b);
+bool lexorder(triple a, triple b);
+bool square(real[][] m);
+real sec(real x);
 bool rectangular(real[][] m);
 bool rectangular(pair[][] m);
 bool rectangular(triple[][] m);
-bool lexorder(pair a, pair b);
-bool lexorder(triple a, triple b);
-int unique(real[] a, real x);
-int unique(string[] a, string x);
-real[] partialsum(real[] a);
-real[] partialsum(real[] a, real[] dx);
-int[] partialsum(int[] a);
-int[] partialsum(int[] a, int[] dx);
+bool polygon(path p);
+pair unityroot(int n, int k=<default>);
+real acot(real x);
+pair[][] fft(pair[][] a, int sign=<default>);
+real slope(path g, real x, int n=<default>);
+real slope(path g, explicit pair z, int n=<default>);
 picture grid(int Nx, int Ny, pen p=<default>);
+rootfinder_settings operator init();
 real frac(real x);
 real asec(real x);
+int[][] segmentlimits(bool[] b);
+int[][] segment(bool[] b);
+real time(path g, real x, int n=<default>);
+real time(path g, explicit pair z, int n=<default>);
+real[] leastsquares(real[][] A, real[] b, bool warn=<default>);
+bool increasing(real[] a, bool strict=<default>);
+real[] zero(int n);
+real[][] zero(int n, int m);
+real findroot(real f(real), real a, real b, real tolerance=<default>, real fa=<default>, real fb=<default>);
 real acsc(real x);
-real sec(real x);
+real value(path g, real x, int n=<default>);
+real value(path g, explicit pair z, int n=<default>);
 real csc(real x);
-int quadrant(real degrees);
-pair exp(explicit pair z);
-real cot(real x);
 pair log(explicit pair z);
-triple intersectionpoint(triple n0, triple P0, triple n1, triple P1);
-real[] zero(int n);
-real[][] zero(int n, int m);
-real findroot(real f(real), real a, real b, real tolerance=<default>, real fa=<default>, real fb=<default>);
-string nopoint;
 void drawline(picture pic=<default>, pair P, pair Q, pen p=<default>);
-int[][] segment(bool[] b);
-real acot(real x);
-real intersect(pair p, pair q, pair z);
-real intersect(triple P, triple Q, triple n, triple Z);
-rootfinder_settings operator init();
-pair unityroot(int n, int k=<default>);
-bool polygon(path p);
-bool square(real[][] m);
-bool increasing(real[] a, bool strict=<default>);
-int[][] segmentlimits(bool[] b);
+path cutbefore(path p, path q);
+path cutafter(path p, path q);
 path cuttings;
-path cutafter(path p, path q);
-path cutbefore(path p, path q);
+void draw(picture pic=<default>, obj o, light light=<default>);
 obj operator *(real[][] T, obj o);
 obj operator init();
-void draw(picture pic=<default>, obj o, light light=<default>);
 real[][] finiteDifferenceJacobian(real[] f(real[]), real[] t, real[] h=<default>);
-real adjust(real h, real error, real tolmin, real tolmax, RKTableau tableau);
+RKTableau E_Euler;
 real error(real error, real initial, real lowOrder, real norm, real diff);
-RKTableau RK5F;
 RKTableau RK5;
+real stepfactor;
 RKTableau RK4;
-RKTableau RK3BS;
 real[] newton(int iterations=<default>, real[] f(real[]), real[][] jacobian(real[]), real[] t);
-RKTableau RK2;
-RKTableau E_Euler;
 real phi1(real x);
-real[] Coeff;
-real stepfactor;
+solution integrate(real y, real c=<default>, real f(real t, real y), 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>);
+Solution integrate(real[] y, real[] f(real t, real[] y), 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>);
+RKTableau RK3;
+void expfactors(real x, coefficients a);
 real phi2(real x);
-RKTableau RK5DP;
 void report(real old, real h, real t);
+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;
 RKTableau E_PC;
-solution integrate(real y, real c=<default>, real f(real t, real y), 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>);
-Solution integrate(real[] y, real[] f(real t, real[] y), 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>);
-RKTableau E_RK2;
-RKTableau RK3;
-RKTableau PC;
+RKTableau RK2;
 real phi3(real x);
+void write(solution S);
+void write(Solution S);
 coefficients operator init();
 RKTableau operator init();
 solution operator init();
 Solution operator init();
-void write(solution S);
-void write(Solution S);
-void expfactors(real x, coefficients a);
+RKTableau E_RK2;
+RKTableau RK3BS;
+RKTableau RK5F;
+real adjust(real h, real error, real tolmin, real tolmax, RKTableau tableau);
+RKTableau RK5DP;
+real[] Coeff;
+RKTableau PC;
 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;
-pen[] cmyk(pen[] Palette);
-pen[] BWRainbow2(int NColors=<default>);
+pen[] Grayscale(int NColors=<default>);
+bounds Range(picture pic, real min, real max)(bool automin=<default>, real min=<default>, bool automax=<default>, real max=<default>);
 pen[] Wheel(int NColors=<default>);
-real[] sequencereal;
-pen[] adjust(picture pic, real min, real max, real rmin, real rmax, pen[] palette);
 void image(frame f, real[][] data, pair initial, pair final, pen[] palette, bool transpose=<default>, transform t=<default>, bool copy=<default>, bool antialias=<default>);
 void image(frame f, pen[][] data, pair initial, pair final, bool transpose=<default>, transform t=<default>, bool copy=<default>, bool antialias=<default>);
 bounds image(picture pic=<default>, real[][] f, bounds range(picture pic, real min, real max)=<default>, pair initial, pair final, pen[] palette, bool transpose=<default>, bool copy=<default>, bool antialias=<default>);
@@ -3422,206 +3420,208 @@
 void image(picture pic=<default>, pen f(int, int), int width, int height, pair initial, pair final, bool transpose=<default>, bool antialias=<default>);
 bounds image(picture pic=<default>, pair[] z, real[] f, bounds range(picture pic, real min, real max)=<default>, pen[] palette);
 bounds image(picture pic=<default>, real[] x, real[] y, real[] f, bounds range(picture pic, real min, real max)=<default>, pen[] palette);
-bounds Full(picture pic, real min, real max);
+pen[] cmyk(pen[] Palette);
+pen[] BWRainbow(int NColors, bool two);
+pen[] BWRainbow(int NColors=<default>);
+pen[] BWRainbow2(int NColors=<default>);
+transform swap;
 bounds Automatic(picture pic, real min, real max);
-transform swap;
-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>);
+real[] sequencereal;
+pen[] Rainbow(int NColors=<default>);
+pen[] adjust(picture pic, real min, real max, real rmin, real rmax, pen[] palette);
 pen[] Gradient(int NColors=<default> ... pen[] p);
-pen[] Rainbow(int NColors=<default>);
 pen[] quantize(pen[] Palette, int n);
-pen[] Grayscale(int NColors=<default>);
-pen[] BWRainbow(int NColors, bool two);
-pen[] BWRainbow(int NColors=<default>);
-bounds Range(picture pic, real min, real max)(bool automin=<default>, real min=<default>, bool automax=<default>, real max=<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>)(int sign=<default>);
+bounds Full(picture pic, real min, real max);
+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>);
 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>);
-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>);
+picture brick(real Hx=<default>, real Hy=<default>, pen p=<default>);
 picture crosshatch(real H=<default>, pen p=<default>);
 picture hatch(real H=<default>, pair dir=<default>, pen p=<default>);
 real hatchepsilon;
 picture checker(real Hx=<default>, real Hy=<default>, pen p=<default>);
+void add(string name, picture pic, pair lb=<default>, pair rt=<default>);
+frame tiling(string name, picture pic, pair lb=<default>, pair rt=<default>);
 picture tile(real Hx=<default>, real Hy=<default>, pen p=<default>, filltype filltype=<default>);
-picture brick(real Hx=<default>, real Hy=<default>, pen p=<default>);
-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>);
+pen textpen;
 void gsave(picture pic=<default>);
-pen textpen;
 pair align;
 rational[][] rationalidentity(int n);
-rational sum(rational[] a);
+int gcd(int m, int n);
+rational min(rational a, rational b);
+rational abs(rational r);
+string texstring(rational r);
 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);
+string string(rational r);
+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>);
 rational operator +(rational r, rational s);
-int gcd(int m, int n);
+rational operator -(rational r);
+rational operator -(rational r, rational s);
+rational[] operator -(rational[] r);
+rational operator *(rational r, rational s);
+rational operator init();
 rational operator cast(int p);
 rational[] operator cast(int[] a);
 rational[][] operator cast(int[][] a);
-rational operator init();
-rational min(rational a, rational b);
-bool operator !=(rational r, rational s);
-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>);
+real operator ecast(rational r);
+rational operator /(rational r, rational s);
 bool operator ==(rational r, rational s);
 bool[] operator ==(rational[] r, rational s);
 bool operator ==(rational[] r, rational[] s);
 bool operator ==(rational[][] r, rational[][] s);
+bool operator !=(rational r, rational s);
+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 operator -(rational r, rational s);
-rational[] operator -(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 sum(rational[] a);
+int lcm(int m, int n);
 rational max(rational a, rational b);
 rational max(rational[] a);
-string string(rational r);
-real operator ecast(rational r);
-rational operator *(rational r, rational s);
-void simplexWrite(rational[][] E, int[] Bindicies, int, int);
+simplex operator init();
 void simplexPhase2();
 void simplexTableau(rational[][] E, int[] Bindices, int I=<default>, int J=<default>);
-simplex operator init();
+void simplexWrite(rational[][] E, int[] Bindicies, int, int);
 path roundedpath(path A, real R, real S=<default>);
 simplex operator init();
-void bibliography(string name);
-void subitem(string s, pen p=<default>);
-void item(string s, pen p=<default>, bool step=<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 code(bool center=<default>, string s, pen p=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>);
-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>);
-void figure(string s, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
 void display(frame[] f, real margin=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
 void display(frame f, real margin=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
 void display(string[] s, real margin=<default>, string[] captions=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
 void display(string s, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
-void equation(string s, pen p=<default>);
-void vbox(string s, pen p=<default>);
+void multifigure(string[] slist, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool step=<default>);
+int page;
+void subitem(string s, pen p=<default>);
+pen pagenumberpen;
+pair pagenumberalign;
+pair pagenumberposition;
+void indexedfigure(string prefix, int first, int last, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool step=<default>);
+string texcolor(pen p);
+void color(string name, string color);
+pen foregroundcolor;
+void bibliography(string name);
+void bibliographystyle(string name);
+int[] lastnode;
+real aboveequationskip;
+void nextpage(pen p=<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 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>);
+bool itemstep;
+real itemskip;
 void remark(bool center=<default>, string s, pair align=<default>, pen p=<default>, real indent=<default>, bool minipage=<default>, real skip=<default>, filltype filltype=<default>, bool step=<default>);
-void outline(string s=<default>, pair position=<default>, pair align=<default>, pen p=<default>);
-void erasestep(int erasenode);
-bool checkposition();
+void filecode(bool center=<default>, string s, pen p=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>);
+void usersetting();
+bool landscape;
+real codeskip;
+void newslide(bool stepping=<default>);
+pen itempen;
+bool reverse;
 void reversevideo();
-void color(string name, string color);
-bool empty();
-void setpens(pen red=<default>, pen blue=<default>, pen steppen=<default>);
-int preamblenodes;
-int page;
-int[] firstnode;
-pair titlepageposition;
-pen foregroundcolor;
+void vbox(string s, pen p=<default>);
+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>);
+void exitfunction();
+bool havepagenumber;
+void item(string s, pen p=<default>, bool step=<default>);
+real pageheight;
+real pagewidth;
+picture background;
+void background();
 pen backgroundcolor;
-pen figuremattpen;
-pair pagenumberposition;
-string newbulletcolor;
-void skip(real n=<default>);
-string oldbulletcolor;
+void normalvideo();
+void title(string s, pair position=<default>, pair align=<default>, pen p=<default>, bool newslide=<default>);
+pen titlepen;
+real titleskip;
+pair dateskip;
 pair titlealign;
-pair dateskip;
-real itemskip;
-pen datepen;
-pen institutionpen;
 pen authorpen;
 pen titlepagepen;
+void titlepage(string title, string author, string institution=<default>, string date=<default>, string url=<default>, bool newslide=<default>);
+pair titlepageposition;
 pen codepen;
+void erasestep(int erasenode);
+bool checkposition();
+string cropcode(string s);
+void setpens(pen red=<default>, pen blue=<default>, pen steppen=<default>);
+void code(bool center=<default>, string s, pen p=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>);
+transform tinv;
 pair urlskip;
-transform tinv;
-picture background;
-void background();
-real pageheight;
-real pagewidth;
-void indexedfigure(string prefix, int first, int last, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool step=<default>);
-pen titlepen;
-string bulletcolor(string color);
-real minipagemargin;
-void incrementposition(pair z);
-void filecode(bool center=<default>, string s, pen p=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>);
-void newslide(bool stepping=<default>);
-void center(string s, pen p=<default>);
-real titleskip;
-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 numberpage(pen p=<default>);
+pen urlpen;
+bool allowstepping;
 pair currentposition;
-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;
+int[] firstnode;
+bool firststep;
 string asywrite(string s, string preamble=<default>);
-bool reverse;
-void numberpage(pen p=<default>);
-string cropcode(string s);
-void usersetting();
+pair startposition;
+string oldbulletcolor;
+string newbulletcolor;
+pen datepen;
+void incrementposition(pair z);
+pen institutionpen;
+void skip(real n=<default>);
+bool stepping;
+real pagemargin;
+pen steppagenumberpen;
+bool empty();
 void currentexitfunction();
-bool landscape;
-bool itemstep;
-bool firststep;
-void normalvideo();
-bool stepping;
-real codeskip;
+void step();
+string[] codefile;
+void outline(string s=<default>, pair position=<default>, pair align=<default>, pen p=<default>);
+void center(string s, pen p=<default>);
+void equation(string s, pen p=<default>);
+void equations(string s, pen p=<default>);
+void asyinclude(string s, real xsize=<default>, real ysize=<default>);
+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>);
+void figure(string s, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
 real figureborder;
+pen figuremattpen;
 string bullet;
-pen pagenumberpen;
-int[] lastnode;
-string texcolor(pen p);
-void equations(string s, pen p=<default>);
-bool allowstepping;
-real aboveequationskip;
-void nextpage(pen p=<default>);
+int preamblenodes;
+string bulletcolor(string color);
 real minipagewidth;
-void bibliographystyle(string name);
-real pagemargin;
-pen urlpen;
-void title(string s, pair position=<default>, pair align=<default>, pen p=<default>, bool newslide=<default>);
-pen steppagenumberpen;
-pair pagenumberalign;
-bool havepagenumber;
-void exitfunction();
+real minipagemargin;
+real stepfraction;
+path curve(pair c, real f(real, real), pair a, pair b);
+path curve(pair c, real f(real), pair a, pair b);
 picture slopefield(real f(real, real), pair a, pair b, int nx=<default>, int ny=<default>, real tickfactor=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>);
 picture slopefield(real f(real), pair a, pair b, int nx=<default>, int ny=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>);
-path curve(pair c, real f(real, real), pair a, pair b);
-path curve(pair c, real f(real), pair a, pair b);
-real stepfraction;
-surface implicitsurface(real f(triple)=<default>, real ff(real, real, real)=<default>, triple a, triple b, int n=<default>, bool keyword overlapedges=<default>, int keyword nx=<default>, int keyword ny=<default>, int keyword nz=<default>, int keyword maxdepth=<default>, bool keyword usetriangles=<default>);
-evaluatedpoint[][] slice(evaluatedpoint[][] a, int start1, int end1, int start2, int end2);
-evaluatedpoint[][][] slice(evaluatedpoint[][][] a, int start1, int end1, int start2, int end2, int start3, int end3);
-positionedvector[][] slice(positionedvector[][] a, int start1, int end1, int start2, int end2);
-positionedvector[][][] slice(positionedvector[][][] a, int start1, int end1, int start2, int end2, int start3, int end3);
-triple nGrad(triple)(real f(triple));
-patch[] quadpatches(path3 edgecycle, positionedvector[] corners, real f(triple), triple grad(triple), triple a, triple b, bool usetriangles);
-bool checkpt(triple testpt, real f(triple), triple grad(triple), triple a, triple b);
-bool checkptincube(triple pt, triple a, triple b);
-bool check_fpt_zero(triple testpoint, real f(triple), triple grad(triple));
-patch[] triangletoquads(path3 external, real f(triple), triple grad(triple), triple a, triple b);
-triple normalout(int face);
+real B03(real t);
 patch[] maketriangle(path3 external, real f(triple), triple grad(triple), bool allowsubdivide=<default>);
+real B23(real t);
 path3 pathinface(positionedvector v1, positionedvector v2, triple facenorm, triple edge1normout, triple edge2normout);
 path3 pathinface(positionedvector v1, positionedvector v2, int face, int edge1face, int edge2face);
 path3 bisector(path3 edgecycle, int[] savevertices);
-triple projecttospan(triple toproject, triple v1, triple v2, real mincoeff=<default>);
+int XHIGH;
 int YHIGH;
-int XHIGH;
-int NULL_VERTEX;
-patch trianglewithnormals(path3 external, triple n1, triple n2, triple n3);
+int ZHIGH;
+real(real)[] bernstein;
+path3 pathbetween(positionedvector v1, positionedvector v2);
+path3 pathbetween(path3 edgecycle, int vertex1, int vertex2);
 patch patchwithnormals(path3 external, triple[] u0normals, triple[] u1normals, triple[] v0normals, triple[] v1normals);
 patch patchwithnormals(path3 external, triple normalat(triple));
-real(real)[] bernstein;
-real B23(real t);
+real angledegrees(triple a, triple b);
+triple projecttospan(triple toproject, triple v1, triple v2, real mincoeff=<default>);
+real[] projecttospan_findcoeffs(triple toproject, triple v1, triple v2, bool warn=<default>);
+triple nGrad(triple)(real f(triple));
+patch[] quadpatches(path3 edgecycle, positionedvector[] corners, real f(triple), triple grad(triple), triple a, triple b, bool usetriangles);
+triple normalout(int face);
+int[] makecircle(edge[] edges);
 real B13(real t);
-bool operator ==(edge a, edge b);
-real B33(real t);
+bool check_fpt_zero(triple testpoint, real f(triple), triple grad(triple));
+bool checkptincube(triple pt, triple a, triple b);
+bool checkpt(triple testpt, real f(triple), triple grad(triple), triple a, triple b);
+int XLOW;
+int YLOW;
+int ZLOW;
 pathwithnormals_settings operator init();
 intset operator init();
 int_to_intset operator init();
@@ -3633,302 +3633,302 @@
 string operator cast(edge[] edges);
 string operator cast(positionedvector vv);
 triple operator cast(evaluatedpoint p);
-int ZLOW;
-real B03(real t);
-real[] projecttospan_findcoeffs(triple toproject, triple v1, triple v2, bool warn=<default>);
-int YLOW;
-int ZHIGH;
-real angledegrees(triple a, triple b);
-path3 pathbetween(positionedvector v1, positionedvector v2);
-path3 pathbetween(path3 edgecycle, int vertex1, int vertex2);
-int XLOW;
+surface implicitsurface(real f(triple)=<default>, real ff(real, real, real)=<default>, triple a, triple b, int n=<default>, bool keyword overlapedges=<default>, int keyword nx=<default>, int keyword ny=<default>, int keyword nz=<default>, int keyword maxdepth=<default>, bool keyword usetriangles=<default>);
+bool operator ==(edge a, edge b);
+patch[] triangletoquads(path3 external, real f(triple), triple grad(triple), triple a, triple b);
+patch trianglewithnormals(path3 external, triple n1, triple n2, triple n3);
 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>);
-path line(path p, path q, real[] t);
-pen defaultbackpen;
-revolution cone(triple c=<default>, real r, real h, triple axis=<default>, int n=<default>);
+real B33(real t);
+evaluatedpoint[][] slice(evaluatedpoint[][] a, int start1, int end1, int start2, int end2);
+evaluatedpoint[][][] slice(evaluatedpoint[][][] a, int start1, int end1, int start2, int end2, int start3, int end3);
+positionedvector[][] slice(positionedvector[][] a, int start1, int end1, int start2, int end2);
+positionedvector[][][] slice(positionedvector[][][] a, int start1, int end1, int start2, int end2, int start3, int end3);
+int NULL_VERTEX;
 revolution operator *(real[][] t, revolution r);
-revolution sphere(triple c=<default>, real r, int n=<default>);
 skeleton operator init();
 revolution operator init();
+revolution sphere(triple c=<default>, real r, int n=<default>);
+path line(path p, path q, real[] t);
+surface surface(revolution r, int n=<default>, pen color(int i, real j)=<default>);
 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>);
 real[] tangent(path p, path q, bool side);
-surface surface(revolution r, int n=<default>, pen color(int i, real j)=<default>);
-linefit leastsquares(real[] x, real[] y);
-pair Gaussrandpair();
-void histogram(picture pic=<default>, real[] bins, real[] count, real low=<default>, pen fillpen=<default>, pen drawpen=<default>, bool bars=<default>, Label legend=<default>, real markersize=<default>);
-void histogram(picture pic=<default>, real[] data, real a, real b, int n, bool normalize=<default>, real low=<default>, pen fillpen=<default>, pen drawpen=<default>, bool bars=<default>, Label legend=<default>, real markersize=<default>);
+pen defaultbackpen;
+path[] cylinder(path3 base, real h, triple axis=<default>, projection P);
+revolution cylinder(triple c=<default>, real r, real h, triple axis=<default>);
+revolution cone(triple c=<default>, real r, real h, triple axis=<default>, int n=<default>);
+real rms(real[] A);
 int[] frequency(real[] data, real[] bins);
 int[] frequency(real[] data, real a, real b, int n);
 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 kurtosis(real[] A);
-real variancebiased(real[] A);
+void histogram(picture pic=<default>, real[] bins, real[] count, real low=<default>, pen fillpen=<default>, pen drawpen=<default>, bool bars=<default>, Label legend=<default>, real markersize=<default>);
+void histogram(picture pic=<default>, real[] data, real a, real b, int n, bool normalize=<default>, real low=<default>, pen fillpen=<default>, pen drawpen=<default>, bool bars=<default>, Label legend=<default>, real markersize=<default>);
+real mean(real[] A);
+int bins(real[] data, int max=<default>);
+path topbox(pair a, pair b);
+path halfbox(pair a, pair b);
+real stdev(real[] A);
 real variance(real[] A);
 real legendmarkersize;
-real rms(real[] A);
-real stdev(real[] A);
+real variancebiased(real[] A);
+real Gaussian(real x, real sigma);
+real Gaussian(real x);
+pair Gaussrandpair();
 real Gaussrand();
-real kurtosisexcess(real[] A);
 linefit operator init();
-int bins(real[] data, int max=<default>);
 real skewness(real[] A);
-path topbox(pair a, pair b);
-path halfbox(pair a, pair b);
-real Gaussian(real x, real sigma);
-real Gaussian(real x);
-real mean(real[] A);
+linefit leastsquares(real[] x, real[] y);
+real kurtosis(real[] A);
+real kurtosisexcess(real[] A);
 Relation r4a;
+pair[] endpoints(guide[] a);
+Relation r3;
 picture tableau(frame[] cards, bool number=<default>);
-Braid apply(Relation r, Braid b, int step, int place);
-Component wye;
+pair min(pair[] z);
+Component bp;
 Component phi;
+real gapfactor;
 Component bm;
-real gapfactor;
-Component bp;
-pair[] endpoints(guide[] a);
-Relation r4b;
+Braid apply(Relation r, Braid b, int step, int place);
+Relation operator -(Relation r);
 Component operator init();
 Braid operator init();
 Relation operator init();
 Syzygy operator init();
-pair min(pair[] z);
+Relation r4b;
+Component wye;
+pair max(pair[] z);
 real hwratio;
-Relation operator -(Relation r);
-pair max(pair[] z);
-Relation r3;
-pen Gray;
-pen Tan;
-pen Brown;
-pen Sepia;
-pen OliveGreen;
-pen SeaGreen;
-pen JungleGreen;
-pen BlueGreen;
-pen NavyBlue;
+pen Orchid;
+pen WildStrawberry;
+pen Magenta;
+pen BrickRed;
 pen CadetBlue;
-pen BlueViolet;
-pen RoyalPurple;
-pen Plum;
-pen DarkOrchid;
-pen Fuchsia;
-pen Rhodamine;
 pen CarnationPink;
+pen SpringGreen;
+pen MidnightBlue;
+pen OliveGreen;
+pen Apricot;
 pen Salmon;
-pen WildStrawberry;
-pen RubineRed;
-pen OrangeRed;
-pen BrickRed;
+pen Cyan;
+pen Red;
+pen RawSienna;
 pen Mahogany;
+pen Gray;
+pen Plum;
+pen BlueGreen;
+pen Cerulean;
+pen Blue;
+pen BlueViolet;
+pen RedOrange;
+pen Goldenrod;
+pen ForestGreen;
 pen BurntOrange;
-pen Melon;
-pen Dandelion;
-pen Goldenrod;
-pen GreenYellow;
+pen Tan;
 pen Aquamarine;
-pen Orchid;
+pen Lavender;
+pen Brown;
+pen RubineRed;
+pen TealBlue;
+pen White;
+pen Purple;
+pen Bittersweet;
+pen Orange;
+pen OrangeRed;
+pen Fuchsia;
 pen Peach;
-pen Cerulean;
-pen White;
-pen Yellow;
-pen Thistle;
-pen Violet;
 pen PineGreen;
-pen RedViolet;
-pen Red;
-pen Magenta;
-pen Turquoise;
-pen MidnightBlue;
+pen Dandelion;
+pen Black;
+pen NavyBlue;
+pen Rhodamine;
+pen YellowOrange;
 pen Maroon;
 pen ProcessBlue;
-pen Black;
-pen Bittersweet;
-pen YellowOrange;
+pen YellowGreen;
+pen LimeGreen;
+pen Green;
+pen GreenYellow;
+pen Sepia;
+pen Emerald;
+pen Mulberry;
+pen RedViolet;
 pen SkyBlue;
+pen SeaGreen;
 pen VioletRed;
-pen ForestGreen;
-pen RawSienna;
+pen Violet;
 pen Periwinkle;
-pen SpringGreen;
-pen LimeGreen;
-pen YellowGreen;
-pen Mulberry;
-pen Cyan;
-pen Blue;
-pen Orange;
+pen Thistle;
+pen Yellow;
+pen JungleGreen;
+pen DarkOrchid;
 pen CornflowerBlue;
-pen Emerald;
-pen TealBlue;
-pen RedOrange;
 pen RoyalBlue;
-pen Apricot;
-pen Purple;
-pen Lavender;
-pen Green;
+pen Melon;
+pen RoyalPurple;
+pen Turquoise;
 int lookup(tree t, int key);
-bool contains(tree t, int key);
+tree newtree();
+void write(file out=<default>, tree t);
 tree operator init();
-void write(file out=<default>, tree t);
 tree add(tree t, int key, int value);
-tree newtree();
+bool contains(tree t, int key);
+real trembleFuzz();
+real trembleAngle;
+real trembleRandom;
 real trembleFrequency;
-real trembleFuzz();
+tremble operator init();
 real magneticRadius;
-tremble operator init();
-real trembleRandom;
-real trembleAngle;
-real degrees(rmf a, rmf b);
+real[] sample(path3 g, real r, real relstep=<default>);
+path3 roundedpath(path3 A, real r);
 int coloredNodes;
-path3 roundedpath(path3 A, real r);
+int coloredSegments;
+surface surface(rmf[] R, real[] t, coloredpath cp, transform T(real), bool cyclic);
+surface tube(path3 g, coloredpath section, transform T(real)=<default>, real corner=<default>, real relstep=<default>);
 coloredpath operator init();
 coloredpath operator cast(path p);
 coloredpath operator cast(guide p);
-surface tube(path3 g, coloredpath section, transform T(real)=<default>, real corner=<default>, 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>);
+real degrees(rmf a, rmf b);
 string VERSION;
-pen Tomato;
-pen Tan;
-pen Snow;
-pen Sienna;
-pen SeaGreen;
-pen SandyBrown;
-pen RosyBrown;
-pen PowderBlue;
-pen Plum;
+pen Orchid;
+pen Indigo;
+pen Beige;
+pen Seashell;
+pen SlateBlue;
+pen SlateGray;
+pen Magenta;
+pen GhostWhite;
+pen CadetBlue;
+pen DeepPink;
+pen SpringGreen;
+pen MidnightBlue;
+pen Olive;
+pen OliveDrab;
+pen Salmon;
+pen LavenderBlush;
+pen Chocolate;
+pen Wheat;
+pen Cyan;
+pen Gainsboro;
+pen Ivory;
+pen PeachPuff;
+pen PapayaWhip;
+pen Red;
 pen Pink;
-pen PeachPuff;
-pen PaleVioletRed;
-pen PaleTurquoise;
-pen OrangeRed;
-pen OldLace;
-pen Navy;
-pen NavajoWhite;
-pen Salmon;
-pen Moccasin;
-pen MistyRose;
 pen MintCream;
+pen DarkTurquoise;
 pen Lime;
-pen LightYellow;
-pen LightSkyBlue;
-pen LightSeaGreen;
-pen LightPink;
-pen LightGrey;
-pen LightCyan;
-pen Khaki;
-pen HotPink;
-pen Honeydew;
-pen GreenYellow;
-pen SaddleBrown;
+pen SteelBlue;
 pen Gray;
-pen IndianRed;
+pen MediumBlue;
+pen MediumOrchid;
+pen MediumPurple;
+pen MediumSeaGreen;
+pen MediumSlateBlue;
+pen MediumAquamarine;
+pen MediumSpringGreen;
+pen MediumTurquoise;
+pen MediumVioletRed;
+pen Plum;
+pen Blue;
+pen Gold;
+pen BlueViolet;
 pen Goldenrod;
-pen Fuchsia;
-pen DimGray;
-pen DeepSkyBlue;
-pen DeepPink;
-pen DarkTurquoise;
-pen DarkSlateGray;
-pen DarkSalmon;
-pen DarkOrchid;
-pen LawnGreen;
-pen DarkOrange;
-pen DarkOliveGreen;
+pen ForestGreen;
+pen Chartreuse;
+pen NavajoWhite;
+pen LemonChiffon;
+pen Tan;
 pen DarkMagenta;
-pen DarkGreen;
-pen DarkGoldenrod;
-pen DarkBlue;
+pen AntiqueWhite;
+pen PaleTurquoise;
+pen Aquamarine;
+pen IndianRed;
+pen Aqua;
 pen Crimson;
-pen Coral;
-pen PapayaWhip;
-pen CadetBlue;
+pen Azure;
+pen Lavender;
+pen LawnGreen;
+pen Brown;
 pen BurlyWood;
-pen Brown;
-pen BlueViolet;
-pen Beige;
-pen Azure;
-pen Aquamarine;
-pen OliveDrab;
-pen DarkKhaki;
+pen Moccasin;
+pen DarkBlue;
 pen Peru;
-pen LightGoldenrodYellow;
-pen DarkSeaGreen;
-pen SkyBlue;
 pen White;
-pen Yellow;
-pen Thistle;
+pen Purple;
 pen WhiteSmoke;
+pen DimGray;
+pen Orange;
+pen OrangeRed;
+pen Fuchsia;
+pen Bisque;
+pen Honeydew;
+pen RosyBrown;
+pen Black;
+pen Sienna;
+pen Khaki;
+pen FireBrick;
+pen Snow;
+pen Maroon;
+pen YellowGreen;
+pen LimeGreen;
+pen OldLace;
+pen Green;
+pen DarkOliveGreen;
+pen DarkOrange;
+pen GreenYellow;
+pen DarkCyan;
+pen FloralWhite;
+pen DarkRed;
+pen Silver;
+pen BlanchedAlmond;
+pen PowderBlue;
+pen DarkGray;
+pen DarkGreen;
+pen DarkGoldenrod;
+pen SkyBlue;
+pen SeaGreen;
+pen DarkViolet;
+pen Teal;
 pen Violet;
+pen AliceBlue;
+pen SandyBrown;
+pen HotPink;
+pen DodgerBlue;
+pen SaddleBrown;
+pen Tomato;
+pen DarkKhaki;
+pen DeepSkyBlue;
+pen Thistle;
+pen LightBlue;
 pen LightCoral;
-pen Red;
-pen Magenta;
-pen LightSalmon;
-pen DarkViolet;
-pen Turquoise;
-pen MidnightBlue;
-pen LavenderBlush;
-pen Maroon;
-pen Seashell;
-pen Ivory;
-pen Bisque;
+pen Yellow;
+pen LightCyan;
 pen PaleGreen;
+pen Linen;
+pen LightGoldenrodYellow;
+pen LightGreen;
+pen LightGrey;
 pen PaleGoldenrod;
-pen Black;
-pen SlateBlue;
-pen LightBlue;
-pen ForestGreen;
-pen LightGreen;
-pen LemonChiffon;
-pen AliceBlue;
-pen Orchid;
-pen Silver;
-pen MediumVioletRed;
-pen MediumBlue;
-pen SpringGreen;
-pen FloralWhite;
-pen Linen;
-pen Olive;
-pen AntiqueWhite;
+pen LightPink;
+pen LightSalmon;
+pen LightSeaGreen;
+pen Navy;
+pen LightSkyBlue;
+pen PaleVioletRed;
+pen DarkOrchid;
 pen LightSlateGray;
-pen GhostWhite;
-pen LimeGreen;
-pen FireBrick;
-pen BlanchedAlmond;
-pen YellowGreen;
-pen Gold;
-pen MediumSpringGreen;
+pen LightSteelBlue;
+pen CornflowerBlue;
+pen LightYellow;
 pen rgbint(int r, int g, int b);
-pen Cyan;
-pen Blue;
-pen Teal;
-pen Chartreuse;
+pen Cornsilk;
+pen Coral;
+pen MistyRose;
+pen DarkSalmon;
+pen DarkSeaGreen;
+pen RoyalBlue;
 pen DarkSlateBlue;
-pen SlateGray;
-pen Orange;
-pen DarkGray;
-pen CornflowerBlue;
-pen MediumOrchid;
-pen Wheat;
-pen Chocolate;
-pen Aqua;
-pen MediumPurple;
-pen DodgerBlue;
-pen DarkRed;
-pen DarkCyan;
-pen MediumSlateBlue;
-pen MediumSeaGreen;
-pen RoyalBlue;
-pen MediumAquamarine;
-pen Cornsilk;
-pen Indigo;
-pen Purple;
-pen Lavender;
-pen SteelBlue;
-pen MediumTurquoise;
-pen LightSteelBlue;
-pen Green;
-pen Gainsboro;
+pen DarkSlateGray;
+pen Turquoise;

Modified: trunk/Build/source/utils/asymptote/asymptote.spec
===================================================================
--- trunk/Build/source/utils/asymptote/asymptote.spec	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/asymptote.spec	2019-10-06 17:17:34 UTC (rev 52300)
@@ -3,7 +3,7 @@
 %global __python %{__python3}
 
 Name:           asymptote
-Version:        2.52
+Version:        2.56
 Release:        1%{?dist}
 Summary:        Descriptive vector graphics language
 

Modified: trunk/Build/source/utils/asymptote/base/plain_prethree.asy
===================================================================
--- trunk/Build/source/utils/asymptote/base/plain_prethree.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/base/plain_prethree.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,6 +1,6 @@
 // Critical definitions for transform3 needed by projection and picture.
 
-pair viewportmargin=(0.1,0.1);  // Horizontal and vertical 3D viewport margins.
+pair viewportmargin=settings.viewportmargin;
 
 typedef real[][] transform3;
 restricted transform3 identity4=identity(4);

Modified: trunk/Build/source/utils/asymptote/base/shaders/fragment.glsl
===================================================================
--- trunk/Build/source/utils/asymptote/base/shaders/fragment.glsl	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/base/shaders/fragment.glsl	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,237 +1,227 @@
-struct Material
-{
-  vec4 diffuse,emissive,specular;
-  vec4 parameters;
-};
-
-struct Light
-{
-  vec4 direction;
-  vec4 diffuse,specular;  
-};
-
-uniform int nlights;
-uniform Light lights[Nlights];
-
-uniform MaterialBuffer {
-  Material Materials[Nmaterials];
-};
-
-
-#ifdef NORMAL
-in vec3 Normal;
-vec3 normal;
-#endif
-
-#ifdef EXPLICIT_COLOR
-in vec4 Color; 
-#endif
-
-flat in int materialIndex;
-out vec4 outColor;
-
-// PBR material parameters
-vec3 PBRBaseColor; // Diffuse for nonmetals, reflectance for metals.
-vec3 PBRSpecular; // Specular tint for nonmetals
-float PBRMetallic; // Metallic/Nonmetals switch flag
-float PBRF0; // Fresnel at zero for nonmetals
-float PBRRoughness; // Roughness.
-float PBRRoughnessSq; // used value of roughness, for a little bit more "smoothing"
-
-uniform sampler2D environmentMap;
-const float PI = acos(-1.0);
-#ifdef ENABLE_TEXTURE
-const float twopi=2*PI;
-const float halfpi=PI/2;
-
-const int numSamples=7;
-
-// (x,y,z) -> (r, theta, phi);
-// theta -> [0,\pi], "height" angle
-// phi -> [0, 2\pi], rotation agnle
-vec3 cart2spher(vec3 cart) {
-  float x = cart.z;
-  float y = cart.x;
-  float z = cart.y;
-
-  float r = length(cart);
-  float phi = atan(y,x);
-  float theta = acos(z/r);
-
-  return vec3(r,phi,theta);
-}
-
-vec2 normalizedAngle(vec3 cartVec) {
-  vec3 sphericalVec = cart2spher(cartVec);
-  sphericalVec.y = sphericalVec.y / (2 * PI) - 0.25;
-  sphericalVec.z = sphericalVec.z / PI;
-  // sphericalVec.z = - sphericalVec.z;
-  return sphericalVec.yz;
-}
-#endif
-
-#ifdef NORMAL
-// h is the halfway vector between normal and light direction
-// GGX Trowbridge-Reitz Approximation
-float NDF_TRG(vec3 h, float roughness) {
-  float ndoth = max(dot(normal, h), 0);
-  float alpha2 = PBRRoughnessSq * PBRRoughnessSq;
-
-  float denom = pow(ndoth * ndoth * (alpha2-1) + 1, 2);
-  return alpha2/denom;
-}
-
-float GGX_Geom(vec3 v) {
-  float ndotv = max(dot(v,normal), 0);
-  float ap = pow((1+PBRRoughness),2);
-  float k = ap/8;
-
-  return ndotv/((ndotv * (1-k)) + k);
-}
-
-float Geom(vec3 v, vec3 l) {
-  return GGX_Geom(v) * GGX_Geom(l);
-}
-
-// Schlick's approximation
-float Fresnel(vec3 h, vec3 v, float F0) {
-  float hdotv = max(dot(h,v), 0.0);
-  
-  return F0 + (1-F0)*pow((1-hdotv),5);
-}
-
-vec3 BRDF(vec3 viewDirection, vec3 lightDirection) {
-  // Lambertian diffuse 
-  vec3 lambertian = PBRBaseColor;
-  // Cook-Torrance model
-  vec3 h = normalize(lightDirection + viewDirection);
-
-  float omegain = max(dot(viewDirection, normal),0);
-  float omegaln = max(dot(lightDirection, normal),0);
-
-  float D = NDF_TRG(h, PBRRoughness);
-  float G = Geom(viewDirection, lightDirection);
-  float F = Fresnel(h, viewDirection, PBRF0);
-
-  float denom=4*omegain*omegaln;
-  float rawReflectance=denom > 0 ? (D*G)/denom : 0;
-
-  vec3 dielectric = mix(lambertian, rawReflectance * PBRSpecular, F);
-  vec3 metal = rawReflectance * PBRBaseColor;
-  
-  return mix(dielectric, metal, PBRMetallic);
-}
-#endif
-
-void main()
-{
-vec4 Diffuse;
-vec4 Emissive;
-vec4 Specular;
-vec4 parameters;
-
-#ifdef EXPLICIT_COLOR
-  if(materialIndex < 0) {
-    int index=-materialIndex-1;
-    Material m=Materials[index];
-    Diffuse=Color;
-    Emissive=vec4(0);
-    Specular=m.specular;
-    parameters=m.parameters;
-  } else {
-    Material m=Materials[materialIndex];
-    Diffuse=m.diffuse;
-    Emissive=m.emissive;
-    Specular=m.specular;
-    parameters=m.parameters;
-  }
-#else
-  Material m=Materials[materialIndex];
-  Diffuse=m.diffuse; 
-  Emissive=m.emissive;
-  Specular=m.specular;
-  parameters=m.parameters;
-#endif
-
-  PBRRoughness=1-parameters[0];
-  PBRMetallic=parameters[1];
-  PBRF0=parameters[2];
-
-  PBRBaseColor = Diffuse.rgb;
-  PBRRoughnessSq = PBRRoughness * PBRRoughness;
-  PBRSpecular = Specular.rgb;
-
-    // Formally, the formula given a point x and direction \omega,
-    // L_i = \int_{\Omega} f(x, \omega_i, \omega) L(x,\omega_i) (\hat{n}\cdot \omega_i) d \omega_i
-    // where \Omega is the hemisphere covering a point, f is the BRDF function
-    // L is the radiance from a given angle and position.
-
-  vec3 color=Emissive.rgb;
-#ifdef NORMAL  
-  vec3 Z=vec3(0,0,1);
-  vec3 pointLightRadiance=vec3(0,0,0);
-
-  normal=normalize(Normal);
-  normal=gl_FrontFacing ? normal : -normal;
-  // as a finite point light, we have some simplification to the rendering equation.
-    if(nlights > 0) {
-      for(int i=0; i < nlights; ++i) {
-        vec3 L = normalize(lights[i].direction.xyz);
-        // what if we use the acutal view from (0,0,0) instead?
-        // vec3 viewDirection = Z;
-        vec3 viewDirection = -normalize(Z);
-        float cosTheta = max(dot(normal, L), 0); // $\omega_i \cdot n$ term
-        float attn = 1; // if we have a good light position.
-        vec3 radiance = cosTheta * attn * lights[i].diffuse.rgb;
-        pointLightRadiance += BRDF(Z, L) * radiance;
-      }
-      color += pointLightRadiance.rgb;
-
-#ifdef ENABLE_TEXTURE
-#ifndef EXPLICIT_COLOR
-      // Experimental environment radiance using Riemann sums;
-      // can also do importance sampling.
-      vec3 envRadiance=vec3(0,0,0);
-
-      vec3 normalPerp = vec3(-normal.y, normal.x, 0);
-      if (length(normalPerp) == 0) { // x, y = 0.
-
-        normalPerp = vec3(1, 0, 0);
-      }
-      // we now have a normal basis;
-      normalPerp = normalize(normalPerp);
-      vec3 normalPerp2 = normalize(cross(normal, normalPerp));
-
-      const float step=1.0/numSamples;
-      const float phistep=twopi*step;
-      const float thetastep=halfpi*step;
-      for (int iphi=0; iphi < numSamples; ++iphi) {
-        float phi=iphi*phistep;
-        for (int itheta=0; itheta < numSamples; ++itheta) {
-          float theta=itheta*thetastep;
-
-          vec3 azimuth=cos(phi)*normalPerp+sin(phi)*normalPerp2;
-          vec3 L=sin(theta)*azimuth+cos(theta)*normal;
-
-          vec3 rawRadiance=texture(environmentMap,normalizedAngle(L)).rgb;
-          vec3 surfRefl=BRDF(Z,L);
-          envRadiance += surfRefl*rawRadiance*sin(2.0*theta);
-        }
-      }
-      envRadiance *= halfpi*step*step;
-  
-      // vec3 lightVector = normalize(reflect(-Z, normal));
-      // vec2 anglemap = normalizedAngle(lightVector);
-      // vec3 color = texture(environmentMap, anglemap).rgb;
-      color += envRadiance.rgb;
-#endif
-#endif
-      outColor=vec4(color,Diffuse.a);
-    } else {
-      outColor=Diffuse;
-    }
-#else    
-    outColor=Emissive;
-#endif      
-}
-
+struct Material
+{
+  vec4 diffuse,emissive,specular;
+  vec4 parameters;
+};
+
+struct Light
+{
+  vec3 direction;
+  vec3 color;
+};
+
+uniform int nlights;
+uniform Light lights[Nlights];
+
+uniform MaterialBuffer {
+  Material Materials[Nmaterials];
+};
+
+#ifdef NORMAL
+#ifndef ORTHOGRAPHIC
+in vec3 ViewPosition;
+#endif
+in vec3 Normal;
+vec3 normal;
+#endif
+
+#ifdef COLOR
+in vec4 Color; 
+#endif
+
+flat in int materialIndex;
+out vec4 outColor;
+
+// PBR material parameters
+vec3 Diffuse; // Diffuse for nonmetals, reflectance for metals.
+vec3 Specular; // Specular tint for nonmetals
+float Metallic; // Metallic/Nonmetals parameter
+float Fresnel0; // Fresnel at zero for nonmetals
+float Roughness2; // roughness squared, for smoothing
+
+#ifdef ENABLE_TEXTURE
+uniform sampler2D environmentMap;
+const float PI=acos(-1.0);
+const float twopi=2*PI;
+const float halfpi=PI/2;
+
+const int numSamples=7;
+
+// (x,y,z) -> (r,theta,phi);
+// theta -> [0,\pi]: colatitude
+// phi -> [0, 2\pi]: longitude
+vec3 cart2sphere(vec3 cart)
+{
+  float x=cart.z;
+  float y=cart.x;
+  float z=cart.y;
+
+  float r=length(cart);
+  float phi=atan(y,x);
+  float theta=acos(z/r);
+
+  return vec3(r,phi,theta);
+}
+
+vec2 normalizedAngle(vec3 cartVec)
+{
+  vec3 sphericalVec=cart2sphere(cartVec);
+  sphericalVec.y=sphericalVec.y/(2*PI)-0.25;
+  sphericalVec.z=sphericalVec.z/PI;
+  return sphericalVec.yz;
+}
+#endif
+
+#ifdef NORMAL
+// h is the halfway vector between normal and light direction
+// GGX Trowbridge-Reitz Approximation
+float NDF_TRG(vec3 h)
+{
+  float ndoth=max(dot(normal,h),0.0);
+  float alpha2=Roughness2*Roughness2;
+  float denom=ndoth*ndoth*(alpha2-1.0)+1.0;
+  return denom != 0.0 ? alpha2/(denom*denom) : 0.0;
+}
+
+float GGX_Geom(vec3 v)
+{
+  float ndotv=max(dot(v,normal),0.0);
+  float ap=1.0+Roughness2;
+  float k=0.125*ap*ap;
+  return ndotv/((ndotv*(1.0-k))+k);
+}
+
+float Geom(vec3 v, vec3 l)
+{
+  return GGX_Geom(v)*GGX_Geom(l);
+}
+
+// Schlick's approximation
+float Fresnel(vec3 h, vec3 v, float fresnel0)
+{
+  float a=1.0-max(dot(h,v),0.0);
+  float b=a*a;
+  return fresnel0+(1.0-fresnel0)*b*b*a;
+}
+
+vec3 BRDF(vec3 viewDirection, vec3 lightDirection)
+{
+  vec3 lambertian=Diffuse;
+  // Cook-Torrance model
+  vec3 h=normalize(lightDirection+viewDirection);
+
+  float omegain=max(dot(viewDirection,normal),0.0);
+  float omegaln=max(dot(lightDirection,normal),0.0);
+
+  float D=NDF_TRG(h);
+  float G=Geom(viewDirection,lightDirection);
+  float F=Fresnel(h,viewDirection,Fresnel0);
+
+  float denom=4.0*omegain*omegaln;
+  float rawReflectance=denom > 0.0 ? (D*G)/denom : 0.0;
+
+  vec3 dielectric=mix(lambertian,rawReflectance*Specular,F);
+  vec3 metal=rawReflectance*Diffuse;
+  
+  return mix(dielectric,metal,Metallic);
+}
+#endif
+
+void main()
+{
+  vec4 diffuse;
+  vec4 emissive;
+  vec4 parameters;
+
+  Material m;
+#ifdef TRANSPARENT
+  m=Materials[abs(materialIndex)-1];
+  if(materialIndex >= 0) {
+    diffuse=m.diffuse;
+    emissive=m.emissive;
+  } else {
+    diffuse=Color;
+    emissive=vec4(0.0);
+  }
+#else
+  m=Materials[int(materialIndex)];
+#ifdef COLOR
+  diffuse=Color;
+  emissive=vec4(0.0);
+#else  
+  diffuse=m.diffuse; 
+  emissive=m.emissive;
+#endif
+#endif
+  Specular=m.specular.rgb;
+  parameters=m.parameters;
+  Roughness2=1.0-parameters[0];
+  Roughness2=Roughness2*Roughness2;
+  Metallic=parameters[1];
+  Fresnel0=parameters[2];
+  Diffuse=diffuse.rgb;
+
+  // Given a point x and direction \omega,
+  // L_i=\int_{\Omega}f(x,\omega_i,\omega) L(x,\omega_i)(\hat{n}\cdot \omega_i)
+  // d\omega_i, where \Omega is the hemisphere covering a point,
+  // f is the BRDF function, L is the radiance from a given angle and position.
+
+  vec3 color=emissive.rgb;
+#ifdef NORMAL  
+  normal=normalize(Normal);
+  normal=gl_FrontFacing ? normal : -normal;
+#ifdef ORTHOGRAPHIC
+  vec3 viewDir=vec3(0.0,0.0,1.0);
+#else
+  vec3 viewDir=-normalize(ViewPosition);
+#endif
+  // For a finite point light, the rendering equation simplifies.
+  if(nlights > 0) {
+    for(int i=0; i < nlights; ++i) {
+      Light Li=lights[i];
+      vec3 L=Li.direction;
+      float cosTheta=max(dot(normal,L),0.0); // $\omega_i \cdot n$ term
+      vec3 radiance=cosTheta*Li.color;
+      color += BRDF(viewDir,L)*radiance;
+    }
+
+#ifdef ENABLE_TEXTURE
+#ifndef COLOR
+    // Experimental environment radiance using Riemann sums;
+    // can also do importance sampling.
+    vec3 envRadiance=vec3(0.0,0.0,0.0);
+
+    vec3 normalPerp=vec3(-normal.y,normal.x,0.0);
+    if(length(normalPerp) == 0.0)
+      normalPerp=vec3(1.0,0.0,0.0);
+
+    // we now have a normal basis;
+    normalPerp=normalize(normalPerp);
+    vec3 normalPerp2=normalize(cross(normal,normalPerp));
+
+    const float step=1.0/numSamples;
+    const float phistep=twopi*step;
+    const float thetastep=halfpi*step;
+    for (int iphi=0; iphi < numSamples; ++iphi) {
+      float phi=iphi*phistep;
+      for (int itheta=0; itheta < numSamples; ++itheta) {
+        float theta=itheta*thetastep;
+
+        vec3 azimuth=cos(phi)*normalPerp+sin(phi)*normalPerp2;
+        vec3 L=sin(theta)*azimuth+cos(theta)*normal;
+
+        vec3 rawRadiance=texture(environmentMap,normalizedAngle(L)).rgb;
+        vec3 surfRefl=BRDF(Z,L);
+        envRadiance += surfRefl*rawRadiance*sin(2.0*theta);
+      }
+    }
+    envRadiance *= halfpi*step*step;
+    color += envRadiance.rgb;
+#endif
+#endif
+    outColor=vec4(color,diffuse.a);
+  } else outColor=diffuse;
+#else    
+  outColor=emissive;
+#endif      
+}

Modified: trunk/Build/source/utils/asymptote/base/shaders/vertex.glsl
===================================================================
--- trunk/Build/source/utils/asymptote/base/shaders/vertex.glsl	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/base/shaders/vertex.glsl	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,49 +1,49 @@
-in vec3 position;
-
-#ifdef NORMAL
-in vec3 normal;
-#endif
-
-#ifdef EXPLICIT_COLOR
-in uint color;
-#endif
-
-#ifdef WIDTH
-in float width;
-#endif
-
-in int material;
-
-uniform mat4 projViewMat;
-uniform mat4 viewMat;
-uniform mat4 normMat;
-
-out vec3 ViewPosition;
-#ifdef NORMAL
-out vec3 Normal;
-#endif
-    
-#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;
-#ifdef NORMAL
-  Normal=(normMat*vec4(normal,0)).xyz;
-#endif
-
-#ifdef EXPLICIT_COLOR
-  Color=unpackUnorm4x8(color);
-#endif
-
-#ifdef WIDTH
-  gl_PointSize=width;
-#endif
-
-  materialIndex=material;
-}
+in vec3 position;
+
+uniform mat3 normMat;
+
+#ifdef NORMAL
+#ifndef ORTHOGRAPHIC
+out vec3 ViewPosition;
+#endif
+in vec3 normal;
+out vec3 Normal;
+#endif
+
+in int material;
+
+#ifdef COLOR
+in vec4 color;
+out vec4 Color;
+#endif
+
+#ifdef WIDTH
+in float width;
+#endif
+
+uniform mat4 projViewMat;
+uniform mat4 viewMat;
+
+flat out int materialIndex;
+
+void main()
+{
+  vec4 v=vec4(position,1.0);
+  gl_Position=projViewMat*v;
+#ifdef NORMAL
+#ifndef ORTHOGRAPHIC
+  ViewPosition=(viewMat*v).xyz;
+#endif
+  Normal=normal*normMat;
+#endif
+
+#ifdef COLOR
+  Color=color;
+#endif
+
+#ifdef WIDTH
+  gl_PointSize=width;
+#endif
+
+  materialIndex=material;
+}

Modified: trunk/Build/source/utils/asymptote/base/solids.asy
===================================================================
--- trunk/Build/source/utils/asymptote/base/solids.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/base/solids.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -322,6 +322,12 @@
   }
 }
 
+revolution operator * (transform3 t, revolution r)
+{
+  triple trc=t*r.c;
+  return revolution(trc,t*r.g,t*(r.c+r.axis)-trc,r.angle1,r.angle2);
+}
+
 surface surface(revolution r, int n=nslice, pen color(int i, real j)=null)
 {
   return r.surface(n,color);
@@ -340,15 +346,15 @@
   if(is3D()) {
     pen thin=thin();
     void drawskeleton(frame f, transform3 t, projection P) {
-      skeleton s=r.skeleton(m,n,inverse(t)*P);
+      skeleton s=(t*r).skeleton(m,n,P);
       if(frontpen != nullpen) {
-        draw(f,t*s.transverse.back,thin+defaultbackpen+backpen,light);
-        draw(f,t*s.transverse.front,thin+frontpen,light);
+        draw(f,s.transverse.back,thin+defaultbackpen+backpen,light);
+        draw(f,s.transverse.front,thin+frontpen,light);
       }
       if(longitudinalpen != nullpen) {
-        draw(f,t*s.longitudinal.back,thin+defaultbackpen+longitudinalbackpen,
+        draw(f,s.longitudinal.back,thin+defaultbackpen+longitudinalbackpen,
              light);
-        draw(f,t*s.longitudinal.front,thin+longitudinalpen,light);
+        draw(f,s.longitudinal.front,thin+longitudinalpen,light);
       }
     }
 
@@ -379,12 +385,6 @@
   }
 }
 
-revolution operator * (transform3 t, revolution r)
-{
-  triple trc=t*r.c;
-  return revolution(trc,t*r.g,t*(r.c+r.axis)-trc,r.angle1,r.angle2);
-}
-
 // Return a right circular cylinder of height h in the direction of axis
 // based on a circle centered at c with radius r.
 revolution cylinder(triple c=O, real r, real h, triple axis=Z)

Modified: trunk/Build/source/utils/asymptote/base/three.asy
===================================================================
--- trunk/Build/source/utils/asymptote/base/three.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/base/three.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -2813,6 +2813,9 @@
     P=modelview*P;
     Q=P.copy();
 
+    if(Q.t[2][3] == -1) // PRC can't handle oblique projections
+      Q=orthographic(P.camera,P.up,P.target,P.zoom,P.viewportshift,
+                     P.showtarget,P.center);     
     if(P.infinity) {
       triple m=min3(S.f);
       triple M=max3(S.f);
@@ -2884,10 +2887,13 @@
       m -= margin;
     } else if(M.z >= 0) abort("camera too close");
 
+    if(settings.outformat == "html")
+      format="html";
+
     shipout3(prefix,f,preview ? nativeformat() : format,
              S.width-defaultrender.margin,S.height-defaultrender.margin,
              P.infinity ? 0 : 2aTan(Tan(0.5*P.angle)*P.zoom),
-             P.zoom,m,M,P.viewportshift,
+             P.zoom,m,M,P.viewportshift,S.viewportmargin,
              tinv*inv*shift(0,0,zcenter),Light.background(),Light.position,
              Light.diffuse,Light.specular,
              view && !preview);

Modified: trunk/Build/source/utils/asymptote/base/three_surface.asy
===================================================================
--- trunk/Build/source/utils/asymptote/base/three_surface.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/base/three_surface.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1273,10 +1273,14 @@
   return patch(subpatch(s.P,a,b),s.straight,s.planar);
 }
 
+private string triangular=
+  "Intersection of path3 with Bezier triangle is not yet implemented";
+
 // return an array containing the times for one intersection of path p and
 // patch s.
 real[] intersect(path3 p, patch s, real fuzz=-1)
 {
+  if(s.triangular) abort(triangular);
   return intersect(p,s.P,fuzz);
 }
 
@@ -1285,7 +1289,7 @@
 real[] intersect(path3 p, surface s, real fuzz=-1)
 {
   for(int i=0; i < s.s.length; ++i) {
-    real[] T=intersect(p,s.s[i].P,fuzz);
+    real[] T=intersect(p,s.s[i],fuzz);
     if(T.length > 0) return T;
   }
   return new real[];
@@ -1294,6 +1298,7 @@
 // return an array containing all intersection times of path p and patch s.
 real[][] intersections(path3 p, patch s, real fuzz=-1)
 {
+  if(s.triangular) abort(triangular);
   return sort(intersections(p,s.P,fuzz));
 }
 
@@ -1303,7 +1308,7 @@
   real[][] T;
   if(length(p) < 0) return T;
   for(int i=0; i < s.s.length; ++i)
-    for(real[] s: intersections(p,s.s[i].P,fuzz))
+    for(real[] s: intersections(p,s.s[i],fuzz))
       T.push(s);
 
   static real Fuzz=1000*realEpsilon;
@@ -1397,15 +1402,20 @@
             light light=currentlight, interaction interaction=Embedded,
             bool prc=true)
 {
-  if(s.colors.length > 0)
+  bool straight=s.straight && s.planar;
+  bool prc=prc();
+  if(s.colors.length > 0) {
+    if(prc && light.on())
+        straight=false; // PRC vertex colors (for quads only) ignore lighting
     m=mean(s.colors);
+  }
   m=material(m,light);
+  
   real PRCshininess;
-  if(prc())
-    PRCshininess=PRCshininess(m.shininess);
-  
+  if(prc) PRCshininess=PRCshininess(m.shininess);
+
   (s.triangular ? drawbeziertriangle : draw)
-    (f,s.P,center,s.straight && s.planar,m.p,m.opacity,m.shininess,
+    (f,s.P,center,straight,m.p,m.opacity,m.shininess,
     m.metallic,m.fresnel0,PRCshininess,s.colors,interaction.type,prc);
 }
 
@@ -1430,7 +1440,7 @@
           triple[] n={}, int[][] ni={}, material m=currentpen, pen[] p={},
           int[][] pi={}, light light=currentlight)
 {
-  bool normals=ni.length > 0;
+  bool normals=n.length > 0;
   if(!normals) {
     ni=new int[vi.length][3];
     normals=computeNormals(v,vi,n,ni) > 0;
@@ -1450,7 +1460,8 @@
           triple[] n={}, int[][] ni={}, material m=currentpen, pen[] p={},
           int[][] pi={}, light light=currentlight)
 {
-  bool normals=ni.length > 0;
+  bool prc=prc();
+  bool normals=n.length > 0;
   if(!normals) {
     ni=new int[vi.length][3];
     normals=computeNormals(v,vi,n,ni) > 0;
@@ -1496,7 +1507,7 @@
                 project(v[vii[2]],P)--cycle;
               pen p=color(n[ni[i][0]],m,light);
               fill(pic,g,p);
-              if(opacity(m.diffuse()) == 1) // Fill subdivision cracks
+              if(prc && opacity(m.diffuse()) == 1) // Fill subdivision cracks
                 draw(pic,g,p);
             }
           }
@@ -1838,6 +1849,7 @@
            interaction interaction=LabelInteraction(),
            projection P=currentprojection)
 {
+  bool prc=prc();
   Label L=L.copy();
   L.align(align);
   L.p(p);
@@ -1868,7 +1880,7 @@
         S=centering*S;
         draw3D(f3,S,position,L.p,light,interaction);
         // Fill subdivision cracks
-        if(render.labelfill && opacity(L.p) == 1 && !lighton)
+        if(prc && render.labelfill && opacity(L.p) == 1 && !lighton)
           _draw(f3,S.external(),position,L.p,interaction.type);
       }
       endgroup3(f3);
@@ -1888,7 +1900,7 @@
           position;
         draw3D(f,S,V,L.p,light,interaction);
         // Fill subdivision cracks
-        if(render.labelfill && opacity(L.p) == 1 && !lighton)
+        if(prc && render.labelfill && opacity(L.p) == 1 && !lighton)
           _draw(f,S.external(),V,L.p,interaction.type);
       }
       endgroup3(f);
@@ -1922,6 +1934,7 @@
   
   pic.add(new void(frame f, transform3 t, picture pic2, projection P) {
       // Handle relative projected 3D alignments.
+      bool prc=prc();
       Label L=L.copy();
       triple v=t*position;
       if(!align.is3D && L.align.relative && L.align.dir3 != O &&
@@ -1937,37 +1950,39 @@
       if(is3D()) {
         bool lighton=light.on();
         if(name == "") name=L.s;
-        if(prc() && interaction.type == Billboard.type) {
+        if(prc && interaction.type == Billboard.type) {
           surface s=surface(texpath(L,bbox=P.bboxonly));
-          transform3 centering=L.align.is3D ?
-            alignshift(s,L.T3,v,L.align.dir3) : identity4;
-          transform3 positioning=
-            shift(L.align.is3D ? v+L.align.dir3*labelmargin(L.p) : v);
-          frame f1,f2,f3;
-          begingroup3(f1,name,render);
-          if(L.defaulttransform3)
-            begingroup3(f3,render,v,interaction.type);
-          else {
-            begingroup3(f2,render,v,interaction.type);
-            begingroup3(f3,render,v);
+          if(s.s.length > 0) {
+            transform3 centering=L.align.is3D ?
+              alignshift(s,L.T3,v,L.align.dir3) : identity4;
+            transform3 positioning=
+              shift(L.align.is3D ? v+L.align.dir3*labelmargin(L.p) : v);
+            frame f1,f2,f3;
+            begingroup3(f1,name,render);
+            if(L.defaulttransform3)
+              begingroup3(f3,render,v,interaction.type);
+            else {
+              begingroup3(f2,render,v,interaction.type);
+              begingroup3(f3,render,v);
+            }
+            for(patch S : s.s) {
+              S=centering*S;
+              draw3D(f3,S,v,L.p,light,interaction);
+              // Fill subdivision cracks
+              if(prc && render.labelfill && opacity(L.p) == 1 && !lighton)
+                _draw(f3,S.external(),v,L.p,interaction.type);
+            }
+            endgroup3(f3);
+            if(L.defaulttransform3)
+              add(f1,T*f3);
+            else {
+              add(f2,inverse(T)*L.T3*f3);
+              endgroup3(f2);
+              add(f1,T*f2);
+            }
+            endgroup3(f1);
+            add(f,positioning*f1);
           }
-          for(patch S : s.s) {
-            S=centering*S;
-            draw3D(f3,S,v,L.p,light,interaction);
-            // Fill subdivision cracks
-            if(render.labelfill && opacity(L.p) == 1 && !lighton)
-              _draw(f3,S.external(),v,L.p,interaction.type);
-          }
-          endgroup3(f3);
-          if(L.defaulttransform3)
-            add(f1,T*f3);
-          else {
-            add(f2,inverse(T)*L.T3*f3);
-            endgroup3(f2);
-            add(f1,T*f2);
-          }
-          endgroup3(f1);
-          add(f,positioning*f1);
         } else {
           begingroup3(f,name,render);
           for(patch S : surface(L,v,bbox=P.bboxonly).s) {
@@ -1974,7 +1989,7 @@
             triple V=L.align.is3D ? v+L.align.dir3*labelmargin(L.p) : v;
             draw3D(f,S,V,L.p,light,interaction);
             // Fill subdivision cracks
-            if(render.labelfill && opacity(L.p) == 1 && !lighton)
+            if(prc && render.labelfill && opacity(L.p) == 1 && !lighton)
               _draw(f,S.external(),V,L.p,interaction.type);
           }
           endgroup3(f);

Added: trunk/Build/source/utils/asymptote/base/webgl/WebGLfooter.html
===================================================================
--- trunk/Build/source/utils/asymptote/base/webgl/WebGLfooter.html	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/base/webgl/WebGLfooter.html	2019-10-06 17:17:34 UTC (rev 52300)
@@ -0,0 +1,10 @@
+</script>
+
+</head>
+
+
+<body style="overflow: hidden;" onload="webGLStart();">
+<canvas id="Asymptote" style="border: none;" width="0" height="0" />
+</body>
+
+</html>


Property changes on: trunk/Build/source/utils/asymptote/base/webgl/WebGLfooter.html
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/base/webgl/WebGLheader.html
===================================================================
--- trunk/Build/source/utils/asymptote/base/webgl/WebGLheader.html	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/base/webgl/WebGLheader.html	2019-10-06 17:17:34 UTC (rev 52300)
@@ -0,0 +1,180 @@
+<html>
+
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta name="viewport" content="user-scalable=no"/>
+
+<script id="vertex" type="x-shader/x-vertex">
+attribute vec3 position;
+#ifdef WIDTH
+attribute float width;
+#endif
+#ifdef NORMAL
+attribute vec3 normal;
+#endif
+attribute float materialIndex;
+#ifdef COLOR
+attribute vec4 color;
+#endif
+
+uniform mat3 normMat;
+uniform mat4 viewMat;
+uniform mat4 projViewMat;
+
+#ifdef NORMAL
+#ifndef ORTHOGRAPHIC
+varying vec3 ViewPosition;
+#endif
+varying vec3 Normal;
+#endif
+varying vec4 diffuse;
+varying vec3 specular;
+varying float roughness,metallic,fresnel0;
+varying vec4 emissive;
+
+struct Material {
+  vec4 diffuse,emissive,specular;
+  float shininess,metallic,fresnel0;
+};
+
+uniform Material Materials[nMaterials];
+
+void main(void)
+{
+  vec4 v=vec4(position,1.0);
+  gl_Position=projViewMat*v;
+#ifdef NORMAL
+#ifndef ORTHOGRAPHIC
+  ViewPosition=(viewMat*v).xyz;
+#endif      
+  Normal=normal*normMat;
+        
+  Material m;
+#ifdef TRANSPARENT
+  m=Materials[int(abs(materialIndex))-1];
+  if(materialIndex >= 0.0) {
+    diffuse=m.diffuse;
+    emissive=m.emissive;
+  } else {
+    diffuse=color;
+    emissive=vec4(0.0);
+  }
+#else
+  m=Materials[int(materialIndex)];
+#ifdef COLOR
+  diffuse=color;
+  emissive=vec4(0.0);
+#else
+  diffuse=m.diffuse;
+  emissive=m.emissive;
+#endif
+#endif
+  specular=m.specular.rgb;
+  roughness=1.0-m.shininess;
+  metallic=m.metallic;
+  fresnel0=m.fresnel0;
+#else
+  emissive=Materials[int(materialIndex)].emissive;
+#endif
+#ifdef WIDTH
+  gl_PointSize=width;
+#endif
+}
+</script>
+
+<script id="fragment" type="x-shader/x-fragment">
+#ifdef NORMAL
+#ifndef ORTHOGRAPHIC
+varying vec3 ViewPosition;
+#endif
+varying vec3 Normal;
+varying vec4 diffuse;
+varying vec3 specular;
+varying float roughness,metallic,fresnel0;
+
+float Roughness2;
+vec3 normal;
+
+struct Light {
+  vec3 direction;
+  vec3 color;
+};
+uniform Light Lights[nLights];
+
+float NDF_TRG(vec3 h)
+{
+  float ndoth=max(dot(normal,h),0.0);
+  float alpha2=Roughness2*Roughness2;
+  float denom=ndoth*ndoth*(alpha2-1.0)+1.0;
+  return denom != 0.0 ? alpha2/(denom*denom) : 0.0;
+}
+    
+float GGX_Geom(vec3 v)
+{
+  float ndotv=max(dot(v,normal),0.0);
+  float ap=1.0+Roughness2;
+  float k=0.125*ap*ap;
+  return ndotv/((ndotv*(1.0-k))+k);
+}
+    
+float Geom(vec3 v, vec3 l)
+{
+  return GGX_Geom(v)*GGX_Geom(l);
+}
+    
+float Fresnel(vec3 h, vec3 v, float fresnel0)
+{
+  float a=1.0-max(dot(h,v),0.0);
+  float b=a*a;
+  return fresnel0+(1.0-fresnel0)*b*b*a;
+}
+    
+// physical based shading using UE4 model.
+vec3 BRDF(vec3 viewDirection, vec3 lightDirection)
+{
+  vec3 lambertian=diffuse.rgb;
+  vec3 h=normalize(lightDirection+viewDirection);
+      
+  float omegain=max(dot(viewDirection,normal),0.0);
+  float omegali=max(dot(lightDirection,normal),0.0);
+      
+  float D=NDF_TRG(h);
+  float G=Geom(viewDirection,lightDirection);
+  float F=Fresnel(h,viewDirection,fresnel0);
+      
+  float denom=4.0*omegain*omegali;
+  float rawReflectance=denom > 0.0 ? (D*G)/denom : 0.0;
+      
+  vec3 dielectric=mix(lambertian,rawReflectance*specular,F);
+  vec3 metal=rawReflectance*diffuse.rgb;
+      
+  return mix(dielectric,metal,metallic);
+}
+#endif
+varying vec4 emissive;
+    
+void main(void)
+{
+#ifdef NORMAL
+  normal=normalize(Normal);
+  normal=gl_FrontFacing ? normal : -normal;
+#ifdef ORTHOGRAPHIC
+  vec3 viewDir=vec3(0.0,0.0,1.0);
+#else
+  vec3 viewDir=-normalize(ViewPosition);
+#endif
+  Roughness2=roughness*roughness;
+  vec3 color=emissive.rgb;
+  for (int i=0; i < nLights; ++i) {
+    Light Li=Lights[i];
+    vec3 L=Li.direction;
+    float cosTheta=max(dot(normal,L),0.0);
+    vec3 radiance=cosTheta*Li.color;
+    color += BRDF(viewDir,L)*radiance;
+  }
+  gl_FragColor=vec4(color,diffuse.a);
+#else
+  gl_FragColor=emissive;
+#endif
+}
+</script>


Property changes on: trunk/Build/source/utils/asymptote/base/webgl/WebGLheader.html
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/base/webgl/asygl-1.00.js
===================================================================
--- trunk/Build/source/utils/asymptote/base/webgl/asygl-1.00.js	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/base/webgl/asygl-1.00.js	2019-10-06 17:17:34 UTC (rev 52300)
@@ -0,0 +1,39 @@
+/*@license
+ gl.js: Render Bezier patches via subdivision with WebGL.
+  Copyright 2019: John C. Bowman and Supakorn "Jamie" Rassameemasmuang
+  University of Alberta
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+let gl,canvas,canvasWidth,canvasHeight,halfCanvasWidth,halfCanvasHeight;!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var i=e();for(var a in i)("object"==typeof exports?exports:t)[a]=i[a]}}("undefined"!=typeof self?self:this,function(){return function(t){function e(a){if(i[a])return i[a].exports;var r=i[a]={i:a,l:!1,exports:{}};return t[a].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var i={};return e.m=t,e.c=i,e.d=function(t,i,a){e.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:a})},e.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(i,"a",i),i},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=1)}([function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.setMatrixArrayType=function(t){e.ARRAY_TYPE=t},e.toRadian=function(t){return t*r},e.equals=function(t,e){return Math.abs(t-e)<=a*Math.max(1,Math.abs(t),Math.abs(e))};var a=e.EPSILON=1e-6,r=(e.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,e.RANDOM=Math.random,Math.PI/180)},function(t,e,i){"use strict";function a(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}Object.defineProperty(e,"__esModule",{value:!0}),e.mat4=e.mat3=void 0;var r=a(i(2)),s=a(i(3));e.mat3=r,e.mat4=s},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.create=function(){var t=new a.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},e.fromMat4=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[4],t[4]=e[5],t[5]=e[6],t[6]=e[8],t[7]=e[9],t[8]=e[10],t},e.invert=function(t,e){var i=e[0],a=e[1],r=e[2],s=e[3],n=e[4],o=e[5],h=e[6],l=e[7],c=e[8],d=c*n-o*l,m=-c*s+o*h,u=l*s-n*h,f=i*d+a*m+r*u;return f?(f=1/f,t[0]=d*f,t[1]=(-c*a+r*l)*f,t[2]=(o*a-r*n)*f,t[3]=m*f,t[4]=(c*i-r*h)*f,t[5]=(-o*i+r*s!
 )*f,t[6]=u*f,t[7]=(-l*i+a*h)*f,t[8]=(n*i-a*s)*f,t):null};var a=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}(i(0))},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.create=function(){var t=new a.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},e.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},e.invert=function(t,e){var i=e[0],a=e[1],r=e[2],s=e[3],n=e[4],o=e[5],h=e[6],l=e[7],c=e[8],d=e[9],m=e[10],u=e[11],f=e[12],v=e[13],p=e[14],g=e[15],x=i*o-a*n,M=i*h-r*n,w=i*l-s*n,A=a*h-r*o,S=a*l-s*o,b=r*l-s*h,P=c*v-d*f,z=c*p-m*f,R=c*g-u*f,y=d*p-m*v,D=d*g-u*v,T=m*g-u*p,E=x*T-M*D+w*y+A*R-S*z+b*P;return E?(E=1/E,t[0]=(o*T-h*D+l*y)*E,t[1]=(r*D-a*T-s*y)*E,t[2]=(v*b-p*S+g*A)*E,t[3]=(m*S-d*b-u*A)*E,t[4]=(h*R-n*T-l*z)*E,t[5]=(i*T-r*R+s*z)*E,t[6]=(p*w-f*b-g*M)*E,t[7]=(c*b-m*w+u*M)*E,t[8]=(n*D-o*R+l*P)*E,t[9]=(a*R-i*D-s*P)*E,t[10]=(f*S-v*w+g*x)*E,t[11]=(d*w-c*S-u*x)*E,t[12]=(o*z-n*y-h*P)*E,t[13]=(i*y-a*z+r*P)*E,t[14]=(v*M-f*A-p*x)*E,t[15]=(c*A-d*M+m*x)*E,t):null},e.multiply=function(t,e,i){var a=e[0],r=e[1],s=e[2],n=e[3],o=e[4],h=e[5],l=e[6],c=e[7],d=e[8],m=e[9],u=e[10],f=e[11],v=e[12],p=e[13],g=e[14],x=e[15],M=i[0],w=i[1],A=i[2],S=i[3];return t[0]=M*a+w*o+A*d+S*v,t[1]=M*r+w*h+A*m+S*p,t[2]=M*s+w*l+A*u+S*g,t[3]=M*n+w*c+A*f+S*x,M=i[4],w=i[5],A=i[6],S=i[7],t[4]=M*a+w*o+A*d+S*v,t[5]=M*r+w*h+A*m+S*p,t[6]=M*s+w*l+A*u+S*g,t[7]=M*n+w*c+A*f+S*x,M=i[8],w=i[9],A=i[10],S=i[11],t[8]=M*a+w*o+A*d+S*v,t[9]=M*r+w*h+A*m+S*p,t[10]=M*s+w*l+A*u+S*g,t[11]=M*n+w*c+A*f+S*x,M=i[12],w=i[13],A=i[14],S=i[15],t[12]=M*a+w*o+A*d+S*v,t[13]=M*r+w*h+A*m+S*p,t[14]=M*s+w*l+A*u+S*g,t[15]=M*n+w*c+A*f+S*x,t},e.translate=function(t,e,i){var a=i[0],r=i[1],s=i[2],n=void 0,o=void 0,h=void 0,l=void 0,c=void 0,d=void 0,m=void 0,u=void 0,f=void 0,v=void 0,p!
 =void 0,g=void 0;return e===t?(t[12]=e[0]*a+e[4]*r+e[8]*s+e[12],t[13]=e[1]*a+e[5]*r+e[9]*s+e[13],t[14]=e[2]*a+e[6]*r+e[10]*s+e[14],t[15]=e[3]*a+e[7]*r+e[11]*s+e[15]):(n=e[0],o=e[1],h=e[2],l=e[3],c=e[4],d=e[5],m=e[6],u=e[7],f=e[8],v=e[9],p=e[10],g=e[11],t[0]=n,t[1]=o,t[2]=h,t[3]=l,t[4]=c,t[5]=d,t[6]=m,t[7]=u,t[8]=f,t[9]=v,t[10]=p,t[11]=g,t[12]=n*a+c*r+f*s+e[12],t[13]=o*a+d*r+v*s+e[13],t[14]=h*a+m*r+p*s+e[14],t[15]=l*a+u*r+g*s+e[15]),t},e.rotate=function(t,e,i,r){var s=r[0],n=r[1],o=r[2],h=Math.sqrt(s*s+n*n+o*o),l=void 0,c=void 0,d=void 0,m=void 0,u=void 0,f=void 0,v=void 0,p=void 0,g=void 0,x=void 0,M=void 0,w=void 0,A=void 0,S=void 0,b=void 0,P=void 0,z=void 0,R=void 0,y=void 0,D=void 0,T=void 0,E=void 0,I=void 0,O=void 0;return Math.abs(h)<a.EPSILON?null:(s*=h=1/h,n*=h,o*=h,l=Math.sin(i),d=1-(c=Math.cos(i)),m=e[0],u=e[1],f=e[2],v=e[3],p=e[4],g=e[5],x=e[6],M=e[7],w=e[8],A=e[9],S=e[10],b=e[11],P=s*s*d+c,z=n*s*d+o*l,R=o*s*d-n*l,y=s*n*d-o*l,D=n*n*d+c,T=o*n*d+s*l,E=s*o*d+n*l,I=n*o*d-s*l,O=o*o*d+c,t[0]=m*P+p*z+w*R,t[1]=u*P+g*z+A*R,t[2]=f*P+x*z+S*R,t[3]=v*P+M*z+b*R,t[4]=m*y+p*D+w*T,t[5]=u*y+g*D+A*T,t[6]=f*y+x*D+S*T,t[7]=v*y+M*D+b*T,t[8]=m*E+p*I+w*O,t[9]=u*E+g*I+A*O,t[10]=f*E+x*I+S*O,t[11]=v*E+M*I+b*O,e!==t&&(t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t)},e.fromTranslation=function(t,e){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]=e[0],t[13]=e[1],t[14]=e[2],t[15]=1,t},e.fromRotation=function(t,e,i){var r=i[0],s=i[1],n=i[2],o=Math.sqrt(r*r+s*s+n*n),h=void 0,l=void 0,c=void 0;return Math.abs(o)<a.EPSILON?null:(r*=o=1/o,s*=o,n*=o,h=Math.sin(e),c=1-(l=Math.cos(e)),t[0]=r*r*c+l,t[1]=s*r*c+n*h,t[2]=n*r*c-s*h,t[3]=0,t[4]=r*s*c-n*h,t[5]=s*s*c+l,t[6]=n*s*c+r*h,t[7]=0,t[8]=r*n*c+s*h,t[9]=s*n*c-r*h,t[10]=n*n*c+l,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t)},e.frustum=function(t,e,i,a,r,s,n){var o=1/(i-e),h=1/(r-a),l=1/(s-n);return t[0]=2*s*o,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*s*h,t[6]=0,t[7]=0,t[8]=(i+e)*o,t[9]=(r+a)*h,t[10]=(n+s)*l,t[11]=-1,t[12]=0,t[13]=0,t[14]=n*s*2*l,t!
 [15]=0,t},e.ortho=function(t,e,i,a,r,s,n){var o=1/(e-i),h=1/(a-r),l=1/(s-n);return t[0]=-2*o,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*h,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*l,t[11]=0,t[12]=(e+i)*o,t[13]=(r+a)*h,t[14]=(n+s)*l,t[15]=1,t};var a=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}(i(0))}])});let Zoom,Zoom0,pixel=.75,BezierFactor=.4,FillFactor=.1,maxViewportWidth=window.innerWidth,maxViewportHeight=window.innerHeight,viewportmargin=0;const windowTrim=10;let zoomFactor,zoomPinchFactor,zoomPinchCap,zoomStep,shiftHoldDistance,shiftWaitTime,vibrateTime,lastzoom,H,zmin,zmax,size2,ArcballFactor,b,B,positionBuffer,materialBuffer,colorBuffer,indexBuffer,resizeStep=1.2,Fuzz2=1e3*Number.EPSILON,Fuzz4=Fuzz2*Fuzz2,third=1/3,P=[],Materials=[],Lights=[],Centers=[],Background=[1,1,1,1],absolute=!1,rotMat=mat4.create(),projMat=mat4.create(),viewMat=mat4.create(),projViewMat=mat4.create(),normMat=mat3.create(),viewMat3=mat3.create(),rotMats=mat4.create(),cjMatInv=mat4.create(),translMat=mat4.create(),center={x:0,y:0,z:0},shift={x:0,y:0},viewParam={xmin:0,xmax:0,ymin:0,ymax:0,zmin:0,zmax:0},redraw=!0,remesh=!0,mouseDownOrTouchActive=!1,lastMouseX=null,lastMouseY=null,touchID=null,Positions=[],Normals=[],Colors=[],Indices=[];class Material{constructor(t,e,i,a,r,s){this.diffuse=t,this.emissive=e,this.specular=i,this.shininess=a,this.metallic=r,this.fresnel0=s}setUniform(t,e,i=null){let a;a=null===i?i=>gl.getUniformLocation(t,e+"."+i):a=>gl.getUniformLocation(t,e+"["+i+"]."+a),gl.uniform4fv(a("diffuse"),new Float32Array(this.diffuse)),gl.uniform4fv(a("emissive"),new Float32Array(this.emissive)),gl.uniform4fv(a("specular"),new Float32Array(this.specular)),gl.uniform1f(a("shininess"),this.shininess),gl.uniform1f(a("metallic"),this.metallic),gl.uniform1f(a("fresnel0"),this.fresnel0)}}let enumPointLight=1,enumDirectionalLight=2;class Light{constructor(t,e){this.direction=t,this.color=e}setUniform(t,e,i){let a=a=>gl.getUniformLocation!
 (t,e+"["+i+"]."+a);gl.uniform3fv(a("direction"),new Float32Array(this.direction)),gl.uniform3fv(a("color"),new Float32Array(this.color))}}function initGL(){try{gl=canvas.getContext("webgl",{alpha:Background[3]<1})}catch(t){}gl||alert("Could not initialize WebGL")}function getShader(t,e,i=[]){let a=document.getElementById(e);if(!a)return null;let r=`#version 100\n#ifdef GL_FRAGMENT_PRECISION_HIGH\n  precision highp float;\n#else\n  precision mediump float;\n#endif\n  const int nLights=${Lights.length};\n  const int nMaterials=${Materials.length};\n`;orthographic&&(r+="#define ORTHOGRAPHIC\n"),i.forEach(t=>r+="#define "+t+"\n");let s,n=a.firstChild;for(;n;)3==n.nodeType&&(r+=n.textContent),n=n.nextSibling;if("x-shader/x-fragment"==a.type)s=t.createShader(t.FRAGMENT_SHADER);else{if("x-shader/x-vertex"!=a.type)return null;s=t.createShader(t.VERTEX_SHADER)}return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)}function drawBuffer(t,e,i=t.indices){if(0==t.indices.length)return;let a=e==pixelShader,r=!a&&e!=noNormalShader;setUniforms(e),gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer),gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(t.vertices),gl.STATIC_DRAW),gl.vertexAttribPointer(e.vertexPositionAttribute,3,gl.FLOAT,!1,r?24:a?16:12,0),r?gl.vertexAttribPointer(e.vertexNormalAttribute,3,gl.FLOAT,!1,24,12):a&&gl.vertexAttribPointer(e.vertexWidthAttribute,1,gl.FLOAT,!1,16,12),gl.bindBuffer(gl.ARRAY_BUFFER,materialBuffer),gl.bufferData(gl.ARRAY_BUFFER,new Int16Array(t.materials),gl.STATIC_DRAW),gl.vertexAttribPointer(e.vertexMaterialAttribute,1,gl.SHORT,!1,2,0),e!=colorShader&&e!=transparentShader||(gl.bindBuffer(gl.ARRAY_BUFFER,colorBuffer),gl.bufferData(gl.ARRAY_BUFFER,new Uint8Array(t.colors),gl.STATIC_DRAW),gl.vertexAttribPointer(e.vertexColorAttribute,4,gl.UNSIGNED_BYTE,!0,0,0)),gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,indexBuffer),gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,indexExt?new Uint32Array(i):new Uint16Array(i),gl.STATIC_DRAW),gl.drawElements(r?gl.TRI!
 ANGLES:a?gl.POINTS:gl.LINES,i.length,indexExt?gl.UNSIGNED_INT:gl.UNSIGNED_SHORT,0)}class vertexBuffer{constructor(){this.clear()}clear(){this.vertices=[],this.materials=[],this.colors=[],this.indices=[],this.nvertices=0}vertex(t,e){return this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.vertices.push(e[0]),this.vertices.push(e[1]),this.vertices.push(e[2]),this.materials.push(materialIndex),this.nvertices++}Vertex(t,e,i=[0,0,0,0]){return this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.vertices.push(e[0]),this.vertices.push(e[1]),this.vertices.push(e[2]),this.materials.push(materialIndex),this.colors.push(i[0]),this.colors.push(i[1]),this.colors.push(i[2]),this.colors.push(i[3]),this.nvertices++}vertex1(t){return this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.materials.push(materialIndex),this.nvertices++}vertex0(t,e){return this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.vertices.push(e),this.materials.push(materialIndex),this.nvertices++}iVertex(t,e,i,a=[0,0,0,0]){let r=6*t;this.vertices[r]=e[0],this.vertices[r+1]=e[1],this.vertices[r+2]=e[2],this.vertices[r+3]=i[0],this.vertices[r+4]=i[1],this.vertices[r+5]=i[2],this.materials[t]=materialIndex;let s=4*t;this.colors[s]=a[0],this.colors[s+1]=a[1],this.colors[s+2]=a[2],this.colors[s+3]=a[3],this.indices.push(t)}append(t){append(this.vertices,t.vertices),append(this.materials,t.materials),append(this.colors,t.colors),appendOffset(this.indices,t.indices,this.nvertices),this.nvertices+=t.nvertices}}let materialIndex,material0Data=new vertexBuffer,material1Data=new vertexBuffer,materialData=new vertexBuffer,colorData=new vertexBuffer,transparentData=new vertexBuffer,triangleData=new vertexBuffer;function append(t,e){let i=t.length,a=e.length;t.length+=a;for(let r=0;r<a;++r)t[i+r]=e[r]}function appendOffset(t,e,i){let a=t.length,r=e.length;t.length+=e.length;for(let s=0;s<r;++s)t[a+s]=e[s]+i}class Geometry{constructor(){this.data=new vertexBuf!
 fer,this..Onscreen=!1,this.m=[]}offscreen(t){let e=projViewMat,i=t[0],a=i[0],r=i[1],s=i[2],n=1/(e[3]*a+e[7]*r+e[11]*s+e[15]);this.x=this.X=(e[0]*a+e[4]*r+e[8]*s+e[12])*n,this.y=this.Y=(e[1]*a+e[5]*r+e[9]*s+e[13])*n;for(let i=1,a=t.length;i<a;++i){let a=t[i],r=a[0],s=a[1],n=a[2],o=1/(e[3]*r+e[7]*s+e[11]*n+e[15]),h=(e[0]*r+e[4]*s+e[8]*n+e[12])*o,l=(e[1]*r+e[5]*s+e[9]*n+e[13])*o;h<this.x?this.x=h:h>this.X&&(this.X=h),l<this.y?this.y=l:l>this.Y&&(this.Y=l)}return(this.X<-1.01||this.x>1.01||this.Y<-1.01||this.y>1.01)&&(this.Onscreen=!1,!0)}T(t){let e=this.c[0],i=this.c[1],a=this.c[2],r=t[0]-e,s=t[1]-i,n=t[2]-a;return[r*normMat[0]+s*normMat[3]+n*normMat[6]+e,r*normMat[1]+s*normMat[4]+n*normMat[7]+i,r*normMat[2]+s*normMat[5]+n*normMat[8]+a]}Tcorners(t,e){return[this.T(t),this.T([t[0],t[1],e[2]]),this.T([t[0],e[1],t[2]]),this.T([t[0],e[1],e[2]]),this.T([e[0],t[1],t[2]]),this.T([e[0],t[1],e[2]]),this.T([e[0],e[1],t[2]]),this.T(e)]}render(){let t;if(0==this.CenterIndex?t=corners(this.Min,this.Max):(this.c=Centers[this.CenterIndex-1],t=this.Tcorners(this.Min,this.Max)),this.offscreen(t))return void this.data.clear();let e,i=this.controlpoints;if(0==this.CenterIndex){if(!remesh&&this.Onscreen)return void this.append();e=i}else{let t=i.length;e=Array(t);for(let a=0;a<t;++a)e[a]=this.T(i[a])}materialIndex=this.MaterialIndex;let a=orthographic?1:this.Min[2]/B[2],r=pixel*Math.hypot(a*(viewParam.xmax-viewParam.xmin),a*(viewParam.ymax-viewParam.ymin))/size2;this.res2=r*r,this.Epsilon=FillFactor*r,this.data.clear(),this.Onscreen=!0,this.process(e)}}class BezierPatch extends Geometry{constructor(t,e,i,a,r,s){super(),this.controlpoints=t,this.Min=a,this.Max=r,this.color=s,this.CenterIndex=e;let n=t.length;if(s){let t=s[0][3]+s[1][3]+s[2][3];this.transparent=16==n||4==n?t+s[3][3]<1020:t<765}else this.transparent=Materials[i].diffuse[3]<1;this.transparent?(this.MaterialIndex=s?-1-i:1+i,this.vertex=this.data.Vertex.bind(this.data)):(this.MaterialIndex=i,this.vertex=this.data.vertex.bind(this.data)),this.L2norm(this.controlpoints)}L2norm!
 (t){let e=t[0];this.epsilon=0;let i=t.length;for(let a=1;a<i;++a)this.epsilon=Math.max(this.epsilon,abs2([t[a][0]-e[0],t[a][1]-e[1],t[a][2]-e[2]]));this.epsilon*=Fuzz4}processTriangle(t){let e=t[0],i=t[1],a=t[2],r=unit(cross([i[0]-e[0],i[1]-e[1],i[2]-e[2]],[a[0]-e[0],a[1]-e[1],a[2]-e[2]]));this.offscreen([e,i,a])||(this.color?(this.data.indices.push(this.data.Vertex(e,r,this.color[0])),this.data.indices.push(this.data.Vertex(i,r,this.color[1])),this.data.indices.push(this.data.Vertex(a,r,this.color[2]))):(this.data.indices.push(this.vertex(e,r)),this.data.indices.push(this.vertex(i,r)),this.data.indices.push(this.vertex(a,r))),this.append())}processQuad(t){let e=t[0],i=t[1],a=t[2],r=t[3],s=cross([i[0]-e[0],i[1]-e[1],i[2]-e[2]],[a[0]-i[0],a[1]-i[1],a[2]-i[2]]),n=cross([a[0]-r[0],a[1]-r[1],a[2]-r[2]],[r[0]-e[0],r[1]-e[1],r[2]-e[2]]),o=unit([s[0]+n[0],s[1]+n[1],s[2]+n[2]]);if(!this.offscreen([e,i,a,r])){let t,s,n,h;this.color?(t=this.data.Vertex(e,o,this.color[0]),s=this.data.Vertex(i,o,this.color[1]),n=this.data.Vertex(a,o,this.color[2]),h=this.data.Vertex(r,o,this.color[3])):(t=this.vertex(e,o),s=this.vertex(i,o),n=this.vertex(a,o),h=this.vertex(r,o)),this.data.indices.push(t),this.data.indices.push(s),this.data.indices.push(n),this.data.indices.push(t),this.data.indices.push(n),this.data.indices.push(h),this.append()}}process(t){if(10==t.length)return this.process3(t);if(3==t.length)return this.processTriangle(t);if(4==t.length)return this.processQuad(t);let e=t[0],i=t[3],a=t[12],r=t[15],s=this.normal(i,t[2],t[1],e,t[4],t[8],a);iszero(s)&&iszero(s=this.normal(i,t[2],t[1],e,t[13],t[14],r))&&(s=this.normal(r,t[11],t[7],i,t[4],t[8],a));let n=this.normal(e,t[4],t[8],a,t[13],t[14],r);iszero(n)&&iszero(n=this.normal(e,t[4],t[8],a,t[11],t[7],i))&&(n=this.normal(i,t[2],t[1],e,t[13],t[14],r));let o=this.normal(a,t[13],t[14],r,t[11],t[7],i);iszero(o)&&iszero(o=this.normal(a,t[13],t[14],r,t[2],t[1],e))&&(o=this.normal(e,t[4],t[8],a,t[11],t[7],i));let h=this.normal(r,t[11],t[7],i,t[2],t[1],e);if(iszero(h)&&iszero(h=this.nor!
 mal(r,t[11],t[7],i,t[4],t[8],a))&&(h=this.normal(a,t[13],t[14],r,t[2],t[1],e)),this.color){let l=this.color[0],c=this.color[1],d=this.color[2],m=this.color[3],u=this.data.Vertex(e,s,l),f=this.data.Vertex(a,n,c),v=this.data.Vertex(r,o,d),p=this.data.Vertex(i,h,m);this.Render(t,u,f,v,p,e,a,r,i,!1,!1,!1,!1,l,c,d,m)}else{let l=this.vertex(e,s),c=this.vertex(a,n),d=this.vertex(r,o),m=this.vertex(i,h);this.Render(t,l,c,d,m,e,a,r,i,!1,!1,!1,!1)}this.data.indices.length>0&&this.append()}append(){this.transparent?transparentData.append(this.data):this.color?colorData.append(this.data):materialData.append(this.data)}Render(t,e,i,a,r,s,n,o,h,l,c,d,m,u,f,v,p){if(this.Distance(t)<this.res2)this.offscreen([s,n,o])||(this.data.indices.push(e),this.data.indices.push(i),this.data.indices.push(a)),this.offscreen([s,o,h])||(this.data.indices.push(e),this.data.indices.push(a),this.data.indices.push(r));else{if(this.offscreen(t))return;let g=t[0],x=t[3],M=t[12],w=t[15],A=new Split3(g,t[1],t[2],x),S=new Split3(t[4],t[5],t[6],t[7]),b=new Split3(t[8],t[9],t[10],t[11]),P=new Split3(M,t[13],t[14],w),z=new Split3(g,t[4],t[8],M),R=new Split3(A.m0,S.m0,b.m0,P.m0),y=new Split3(A.m3,S.m3,b.m3,P.m3),D=new Split3(A.m5,S.m5,b.m5,P.m5),T=new Split3(A.m4,S.m4,b.m4,P.m4),E=new Split3(A.m2,S.m2,b.m2,P.m2),I=new Split3(x,t[7],t[11],w),O=[g,A.m0,A.m3,A.m5,z.m0,R.m0,y.m0,D.m0,z.m3,R.m3,y.m3,D.m3,z.m5,R.m5,y.m5,D.m5],B=[z.m5,R.m5,y.m5,D.m5,z.m4,R.m4,y.m4,D.m4,z.m2,R.m2,y.m2,D.m2,M,P.m0,P.m3,P.m5],_=[D.m5,T.m5,E.m5,I.m5,D.m4,T.m4,E.m4,I.m4,D.m2,T.m2,E.m2,I.m2,P.m5,P.m4,P.m2,w],C=[A.m5,A.m4,A.m2,x,D.m0,T.m0,E.m0,I.m0,D.m3,T.m3,E.m3,I.m3,D.m5,T.m5,E.m5,I.m5],F=O[15],L=this.normal(O[0],O[4],O[8],O[12],O[13],O[14],O[15]);iszero(L)&&iszero(L=this.normal(O[0],O[4],O[8],O[12],O[11],O[7],O[3]))&&(L=this.normal(O[3],O[2],O[1],O[0],O[13],O[14],O[15]));let V=this.normal(B[12],B[13],B[14],B[15],B[11],B[7],B[3]);iszero(V)&&iszero(V=this.normal(B[12],B[13],B[14],B[15],B[2],B[1],B[0]))&&(V=this.normal(B[0],B[4],B[8],B[12],B[11],B[7],B[3]));let N=this.normal(_[15],_[11]!
 ,_[7],_[3],_[2],_[1],_[0]);iszero(N)&&iszero(N=this.normal(_[15],_[11],_[7],_[3],_[4],_[8],_[12]))&&(N=this.normal(_[12],_[13],_[14],_[15],_[2],_[1],_[0]));let H=this.normal(C[3],C[2],C[1],C[0],C[4],C[8],C[12]);iszero(H)&&iszero(H=this.normal(C[3],C[2],C[1],C[0],C[13],C[14],C[15]))&&(H=this.normal(C[15],C[11],C[7],C[3],C[4],C[8],C[12]));let U=this.normal(_[3],_[2],_[1],F,_[4],_[8],_[12]),W=this.Epsilon,Y=[.5*(s[0]+n[0]),.5*(s[1]+n[1]),.5*(s[2]+n[2])];if(!l)if(l=Straightness(g,t[4],t[8],M)<this.res2){let t=unit(this.derivative(B[0],B[1],B[2],B[3]));Y=[Y[0]-W*t[0],Y[1]-W*t[1],Y[2]-W*t[2]]}else Y=O[12];let j=[.5*(n[0]+o[0]),.5*(n[1]+o[1]),.5*(n[2]+o[2])];if(!c)if(c=Straightness(M,t[13],t[14],w)<this.res2){let t=unit(this.derivative(_[12],_[8],_[4],_[0]));j=[j[0]-W*t[0],j[1]-W*t[1],j[2]-W*t[2]]}else j=B[15];let G=[.5*(o[0]+h[0]),.5*(o[1]+h[1]),.5*(o[2]+h[2])];if(!d)if(d=Straightness(w,t[11],t[7],x)<this.res2){let t=unit(this.derivative(C[15],_[14],_[13],B[12]));G=[G[0]-W*t[0],G[1]-W*t[1],G[2]-W*t[2]]}else G=_[3];let k=[.5*(h[0]+s[0]),.5*(h[1]+s[1]),.5*(h[2]+s[2])];if(!m)if(m=Straightness(g,t[1],t[2],x)<this.res2){let t=unit(this.derivative(O[3],O[7],O[11],O[15]));k=[k[0]-W*t[0],k[1]-W*t[1],k[2]-W*t[2]]}else k=C[0];if(u){let t=Array(4),g=Array(4),x=Array(4),M=Array(4),w=Array(4);for(let e=0;e<4;++e)t[e]=.5*(u[e]+f[e]),g[e]=.5*(f[e]+v[e]),x[e]=.5*(v[e]+p[e]),M[e]=.5*(p[e]+u[e]),w[e]=.5*(t[e]+x[e]);let A=this.data.Vertex(Y,L,t),S=this.data.Vertex(j,V,g),b=this.data.Vertex(G,N,x),P=this.data.Vertex(k,H,M),z=this.data.Vertex(F,U,w);this.Render(O,e,A,z,P,s,Y,F,k,l,!1,!1,m,u,t,w,M),this.Render(B,A,i,S,z,Y,n,j,F,l,c,!1,!1,t,f,g,w),this.Render(_,z,S,a,b,F,j,o,G,!1,c,d,!1,w,g,v,x),this.Render(C,P,z,b,r,k,F,G,h,!1,!1,d,m,M,w,x,p)}else{let t=this.vertex(Y,L),u=this.vertex(j,V),f=this.vertex(G,N),v=this.vertex(k,H),p=this.vertex(F,U);this.Render(O,e,t,p,v,s,Y,F,k,l,!1,!1,m),this.Render(B,t,i,u,p,Y,n,j,F,l,c,!1,!1),this.Render(_,p,u,a,f,F,j,o,G,!1,c,d,!1),this.Render(C,v,p,f,r,k,F,G,h,!1,!1,d,m)}}}process3(t){this.Res2=BezierFact!
 or*BezierFactor*this.res2;let e=t[0],i=t[6],a=t[9],r=this.normal(a,t[5],t[2],e,t[1],t[3],i),s=this.normal(e,t[1],t[3],i,t[7],t[8],a),n=this.normal(i,t[7],t[8],a,t[5],t[2],e);if(this.color){let o=this.color[0],h=this.color[1],l=this.color[2],c=this.data.Vertex(e,r,o),d=this.data.Vertex(i,s,h),m=this.data.Vertex(a,n,l);this.Render3(t,c,d,m,e,i,a,!1,!1,!1,o,h,l)}else{let o=this.vertex(e,r),h=this.vertex(i,s),l=this.vertex(a,n);this.Render3(t,o,h,l,e,i,a,!1,!1,!1)}this.data.indices.length>0&&this.append()}Render3(t,e,i,a,r,s,n,o,h,l,c,d,m){if(this.Distance3(t)<this.Res2)this.offscreen([r,s,n])||(this.data.indices.push(e),this.data.indices.push(i),this.data.indices.push(a));else{if(this.offscreen(t))return;let u=t[0],f=t[1],v=t[2],p=t[3],g=t[4],x=t[5],M=t[6],w=t[7],A=t[8],S=t[9],b=[.5*(S[0]+x[0]),.5*(S[1]+x[1]),.5*(S[2]+x[2])],P=[.5*(S[0]+A[0]),.5*(S[1]+A[1]),.5*(S[2]+A[2])],z=[.5*(x[0]+v[0]),.5*(x[1]+v[1]),.5*(x[2]+v[2])],R=[.5*(A[0]+g[0]),.5*(A[1]+g[1]),.5*(A[2]+g[2])],y=[.5*(A[0]+w[0]),.5*(A[1]+w[1]),.5*(A[2]+w[2])],D=[.5*(v[0]+g[0]),.5*(v[1]+g[1]),.5*(v[2]+g[2])],T=[.5*(v[0]+u[0]),.5*(v[1]+u[1]),.5*(v[2]+u[2])],E=[.5*(g[0]+p[0]),.5*(g[1]+p[1]),.5*(g[2]+p[2])],I=[.5*(w[0]+M[0]),.5*(w[1]+M[1]),.5*(w[2]+M[2])],O=[.5*(u[0]+f[0]),.5*(u[1]+f[1]),.5*(u[2]+f[2])],B=[.5*(f[0]+p[0]),.5*(f[1]+p[1]),.5*(f[2]+p[2])],_=[.5*(p[0]+M[0]),.5*(p[1]+M[1]),.5*(p[2]+M[2])],C=[.5*(b[0]+z[0]),.5*(b[1]+z[1]),.5*(b[2]+z[2])],F=[.5*(P[0]+y[0]),.5*(P[1]+y[1]),.5*(P[2]+y[2])],L=[.5*(z[0]+T[0]),.5*(z[1]+T[1]),.5*(z[2]+T[2])],V=[.5*R[0]+.25*(g[0]+f[0]),.5*R[1]+.25*(g[1]+f[1]),.5*R[2]+.25*(g[2]+f[2])],N=[.5*(y[0]+I[0]),.5*(y[1]+I[1]),.5*(y[2]+I[2])],H=[.5*D[0]+.25*(g[0]+w[0]),.5*D[1]+.25*(g[1]+w[1]),.5*D[2]+.25*(g[2]+w[2])],U=[.25*(x[0]+g[0])+.5*E[0],.25*(x[1]+g[1])+.5*E[1],.25*(x[2]+g[2])+.5*E[2]],W=[.5*(O[0]+B[0]),.5*(O[1]+B[1]),.5*(O[2]+B[2])],Y=[.5*(B[0]+_[0]),.5*(B[1]+_[1]),.5*(B[2]+_[2])],j=[.5*(H[0]+W[0]),.5*(H[1]+W[1]),.5*(H[2]+W[2])],G=[.5*(H[0]+Y[0]),.5*(H[1]+Y[1]),.5*(H[2]+Y[2])],k=[.5*(W[0]+Y[0]),.5*(W[1]+Y[1]),.5*(W[2]+Y[2])],X=[.5!
 *(U[0]+N[0]),.5*(U[1]+N[1]),.5*(U[2]+N[2])],Z=[.5*(F[0]+U[0]),.5*(F[1]+U[1]),.5*(F[2]+U[2])],q=[.5*(F[0]+N[0]),.5*(F[1]+N[1]),.5*(F[2]+N[2])],K=[.5*(C[0]+V[0]),.5*(C[1]+V[1]),.5*(C[2]+V[2])],Q=[.5*(L[0]+V[0]),.5*(L[1]+V[1]),.5*(L[2]+V[2])],$=[.5*(C[0]+L[0]),.5*(C[1]+L[1]),.5*(C[2]+L[2])],J=[u,O,T,W,[.5*(D[0]+O[0]),.5*(D[1]+O[1]),.5*(D[2]+O[2])],L,k,j,Q,$],tt=[k,Y,G,_,[.5*(E[0]+I[0]),.5*(E[1]+I[1]),.5*(E[2]+I[2])],X,M,I,N,q],et=[$,K,C,Z,[.5*(b[0]+R[0]),.5*(b[1]+R[1]),.5*(b[2]+R[2])],b,q,F,P,S],it=[q,Z,X,K,[.25*(z[0]+y[0]+B[0]+g[0]),.25*(z[1]+y[1]+B[1]+g[1]),.25*(z[2]+y[2]+B[2]+g[2])],G,$,Q,j,k],at=this.normal(k,G,X,q,Z,K,$),rt=this.normal(q,Z,K,$,Q,j,k),st=this.normal($,Q,j,k,G,X,q),nt=this.Epsilon,ot=[.5*(s[0]+n[0]),.5*(s[1]+n[1]),.5*(s[2]+n[2])];if(!o)if(o=Straightness(M,w,A,S)<this.res2){let t=unit(this.sumderivative(it[0],it[2],it[5],it[9],it[1],it[3],it[6]));ot=[ot[0]-nt*t[0],ot[1]-nt*t[1],ot[2]-nt*t[2]]}else ot=q;let ht=[.5*(n[0]+r[0]),.5*(n[1]+r[1]),.5*(n[2]+r[2])];if(!h)if(h=Straightness(u,v,x,S)<this.res2){let t=unit(this.sumderivative(it[6],it[3],it[1],it[0],it[7],it[8],it[9]));ht=[ht[0]-nt*t[0],ht[1]-nt*t[1],ht[2]-nt*t[2]]}else ht=$;let lt=[.5*(r[0]+s[0]),.5*(r[1]+s[1]),.5*(r[2]+s[2])];if(!l)if(l=Straightness(u,f,p,M)<this.res2){let t=unit(this.sumderivative(it[9],it[8],it[7],it[6],it[5],it[2],it[0]));lt=[lt[0]-nt*t[0],lt[1]-nt*t[1],lt[2]-nt*t[2]]}else lt=k;if(c){let t=Array(4),u=Array(4),f=Array(4);for(let e=0;e<4;++e)t[e]=.5*(d[e]+m[e]),u[e]=.5*(m[e]+c[e]),f[e]=.5*(c[e]+d[e]);let v=this.data.Vertex(ot,at,t),p=this.data.Vertex(ht,rt,u),g=this.data.Vertex(lt,st,f);this.Render3(J,e,g,p,r,lt,ht,!1,h,l,c,f,u),this.Render3(tt,g,i,v,lt,s,ot,o,!1,l,f,d,t),this.Render3(et,p,v,a,ht,ot,n,o,h,!1,u,t,m),this.Render3(it,v,p,g,ot,ht,lt,!1,!1,!1,t,u,f)}else{let t=this.vertex(ot,at),c=this.vertex(ht,rt),d=this.vertex(lt,st);this.Render3(J,e,d,c,r,lt,ht,!1,h,l),this.Render3(tt,d,i,t,lt,s,ot,o,!1,l),this.Render3(et,c,t,a,ht,ot,n,o,h,!1),this.Render3(it,t,c,d,ot,ht,lt,!1,!1,!1)}}}Distance(t){let e=t[0],i=t[3],a=t[12],r=!
 t[15],s=Distance2(r,e,this.normal(i,t[2],t[1],e,t[4],t[8],a));return s=Math.max(s,Straightness(e,t[1],t[2],i)),s=Math.max(s,Straightness(e,t[4],t[8],a)),s=Math.max(s,Straightness(i,t[7],t[11],r)),s=Math.max(s,Straightness(a,t[13],t[14],r)),s=Math.max(s,Straightness(t[4],t[5],t[6],t[7])),s=Math.max(s,Straightness(t[8],t[9],t[10],t[11])),s=Math.max(s,Straightness(t[1],t[5],t[9],t[13])),Math.max(s,Straightness(t[2],t[6],t[10],t[14]))}Distance3(t){let e=t[0],i=t[4],a=t[6],r=t[9],s=abs2([(e[0]+a[0]+r[0])*third-i[0],(e[1]+a[1]+r[1])*third-i[1],(e[2]+a[2]+r[2])*third-i[2]]);return s=Math.max(s,Straightness(e,t[1],t[3],a)),s=Math.max(s,Straightness(e,t[2],t[5],r)),Math.max(s,Straightness(a,t[7],t[8],r))}derivative(t,e,i,a){let r=[e[0]-t[0],e[1]-t[1],e[2]-t[2]];if(abs2(r)>this.epsilon)return r;let s=bezierPP(t,e,i);return abs2(s)>this.epsilon?s:bezierPPP(t,e,i,a)}sumderivative(t,e,i,a,r,s,n){let o=this.derivative(t,e,i,a),h=this.derivative(t,r,s,n);return[o[0]+h[0],o[1]+h[1],o[2]+h[2]]}normal(t,e,i,a,r,s,n){let o=r[0]-a[0],h=r[1]-a[1],l=r[2]-a[2],c=i[0]-a[0],d=i[1]-a[1],m=i[2]-a[2],u=[h*m-l*d,l*c-o*m,o*d-h*c];if(abs2(u)>this.epsilon)return unit(u);let f=[c,d,m],v=[o,h,l],p=bezierPP(a,i,e),g=bezierPP(a,r,s),x=cross(g,f),M=cross(v,p);if(abs2(u=[x[0]+M[0],x[1]+M[1],x[2]+M[2]])>this.epsilon)return unit(u);let w=bezierPPP(a,i,e,t),A=bezierPPP(a,r,s,n);x=cross(g,p),M=cross(v,w);let S=cross(A,f),b=cross(A,p),P=cross(g,w),z=cross(A,w);return unit([9*x[0]+3*(M[0]+S[0]+b[0]+P[0])+z[0],9*x[1]+3*(M[1]+S[1]+b[1]+P[1])+z[1],9*x[2]+3*(M[2]+S[2]+b[2]+P[2])+z[2]])}}class BezierCurve extends Geometry{constructor(t,e,i,a,r){super(),this.controlpoints=t,this.Min=a,this.Max=r,this.CenterIndex=e,this.MaterialIndex=i}processLine(t){let e=t[0],i=t[1];this.offscreen([e,i])||(this.data.indices.push(this.data.vertex1(e)),this.data.indices.push(this.data.vertex1(i)),this.append())}process(t){if(2==t.length)return this.processLine(t);let e=this.data.vertex1(t[0]),i=this.data.vertex1(t[3]);this.Render(t,e,i),this.data.indices.length>0&&this.append()}!
 append(){material1Data.append(this.data)}Render(t,e,i){let a=t[0],r=t[1],s=t[2],n=t[3];if(Straightness(a,r,s,n)<this.res2)this.offscreen([a,n])||(this.data.indices.push(e),this.data.indices.push(i));else{if(this.offscreen(t))return;let o=[.5*(a[0]+r[0]),.5*(a[1]+r[1]),.5*(a[2]+r[2])],h=[.5*(r[0]+s[0]),.5*(r[1]+s[1]),.5*(r[2]+s[2])],l=[.5*(s[0]+n[0]),.5*(s[1]+n[1]),.5*(s[2]+n[2])],c=[.5*(o[0]+h[0]),.5*(o[1]+h[1]),.5*(o[2]+h[2])],d=[.5*(h[0]+l[0]),.5*(h[1]+l[1]),.5*(h[2]+l[2])],m=[.5*(c[0]+d[0]),.5*(c[1]+d[1]),.5*(c[2]+d[2])],u=[a,o,c,m],f=[m,d,l,n],v=this.data.vertex1(m);this.Render(u,e,v),this.Render(f,v,i)}}}class Pixel extends Geometry{constructor(t,e,i,a,r){super(),this.controlpoint=t,this.width=e,this.CenterIndex=0,this.MaterialIndex=i,this.Min=a,this.Max=r}process(t){this.data.indices.push(this.data.vertex0(this.controlpoint,this.width)),this.append()}append(){material0Data.append(this.data)}}class Triangles extends Geometry{constructor(t,e,i){super(),this.CenterIndex=0,this.MaterialIndex=t,this.Min=e,this.Max=i,this.Positions=Positions,this.Normals=Normals,this.Colors=Colors,this.Indices=Indices,Positions=[],Normals=[],Colors=[],Indices=[],this.transparent=Materials[t].diffuse[3]<1}process(t){for(let t=0,e=this.Indices.length;t<e;++t){let e=this.Indices[t],i=e[0],a=this.Positions[i[0]],r=this.Positions[i[1]],s=this.Positions[i[2]];if(!this.offscreen([a,r,s])){let t=e.length>1?e[1]:i;if(t&&0!=t.length||(t=i),this.Colors.length>0){let n=e.length>2?e[2]:i;n&&0!=n.length||(n=i);let o=this.Colors[n[0]],h=this.Colors[n[1]],l=this.Colors[n[2]];this.transparent|=o[3]+h[3]+l[3]<765,materialIndex=-1-this.MaterialIndex,this.data.iVertex(i[0],a,this.Normals[t[0]],o),this.data.iVertex(i[1],r,this.Normals[t[1]],h),this.data.iVertex(i[2],s,this.Normals[t[2]],l)}else materialIndex=1+this.MaterialIndex,this.data.iVertex(i[0],a,this.Normals[t[0]]),this.data.iVertex(i[1],r,this.Normals[t[1]]),this.data.iVertex(i[2],s,this.Normals[t[2]])}}this.data.nvertices=this.Positions.length,this.data.indices.length>0&&this.append()}appe!
 nd(){this.transparent?transparentData.append(this.data):triangleData.append(this.data)}}function home(){mat4.identity(rotMat),initProjection(),setProjection(),redraw=!0}function initShader(t=[]){let e=getShader(gl,"fragment",t),i=getShader(gl,"vertex",t),a=gl.createProgram();return gl.attachShader(a,i),gl.attachShader(a,e),gl.linkProgram(a),gl.getProgramParameter(a,gl.LINK_STATUS)||alert("Could not initialize shaders"),a}class Split3{constructor(t,e,i,a){this.m0=[.5*(t[0]+e[0]),.5*(t[1]+e[1]),.5*(t[2]+e[2])];let r=.5*(e[0]+i[0]),s=.5*(e[1]+i[1]),n=.5*(e[2]+i[2]);this.m2=[.5*(i[0]+a[0]),.5*(i[1]+a[1]),.5*(i[2]+a[2])],this.m3=[.5*(this.m0[0]+r),.5*(this.m0[1]+s),.5*(this.m0[2]+n)],this.m4=[.5*(r+this.m2[0]),.5*(s+this.m2[1]),.5*(n+this.m2[2])],this.m5=[.5*(this.m3[0]+this.m4[0]),.5*(this.m3[1]+this.m4[1]),.5*(this.m3[2]+this.m4[2])]}}function iszero(t){return 0==t[0]&&0==t[1]&&0==t[2]}function unit(t){let e=1/(Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2])||1);return[t[0]*e,t[1]*e,t[2]*e]}function abs2(t){return t[0]*t[0]+t[1]*t[1]+t[2]*t[2]}function dot(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function cross(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function bezierPP(t,e,i){return[t[0]+i[0]-2*e[0],t[1]+i[1]-2*e[1],t[2]+i[2]-2*e[2]]}function bezierPPP(t,e,i,a){return[a[0]-t[0]+3*(e[0]-i[0]),a[1]-t[1]+3*(e[1]-i[1]),a[2]-t[2]+3*(e[2]-i[2])]}function Straightness(t,e,i,a){let r=[third*(a[0]-t[0]),third*(a[1]-t[1]),third*(a[2]-t[2])];return Math.max(abs2([e[0]-r[0]-t[0],e[1]-r[1]-t[1],e[2]-r[2]-t[2]]),abs2([a[0]-r[0]-i[0],a[1]-r[1]-i[1],a[2]-r[2]-i[2]]))}function Distance2(t,e,i){let a=dot([t[0]-e[0],t[1]-e[1],t[2]-e[2]],i);return a*a}function corners(t,e){return[t,[t[0],t[1],e[2]],[t[0],e[1],t[2]],[t[0],e[1],e[2]],[e[0],t[1],t[2]],[e[0],t[1],e[2]],[e[0],e[1],t[2]],e]}function COBTarget(t,e){mat4.fromTranslation(translMat,[center.x,center.y,center.z]),mat4.invert(cjMatInv,translMat),mat4.multiply(t,e,cjMatInv),mat4.multiply(t,translMat,t)}function setUniforms(t){let e=t==pixelShader;gl.usePro!
 gram(t),t.vertexPositionAttribute=gl.getAttribLocation(t,"position"),gl.enableVertexAttribArray(t.vertexPositionAttribute),e&&(t.vertexWidthAttribute=gl.getAttribLocation(t,"width"),gl.enableVertexAttribArray(t.vertexWidthAttribute)),t==noNormalShader||e||(t.vertexNormalAttribute=gl.getAttribLocation(t,"normal"),gl.enableVertexAttribArray(t.vertexNormalAttribute)),t.vertexMaterialAttribute=gl.getAttribLocation(t,"materialIndex"),gl.enableVertexAttribArray(t.vertexMaterialAttribute),t.projViewMatUniform=gl.getUniformLocation(t,"projViewMat"),t.viewMatUniform=gl.getUniformLocation(t,"viewMat"),t.normMatUniform=gl.getUniformLocation(t,"normMat"),t!=colorShader&&t!=transparentShader||(t.vertexColorAttribute=gl.getAttribLocation(t,"color"),gl.enableVertexAttribArray(t.vertexColorAttribute));for(let e=0;e<Materials.length;++e)Materials[e].setUniform(t,"Materials",e);for(let e=0;e<Lights.length;++e)Lights[e].setUniform(t,"Lights",e);gl.uniformMatrix4fv(t.projViewMatUniform,!1,projViewMat),gl.uniformMatrix4fv(t.viewMatUniform,!1,viewMat),gl.uniformMatrix3fv(t.normMatUniform,!1,normMat)}function handleMouseDown(t){mouseDownOrTouchActive=!0,lastMouseX=t.clientX,lastMouseY=t.clientY}let pinchStart,touchStartTime,pinch=!1;function pinchDistance(t){return Math.hypot(t[0].pageX-t[1].pageX,t[0].pageY-t[1].pageY)}function handleTouchStart(t){t.preventDefault();let e=t.targetTouches;swipe=rotate=pinch=!1,zooming||(1!=e.length||mouseDownOrTouchActive||(touchStartTime=(new Date).getTime(),touchId=e[0].identifier,lastMouseX=e[0].pageX,lastMouseY=e[0].pageY),2!=e.length||mouseDownOrTouchActive||(touchId=e[0].identifier,pinchStart=pinchDistance(e),pinch=!0))}function handleMouseUpOrTouchEnd(t){mouseDownOrTouchActive=!1}function rotateScene(t,e,i,a,r){if(t==i&&e==a)return;let[s,n]=arcball([t,-e],[i,-a]);mat4.fromRotation(rotMats,2*r*ArcballFactor*s/lastzoom,n),mat4.multiply(rotMat,rotMats,rotMat)}function shiftScene(t,e,i,a){let r=1/lastzoom;shift.x+=(i-t)*r*halfCanvasWidth,shift.y-=(a-e)*r*halfCanvasHeight}function panScene(t,e,i,a){!
 orthographic?shiftScene(t,e,i,a):(center.x+=(i-t)*(viewParam.xmax-viewParam.xmin),center.y-=(a-e)*(viewParam.ymax-viewParam.ymin))}function updateViewMatrix(){COBTarget(viewMat,rotMat),mat4.translate(viewMat,viewMat,[center.x,center.y,0]),mat3.fromMat4(viewMat3,viewMat),mat3.invert(normMat,viewMat3),mat4.multiply(projViewMat,projMat,viewMat)}function capzoom(){let t=Math.sqrt(Number.MAX_VALUE),e=1/t;Zoom<=e&&(Zoom=e),Zoom>=t&&(Zoom=t),Zoom!=lastzoom&&(remesh=!0),lastzoom=Zoom}function zoomImage(t){let e=zoomStep*halfCanvasHeight*t;const i=Math.log(.1*Number.MAX_VALUE)/Math.log(zoomFactor);Math.abs(e)<i&&(Zoom*=zoomFactor**e,capzoom())}function normMouse(t){let e=t[0],i=t[1],a=Math.hypot(e,i);return a>1&&(denom=1/a,e*=denom,i*=denom),[e,i,Math.sqrt(Math.max(1-i*i-e*e,0))]}function arcball(t,e){let i=normMouse(t),a=normMouse(e),r=dot(i,a);return r>1?r=1:r<-1&&(r=-1),[Math.acos(r),unit(cross(i,a))]}function zoomScene(t,e,i,a){zoomImage(e-a)}const DRAGMODE_ROTATE=1,DRAGMODE_SHIFT=2,DRAGMODE_ZOOM=3,DRAGMODE_PAN=4;function processDrag(t,e,i,a=1){let r;switch(i){case DRAGMODE_ROTATE:r=rotateScene;break;case DRAGMODE_SHIFT:r=shiftScene;break;case DRAGMODE_ZOOM:r=zoomScene;break;case DRAGMODE_PAN:r=panScene;break;default:r=((t,e,i,a)=>{})}r((lastMouseX-halfCanvasWidth)/halfCanvasWidth,(lastMouseY-halfCanvasHeight)/halfCanvasHeight,(t-halfCanvasWidth)/halfCanvasWidth,(e-halfCanvasHeight)/halfCanvasHeight,a),lastMouseX=t,lastMouseY=e,setProjection(),redraw=!0}function handleKey(t){let e=[];switch(t.key){case"x":e=[1,0,0];break;case"y":e=[0,1,0];break;case"z":e=[0,0,1];break;case"h":home();break;case"+":case"=":case">":expand();break;case"-":case"_":case"<":shrink()}e.length>0&&(mat4.rotate(rotMat,rotMat,.1,e),updateViewMatrix(),redraw=!0)}function handleMouseWheel(t){t.preventDefault(),t.deltaY<0?Zoom*=zoomFactor:Zoom/=zoomFactor,capzoom(),setProjection(),redraw=!0}function handleMouseMove(t){if(!mouseDownOrTouchActive)return;let e;processDrag(t.clientX,t.clientY,e=t.getModifierState("Control")?DRAGMODE_SHIFT:t.getModifier!
 State("Shift")?DRAGMODE_ZOOM:t.getModifierState("Alt")?DRAGMODE_PAN:DRAGMODE_ROTATE)}let indexExt,zooming=!1,swipe=!1,rotate=!1;function handleTouchMove(t){if(t.preventDefault(),zooming)return;let e=t.targetTouches;if(!pinch&&1==e.length&&touchId==e[0].identifier){let t=e[0].pageX,i=e[0].pageY,a=t-lastMouseX,r=i-lastMouseY,s=a*a+r*r<=shiftHoldDistance*shiftHoldDistance;if(s&&!swipe&&!rotate&&(new Date).getTime()-touchStartTime>shiftWaitTime&&(navigator.vibrate&&window.navigator.vibrate(vibrateTime),swipe=!0),swipe)processDrag(t,i,DRAGMODE_SHIFT);else if(!s){rotate=!0,processDrag(e[0].pageX,e[0].pageY,DRAGMODE_ROTATE,.5)}}if(pinch&&!swipe&&2==e.length&&touchId==e[0].identifier){let t=pinchDistance(e),i=t-pinchStart;zooming=!0,(i*=zoomPinchFactor)>zoomPinchCap&&(i=zoomPinchCap),i<-zoomPinchCap&&(i=-zoomPinchCap),zoomImage(i/size2),pinchStart=t,swipe=rotate=zooming=!1,setProjection(),redraw=!0}}function setBuffer(){positionBuffer=gl.createBuffer(),materialBuffer=gl.createBuffer(),colorBuffer=gl.createBuffer(),indexBuffer=gl.createBuffer(),indexExt=gl.getExtension("OES_element_index_uint")}let pixelShader,noNormalShader,materialShader,colorShader,transparentShader,zbuffer=[];function transformVertices(t){let e=viewMat[2],i=viewMat[6],a=viewMat[10];zbuffer.length=t.length;for(let r=0;r<t.length;++r){let s=6*r;zbuffer[r]=e*t[s]+i*t[s+1]+a*t[s+2]}}function draw(){gl.clearColor(Background[0],Background[1],Background[2],Background[3]),gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT),material0Data.clear(),material1Data.clear(),materialData.clear(),colorData.clear(),triangleData.clear(),transparentData.clear(),P.forEach(function(t){t.render()}),drawBuffer(material0Data,pixelShader),drawBuffer(material1Data,noNormalShader),drawBuffer(materialData,materialShader),drawBuffer(colorData,colorShader),drawBuffer(triangleData,transparentShader);let t=transparentData.indices;if(t.length>0){transformVertices(transparentData.vertices);let e=t.length/3,i=Array(e).fill().map((t,e)=>e);i.sort(function(e,i){let a=3*e;Ia=t[a],Ib=t[a+1],I!
 c=t[a+2];let r=3*i;return IA=t[r],IB=t[r+1],IC=t[r+2],zbuffer[Ia]+zbuffer[Ib]+zbuffer[Ic]<zbuffer[IA]+zbuffer[IB]+zbuffer[IC]?-1:1});let a=Array(t.length);for(let r=0;r<e;++r){let e=3*i[r];a[3*r]=t[e],a[3*r+1]=t[e+1],a[3*r+2]=t[e+2]}gl.depthMask(!1),drawBuffer(transparentData,transparentShader,a),gl.depthMask(!0)}remesh=!1}function tick(){requestAnimationFrame(tick),redraw&&(draw(),redraw=!1)}function setDimensions(t,e,i,a){let r=t/e,s=1/lastzoom,n=i/t*lastzoom,o=a/e*lastzoom;if(orthographic){let t=B[0]-b[0],e=B[1]-b[1];if(t<e*r){let t=.5*e*r*s,i=2*t*n,a=e*s*o;viewParam.xmin=-t-i,viewParam.xmax=t-i,viewParam.ymin=b[1]*s-a,viewParam.ymax=B[1]*s-a}else{let e=.5*t/(r*Zoom),i=t*s*n,a=2*e*o;viewParam.xmin=b[0]*s-i,viewParam.xmax=B[0]*s-i,viewParam.ymin=-e-a,viewParam.ymax=e-a}}else{let t=H*s,e=t*r,i=2*e*n,a=2*t*o;viewParam.xmin=-e-i,viewParam.xmax=e-i,viewParam.ymin=-t-a,viewParam.ymax=t-a}}function setProjection(){setDimensions(canvasWidth,canvasHeight,shift.x,shift.y),(orthographic?mat4.ortho:mat4.frustum)(projMat,viewParam.xmin,viewParam.xmax,viewParam.ymin,viewParam.ymax,-viewParam.zmax,-viewParam.zmin),updateViewMatrix()}function initProjection(){H=-Math.tan(.5*angle)*B[2],center.x=center.y=0,center.z=.5*(b[2]+B[2]),lastzoom=Zoom=Zoom0,viewParam.zmin=b[2],viewParam.zmax=B[2],shift.x=shift.y=0}function setViewport(){gl.viewportWidth=canvasWidth,gl.viewportHeight=canvasHeight,gl.viewport(0,0,gl.viewportWidth,gl.viewportHeight),home()}function setCanvas(){canvas.width=canvasWidth,canvas.height=canvasHeight,size2=Math.hypot(canvasWidth,canvasHeight),halfCanvasWidth=.5*canvasWidth,halfCanvasHeight=.5*canvasHeight}function setsize(t,e){t>maxViewportWidth&&(t=maxViewportWidth),e>maxViewportHeight&&(e=maxViewportHeight),shift.x*=t/canvasWidth,shift.y*=e/canvasHeight,canvasWidth=t,canvasHeight=e,setCanvas(),setViewport()}function expand(){setsize(canvasWidth*resizeStep+.5,canvasHeight*resizeStep+.5)}function shrink(){setsize(Math.max(canvasWidth/resizeStep+.5,1),Math.max(canvasHeight/resizeStep+.5,1))}function webGLStart!
 (){if(canvas=document.getElementById("Asymptote"),absolute)canvasWidth*=window.devicePixelRatio,canvasHeight*=window.devicePixelRatio;else{0==canvas.width&&(canvas.width=Math.max(window.innerWidth-windowTrim,windowTrim)),0==canvas.height&&(canvas.height=Math.max(window.innerHeight-windowTrim,windowTrim));let t=canvasWidth/canvasHeight;canvas.width>canvas.height*t?canvas.width=Math.min(canvas.height*t,canvas.width):canvas.height=Math.min(canvas.width/t,canvas.height),canvas.width>0&&(canvasWidth=canvas.width),canvas.height>0&&(canvasHeight=canvas.height)}setCanvas(),ArcballFactor=1+8*Math.hypot(viewportmargin[0],viewportmargin[1])/size2,initGL(),gl.enable(gl.BLEND),gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA),gl.enable(gl.DEPTH_TEST),setViewport(),noNormalShader=initShader(),pixelShader=initShader(["WIDTH"]),materialShader=initShader(["NORMAL"]),colorShader=initShader(["NORMAL","COLOR"]),transparentShader=initShader(["NORMAL","COLOR","TRANSPARENT"]),setBuffer(),canvas.onmousedown=handleMouseDown,document.onmouseup=handleMouseUpOrTouchEnd,document.onmousemove=handleMouseMove,canvas.onkeydown=handleKey,canvas.addEventListener("wheel",handleMouseWheel,!1),canvas.addEventListener("touchstart",handleTouchStart,!1),canvas.addEventListener("touchend",handleMouseUpOrTouchEnd,!1),canvas.addEventListener("touchcancel",handleMouseUpOrTouchEnd,!1),canvas.addEventListener("touchleave",handleMouseUpOrTouchEnd,!1),canvas.addEventListener("touchmove",handleTouchMove,!1),document.addEventListener("keydown",handleKey,!1),tick()}
+/*@license for gl-matrix mat3 and mat4 functions:
+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.*/
\ No newline at end of file

Modified: trunk/Build/source/utils/asymptote/bbox3.h
===================================================================
--- trunk/Build/source/utils/asymptote/bbox3.h	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/bbox3.h	2019-10-06 17:17:34 UTC (rev 52300)
@@ -10,6 +10,10 @@
 
 #include "triple.h"
 
+// For CYGWIN
+#undef near
+#undef far
+
 namespace camp {
 
 // The box that encloses a path
@@ -17,35 +21,35 @@
   bool empty;
   double left;
   double bottom;
-  double lower;
+  double near;
   double right;
   double top;
-  double upper;
+  double far;
   
   // Start bbox3 about the origin
   bbox3()
-    : empty(true), left(0.0), bottom(0.0), lower(0.0),
-      right(0.0), top(0.0), upper(0.0)
+    : empty(true), left(0.0), bottom(0.0), near(0.0),
+      right(0.0), top(0.0), far(0.0)
   {
   }
 
-  bbox3(double left, double bottom, double lower,
-        double right, double top, double upper)
-    : empty(false), left(left), bottom(bottom), lower(lower),
-      right(right), top(top), upper(upper)
+  bbox3(double left, double bottom, double near,
+        double right, double top, double far)
+    : empty(false), left(left), bottom(bottom), near(near),
+      right(right), top(top), far(far)
   {
   }
 
   // Start a bbox3 with a point
   bbox3(double x, double y, double z)
-    : empty(false), left(x), bottom(y), lower(z), right(x), top(y), upper(z)
+    : empty(false), left(x), bottom(y), near(z), right(x), top(y), far(z)
   {
   }
 
   // Start a bbox3 with a point
   bbox3(const triple& v)
-    : empty(false), left(v.getx()), bottom(v.gety()), lower(v.getz()),
-      right(v.getx()), top(v.gety()), upper(v.getz())
+    : empty(false), left(v.getx()), bottom(v.gety()), near(v.getz()),
+      right(v.getx()), top(v.gety()), far(v.getz())
   {
   }
 
@@ -52,8 +56,8 @@
   // Start a bbox3 with 2 points
   bbox3(const triple& m, const triple& M)
     : empty(false),
-      left(m.getx()), bottom(m.gety()), lower(m.getz()),
-      right(M.getx()),    top(M.gety()), upper(M.getz())
+      left(m.getx()), bottom(m.gety()), near(m.getz()),
+      right(M.getx()),    top(M.gety()), far(M.getz())
   {
   }
   
@@ -68,7 +72,7 @@
     if (empty) {
       left = right = x;
       top = bottom = y;
-      lower = upper = z;
+      near = far = z;
       empty = false;
     }
     else {
@@ -80,10 +84,10 @@
         bottom = y;
       else if(y > top)
         top = y;
-      if(z < lower)
-        lower = z;
-      else if(z > upper)
-        upper = z;
+      if(z < near)
+        near = z;
+      else if(z > far)
+        far = z;
     }
   }
 
@@ -98,12 +102,27 @@
       bottom = y;
     else if(y > top)
       top = y;
-    if(z < lower)
-      lower = z;
-    else if(z > upper)
-      upper = z;
+    if(z < near)
+      near = z;
+    else if(z > far)
+      far = z;
   }
 
+  // Add (x,y) pair to a nonempty bbox3
+  void addnonempty(pair v)
+  {
+    double x=v.getx();
+    if(x < left)
+      left = x;  
+    else if(x > right)
+      right = x;  
+    double y=v.gety();
+    if(y < bottom)
+      bottom = y;
+    else if(y > top)
+      top = y;
+  }
+
   // Add a point to a nonempty bbox3
   void addnonempty(const triple& v)
   {
@@ -131,13 +150,13 @@
       top = y;
       times.top = t;
     }
-    if(z < lower) {
-      lower = z;
-      times.lower=t;
+    if(z < near) {
+      near = z;
+      times.near=t;
     }
-    else if(z > upper) {
-      upper = z;
-      times.upper=t;
+    else if(z > far) {
+      far = z;
+      times.far=t;
     }
   }
 
@@ -148,34 +167,21 @@
   }
 
   triple Min() const {
-    return triple(left,bottom,lower);
+    return triple(left,bottom,near);
   }
   
   triple Max() const {
-    return triple(right,top,upper);
+    return triple(right,top,far);
   }
   
-  // transform bbox3 by 4x4 matrix
-  void transform(const double* m)
-  {
-    const double xmin = left;
-    const double ymin = bottom;
-    const double zmin = lower;
-    const double xmax = right;
-    const double ymax = top;
-    const double zmax = upper;
-    
-    empty = true;
-    add(m*triple(xmin,ymin,zmin));
-    addnonempty(m*triple(xmin,ymin,zmax));
-    addnonempty(m*triple(xmin,ymax,zmin));
-    addnonempty(m*triple(xmin,ymax,zmax));
-    addnonempty(m*triple(xmax,ymin,zmin));
-    addnonempty(m*triple(xmax,ymin,zmax));
-    addnonempty(m*triple(xmax,ymax,zmin));
-    addnonempty(m*triple(xmax,ymax,zmax));
+  pair Min2() const {
+    return pair(left,bottom);
   }
   
+  pair Max2() const {
+    return pair(right,top);
+  }
+  
   friend ostream& operator << (ostream& out, const bbox3& b)
   {
     out << "Min " << b.Min() << " Max " << b.Max();

Modified: trunk/Build/source/utils/asymptote/beziercurve.cc
===================================================================
--- trunk/Build/source/utils/asymptote/beziercurve.cc	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/beziercurve.cc	2019-10-06 17:17:34 UTC (rev 52300)
@@ -12,30 +12,28 @@
 
 #ifdef HAVE_GL
 
-extern GLint noNormalShader;
-extern GLint pixelShader;
-extern void setUniforms(GLint shader); 
-
-std::vector<vertexData1> BezierCurve::vertexbuffer;
-std::vector<GLuint> BezierCurve::indices;
-
-std::vector<pixelData> Pixel::vertexbuffer;
-
-GLuint BezierCurve::vertsBufferIndex;
-GLuint BezierCurve::elemBufferIndex;
-
-void BezierCurve::init(double res, const triple& Min, const triple& Max)
+void BezierCurve::init(double res)
 {
   this->res=res;
   res2=res*res;
-  this->Min=Min;
-  this->Max=Max;
+  
+  MaterialIndex=materialIndex;
+}
 
-  const size_t nbuffer=10000;
-  vertexbuffer.reserve(nbuffer);
-  indices.reserve(nbuffer);
+void BezierCurve::render(const triple *p, bool straight) 
+{
+  GLuint i0=data.vertex1(p[0]);
+  GLuint i3=data.vertex1(p[3]);
+    
+  if(straight) {
+    std::vector<GLuint> &q=data.indices;
+    q.push_back(i0);
+    q.push_back(i3);
+  } else
+    render(p,i0,i3);
+  append();
 }
-
+  
 // Use a uniform partition to draw a Bezier patch.
 // p is an array of 4 triples representing the control points.
 // Ii are the vertices indices.
@@ -45,11 +43,12 @@
   triple p1=p[1];
   triple p2=p[2];
   triple p3=p[3];
-  if(Distance1(p0,p1,p2,p3) < res2) { // Segment is flat
+  if(Straightness(p0,p1,p2,p3) < res2) { // Segment is flat
     triple P[]={p0,p3};
     if(!offscreen(2,P)) {
-      indices.push_back(I0);
-      indices.push_back(I1);
+      std::vector<GLuint> &q=data.indices;
+      q.push_back(I0);
+      q.push_back(I1);
     }
   } else { // Segment is not flat
     if(offscreen(4,p)) return;
@@ -63,7 +62,7 @@
     triple s0[]={p0,m0,m3,m5};
     triple s1[]={m5,m4,m2,p3};
       
-    GLuint i0=vertex(m5);
+    GLuint i0=data.vertex1(m5);
       
     render(s0,I0,i0);
     render(s1,i0,I1);
@@ -70,113 +69,6 @@
   }
 }
 
-void BezierCurve::render(const triple *p, bool straight) 
-{
-  GLuint i0=vertex(p[0]);
-  GLuint i3=vertex(p[3]);
-    
-  if(straight) {
-    indices.push_back(i0);
-    indices.push_back(i3);
-  } else
-    render(p,i0,i3);
-}
-  
-void BezierCurve::draw()
-{
-  if(indices.size() == 0)
-    return;
-  
-  const size_t size=sizeof(GLfloat);
-  static const size_t bytestride=sizeof(vertexData1);
-
-  GLuint vao;
-  glGenVertexArrays(1,&vao);
-  glBindVertexArray(vao);
-  createBuffers();
-    
-  camp::setUniforms(noNormalShader);
-  
-  const GLint posAttrib=glGetAttribLocation(noNormalShader, "position");
-  const GLint materialAttrib=glGetAttribLocation(noNormalShader,"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);
-  
-  glDeleteBuffers(1,&vertsBufferIndex);
-  glDeleteBuffers(1,&elemBufferIndex);
-}
-
-void Pixel::queue(const triple& p, double width)
-{
-  vertex(p,width);
-}
-
-void Pixel::draw()
-{
-  if(vertexbuffer.size() == 0)
-    return;
-
-  const size_t size=sizeof(GLfloat);
-  static const size_t bytestride=sizeof(pixelData);
-
-  GLuint vbo;
-  glGenBuffers(1,&vbo);
-  
-  GLuint vao;
-  glGenVertexArrays(1,&vao);
-  glBindVertexArray(vao);
-
-  camp::setUniforms(pixelShader); 
-  
-  const GLint posAttrib=glGetAttribLocation(pixelShader, "position");
-  const GLint materialAttrib=glGetAttribLocation(pixelShader,"material");
-  const GLint widthAttrib=glGetAttribLocation(pixelShader,"width");
-
-  glBindBuffer(GL_ARRAY_BUFFER,vbo);
-  glBufferData(GL_ARRAY_BUFFER,bytestride*vertexbuffer.size(),vertexbuffer.data(),GL_STATIC_DRAW);
-
-  glVertexAttribPointer(posAttrib,3,GL_FLOAT,GL_FALSE,bytestride,(void*)(0));
-  glEnableVertexAttribArray(posAttrib);
-  
-  glVertexAttribIPointer(materialAttrib,1,GL_INT,bytestride,(void *) (3*size));
-  glEnableVertexAttribArray(materialAttrib);
-  
-  glVertexAttribPointer(widthAttrib,1,GL_FLOAT,GL_FALSE,bytestride,(void *) (4*size));
-  glEnableVertexAttribArray(widthAttrib);
-  
-  glDrawArrays(GL_POINTS,0,vertexbuffer.size());
-
-  glDisableVertexAttribArray(posAttrib);
-  glDisableVertexAttribArray(materialAttrib);
-  glDisableVertexAttribArray(widthAttrib);
-  
-  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-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/beziercurve.h	2019-10-06 17:17:34 UTC (rev 52300)
@@ -17,116 +17,66 @@
 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;
-  }
-};
-
-class pixelData {
-public:
-  GLfloat position[3];
-  GLint  material;
-  GLfloat width;
-  pixelData() {};
-  pixelData(const triple& v, double width) : width(width) {
-    position[0]=v.getx();
-    position[1]=v.gety();
-    position[2]=v.getz();
-    material=drawElement::materialIndex;
-  }
-};
-
 struct BezierCurve
 {
-  static std::vector<vertexData1> vertexbuffer;
-  static std::vector<GLuint> indices;
+  vertexBuffer data;
   double res,res2;
-  triple Min,Max;
-
-  static GLuint vertsBufferIndex; 
-  static GLuint elemBufferIndex; 
+  bool Onscreen;
   
-  void init(double res, const triple& Min, const triple& Max);
+  void init(double res);
     
-// Store the vertex v in the buffer.
-  static GLuint vertex(const triple &v) {
-    size_t nvertices=vertexbuffer.size();
-    vertexbuffer.push_back(vertexData1(v));
-    return nvertices;
+  // Approximate bounds by bounding box of control polyhedron.
+  bool offscreen(size_t n, const triple *v) {
+    if(bbox2(n,v).offscreen()) {
+      Onscreen=false;
+      return true;
+    }
+    return false;
   }
-  
-  void createBuffers() {
-    glGenBuffers(1,&vertsBufferIndex);
-    glGenBuffers(1,&elemBufferIndex);
 
-    //vbo
-    registerBuffer(vertexbuffer,vertsBufferIndex);
-
-    //ebo
-    registerBuffer(indices,elemBufferIndex);
-  }
+  void render(const triple *p, bool straight);
+  void render(const triple *p, GLuint I0, GLuint I1);
   
-// Approximate bounds by bounding box of control polyhedron.
-  bool offscreen(size_t n, const triple *v) {
-    double x,y,z;
-    double X,Y,Z;
+  void append() {
+    material1Data.append1(data);
     
-    boundstriples(x,y,z,X,Y,Z,n,v);
-    return
-      X < Min.getx() || x > Max.getx() ||
-      Y < Min.gety() || y > Max.gety() ||
-      Z < Min.getz() || z > Max.getz();
+    if(material1Data.vertices1.size() >= gl::maxvertices) {
+      drawBuffer(material1Data,noNormalShader);
+      material1Data.clear();
+      gl::forceRemesh=true;
+    }
   }
   
-  static void clear() {
-    vertexbuffer.clear();
-    indices.clear();
-  }
-  
-  ~BezierCurve() {}
-  
-  void render(const triple *p, GLuint I0, GLuint I1);
-  void render(const triple *p, bool straight);
-  
-  void queue(const triple *g, bool straight, double ratio,
-              const triple& Min, const triple& Max) {
-    init(pixel*ratio,Min,Max);
+  void queue(const triple *g, bool straight, double ratio) {
+    data.clear();
+    Onscreen=true;
+    init(pixel*ratio);
     render(g,straight);
   }
   
-  void draw();
-  void draw(const triple *g, bool straight, double ratio,
-            const triple& Min, const triple& Max) {
-    queue(g,straight,ratio,Min,Max);
-    draw();
-  }
 };
 
 struct Pixel
 {
-  static std::vector<pixelData> vertexbuffer;
+  vertexBuffer data;
   
-// Store the vertex v in the buffer.
-  static void vertex(const triple &v, double width) {
-    vertexbuffer.push_back(pixelData(v,width));
+  void append() {
+    material0Data.append0(data);
+    
+    if(material0Data.vertices0.size() >= gl::maxvertices) {
+      drawBuffer(material0Data,pixelShader);
+      material0Data.clear();
+      gl::forceRemesh=true;
+    }
   }
   
-  static void clear() {
-    vertexbuffer.clear();
+  void queue(const triple& p, double width) {
+    data.clear();
+    MaterialIndex=materialIndex;
+    data.indices.push_back(data.vertex0(p,width));
+    append();
   }
   
-  Pixel() {}
-  ~Pixel() {}
-  
-  void queue(const triple& p, double width);
   void draw();
 };
 

Modified: trunk/Build/source/utils/asymptote/bezierpatch.cc
===================================================================
--- trunk/Build/source/utils/asymptote/bezierpatch.cc	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/bezierpatch.cc	2019-10-06 17:17:34 UTC (rev 52300)
@@ -15,25 +15,10 @@
 
 #ifdef HAVE_GL
 
-extern GLint materialShader;
-extern GLint colorShader;
-extern void setUniforms(GLint shader); 
+int MaterialIndex;
 
-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<GLuint> BezierPatch::tIndices;
-
-GLuint BezierPatch::nvertices=0;
-GLuint BezierPatch::Nvertices=0;
-GLuint BezierPatch::Ntvertices=0;
-
-//std::vector<GLuint>& I=BezierPatch::tIndices;
-//std::vector<VertexData>& V=BezierPatch::tVertexbuffer;
+//std::vector<GLuint>& I=transparentData.Indices;
+//std::vector<VertexData>& V=transparentData.Vertices;
 bool colors;
 
 std::vector<GLfloat> zbuffer;
@@ -40,8 +25,8 @@
 std::vector<GLfloat> xbuffer;
 std::vector<GLfloat> ybuffer;
 
-std::vector<GLfloat> xmin,ymin,zmin;
-std::vector<GLfloat> xmax,ymax,zmax;
+//std::vector<GLfloat> xmin,ymin,zmin;
+//std::vector<GLfloat> xmax,ymax,zmax;
 std::vector<GLfloat> zsum;
 
 inline double min(double a, double b, double c)
@@ -276,11 +261,11 @@
     interp(cd,ca,cb,td);
     interp(ce,ca,cc,te);
         
-    id=BezierPatch::tVertex(d,nd,cd);
-    ie=BezierPatch::tVertex(e,ne,ce);
+    id=data.Vertex(d,nd,cd);
+    ie=data.Vertex(e,ne,ce);
   } else {
-    id=BezierPatch::tVertex(d,nd);
-    ie=BezierPatch::tVertex(e,ne);
+    id=data.Vertex(d,nd);
+    ie=data.Vertex(e,ne);
   }
       
   I[i3]=ia;
@@ -297,37 +282,96 @@
 }
 #endif
 
-void BezierPatch::init(double res, const triple& Min, const triple& Max,
-                       bool transparent, GLfloat *colors)
+void BezierPatch::init(double res)
 {
   res2=res*res;
   Res2=BezierFactor*BezierFactor*res2;
   Epsilon=FillFactor*res;
 
-  this->Min=Min;
-  this->Max=Max;
+  MaterialIndex=transparent ?
+    (color ? -1-materialIndex : 1+materialIndex) : materialIndex;
+  
+  pvertex=transparent ? &vertexBuffer::tvertex : &vertexBuffer::vertex;
+}
+    
+void BezierPatch::render(const triple *p, bool straight, GLfloat *c0)
+{
+  triple p0=p[0];
+  epsilon=0;
+  for(unsigned i=1; i < 16; ++i)
+    epsilon=max(epsilon,abs2(p[i]-p0));
+  epsilon *= Fuzz4;
+    
+  triple p3=p[3];
+  triple p12=p[12];
+  triple p15=p[15];
 
-  if(transparent) {
-    tVertexbuffer.reserve(nbuffer);
-    tIndices.reserve(nbuffer);
-    pindices=&tIndices;
-    pvertex=&tvertex;
-    pVertex=&tVertex;
+  triple n0=normal(p3,p[2],p[1],p0,p[4],p[8],p12);
+  if(n0 == 0.0) {
+    n0=normal(p3,p[2],p[1],p0,p[13],p[14],p15);
+    if(n0 == 0.0) n0=normal(p15,p[11],p[7],p3,p[4],p[8],p12);
+  }
+  
+  triple n1=normal(p0,p[4],p[8],p12,p[13],p[14],p15);
+  if(n1 == 0.0) {
+    n1=normal(p0,p[4],p[8],p12,p[11],p[7],p3);
+    if(n1 == 0.0) n1=normal(p3,p[2],p[1],p0,p[13],p[14],p15);
+  }
+    
+  triple n2=normal(p12,p[13],p[14],p15,p[11],p[7],p3);
+  if(n2 == 0.0) {
+    n2=normal(p12,p[13],p[14],p15,p[2],p[1],p0);
+    if(n2 == 0.0) n2=normal(p0,p[4],p[8],p12,p[11],p[7],p3);
+  }
+    
+  triple n3=normal(p15,p[11],p[7],p3,p[2],p[1],p0);
+  if(n3 == 0.0) {
+    n3=normal(p15,p[11],p[7],p3,p[4],p[8],p12);
+    if(n3 == 0.0) n3=normal(p12,p[13],p[14],p15,p[2],p[1],p0);
+  }
+    
+  GLuint i0,i1,i2,i3;
+  if(color) {
+    GLfloat *c1=c0+4;
+    GLfloat *c2=c0+8;
+    GLfloat *c3=c0+12;
+    
+    i0=data.Vertex(p0,n0,c0);
+    i1=data.Vertex(p12,n1,c1);
+    i2=data.Vertex(p15,n2,c2);
+    i3=data.Vertex(p3,n3,c3);
+      
+    if(!straight)
+      render(p,i0,i1,i2,i3,p0,p12,p15,p3,false,false,false,false,
+             c0,c1,c2,c3);
   } else {
-    if(colors) {
-      Vertexbuffer.reserve(nbuffer);
-      Indices.reserve(nbuffer);
-      pindices=&Indices;
-      pVertex=&Vertex;
-    } else {
-      vertexbuffer.reserve(nbuffer);
-      indices.reserve(nbuffer);
-      pindices=&indices;
-      pvertex=&vertex;
+    i0=(data.*pvertex)(p0,n0);
+    i1=(data.*pvertex)(p12,n1);
+    i2=(data.*pvertex)(p15,n2);
+    i3=(data.*pvertex)(p3,n3);
+    
+    if(!straight)
+      render(p,i0,i1,i2,i3,p0,p12,p15,p3,false,false,false,false);
+  }
+    
+  if(straight) {
+    std::vector<GLuint> &q=data.indices;
+    triple Pa[]={p0,p12,p15};
+    if(!offscreen(3,Pa)) {
+      q.push_back(i0);
+      q.push_back(i1);
+      q.push_back(i2);
     }
+    triple Pb[]={p0,p15,p3};
+    if(!offscreen(3,Pb)) {
+      q.push_back(i0);
+      q.push_back(i2);
+      q.push_back(i3);
+    }
   }
+  append();
 }
-    
+
 // Use a uniform partition to draw a Bezier patch.
 // p is an array of 16 triples representing the control points.
 // Pi are the (possibly) adjusted vertices indexed by Ii.
@@ -338,19 +382,22 @@
                          bool flat0, bool flat1, bool flat2, bool flat3,
                          GLfloat *C0, GLfloat *C1, GLfloat *C2, GLfloat *C3)
 {
-  if(Distance(p) < res2) { // Patch is flat
-    triple P[]={P0,P1,P2,P3};
-    if(!offscreen(4,P)) {
-      std::vector<GLuint> &p=*pindices;
-      p.push_back(I0);
-      p.push_back(I1);
-      p.push_back(I2);
-      p.push_back(I0);
-      p.push_back(I2);
-      p.push_back(I3);
+  if(Distance(p) < res2) { // Bezier patch is flat
+    triple Pa[]={P0,P1,P2};
+    std::vector<GLuint> &q=data.indices;
+    if(!offscreen(3,Pa)) {
+      q.push_back(I0);
+      q.push_back(I1);
+      q.push_back(I2);
     }
+    triple Pb[]={P0,P2,P3};
+    if(!offscreen(3,Pb)) {
+      q.push_back(I0);
+      q.push_back(I2);
+      q.push_back(I3);
+    }
   } else { // Patch is not flat
-    if(offscreen(16,p)) return;
+   if(offscreen(16,p)) return;
     /* Control points are indexed as follows:
          
        Coordinate
@@ -484,7 +531,7 @@
       else m3=s3[0];
     }
       
-    if(C0) {
+    if(color) {
       GLfloat c0[4],c1[4],c2[4],c3[4],c4[4];
       for(size_t i=0; i < 4; ++i) {
         c0[i]=0.5*(C0[i]+C1[i]);
@@ -494,11 +541,12 @@
         c4[i]=0.5*(c0[i]+c2[i]);
       }
       
-      GLuint i0=pVertex(m0,n0,c0);
-      GLuint i1=pVertex(m1,n1,c1);
-      GLuint i2=pVertex(m2,n2,c2);
-      GLuint i3=pVertex(m3,n3,c3);
-      GLuint i4=pVertex(m4,n4,c4);
+      GLuint i0=data.Vertex(m0,n0,c0);
+      GLuint i1=data.Vertex(m1,n1,c1);
+      GLuint i2=data.Vertex(m2,n2,c2);
+      GLuint i3=data.Vertex(m3,n3,c3);
+      GLuint i4=data.Vertex(m4,n4,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,
@@ -508,11 +556,12 @@
       render(s3,i3,i4,i2,I3,m3,m4,m2,P3,false,false,flat2,flat3,
              c3,c4,c2,C3);
     } else {
-      GLuint i0=pvertex(m0,n0);
-      GLuint i1=pvertex(m1,n1);
-      GLuint i2=pvertex(m2,n2);
-      GLuint i3=pvertex(m3,n3);
-      GLuint i4=pvertex(m4,n4);
+      GLuint i0=(data.*pvertex)(m0,n0);
+      GLuint i1=(data.*pvertex)(m1,n1);
+      GLuint i2=(data.*pvertex)(m2,n2);
+      GLuint i3=(data.*pvertex)(m3,n3);
+      GLuint i4=(data.*pvertex)(m4,n4);
+      
       render(s0,I0,i0,i4,i3,P0,m0,m4,m3,flat0,false,false,flat3);
       render(s1,i0,I1,i1,i4,m0,P1,m1,m4,flat0,flat1,false,false);
       render(s2,i4,i1,I2,i2,m4,m1,P2,m2,false,flat1,flat2,false);
@@ -521,68 +570,52 @@
   }
 }
 
-void BezierPatch::render(const triple *p, bool straight, GLfloat *c0)
+void BezierTriangle::render(const triple *p, bool straight, GLfloat *c0)
 {
   triple p0=p[0];
   epsilon=0;
-  for(unsigned i=1; i < 16; ++i)
+  for(int i=1; i < 10; ++i)
     epsilon=max(epsilon,abs2(p[i]-p0));
   
   epsilon *= Fuzz4;
     
-  triple p3=p[3];
-  triple p12=p[12];
-  triple p15=p[15];
-
-  triple n0=normal(p3,p[2],p[1],p0,p[4],p[8],p12);
-  if(n0 == 0.0) n0=normal(p3,p[2],p[1],p0,p[13],p[14],p15);
-  if(n0 == 0.0) n0=normal(p15,p[11],p[7],p3,p[4],p[8],p12);
+  triple p6=p[6];
+  triple p9=p[9];
     
-  triple n1=normal(p0,p[4],p[8],p12,p[13],p[14],p15);
-  if(n1 == 0.0) n1=normal(p0,p[4],p[8],p12,p[11],p[7],p3);
-  if(n1 == 0.0) n1=normal(p3,p[2],p[1],p0,p[13],p[14],p15);
+  triple n0=normal(p9,p[5],p[2],p0,p[1],p[3],p6);
+  triple n1=normal(p0,p[1],p[3],p6,p[7],p[8],p9);    
+  triple n2=normal(p6,p[7],p[8],p9,p[5],p[2],p0);
     
-  triple n2=normal(p12,p[13],p[14],p15,p[11],p[7],p3);
-  if(n2 == 0.0) n2=normal(p12,p[13],p[14],p15,p[2],p[1],p0);
-  if(n2 == 0.0) n2=normal(p0,p[4],p[8],p12,p[11],p[7],p3);
-    
-  triple n3=normal(p15,p[11],p[7],p3,p[2],p[1],p0);
-  if(n3 == 0.0) n3=normal(p15,p[11],p[7],p3,p[4],p[8],p12);
-  if(n3 == 0.0) n3=normal(p12,p[13],p[14],p15,p[2],p[1],p0);
-    
-  GLuint I0,I1,I2,I3;
-    
-  if(c0) {
+  GLuint i0,i1,i2;
+  if(color) {
     GLfloat *c1=c0+4;
     GLfloat *c2=c0+8;
-    GLfloat *c3=c0+12;
     
-    I0=pVertex(p0,n0,c0);
-    I1=pVertex(p12,n1,c1);
-    I2=pVertex(p15,n2,c2);
-    I3=pVertex(p3,n3,c3);
-      
+    i0=data.Vertex(p0,n0,c0);
+    i1=data.Vertex(p6,n1,c1);
+    i2=data.Vertex(p9,n2,c2);
+    
     if(!straight)
-      render(p,I0,I1,I2,I3,p0,p12,p15,p3,false,false,false,false,
-             c0,c1,c2,c3);
+      render(p,i0,i1,i2,p0,p6,p9,false,false,false,c0,c1,c2);
   } else {
-    I0=pvertex(p0,n0);
-    I1=pvertex(p12,n1);
-    I2=pvertex(p15,n2);
-    I3=pvertex(p3,n3);
+    i0=(data.*pvertex)(p0,n0);
+    i1=(data.*pvertex)(p6,n1);
+    i2=(data.*pvertex)(p9,n2);
     
     if(!straight)
-      render(p,I0,I1,I2,I3,p0,p12,p15,p3,false,false,false,false);
+      render(p,i0,i1,i2,p0,p6,p9,false,false,false);
   }
     
   if(straight) {
-    pindices->push_back(I0);
-    pindices->push_back(I1);
-    pindices->push_back(I2);
-    pindices->push_back(I0);
-    pindices->push_back(I2);
-    pindices->push_back(I3);
+    triple P[]={p0,p6,p9};
+    if(!offscreen(3,P)) {
+      std::vector<GLuint> &q=data.indices;
+      q.push_back(i0);
+      q.push_back(i1);
+      q.push_back(i2);
+    }
   }
+  append();
 }
 
 // Use a uniform partition to draw a Bezier triangle.
@@ -595,13 +628,13 @@
                             bool flat0, bool flat1, bool flat2,
                             GLfloat *C0, GLfloat *C1, GLfloat *C2)
 {
-  if(Distance(p) < Res2) { // Triangle is flat
+  if(Distance(p) < Res2) { // Bezier triangle is flat
     triple P[]={P0,P1,P2};
     if(!offscreen(3,P)) {
-      std::vector<GLuint> &p=*pindices;
-      p.push_back(I0);
-      p.push_back(I1);
-      p.push_back(I2);
+      std::vector<GLuint> &q=data.indices;
+      q.push_back(I0);
+      q.push_back(I1);
+      q.push_back(I2);
     }
   } else { // Triangle is not flat
     if(offscreen(10,p)) return;
@@ -727,103 +760,59 @@
     // 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.
     
-    triple p0=0.5*(P1+P2);
+    triple m0=0.5*(P1+P2);
     if(!flat0) {
       if((flat0=Straightness(r300,p210,p120,u030) < res2))
-        p0 -= Epsilon*unit(derivative(c[0],c[2],c[5],c[9])+
+        m0 -= Epsilon*unit(derivative(c[0],c[2],c[5],c[9])+
                            derivative(c[0],c[1],c[3],c[6]));
-      else p0=r030;
+      else m0=r030;
     }
 
-    triple p1=0.5*(P2+P0);
+    triple m1=0.5*(P2+P0);
     if(!flat1) {
       if((flat1=Straightness(l003,p012,p021,u030) < res2))
-        p1 -= Epsilon*unit(derivative(c[6],c[3],c[1],c[0])+
+        m1 -= Epsilon*unit(derivative(c[6],c[3],c[1],c[0])+
                            derivative(c[6],c[7],c[8],c[9]));
-      else p1=l030;
+      else m1=l030;
     }
 
-    triple p2=0.5*(P0+P1);
+    triple m2=0.5*(P0+P1);
     if(!flat2) {
       if((flat2=Straightness(l003,p102,p201,r300) < res2))
-        p2 -= Epsilon*unit(derivative(c[9],c[8],c[7],c[6])+
+        m2 -= Epsilon*unit(derivative(c[9],c[8],c[7],c[6])+
                            derivative(c[9],c[5],c[2],c[0]));
-      else p2=l300;
+      else m2=l300;
     }
 
-    if(C0) {
+    if(color) {
       GLfloat c0[4],c1[4],c2[4];
       for(int i=0; i < 4; ++i) {
         c0[i]=0.5*(C1[i]+C2[i]);
-        c1[i]=0.5*(C0[i]+C2[i]);
+        c1[i]=0.5*(C2[i]+C0[i]);
         c2[i]=0.5*(C0[i]+C1[i]);
       }
       
-      GLuint i0=pVertex(p0,n0,c0);
-      GLuint i1=pVertex(p1,n1,c1);
-      GLuint i2=pVertex(p2,n2,c2);
+      GLuint i0=data.Vertex(m0,n0,c0);
+      GLuint i1=data.Vertex(m1,n1,c1);
+      GLuint i2=data.Vertex(m2,n2,c2);
           
-      render(l,I0,i2,i1,P0,p2,p1,false,flat1,flat2,C0,c2,c1);
-      render(r,i2,I1,i0,p2,P1,p0,flat0,false,flat2,c2,C1,c0);
-      render(u,i1,i0,I2,p1,p0,P2,flat0,flat1,false,c1,c0,C2);
-      render(c,i0,i1,i2,p0,p1,p2,false,false,false,c0,c1,c2);
+      render(l,I0,i2,i1,P0,m2,m1,false,flat1,flat2,C0,c2,c1);
+      render(r,i2,I1,i0,m2,P1,m0,flat0,false,flat2,c2,C1,c0);
+      render(u,i1,i0,I2,m1,m0,P2,flat0,flat1,false,c1,c0,C2);
+      render(c,i0,i1,i2,m0,m1,m2,false,false,false,c0,c1,c2);
     } else {
-      GLuint i0=pvertex(p0,n0);
-      GLuint i1=pvertex(p1,n1);
-      GLuint i2=pvertex(p2,n2);
+      GLuint i0=(data.*pvertex)(m0,n0);
+      GLuint i1=(data.*pvertex)(m1,n1);
+      GLuint i2=(data.*pvertex)(m2,n2);
           
-      render(l,I0,i2,i1,P0,p2,p1,false,flat1,flat2);
-      render(r,i2,I1,i0,p2,P1,p0,flat0,false,flat2);
-      render(u,i1,i0,I2,p1,p0,P2,flat0,flat1,false);
-      render(c,i0,i1,i2,p0,p1,p2,false,false,false);
+      render(l,I0,i2,i1,P0,m2,m1,false,flat1,flat2);
+      render(r,i2,I1,i0,m2,P1,m0,flat0,false,flat2);
+      render(u,i1,i0,I2,m1,m0,P2,flat0,flat1,false);
+      render(c,i0,i1,i2,m0,m1,m2,false,false,false);
     }
   }
 }
 
-void BezierTriangle::render(const triple *p, bool straight, GLfloat *c0)
-{
-  triple p0=p[0];
-  epsilon=0;
-  for(int i=1; i < 10; ++i)
-    epsilon=max(epsilon,abs2(p[i]-p0));
-  
-  epsilon *= Fuzz4;
-    
-  GLuint I0,I1,I2;
-    
-  triple p6=p[6];
-  triple p9=p[9];
-    
-  triple n0=normal(p9,p[5],p[2],p0,p[1],p[3],p6);
-  triple n1=normal(p0,p[1],p[3],p6,p[7],p[8],p9);    
-  triple n2=normal(p6,p[7],p[8],p9,p[5],p[2],p0);
-    
-  if(c0) {
-    GLfloat *c1=c0+4;
-    GLfloat *c2=c0+8;
-    
-    I0=pVertex(p0,n0,c0);
-    I1=pVertex(p6,n1,c1);
-    I2=pVertex(p9,n2,c2);
-    
-    if(!straight)
-      render(p,I0,I1,I2,p0,p6,p9,false,false,false,c0,c1,c2);
-  } else {
-    I0=pvertex(p0,n0);
-    I1=pvertex(p6,n1);
-    I2=pvertex(p9,n2);
-    
-    if(!straight)
-      render(p,I0,I1,I2,p0,p6,p9,false,false,false);
-  }
-    
-  if(straight) {
-    pindices->push_back(I0);
-    pindices->push_back(I1);
-    pindices->push_back(I2);
-  }
-}
-
 void transform(const std::vector<VertexData>& b)
 {
   unsigned n=b.size();
@@ -833,12 +822,11 @@
   
   for(unsigned i=0; i < n; ++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]*v[0]+Tz[1]*v[1]+Tz[2]*v[2];
+    zbuffer[i]=TransformZ(triple(v[0],v[1],v[2]),gl::dprojView);
   }
 }
 
+#if 0
 // precompute min and max bounds of each triangle
 void bounds(const std::vector<GLuint>& I)
 {
@@ -886,222 +874,72 @@
     zmax[i]=max(za,zb,zc);
   }
 }
+#endif
   
-void BezierPatch::drawMaterials()
+void sortTriangles()
 {
-  if(indices.size() == 0)
-    return;
-  
-  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(materialShader); 
-
-  const GLint posAttrib=glGetAttribLocation(materialShader,"position");
-  const GLint normalAttrib=glGetAttribLocation(materialShader,"normal");
-  const GLint materialAttrib=glGetAttribLocation(materialShader,"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(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);
-  
-  glDeleteBuffers(1,&vertsBufferIndex);
-  glDeleteBuffers(1,&elemBufferIndex);
+  if(!transparentData.indices.empty()) {
+    transform(transparentData.Vertices);
+//    bounds(tIndices);
+    qsort(&transparentData.indices[0],transparentData.indices.size()/3,
+          3*sizeof(GLuint),compare);
+  }
 }
 
-void BezierPatch::drawColors(GLuint& Nvertices,
-                             std::vector<VertexData>& Vertexbuffer,
-                             std::vector<GLuint>& Indices)
+void Triangles::queue(size_t nP, const triple* P, size_t nN, const triple* N,
+                      size_t nC, const prc::RGBAColour* C, size_t nI,
+                      const uint32_t (*PP)[3], const uint32_t (*NN)[3],
+                      const uint32_t (*CC)[3], bool Transparent)
 {
-  if(Indices.size() == 0)
-    return;
-
-  static const size_t size=sizeof(GLfloat);
-  static const size_t bytestride=sizeof(VertexData);
-
-  GLuint vertsBufferIndex; 
-  GLuint elemBufferIndex; 
+  if(!nN) return;
   
-  GLuint vao;
+  data.clear();
+  Onscreen=true;
+  transparent=Transparent;
   
-  glGenVertexArrays(1,&vao);
-  glBindVertexArray(vao);
-
-  glGenBuffers(1,&vertsBufferIndex);
-  glGenBuffers(1,&elemBufferIndex);
+  data.Vertices.resize(nP);
+  data.indices.resize(3*nI);
   
-  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);
-    
-  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);
-  
-  glDeleteBuffers(1,&vertsBufferIndex);
-  glDeleteBuffers(1,&elemBufferIndex);
-}
-
-void BezierPatch::sortTriangles()
-{
-  if(Ntvertices > 0) {
-    transform(tVertexbuffer);
-    bounds(tIndices);
-    qsort(&tIndices[0],tIndices.size()/3,3*sizeof(GLuint),compare);
-  }
-}
-
-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;
+  MaterialIndex=nC ? -1-materialIndex : 1+materialIndex; 
+        
+  for(size_t i=0; i < nI; ++i) {
+    const uint32_t *PI=PP[i];
+    uint32_t PI0=PI[0];
+    uint32_t PI1=PI[1];
+    uint32_t PI2=PI[2];
+    triple P0=P[PI0];
+    triple P1=P[PI1];
+    triple P2=P[PI2];
+    triple Q[]={P0,P1,P2};
+    if(!offscreen(3,Q)) {
+      const uint32_t *NI=NN[i];
+      if(nC) {
+        const uint32_t *CI=CC[i];
+        prc::RGBAColour C0=C[CI[0]];
+        prc::RGBAColour C1=C[CI[1]];
+        prc::RGBAColour C2=C[CI[2]];
+        GLfloat c0[]={(GLfloat) C0.R,(GLfloat) C0.G,(GLfloat) C0.B,
+                      (GLfloat) C0.A};
+        GLfloat c1[]={(GLfloat) C1.R,(GLfloat) C1.G,(GLfloat) C1.B,
+                      (GLfloat) C1.A};
+        GLfloat c2[]={(GLfloat) C2.R,(GLfloat) C2.G,(GLfloat) C2.B,
+                      (GLfloat) C2.A};
+        transparent |= c0[3]+c1[3]+c2[3] < 765;
+        data.Vertices[PI0]=VertexData(P0,N[NI[0]],c0);
+        data.Vertices[PI1]=VertexData(P1,N[NI[1]],c1);
+        data.Vertices[PI2]=VertexData(P2,N[NI[2]],c2);
+      } else {
+        data.Vertices[PI0]=VertexData(P0,N[NI[0]]);
+        data.Vertices[PI1]=VertexData(P1,N[NI[1]]);
+        data.Vertices[PI2]=VertexData(P2,N[NI[2]]);
       }
-    } 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;
-      }
+      size_t i3=3*i;
+      data.indices[i3]=PI0;
+      data.indices[i3+1]=PI1;
+      data.indices[i3+2]=PI2;
     }
-    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;
-    }
   }
+  append();
 }
  
 #endif

Modified: trunk/Build/source/utils/asymptote/bezierpatch.h
===================================================================
--- trunk/Build/source/utils/asymptote/bezierpatch.h	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/bezierpatch.h	2019-10-06 17:17:34 UTC (rev 52300)
@@ -16,112 +16,23 @@
 
 extern const double Fuzz4;
 
-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<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<GLuint> tIndices;
-  static GLuint nvertices;
-  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;
+  vertexBuffer data;
+
+  bool transparent;
+  bool color;
   double epsilon;
   double Epsilon;
   double res2;
   double Res2; // Reduced resolution for Bezier triangles flatness test.
-  triple Min,Max;
-  typedef GLuint vertexFunction(const triple &v, const triple& n);
-  typedef GLuint VertexFunction(const triple &v, const triple& n, GLfloat *c);
-  vertexFunction *pvertex;
-  VertexFunction *pVertex;
-  
-  BezierPatch() {}
-  
-  void init(double res, const triple& Min, const triple& Max,
-            bool transparent, GLfloat *colors=NULL);
+  typedef GLuint (vertexBuffer::*vertexFunction)(const triple &v,
+                                                 const triple& n);
+  vertexFunction pvertex;
+  bool Onscreen;
+
+  void init(double res);
     
-// Store the vertex v and its normal vector n in the buffer.
-  static GLuint vertex(const triple &v, const triple& n) {
-    vertexbuffer.push_back(vertexData(v,n));
-    return nvertices++;
-  }
-  
-// 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) {
-    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) {
-    tVertexbuffer.push_back(VertexData(v,n,c));
-    return Ntvertices++;
-  }
-  
   triple normal(triple left3, triple left2, triple left1, triple middle,
                 triple right1, triple right2, triple right3) {
     triple rp=right1-middle;
@@ -165,7 +76,7 @@
     triple p12=p[12];
     triple p15=p[15];
     
-    // Check the flatness of the quad.
+    // Check the flatness of a Bezier patch.
     double d=Distance2(p15,p0,normal(p3,p[2],p[1],p0,p[4],p[8],p12));
     
     // Determine how straight the edges are.
@@ -194,38 +105,16 @@
     }
   };
   
-// Approximate bounds by bounding box of control polyhedron.
+  // Approximate bounds by bounding box of control polyhedron.
   bool offscreen(size_t n, const triple *v) {
-    double x,y,z;
-    double X,Y,Z;
-    
-    boundstriples(x,y,z,X,Y,Z,n,v);
-    return
-      X < Min.getx() || x > Max.getx() ||
-      Y < Min.gety() || y > Max.gety() ||
-      Z < Min.getz() || z > Max.getz();
+    if(bbox2(n,v).offscreen()) {
+      Onscreen=false;
+      return true;
+    }
+    return false;
   }
 
-  static void clear() {
-    nvertices=0;
-    vertexbuffer.clear();
-    indices.clear();
-  }
-  
-  static void Clear() {
-    Nvertices=0;
-    Vertexbuffer.clear();
-    Indices.clear();
-  }
-  
-  static void tClear() {
-    Ntvertices=0;
-    tVertexbuffer.clear();
-    tIndices.clear();
-  }
-  
-  ~BezierPatch() {}
-  
+  virtual void render(const triple *p, bool straight, GLfloat *c0=NULL);
   void render(const triple *p,
               GLuint I0, GLuint I1, GLuint I2, GLuint I3,
               triple P0, triple P1, triple P2, triple P3,
@@ -232,42 +121,38 @@
               bool flat0, bool flat1, bool flat2, bool flat3,
               GLfloat *C0=NULL, GLfloat *C1=NULL, GLfloat *C2=NULL,
               GLfloat *C3=NULL);
-  virtual void render(const triple *p, bool straight, GLfloat *c0=NULL);
   
-  void queue(const triple *g, bool straight, double ratio,
-             const triple& Min, const triple& Max, bool transparent,
+  void append() {
+    if(transparent)
+      transparentData.Append(data);
+    else if(color) {
+      colorData.Append(data);
+      if(colorData.Vertices.size() >= gl::maxvertices) {
+        drawBuffer(colorData,colorShader);
+        colorData.clear();
+        gl::forceRemesh=true;
+      }
+    }
+    else {
+      materialData.append(data);
+      if(materialData.vertices.size() >= gl::maxvertices) {
+        drawBuffer(materialData,materialShader);
+        materialData.clear();
+        gl::forceRemesh=true;
+      }
+    }
+  }
+  
+  void queue(const triple *g, bool straight, double ratio, bool Transparent,
              GLfloat *colors=NULL) {
-    init(pixel*ratio,Min,Max,transparent,colors);
+    data.clear();
+    Onscreen=true;
+    transparent=Transparent;
+    color=colors;
+    init(pixel*ratio);
     render(g,straight,colors);
   }
   
-  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 {
@@ -288,25 +173,39 @@
     return max(d,Straightness(p6,p[7],p[8],p9));
   }
   
+  void render(const triple *p, bool straight, GLfloat *c0=NULL);
   void render(const triple *p,
               GLuint I0, GLuint I1, GLuint I2,
               triple P0, triple P1, triple P2,
               bool flat0, bool flat1, bool flat2,
               GLfloat *C0=NULL, GLfloat *C1=NULL, GLfloat *C2=NULL);
-  void render(const triple *p, bool straight, GLfloat *c0=NULL);
 };
 
-
 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);
+  void queue(size_t nP, const triple* P, size_t nN, const triple* N,
+             size_t nC, const prc::RGBAColour* C, size_t nI,
+             const uint32_t (*PI)[3], const uint32_t (*NI)[3],
+             const uint32_t (*CI)[3], bool transparent);
+  
+  void append() {
+    if(transparent)
+      transparentData.Append(data);
+    else {
+      triangleData.Append(data);
+      if(triangleData.Vertices.size() >= gl::maxvertices) {
+        drawBuffer(triangleData,transparentShader);
+        triangleData.clear();
+        gl::forceRemesh=true;
+      }
+    }
+  }
+
 };
 
+extern void sortTriangles();
 
 #endif
 

Modified: trunk/Build/source/utils/asymptote/build-scripts/HOWTO-MSWindows
===================================================================
--- trunk/Build/source/utils/asymptote/build-scripts/HOWTO-MSWindows	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/build-scripts/HOWTO-MSWindows	2019-10-06 17:17:34 UTC (rev 52300)
@@ -4,31 +4,12 @@
 and source tar ball and copy them to a directory ~/shared which needs to be
 shared via virtualbox to the cygwin build environment.
 
-Install TeXLive and these Cygwin packages:
+Install TeXLive and required Cygwin packages:
 
-git
-wget
-make
-patch
-gcc-g++
-autoconf2.5
-bison
-flex
-w32api-headers
-w32api-runtime
-zlib-devel
-libtirpc-devel (SRC)
-libreadline-devel (SRC)
-libfftw3-devel (SRC)
-libgsl-devel (SRC)
-glm-devel
-automake1.15
-libtool
+setup-x86_64.exe -q -P git,wget,make,patch,gcc-g++,autoconf2.5,bison,flex,w32api-headers,w32api-runtime,zlib-devel,glm-devel,automake1.15,libtool
 
-mv /usr/include/GL /usr/include/GL.orig
+setup-x86_64.exe -q -I -P libtirpc-devel,libreadline-devel,libfftw3-devel,libgsl-devel
 
-Install these cygwin packages:
-
 Build and install static libraries from /usr/local/src:
 
 gsl-devel:
@@ -69,12 +50,14 @@
 mkdir ~/CTAN
 cp -a ~/asymptote/build-scripts/README-binaries ~/CTAN
 
+cd ~/
 GCVERSION=7.6.2
+ATOMICVERSION=7.6.10
 wget http://hboehm.info/gc/gc_source/gc-$GCVERSION.tar.gz
-wget http://www.ivmaisoft.com/_bin/atomic_ops/libatomic_ops-$GCVERSION.tar.gz
+wget http://www.ivmaisoft.com/_bin/atomic_ops/libatomic_ops-$ATOMICVERSION.tar.gz
 tar -zxf gc-$GCVERSION.tar.gz
-tar -zxf libatomic_ops-$GCVERSION.tar.gz
-mv libatomic_ops-$GCVERSION gc-$GCVERSION/libatomic_ops
+tar -zxf libatomic_ops-$ATOMICVERSION.tar.gz
+mv libatomic_ops-$ATOMICVERSION gc-$GCVERSION/libatomic_ops
 cd gc-$GCVERSION
 ./configure --disable-shared
 make check

Added: trunk/Build/source/utils/asymptote/build-scripts/build-asygl
===================================================================
--- trunk/Build/source/utils/asymptote/build-scripts/build-asygl	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/build-scripts/build-asygl	2019-10-06 17:17:34 UTC (rev 52300)
@@ -0,0 +1,21 @@
+#!/bin/sh
+if [ ! $# = 1 ]; then echo Usage: "$0 AsyGLVersion"; exit 1; fi
+GL_MATRIX_VERSION=2.4.0
+GL_MATRIX_DIR=gl-matrix-$GL_MATRIX_VERSION
+GL_MATRIX_DIR_PRUNED=$GL_MATRIX_DIR-pruned
+if test ! -r $GL_MATRIX_DIR_PRUNED; then \
+    TEMPDIR=`mktemp -d`
+    TARFILE=$TEMPDIR/$GL_MATRIX_DIR.tar.gz
+    wget https://github.com/toji/gl-matrix/archive/v$GL_MATRIX_VERSION.tar.gz --output-document=$TARFILE
+tar -zxf $TARFILE
+mv $GL_MATRIX_DIR $GL_MATRIX_DIR_PRUNED
+rm -r $TEMPDIR
+cd $GL_MATRIX_DIR_PRUNED
+patch -p1 < ../patches/$GL_MATRIX_DIR_PRUNED.patch
+npm install
+npm run build-all
+echo "/*@license for gl-matrix mat3 and mat4 functions:" > LICENSE.js
+echo "*/"| cat LICENSE.md - >> LICENSE.js
+cd ..
+fi
+cat $GL_MATRIX_DIR_PRUNED/dist/gl-matrix-min.js webgl/gl.js $GL_MATRIX_DIR_PRUNED/LICENSE.js | uglifyjs -m -c -o base/webgl/asygl-$1.js --comments


Property changes on: trunk/Build/source/utils/asymptote/build-scripts/build-asygl
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Modified: trunk/Build/source/utils/asymptote/build-scripts/build-asymptote
===================================================================
--- trunk/Build/source/utils/asymptote/build-scripts/build-asymptote	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/build-scripts/build-asymptote	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,5 +1,4 @@
 #!/bin/sh -x
-# Usage: build-asymptote [suffix]
 
 HOME=~bowman
 SHARED=$HOME/shared/asy
@@ -26,9 +25,7 @@
 mv configure.ac_ configure.ac
 cat $ASYMPTOTE/asymptote.spec | sed -e "s|Version:.*|Version:        $VERSION|" > asymptote.spec
 SRC=asymptote-$VERSION.src.tgz
-if [ $# == 0 ]; then
-  cp asymptote.spec $ASYMPTOTE
-fi
+cp asymptote.spec $ASYMPTOTE
 cd $BUILD
 rm -rf asymptote-$VERSION
 rm -rf $BUILD/$BINDIR

Modified: trunk/Build/source/utils/asymptote/build-scripts/build-asymptote.dos
===================================================================
--- trunk/Build/source/utils/asymptote/build-scripts/build-asymptote.dos	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/build-scripts/build-asymptote.dos	2019-10-06 17:17:34 UTC (rev 52300)
@@ -31,7 +31,7 @@
 BUILD=build-$VERSION
 ln -sf ../gc-$GC.tar.gz .
 ln -sf ../gc-$GC .
-make -n MSDOS=1 >& /dev/null || ./configure OSTYPE=msdos --enable-gc=$GC --with-latex=/usr/local/share --with-context=/usr/local/share
+make -n MSDOS=1 >& /dev/null || ./configure --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 $BUILD

Deleted: trunk/Build/source/utils/asymptote/build-scripts/build-freeglut
===================================================================
--- trunk/Build/source/utils/asymptote/build-scripts/build-freeglut	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/build-scripts/build-freeglut	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,22 +0,0 @@
-#!/bin/sh -x
-#Be sure to remove /usr/include/GL
-wget http://prdownloads.sourceforge.net/freeglut/freeglut-2.8.1.tar.gz
-ln -sf /usr/bin/cyggcc_s-1.dll /usr/lib/libgcc_s.a
-tar -zxf freeglut-2.8.1.tar.gz
-cd freeglut-2.8.1
-patch -p1 < ~/asymptote/patches/cygwin_freeglut-2.8.1.patch
-./configure --prefix=/usr --without-x
-make
-cd src
-gcc -s -static -shared -o freeglut.dll *.o -Wl,--out-implib=libfreeglut.a -lglu32 -lopengl32 -lgdi32 -lwinmm
-cp freeglut.dll /lib
-mkdir -p ~/dll
-cp freeglut.dll ~/dll
-gcc -s -shared -o freeglut.dll *.o -Wl,--out-implib=libfreeglut.a -lglu32 -lopengl32 -lgdi32 -lwinmm
-cp libfreeglut.a /lib
-cd ..
-cp -a include/GL/*.h /usr/include/w32api/GL/
-
-#OPTIONAL: To compile manually in src:
-#gcc -O2 -c -D_WIN32 -DHAVE_CONFIG_H -DFREEGLUT_EXPORTS *.c -I.. -I../include
-

Modified: trunk/Build/source/utils/asymptote/config.guess
===================================================================
--- trunk/Build/source/utils/asymptote/config.guess	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/config.guess	2019-10-06 17:17:34 UTC (rev 52300)
@@ -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-09-10'
+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.//'`
@@ -262,9 +260,6 @@
     *:SolidBSD:*:*)
 	echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"
 	exit ;;
-    *:OS108:*:*)
-	echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE"
-	exit ;;
     macppc:MirBSD:*:*)
 	echo powerpc-unknown-mirbsd"$UNAME_RELEASE"
 	exit ;;
@@ -274,15 +269,12 @@
     *:Sortix:*:*)
 	echo "$UNAME_MACHINE"-unknown-sortix
 	exit ;;
-    *:Twizzler:*:*)
-	echo "$UNAME_MACHINE"-unknown-twizzler
-	exit ;;
     *:Redox:*:*)
 	echo "$UNAME_MACHINE"-unknown-redox
 	exit ;;
     mips:OSF1:*.*)
-	echo mips-dec-osf1
-	exit ;;
+        echo mips-dec-osf1
+        exit ;;
     alpha:OSF1:*:*)
 	case $UNAME_RELEASE in
 	*4.0)
@@ -397,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.
@@ -490,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 */
@@ -587,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>
 
@@ -668,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
@@ -708,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
@@ -734,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
@@ -848,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
@@ -900,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/[^.]*//'`"
@@ -913,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"
@@ -941,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
@@ -990,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"
@@ -1147,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
@@ -1331,39 +1284,38 @@
 	echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
 	exit ;;
     *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p`
-	case $UNAME_PROCESSOR in
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
-	if command -v xcode-select > /dev/null 2> /dev/null && \
-		! xcode-select --print-path > /dev/null 2> /dev/null ; then
-	    # Avoid executing cc if there is no toolchain installed as
-	    # cc will be a stub that puts up a graphical alert
-	    # prompting the user to install developer tools.
-	    CC_FOR_BUILD=no_compiler_found
-	else
-	    set_cc_for_build
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	eval "$set_cc_for_build"
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
 	fi
-	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
-	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
-		   grep IS_64BIT_ARCH >/dev/null
-	    then
-		case $UNAME_PROCESSOR in
-		    i386) UNAME_PROCESSOR=x86_64 ;;
-		    powerpc) UNAME_PROCESSOR=powerpc64 ;;
-		esac
+	if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		       (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		       grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
+		# On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+		if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+		       (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		       grep IS_PPC >/dev/null
+		then
+		    UNAME_PROCESSOR=powerpc
+		fi
 	    fi
-	    # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
-	    if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
-		   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
-		   grep IS_PPC >/dev/null
-	    then
-		UNAME_PROCESSOR=powerpc
-	    fi
 	elif test "$UNAME_PROCESSOR" = i386 ; then
-	    # uname -m returns i386 or x86_64
-	    UNAME_PROCESSOR=$UNAME_MACHINE
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
 	fi
 	echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
 	exit ;;
@@ -1406,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
@@ -1463,148 +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
-#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
-#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
-#include <signal.h>
-#if defined(_SIZE_T_) || defined(SIGLOST)
-#include <sys/utsname.h>
-#endif
-#endif
-#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
-#if defined(_SIZE_T_) || defined(SIGLOST)
-  struct utsname un;
-  uname (&un);
-  printf ("vax-dec-ultrix%s\n", un.release); exit (0);
-#else
-  printf ("vax-dec-ultrix\n"); exit (0);
-#endif
-#endif
-#endif
-#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
-#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
-#if defined(_SIZE_T_) || defined(SIGLOST)
-  struct utsname *un;
-  uname (&un);
-  printf ("mips-dec-ultrix%s\n", un.release); exit (0);
-#else
-  printf ("mips-dec-ultrix\n"); exit (0);
-#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-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/config.h.in	2019-10-06 17:17:34 UTC (rev 52300)
@@ -33,12 +33,15 @@
 /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
 #undef HAVE_FSEEKO
 
-/* Define to 1 if you have . GNU <getopt.h> */
+/* Define to 1 if you have GNU <getopt.h>. */
 #undef HAVE_GNU_GETOPT_H
 
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
+/* Define to 1 if you have the `lgamma' function. */
+#undef HAVE_LGAMMA
+
 /* Define to 1 if you have the `ncurses' library (-lncurses). */
 #undef HAVE_LIBCURSES
 
@@ -48,10 +51,10 @@
 /* Define to 1 if you have the `gccpp' library (-lgccpp). */
 #undef HAVE_LIBGCCPP
 
-/* Define to 1 if you have the `' library (-l). GL */
+/* Define to 1 if you have the `GL' library (-lGL). */
 #undef HAVE_LIBGL
 
-/* Define to 1 if you have . the <glm/glm.hpp> header */
+/* Define to 1 if you have the <glm/glm.hpp> header. */
 #undef HAVE_LIBGLM
 
 /* Define to 1 if you have the `glut' library (-lglut). */
@@ -63,9 +66,6 @@
 /* Define to 1 if you have the <libintl.h> header file. */
 #undef HAVE_LIBINTL_H
 
-/* Define to 1 if you have the `m' library (-lm). */
-#undef HAVE_LIBM
-
 /* Define to 1 if you have the `ncurses' library (-lncurses). */
 #undef HAVE_LIBNCURSES
 
@@ -111,9 +111,6 @@
 /* Define to 1 if you have the <ncurses.h> header file. */
 #undef HAVE_NCURSES_H
 
-/* Define to 1 if you have the `pow' function. */
-#undef HAVE_POW
-
 /* Define if you have POSIX threads libraries and header files. */
 #undef HAVE_PTHREAD
 
@@ -123,12 +120,9 @@
 /* Define to 1 if the system has the type `ptrdiff_t'. */
 #undef HAVE_PTRDIFF_T
 
-/* Define to 1 if you have . a working <tirpc/rpc/rpc.h> header */
+/* Define to 1 if you have a working <tirpc/rpc/rpc.h> header. */
 #undef HAVE_RPC_RPC_H
 
-/* Define to 1 if you have the `sqrt' function. */
-#undef HAVE_SQRT
-
 /* Define to 1 if you have the <stddef.h> header file. */
 #undef HAVE_STDDEF_H
 
@@ -165,13 +159,13 @@
 /* Define to 1 if you have the `tgamma' function. */
 #undef HAVE_TGAMMA
 
-/* Define to 1 if you have . <tr1/unordered_map> */
+/* Define to 1 if you have <tr1/unordered_map>. */
 #undef HAVE_TR1_UNORDERED_MAP
 
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
-/* Define to 1 if you have . <unordered_map> */
+/* Define to 1 if you have <unordered_map>. */
 #undef HAVE_UNORDERED_MAP
 
 /* Define to 1 if you have the `vfork' function. */

Modified: trunk/Build/source/utils/asymptote/config.sub
===================================================================
--- trunk/Build/source/utils/asymptote/config.sub	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/config.sub	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2019 Free Software Foundation, Inc.
+#   Copyright 1992-2018 Free Software Foundation, Inc.
 
-timestamp='2019-06-30'
+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
@@ -67,7 +67,7 @@
 version="\
 GNU config.sub ($timestamp)
 
-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."
@@ -89,7 +89,7 @@
     - )	# Use stdin as input.
        break ;;
     -* )
-       echo "$me: invalid option $1$help" >&2
+       echo "$me: invalid option $1$help"
        exit 1 ;;
 
     *local*)
@@ -110,1164 +110,1223 @@
     exit 1;;
 esac
 
-# Split fields of configuration type
-# shellcheck disable=SC2162
-IFS="-" read field1 field2 field3 field4 <<EOF
-$1
-EOF
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
+  kopensolaris*-gnu* | cloudabi*-eabi* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
+  *)
+    basic_machine=`echo "$1" | sed 's/-[^-]*$//'`
+    if [ "$basic_machine" != "$1" ]
+    then os=`echo "$1" | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
 
-# Separate into logical components for further validation
-case $1 in
-	*-*-*-*-*)
-		echo Invalid configuration \`"$1"\': more than four components >&2
-		exit 1
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
 		;;
-	*-*-*-*)
-		basic_machine=$field1-$field2
-		os=$field3-$field4
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray | -microblaze*)
+		os=
+		basic_machine=$1
 		;;
-	*-*-*)
-		# Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
-		# parts
-		maybe_os=$field2-$field3
-		case $maybe_os in
-			nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \
-			| linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \
-			| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
-			| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
-			| storm-chaos* | os2-emx* | rtmk-nova*)
-				basic_machine=$field1
-				os=$maybe_os
-				;;
-			android-linux)
-				basic_machine=$field1-unknown
-				os=linux-android
-				;;
-			*)
-				basic_machine=$field1-$field2
-				os=$field3
-				;;
-		esac
+	-bluegene*)
+		os=-cnk
 		;;
-	*-*)
-		# A lone config we happen to match not fitting any pattern
-		case $field1-$field2 in
-			decstation-3100)
-				basic_machine=mips-dec
-				os=
-				;;
-			*-*)
-				# Second component is usually, but not always the OS
-				case $field2 in
-					# Prevent following clause from handling this valid os
-					sun*os*)
-						basic_machine=$field1
-						os=$field2
-						;;
-					# Manufacturers
-					dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
-					| att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
-					| unicom* | ibm* | next | hp | isi* | apollo | altos* \
-					| convergent* | ncr* | news | 32* | 3600* | 3100* \
-					| hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
-					| ultra | tti* | harris | dolphin | highlevel | gould \
-					| cbm | ns | masscomp | apple | axis | knuth | cray \
-					| microblaze* | sim | cisco \
-					| oki | wec | wrs | winbond)
-						basic_machine=$field1-$field2
-						os=
-						;;
-					*)
-						basic_machine=$field1
-						os=$field2
-						;;
-				esac
-			;;
-		esac
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
 		;;
-	*)
-		# Convert single-component short-hands not valid as part of
-		# multi-component configurations.
-		case $field1 in
-			386bsd)
-				basic_machine=i386-pc
-				os=bsd
-				;;
-			a29khif)
-				basic_machine=a29k-amd
-				os=udi
-				;;
-			adobe68k)
-				basic_machine=m68010-adobe
-				os=scout
-				;;
-			alliant)
-				basic_machine=fx80-alliant
-				os=
-				;;
-			altos | altos3068)
-				basic_machine=m68k-altos
-				os=
-				;;
-			am29k)
-				basic_machine=a29k-none
-				os=bsd
-				;;
-			amdahl)
-				basic_machine=580-amdahl
-				os=sysv
-				;;
-			amiga)
-				basic_machine=m68k-unknown
-				os=
-				;;
-			amigaos | amigados)
-				basic_machine=m68k-unknown
-				os=amigaos
-				;;
-			amigaunix | amix)
-				basic_machine=m68k-unknown
-				os=sysv4
-				;;
-			apollo68)
-				basic_machine=m68k-apollo
-				os=sysv
-				;;
-			apollo68bsd)
-				basic_machine=m68k-apollo
-				os=bsd
-				;;
-			aros)
-				basic_machine=i386-pc
-				os=aros
-				;;
-			aux)
-				basic_machine=m68k-apple
-				os=aux
-				;;
-			balance)
-				basic_machine=ns32k-sequent
-				os=dynix
-				;;
-			blackfin)
-				basic_machine=bfin-unknown
-				os=linux
-				;;
-			cegcc)
-				basic_machine=arm-unknown
-				os=cegcc
-				;;
-			convex-c1)
-				basic_machine=c1-convex
-				os=bsd
-				;;
-			convex-c2)
-				basic_machine=c2-convex
-				os=bsd
-				;;
-			convex-c32)
-				basic_machine=c32-convex
-				os=bsd
-				;;
-			convex-c34)
-				basic_machine=c34-convex
-				os=bsd
-				;;
-			convex-c38)
-				basic_machine=c38-convex
-				os=bsd
-				;;
-			cray)
-				basic_machine=j90-cray
-				os=unicos
-				;;
-			crds | unos)
-				basic_machine=m68k-crds
-				os=
-				;;
-			da30)
-				basic_machine=m68k-da30
-				os=
-				;;
-			decstation | pmax | pmin | dec3100 | decstatn)
-				basic_machine=mips-dec
-				os=
-				;;
-			delta88)
-				basic_machine=m88k-motorola
-				os=sysv3
-				;;
-			dicos)
-				basic_machine=i686-pc
-				os=dicos
-				;;
-			djgpp)
-				basic_machine=i586-pc
-				os=msdosdjgpp
-				;;
-			ebmon29k)
-				basic_machine=a29k-amd
-				os=ebmon
-				;;
-			es1800 | OSE68k | ose68k | ose | OSE)
-				basic_machine=m68k-ericsson
-				os=ose
-				;;
-			gmicro)
-				basic_machine=tron-gmicro
-				os=sysv
-				;;
-			go32)
-				basic_machine=i386-pc
-				os=go32
-				;;
-			h8300hms)
-				basic_machine=h8300-hitachi
-				os=hms
-				;;
-			h8300xray)
-				basic_machine=h8300-hitachi
-				os=xray
-				;;
-			h8500hms)
-				basic_machine=h8500-hitachi
-				os=hms
-				;;
-			harris)
-				basic_machine=m88k-harris
-				os=sysv3
-				;;
-			hp300 | hp300hpux)
-				basic_machine=m68k-hp
-				os=hpux
-				;;
-			hp300bsd)
-				basic_machine=m68k-hp
-				os=bsd
-				;;
-			hppaosf)
-				basic_machine=hppa1.1-hp
-				os=osf
-				;;
-			hppro)
-				basic_machine=hppa1.1-hp
-				os=proelf
-				;;
-			i386mach)
-				basic_machine=i386-mach
-				os=mach
-				;;
-			isi68 | isi)
-				basic_machine=m68k-isi
-				os=sysv
-				;;
-			m68knommu)
-				basic_machine=m68k-unknown
-				os=linux
-				;;
-			magnum | m3230)
-				basic_machine=mips-mips
-				os=sysv
-				;;
-			merlin)
-				basic_machine=ns32k-utek
-				os=sysv
-				;;
-			mingw64)
-				basic_machine=x86_64-pc
-				os=mingw64
-				;;
-			mingw32)
-				basic_machine=i686-pc
-				os=mingw32
-				;;
-			mingw32ce)
-				basic_machine=arm-unknown
-				os=mingw32ce
-				;;
-			monitor)
-				basic_machine=m68k-rom68k
-				os=coff
-				;;
-			morphos)
-				basic_machine=powerpc-unknown
-				os=morphos
-				;;
-			moxiebox)
-				basic_machine=moxie-unknown
-				os=moxiebox
-				;;
-			msdos)
-				basic_machine=i386-pc
-				os=msdos
-				;;
-			msys)
-				basic_machine=i686-pc
-				os=msys
-				;;
-			mvs)
-				basic_machine=i370-ibm
-				os=mvs
-				;;
-			nacl)
-				basic_machine=le32-unknown
-				os=nacl
-				;;
-			ncr3000)
-				basic_machine=i486-ncr
-				os=sysv4
-				;;
-			netbsd386)
-				basic_machine=i386-pc
-				os=netbsd
-				;;
-			netwinder)
-				basic_machine=armv4l-rebel
-				os=linux
-				;;
-			news | news700 | news800 | news900)
-				basic_machine=m68k-sony
-				os=newsos
-				;;
-			news1000)
-				basic_machine=m68030-sony
-				os=newsos
-				;;
-			necv70)
-				basic_machine=v70-nec
-				os=sysv
-				;;
-			nh3000)
-				basic_machine=m68k-harris
-				os=cxux
-				;;
-			nh[45]000)
-				basic_machine=m88k-harris
-				os=cxux
-				;;
-			nindy960)
-				basic_machine=i960-intel
-				os=nindy
-				;;
-			mon960)
-				basic_machine=i960-intel
-				os=mon960
-				;;
-			nonstopux)
-				basic_machine=mips-compaq
-				os=nonstopux
-				;;
-			os400)
-				basic_machine=powerpc-ibm
-				os=os400
-				;;
-			OSE68000 | ose68000)
-				basic_machine=m68000-ericsson
-				os=ose
-				;;
-			os68k)
-				basic_machine=m68k-none
-				os=os68k
-				;;
-			paragon)
-				basic_machine=i860-intel
-				os=osf
-				;;
-			parisc)
-				basic_machine=hppa-unknown
-				os=linux
-				;;
-			pw32)
-				basic_machine=i586-unknown
-				os=pw32
-				;;
-			rdos | rdos64)
-				basic_machine=x86_64-pc
-				os=rdos
-				;;
-			rdos32)
-				basic_machine=i386-pc
-				os=rdos
-				;;
-			rom68k)
-				basic_machine=m68k-rom68k
-				os=coff
-				;;
-			sa29200)
-				basic_machine=a29k-amd
-				os=udi
-				;;
-			sei)
-				basic_machine=mips-sei
-				os=seiux
-				;;
-			sequent)
-				basic_machine=i386-sequent
-				os=
-				;;
-			sps7)
-				basic_machine=m68k-bull
-				os=sysv2
-				;;
-			st2000)
-				basic_machine=m68k-tandem
-				os=
-				;;
-			stratus)
-				basic_machine=i860-stratus
-				os=sysv4
-				;;
-			sun2)
-				basic_machine=m68000-sun
-				os=
-				;;
-			sun2os3)
-				basic_machine=m68000-sun
-				os=sunos3
-				;;
-			sun2os4)
-				basic_machine=m68000-sun
-				os=sunos4
-				;;
-			sun3)
-				basic_machine=m68k-sun
-				os=
-				;;
-			sun3os3)
-				basic_machine=m68k-sun
-				os=sunos3
-				;;
-			sun3os4)
-				basic_machine=m68k-sun
-				os=sunos4
-				;;
-			sun4)
-				basic_machine=sparc-sun
-				os=
-				;;
-			sun4os3)
-				basic_machine=sparc-sun
-				os=sunos3
-				;;
-			sun4os4)
-				basic_machine=sparc-sun
-				os=sunos4
-				;;
-			sun4sol2)
-				basic_machine=sparc-sun
-				os=solaris2
-				;;
-			sun386 | sun386i | roadrunner)
-				basic_machine=i386-sun
-				os=
-				;;
-			sv1)
-				basic_machine=sv1-cray
-				os=unicos
-				;;
-			symmetry)
-				basic_machine=i386-sequent
-				os=dynix
-				;;
-			t3e)
-				basic_machine=alphaev5-cray
-				os=unicos
-				;;
-			t90)
-				basic_machine=t90-cray
-				os=unicos
-				;;
-			toad1)
-				basic_machine=pdp10-xkl
-				os=tops20
-				;;
-			tpf)
-				basic_machine=s390x-ibm
-				os=tpf
-				;;
-			udi29k)
-				basic_machine=a29k-amd
-				os=udi
-				;;
-			ultra3)
-				basic_machine=a29k-nyu
-				os=sym1
-				;;
-			v810 | necv810)
-				basic_machine=v810-nec
-				os=none
-				;;
-			vaxv)
-				basic_machine=vax-dec
-				os=sysv
-				;;
-			vms)
-				basic_machine=vax-dec
-				os=vms
-				;;
-			vsta)
-				basic_machine=i386-pc
-				os=vsta
-				;;
-			vxworks960)
-				basic_machine=i960-wrs
-				os=vxworks
-				;;
-			vxworks68)
-				basic_machine=m68k-wrs
-				os=vxworks
-				;;
-			vxworks29k)
-				basic_machine=a29k-wrs
-				os=vxworks
-				;;
-			xbox)
-				basic_machine=i686-pc
-				os=mingw32
-				;;
-			ymp)
-				basic_machine=ymp-cray
-				os=unicos
-				;;
-			*)
-				basic_machine=$1
-				os=
-				;;
-		esac
+	-scout)
 		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+	-chorusrdb)
+		os=-chorusrdb
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*178)
+		os=-lynxos178
+		;;
+	-lynx*5)
+		os=-lynxos5
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
 esac
 
-# Decode 1-component or ad-hoc basic machines
+# Decode aliases for certain CPU-COMPANY combinations.
 case $basic_machine in
-	# Here we handle the default manufacturer of certain CPU types.  It is in
-	# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		cpu=hppa1.1
-		vendor=winbond
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| aarch64 | aarch64_be \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arceb \
+	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+	| avr | avr32 \
+	| ba \
+	| be32 | be64 \
+	| bfin \
+	| c4x | c8051 | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| e2k | epiphany \
+	| fido | fr30 | frv | ft32 \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
+	| i370 | i860 | i960 | ia16 | ia64 \
+	| ip2k | iq2000 \
+	| k1om \
+	| le32 | le64 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipsr5900 | mipsr5900el \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nds32 | nds32le | nds32be \
+	| nios | nios2 | nios2eb | nios2el \
+	| ns16k | ns32k \
+	| open8 | or1k | or1knd | or32 \
+	| pdp10 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
+	| pru \
+	| pyramid \
+	| riscv32 | riscv64 \
+	| rl78 | rx \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| visium \
+	| wasm32 \
+	| x86 | xc16x | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
 		;;
-	op50n)
-		cpu=hppa1.1
-		vendor=oki
+	c54x)
+		basic_machine=tic54x-unknown
 		;;
-	op60c)
-		cpu=hppa1.1
-		vendor=oki
+	c55x)
+		basic_machine=tic55x-unknown
 		;;
-	ibm*)
-		cpu=i370
-		vendor=ibm
+	c6x)
+		basic_machine=tic6x-unknown
 		;;
-	orion105)
-		cpu=clipper
-		vendor=highlevel
+	leon|leon[3-9])
+		basic_machine=sparc-$basic_machine
 		;;
-	mac | mpw | mac-mpw)
-		cpu=m68k
-		vendor=apple
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+		basic_machine=$basic_machine-unknown
+		os=-none
 		;;
-	pmac | pmac-mpw)
-		cpu=powerpc
-		vendor=apple
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65)
 		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
 
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| aarch64-* | aarch64_be-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| ba-* \
+	| be32-* | be64-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| c8051-* | clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| e2k-* | elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
+	| i*86-* | i860-* | i960-* | ia16-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| k1om-* \
+	| le32-* | le64-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| microblaze-* | microblazeel-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipsr5900-* | mipsr5900el-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nds32-* | nds32le-* | nds32be-* \
+	| nios-* | nios2-* | nios2eb-* | nios2el-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
+	| or1k*-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+	| pru-* \
+	| pyramid-* \
+	| riscv32-* | riscv64-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
+	| tahoe-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
+	| tron-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
+	| visium-* \
+	| wasm32-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
 	# Recognize the various machine names and aliases which stand
 	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-pc
+		os=-bsd
+		;;
 	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		cpu=m68000
-		vendor=att
+		basic_machine=m68000-att
 		;;
 	3b*)
-		cpu=we32k
-		vendor=att
+		basic_machine=we32k-att
 		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	asmjs)
+		basic_machine=asmjs-unknown
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
 	bluegene*)
-		cpu=powerpc
-		vendor=ibm
-		os=cnk
+		basic_machine=powerpc-ibm
+		os=-cnk
 		;;
+	c54x-*)
+		basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16 | cr16-*)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
 	decsystem10* | dec10*)
-		cpu=pdp10
-		vendor=dec
-		os=tops10
+		basic_machine=pdp10-dec
+		os=-tops10
 		;;
 	decsystem20* | dec20*)
-		cpu=pdp10
-		vendor=dec
-		os=tops20
+		basic_machine=pdp10-dec
+		os=-tops20
 		;;
 	delta | 3300 | motorola-3300 | motorola-delta \
 	      | 3300-motorola | delta-motorola)
-		cpu=m68k
-		vendor=motorola
+		basic_machine=m68k-motorola
 		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
 	dpx2*)
-		cpu=m68k
-		vendor=bull
-		os=sysv3
+		basic_machine=m68k-bull
+		os=-sysv3
 		;;
-	encore | umax | mmax)
-		cpu=ns32k
-		vendor=encore
+	e500v[12])
+		basic_machine=powerpc-unknown
+		os=$os"spe"
 		;;
+	e500v[12]-*)
+		basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+		os=$os"spe"
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
 	elxsi)
-		cpu=elxsi
-		vendor=elxsi
-		os=${os:-bsd}
+		basic_machine=elxsi-elxsi
+		os=-bsd
 		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
 	fx2800)
-		cpu=i860
-		vendor=alliant
+		basic_machine=i860-alliant
 		;;
 	genix)
-		cpu=ns32k
-		vendor=ns
+		basic_machine=ns32k-ns
 		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
 	h3050r* | hiux*)
-		cpu=hppa1.1
-		vendor=hitachi
-		os=hiuxwe2
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
 		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
 	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		cpu=hppa1.0
-		vendor=hp
+		basic_machine=hppa1.0-hp
 		;;
 	hp9k2[0-9][0-9] | hp9k31[0-9])
-		cpu=m68000
-		vendor=hp
+		basic_machine=m68000-hp
 		;;
 	hp9k3[2-9][0-9])
-		cpu=m68k
-		vendor=hp
+		basic_machine=m68k-hp
 		;;
 	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		cpu=hppa1.0
-		vendor=hp
+		basic_machine=hppa1.0-hp
 		;;
 	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		cpu=hppa1.1
-		vendor=hp
+		basic_machine=hppa1.1-hp
 		;;
 	hp9k78[0-9] | hp78[0-9])
 		# FIXME: really hppa2.0-hp
-		cpu=hppa1.1
-		vendor=hp
+		basic_machine=hppa1.1-hp
 		;;
 	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
 		# FIXME: really hppa2.0-hp
-		cpu=hppa1.1
-		vendor=hp
+		basic_machine=hppa1.1-hp
 		;;
 	hp9k8[0-9][13679] | hp8[0-9][13679])
-		cpu=hppa1.1
-		vendor=hp
+		basic_machine=hppa1.1-hp
 		;;
 	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		cpu=hppa1.0
-		vendor=hp
+		basic_machine=hppa1.0-hp
 		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
 	i*86v32)
-		cpu=`echo "$1" | sed -e 's/86.*/86/'`
-		vendor=pc
-		os=sysv32
+		basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
 		;;
 	i*86v4*)
-		cpu=`echo "$1" | sed -e 's/86.*/86/'`
-		vendor=pc
-		os=sysv4
+		basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
 		;;
 	i*86v)
-		cpu=`echo "$1" | sed -e 's/86.*/86/'`
-		vendor=pc
-		os=sysv
+		basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+		os=-sysv
 		;;
 	i*86sol2)
-		cpu=`echo "$1" | sed -e 's/86.*/86/'`
-		vendor=pc
-		os=solaris2
+		basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
 		;;
-	j90 | j90-cray)
-		cpu=j90
-		vendor=cray
-		os=${os:-unicos}
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
 		;;
+	vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
 	iris | iris4d)
-		cpu=mips
-		vendor=sgi
+		basic_machine=mips-sgi
 		case $os in
-		    irix*)
+		    -irix*)
 			;;
 		    *)
-			os=irix4
+			os=-irix4
 			;;
 		esac
 		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	leon-*|leon[3-9]-*)
+		basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'`
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	microblaze*)
+		basic_machine=microblaze-xilinx
+		;;
+	mingw64)
+		basic_machine=x86_64-pc
+		os=-mingw64
+		;;
+	mingw32)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
 	miniframe)
-		cpu=m68000
-		vendor=convergent
+		basic_machine=m68000-convergent
 		;;
-	*mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		cpu=m68k
-		vendor=atari
-		os=mint
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
 		;;
+	mips3*-*)
+		basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'`
+		;;
+	msys)
+		basic_machine=i686-pc
+		os=-msys
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
 	news-3600 | risc-news)
-		cpu=mips
-		vendor=sony
-		os=newsos
+		basic_machine=mips-sony
+		os=-newsos
 		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
 	next | m*-next)
-		cpu=m68k
-		vendor=next
+		basic_machine=m68k-next
 		case $os in
-		    openstep*)
-		        ;;
-		    nextstep*)
+		    -nextstep* )
 			;;
-		    ns2*)
-		      os=nextstep2
+		    -ns2*)
+		      os=-nextstep2
 			;;
 		    *)
-		      os=nextstep3
+		      os=-nextstep3
 			;;
 		esac
 		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
 	np1)
-		cpu=np1
-		vendor=gould
+		basic_machine=np1-gould
 		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	nsv-tandem)
+		basic_machine=nsv-tandem
+		;;
+	nsx-tandem)
+		basic_machine=nsx-tandem
+		;;
 	op50n-* | op60c-*)
-		cpu=hppa1.1
-		vendor=oki
-		os=proelf
+		basic_machine=hppa1.1-oki
+		os=-proelf
 		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
 	pa-hitachi)
-		cpu=hppa1.1
-		vendor=hitachi
-		os=hiuxwe2
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
 		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
 	pbd)
-		cpu=sparc
-		vendor=tti
+		basic_machine=sparc-tti
 		;;
 	pbb)
-		cpu=m68k
-		vendor=tti
+		basic_machine=m68k-tti
 		;;
-	pc532)
-		cpu=ns32k
-		vendor=pc532
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
 		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+		;;
 	pn)
-		cpu=pn
-		vendor=gould
+		basic_machine=pn-gould
 		;;
-	power)
-		cpu=power
-		vendor=ibm
+	power)	basic_machine=power-ibm
 		;;
-	ps2)
-		cpu=i386
-		vendor=ibm
+	ppc | ppcbe)	basic_machine=powerpc-unknown
 		;;
-	rm[46]00)
-		cpu=mips
-		vendor=siemens
+	ppc-* | ppcbe-*)
+		basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
 		;;
-	rtpc | rtpc-*)
-		cpu=romp
-		vendor=ibm
+	ppcle | powerpclittle)
+		basic_machine=powerpcle-unknown
 		;;
-	sde)
-		cpu=mipsisa32
-		vendor=sde
-		os=${os:-elf}
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'`
 		;;
-	simso-wrs)
-		cpu=sparclite
-		vendor=wrs
-		os=vxworks
+	ppc64)	basic_machine=powerpc64-unknown
 		;;
-	tower | tower-32)
-		cpu=m68k
-		vendor=ncr
+	ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
 		;;
-	vpp*|vx|vx-*)
-		cpu=f301
-		vendor=fujitsu
+	ppc64le | powerpc64little)
+		basic_machine=powerpc64le-unknown
 		;;
-	w65)
-		cpu=w65
-		vendor=wdc
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'`
 		;;
-	w89k-*)
-		cpu=hppa1.1
-		vendor=winbond
-		os=proelf
+	ps2)
+		basic_machine=i386-ibm
 		;;
-	none)
-		cpu=none
-		vendor=none
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
 		;;
-	leon|leon[3-9])
-		cpu=sparc
-		vendor=$basic_machine
+	rdos | rdos64)
+		basic_machine=x86_64-pc
+		os=-rdos
 		;;
-	leon-*|leon[3-9]-*)
-		cpu=sparc
-		vendor=`echo "$basic_machine" | sed 's/-.*//'`
+	rdos32)
+		basic_machine=i386-pc
+		os=-rdos
 		;;
-
-	*-*)
-		# shellcheck disable=SC2162
-		IFS="-" read cpu vendor <<EOF
-$basic_machine
-EOF
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
 		;;
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-		cpu=$basic_machine
-		vendor=pc
+	rm[46]00)
+		basic_machine=mips-siemens
 		;;
-	# These rules are duplicated from below for sake of the special case above;
-	# i.e. things that normalized to x86 arches should also default to "pc"
-	pc98)
-		cpu=i386
-		vendor=pc
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
 		;;
-	x64 | amd64)
-		cpu=x86_64
-		vendor=pc
+	s390 | s390-*)
+		basic_machine=s390-ibm
 		;;
-	# Recognize the basic CPU types without company name.
-	*)
-		cpu=$basic_machine
-		vendor=unknown
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
 		;;
-esac
-
-unset -v basic_machine
-
-# Decode basic machines in the full and proper CPU-Company form.
-case $cpu-$vendor in
-	# Here we handle the default manufacturer of certain CPU types in canonical form. It is in
-	# some cases the only manufacturer, in others, it is the most popular.
-	craynv-unknown)
-		vendor=cray
-		os=${os:-unicosmp}
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
 		;;
-	c90-unknown | c90-cray)
-		vendor=cray
-		os=${os:-unicos}
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
 		;;
-	fx80-unknown)
-		vendor=alliant
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
 		;;
-	romp-unknown)
-		vendor=ibm
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
 		;;
-	mmix-unknown)
-		vendor=knuth
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
 		;;
-	microblaze-unknown | microblazeel-unknown)
-		vendor=xilinx
+	sequent)
+		basic_machine=i386-sequent
 		;;
-	rs6000-unknown)
-		vendor=ibm
+	sh5el)
+		basic_machine=sh5le-unknown
 		;;
-	vax-unknown)
-		vendor=dec
+	simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
 		;;
-	pdp11-unknown)
-		vendor=dec
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
 		;;
-	we32k-unknown)
-		vendor=att
+	spur)
+		basic_machine=spur-unknown
 		;;
-	cydra-unknown)
-		vendor=cydrome
+	st2000)
+		basic_machine=m68k-tandem
 		;;
-	i370-ibm*)
-		vendor=ibm
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
 		;;
-	orion-unknown)
-		vendor=highlevel
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'`
 		;;
-	xps-unknown | xps100-unknown)
-		cpu=xps100
-		vendor=honeywell
+	sun2)
+		basic_machine=m68000-sun
 		;;
-
-	# Here we normalize CPU types with a missing or matching vendor
-	dpx20-unknown | dpx20-bull)
-		cpu=rs6000
-		vendor=bull
-		os=${os:-bosx}
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
 		;;
-
-	# Here we normalize CPU types irrespective of the vendor
-	amd64-*)
-		cpu=x86_64
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
 		;;
-	blackfin-*)
-		cpu=bfin
-		os=linux
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
 		;;
-	c54x-*)
-		cpu=tic54x
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
 		;;
-	c55x-*)
-		cpu=tic55x
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
 		;;
-	c6x-*)
-		cpu=tic6x
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
 		;;
-	e500v[12]-*)
-		cpu=powerpc
-		os=$os"spe"
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
 		;;
-	mips3*-*)
-		cpu=mips64
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
 		;;
-	ms1-*)
-		cpu=mt
+	sun4)
+		basic_machine=sparc-sun
 		;;
-	m68knommu-*)
-		cpu=m68k
-		os=linux
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
 		;;
-	m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
-		cpu=s12z
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
 		;;
-	openrisc-*)
-		cpu=or32
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
 		;;
-	parisc-*)
-		cpu=hppa
-		os=linux
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
 		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		cpu=i586
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
 		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
-		cpu=i686
+	tile*)
+		basic_machine=$basic_machine-unknown
+		os=-linux-gnu
 		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		cpu=i686
+	tx39)
+		basic_machine=mipstx39-unknown
 		;;
-	pentium4-*)
-		cpu=i786
+	tx39el)
+		basic_machine=mipstx39el-unknown
 		;;
-	pc98-*)
-		cpu=i386
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
 		;;
-	ppc-* | ppcbe-*)
-		cpu=powerpc
+	tower | tower-32)
+		basic_machine=m68k-ncr
 		;;
-	ppcle-* | powerpclittle-*)
-		cpu=powerpcle
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
 		;;
-	ppc64-*)
-		cpu=powerpc64
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
 		;;
-	ppc64le-* | powerpc64little-*)
-		cpu=powerpc64le
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
 		;;
-	sb1-*)
-		cpu=mipsisa64sb1
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
 		;;
-	sb1el-*)
-		cpu=mipsisa64sb1el
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
 		;;
-	sh5e[lb]-*)
-		cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
+	vms)
+		basic_machine=vax-dec
+		os=-vms
 		;;
-	spur-*)
-		cpu=spur
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
 		;;
-	strongarm-* | thumb-*)
-		cpu=arm
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
 		;;
-	tx39-*)
-		cpu=mipstx39
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
 		;;
-	tx39el-*)
-		cpu=mipstx39el
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
 		;;
-	x64-*)
-		cpu=x86_64
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
 		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	x64)
+		basic_machine=x86_64-pc
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
 	xscale-* | xscalee[bl]-*)
-		cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+		basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'`
 		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
 
-	# Recognize the canonical CPU Types that limit and/or modify the
-	# company names they are paired with.
-	cr16-*)
-		os=${os:-elf}
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
 		;;
-	crisv32-* | etraxfs*-*)
-		cpu=crisv32
-		vendor=axis
+	op50n)
+		basic_machine=hppa1.1-oki
 		;;
-	cris-* | etrax*-*)
-		cpu=cris
-		vendor=axis
+	op60c)
+		basic_machine=hppa1.1-oki
 		;;
-	crx-*)
-		os=${os:-elf}
+	romp)
+		basic_machine=romp-ibm
 		;;
-	neo-tandem)
-		cpu=neo
-		vendor=tandem
+	mmix)
+		basic_machine=mmix-knuth
 		;;
-	nse-tandem)
-		cpu=nse
-		vendor=tandem
+	rs6000)
+		basic_machine=rs6000-ibm
 		;;
-	nsr-tandem)
-		cpu=nsr
-		vendor=tandem
+	vax)
+		basic_machine=vax-dec
 		;;
-	nsv-tandem)
-		cpu=nsv
-		vendor=tandem
+	pdp11)
+		basic_machine=pdp11-dec
 		;;
-	nsx-tandem)
-		cpu=nsx
-		vendor=tandem
+	we32k)
+		basic_machine=we32k-att
 		;;
-	s390-*)
-		cpu=s390
-		vendor=ibm
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
 		;;
-	s390x-*)
-		cpu=s390x
-		vendor=ibm
+	cydra)
+		basic_machine=cydra-cydrome
 		;;
-	tile*-*)
-		os=${os:-linux-gnu}
+	orion)
+		basic_machine=orion-highlevel
 		;;
-
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
 	*)
-		# Recognize the canonical CPU types that are allowed with any
-		# company name.
-		case $cpu in
-			1750a | 580 \
-			| a29k \
-			| aarch64 | aarch64_be \
-			| abacus \
-			| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
-			| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
-			| alphapca5[67] | alpha64pca5[67] \
-			| am33_2.0 \
-			| amdgcn \
-			| arc | arceb \
-			| arm  | arm[lb]e | arme[lb] | armv* \
-			| avr | avr32 \
-			| asmjs \
-			| ba \
-			| be32 | be64 \
-			| bfin | bpf | bs2000 \
-			| c[123]* | c30 | [cjt]90 | c4x \
-			| c8051 | clipper | craynv | csky | cydra \
-			| d10v | d30v | dlx | dsp16xx \
-			| e2k | elxsi | epiphany \
-			| f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
-			| h8300 | h8500 \
-			| hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-			| hexagon \
-			| i370 | i*86 | i860 | i960 | ia16 | ia64 \
-			| ip2k | iq2000 \
-			| k1om \
-			| le32 | le64 \
-			| lm32 \
-			| m32c | m32r | m32rle \
-			| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
-			| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
-			| m88110 | m88k | maxq | mb | mcore | mep | metag \
-			| microblaze | microblazeel \
-			| mips | mipsbe | mipseb | mipsel | mipsle \
-			| mips16 \
-			| mips64 | mips64eb | mips64el \
-			| mips64octeon | mips64octeonel \
-			| mips64orion | mips64orionel \
-			| mips64r5900 | mips64r5900el \
-			| mips64vr | mips64vrel \
-			| mips64vr4100 | mips64vr4100el \
-			| mips64vr4300 | mips64vr4300el \
-			| mips64vr5000 | mips64vr5000el \
-			| mips64vr5900 | mips64vr5900el \
-			| mipsisa32 | mipsisa32el \
-			| mipsisa32r2 | mipsisa32r2el \
-			| mipsisa32r6 | mipsisa32r6el \
-			| mipsisa64 | mipsisa64el \
-			| mipsisa64r2 | mipsisa64r2el \
-			| mipsisa64r6 | mipsisa64r6el \
-			| mipsisa64sb1 | mipsisa64sb1el \
-			| mipsisa64sr71k | mipsisa64sr71kel \
-			| mipsr5900 | mipsr5900el \
-			| mipstx39 | mipstx39el \
-			| mmix \
-			| mn10200 | mn10300 \
-			| moxie \
-			| mt \
-			| msp430 \
-			| nds32 | nds32le | nds32be \
-			| nfp \
-			| nios | nios2 | nios2eb | nios2el \
-			| none | np1 | ns16k | ns32k | nvptx \
-			| open8 \
-			| or1k* \
-			| or32 \
-			| orion \
-			| picochip \
-			| pdp10 | pdp11 | pj | pjl | pn | power \
-			| powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
-			| pru \
-			| pyramid \
-			| riscv | riscv32 | riscv64 \
-			| rl78 | romp | rs6000 | rx \
-			| score \
-			| sh | shl \
-			| sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
-			| sh[1234]e[lb] |  sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
-			| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
-			| sparclite \
-			| sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
-			| spu \
-			| tahoe \
-			| tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
-			| tron \
-			| ubicom32 \
-			| v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
-			| vax \
-			| visium \
-			| w65 \
-			| wasm32 | wasm64 \
-			| we32k \
-			| x86 | x86_64 | xc16x | xgate | xps100 \
-			| xstormy16 | xtensa* \
-			| ymp \
-			| z8k | z80)
-				;;
-
-			*)
-				echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
-				exit 1
-				;;
-		esac
+		echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
+		exit 1
 		;;
 esac
 
 # Here we canonicalize certain aliases for manufacturers.
-case $vendor in
-	digital*)
-		vendor=dec
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'`
 		;;
-	commodore*)
-		vendor=cbm
+	*-commodore*)
+		basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'`
 		;;
 	*)
 		;;
@@ -1275,243 +1334,199 @@
 
 # Decode manufacturer-specific aliases for certain operating systems.
 
-if [ x$os != x ]
+if [ x"$os" != x"" ]
 then
 case $os in
 	# First match some system type aliases that might get confused
 	# with valid system types.
-	# solaris* is a basic system type, with this one exception.
-	auroraux)
-		os=auroraux
+	# -solaris* is a basic system type, with this one exception.
+	-auroraux)
+		os=-auroraux
 		;;
-	bluegene*)
-		os=cnk
-		;;
-	solaris1 | solaris1.*)
+	-solaris1 | -solaris1.*)
 		os=`echo $os | sed -e 's|solaris1|sunos4|'`
 		;;
-	solaris)
-		os=solaris2
+	-solaris)
+		os=-solaris2
 		;;
-	unixware*)
-		os=sysv4.2uw
+	-unixware*)
+		os=-sysv4.2uw
 		;;
-	gnu/linux*)
+	-gnu/linux*)
 		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
 		;;
 	# es1800 is here to avoid being matched by es* (a different OS)
-	es1800*)
-		os=ose
+	-es1800*)
+		os=-ose
 		;;
-	# Some version numbers need modification
-	chorusos*)
-		os=chorusos
-		;;
-	isc)
-		os=isc2.2
-		;;
-	sco6)
-		os=sco5v6
-		;;
-	sco5)
-		os=sco3.2v5
-		;;
-	sco4)
-		os=sco3.2v4
-		;;
-	sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		;;
-	sco3.2v[4-9]* | sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		;;
-	scout)
-		# Don't match below
-		;;
-	sco*)
-		os=sco3.2v2
-		;;
-	psos*)
-		os=psos
-		;;
 	# Now accept the basic system types.
 	# The portable systems comes first.
 	# Each alternative MUST end in a * to match a version number.
-	# sysv* is not here because it comes later, after sysvr4.
-	gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
-	     | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\
-	     | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
-	     | sym* | kopensolaris* | plan9* \
-	     | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
-	     | aos* | aros* | cloudabi* | sortix* | twizzler* \
-	     | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
-	     | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
-	     | knetbsd* | mirbsd* | netbsd* \
-	     | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \
-	     | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \
-	     | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
-	     | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
-	     | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \
-	     | chorusrdb* | cegcc* | glidix* \
-	     | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
-	     | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \
-	     | linux-newlib* | linux-musl* | linux-uclibc* \
-	     | uxpv* | beos* | mpeix* | udk* | moxiebox* \
-	     | interix* | uwin* | mks* | rhapsody* | darwin* \
-	     | openstep* | oskit* | conix* | pw32* | nonstopux* \
-	     | storm-chaos* | tops10* | tenex* | tops20* | its* \
-	     | os2* | vos* | palmos* | uclinux* | nucleus* \
-	     | morphos* | superux* | rtmk* | windiss* \
-	     | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
-	     | skyos* | haiku* | rdos* | toppers* | drops* | es* \
-	     | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
-	     | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
-	     | nsk* | powerunix)
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* | -plan9* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* | -cloudabi* | -sortix* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* | -hcos* \
+	      | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+	      | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \
+	      | -midnightbsd*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
-	qnx*)
-		case $cpu in
-		    x86 | i*86)
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
 			;;
 		    *)
-			os=nto-$os
+			os=-nto$os
 			;;
 		esac
 		;;
-	hiux*)
-		os=hiuxwe2
+	-nto-qnx*)
 		;;
-	nto-qnx*)
-		;;
-	nto*)
+	-nto*)
 		os=`echo $os | sed -e 's|nto|nto-qnx|'`
 		;;
-	sim | xray | os68k* | v88r* \
-	    | windows* | osx | abug | netware* | os9* \
-	    | macos* | mpw* | magic* | mmixware* | mon960* | lnews*)
+	-sim | -xray | -os68k* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
 		;;
-	linux-dietlibc)
-		os=linux-dietlibc
+	-mac*)
+		os=`echo "$os" | sed -e 's|mac|macos|'`
 		;;
-	linux*)
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
 		os=`echo $os | sed -e 's|linux|linux-gnu|'`
 		;;
-	lynx*178)
-		os=lynxos178
+	-sunos5*)
+		os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
 		;;
-	lynx*5)
-		os=lynxos5
+	-sunos6*)
+		os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
 		;;
-	lynx*)
-		os=lynxos
+	-opened*)
+		os=-openedition
 		;;
-	mac*)
-		os=`echo "$os" | sed -e 's|mac|macos|'`
+	-os400*)
+		os=-os400
 		;;
-	opened*)
-		os=openedition
+	-wince*)
+		os=-wince
 		;;
-	os400*)
-		os=os400
+	-utek*)
+		os=-bsd
 		;;
-	sunos5*)
-		os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+	-dynix*)
+		os=-bsd
 		;;
-	sunos6*)
-		os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+	-acis*)
+		os=-aos
 		;;
-	wince*)
-		os=wince
+	-atheos*)
+		os=-atheos
 		;;
-	utek*)
-		os=bsd
+	-syllable*)
+		os=-syllable
 		;;
-	dynix*)
-		os=bsd
+	-386bsd)
+		os=-bsd
 		;;
-	acis*)
-		os=aos
+	-ctix* | -uts*)
+		os=-sysv
 		;;
-	atheos*)
-		os=atheos
+	-nova*)
+		os=-rtmk-nova
 		;;
-	syllable*)
-		os=syllable
+	-ns2)
+		os=-nextstep2
 		;;
-	386bsd)
-		os=bsd
+	-nsk*)
+		os=-nsk
 		;;
-	ctix* | uts*)
-		os=sysv
-		;;
-	nova*)
-		os=rtmk-nova
-		;;
-	ns2)
-		os=nextstep2
-		;;
 	# Preserve the version number of sinix5.
-	sinix5.*)
+	-sinix5.*)
 		os=`echo $os | sed -e 's|sinix|sysv|'`
 		;;
-	sinix*)
-		os=sysv4
+	-sinix*)
+		os=-sysv4
 		;;
-	tpf*)
-		os=tpf
+	-tpf*)
+		os=-tpf
 		;;
-	triton*)
-		os=sysv3
+	-triton*)
+		os=-sysv3
 		;;
-	oss*)
-		os=sysv3
+	-oss*)
+		os=-sysv3
 		;;
-	svr4*)
-		os=sysv4
+	-svr4*)
+		os=-sysv4
 		;;
-	svr3)
-		os=sysv3
+	-svr3)
+		os=-sysv3
 		;;
-	sysvr4)
-		os=sysv4
+	-sysvr4)
+		os=-sysv4
 		;;
-	# This must come after sysvr4.
-	sysv*)
+	# This must come after -sysvr4.
+	-sysv*)
 		;;
-	ose*)
-		os=ose
+	-ose*)
+		os=-ose
 		;;
-	*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
-		os=mint
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
 		;;
-	zvmoe)
-		os=zvmoe
+	-zvmoe)
+		os=-zvmoe
 		;;
-	dicos*)
-		os=dicos
+	-dicos*)
+		os=-dicos
 		;;
-	pikeos*)
+	-pikeos*)
 		# Until real need of OS specific support for
 		# particular features comes up, bare metal
 		# configurations are quite functional.
-		case $cpu in
+		case $basic_machine in
 		    arm*)
-			os=eabi
+			os=-eabi
 			;;
 		    *)
-			os=elf
+			os=-elf
 			;;
 		esac
 		;;
-	nacl*)
+	-nacl*)
 		;;
-	ios)
+	-ios)
 		;;
-	none)
+	-none)
 		;;
-	*-eabi)
-		;;
 	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
 		echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2
 		exit 1
 		;;
@@ -1528,181 +1543,175 @@
 # will signal an error saying that MANUFACTURER isn't an operating
 # system, and we'll never get to this point.
 
-case $cpu-$vendor in
+case $basic_machine in
 	score-*)
-		os=elf
+		os=-elf
 		;;
 	spu-*)
-		os=elf
+		os=-elf
 		;;
 	*-acorn)
-		os=riscix1.2
+		os=-riscix1.2
 		;;
 	arm*-rebel)
-		os=linux
+		os=-linux
 		;;
 	arm*-semi)
-		os=aout
+		os=-aout
 		;;
 	c4x-* | tic4x-*)
-		os=coff
+		os=-coff
 		;;
 	c8051-*)
-		os=elf
+		os=-elf
 		;;
-	clipper-intergraph)
-		os=clix
-		;;
 	hexagon-*)
-		os=elf
+		os=-elf
 		;;
 	tic54x-*)
-		os=coff
+		os=-coff
 		;;
 	tic55x-*)
-		os=coff
+		os=-coff
 		;;
 	tic6x-*)
-		os=coff
+		os=-coff
 		;;
 	# This must come before the *-dec entry.
 	pdp10-*)
-		os=tops20
+		os=-tops20
 		;;
 	pdp11-*)
-		os=none
+		os=-none
 		;;
 	*-dec | vax-*)
-		os=ultrix4.2
+		os=-ultrix4.2
 		;;
 	m68*-apollo)
-		os=domain
+		os=-domain
 		;;
 	i386-sun)
-		os=sunos4.0.2
+		os=-sunos4.0.2
 		;;
 	m68000-sun)
-		os=sunos3
+		os=-sunos3
 		;;
 	m68*-cisco)
-		os=aout
+		os=-aout
 		;;
 	mep-*)
-		os=elf
+		os=-elf
 		;;
 	mips*-cisco)
-		os=elf
+		os=-elf
 		;;
 	mips*-*)
-		os=elf
+		os=-elf
 		;;
 	or32-*)
-		os=coff
+		os=-coff
 		;;
 	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=sysv3
+		os=-sysv3
 		;;
 	sparc-* | *-sun)
-		os=sunos4.1.1
+		os=-sunos4.1.1
 		;;
 	pru-*)
-		os=elf
+		os=-elf
 		;;
 	*-be)
-		os=beos
+		os=-beos
 		;;
 	*-ibm)
-		os=aix
+		os=-aix
 		;;
 	*-knuth)
-		os=mmixware
+		os=-mmixware
 		;;
 	*-wec)
-		os=proelf
+		os=-proelf
 		;;
 	*-winbond)
-		os=proelf
+		os=-proelf
 		;;
 	*-oki)
-		os=proelf
+		os=-proelf
 		;;
 	*-hp)
-		os=hpux
+		os=-hpux
 		;;
 	*-hitachi)
-		os=hiux
+		os=-hiux
 		;;
 	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=sysv
+		os=-sysv
 		;;
 	*-cbm)
-		os=amigaos
+		os=-amigaos
 		;;
 	*-dg)
-		os=dgux
+		os=-dgux
 		;;
 	*-dolphin)
-		os=sysv3
+		os=-sysv3
 		;;
 	m68k-ccur)
-		os=rtu
+		os=-rtu
 		;;
 	m88k-omron*)
-		os=luna
+		os=-luna
 		;;
 	*-next)
-		os=nextstep
+		os=-nextstep
 		;;
 	*-sequent)
-		os=ptx
+		os=-ptx
 		;;
 	*-crds)
-		os=unos
+		os=-unos
 		;;
 	*-ns)
-		os=genix
+		os=-genix
 		;;
 	i370-*)
-		os=mvs
+		os=-mvs
 		;;
 	*-gould)
-		os=sysv
+		os=-sysv
 		;;
 	*-highlevel)
-		os=bsd
+		os=-bsd
 		;;
 	*-encore)
-		os=bsd
+		os=-bsd
 		;;
 	*-sgi)
-		os=irix
+		os=-irix
 		;;
 	*-siemens)
-		os=sysv4
+		os=-sysv4
 		;;
 	*-masscomp)
-		os=rtu
+		os=-rtu
 		;;
 	f30[01]-fujitsu | f700-fujitsu)
-		os=uxpv
+		os=-uxpv
 		;;
 	*-rom68k)
-		os=coff
+		os=-coff
 		;;
 	*-*bug)
-		os=coff
+		os=-coff
 		;;
 	*-apple)
-		os=macos
+		os=-macos
 		;;
 	*-atari*)
-		os=mint
+		os=-mint
 		;;
-	*-wrs)
-		os=vxworks
-		;;
 	*)
-		os=none
+		os=-none
 		;;
 esac
 fi
@@ -1709,80 +1718,79 @@
 
 # Here we handle the case where we know the os, and the CPU type, but not the
 # manufacturer.  We pick the logical manufacturer.
-case $vendor in
-	unknown)
+vendor=unknown
+case $basic_machine in
+	*-unknown)
 		case $os in
-			riscix*)
+			-riscix*)
 				vendor=acorn
 				;;
-			sunos*)
+			-sunos*)
 				vendor=sun
 				;;
-			cnk*|-aix*)
+			-cnk*|-aix*)
 				vendor=ibm
 				;;
-			beos*)
+			-beos*)
 				vendor=be
 				;;
-			hpux*)
+			-hpux*)
 				vendor=hp
 				;;
-			mpeix*)
+			-mpeix*)
 				vendor=hp
 				;;
-			hiux*)
+			-hiux*)
 				vendor=hitachi
 				;;
-			unos*)
+			-unos*)
 				vendor=crds
 				;;
-			dgux*)
+			-dgux*)
 				vendor=dg
 				;;
-			luna*)
+			-luna*)
 				vendor=omron
 				;;
-			genix*)
+			-genix*)
 				vendor=ns
 				;;
-			clix*)
-				vendor=intergraph
-				;;
-			mvs* | opened*)
+			-mvs* | -opened*)
 				vendor=ibm
 				;;
-			os400*)
+			-os400*)
 				vendor=ibm
 				;;
-			ptx*)
+			-ptx*)
 				vendor=sequent
 				;;
-			tpf*)
+			-tpf*)
 				vendor=ibm
 				;;
-			vxsim* | vxworks* | windiss*)
+			-vxsim* | -vxworks* | -windiss*)
 				vendor=wrs
 				;;
-			aux*)
+			-aux*)
 				vendor=apple
 				;;
-			hms*)
+			-hms*)
 				vendor=hitachi
 				;;
-			mpw* | macos*)
+			-mpw* | -macos*)
 				vendor=apple
 				;;
-			*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
 				vendor=atari
 				;;
-			vos*)
+			-vos*)
 				vendor=stratus
 				;;
 		esac
+		basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"`
 		;;
 esac
 
-echo "$cpu-$vendor-$os"
+echo "$basic_machine$os"
 exit
 
 # Local variables:

Modified: trunk/Build/source/utils/asymptote/configure
===================================================================
--- trunk/Build/source/utils/asymptote/configure	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/configure	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for Asymptote 2.52.
+# Generated by GNU Autoconf 2.69 for Asymptote 2.56.
 #
 # 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.52'
-PACKAGE_STRING='Asymptote 2.52'
+PACKAGE_VERSION='2.56'
+PACKAGE_STRING='Asymptote 2.56'
 PACKAGE_BUGREPORT='http://sourceforge.net/projects/asymptote'
 PACKAGE_URL=''
 
@@ -728,6 +728,7 @@
 enable_gsl
 enable_gl
 enable_offscreen
+enable_OpenImageIO
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1284,7 +1285,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.52 to adapt to many kinds of systems.
+\`configure' configures Asymptote 2.56 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1349,7 +1350,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of Asymptote 2.52:";;
+     short | recursive ) echo "Configuration of Asymptote 2.56:";;
    esac
   cat <<\_ACEOF
 
@@ -1371,6 +1372,8 @@
   --enable-gl[=yes]       enable OpenGL Library
   --enable-offscreen[=no] enable experimental offscreen rendering using OSMesa
                           library
+  --enable-openimageio[=no]
+                          enable experimental OpenImageIO Library
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -1464,7 +1467,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-Asymptote configure 2.52
+Asymptote configure 2.56
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2050,7 +2053,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.52, which was
+It was created by Asymptote $as_me 2.56, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -5816,18 +5819,37 @@
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
 
-ac_fn_cxx_check_header_mongrel "$LINENO" "unordered_map" "ac_cv_header_unordered_map" "$ac_includes_default"
-if test "x$ac_cv_header_unordered_map" = xyes; then :
+ac_fn_cxx_check_header_mongrel "$LINENO" "tr1/unordered_map" "ac_cv_header_tr1_unordered_map" "$ac_includes_default"
+if test "x$ac_cv_header_tr1_unordered_map" = xyes; then :
 
-$as_echo "#define HAVE_UNORDERED_MAP 1" >>confdefs.h
+fi
 
-else
-  ac_fn_cxx_check_header_mongrel "$LINENO" "tr1/unordered_map" "ac_cv_header_tr1_unordered_map" "$ac_includes_default"
-if test "x$ac_cv_header_tr1_unordered_map" = xyes; then :
 
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <tr1/unordered_map>
+    std::tr1::unordered_map<int,int> map;
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
 $as_echo "#define HAVE_TR1_UNORDERED_MAP 1" >>confdefs.h
 
 else
+
+  ac_fn_cxx_check_header_mongrel "$LINENO" "unordered_map" "ac_cv_header_unordered_map" "$ac_includes_default"
+if test "x$ac_cv_header_unordered_map" = xyes; then :
+
+$as_echo "#define HAVE_UNORDERED_MAP 1" >>confdefs.h
+
+else
   ac_fn_cxx_check_header_mongrel "$LINENO" "ext/hash_map" "ac_cv_header_ext_hash_map" "$ac_includes_default"
 if test "x$ac_cv_header_ext_hash_map" = xyes; then :
 
@@ -5840,9 +5862,8 @@
 
 
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
-
-
 GCVERSION=8.0.4
 ATOMICVERSION=7.6.10
 
@@ -6008,8 +6029,8 @@
 
 INCL=$INCL" -I/usr/include/tirpc"
 
-if test "$OSTYPE" = "msdos"; then
-CPPFLAGS=$CPPFLAGS" -D__MSDOS__ -DCALLBACK=__stdcall $INCL"
+if test "$OSTYPE" = "cygwin"; then
+CPPFLAGS=$CPPFLAGS" -D__MSDOS__ -I/usr/include/w32api -I/usr/include -DCALLBACK=__stdcall $INCL"
 else
 CPPFLAGS=$CPPFLAGS" $INCL"
 fi
@@ -6034,13 +6055,12 @@
 
 
 # Checks for libraries.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gamma in -lm" >&5
-$as_echo_n "checking for gamma in -lm... " >&6; }
-if ${ac_cv_lib_m_gamma+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing lgamma" >&5
+$as_echo_n "checking for library containing lgamma... " >&6; }
+if ${ac_cv_search_lgamma+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lm  $LIBS"
+  ac_func_search_save_LIBS=$LIBS
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -6050,32 +6070,44 @@
 #ifdef __cplusplus
 extern "C"
 #endif
-char gamma ();
+char lgamma ();
 int
 main ()
 {
-return gamma ();
+return lgamma ();
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  ac_cv_lib_m_gamma=yes
-else
-  ac_cv_lib_m_gamma=no
+for ac_lib in '' m c; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_cxx_try_link "$LINENO"; then :
+  ac_cv_search_lgamma=$ac_res
 fi
 rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+    conftest$ac_exeext
+  if ${ac_cv_search_lgamma+:} false; then :
+  break
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_gamma" >&5
-$as_echo "$ac_cv_lib_m_gamma" >&6; }
-if test "x$ac_cv_lib_m_gamma" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBM 1
-_ACEOF
+done
+if ${ac_cv_search_lgamma+:} false; then :
 
-  LIBS="-lm $LIBS"
+else
+  ac_cv_search_lgamma=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_lgamma" >&5
+$as_echo "$ac_cv_search_lgamma" >&6; }
+ac_res=$ac_cv_search_lgamma
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
 else
   as_fn_error $? "*** Please install libm on your system ***" "$LINENO" 5
@@ -7472,7 +7504,12 @@
 fi
 
 
-if test "x$enable_gl" != "xno"; then
+# Check whether --enable-OpenImageIO was given.
+if test "${enable_OpenImageIO+set}" = set; then :
+  enableval=$enable_OpenImageIO;
+fi
+
+
             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 :
 
@@ -7479,11 +7516,13 @@
 $as_echo "#define HAVE_LIBGLM 1" >>confdefs.h
 
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Could not find glm header files: will compile without OpenGL support ***" >&5
-$as_echo "$as_me: *** Could not find glm header files: will compile without OpenGL support ***" >&6;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Could not find glm header files: will compile without WebGL or OpenGL support ***" >&5
+$as_echo "$as_me: *** Could not find glm header files: will compile without WebGL or OpenGL support ***" >&6;}
 fi
 
 
+
+if test "x$enable_gl" != "xno"; then
                     for ac_header in ncurses/curses.h ncurses.h curses.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
@@ -7497,6 +7536,7 @@
 
 done
 
+if test "x$enable_openimageio" = "xyes"; then
             ac_fn_cxx_check_header_mongrel "$LINENO" "OpenEXR/ImathVec.h" "ac_cv_header_OpenEXR_ImathVec_h" "$ac_includes_default"
 if test "x$ac_cv_header_OpenEXR_ImathVec_h" = xyes; then :
   ac_fn_cxx_check_header_mongrel "$LINENO" "OpenImageIO/imageio.h" "ac_cv_header_OpenImageIO_imageio_h" "$ac_includes_default"
@@ -7552,9 +7592,10 @@
 fi
 
 
+fi
 
 case "$OSTYPE" in
-     msdos)
+     cygwin)
               { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GC_throw_bad_alloc in -lgccpp" >&5
 $as_echo_n "checking for GC_throw_bad_alloc in -lgccpp... " >&6; }
 if ${ac_cv_lib_gccpp_GC_throw_bad_alloc+:} false; then :
@@ -7782,8 +7823,8 @@
   LIBS="-lglut $LIBS"
 
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Could not find libglut: will compile without GLUT support ***" >&5
-$as_echo "$as_me: *** Could not find libglut: will compile without GLUT support ***" >&6;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Could not find libglut: will compile without OpenGL support ***" >&5
+$as_echo "$as_me: *** Could not find libglut: will compile without OpenGL support ***" >&6;}
 fi
 
          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glDepthMask in -lGL" >&5
@@ -8311,7 +8352,7 @@
 
 fi
 
-for ac_func in dup2 floor memset pow sqrt strchr tgamma memrchr
+for ac_func in dup2 floor memset strchr tgamma lgamma memrchr
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -9007,7 +9048,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.52, which was
+This file was extended by Asymptote $as_me 2.56, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -9069,7 +9110,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.52
+Asymptote config.status 2.56
 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-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/configure.ac	2019-10-06 17:17:34 UTC (rev 52300)
@@ -3,7 +3,7 @@
 # this file.
 
 AC_PREREQ(2)
-AC_INIT([Asymptote],[2.52],[http://sourceforge.net/projects/asymptote])
+AC_INIT([Asymptote],[2.56],[http://sourceforge.net/projects/asymptote])
 VERSION=$PACKAGE_VERSION
 AC_SUBST(VERSION)
 m4_include([ax_pthread.m4])
@@ -126,11 +126,17 @@
 Define to 1 if you have the `$1' library (-l$1).
 ])
 
-AC_CHECK_HEADER(unordered_map,AC_DEFINE(HAVE_UNORDERED_MAP,1,
-                              DEFINE[<unordered_map>]),
-        [AC_CHECK_HEADER(tr1/unordered_map,AC_DEFINE(HAVE_TR1_UNORDERED_MAP,1,
-                              DEFINE[<tr1/unordered_map>]),
-        [AC_CHECK_HEADER(ext/hash_map,,OPTIONS=$OPTIONS"-DNOHASH ")])])
+AC_CHECK_HEADER(tr1/unordered_map)
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+    [#include <tr1/unordered_map>]
+    [std::tr1::unordered_map<int,int> map;]
+  )],
+  AC_DEFINE(HAVE_TR1_UNORDERED_MAP,1,
+  DEFINE([<tr1/unordered_map>])),
+  [
+  AC_CHECK_HEADER(unordered_map,AC_DEFINE(HAVE_UNORDERED_MAP,1,
+                   DEFINE([<unordered_map>])),
+  [AC_CHECK_HEADER(ext/hash_map,,OPTIONS=$OPTIONS"-DNOHASH ")])])
 
 GCVERSION=8.0.4
 ATOMICVERSION=7.6.10
@@ -221,14 +227,14 @@
 
 INCL=$INCL" -I/usr/include/tirpc"
 
-if test "$OSTYPE" = "msdos"; then
-CPPFLAGS=$CPPFLAGS" -D__MSDOS__ -DCALLBACK=__stdcall $INCL"
+if test "$OSTYPE" = "cygwin"; then
+CPPFLAGS=$CPPFLAGS" -D__MSDOS__ -I/usr/include/w32api -I/usr/include -DCALLBACK=__stdcall $INCL"
 else
 CPPFLAGS=$CPPFLAGS" $INCL"
 fi
 
 AC_CHECK_FUNC(getopt_long_only, AC_DEFINE(HAVE_GNU_GETOPT_H, 1,
-                           DEFINE[GNU <getopt.h>]),
+                           DEFINE([GNU <getopt.h>])),
                            getopt="getopt getopt1",)
 
 AC_SUBST(getopt)
@@ -241,7 +247,7 @@
 AC_SUBST(OPTIONS)
 
 # Checks for libraries.
-AC_CHECK_LIB([m], [gamma],,
+AC_SEARCH_LIBS([lgamma],[m c],,
 AC_MSG_ERROR([*** Please install libm on your system ***]))
 AC_CHECK_LIB([z], [deflate],,
 AC_MSG_ERROR([*** Please install libz or zlib-devel on your system ***]))
@@ -339,7 +345,7 @@
 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include "xstream.h"])],
                    [AC_SEARCH_LIBS([xdrstdio_create],[nsl tirpc])
                     AC_DEFINE(HAVE_RPC_RPC_H,1,
-                   DEFINE[a working <tirpc/rpc/rpc.h> header])],
+                   DEFINE([a working <tirpc/rpc/rpc.h> header]))],
    AC_MSG_WARN([*** Broken rpc headers; XDR support disabled ***]))
 
 AC_ARG_ENABLE(gsl,
@@ -359,17 +365,23 @@
 AC_ARG_ENABLE(offscreen,
 [AS_HELP_STRING(--enable-offscreen[[[=no]]],enable experimental offscreen rendering using OSMesa library)])
 
-if test "x$enable_gl" != "xno"; then
+AC_ARG_ENABLE(OpenImageIO,
+[AS_HELP_STRING(--enable-openimageio[[[=no]]],enable experimental OpenImageIO Library)])
+
             AC_CHECK_HEADER(glm/glm.hpp,
                        [AC_DEFINE(HAVE_LIBGLM,1,
-                    DEFINE[the <glm/glm.hpp> header])],AC_MSG_NOTICE([*** Could not find glm header files: will compile without OpenGL support ***]))
+                    DEFINE([the <glm/glm.hpp> header]))],AC_MSG_NOTICE([*** Could not find glm header files: will compile without WebGL or OpenGL support ***]))
+
+if test "x$enable_gl" != "xno"; then
                     AC_CHECK_HEADERS([ncurses/curses.h ncurses.h curses.h],[break])
+if test "x$enable_openimageio" = "xyes"; then
             AC_CHECK_HEADER([OpenEXR/ImathVec.h],
                 AC_CHECK_HEADER([OpenImageIO/imageio.h],
                         AC_CHECK_LIB([OpenImageIO],[open])))
+fi
 
 case "$OSTYPE" in
-     msdos)
+     cygwin)
               AC_CHECK_LIB([gccpp],[GC_throw_bad_alloc])
               AC_CHECK_HEADER(GL/glut.h,
                                   [AC_DEFINE(HAVE_LIBGLUT,1,
@@ -386,7 +398,7 @@
               AC_CHECK_LIB([gccpp],[GC_throw_bad_alloc])
               AC_CHECK_HEADER(OpenGL/gl.h,
                              [AC_DEFINE(HAVE_LIBGL,1,
-                             DEFINE[<gl.h> header])])
+                             DEFINE([<gl.h> header]))])
               AC_CHECK_HEADER(GLUT/glut.h, [AC_DEFINE(HAVE_LIBGLUT,1,
                    DEFINE_LIB[GLUT])
                            LIBS=$LIBS"-framework GLUT -framework OpenGL -framework Cocoa glew.o "],
@@ -395,10 +407,10 @@
      *)
          AC_CHECK_LIB([gccpp],[GC_throw_bad_alloc])
           AC_CHECK_LIB([glut], [glutMainLoop],,
-                       AC_MSG_NOTICE([*** Could not find libglut: will compile without GLUT support ***]))
+                       AC_MSG_NOTICE([*** Could not find libglut: will compile without OpenGL support ***]))
          AC_CHECK_LIB([GL], [glDepthMask],
                                  [AC_DEFINE(HAVE_LIBGL,1,
-                             DEFINE_LIB[GL])
+                             DEFINE_LIB([GL]))
                              LIBS=$LIBS"-lGL glew.o "],
                                    AC_MSG_NOTICE([*** Could not find libGL: will compile without OpenGL support ***]))
 esac
@@ -424,7 +436,7 @@
 
 # Checks for library functions.
 AC_FUNC_FORK
-AC_CHECK_FUNCS([dup2 floor memset pow sqrt strchr tgamma memrchr])
+AC_CHECK_FUNCS([dup2 floor memset strchr tgamma lgamma memrchr])
 AC_FUNC_STRFTIME
 ac_FUNC_STRPTIME
 AC_FUNC_ERROR_AT_LINE

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-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/doc/FAQ/asy-faq.info	2019-10-06 17:17:34 UTC (rev 52300)
@@ -10,7 +10,7 @@
 File: asy-faq.info, Node: Top, Next: Question 1.1, Up: (dir)
 
             ASYMPTOTE FREQUENTLY ASKED QUESTIONS
-                            09 Aug 2019
+                            03 Oct 2019
                           
 This is the list of Frequently Asked Questions about Asymptote (asy).
 

Modified: trunk/Build/source/utils/asymptote/doc/FAQ/install-sh
===================================================================
--- trunk/Build/source/utils/asymptote/doc/FAQ/install-sh	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/doc/FAQ/install-sh	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2018-03-11.20; # UTC
+scriptversion=2009-04-28.21; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -35,21 +35,25 @@
 # FSF changes to this file are in the public domain.
 #
 # Calling this script install-sh is preferred over install.sh, to prevent
-# 'make' implicit rules from creating a file called install from it
+# `make' implicit rules from creating a file called install from it
 # when there is no Makefile.
 #
 # This script is compatible with the BSD install script, but was written
 # from scratch.
 
-tab='	'
 nl='
 '
-IFS=" $tab$nl"
+IFS=" ""	$nl"
 
-# Set DOITPROG to "echo" to test this script.
+# set DOITPROG to echo to test this script
 
+# Don't use :- since 4.3BSD and earlier shells don't like it.
 doit=${DOITPROG-}
-doit_exec=${doit:-exec}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
 
 # Put in absolute file names if you don't have them in your path;
 # or use environment vars.
@@ -64,6 +68,17 @@
 rmprog=${RMPROG-rm}
 stripprog=${STRIPPROG-strip}
 
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
 posix_mkdir=
 
 # Desired mode of installed file.
@@ -82,7 +97,7 @@
 dst_arg=
 
 copy_on_change=false
-is_target_a_directory=possibly
+no_target_directory=
 
 usage="\
 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@@ -122,41 +137,36 @@
     -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
-        shift;;
+	shift;;
 
     --help) echo "$usage"; exit $?;;
 
     -m) mode=$2
-        case $mode in
-          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
-            echo "$0: invalid mode: $mode" >&2
-            exit 1;;
-        esac
-        shift;;
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
 
     -o) chowncmd="$chownprog $2"
-        shift;;
+	shift;;
 
     -s) stripcmd=$stripprog;;
 
-    -t)
-        is_target_a_directory=always
-        dst_arg=$2
-        # Protect names problematic for 'test' and other utilities.
-        case $dst_arg in
-          -* | [=\(\)!]) dst_arg=./$dst_arg;;
-        esac
-        shift;;
+    -t) dst_arg=$2
+	shift;;
 
-    -T) is_target_a_directory=never;;
+    -T) no_target_directory=true;;
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
-    --) shift
-        break;;
+    --)	shift
+	break;;
 
-    -*) echo "$0: invalid option: $1" >&2
-        exit 1;;
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
 
     *)  break;;
   esac
@@ -163,16 +173,6 @@
   shift
 done
 
-# We allow the use of options -d and -T together, by making -d
-# take the precedence; this is for compatibility with GNU install.
-
-if test -n "$dir_arg"; then
-  if test -n "$dst_arg"; then
-    echo "$0: target directory not allowed when installing a directory." >&2
-    exit 1
-  fi
-fi
-
 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
   # When -d is used, all remaining arguments are directories to create.
   # When -t is used, the destination is already specified.
@@ -186,10 +186,6 @@
     fi
     shift # arg
     dst_arg=$arg
-    # Protect names problematic for 'test' and other utilities.
-    case $dst_arg in
-      -* | [=\(\)!]) dst_arg=./$dst_arg;;
-    esac
   done
 fi
 
@@ -198,27 +194,14 @@
     echo "$0: no input file specified." >&2
     exit 1
   fi
-  # It's OK to call 'install-sh -d' without argument.
+  # It's OK to call `install-sh -d' without argument.
   # This can happen when creating conditional directories.
   exit 0
 fi
 
 if test -z "$dir_arg"; then
-  if test $# -gt 1 || test "$is_target_a_directory" = always; then
-    if test ! -d "$dst_arg"; then
-      echo "$0: $dst_arg: Is not a directory." >&2
-      exit 1
-    fi
-  fi
-fi
+  trap '(exit $?); exit' 1 2 13 15
 
-if test -z "$dir_arg"; then
-  do_exit='(exit $ret); exit $ret'
-  trap "ret=129; $do_exit" 1
-  trap "ret=130; $do_exit" 2
-  trap "ret=141; $do_exit" 13
-  trap "ret=143; $do_exit" 15
-
   # Set umask so as not to create temps with too-generous modes.
   # However, 'strip' requires both read and write access to temps.
   case $mode in
@@ -228,16 +211,16 @@
 
     *[0-7])
       if test -z "$stripcmd"; then
-        u_plus_rw=
+	u_plus_rw=
       else
-        u_plus_rw='% 200'
+	u_plus_rw='% 200'
       fi
       cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
     *)
       if test -z "$stripcmd"; then
-        u_plus_rw=
+	u_plus_rw=
       else
-        u_plus_rw=,u+rw
+	u_plus_rw=,u+rw
       fi
       cp_umask=$mode$u_plus_rw;;
   esac
@@ -245,9 +228,9 @@
 
 for src
 do
-  # Protect names problematic for 'test' and other utilities.
+  # Protect names starting with `-'.
   case $src in
-    -* | [=\(\)!]) src=./$src;;
+    -*) src=./$src;;
   esac
 
   if test -n "$dir_arg"; then
@@ -269,115 +252,129 @@
       echo "$0: no destination specified." >&2
       exit 1
     fi
+
     dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
 
-    # If destination is a directory, append the input filename.
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
     if test -d "$dst"; then
-      if test "$is_target_a_directory" = never; then
-        echo "$0: $dst_arg: Is a directory" >&2
-        exit 1
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
       fi
       dstdir=$dst
-      dstbase=`basename "$src"`
-      case $dst in
-	*/) dst=$dst$dstbase;;
-	*)  dst=$dst/$dstbase;;
-      esac
+      dst=$dstdir/`basename "$src"`
       dstdir_status=0
     else
-      dstdir=`dirname "$dst"`
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
       test -d "$dstdir"
       dstdir_status=$?
     fi
   fi
 
-  case $dstdir in
-    */) dstdirslash=$dstdir;;
-    *)  dstdirslash=$dstdir/;;
-  esac
-
   obsolete_mkdir_used=false
 
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
-        # Create intermediate dirs using mode 755 as modified by the umask.
-        # This is like FreeBSD 'install' as of 1997-10-28.
-        umask=`umask`
-        case $stripcmd.$umask in
-          # Optimize common cases.
-          *[2367][2367]) mkdir_umask=$umask;;
-          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
 
-          *[0-7])
-            mkdir_umask=`expr $umask + 22 \
-              - $umask % 100 % 40 + $umask % 20 \
-              - $umask % 10 % 4 + $umask % 2
-            `;;
-          *) mkdir_umask=$umask,go-w;;
-        esac
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
 
-        # With -d, create the new directory with the user-specified mode.
-        # Otherwise, rely on $mkdir_umask.
-        if test -n "$dir_arg"; then
-          mkdir_mode=-m$mode
-        else
-          mkdir_mode=
-        fi
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
 
-        posix_mkdir=false
-        case $umask in
-          *[123567][0-7][0-7])
-            # POSIX mkdir -p sets u+wx bits regardless of umask, which
-            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-            ;;
-          *)
-            # Note that $RANDOM variable is not portable (e.g. dash);  Use it
-            # here however when possible just to lower collision chance.
-            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
 
-            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-            # Because "mkdir -p" follows existing symlinks and we likely work
-            # directly in world-writeable /tmp, make sure that the '$tmpdir'
-            # directory is successfully created first before we actually test
-            # 'mkdir -p' feature.
-            if (umask $mkdir_umask &&
-                $mkdirprog $mkdir_mode "$tmpdir" &&
-                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
-            then
-              if test -z "$dir_arg" || {
-                   # Check for POSIX incompatibilities with -m.
-                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-                   # other-writable bit of parent directory when it shouldn't.
-                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-                   test_tmpdir="$tmpdir/a"
-                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
-                   case $ls_ld_tmpdir in
-                     d????-?r-*) different_mode=700;;
-                     d????-?--*) different_mode=755;;
-                     *) false;;
-                   esac &&
-                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
-                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
-                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-                   }
-                 }
-              then posix_mkdir=:
-              fi
-              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
-            else
-              # Remove any dirs left behind by ancient mkdir implementations.
-              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
-            fi
-            trap '' 0;;
-        esac;;
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
     esac
 
     if
       $posix_mkdir && (
-        umask $mkdir_umask &&
-        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
       )
     then :
     else
@@ -387,17 +384,19 @@
       # directory the slow way, step by step, checking for races as we go.
 
       case $dstdir in
-        /*) prefix='/';;
-        [-=\(\)!]*) prefix='./';;
-        *)  prefix='';;
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
       esac
 
+      eval "$initialize_posix_glob"
+
       oIFS=$IFS
       IFS=/
-      set -f
+      $posix_glob set -f
       set fnord $dstdir
       shift
-      set +f
+      $posix_glob set +f
       IFS=$oIFS
 
       prefixes=
@@ -404,34 +403,34 @@
 
       for d
       do
-        test X"$d" = X && continue
+	test -z "$d" && continue
 
-        prefix=$prefix$d
-        if test -d "$prefix"; then
-          prefixes=
-        else
-          if $posix_mkdir; then
-            (umask=$mkdir_umask &&
-             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-            # Don't fail if two instances are running concurrently.
-            test -d "$prefix" || exit 1
-          else
-            case $prefix in
-              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-              *) qprefix=$prefix;;
-            esac
-            prefixes="$prefixes '$qprefix'"
-          fi
-        fi
-        prefix=$prefix/
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
       done
 
       if test -n "$prefixes"; then
-        # Don't fail if two instances are running concurrently.
-        (umask $mkdir_umask &&
-         eval "\$doit_exec \$mkdirprog $prefixes") ||
-          test -d "$dstdir" || exit 1
-        obsolete_mkdir_used=true
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
       fi
     fi
   fi
@@ -444,25 +443,14 @@
   else
 
     # Make a couple of temp file names in the proper directory.
-    dsttmp=${dstdirslash}_inst.$$_
-    rmtmp=${dstdirslash}_rm.$$_
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
 
     # Trap to clean up those temp files at exit.
     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
 
     # Copy the file name to the temp name.
-    (umask $cp_umask &&
-     { test -z "$stripcmd" || {
-	 # Create $dsttmp read-write so that cp doesn't create it read-only,
-	 # which would cause strip to fail.
-	 if test -z "$doit"; then
-	   : >"$dsttmp" # No need to fork-exec 'touch'.
-	 else
-	   $doit touch "$dsttmp"
-	 fi
-       }
-     } &&
-     $doit_exec $cpprog "$src" "$dsttmp") &&
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
 
     # and set any options; do chmod last to preserve setuid bits.
     #
@@ -477,12 +465,15 @@
 
     # If -C, don't bother to copy if it wouldn't change the file.
     if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
-       set -f &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
        set X $old && old=:$2:$4:$5:$6 &&
        set X $new && new=:$2:$4:$5:$6 &&
-       set +f &&
+       $posix_glob set +f &&
+
        test "$old" = "$new" &&
        $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
     then
@@ -495,24 +486,24 @@
       # to itself, or perhaps because mv is so ancient that it does not
       # support -f.
       {
-        # Now remove or move aside any old file at destination location.
-        # We try this two ways since rm can't unlink itself on some
-        # systems and the destination file might be busy for other
-        # reasons.  In this case, the final cleanup might fail but the new
-        # file should still install successfully.
-        {
-          test ! -f "$dst" ||
-          $doit $rmcmd -f "$dst" 2>/dev/null ||
-          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-          } ||
-          { echo "$0: cannot unlink or rename $dst" >&2
-            (exit 1); exit 1
-          }
-        } &&
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
 
-        # Now rename the file to the real destination.
-        $doit $mvcmd "$dsttmp" "$dst"
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
       }
     fi || exit 1
 
@@ -521,9 +512,9 @@
 done
 
 # Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
+# eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC0"
+# time-stamp-time-zone: "UTC"
 # time-stamp-end: "; # UTC"
 # End:

Modified: trunk/Build/source/utils/asymptote/doc/Makefile.in
===================================================================
--- trunk/Build/source/utils/asymptote/doc/Makefile.in	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/doc/Makefile.in	2019-10-06 17:17:34 UTC (rev 52300)
@@ -24,7 +24,7 @@
 
 dvi:	doc asymptote.dvi
 
-doc:	$(DOCFILES) asy.1 faq latexusage.eps
+doc:	$(DOCFILES) asy.1 faq
 	cd png && $(MAKE) all
 
 manpage: $(MANFILES)
@@ -41,20 +41,14 @@
 %.pdf:	%.asy
 	$(ASY) -f pdf -noprc $<
 
-latexusage.dvi: latexusage.tex asymptote.sty
+latexusage.pdf: latexusage.tex asymptote.sty
 	rm -f latexusage-*
 	rm -f latexusage.pre
 	rm -f latexusage.aux
-	latex latexusage
+	pdflatex latexusage
 	$(ASY) -noprc latexusage-*.asy
-	latex latexusage
+	pdflatex latexusage
 
-latexusage.eps: latexusage.dvi
-	dvips -o latexusage.eps latexusage
-
-latexusage.pdf: latexusage.dvi
-	dvipdf -P latexusage
-
 options: ../settings.cc
 	$(ASY) -h 2>&1 | grep -iv Asymptote > options
 
@@ -72,19 +66,16 @@
 	-$(TEXI2DVI) --pdf asymptote.texi
 
 CAD.pdf: CAD.tex CAD1.eps 
-	latex CAD
-	latex CAD
-	latex CAD
-	dvipdf -P CAD
+	pdflatex CAD
+	pdflatex CAD
+	pdflatex CAD
 
 TeXShopAndAsymptote.pdf: TeXShopAndAsymptote.tex
-	latex TeXShopAndAsymptote
-	latex TeXShopAndAsymptote
-	dvipdf -P TeXShopAndAsymptote
+	pdflatex TeXShopAndAsymptote
+	pdflatex TeXShopAndAsymptote
 
 asyRefCard.pdf: asyRefCard.tex
-	tex asyRefCard
-	dvipdf -P asyRefCard
+	pdftex asyRefCard
 
 clean: FORCE
 	-rm -f asy-latex.{aux,idx,ins,log,toc}
@@ -112,7 +103,7 @@
 	cd png && $(MAKE) install
 	cd FAQ && $(MAKE) install-prebuilt
 
-install-all: $(DOCFILES) $(MANFILES) faq latexusage.eps install-man
+install-all: $(DOCFILES) $(MANFILES) faq install-man
 	cd png && $(MAKE) install-all
 	cd FAQ && $(MAKE) install-info
 

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

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-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/doc/asy.1	2019-10-06 17:17:34 UTC (rev 52300)
@@ -34,6 +34,9 @@
 .B \-V,\-View             
 View output; command-line only.
 .TP
+.B \-absolute            
+Use absolute WebGL dimensions [false].
+.TP
 .B \-a,\-align C|B|T|Z    
 Center, Bottom, Top, or Zero page alignment [C].
 .TP
@@ -43,9 +46,6 @@
 .B \-antialias n         
 Antialiasing width for rasterized output [2].
 .TP
-.B \-arcballradius pixels
-Arcball radius [750].
-.TP
 .B \-auto3D              
 Automatically activate 3D scene [true].
 .TP
@@ -91,12 +91,12 @@
 .B \-d,\-debug            
 Enable debugging messages [false].
 .TP
+.B \-digits n            
+Default output file precision [6].
+.TP
 .B \-divisor n           
 Garbage collect using purge(divisor=n) [2].
 .TP
-.B \-doubleclick ms      
-Emulated double-click timeout [200].
-.TP
 .B \-embed               
 Embed rendered preview image [true].
 .TP
@@ -184,6 +184,9 @@
 .B \-multisample n       
 Multisampling width for screen images [4].
 .TP
+.B \-offline             
+Produce offline html files [false].
+.TP
 .B \-offscreen           
 Use offscreen rendering [false].
 .TP
@@ -238,6 +241,12 @@
 .B \-scroll n            
 Scroll standard output n lines at a time [0].
 .TP
+.B \-shiftHoldDistance n 
+WebGL touch screen distance limit for shift mode [20].
+.TP
+.B \-shiftWaitTime ms    
+WebGL touch screen shift mode delay [200].
+.TP
 .B \-spinstep deg/s      
 Spin speed [60].
 .TP
@@ -280,6 +289,12 @@
 .B \-version             
 Show version; command-line only.
 .TP
+.B \-vibrateTime ms      
+WebGL shift mode vibrate duration [25].
+.TP
+.B \-viewportmargin pair 
+Horizontal and vertical 3D viewport margin [(0.5,0.5)].
+.TP
 .B \-wait                
 Wait for child processes to finish before exiting [false].
 .TP
@@ -292,6 +307,12 @@
 .B \-xasy                
 Special interactive mode for xasy [false].
 .TP
+.B \-zoomPinchCap limit  
+WebGL maximum zoom pinch [100].
+.TP
+.B \-zoomPinchFactor n   
+WebGL zoom pinch sensitivity [10].
+.TP
 .B \-zoomfactor factor   
 Zoom step factor [1.05].
 .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.texi
===================================================================
--- trunk/Build/source/utils/asymptote/doc/asymptote.texi	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/doc/asymptote.texi	2019-10-06 17:17:34 UTC (rev 52300)
@@ -84,7 +84,7 @@
 Tutorial
 
 * Drawing in batch mode::       Run @code{Asymptote} on a text file
-* Drawing in interactive mode:: Running @code{Asymptote} interactively
+* Drawing in interactive mode::  Running @code{Asymptote} interactively
 * Figure size::                 Specifying the figure size
 * Labels::                      Adding @code{LaTeX} labels
 * Paths::                       Drawing lines and curves
@@ -221,6 +221,9 @@
 
 @item @code{LaTeX} typesetting of labels, for overall document consistency;
 
+ at item the ability to generate and embed 3D vector @acronym{WebGL}
+graphics within @acronym{HTML} files;
+
 @item the ability to generate and embed 3D vector @acronym{PRC}
 graphics within @acronym{PDF} files;
 
@@ -254,7 +257,7 @@
 @code{Asymptote} language itself. While the stock version of
 @code{Asymptote} is designed for mathematics typesetting needs, one can
 write @code{Asymptote} modules that tailor it to specific
-applications. A scientific graphing module has already been written
+applications; for example, a scientific graphing module is available
 (@pxref{graph}). Examples of @code{Asymptote} code and output,
 including animations, are available at
 @quotation
@@ -382,7 +385,7 @@
 @url{http://www.imagemagick.org/script/binary-releases.php} 
 
 @noindent
-is required to support output formats other than @acronym{EPS},
+is required to support output formats other than @acronym{HTML},
 @acronym{PDF}, @acronym{SVG}, and @acronym{PNG} (@pxref{convert}).
 The @code{Python 3} interpreter from @url{http://www.python.org} is only required
 if you wish to try out the graphical user interface (@pxref{GUI}).
@@ -396,15 +399,11 @@
 @section Configuring
 @cindex configuring
 @cindex @code{-V}
- at cindex @code{psviewer}
- at cindex @code{pdfviewer}
- at cindex @code{gs}
 In interactive mode, or when given the @code{-V} option (the default
 when running @code{Asymptote} on a single file under @code{MSDOS}),
 @code{Asymptote} will automatically invoke the @code{PostScript}
 viewer @code{gv} (under @code{UNIX}) or @code{gsview} (under
- at code{MSDOS} to display graphical output. These defaults may be
-overridden with the configuration variable @code{psviewer}. 
+ at code{MSDOS} to display graphical output.
 The @code{PostScript} viewer should be capable of automatically
 redrawing whenever the output file is updated. The default @code{UNIX}
 @code{PostScript} viewer @code{gv} supports this (via a @code{SIGHUP}
@@ -418,40 +417,58 @@
 @code{gsview} window; under @code{UNIX} one must manually redisplay by
 pressing the @code{r} key).
 
+ at cindex @code{psviewer}
+ at cindex @code{pdfviewer}
+ at cindex @code{htmlviewer}
+ at cindex @code{gs}
+ at cindex @code{display}
+ at cindex @code{animate}
 @cindex @code{settings}
 @cindex configuration file
 Configuration variables are most easily set as @code{Asymptote}
 variables in an optional configuration file @code{config.asy}
 @pxref{configuration file}).
-Here are the default values of several important configuration
-variables under @code{UNIX}:
+For example, the setting @code{pdfviewer} specifies the location of
+the @acronym{PDF} viewer. Here are the default values of several
+important configuration variables under @code{UNIX}:
 
 @noindent
 @verbatim
 import settings;
+pdfviewer="acroread";
+htmlviewer="google-chrome";
 psviewer="gv";
-pdfviewer="acroread";
+display="display";
+animate="animate";
 gs="gs";
+libgs="";
 @end verbatim
 
 @noindent
 @cindex @code{cmd}
-Under @code{MSDOS}, the (installation-dependent) default values of
-these configuration variables are determined automatically from the
- at code{Microsoft Windows} registry. Viewer settings (such as
- at code{psviewer} and @code{pdfviewer}) can be set to the string
- at code{cmd} to request the application normally associated with the
-corresponding file type.
+Under @code{MSDOS}, the viewer settings
+ at code{htmlviewer}, @code{pdfviewer}, @code{psviewer},
+ at code{display}, and @code{animate} default to the string @code{cmd},
+requesting the application normally associated with each file type.
+The (installation-dependent) default values of @code{gs}
+and @code{libgs} are determined automatically from the @code{Microsoft
+Windows} registry. The @code{gs} setting specifies the location of the
+ at code{PostScript} processor @code{Ghostscript}, available from
+ at url{https://www.ghostscript.com/}.
 
-For @acronym{PDF} format output, the @code{gs} setting specifies the
-location of the @code{PostScript}-to- at acronym{PDF} processor @code{Ghostscript},
-available from @url{http://downloads.ghostscript.com/public}.
-
-The setting @code{pdfviewer} specifies the location of the @acronym{PDF}
-viewer. On @code{UNIX} systems, to support automatic document
-reloading in @code{Adobe Reader}, we recommend copying the file
- at code{reload.js} from the @code{Asymptote} system directory (by default,
- at code{@value{Datadir}/asymptote} under @code{UNIX} to
+ at noindent
+ at cindex @code{htmlviewer}
+The configuration variable @code{htmlviewer} specifies the 
+browser to use to display 3D @code{WebGL} output.
+The default setting is @code{google-chrome} under @code{UNIX} and
+ at code{cmd} under @code{Microsoft Windows}. Note that @code{Internet Explorer}
+does not support @code{WebGL}; @code{Microsoft Windows} users should set their
+default html browser to @code{chrome} or @code{microsoft-edge}.
+ 
+On @code{UNIX} systems, to support automatic document
+reloading of @code{PDF} files in @code{Adobe Reader}, we recommend
+copying the file @code{reload.js} from the @code{Asymptote} system
+directory (by default, @code{@value{Datadir}/asymptote} under @code{UNIX} to
 @code{~/.adobe/Acrobat/x.x/JavaScripts/},
 where @code{x.x} represents the appropriate @code{Adobe Reader}
 version number. The automatic document reload feature must then be
@@ -485,12 +502,10 @@
 @cindex @code{texcommand}
 @cindex @code{dvips}
 @cindex @code{dvisvgm}
- at cindex @code{libgs}
 @cindex @code{convert}
- at cindex @code{display}
- at cindex @code{animate}
 @cindex @code{ImageMagick}
-The following configuration variables normally do not require adjustment:
+ at cindex @code{asygl}
+These additional configuration variables normally do not require adjustment:
 @verbatim
 config
 texpath
@@ -497,10 +512,7 @@
 texcommand
 dvips
 dvisvgm
-libgs
 convert
-display
-animate
 @end verbatim
 @noindent
 
@@ -777,7 +789,7 @@
 
 @menu
 * Drawing in batch mode::       Run @code{Asymptote} on a text file
-* Drawing in interactive mode:: Running @code{Asymptote} interactively
+* Drawing in interactive mode::  Running @code{Asymptote} interactively
 * Figure size::                 Specifying the figure size
 * Labels::                      Adding @code{LaTeX} labels
 * Paths::                       Drawing lines and curves
@@ -4384,7 +4396,7 @@
 addition
 @cindex @code{-}
 @item -
-subtractiona
+subtraction
 @cindex @code{*}
 @item *
 multiplication
@@ -5585,7 +5597,7 @@
 Another useful mode is comma-separated-value mode,
 @code{file csv(bool b=true)}, which causes reads to respect comma delimiters:
 @verbatim
-file fin=csv(input("test.txt"));
+file fin=input("test.txt").csv();
 real[] A=fin;
 @end verbatim
 
@@ -5594,7 +5606,7 @@
 function: 
 @verbatim
 file fin=input("test.txt");
-real[] A=dimension(fin,10);
+real[] A=fin.dimension(10);
 @end verbatim
 
 This reads 10 values into A, unless end-of-file (or end-of-line in line mode)
@@ -7786,17 +7798,70 @@
 @code{name} parameter is used as a prefix for naming the surface
 patches in the @acronym{PRC} model tree.
 Here material is a structure defined in @code{three_light.asy}:
+ at cindex @code{material}
+ at cindex @code{diffusepen}
+ at cindex @code{emissivepen}
+ at cindex @code{specularpen}
+ at cindex @code{opacity}
+ at cindex @code{shininess}
+ at cindex @code{metallic}
+ at cindex @code{freshnel0}
 @verbatim
 struct material {
   pen[] p; // diffusepen,emissivepen,specularpen
   real opacity;
   real shininess;  
-...
+  real metallic;
+  real fresnel0;
 }
 @end verbatim
 @noindent
-These material properties are used to implement @code{OpenGL}-style lighting,
-based on the Phong-Blinn specular model. Sample Bezier surfaces are
+ at cindex @code{PBR}
+ at cindex @code{physically based rendering}
+These material properties are used to implement physically based
+rendering (PBR) using light properties defined in @code{plain_prethree.asy}
+and @code{three_light.asy}:
+ at cindex @code{light}
+ at cindex @code{diffuse}
+ at cindex @code{specular}
+ at cindex @code{background}
+ at cindex @code{specularfactor}
+ at cindex @code{position}
+ at cindex @code{currentlight}
+ at cindex @code{Viewport}
+ at cindex @code{White}
+ at cindex @code{Headlamp}
+ at cindex @code{nolight}
+ at verbatim
+struct light {
+  real[][] diffuse;
+  real[][] specular;
+  pen background=nullpen; // Background color of the 3D canvas.
+  real specularfactor;
+  triple[] position; // Only directional lights are currently implemented.
+}
+
+light Viewport=light(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,
+  new triple[] {(-2,-1.5,-0.5),(2,1.1,-2.5),(-0.5,0,2)});
+
+light Headlamp=light(gray(0.8),specular=gray(0.7),
+                     specularfactor=3,dir(42,48));
+
+currentlight=Headlamp;
+
+light nolight;
+ at end verbatim
+ at cindex @code{background}
+ at cindex @code{transparent}
+The @code{background} pen can be use to set the 3D @code{OpenGL}
+background colour (the default is white). In the case of
+3D @code{WebGL} images one can request a completely transparent background with
+ at code{currentlight.background=black+opacity(0.0);}
+
+Sample Bezier surfaces are
 contained in the example files @code{@uref{http://asymptote.sourceforge.net/gallery/BezierSurface.pdf,,BezierSurface}@uref{http://asymptote.sourceforge.net/gallery/BezierSurface.asy,,.asy}}, @code{@uref{http://asymptote.sourceforge.net/gallery/teapot.pdf,,teapot}@uref{http://asymptote.sourceforge.net/gallery/teapot.asy,,.asy}},
 and @code{@uref{http://asymptote.sourceforge.net/gallery/parametricsurface.pdf,,parametricsurface}@uref{http://asymptote.sourceforge.net/gallery/parametricsurface.asy,,.asy}}. The structure @code{render} contains
 specialized rendering options documented at the beginning of module 
@@ -7863,14 +7928,16 @@
 @cindex @code{tessellation}
 @verbatim
 void draw(picture pic=currentpicture, triple[] v, int[][] vi,
-          triple[] n={}, int[][] ni={}, material m=currentpen, pen[] p={},
-          int[][] pi={}, light light=currentlight);
+          triple[] n={}, int[][] ni=vi, material m=currentpen, pen[] p={},
+          int[][] pi=vi, light light=currentlight);
 @end verbatim
-Here, the triple array @code{v} lists the distinct vertices, while
-the array @code{vi} lists integer arrays of length 3 containing
-the indices of @code{v} corresponding to the vertices of each
+Here, the triple array @code{v} lists the (typically distinct) vertices, while
+the array @code{vi} contains integer arrays of length 3 containing
+the indices of the elements in @code{v} that form the vertices of each
 triangle. Similarly, the arguments @code{n} and @code{ni} contain
-optional normal data and @code{p} and @code{pi} contain optional pen vertex data.
+optional normal data and @code{p} and @code{pi} contain optional pen
+vertex data. If more than one normal or pen is specified for a vertex, the
+last one specified is used.
 An example of this tessellation facility is given in @code{@uref{http://asymptote.sourceforge.net/gallery/triangles.pdf,,triangles}@uref{http://asymptote.sourceforge.net/gallery/triangles.asy,,.asy}}.
 
 @cindex @code{thin}
@@ -7897,8 +7964,9 @@
 also be used to override these defaults for specific draw commands. 
 
 @noindent
-There are four choices for viewing 3D @code{Asymptote} output: 
+There are five choices for viewing 3D @code{Asymptote} output: 
 @enumerate
+
 @cindex @code{OpenGL}
 @cindex @code{render}
 @cindex @code{outformat}
@@ -7905,10 +7973,8 @@
 @cindex @code{multisample}
 @item Use the native @code{Asymptote} adaptive @code{OpenGL}-based
 renderer (with the command-line option @code{-V} and the default settings
- at code{outformat=""} and @code{render=-1}). If you encounter warnings
-from your graphics card driver, try specifying @code{-glOptions=-indirect}
-on the command line. On @code{UNIX} systems with graphics support for
-multisampling, the sample width can be
+ at code{outformat=""} and @code{render=-1}). On @code{UNIX} systems with
+graphics support for multisampling, the sample width can be
 controlled with the setting @code{multisample}. An initial screen
 position can be specified with the pair setting @code{position}, where
 negative values are interpreted as relative to the corresponding
@@ -7945,7 +8011,7 @@
 @item y: spin about the Y axis
 @item z: spin about the Z axis
 @item s: stop spinning
- at item m: rendering mode (solid/mesh/patch)
+ at item m: rendering mode (solid/patch/mesh)
 @item e: export
 @item c: show camera parameters
 @item p: play animation
@@ -7961,6 +8027,40 @@
 @item Ctrl-q: exit
 @end itemize
 
+ at cindex @code{WebGL}
+ at cindex @code{HTML5}
+ at cindex @code{mobile browser}
+ at item Generate @code{WebGL} interactive vector graphics
+output with the the command-line option and @code{-f html}
+(or the setting @code{outformat="html"}). The resulting 
+3D @acronym{HTML} file can then be viewed directly in any modern desktop or
+mobile browser, or even embedded within another web page:
+ at verbatim
+<div>
+<object data="logo3.html"
+        style="width:210;height:140;position:relative;top:0;left:0;">
+</object>
+</div>
+ at end verbatim
+
+Normally, @code{WebGL} files generated by @code{Asymptote} are
+dynamically remeshed to fit the browser window dimensions.
+However, the setting @code{absolute=true} can be used to force the image to be
+rendered at its designed size (accounting for multiple device pixels
+per @code{css} pixel). This setting should not be used when
+embedding a @code{WebGL} file within another @acronym{HTML} document.
+
+The interactive @code{WebGL} files produced by @code{Asymptote} use the
+default mouse and (many of the same) key bindings as the @code{OpenGL}
+renderer.
+
+By default, viewing the 3D @acronym{HTML} files generated by Asymptote requires
+network access to download the @code{asygl} rendering library, which
+is normally cached by the browser for future use.
+However, the setting @code{offline=true} can be used to embed this
+small (about 42kB) library within a stand-alone @acronym{HTML} file
+that can be viewed offline.
+
 @cindex @code{antialias}
 @cindex @code{maxviewport}
 @cindex @code{maxtile}
@@ -7985,8 +8085,6 @@
 height of the viewport. On @code{UNIX} systems some graphics
 drivers support batch mode (@code{-noV}) rendering in an
 iconified window; this can be enabled with the setting @code{iconify=true}.
-Some (broken) @code{UNIX} graphics drivers may require the command line setting
- at code{-glOptions=-indirect}, which requests (slower) indirect rendering.
 
 @cindex @code{prc}
 @cindex @code{views}
@@ -8033,7 +8131,7 @@
 @cindex margins
 @cindex @code{viewportmargin}
 @cindex @code{viewportsize}
-The resulting simplex linear programming problem is then solved to
+A simplex linear programming problem is then solved to
 produce a 3D version of a frame (actually implemented as a 3D picture). 
 The result is then fit with another application of deferred drawing
 to the viewport dimensions corresponding to the usual two-dimensional
@@ -9227,6 +9325,7 @@
 @cindex @code{hyperrefOptions}
 @cindex @code{convertOptions}
 @cindex @code{gsOptions}
+ at cindex @code{htmlviewerOptions}
 @cindex @code{psviewerOptions}
 @cindex @code{pdfviewerOptions}
 @cindex @code{pdfreloadOptions}
@@ -9234,7 +9333,8 @@
 @cindex @code{dvisvgmOptions}
 The advanced configuration variables @code{dvipsOptions},
 @code{hyperrefOptions}, @code{convertOptions}, @code{gsOptions},
- at code{psviewerOptions}, @code{pdfviewerOptions}, @code{pdfreloadOptions},
+ at code{htmlviewerOptions}, @code{psviewerOptions},
+ at code{pdfviewerOptions}, @code{pdfreloadOptions},
 @code{glOptions}, and @code{dvisvgmOptions} allow specialized options
 to be passed as a string to the respective applications or
 libraries. The default value of @code{hyperrefOptions} is
@@ -9277,7 +9377,7 @@
 @cindex @code{dvisvgm}
 @cindex @code{libgs}
 To produce @acronym{SVG} output, you will need @code{dvisvgm} (version
-1.5.3 or later) from @url{http://dvisvgm.sourceforge.net} and must use
+2.6.3 or later) from @url{http://dvisvgm.sourceforge.net} and must use
 the @code{latex} or @code{tex} tex engine. You might need to adjust
 the configuration variable @code{libgs} to point to the location of
 your @code{Ghostscript} library @code{libgs.so} (or to an empty
@@ -9510,7 +9610,7 @@
 @end verbatim
 
 Pictures are deconstructed into the @acronym{SVG} image format.
-Since @code{Qt5} does not suport @code{SVG} clipping, you will need
+Since @code{Qt5} does not support @code{SVG} clipping, you will need
 the @code{rsvg-convert} utility, which is part of the
 @code{librsvg2-tools} package on @code{UNIX} systems
 and the @code{librsvg} package on @code{MacOS}; under
@@ -9871,7 +9971,7 @@
 @c  LocalWords:  nonoverlapping texengine maxtimes maxheight pdb TEXMFCONFIG Jn
 @c  LocalWords:  piecewisestraight unitrand graphmarkers antialias nolight newl
 @c  LocalWords:  Delaunay Shewchuk convertOptions APPDATA pdfreload tempFile Yn
- at c  LocalWords:  pdfreloadOptions deferred OpenGL Phong Blinn renderer unitbox
+ at c  LocalWords:  pdfreloadOptions deferred OpenGL renderer unitbox
 @c  LocalWords:  bezulate Shardt's rasterized viewport unitdisk unitplane devel
 @c  LocalWords:  unitcylinder unitcone solidcone unitfrustum unitsphere nslices
 @c  LocalWords:  DPostScript YZZero externalprc nonrendered nosafe KDE
@@ -9945,10 +10045,21 @@
 @c  LocalWords:  5unit 144x144 aligndir smoothcontour3 's 3D 2D cmake
 @c  LocalWords:  'load 'asy 'lasy 'auto 5bp 1cm 4g 2S 100pt 3t nan 3x
 @c  LocalWords:  12pt 5mm 25cm 5x 3y 602e 2x 2y 3sin 10cm 204e 10x Ai
- at c  LocalWords:  Ai Ai Ai Ai Ai Ai Ai 5E 5cm 2N 2E 2n 100d 5z 5y nz
+ at c  LocalWords:  Ai Ai Ai Ai Ai Ai Ai 5E 5cm 2N 2E 2n 100d 5z 5y nz '
 @c  LocalWords:  5unit Staats implicitsurface overlapedges maxdepth
 @c  LocalWords:  through'' genustwo 144x144 0pt 1filll 's 3D 2D 'load
 @c  LocalWords:  'asy 'lasy 'auto 5bp 1cm 4g 2S 100pt 3t 12pt 5mm 3x
 @c  LocalWords:  25cm 5x 3y 602e 2x 2y 3sin 10cm 204e 10x Ai Ai Ai Ai
 @c  LocalWords:  Ai Ai Ai Ai 5E 5cm 2N 2E 2n 100d 5z 5y 5unit 144x144
- at c  LocalWords:  Frohlich
+ at c  LocalWords:  Frohlich codequoteundirected center 0pt 1filll 's 3D
+ at c  LocalWords:  acknowledgments Colors 2D Color WebGL uref x86 dnf
+ at c  LocalWords:  htmlviewer asygl CPPFLAGS 'load 'asy 'lasy 'auto 5bp
+ at c  LocalWords:  1cm labeling dotfilltype 4g color colors centered 2S
+ at c  LocalWords:  100pt 3t forcemath gray colorless miter 12pt 5mm 3x
+ at c  LocalWords:  zeroTransform 25cm Python3 popcount bitreverse 5x 3y
+ at c  LocalWords:  602e 2x 2y 3sin 10cm 204e 10x Ai Ai Ai Ai Ai Ai Ai
+ at c  LocalWords:  Ai findall ax 5a centers 5E 5cm 2N 2E 2n HTML5 html
+ at c  LocalWords:  logo3 remeshed css 42kB 100d 5z 5y 5unit colored Qt5
+ at c  LocalWords:  behavior beveled usetriangles htmlviewerOptions cson
+ at c  LocalWords:  144x144 pyqt5 numpy pip3 PyQt5 rsvg librsvg2
+ at c  LocalWords:  librsvg Supakorn Jamie'' Rassameemasmuang

Modified: trunk/Build/source/utils/asymptote/doc/install-sh
===================================================================
--- trunk/Build/source/utils/asymptote/doc/install-sh	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/doc/install-sh	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2018-03-11.20; # UTC
+scriptversion=2009-04-28.21; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -35,21 +35,25 @@
 # FSF changes to this file are in the public domain.
 #
 # Calling this script install-sh is preferred over install.sh, to prevent
-# 'make' implicit rules from creating a file called install from it
+# `make' implicit rules from creating a file called install from it
 # when there is no Makefile.
 #
 # This script is compatible with the BSD install script, but was written
 # from scratch.
 
-tab='	'
 nl='
 '
-IFS=" $tab$nl"
+IFS=" ""	$nl"
 
-# Set DOITPROG to "echo" to test this script.
+# set DOITPROG to echo to test this script
 
+# Don't use :- since 4.3BSD and earlier shells don't like it.
 doit=${DOITPROG-}
-doit_exec=${doit:-exec}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
 
 # Put in absolute file names if you don't have them in your path;
 # or use environment vars.
@@ -64,6 +68,17 @@
 rmprog=${RMPROG-rm}
 stripprog=${STRIPPROG-strip}
 
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
 posix_mkdir=
 
 # Desired mode of installed file.
@@ -82,7 +97,7 @@
 dst_arg=
 
 copy_on_change=false
-is_target_a_directory=possibly
+no_target_directory=
 
 usage="\
 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@@ -122,41 +137,36 @@
     -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
-        shift;;
+	shift;;
 
     --help) echo "$usage"; exit $?;;
 
     -m) mode=$2
-        case $mode in
-          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
-            echo "$0: invalid mode: $mode" >&2
-            exit 1;;
-        esac
-        shift;;
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
 
     -o) chowncmd="$chownprog $2"
-        shift;;
+	shift;;
 
     -s) stripcmd=$stripprog;;
 
-    -t)
-        is_target_a_directory=always
-        dst_arg=$2
-        # Protect names problematic for 'test' and other utilities.
-        case $dst_arg in
-          -* | [=\(\)!]) dst_arg=./$dst_arg;;
-        esac
-        shift;;
+    -t) dst_arg=$2
+	shift;;
 
-    -T) is_target_a_directory=never;;
+    -T) no_target_directory=true;;
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
-    --) shift
-        break;;
+    --)	shift
+	break;;
 
-    -*) echo "$0: invalid option: $1" >&2
-        exit 1;;
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
 
     *)  break;;
   esac
@@ -163,16 +173,6 @@
   shift
 done
 
-# We allow the use of options -d and -T together, by making -d
-# take the precedence; this is for compatibility with GNU install.
-
-if test -n "$dir_arg"; then
-  if test -n "$dst_arg"; then
-    echo "$0: target directory not allowed when installing a directory." >&2
-    exit 1
-  fi
-fi
-
 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
   # When -d is used, all remaining arguments are directories to create.
   # When -t is used, the destination is already specified.
@@ -186,10 +186,6 @@
     fi
     shift # arg
     dst_arg=$arg
-    # Protect names problematic for 'test' and other utilities.
-    case $dst_arg in
-      -* | [=\(\)!]) dst_arg=./$dst_arg;;
-    esac
   done
 fi
 
@@ -198,27 +194,14 @@
     echo "$0: no input file specified." >&2
     exit 1
   fi
-  # It's OK to call 'install-sh -d' without argument.
+  # It's OK to call `install-sh -d' without argument.
   # This can happen when creating conditional directories.
   exit 0
 fi
 
 if test -z "$dir_arg"; then
-  if test $# -gt 1 || test "$is_target_a_directory" = always; then
-    if test ! -d "$dst_arg"; then
-      echo "$0: $dst_arg: Is not a directory." >&2
-      exit 1
-    fi
-  fi
-fi
+  trap '(exit $?); exit' 1 2 13 15
 
-if test -z "$dir_arg"; then
-  do_exit='(exit $ret); exit $ret'
-  trap "ret=129; $do_exit" 1
-  trap "ret=130; $do_exit" 2
-  trap "ret=141; $do_exit" 13
-  trap "ret=143; $do_exit" 15
-
   # Set umask so as not to create temps with too-generous modes.
   # However, 'strip' requires both read and write access to temps.
   case $mode in
@@ -228,16 +211,16 @@
 
     *[0-7])
       if test -z "$stripcmd"; then
-        u_plus_rw=
+	u_plus_rw=
       else
-        u_plus_rw='% 200'
+	u_plus_rw='% 200'
       fi
       cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
     *)
       if test -z "$stripcmd"; then
-        u_plus_rw=
+	u_plus_rw=
       else
-        u_plus_rw=,u+rw
+	u_plus_rw=,u+rw
       fi
       cp_umask=$mode$u_plus_rw;;
   esac
@@ -245,9 +228,9 @@
 
 for src
 do
-  # Protect names problematic for 'test' and other utilities.
+  # Protect names starting with `-'.
   case $src in
-    -* | [=\(\)!]) src=./$src;;
+    -*) src=./$src;;
   esac
 
   if test -n "$dir_arg"; then
@@ -269,115 +252,129 @@
       echo "$0: no destination specified." >&2
       exit 1
     fi
+
     dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
 
-    # If destination is a directory, append the input filename.
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
     if test -d "$dst"; then
-      if test "$is_target_a_directory" = never; then
-        echo "$0: $dst_arg: Is a directory" >&2
-        exit 1
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
       fi
       dstdir=$dst
-      dstbase=`basename "$src"`
-      case $dst in
-	*/) dst=$dst$dstbase;;
-	*)  dst=$dst/$dstbase;;
-      esac
+      dst=$dstdir/`basename "$src"`
       dstdir_status=0
     else
-      dstdir=`dirname "$dst"`
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
       test -d "$dstdir"
       dstdir_status=$?
     fi
   fi
 
-  case $dstdir in
-    */) dstdirslash=$dstdir;;
-    *)  dstdirslash=$dstdir/;;
-  esac
-
   obsolete_mkdir_used=false
 
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
-        # Create intermediate dirs using mode 755 as modified by the umask.
-        # This is like FreeBSD 'install' as of 1997-10-28.
-        umask=`umask`
-        case $stripcmd.$umask in
-          # Optimize common cases.
-          *[2367][2367]) mkdir_umask=$umask;;
-          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
 
-          *[0-7])
-            mkdir_umask=`expr $umask + 22 \
-              - $umask % 100 % 40 + $umask % 20 \
-              - $umask % 10 % 4 + $umask % 2
-            `;;
-          *) mkdir_umask=$umask,go-w;;
-        esac
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
 
-        # With -d, create the new directory with the user-specified mode.
-        # Otherwise, rely on $mkdir_umask.
-        if test -n "$dir_arg"; then
-          mkdir_mode=-m$mode
-        else
-          mkdir_mode=
-        fi
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
 
-        posix_mkdir=false
-        case $umask in
-          *[123567][0-7][0-7])
-            # POSIX mkdir -p sets u+wx bits regardless of umask, which
-            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-            ;;
-          *)
-            # Note that $RANDOM variable is not portable (e.g. dash);  Use it
-            # here however when possible just to lower collision chance.
-            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
 
-            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-            # Because "mkdir -p" follows existing symlinks and we likely work
-            # directly in world-writeable /tmp, make sure that the '$tmpdir'
-            # directory is successfully created first before we actually test
-            # 'mkdir -p' feature.
-            if (umask $mkdir_umask &&
-                $mkdirprog $mkdir_mode "$tmpdir" &&
-                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
-            then
-              if test -z "$dir_arg" || {
-                   # Check for POSIX incompatibilities with -m.
-                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-                   # other-writable bit of parent directory when it shouldn't.
-                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-                   test_tmpdir="$tmpdir/a"
-                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
-                   case $ls_ld_tmpdir in
-                     d????-?r-*) different_mode=700;;
-                     d????-?--*) different_mode=755;;
-                     *) false;;
-                   esac &&
-                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
-                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
-                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-                   }
-                 }
-              then posix_mkdir=:
-              fi
-              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
-            else
-              # Remove any dirs left behind by ancient mkdir implementations.
-              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
-            fi
-            trap '' 0;;
-        esac;;
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
     esac
 
     if
       $posix_mkdir && (
-        umask $mkdir_umask &&
-        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
       )
     then :
     else
@@ -387,17 +384,19 @@
       # directory the slow way, step by step, checking for races as we go.
 
       case $dstdir in
-        /*) prefix='/';;
-        [-=\(\)!]*) prefix='./';;
-        *)  prefix='';;
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
       esac
 
+      eval "$initialize_posix_glob"
+
       oIFS=$IFS
       IFS=/
-      set -f
+      $posix_glob set -f
       set fnord $dstdir
       shift
-      set +f
+      $posix_glob set +f
       IFS=$oIFS
 
       prefixes=
@@ -404,34 +403,34 @@
 
       for d
       do
-        test X"$d" = X && continue
+	test -z "$d" && continue
 
-        prefix=$prefix$d
-        if test -d "$prefix"; then
-          prefixes=
-        else
-          if $posix_mkdir; then
-            (umask=$mkdir_umask &&
-             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-            # Don't fail if two instances are running concurrently.
-            test -d "$prefix" || exit 1
-          else
-            case $prefix in
-              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-              *) qprefix=$prefix;;
-            esac
-            prefixes="$prefixes '$qprefix'"
-          fi
-        fi
-        prefix=$prefix/
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
       done
 
       if test -n "$prefixes"; then
-        # Don't fail if two instances are running concurrently.
-        (umask $mkdir_umask &&
-         eval "\$doit_exec \$mkdirprog $prefixes") ||
-          test -d "$dstdir" || exit 1
-        obsolete_mkdir_used=true
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
       fi
     fi
   fi
@@ -444,25 +443,14 @@
   else
 
     # Make a couple of temp file names in the proper directory.
-    dsttmp=${dstdirslash}_inst.$$_
-    rmtmp=${dstdirslash}_rm.$$_
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
 
     # Trap to clean up those temp files at exit.
     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
 
     # Copy the file name to the temp name.
-    (umask $cp_umask &&
-     { test -z "$stripcmd" || {
-	 # Create $dsttmp read-write so that cp doesn't create it read-only,
-	 # which would cause strip to fail.
-	 if test -z "$doit"; then
-	   : >"$dsttmp" # No need to fork-exec 'touch'.
-	 else
-	   $doit touch "$dsttmp"
-	 fi
-       }
-     } &&
-     $doit_exec $cpprog "$src" "$dsttmp") &&
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
 
     # and set any options; do chmod last to preserve setuid bits.
     #
@@ -477,12 +465,15 @@
 
     # If -C, don't bother to copy if it wouldn't change the file.
     if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
-       set -f &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
        set X $old && old=:$2:$4:$5:$6 &&
        set X $new && new=:$2:$4:$5:$6 &&
-       set +f &&
+       $posix_glob set +f &&
+
        test "$old" = "$new" &&
        $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
     then
@@ -495,24 +486,24 @@
       # to itself, or perhaps because mv is so ancient that it does not
       # support -f.
       {
-        # Now remove or move aside any old file at destination location.
-        # We try this two ways since rm can't unlink itself on some
-        # systems and the destination file might be busy for other
-        # reasons.  In this case, the final cleanup might fail but the new
-        # file should still install successfully.
-        {
-          test ! -f "$dst" ||
-          $doit $rmcmd -f "$dst" 2>/dev/null ||
-          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-          } ||
-          { echo "$0: cannot unlink or rename $dst" >&2
-            (exit 1); exit 1
-          }
-        } &&
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
 
-        # Now rename the file to the real destination.
-        $doit $mvcmd "$dsttmp" "$dst"
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
       }
     fi || exit 1
 
@@ -521,9 +512,9 @@
 done
 
 # Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
+# eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC0"
+# time-stamp-time-zone: "UTC"
 # time-stamp-end: "; # UTC"
 # End:

Modified: trunk/Build/source/utils/asymptote/doc/png/Makefile.in
===================================================================
--- trunk/Build/source/utils/asymptote/doc/png/Makefile.in	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/doc/png/Makefile.in	2019-10-06 17:17:34 UTC (rev 52300)
@@ -13,9 +13,9 @@
 %.png:	../%.asy
 	cd .. && $(ASY) -f png -o png/ $(notdir $<)
 
-latexusage.png: ../latexusage.eps
+latexusage.png: ../latexusage.pdf
 	gs -q -dNOPAUSE -dBATCH -sDEVICE=pngalpha -dEPSCrop -dSAFER -r72x72 \
-           -sOutputFile=latexusage.png ../latexusage.eps
+           -sOutputFile=latexusage.png ../latexusage.pdf
 
 index.html: $(SOURCE) $(ASYFILES:.asy=.png) latexusage.png
 	makeinfo --html ../asymptote -o .

Modified: trunk/Build/source/utils/asymptote/doc/png/asymptote.info
===================================================================
--- trunk/Build/source/utils/asymptote/doc/png/asymptote.info	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/doc/png/asymptote.info	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,7 +1,7 @@
 This is asymptote.info, produced by makeinfo version 6.5 from
 asymptote.texi.
 
-This file documents 'Asymptote', version 2.52.
+This file documents 'Asymptote', version 2.56.
 
    <http://asymptote.sourceforge.net>
 
@@ -22,7 +22,7 @@
 Asymptote
 *********
 
-This file documents 'Asymptote', version 2.52.
+This file documents 'Asymptote', version 2.56.
 
    <http://asymptote.sourceforge.net>
 
@@ -68,7 +68,7 @@
 Tutorial
 
 * Drawing in batch mode::       Run 'Asymptote' on a text file
-* Drawing in interactive mode:: Running 'Asymptote' interactively
+* Drawing in interactive mode::  Running 'Asymptote' interactively
 * Figure size::                 Specifying the figure size
 * Labels::                      Adding 'LaTeX' labels
 * Paths::                       Drawing lines and curves
@@ -203,6 +203,9 @@
 
    * 'LaTeX' typesetting of labels, for overall document consistency;
 
+   * the ability to generate and embed 3D vector WebGL graphics within
+     HTML files;
+
    * the ability to generate and embed 3D vector PRC graphics within PDF
      files;
 
@@ -234,8 +237,8 @@
    Many of the features of 'Asymptote' are written in the 'Asymptote'
 language itself.  While the stock version of 'Asymptote' is designed for
 mathematics typesetting needs, one can write 'Asymptote' modules that
-tailor it to specific applications.  A scientific graphing module has
-already been written (*note graph::).  Examples of 'Asymptote' code and
+tailor it to specific applications; for example, a scientific graphing
+module is available (*note graph::).  Examples of 'Asymptote' code and
 output, including animations, are available at
      <http://asymptote.sourceforge.net/gallery/>
 Clicking on an example file name in this manual, like 'Pythagoras', will
@@ -338,7 +341,7 @@
    The 'ImageMagick' package from
 <http://www.imagemagick.org/script/binary-releases.php>
 
-is required to support output formats other than EPS, PDF, SVG, and PNG
+is required to support output formats other than HTML, PDF, SVG, and PNG
 (*note convert::).  The 'Python 3' interpreter from
 <http://www.python.org> is only required if you wish to try out the
 graphical user interface (*note GUI::).
@@ -356,43 +359,51 @@
 In interactive mode, or when given the '-V' option (the default when
 running 'Asymptote' on a single file under 'MSDOS'), 'Asymptote' will
 automatically invoke the 'PostScript' viewer 'gv' (under 'UNIX') or
-'gsview' (under 'MSDOS' to display graphical output.  These defaults may
-be overridden with the configuration variable 'psviewer'.  The
-'PostScript' viewer should be capable of automatically redrawing
-whenever the output file is updated.  The default 'UNIX' 'PostScript'
-viewer 'gv' supports this (via a 'SIGHUP' signal).  Version 'gv-3.6.3'
-or later (from <http://ftp.gnu.org/gnu/gv/>) is required for interactive
-mode to work properly.  Users of 'ggv' will need to enable 'Watch file'
-under 'Edit/Postscript Viewer Preferences'.  Users of 'gsview' will need
-to enable 'Options/Auto Redisplay' (however, under 'MSDOS' it is still
+'gsview' (under 'MSDOS' to display graphical output.  The 'PostScript'
+viewer should be capable of automatically redrawing whenever the output
+file is updated.  The default 'UNIX' 'PostScript' viewer 'gv' supports
+this (via a 'SIGHUP' signal).  Version 'gv-3.6.3' or later (from
+<http://ftp.gnu.org/gnu/gv/>) is required for interactive mode to work
+properly.  Users of 'ggv' will need to enable 'Watch file' under
+'Edit/Postscript Viewer Preferences'.  Users of 'gsview' will need to
+enable 'Options/Auto Redisplay' (however, under 'MSDOS' it is still
 necessary to click on the 'gsview' window; under 'UNIX' one must
 manually redisplay by pressing the 'r' key).
 
    Configuration variables are most easily set as 'Asymptote' variables
 in an optional configuration file 'config.asy' *note configuration
-file::).  Here are the default values of several important configuration
-variables under 'UNIX':
+file::).  For example, the setting 'pdfviewer' specifies the location of
+the PDF viewer.  Here are the default values of several important
+configuration variables under 'UNIX':
 
 import settings;
+pdfviewer="acroread";
+htmlviewer="google-chrome";
 psviewer="gv";
-pdfviewer="acroread";
+display="display";
+animate="animate";
 gs="gs";
+libgs="";
 
-Under 'MSDOS', the (installation-dependent) default values of these
-configuration variables are determined automatically from the 'Microsoft
-Windows' registry.  Viewer settings (such as 'psviewer' and 'pdfviewer')
-can be set to the string 'cmd' to request the application normally
-associated with the corresponding file type.
+Under 'MSDOS', the viewer settings 'htmlviewer', 'pdfviewer',
+'psviewer', 'display', and 'animate' default to the string 'cmd',
+requesting the application normally associated with each file type.  The
+(installation-dependent) default values of 'gs' and 'libgs' are
+determined automatically from the 'Microsoft Windows' registry.  The
+'gs' setting specifies the location of the 'PostScript' processor
+'Ghostscript', available from <https://www.ghostscript.com/>.
 
-   For PDF format output, the 'gs' setting specifies the location of the
-'PostScript'-to-PDF processor 'Ghostscript', available from
-<http://downloads.ghostscript.com/public>.
+The configuration variable 'htmlviewer' specifies the browser to use to
+display 3D 'WebGL' output.  The default setting is 'google-chrome' under
+'UNIX' and 'cmd' under 'Microsoft Windows'.  Note that 'Internet
+Explorer' does not support 'WebGL'; 'Microsoft Windows' users should set
+their default html browser to 'chrome' or 'microsoft-edge'.
 
-   The setting 'pdfviewer' specifies the location of the PDF viewer.  On
-'UNIX' systems, to support automatic document reloading in 'Adobe
-Reader', we recommend copying the file 'reload.js' from the 'Asymptote'
-system directory (by default, '/usr/local/share/asymptote' under 'UNIX'
-to '~/.adobe/Acrobat/x.x/JavaScripts/', where 'x.x' represents the
+   On 'UNIX' systems, to support automatic document reloading of 'PDF'
+files in 'Adobe Reader', we recommend copying the file 'reload.js' from
+the 'Asymptote' system directory (by default,
+'/usr/local/share/asymptote' under 'UNIX' to
+'~/.adobe/Acrobat/x.x/JavaScripts/', where 'x.x' represents the
 appropriate 'Adobe Reader' version number.  The automatic document
 reload feature must then be explicitly enabled by putting
 import settings;
@@ -411,7 +422,7 @@
 to other paper sizes can be obtained by setting the configuration
 variables 'paperwidth' and 'paperheight'.
 
-   The following configuration variables normally do not require
+   These additional configuration variables normally do not require
 adjustment:
 config
 texpath
@@ -418,10 +429,7 @@
 texcommand
 dvips
 dvisvgm
-libgs
 convert
-display
-animate
 
    Warnings (such as "unbounded" and "offaxis") may be enabled or
 disabled with the functions
@@ -634,7 +642,7 @@
 * Menu:
 
 * Drawing in batch mode::       Run 'Asymptote' on a text file
-* Drawing in interactive mode:: Running 'Asymptote' interactively
+* Drawing in interactive mode::  Running 'Asymptote' interactively
 * Figure size::                 Specifying the figure size
 * Labels::                      Adding 'LaTeX' labels
 * Paths::                       Drawing lines and curves
@@ -3447,7 +3455,7 @@
 '+'
      addition
 '-'
-     subtractiona
+     subtraction
 '*'
      multiplication
 '/'
@@ -4320,13 +4328,13 @@
 
    Another useful mode is comma-separated-value mode, 'file csv(bool
 b=true)', which causes reads to respect comma delimiters:
-file fin=csv(input("test.txt"));
+file fin=input("test.txt").csv();
 real[] A=fin;
 
    To restrict the number of values read, use the 'file dimension(int)'
 function:
 file fin=input("test.txt");
-real[] A=dimension(fin,10);
+real[] A=fin.dimension(10);
 
    This reads 10 values into A, unless end-of-file (or end-of-line in
 line mode) occurs first.  Attempting to read beyond the end of the file
@@ -6802,14 +6810,42 @@
   pen[] p; // diffusepen,emissivepen,specularpen
   real opacity;
   real shininess;  
-...
+  real metallic;
+  real fresnel0;
 }
-These material properties are used to implement 'OpenGL'-style lighting,
-based on the Phong-Blinn specular model.  Sample Bezier surfaces are
-contained in the example files 'BezierSurface.asy', 'teapot.asy', and
-'parametricsurface.asy'.  The structure 'render' contains specialized
-rendering options documented at the beginning of module 'three.asy'.
+These material properties are used to implement physically based
+rendering (PBR) using light properties defined in 'plain_prethree.asy'
+and 'three_light.asy':
+struct light {
+  real[][] diffuse;
+  real[][] specular;
+  pen background=nullpen; // Background color of the 3D canvas.
+  real specularfactor;
+  triple[] position; // Only directional lights are currently implemented.
+}
 
+light Viewport=light(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,
+  new triple[] {(-2,-1.5,-0.5),(2,1.1,-2.5),(-0.5,0,2)});
+
+light Headlamp=light(gray(0.8),specular=gray(0.7),
+                     specularfactor=3,dir(42,48));
+
+currentlight=Headlamp;
+
+light nolight;
+   The 'background' pen can be use to set the 3D 'OpenGL' background
+colour (the default is white).  In the case of 3D 'WebGL' images one can
+request a completely transparent background with
+'currentlight.background=black+opacity(0.0);'
+
+   Sample Bezier surfaces are contained in the example files
+'BezierSurface.asy', 'teapot.asy', and 'parametricsurface.asy'.  The
+structure 'render' contains specialized rendering options documented at
+the beginning of module 'three.asy'.
+
    The examples 'elevation.asy' and 'sphericalharmonic.asy' illustrate
 how to draw a surface with patch-dependent colors.  The examples
 'vertexshading.asy' and 'smoothelevation.asy' illustrate
@@ -6847,14 +6883,15 @@
 composed of many 3D triangles, with specified vertices, and optional
 normals or vertex colors:
 void draw(picture pic=currentpicture, triple[] v, int[][] vi,
-          triple[] n={}, int[][] ni={}, material m=currentpen, pen[] p={},
-          int[][] pi={}, light light=currentlight);
-   Here, the triple array 'v' lists the distinct vertices, while the
-array 'vi' lists integer arrays of length 3 containing the indices of
-'v' corresponding to the vertices of each triangle.  Similarly, the
-arguments 'n' and 'ni' contain optional normal data and 'p' and 'pi'
-contain optional pen vertex data.  An example of this tessellation
-facility is given in 'triangles.asy'.
+          triple[] n={}, int[][] ni=vi, material m=currentpen, pen[] p={},
+          int[][] pi=vi, light light=currentlight);
+   Here, the triple array 'v' lists the (typically distinct) vertices,
+while the array 'vi' contains integer arrays of length 3 containing the
+indices of the elements in 'v' that form the vertices of each triangle.
+Similarly, the arguments 'n' and 'ni' contain optional normal data and
+'p' and 'pi' contain optional pen vertex data.  If more than one normal
+or pen is specified for a vertex, the last one specified is used.  An
+example of this tessellation facility is given in 'triangles.asy'.
 
    Arbitrary thick three-dimensional curves and line caps (which the
 'OpenGL' standard does not require implementations to provide) are
@@ -6872,17 +6909,16 @@
 pens 'thin()' and 'thick()' defined in 'plain_pens.asy' can also be used
 to override these defaults for specific draw commands.
 
-There are four choices for viewing 3D 'Asymptote' output:
+There are five choices for viewing 3D 'Asymptote' output:
+
   1. Use the native 'Asymptote' adaptive 'OpenGL'-based renderer (with
      the command-line option '-V' and the default settings
-     'outformat=""' and 'render=-1').  If you encounter warnings from
-     your graphics card driver, try specifying '-glOptions=-indirect' on
-     the command line.  On 'UNIX' systems with graphics support for
-     multisampling, the sample width can be controlled with the setting
-     'multisample'.  An initial screen position can be specified with
-     the pair setting 'position', where negative values are interpreted
-     as relative to the corresponding maximum screen dimension.  The
-     default settings
+     'outformat=""' and 'render=-1').  On 'UNIX' systems with graphics
+     support for multisampling, the sample width can be controlled with
+     the setting 'multisample'.  An initial screen position can be
+     specified with the pair setting 'position', where negative values
+     are interpreted as relative to the corresponding maximum screen
+     dimension.  The default settings
      import settings;
      leftbutton=new string[] {"rotate","zoom","shift","pan"};
      middlebutton=new string[] {""};
@@ -6908,7 +6944,7 @@
         * y: spin about the Y axis
         * z: spin about the Z axis
         * s: stop spinning
-        * m: rendering mode (solid/mesh/patch)
+        * m: rendering mode (solid/patch/mesh)
         * e: export
         * c: show camera parameters
         * p: play animation
@@ -6923,7 +6959,36 @@
         * q: exit
         * Ctrl-q: exit
 
-  2. Render the scene to a specified rasterized format 'outformat' at
+  2. Generate 'WebGL' interactive vector graphics output with the the
+     command-line option and '-f html' (or the setting
+     'outformat="html"').  The resulting 3D HTML file can then be viewed
+     directly in any modern desktop or mobile browser, or even embedded
+     within another web page:
+     <div>
+     <object data="logo3.html"
+             style="width:210;height:140;position:relative;top:0;left:0;">
+     </object>
+     </div>
+
+     Normally, 'WebGL' files generated by 'Asymptote' are dynamically
+     remeshed to fit the browser window dimensions.  However, the
+     setting 'absolute=true' can be used to force the image to be
+     rendered at its designed size (accounting for multiple device
+     pixels per 'css' pixel).  This setting should not be used when
+     embedding a 'WebGL' file within another HTML document.
+
+     The interactive 'WebGL' files produced by 'Asymptote' use the
+     default mouse and (many of the same) key bindings as the 'OpenGL'
+     renderer.
+
+     By default, viewing the 3D HTML files generated by Asymptote
+     requires network access to download the 'asygl' rendering library,
+     which is normally cached by the browser for future use.  However,
+     the setting 'offline=true' can be used to embed this small (about
+     42kB) library within a stand-alone HTML file that can be viewed
+     offline.
+
+  3. Render the scene to a specified rasterized format 'outformat' at
      the resolution of 'n' pixels per 'bp', as specified by the setting
      'render=n'.  A negative value of 'n' is interpreted as '|2n|' for
      EPS and PDF formats and '|n|' for other formats.  The default value
@@ -6939,12 +7004,9 @@
      limited by the setting 'maxviewport', which restricts the maximum
      width and height of the viewport.  On 'UNIX' systems some graphics
      drivers support batch mode ('-noV') rendering in an iconified
-     window; this can be enabled with the setting 'iconify=true'.  Some
-     (broken) 'UNIX' graphics drivers may require the command line
-     setting '-glOptions=-indirect', which requests (slower) indirect
-     rendering.
+     window; this can be enabled with the setting 'iconify=true'.
 
-  3. Embed the 3D PRC format in a PDF file and view the resulting PDF
+  4. Embed the 3D PRC format in a PDF file and view the resulting PDF
      file with version '9.0' or later of 'Adobe Reader'.  In addition to
      the default 'settings.prc=true', this requires
      'settings.outformat="pdf"', which can be specified by the command
@@ -6965,7 +7027,7 @@
      The open-source PRC specification is available from
      <http://livedocs.adobe.com/acrobat_sdk/9/Acrobat9_HTMLHelp/API_References/PRCReference/PRC_Format_Specification/>.
 
-  4. Project the scene to a two-dimensional vector (EPS or PDF) format
+  5. Project the scene to a two-dimensional vector (EPS or PDF) format
      with 'render=0'.  Only limited hidden surface removal facilities
      are currently available with this approach (*note PostScript3D::).
 
@@ -6975,12 +7037,12 @@
 routine
 void size3(picture pic=currentpicture, real x, real y=x, real z=y,
           bool keepAspect=pic.keepAspect);
-The resulting simplex linear programming problem is then solved to
-produce a 3D version of a frame (actually implemented as a 3D picture).
-The result is then fit with another application of deferred drawing to
-the viewport dimensions corresponding to the usual two-dimensional
-picture 'size' parameters.  The global pair 'viewportmargin' may be used
-to add horizontal and vertical margins to the viewport dimensions.
+A simplex linear programming problem is then solved to produce a 3D
+version of a frame (actually implemented as a 3D picture).  The result
+is then fit with another application of deferred drawing to the viewport
+dimensions corresponding to the usual two-dimensional picture 'size'
+parameters.  The global pair 'viewportmargin' may be used to add
+horizontal and vertical margins to the viewport dimensions.
 Alternatively, a minimum 'viewportsize' may be specified.  A 3D picture
 'pic' can be explicitly fit to a 3D frame by calling
 frame pic.fit3(projection P=currentprojection);
@@ -8053,10 +8115,10 @@
 Options (negate by replacing - with -no): 
 
 -V,-View               View output; command-line only
+-absolute              Use absolute WebGL dimensions [false]
 -a,-align C|B|T|Z      Center, Bottom, Top, or Zero page alignment [C]
 -aligndir pair         Directional page alignment (overrides align) [(0,0)]
 -antialias n           Antialiasing width for rasterized output [2]
--arcballradius pixels  Arcball radius [750]
 -auto3D                Automatically activate 3D scene [true]
 -autobillboard         3D labels always face viewer by default [true]
 -autoimport string     Module to automatically import
@@ -8072,8 +8134,8 @@
 -c,-command string     Command to autoexecute
 -compact               Conserve memory at the expense of speed [false]
 -d,-debug              Enable debugging messages [false]
+-digits n              Default output file precision [6]
 -divisor n             Garbage collect using purge(divisor=n) [2]
--doubleclick ms        Emulated double-click timeout [200]
 -embed                 Embed rendered preview image [true]
 -envmap                Enable environment map image-based lighting (Experimental) [false]
 -exitonEOF             Exit interactive mode on EOF [true]
@@ -8103,6 +8165,7 @@
 -multiline             Input code over multiple lines at the prompt [false]
 -multipleView          View output from multiple batch-mode files [false]
 -multisample n         Multisampling width for screen images [4]
+-offline               Produce offline html files [false]
 -offscreen             Use offscreen rendering [false]
 -O,-offset pair        PostScript offset [(0,0)]
 -f,-outformat format   Convert each output file to specified format
@@ -8121,6 +8184,8 @@
 -rgb                   Convert cmyk colors to rgb [false]
 -safe                  Disable system call [true]
 -scroll n              Scroll standard output n lines at a time [0]
+-shiftHoldDistance n   WebGL touch screen distance limit for shift mode [20]
+-shiftWaitTime ms      WebGL touch screen shift mode delay [200]
 -spinstep deg/s        Spin speed [60]
 -svgemulation          Emulate unimplemented SVG shading [false]
 -tabcompletion         Interactive prompt auto-completion [true]
@@ -8135,10 +8200,14 @@
 -u,-user string        General purpose user string
 -v,-verbose            Increase verbosity level (can specify multiple times) [0]
 -version               Show version; command-line only
+-vibrateTime ms        WebGL shift mode vibrate duration [25]
+-viewportmargin pair   Horizontal and vertical 3D viewport margin [(0.5,0.5)]
 -wait                  Wait for child processes to finish before exiting [false]
 -warn string           Enable warning; command-line only
 -where                 Show where listed variables are declared [false]
 -xasy                  Special interactive mode for xasy [false]
+-zoomPinchCap limit    WebGL maximum zoom pinch [100]
+-zoomPinchFactor n     WebGL zoom pinch sensitivity [10]
 -zoomfactor factor     Zoom step factor [1.05]
 -zoomstep step         Mouse motion zoom step [0.1]
 
@@ -8177,11 +8246,11 @@
    Command-line options override these defaults.  Most configuration
 variables may also be changed at runtime.  The advanced configuration
 variables 'dvipsOptions', 'hyperrefOptions', 'convertOptions',
-'gsOptions', 'psviewerOptions', 'pdfviewerOptions', 'pdfreloadOptions',
-'glOptions', and 'dvisvgmOptions' allow specialized options to be passed
-as a string to the respective applications or libraries.  The default
-value of 'hyperrefOptions' is 'setpagesize=false,unicode,pdfborder=0 0
-0'.
+'gsOptions', 'htmlviewerOptions', 'psviewerOptions', 'pdfviewerOptions',
+'pdfreloadOptions', 'glOptions', and 'dvisvgmOptions' allow specialized
+options to be passed as a string to the respective applications or
+libraries.  The default value of 'hyperrefOptions' is
+'setpagesize=false,unicode,pdfborder=0 0 0'.
 
    If you insert
 import plain;
@@ -8194,7 +8263,7 @@
 and 'lualatex' tex engines.  Alternative output formats may be produced
 using the '-f' option (or 'outformat' setting).
 
-   To produce SVG output, you will need 'dvisvgm' (version 1.5.3 or
+   To produce SVG output, you will need 'dvisvgm' (version 2.6.3 or
 later) from <http://dvisvgm.sourceforge.net> and must use the 'latex' or
 'tex' tex engine.  You might need to adjust the configuration variable
 'libgs' to point to the location of your 'Ghostscript' library
@@ -8377,7 +8446,7 @@
 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'
+does not support 'SVG' clipping, you will need the 'rsvg-convert'
 utility, which is part of the 'librsvg2-tools' package on 'UNIX' systems
 and the 'librsvg' package on 'MacOS'; under 'Microsoft Windows', it is
 available as
@@ -8595,9 +8664,9 @@
 * ---:                                   Bezier curves.      (line   84)
 * -=:                                    Self & prefix operators.
                                                              (line    6)
-* -c:                                    Options.            (line  186)
-* -l:                                    Options.            (line  205)
-* -u:                                    Options.            (line  196)
+* -c:                                    Options.            (line  193)
+* -l:                                    Options.            (line  212)
+* -u:                                    Options.            (line  203)
 * -V:                                    Configuring.        (line    6)
 * -V <1>:                                Drawing in batch mode.
                                                              (line   16)
@@ -8610,7 +8679,7 @@
 * 2D graphs:                             graph.              (line    6)
 * 3D graphs:                             graph3.             (line    6)
 * 3D grids:                              grid3.              (line    6)
-* 3D PostScript:                         three.              (line  580)
+* 3D PostScript:                         three.              (line  634)
 * ::                                     Arithmetic & logical.
                                                              (line   61)
 * :::                                    Bezier curves.      (line   70)
@@ -8638,7 +8707,7 @@
                                                              (line   53)
 * ||:                                    Arithmetic & logical.
                                                              (line   51)
-* a4:                                    Configuring.        (line   58)
+* a4:                                    Configuring.        (line   66)
 * abort:                                 Data types.         (line  363)
 * abs:                                   Data types.         (line   65)
 * abs <1>:                               Mathematical functions.
@@ -8645,7 +8714,7 @@
                                                              (line   35)
 * accel:                                 Paths and guides.   (line  126)
 * accel <1>:                             Paths and guides.   (line  132)
-* accel <2>:                             three.              (line  481)
+* accel <2>:                             three.              (line  535)
 * access:                                Import.             (line    6)
 * acknowledgments:                       Credits.            (line    6)
 * acos:                                  Mathematical functions.
@@ -8658,8 +8727,8 @@
                                                              (line  212)
 * add <1>:                               Frames and pictures.
                                                              (line  228)
-* add <2>:                               three.              (line  253)
-* addViews:                              three.              (line  374)
+* add <2>:                               three.              (line  307)
+* addViews:                              three.              (line  428)
 * adjust:                                Pens.               (line  123)
 * Ai:                                    Mathematical functions.
                                                              (line   48)
@@ -8670,7 +8739,7 @@
 * alias:                                 Structures.         (line   62)
 * alias <1>:                             Arrays.             (line  174)
 * Align:                                 label.              (line   12)
-* aligndir:                              Options.            (line  178)
+* aligndir:                              Options.            (line  185)
 * all:                                   Arrays.             (line  325)
 * Allow:                                 Pens.               (line  347)
 * and:                                   Bezier curves.      (line   56)
@@ -8677,28 +8746,28 @@
 * AND:                                   Arithmetic & logical.
                                                              (line   68)
 * angle:                                 Data types.         (line   73)
-* animate:                               Configuring.        (line   64)
+* animate:                               Configuring.        (line   20)
 * animate <1>:                           Files.              (line  155)
 * animate <2>:                           animation.          (line   12)
 * animation:                             animation.          (line    6)
 * animation <1>:                         animation.          (line    6)
 * annotate:                              annotate.           (line    6)
-* antialias:                             three.              (line  192)
-* antialias <1>:                         Options.            (line  149)
+* antialias:                             three.              (line  249)
+* antialias <1>:                         Options.            (line  156)
 * 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  264)
+* arc <1>:                               three.              (line  318)
 * ArcArrow:                              draw.               (line   26)
-* ArcArrow3:                             three.              (line  547)
+* ArcArrow3:                             three.              (line  601)
 * ArcArrows:                             draw.               (line   26)
-* ArcArrows3:                            three.              (line  547)
+* ArcArrows3:                            three.              (line  601)
 * arclength:                             Paths and guides.   (line  153)
-* arclength <1>:                         three.              (line  481)
+* arclength <1>:                         three.              (line  535)
 * arcpoint:                              Paths and guides.   (line  163)
 * arctime:                               Paths and guides.   (line  157)
-* arctime <1>:                           three.              (line  481)
+* arctime <1>:                           three.              (line  535)
 * arguments:                             Default arguments.  (line    6)
 * arithmetic operators:                  Arithmetic & logical.
                                                              (line    6)
@@ -8712,10 +8781,10 @@
 * arrow keys:                            Drawing in interactive mode.
                                                              (line   11)
 * arrow keys <1>:                        GUI usage.          (line    6)
-* Arrow3:                                three.              (line  547)
+* Arrow3:                                three.              (line  601)
 * arrows:                                draw.               (line   26)
 * Arrows:                                draw.               (line   26)
-* Arrows3:                               three.              (line  547)
+* Arrows3:                               three.              (line  601)
 * as:                                    Import.             (line   67)
 * ascii:                                 Data types.         (line  308)
 * ascii <1>:                             Data types.         (line  308)
@@ -8733,10 +8802,11 @@
 * asy <1>:                               Import.             (line  101)
 * asy-mode:                              Editing modes.      (line    6)
 * asy.vim:                               Editing modes.      (line   32)
+* asygl:                                 Configuring.        (line   72)
 * asyinclude:                            LaTeX usage.        (line   45)
 * asymptote.sty:                         LaTeX usage.        (line    6)
 * asymptote.xml:                         Editing modes.      (line   48)
-* ASYMPTOTE_CONFIG:                      Options.            (line  120)
+* ASYMPTOTE_CONFIG:                      Options.            (line  127)
 * atan:                                  Mathematical functions.
                                                              (line    6)
 * aTan:                                  Mathematical functions.
@@ -8750,8 +8820,8 @@
                                                              (line  273)
 * attach <1>:                            LaTeX usage.        (line   50)
 * attach <2>:                            graph.              (line  407)
-* autoadjust:                            three.              (line  339)
-* autoimport:                            Options.            (line  116)
+* autoadjust:                            three.              (line  393)
+* autoimport:                            Options.            (line  123)
 * automatic scaling:                     graph.              (line  691)
 * automatic scaling <1>:                 graph.              (line  691)
 * axialshade:                            fill.               (line   43)
@@ -8761,13 +8831,15 @@
 * axis <3>:                              graph3.             (line   82)
 * azimuth:                               Data types.         (line  153)
 * babel:                                 babel.              (line    6)
+* background:                            three.              (line   76)
+* background <1>:                        three.              (line   97)
 * background color:                      Frames and pictures.
                                                              (line  180)
-* BackView:                              three.              (line  367)
+* BackView:                              three.              (line  421)
 * Bar:                                   draw.               (line   19)
-* Bar3:                                  three.              (line  547)
+* Bar3:                                  three.              (line  601)
 * Bars:                                  draw.               (line   19)
-* Bars3:                                 three.              (line  547)
+* Bars3:                                 three.              (line  601)
 * barsize:                               draw.               (line   19)
 * base modules:                          Base modules.       (line    6)
 * basealign:                             Pens.               (line  181)
@@ -8776,18 +8848,18 @@
                                                              (line    6)
 * beep:                                  Data types.         (line  381)
 * BeginArcArrow:                         draw.               (line   26)
-* BeginArcArrow3:                        three.              (line  547)
+* BeginArcArrow3:                        three.              (line  601)
 * BeginArrow:                            draw.               (line   26)
-* BeginArrow3:                           three.              (line  547)
+* BeginArrow3:                           three.              (line  601)
 * BeginBar:                              draw.               (line   19)
-* BeginBar3:                             three.              (line  547)
+* BeginBar3:                             three.              (line  601)
 * BeginDotMargin:                        draw.               (line   42)
-* BeginDotMargin3:                       three.              (line  563)
+* BeginDotMargin3:                       three.              (line  617)
 * BeginMargin:                           draw.               (line   42)
-* BeginMargin3:                          three.              (line  563)
+* BeginMargin3:                          three.              (line  617)
 * BeginPenMargin:                        draw.               (line   42)
-* BeginPenMargin2:                       three.              (line  563)
-* BeginPenMargin3:                       three.              (line  563)
+* BeginPenMargin2:                       three.              (line  617)
+* BeginPenMargin3:                       three.              (line  617)
 * BeginPoint:                            label.              (line   55)
 * Bessel:                                Mathematical functions.
                                                              (line   48)
@@ -8794,12 +8866,12 @@
 * bevel:                                 flowchart.          (line   72)
 * beveljoin:                             Pens.               (line  149)
 * Bezier curves:                         Bezier curves.      (line    6)
-* Bezier patch:                          three.              (line   88)
-* Bezier triangle:                       three.              (line   88)
-* bezulate:                              three.              (line  106)
+* Bezier patch:                          three.              (line  116)
+* Bezier triangle:                       three.              (line  116)
+* bezulate:                              three.              (line  134)
 * Bi:                                    Mathematical functions.
                                                              (line   48)
-* Billboard:                             three.              (line  451)
+* Billboard:                             three.              (line  505)
 * binary:                                Files.              (line   76)
 * binary format:                         Files.              (line   76)
 * binary operators:                      Arithmetic & logical.
@@ -8807,7 +8879,7 @@
 * binarytree:                            binarytree.         (line    6)
 * Bi_deriv:                              Mathematical functions.
                                                              (line   48)
-* black stripes:                         three.              (line  192)
+* black stripes:                         three.              (line  249)
 * Blank:                                 draw.               (line   26)
 * block.bottom:                          flowchart.          (line   19)
 * block.bottomleft:                      flowchart.          (line   19)
@@ -8826,7 +8898,7 @@
                                                              (line    6)
 * Bottom:                                graph.              (line  132)
 * BottomTop:                             graph.              (line  138)
-* BottomView:                            three.              (line  367)
+* BottomView:                            three.              (line  421)
 * bounding box:                          Frames and pictures.
                                                              (line  180)
 * Bounds:                                graph3.             (line   21)
@@ -8834,8 +8906,8 @@
                                                              (line   25)
 * box <1>:                               Frames and pictures.
                                                              (line  130)
-* box <2>:                               three.              (line  286)
-* box <3>:                               three.              (line  288)
+* box <2>:                               three.              (line  340)
+* box <3>:                               three.              (line  342)
 * bp:                                    Drawing in batch mode.
                                                              (line   23)
 * brace:                                 Paths and guides.   (line   51)
@@ -8853,7 +8925,7 @@
 * CAD:                                   CAD.                (line    6)
 * calculateTransform:                    Frames and pictures.
                                                              (line  118)
-* camera:                                three.              (line  333)
+* camera:                                three.              (line  387)
 * casts:                                 Casts.              (line    6)
 * cbrt:                                  Mathematical functions.
                                                              (line    6)
@@ -8861,7 +8933,7 @@
 * ceil:                                  Mathematical functions.
                                                              (line   26)
 * Center:                                label.              (line   60)
-* center:                                three.              (line  316)
+* center:                                three.              (line  370)
 * checker:                               Pens.               (line  269)
 * Chinese:                               unicode.            (line   12)
 * choose:                                Mathematical functions.
@@ -8870,7 +8942,7 @@
                                                              (line   48)
 * circle:                                Paths and guides.   (line   10)
 * Circle:                                Paths and guides.   (line   18)
-* circle <1>:                            three.              (line  260)
+* circle <1>:                            three.              (line  314)
 * circle <2>:                            flowchart.          (line   61)
 * circlebarframe:                        markers.            (line   18)
 * CJK:                                   unicode.            (line   12)
@@ -8881,7 +8953,7 @@
 * CLZ:                                   Arithmetic & logical.
                                                              (line   68)
 * cm:                                    Figure size.        (line   18)
-* cmd:                                   Configuring.        (line   31)
+* cmd:                                   Configuring.        (line   35)
 * cmyk:                                  Pens.               (line   38)
 * colatitude:                            Data types.         (line  158)
 * color:                                 Pens.               (line   23)
@@ -8892,7 +8964,7 @@
 * colors:                                Pens.               (line   54)
 * comma:                                 Files.              (line   61)
 * comma-separated-value mode:            Arrays.             (line  357)
-* command-line options:                  Configuring.        (line   83)
+* command-line options:                  Configuring.        (line   88)
 * command-line options <1>:              Options.            (line    6)
 * comment character:                     Files.              (line   16)
 * compass directions:                    Labels.             (line   18)
@@ -8903,14 +8975,14 @@
 * conditional:                           Programming.        (line   26)
 * conditional <1>:                       Arithmetic & logical.
                                                              (line   61)
-* config:                                Configuring.        (line   64)
-* config <1>:                            Options.            (line  120)
-* configuration file:                    Configuring.        (line   21)
-* configuration file <1>:                Options.            (line  120)
+* config:                                Configuring.        (line   72)
+* config <1>:                            Options.            (line  127)
+* configuration file:                    Configuring.        (line   20)
+* configuration file <1>:                Options.            (line  127)
 * configuring:                           Configuring.        (line    6)
 * conj:                                  Data types.         (line   62)
 * constructors:                          Structures.         (line   91)
-* context:                               Options.            (line  149)
+* context:                               Options.            (line  156)
 * continue:                              Programming.        (line   48)
 * continue <1>:                          Debugger.           (line   31)
 * contour:                               contour.            (line    6)
@@ -8918,11 +8990,11 @@
 * controls:                              Bezier curves.      (line   45)
 * controls <1>:                          three.              (line    6)
 * controlSpecifier:                      Paths and guides.   (line  396)
-* convert:                               Configuring.        (line   64)
+* convert:                               Configuring.        (line   72)
 * convert <1>:                           Files.              (line  155)
 * convert <2>:                           animation.          (line    6)
-* convert <3>:                           Options.            (line  149)
-* convertOptions:                        Options.            (line  135)
+* convert <3>:                           Options.            (line  156)
+* convertOptions:                        Options.            (line  142)
 * Coons shading:                         fill.               (line   77)
 * copy:                                  Arrays.             (line  167)
 * cos:                                   Mathematical functions.
@@ -8946,8 +9018,9 @@
 * curl:                                  Bezier curves.      (line   66)
 * curl <1>:                              three.              (line    6)
 * curlSpecifier:                         Paths and guides.   (line  408)
+* currentlight:                          three.              (line   76)
 * currentpen:                            Pens.               (line    6)
-* currentprojection:                     three.              (line  364)
+* currentprojection:                     three.              (line  418)
 * curve:                                 slopefield.         (line   20)
 * custom axis types:                     graph.              (line  141)
 * custom mark routine:                   graph.              (line  578)
@@ -8959,7 +9032,7 @@
 * cyclic:                                Paths and guides.   (line   85)
 * cyclic <1>:                            Paths and guides.   (line  376)
 * cyclic <2>:                            Arrays.             (line   39)
-* cyclic <3>:                            three.              (line  481)
+* cyclic <3>:                            three.              (line  535)
 * Cyrillic:                              unicode.            (line    7)
 * dashdotted:                            Pens.               (line  102)
 * dashed:                                Pens.               (line  102)
@@ -8973,7 +9046,7 @@
 * default arguments:                     Default arguments.  (line    6)
 * defaultformat:                         graph.              (line  175)
 * DefaultHead:                           draw.               (line   26)
-* DefaultHead3:                          three.              (line  547)
+* DefaultHead3:                          three.              (line  601)
 * defaultpen:                            Pens.               (line   49)
 * defaultpen <1>:                        Pens.               (line  122)
 * defaultpen <2>:                        Pens.               (line  127)
@@ -8993,17 +9066,19 @@
 * description:                           Description.        (line    6)
 * diagonal:                              Arrays.             (line  299)
 * diamond:                               flowchart.          (line   54)
+* diffuse:                               three.              (line   76)
+* diffusepen:                            three.              (line   66)
 * dimension:                             Arrays.             (line  362)
 * dir:                                   Search paths.       (line    9)
 * dir <1>:                               Data types.         (line   90)
 * dir <2>:                               Data types.         (line  180)
 * dir <3>:                               Paths and guides.   (line  109)
-* dir <4>:                               three.              (line  481)
+* dir <4>:                               three.              (line  535)
 * direction specifier:                   Bezier curves.      (line    6)
 * directory:                             Files.              (line   25)
 * dirSpecifier:                          Paths and guides.   (line  390)
 * dirtime:                               Paths and guides.   (line  166)
-* display:                               Configuring.        (line   64)
+* display:                               Configuring.        (line   20)
 * do:                                    Programming.        (line   48)
 * DOSendl:                               Files.              (line   61)
 * DOSnewl:                               Files.              (line   61)
@@ -9013,11 +9088,11 @@
 * dot <3>:                               Arrays.             (line  254)
 * dot <4>:                               Arrays.             (line  257)
 * DotMargin:                             draw.               (line   42)
-* DotMargin3:                            three.              (line  563)
+* DotMargin3:                            three.              (line  617)
 * DotMargins:                            draw.               (line   42)
-* DotMargins3:                           three.              (line  563)
+* DotMargins3:                           three.              (line  617)
 * dotted:                                Pens.               (line  102)
-* double deferred drawing:               three.              (line  238)
+* double deferred drawing:               three.              (line  292)
 * double precision:                      Files.              (line   76)
 * draw:                                  Drawing commands.   (line   31)
 * draw <1>:                              draw.               (line    6)
@@ -9025,15 +9100,15 @@
 * draw <2>:                              draw.               (line  112)
 * Draw <1>:                              Frames and pictures.
                                                              (line  160)
-* draw <3>:                              three.              (line  114)
+* draw <3>:                              three.              (line  142)
 * drawing commands:                      Drawing commands.   (line    6)
 * drawline:                              math.               (line    9)
 * drawtree:                              drawtree.           (line    6)
-* dvips:                                 Configuring.        (line   64)
-* dvipsOptions:                          Options.            (line  135)
-* dvisvgm:                               Configuring.        (line   64)
-* dvisvgm <1>:                           Options.            (line  154)
-* dvisvgmOptions:                        Options.            (line  135)
+* dvips:                                 Configuring.        (line   72)
+* dvipsOptions:                          Options.            (line  142)
+* dvisvgm:                               Configuring.        (line   72)
+* dvisvgm <1>:                           Options.            (line  161)
+* dvisvgmOptions:                        Options.            (line  142)
 * E:                                     Labels.             (line   18)
 * E <1>:                                 Mathematical functions.
                                                              (line   48)
@@ -9048,33 +9123,34 @@
 * else:                                  Programming.        (line   26)
 * emacs:                                 Editing modes.      (line    6)
 * embed:                                 embed.              (line    6)
-* Embedded:                              three.              (line  451)
+* Embedded:                              three.              (line  505)
+* emissivepen:                           three.              (line   66)
 * empty:                                 Frames and pictures.
                                                              (line    7)
 * EndArcArrow:                           draw.               (line   26)
-* EndArcArrow3:                          three.              (line  547)
+* EndArcArrow3:                          three.              (line  601)
 * EndArrow:                              draw.               (line   26)
-* EndArrow3:                             three.              (line  547)
+* EndArrow3:                             three.              (line  601)
 * EndBar:                                draw.               (line   19)
-* EndBar3:                               three.              (line  547)
+* EndBar3:                               three.              (line  601)
 * EndDotMargin:                          draw.               (line   42)
-* EndDotMargin3:                         three.              (line  563)
+* EndDotMargin3:                         three.              (line  617)
 * endl:                                  Files.              (line   61)
 * EndMargin:                             draw.               (line   42)
-* EndMargin3:                            three.              (line  563)
+* EndMargin3:                            three.              (line  617)
 * EndPenMargin:                          draw.               (line   42)
-* EndPenMargin2:                         three.              (line  563)
-* EndPenMargin3:                         three.              (line  563)
+* EndPenMargin2:                         three.              (line  617)
+* EndPenMargin3:                         three.              (line  617)
 * EndPoint:                              label.              (line   55)
 * envelope:                              Frames and pictures.
                                                              (line   25)
-* environment variables:                 Configuring.        (line   87)
+* environment variables:                 Configuring.        (line   92)
 * eof:                                   Files.              (line   93)
 * eof <1>:                               Arrays.             (line  339)
 * eol:                                   Files.              (line   93)
 * eol <1>:                               Arrays.             (line  339)
 * EPS:                                   label.              (line   78)
-* EPS <1>:                               Options.            (line  149)
+* EPS <1>:                               Options.            (line  156)
 * erase:                                 Drawing in interactive mode.
                                                              (line   11)
 * erase <1>:                             Data types.         (line  256)
@@ -9111,12 +9187,12 @@
 * extension:                             Paths and guides.   (line  246)
 * extension <1>:                         MetaPost.           (line   10)
 * external:                              embed.              (line   11)
-* extrude:                               three.              (line  475)
+* extrude:                               three.              (line  529)
 * F:                                     Mathematical functions.
                                                              (line   48)
 * fabs:                                  Mathematical functions.
                                                              (line    6)
-* face:                                  three.              (line  588)
+* face:                                  three.              (line  642)
 * factorial:                             Mathematical functions.
                                                              (line   39)
 * Fedora:                                UNIX binary distributions.
@@ -9146,7 +9222,7 @@
 * firstcut:                              Paths and guides.   (line  262)
 * fit:                                   Frames and pictures.
                                                              (line  113)
-* fit3:                                  three.              (line  251)
+* fit3:                                  three.              (line  305)
 * fixedscaling:                          Frames and pictures.
                                                              (line   81)
 * floor:                                 Mathematical functions.
@@ -9162,12 +9238,13 @@
 * fontsize:                              Pens.               (line  192)
 * for:                                   Programming.        (line   26)
 * format:                                Data types.         (line  289)
-* format <1>:                            Options.            (line  149)
+* format <1>:                            Options.            (line  156)
 * forum:                                 Help.               (line    6)
 * frame:                                 Frames and pictures.
                                                              (line    7)
+* freshnel0:                             three.              (line   66)
 * from:                                  Import.             (line   16)
-* FrontView:                             three.              (line  367)
+* FrontView:                             three.              (line  421)
 * function declarations:                 Functions.          (line   79)
 * Function shading:                      fill.               (line   99)
 * function shading:                      fill.               (line   99)
@@ -9186,8 +9263,8 @@
 * getstring:                             Files.              (line  118)
 * gettriple:                             Files.              (line  118)
 * git:                                   Git.                (line    6)
-* glOptions:                             three.              (line  192)
-* glOptions <1>:                         Options.            (line  135)
+* glOptions:                             three.              (line  249)
+* glOptions <1>:                         Options.            (line  142)
 * GNU Scientific Library:                Mathematical functions.
                                                              (line   48)
 * gouraudshade:                          fill.               (line   62)
@@ -9203,12 +9280,12 @@
 * grid:                                  Pens.               (line  269)
 * grid <1>:                              graph.              (line  747)
 * grid3:                                 grid3.              (line    6)
-* gs:                                    Configuring.        (line    6)
+* gs:                                    Configuring.        (line   20)
 * GSL:                                   Compiling from UNIX source.
                                                              (line   63)
 * gsl:                                   Mathematical functions.
                                                              (line   48)
-* gsOptions:                             Options.            (line  135)
+* gsOptions:                             Options.            (line  142)
 * GUI:                                   GUI.                (line    6)
 * GUI installation:                      GUI installation.   (line    6)
 * GUI usage:                             GUI usage.          (line    6)
@@ -9215,6 +9292,7 @@
 * guide:                                 Paths and guides.   (line  314)
 * guide3:                                three.              (line    6)
 * hatch:                                 Pens.               (line  286)
+* Headlamp:                              three.              (line   76)
 * height:                                LaTeX usage.        (line   50)
 * help:                                  Interactive mode.   (line   42)
 * help <1>:                              Help.               (line    6)
@@ -9225,7 +9303,7 @@
 * hex <1>:                               Pens.               (line   64)
 * hexadecimal:                           Data types.         (line  305)
 * hexadecimal <1>:                       Pens.               (line   62)
-* hidden surface removal:                three.              (line  588)
+* hidden surface removal:                three.              (line  642)
 * histogram:                             Mathematical functions.
                                                              (line   39)
 * history:                               Files.              (line  143)
@@ -9232,27 +9310,31 @@
 * history <1>:                           Interactive mode.   (line   54)
 * historylines:                          Interactive mode.   (line   57)
 * HookHead:                              draw.               (line   26)
-* HookHead3:                             three.              (line  547)
+* HookHead3:                             three.              (line  601)
 * Horizontal:                            flowchart.          (line   77)
-* hyperrefOptions:                       Options.            (line  135)
+* HTML5:                                 three.              (line  220)
+* htmlviewer:                            Configuring.        (line   20)
+* htmlviewer <1>:                        Configuring.        (line   43)
+* htmlviewerOptions:                     Options.            (line  142)
+* hyperrefOptions:                       Options.            (line  142)
 * hypot:                                 Mathematical functions.
                                                              (line    6)
 * I:                                     Mathematical functions.
                                                              (line   48)
-* iconify:                               three.              (line  192)
+* iconify:                               three.              (line  249)
 * identity:                              Transforms.         (line   24)
 * identity <1>:                          Mathematical functions.
                                                              (line    6)
 * identity <2>:                          Arrays.             (line  296)
-* identity4:                             three.              (line  419)
+* identity4:                             three.              (line  473)
 * if:                                    Programming.        (line   26)
 * IgnoreAspect:                          Frames and pictures.
                                                              (line   63)
 * image:                                 palette.            (line   33)
 * image <1>:                             palette.            (line   58)
-* ImageMagick:                           Configuring.        (line   64)
+* ImageMagick:                           Configuring.        (line   72)
 * ImageMagick <1>:                       animation.          (line    6)
-* ImageMagick <2>:                       Options.            (line  149)
+* ImageMagick <2>:                       Options.            (line  156)
 * images:                                palette.            (line    6)
 * implicit casts:                        Casts.              (line    6)
 * implicit linear solver:                MetaPost.           (line   10)
@@ -9280,7 +9362,7 @@
 * inside:                                Paths and guides.   (line  294)
 * inside <1>:                            Paths and guides.   (line  299)
 * inside <2>:                            Paths and guides.   (line  305)
-* insphere:                              three.              (line  510)
+* insphere:                              three.              (line  564)
 * inst:                                  Debugger.           (line   35)
 * installation:                          Installation.       (line    6)
 * int:                                   Data types.         (line   30)
@@ -9300,23 +9382,23 @@
 * interpolate:                           interpolate.        (line    6)
 * intersect:                             Paths and guides.   (line  195)
 * intersect <1>:                         math.               (line   13)
-* intersect <2>:                         three.              (line  481)
+* intersect <2>:                         three.              (line  535)
 * intersectionpoint:                     Paths and guides.   (line  238)
 * intersectionpoint <1>:                 math.               (line   17)
-* intersectionpoint <2>:                 three.              (line  481)
+* intersectionpoint <2>:                 three.              (line  535)
 * intersectionpoints:                    Paths and guides.   (line  242)
-* intersectionpoints <1>:                three.              (line  481)
-* intersectionpoints <2>:                three.              (line  494)
+* intersectionpoints <1>:                three.              (line  535)
+* intersectionpoints <2>:                three.              (line  548)
 * intersections:                         Paths and guides.   (line  206)
 * intersections <1>:                     Paths and guides.   (line  213)
-* intersections <2>:                     three.              (line  481)
-* intersections <3>:                     three.              (line  487)
+* intersections <2>:                     three.              (line  535)
+* intersections <3>:                     three.              (line  541)
 * 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  409)
+* invert:                                three.              (line  463)
 * invisible:                             Pens.               (line   43)
 * isnan:                                 Data types.         (line   35)
 * i_scaled:                              Mathematical functions.
@@ -9335,7 +9417,7 @@
 * keepAspect <1>:                        Frames and pictures.
                                                              (line   63)
 * keepAspect <2>:                        LaTeX usage.        (line   50)
-* keyboard bindings::                    three.              (line  170)
+* keyboard bindings::                    three.              (line  198)
 * keys:                                  Arrays.             (line   39)
 * keyword:                               Named arguments.    (line   37)
 * keyword-only:                          Named arguments.    (line   37)
@@ -9348,7 +9430,7 @@
 * label <1>:                             label.              (line    6)
 * Label <1>:                             label.              (line   14)
 * Label <2>:                             graph.              (line  330)
-* label <2>:                             three.              (line  445)
+* label <2>:                             three.              (line  499)
 * labelpath:                             labelpath.          (line    6)
 * labelpath3:                            labelpath3.         (line    6)
 * labelx:                                graph.              (line  330)
@@ -9357,7 +9439,7 @@
                                                              (line  104)
 * lastcut:                               Paths and guides.   (line  266)
 * lasy-mode:                             Editing modes.      (line    6)
-* latex:                                 Options.            (line  149)
+* latex:                                 Options.            (line  156)
 * LaTeX fonts:                           Pens.               (line  206)
 * LaTeX usage:                           LaTeX usage.        (line    6)
 * latexmk:                               LaTeX usage.        (line   30)
@@ -9372,7 +9454,7 @@
 * LeftSide:                              label.              (line   60)
 * LeftTicks:                             graph.              (line  160)
 * LeftTicks <1>:                         graph.              (line  233)
-* LeftView:                              three.              (line  367)
+* LeftView:                              three.              (line  421)
 * legend:                                Drawing commands.   (line   31)
 * legend <1>:                            draw.               (line   64)
 * legend <2>:                            graph.              (line  425)
@@ -9384,16 +9466,16 @@
 * length <3>:                            Paths and guides.   (line   76)
 * length <4>:                            Paths and guides.   (line  373)
 * length <5>:                            Arrays.             (line   39)
-* length <6>:                            three.              (line  481)
-* letter:                                Configuring.        (line   58)
+* length <6>:                            three.              (line  535)
+* letter:                                Configuring.        (line   66)
 * lexorder:                              math.               (line   67)
 * lexorder <1>:                          math.               (line   70)
-* libgs:                                 Configuring.        (line   64)
-* libgs <1>:                             Options.            (line  154)
+* libgs:                                 Options.            (line  161)
 * libm routines:                         Mathematical functions.
                                                              (line    6)
 * libsigsegv:                            Functions.          (line  100)
 * libsigsegv <1>:                        Help.               (line   27)
+* light:                                 three.              (line   76)
 * limits:                                graph.              (line  640)
 * line:                                  Arrays.             (line  339)
 * line <1>:                              Arrays.             (line  343)
@@ -9421,8 +9503,8 @@
 * longdashed:                            Pens.               (line  102)
 * longitude:                             Data types.         (line  168)
 * loop:                                  Programming.        (line   26)
-* lualatex:                              Options.            (line  149)
-* luatex:                                Options.            (line  149)
+* lualatex:                              Options.            (line  156)
+* luatex:                                Options.            (line  156)
 * MacOS X binary distributions:          MacOS X binary distributions.
                                                              (line    6)
 * makepen:                               Pens.               (line  322)
@@ -9429,11 +9511,11 @@
 * map:                                   Arrays.             (line  131)
 * Margin:                                draw.               (line   42)
 * Margin <1>:                            draw.               (line   42)
-* Margin3:                               three.              (line  563)
-* Margin3 <1>:                           three.              (line  563)
+* Margin3:                               three.              (line  617)
+* Margin3 <1>:                           three.              (line  617)
 * Margins:                               draw.               (line   42)
-* margins:                               three.              (line  244)
-* Margins3:                              three.              (line  563)
+* margins:                               three.              (line  298)
+* Margins3:                              three.              (line  617)
 * mark:                                  graph.              (line  481)
 * markangle:                             markers.            (line   35)
 * marker:                                graph.              (line  481)
@@ -9441,6 +9523,7 @@
 * marknodes:                             graph.              (line  481)
 * markuniform:                           graph.              (line  481)
 * mask:                                  Data types.         (line   35)
+* material:                              three.              (line   66)
 * math:                                  math.               (line    6)
 * mathematical functions:                Mathematical functions.
                                                              (line    6)
@@ -9449,12 +9532,13 @@
                                                              (line    7)
 * max <2>:                               Arrays.             (line  221)
 * max <3>:                               Arrays.             (line  231)
-* max <4>:                               three.              (line  481)
+* max <4>:                               three.              (line  535)
 * maxbound:                              Data types.         (line  134)
 * maxbound <1>:                          Data types.         (line  204)
-* maxtile:                               three.              (line  192)
+* maxtile:                               three.              (line  249)
 * maxtimes:                              Paths and guides.   (line  233)
-* maxviewport:                           three.              (line  192)
+* maxviewport:                           three.              (line  249)
+* metallic:                              three.              (line   66)
 * MetaPost:                              MetaPost.           (line    6)
 * MetaPost ... :                         Bezier curves.      (line   70)
 * MetaPost cutafter:                     Paths and guides.   (line  267)
@@ -9463,9 +9547,9 @@
 * MetaPost whatever:                     MetaPost.           (line   10)
 * Microsoft Windows:                     Microsoft Windows.  (line    6)
 * MidArcArrow:                           draw.               (line   26)
-* MidArcArrow3:                          three.              (line  547)
+* MidArcArrow3:                          three.              (line  601)
 * MidArrow:                              draw.               (line   26)
-* MidArrow3:                             three.              (line  547)
+* MidArrow3:                             three.              (line  601)
 * MidPoint:                              label.              (line   55)
 * midpoint:                              Paths and guides.   (line  180)
 * min:                                   Paths and guides.   (line  275)
@@ -9473,7 +9557,7 @@
                                                              (line    7)
 * min <2>:                               Arrays.             (line  216)
 * min <3>:                               Arrays.             (line  226)
-* min <4>:                               three.              (line  481)
+* min <4>:                               three.              (line  535)
 * minbound:                              Data types.         (line  131)
 * minbound <1>:                          Data types.         (line  201)
 * minipage:                              label.              (line  116)
@@ -9482,15 +9566,16 @@
 * miterlimit:                            Pens.               (line  159)
 * mktemp:                                Files.              (line   44)
 * mm:                                    Figure size.        (line   18)
+* mobile browser:                        three.              (line  220)
 * mode:                                  Files.              (line   76)
 * mode <1>:                              Files.              (line   89)
 * monotonic:                             graph.              (line   36)
 * mouse:                                 GUI.                (line    6)
-* mouse bindings:                        three.              (line  151)
+* mouse bindings:                        three.              (line  179)
 * mouse wheel:                           GUI usage.          (line    6)
 * Move:                                  Pens.               (line  359)
 * MoveQuiet:                             Pens.               (line  365)
-* multisample:                           three.              (line  142)
+* multisample:                           three.              (line  172)
 * N:                                     Labels.             (line   18)
 * name:                                  Files.              (line   89)
 * named arguments:                       Named arguments.    (line    6)
@@ -9512,13 +9597,14 @@
 * NoFill:                                draw.               (line   26)
 * NoFill <1>:                            Frames and pictures.
                                                              (line  154)
+* nolight:                               three.              (line   76)
 * NoMargin:                              draw.               (line   42)
-* NoMargin3:                             three.              (line  563)
+* NoMargin3:                             three.              (line  617)
 * None:                                  draw.               (line   19)
 * None <1>:                              draw.               (line   26)
 * none:                                  Files.              (line   61)
-* normal:                                three.              (line  467)
-* nosafe:                                Options.            (line  173)
+* normal:                                three.              (line  521)
+* nosafe:                                Options.            (line  180)
 * NOT:                                   Arithmetic & logical.
                                                              (line   68)
 * notaknot:                              graph.              (line   36)
@@ -9530,22 +9616,23 @@
                                                              (line  140)
 * nullpen <2>:                           Frames and pictures.
                                                              (line  149)
-* NURBS:                                 three.              (line  343)
-* O:                                     three.              (line  256)
+* NURBS:                                 three.              (line  397)
+* O:                                     three.              (line  310)
 * obj:                                   obj.                (line    6)
-* oblique:                               three.              (line  299)
-* obliqueX:                              three.              (line  306)
-* obliqueY:                              three.              (line  312)
-* obliqueZ:                              three.              (line  299)
+* oblique:                               three.              (line  353)
+* obliqueX:                              three.              (line  360)
+* obliqueY:                              three.              (line  366)
+* obliqueZ:                              three.              (line  353)
 * ode:                                   ode.                (line    6)
 * offset:                                Pens.               (line  123)
-* offset <1>:                            Options.            (line  178)
+* offset <1>:                            Options.            (line  185)
 * OmitTick:                              graph.              (line  223)
 * OmitTickInterval:                      graph.              (line  223)
 * OmitTickIntervals:                     graph.              (line  223)
 * opacity:                               Pens.               (line  237)
+* opacity <1>:                           three.              (line   66)
 * open:                                  Files.              (line   12)
-* OpenGL:                                three.              (line  142)
+* OpenGL:                                three.              (line  172)
 * operator:                              User-defined operators.
                                                              (line    6)
 * operator +(...string[] a).:            Data types.         (line  283)
@@ -9562,15 +9649,15 @@
 * OR:                                    Arithmetic & logical.
                                                              (line   68)
 * orient:                                Data types.         (line  108)
-* orient <1>:                            three.              (line  498)
+* orient <1>:                            three.              (line  552)
 * orientation:                           Frames and pictures.
                                                              (line  104)
-* orthographic:                          three.              (line  316)
-* outformat:                             three.              (line  142)
+* orthographic:                          three.              (line  370)
+* outformat:                             three.              (line  172)
 * outprefix:                             Frames and pictures.
                                                              (line   91)
 * output:                                Files.              (line   36)
-* output <1>:                            Options.            (line  149)
+* output <1>:                            Options.            (line  156)
 * OutTicks:                              graph3.             (line   35)
 * overloading functions:                 Functions.          (line   55)
 * overwrite:                             Pens.               (line  344)
@@ -9581,15 +9668,15 @@
 * pair:                                  Figure size.        (line    6)
 * pair <1>:                              Data types.         (line   46)
 * pairs:                                 Arrays.             (line  236)
-* paperheight:                           Configuring.        (line   58)
-* papertype:                             Configuring.        (line   58)
-* paperwidth:                            Configuring.        (line   58)
+* paperheight:                           Configuring.        (line   66)
+* papertype:                             Configuring.        (line   66)
+* paperwidth:                            Configuring.        (line   66)
 * parallelogram:                         flowchart.          (line   47)
 * parametric surface:                    graph3.             (line   99)
 * parametrized curve:                    graph.              (line  640)
 * partialsum:                            math.               (line   53)
 * partialsum <1>:                        math.               (line   56)
-* patch-dependent colors:                three.              (line   79)
+* patch-dependent colors:                three.              (line  107)
 * path:                                  Paths.              (line    6)
 * path <1>:                              Paths and guides.   (line    7)
 * path <2>:                              three.              (line   42)
@@ -9600,37 +9687,39 @@
 * path[]:                                Paths.              (line   23)
 * patterns:                              Pens.               (line  255)
 * patterns <1>:                          patterns.           (line    6)
-* PDF:                                   Options.            (line  149)
-* pdflatex:                              Options.            (line  149)
-* pdfreloadOptions:                      Options.            (line  135)
-* pdfviewer:                             Configuring.        (line    6)
-* pdfviewerOptions:                      Options.            (line  135)
+* PBR:                                   three.              (line   74)
+* PDF:                                   Options.            (line  156)
+* pdflatex:                              Options.            (line  156)
+* pdfreloadOptions:                      Options.            (line  142)
+* pdfviewer:                             Configuring.        (line   20)
+* pdfviewerOptions:                      Options.            (line  142)
 * pen:                                   Pens.               (line    6)
 * PenMargin:                             draw.               (line   42)
-* PenMargin2:                            three.              (line  563)
-* PenMargin3:                            three.              (line  563)
+* PenMargin2:                            three.              (line  617)
+* PenMargin3:                            three.              (line  617)
 * PenMargins:                            draw.               (line   42)
-* PenMargins2:                           three.              (line  563)
-* PenMargins3:                           three.              (line  563)
+* PenMargins2:                           three.              (line  617)
+* PenMargins3:                           three.              (line  617)
 * periodic:                              graph.              (line   36)
 * perl:                                  LaTeX usage.        (line   30)
 * perpendicular:                         geometry.           (line    6)
-* perspective:                           three.              (line  343)
+* perspective:                           three.              (line  397)
+* physically based rendering:            three.              (line   74)
 * picture:                               Frames and pictures.
                                                              (line   39)
 * picture alignment:                     Frames and pictures.
                                                              (line  228)
 * piecewisestraight:                     Paths and guides.   (line   92)
-* pixel:                                 three.              (line  570)
+* pixel:                                 three.              (line  624)
 * Pl:                                    Mathematical functions.
                                                              (line   48)
 * plain:                                 plain.              (line    6)
-* planar:                                three.              (line   88)
-* plane:                                 three.              (line  282)
-* planeproject:                          three.              (line  464)
+* planar:                                three.              (line  116)
+* plane:                                 three.              (line  336)
+* planeproject:                          three.              (line  518)
 * point:                                 Paths and guides.   (line   95)
 * point <1>:                             Paths and guides.   (line  379)
-* point <2>:                             three.              (line  481)
+* point <2>:                             three.              (line  535)
 * polar:                                 Data types.         (line  148)
 * polargraph:                            graph.              (line   88)
 * polygon:                               graph.              (line  481)
@@ -9637,8 +9726,9 @@
 * pop:                                   Arrays.             (line   39)
 * Portrait:                              Frames and pictures.
                                                              (line  104)
+* position:                              three.              (line   76)
 * postcontrol:                           Paths and guides.   (line  146)
-* postcontrol <1>:                       three.              (line  481)
+* postcontrol <1>:                       three.              (line  535)
 * postfix operators:                     Self & prefix operators.
                                                              (line   19)
 * postscript:                            Frames and pictures.
@@ -9647,10 +9737,10 @@
 * PostScript subpath:                    Paths.              (line   23)
 * pow10:                                 Mathematical functions.
                                                              (line    6)
-* prc:                                   three.              (line  213)
+* prc:                                   three.              (line  267)
 * precision:                             Files.              (line   93)
 * precontrol:                            Paths and guides.   (line  139)
-* precontrol <1>:                        three.              (line  481)
+* precontrol <1>:                        three.              (line  535)
 * prefix operators:                      Self & prefix operators.
                                                              (line    6)
 * private:                               Structures.         (line    6)
@@ -9657,8 +9747,8 @@
 * programming:                           Programming.        (line    6)
 * pstoedit:                              PostScript to Asymptote.
                                                              (line    6)
-* psviewer:                              Configuring.        (line    6)
-* psviewerOptions:                       Options.            (line  135)
+* psviewer:                              Configuring.        (line   20)
+* psviewerOptions:                       Options.            (line  142)
 * pt:                                    Figure size.        (line   18)
 * public:                                Structures.         (line    6)
 * push:                                  Arrays.             (line   39)
@@ -9666,7 +9756,7 @@
 * quadraticroots:                        Arrays.             (line  305)
 * quadraticroots <1>:                    Arrays.             (line  310)
 * quarticroots:                          math.               (line   22)
-* quick reference:                       Description.        (line   81)
+* quick reference:                       Description.        (line   84)
 * quit:                                  Drawing in interactive mode.
                                                              (line   11)
 * quit <1>:                              Interactive mode.   (line   54)
@@ -9682,7 +9772,7 @@
 * radians:                               Mathematical functions.
                                                              (line   17)
 * radius:                                Paths and guides.   (line  135)
-* radius <1>:                            three.              (line  481)
+* radius <1>:                            three.              (line  535)
 * Rainbow:                               palette.            (line   12)
 * rand:                                  Mathematical functions.
                                                              (line   39)
@@ -9700,7 +9790,7 @@
 * realmult:                              Data types.         (line  100)
 * rectangle:                             flowchart.          (line   34)
 * recursion:                             Functions.          (line  100)
-* reference:                             Description.        (line   81)
+* reference:                             Description.        (line   84)
 * reflect:                               Transforms.         (line   42)
 * Relative:                              label.              (line   50)
 * Relative <1>:                          label.              (line   60)
@@ -9710,8 +9800,8 @@
                                                              (line    6)
 * rename:                                Files.              (line  152)
 * render:                                three.              (line   46)
-* render <1>:                            three.              (line  142)
-* render <2>:                            Options.            (line  149)
+* render <1>:                            three.              (line  172)
+* render <2>:                            Options.            (line  156)
 * replace:                               Data types.         (line  269)
 * resetdefaultpen:                       Pens.               (line  371)
 * rest arguments:                        Rest arguments.     (line    6)
@@ -9723,7 +9813,7 @@
 * reverse <1>:                           Paths and guides.   (line  183)
 * reverse <2>:                           Paths and guides.   (line  382)
 * reverse <3>:                           Arrays.             (line  136)
-* reverse <4>:                           three.              (line  481)
+* reverse <4>:                           three.              (line  535)
 * rewind:                                Files.              (line   93)
 * rfind:                                 Data types.         (line  246)
 * rgb:                                   Pens.               (line   30)
@@ -9735,9 +9825,9 @@
 * RightSide:                             label.              (line   60)
 * RightTicks:                            graph.              (line  160)
 * RightTicks <1>:                        graph.              (line  233)
-* RightView:                             three.              (line  367)
+* RightView:                             three.              (line  421)
 * Rotate:                                label.              (line   36)
-* rotate:                                three.              (line  435)
+* rotate:                                three.              (line  489)
 * Rotate(pair z):                        label.              (line   39)
 * round:                                 Mathematical functions.
                                                              (line   26)
@@ -9750,7 +9840,7 @@
 * runtime imports:                       Import.             (line   97)
 * Russian:                               unicode.            (line    7)
 * S:                                     Labels.             (line   18)
-* safe:                                  Options.            (line  173)
+* safe:                                  Options.            (line  180)
 * save:                                  Frames and pictures.
                                                              (line  285)
 * saveline:                              Files.              (line  135)
@@ -9760,8 +9850,8 @@
 * scale <2>:                             Transforms.         (line   36)
 * scale <3>:                             graph.              (line  691)
 * Scale <1>:                             graph.              (line  708)
-* scale <4>:                             three.              (line  434)
-* scale3:                                three.              (line  432)
+* scale <4>:                             three.              (line  488)
+* scale3:                                three.              (line  486)
 * scaled graph:                          graph.              (line  671)
 * scientific graph:                      graph.              (line  388)
 * scroll:                                Files.              (line  109)
@@ -9781,8 +9871,8 @@
 * self operators:                        Self & prefix operators.
                                                              (line    6)
 * sequence:                              Arrays.             (line  118)
-* settings:                              Configuring.        (line   21)
-* settings <1>:                          Options.            (line  120)
+* settings:                              Configuring.        (line   20)
+* settings <1>:                          Options.            (line  127)
 * sgn:                                   Mathematical functions.
                                                              (line   26)
 * shading:                               fill.               (line   32)
@@ -9790,11 +9880,12 @@
 * shift:                                 Transforms.         (line   26)
 * shift <1>:                             Transforms.         (line   28)
 * shift <2>:                             Transforms.         (line   46)
-* shift <3>:                             three.              (line  424)
+* shift <3>:                             three.              (line  478)
 * shiftless:                             Transforms.         (line   46)
+* shininess:                             three.              (line   66)
 * shipout:                               Frames and pictures.
                                                              (line   91)
-* showtarget:                            three.              (line  316)
+* showtarget:                            three.              (line  370)
 * Si:                                    Mathematical functions.
                                                              (line   48)
 * signedint:                             Files.              (line   76)
@@ -9814,9 +9905,9 @@
 * singlereal <1>:                        Files.              (line   89)
 * sinh:                                  Mathematical functions.
                                                              (line    6)
-* SixViews:                              three.              (line  382)
-* SixViewsFR:                            three.              (line  382)
-* SixViewsUS:                            three.              (line  382)
+* SixViews:                              three.              (line  436)
+* SixViewsFR:                            three.              (line  436)
+* SixViewsUS:                            three.              (line  436)
 * size:                                  Figure size.        (line    6)
 * size <1>:                              Paths and guides.   (line   81)
 * size <2>:                              Paths and guides.   (line  370)
@@ -9824,9 +9915,9 @@
                                                              (line   48)
 * size <4>:                              Frames and pictures.
                                                              (line   74)
-* size <5>:                              three.              (line  481)
-* size <6>:                              Options.            (line  149)
-* size3:                                 three.              (line  241)
+* size <5>:                              three.              (line  535)
+* size <6>:                              Options.            (line  156)
+* size3:                                 three.              (line  295)
 * Slant:                                 label.              (line   42)
 * slant:                                 Transforms.         (line   38)
 * sleep:                                 Data types.         (line  375)
@@ -9847,6 +9938,9 @@
 * sort:                                  Arrays.             (line  177)
 * sort <1>:                              Arrays.             (line  181)
 * sort <2>:                              Arrays.             (line  196)
+* specular:                              three.              (line   76)
+* specularfactor:                        three.              (line   76)
+* specularpen:                           three.              (line   66)
 * Spline:                                graph.              (line   33)
 * Spline <1>:                            graph3.             (line   99)
 * split:                                 Data types.         (line  278)
@@ -9867,7 +9961,7 @@
 * stop:                                  Debugger.           (line   10)
 * straight:                              Paths and guides.   (line   88)
 * Straight:                              graph.              (line   30)
-* straight <1>:                          three.              (line  481)
+* straight <1>:                          three.              (line  535)
 * strftime:                              Data types.         (line  320)
 * strftime <1>:                          Data types.         (line  345)
 * string:                                Data types.         (line  207)
@@ -9879,7 +9973,7 @@
 * struct:                                Structures.         (line    6)
 * structures:                            Structures.         (line    6)
 * subpath:                               Paths and guides.   (line  186)
-* subpath <1>:                           three.              (line  481)
+* subpath <1>:                           three.              (line  535)
 * subpictures:                           Frames and pictures.
                                                              (line  113)
 * substr:                                Data types.         (line  261)
@@ -9888,12 +9982,12 @@
 * Suppress:                              Pens.               (line  351)
 * SuppressQuiet:                         Pens.               (line  355)
 * surface:                               three.              (line   46)
-* surface <1>:                           three.              (line   88)
-* surface <2>:                           three.              (line  102)
+* surface <1>:                           three.              (line  116)
+* surface <2>:                           three.              (line  130)
 * surface <3>:                           graph3.             (line   99)
-* SVG:                                   Options.            (line  154)
+* SVG:                                   Options.            (line  161)
 * system:                                Data types.         (line  353)
-* system <1>:                            Options.            (line  173)
+* system <1>:                            Options.            (line  180)
 * syzygy:                                syzygy.             (line    6)
 * tab:                                   Files.              (line   61)
 * tab completion:                        Drawing in interactive mode.
@@ -9904,7 +9998,7 @@
                                                              (line   20)
 * tanh:                                  Mathematical functions.
                                                              (line    6)
-* target:                                three.              (line  316)
+* target:                                three.              (line  370)
 * tell:                                  Files.              (line   93)
 * tension:                               Bezier curves.      (line   56)
 * tension <1>:                           three.              (line    6)
@@ -9911,16 +10005,16 @@
 * tensionSpecifier:                      Paths and guides.   (line  402)
 * tensor product shading:                fill.               (line   77)
 * tensorshade:                           fill.               (line   77)
-* tessellation:                          three.              (line  114)
+* tessellation:                          three.              (line  142)
 * tex:                                   Frames and pictures.
                                                              (line  302)
-* tex <1>:                               Options.            (line  149)
+* tex <1>:                               Options.            (line  156)
 * TeX fonts:                             Pens.               (line  215)
 * TeX string:                            Data types.         (line  207)
-* texcommand:                            Configuring.        (line   64)
+* texcommand:                            Configuring.        (line   72)
 * TeXHead:                               draw.               (line   26)
-* TeXHead3:                              three.              (line  547)
-* texpath:                               Configuring.        (line   64)
+* TeXHead3:                              three.              (line  601)
+* texpath:                               Configuring.        (line   72)
 * texpath <1>:                           label.              (line  113)
 * texpreamble:                           Frames and pictures.
                                                              (line  311)
@@ -9929,13 +10023,13 @@
 * textbook graph:                        graph.              (line  360)
 * tgz:                                   UNIX binary distributions.
                                                              (line    6)
-* thick:                                 three.              (line  125)
-* thin:                                  three.              (line  125)
+* thick:                                 three.              (line  154)
+* thin:                                  three.              (line  154)
 * this:                                  Structures.         (line    6)
 * three:                                 three.              (line    6)
-* ThreeViews:                            three.              (line  382)
-* ThreeViewsFR:                          three.              (line  382)
-* ThreeViewsUS:                          three.              (line  382)
+* ThreeViews:                            three.              (line  436)
+* ThreeViewsFR:                          three.              (line  436)
+* ThreeViewsUS:                          three.              (line  436)
 * tick:                                  graph.              (line  330)
 * ticks:                                 graph.              (line  160)
 * Ticks:                                 graph.              (line  160)
@@ -9950,19 +10044,20 @@
 * times:                                 Paths and guides.   (line  220)
 * times <1>:                             Paths and guides.   (line  224)
 * Top:                                   graph.              (line  135)
-* TopView:                               three.              (line  367)
+* TopView:                               three.              (line  421)
 * trace:                                 Debugger.           (line   50)
 * trailingzero:                          graph.              (line  175)
 * transform:                             Transforms.         (line    6)
-* transform <1>:                         three.              (line  456)
-* transform3:                            three.              (line  419)
+* transform <1>:                         three.              (line  510)
+* transform3:                            three.              (line  473)
 * transparency:                          Pens.               (line  237)
+* transparent:                           three.              (line   97)
 * transpose:                             Arrays.             (line  203)
 * transpose <1>:                         Arrays.             (line  206)
 * tree:                                  tree.               (line    6)
 * trembling:                             trembling.          (line    6)
 * triangle:                              geometry.           (line    6)
-* triangles:                             three.              (line  114)
+* triangles:                             three.              (line  142)
 * triangulate:                           contour.            (line  149)
 * tridiagonal:                           Arrays.             (line  261)
 * trigonometric integrals:               Mathematical functions.
@@ -9969,8 +10064,8 @@
                                                              (line   48)
 * triple:                                Data types.         (line  137)
 * TrueMargin:                            draw.               (line   42)
-* TrueMargin3:                           three.              (line  563)
-* tube:                                  three.              (line  125)
+* TrueMargin3:                           three.              (line  617)
+* tube:                                  three.              (line  154)
 * tube <1>:                              tube.               (line    6)
 * tutorial:                              Tutorial.           (line    6)
 * type1cm:                               Pens.               (line  192)
@@ -9991,10 +10086,10 @@
 * unit:                                  Data types.         (line   83)
 * unit <1>:                              Data types.         (line  173)
 * unitbox:                               Paths.              (line   44)
-* unitbox <1>:                           three.              (line  288)
+* unitbox <1>:                           three.              (line  342)
 * unitcircle:                            Paths.              (line   17)
 * unitcircle <1>:                        Paths.              (line   17)
-* unitcircle <2>:                        three.              (line  256)
+* unitcircle <2>:                        three.              (line  310)
 * unitrand:                              Mathematical functions.
                                                              (line   39)
 * unitsize:                              Figure size.        (line   39)
@@ -10004,7 +10099,7 @@
                                                              (line    6)
 * unpacking:                             Rest arguments.     (line   39)
 * unravel:                               Import.             (line   29)
-* up:                                    three.              (line  316)
+* up:                                    three.              (line  370)
 * update:                                Files.              (line   36)
 * UpsideDown:                            Frames and pictures.
                                                              (line  104)
@@ -10028,21 +10123,24 @@
 * vectorization:                         Arrays.             (line  318)
 * verbatim:                              Frames and pictures.
                                                              (line  294)
-* vertex-dependent colors:               three.              (line   79)
+* vertex-dependent colors:               three.              (line  107)
 * Vertical:                              flowchart.          (line   77)
+* Viewport:                              three.              (line   76)
 * viewportheight:                        LaTeX usage.        (line   50)
-* viewportmargin:                        three.              (line  244)
-* viewportsize:                          three.              (line  244)
+* viewportmargin:                        three.              (line  298)
+* viewportsize:                          three.              (line  298)
 * viewportwidth:                         LaTeX usage.        (line   50)
-* views:                                 three.              (line  213)
+* views:                                 three.              (line  267)
 * vim:                                   Editing modes.      (line   32)
 * virtual functions:                     Structures.         (line  181)
 * void:                                  Data types.         (line   10)
 * W:                                     Labels.             (line   18)
+* WebGL:                                 three.              (line  220)
 * whatever:                              Paths and guides.   (line  246)
 * Wheel:                                 palette.            (line   22)
 * wheel mouse:                           GUI.                (line    6)
 * while:                                 Programming.        (line   48)
+* White:                                 three.              (line   76)
 * white-space string delimiter mode:     Arrays.             (line  349)
 * width:                                 LaTeX usage.        (line   50)
 * windingnumber:                         Paths and guides.   (line  283)
@@ -10049,11 +10147,11 @@
 * word:                                  Arrays.             (line  349)
 * write:                                 Files.              (line   53)
 * write <1>:                             Arrays.             (line  388)
-* X:                                     three.              (line  256)
+* X:                                     three.              (line  310)
 * xasy:                                  GUI.                (line    6)
 * xaxis3:                                graph3.             (line    7)
 * xdr:                                   Files.              (line   76)
-* xelatex:                               Options.            (line  149)
+* xelatex:                               Options.            (line  156)
 * XEquals:                               graph.              (line  265)
 * xequals:                               graph.              (line  278)
 * xlimits:                               graph.              (line  640)
@@ -10062,10 +10160,10 @@
 * xpart:                                 Data types.         (line   94)
 * xpart <1>:                             Data types.         (line  184)
 * xscale:                                Transforms.         (line   30)
-* xscale3:                               three.              (line  426)
+* xscale3:                               three.              (line  480)
 * xtick:                                 graph.              (line  330)
-* XY:                                    three.              (line  441)
-* XY <1>:                                three.              (line  456)
+* XY:                                    three.              (line  495)
+* XY <1>:                                three.              (line  510)
 * XYEquals:                              graph3.             (line   21)
 * XYZero:                                graph3.             (line   21)
 * XZEquals:                              graph3.             (line   21)
@@ -10075,7 +10173,7 @@
                                                              (line    6)
 * Y <1>:                                 Mathematical functions.
                                                              (line   48)
-* Y <2>:                                 three.              (line  256)
+* Y <2>:                                 three.              (line  310)
 * yaxis3:                                graph3.             (line    7)
 * YEquals:                               graph.              (line  128)
 * yequals:                               graph.              (line  278)
@@ -10083,14 +10181,14 @@
 * ypart:                                 Data types.         (line   97)
 * ypart <1>:                             Data types.         (line  187)
 * yscale:                                Transforms.         (line   32)
-* yscale3:                               three.              (line  428)
+* yscale3:                               three.              (line  482)
 * ytick:                                 graph.              (line  330)
-* YX:                                    three.              (line  456)
-* YZ:                                    three.              (line  456)
+* YX:                                    three.              (line  510)
+* YZ:                                    three.              (line  510)
 * YZEquals:                              graph3.             (line   21)
 * YZero:                                 graph.              (line  123)
 * YZZero:                                graph3.             (line   21)
-* Z:                                     three.              (line  256)
+* Z:                                     three.              (line  310)
 * zaxis3:                                graph3.             (line    7)
 * zeroTransform:                         Transforms.         (line   44)
 * zerowinding:                           Pens.               (line  164)
@@ -10107,159 +10205,159 @@
 * zeta:                                  Mathematical functions.
                                                              (line   48)
 * zpart:                                 Data types.         (line  190)
-* zscale3:                               three.              (line  430)
-* ZX:                                    three.              (line  456)
-* ZX <1>:                                three.              (line  456)
-* ZY:                                    three.              (line  456)
+* zscale3:                               three.              (line  484)
+* ZX:                                    three.              (line  510)
+* ZX <1>:                                three.              (line  510)
+* ZY:                                    three.              (line  510)
 
 
 
 Tag Table:
 Node: Top570
-Node: Description7279
-Node: Installation11100
-Node: UNIX binary distributions12144
-Node: MacOS X binary distributions13274
-Node: Microsoft Windows13828
-Node: Configuring15032
-Node: Search paths19178
-Node: Compiling from UNIX source20017
-Node: Editing modes23077
-Node: Git25498
-Node: Uninstall25898
-Node: Tutorial26244
-Node: Drawing in batch mode27132
-Node: Drawing in interactive mode28007
-Node: Figure size29039
-Node: Labels30631
-Node: Paths31458
-Ref: unitcircle32073
-Node: Drawing commands33973
-Node: draw35688
-Ref: arrows36870
-Node: fill42383
-Ref: gradient shading43429
-Node: clip47936
-Node: label48523
-Ref: Label49123
-Node: Bezier curves54968
-Node: Programming58865
-Ref: array iteration60618
-Node: Data types60785
-Ref: format71447
-Node: Paths and guides75893
-Ref: circle76147
-Ref: extension85854
-Node: Pens92663
-Ref: fillrule100352
-Ref: basealign101256
-Ref: transparency104090
-Ref: makepen107670
-Ref: overwrite108553
-Node: Transforms109767
-Node: Frames and pictures111599
-Ref: envelope112757
-Ref: size113850
-Ref: unitsize114837
-Ref: shipout115910
-Ref: filltype118261
-Ref: add121433
-Ref: add about122439
-Ref: tex125468
-Node: Files126364
-Ref: cd127351
-Ref: scroll132036
-Node: Variable initializers134954
-Node: Structures137671
-Node: Operators145173
-Node: Arithmetic & logical145487
-Node: Self & prefix operators147858
-Node: User-defined operators148652
-Node: Implicit scaling149565
-Node: Functions150128
-Ref: stack overflow153271
-Node: Default arguments153553
-Node: Named arguments154309
-Node: Rest arguments156879
-Node: Mathematical functions160001
-Node: Arrays164664
-Ref: sort171772
-Ref: tridiagonal174397
-Ref: solve175628
-Node: Slices179767
-Node: Casts183675
-Node: Import185942
-Node: Static191200
-Node: LaTeX usage194093
-Node: Base modules200608
-Node: plain203165
-Node: simplex203839
-Node: math204113
-Node: interpolate206822
-Node: geometry207101
-Node: trembling207695
-Node: stats207964
-Node: patterns208224
-Node: markers208460
-Node: tree210320
-Node: binarytree210505
-Node: drawtree211171
-Node: syzygy211372
-Node: feynman211646
-Node: roundedpath211921
-Node: animation212204
-Ref: animate212625
-Node: embed213742
-Node: slide214697
-Node: MetaPost215038
-Node: unicode215757
-Node: latin1216631
-Node: babel217000
-Node: labelpath217230
-Node: labelpath3218051
-Node: annotate218362
-Node: CAD218832
-Node: graph219143
-Ref: ticks226304
-Ref: pathmarkers240096
-Ref: marker240567
-Ref: markuniform240921
-Ref: errorbars242729
-Ref: automatic scaling247203
-Node: palette258950
-Ref: images259068
-Ref: image263242
-Ref: logimage263762
-Ref: penimage264867
-Ref: penfunctionimage265129
-Node: three265900
-Ref: PostScript3D292907
-Node: obj294645
-Node: graph3294894
-Ref: GaussianSurface300174
-Node: grid3301323
-Node: solids302107
-Node: tube303099
-Node: flowchart305333
-Node: contour309941
-Node: contour3315256
-Node: smoothcontour3315569
-Node: slopefield317290
-Node: ode318779
-Node: Options319036
-Ref: configuration file325418
-Ref: settings325418
-Ref: texengines326661
-Ref: convert326661
-Node: Interactive mode329985
-Ref: history332135
-Node: GUI333441
-Node: GUI installation333992
-Node: GUI usage334721
-Node: PostScript to Asymptote335637
-Node: Help336395
-Node: Debugger338049
-Node: Credits339805
-Node: Index340822
+Node: Description7280
+Node: Installation11190
+Node: UNIX binary distributions12234
+Node: MacOS X binary distributions13364
+Node: Microsoft Windows13918
+Node: Configuring15123
+Node: Search paths19579
+Node: Compiling from UNIX source20418
+Node: Editing modes23478
+Node: Git25899
+Node: Uninstall26299
+Node: Tutorial26645
+Node: Drawing in batch mode27534
+Node: Drawing in interactive mode28409
+Node: Figure size29441
+Node: Labels31033
+Node: Paths31860
+Ref: unitcircle32475
+Node: Drawing commands34375
+Node: draw36090
+Ref: arrows37272
+Node: fill42785
+Ref: gradient shading43831
+Node: clip48338
+Node: label48925
+Ref: Label49525
+Node: Bezier curves55370
+Node: Programming59267
+Ref: array iteration61020
+Node: Data types61187
+Ref: format71849
+Node: Paths and guides76295
+Ref: circle76549
+Ref: extension86256
+Node: Pens93065
+Ref: fillrule100754
+Ref: basealign101658
+Ref: transparency104492
+Ref: makepen108072
+Ref: overwrite108955
+Node: Transforms110169
+Node: Frames and pictures112001
+Ref: envelope113159
+Ref: size114252
+Ref: unitsize115239
+Ref: shipout116312
+Ref: filltype118663
+Ref: add121835
+Ref: add about122841
+Ref: tex125870
+Node: Files126766
+Ref: cd127753
+Ref: scroll132438
+Node: Variable initializers135356
+Node: Structures138073
+Node: Operators145575
+Node: Arithmetic & logical145889
+Node: Self & prefix operators148259
+Node: User-defined operators149053
+Node: Implicit scaling149966
+Node: Functions150529
+Ref: stack overflow153672
+Node: Default arguments153954
+Node: Named arguments154710
+Node: Rest arguments157280
+Node: Mathematical functions160402
+Node: Arrays165065
+Ref: sort172173
+Ref: tridiagonal174798
+Ref: solve176029
+Node: Slices180169
+Node: Casts184077
+Node: Import186344
+Node: Static191602
+Node: LaTeX usage194495
+Node: Base modules201010
+Node: plain203567
+Node: simplex204241
+Node: math204515
+Node: interpolate207224
+Node: geometry207503
+Node: trembling208097
+Node: stats208366
+Node: patterns208626
+Node: markers208862
+Node: tree210722
+Node: binarytree210907
+Node: drawtree211573
+Node: syzygy211774
+Node: feynman212048
+Node: roundedpath212323
+Node: animation212606
+Ref: animate213027
+Node: embed214144
+Node: slide215099
+Node: MetaPost215440
+Node: unicode216159
+Node: latin1217033
+Node: babel217402
+Node: labelpath217632
+Node: labelpath3218453
+Node: annotate218764
+Node: CAD219234
+Node: graph219545
+Ref: ticks226706
+Ref: pathmarkers240498
+Ref: marker240969
+Ref: markuniform241323
+Ref: errorbars243131
+Ref: automatic scaling247605
+Node: palette259352
+Ref: images259470
+Ref: image263644
+Ref: logimage264164
+Ref: penimage265269
+Ref: penfunctionimage265531
+Node: three266302
+Ref: PostScript3D295414
+Node: obj297152
+Node: graph3297401
+Ref: GaussianSurface302681
+Node: grid3303830
+Node: solids304614
+Node: tube305606
+Node: flowchart307840
+Node: contour312448
+Node: contour3317763
+Node: smoothcontour3318076
+Node: slopefield319797
+Node: ode321286
+Node: Options321543
+Ref: configuration file328391
+Ref: settings328391
+Ref: texengines329655
+Ref: convert329655
+Node: Interactive mode332979
+Ref: history335129
+Node: GUI336435
+Node: GUI installation336986
+Node: GUI usage337716
+Node: PostScript to Asymptote338632
+Node: Help339390
+Node: Debugger341044
+Node: Credits342800
+Node: Index343817
 
 End Tag Table

Modified: trunk/Build/source/utils/asymptote/drawelement.h
===================================================================
--- trunk/Build/source/utils/asymptote/drawelement.h	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/drawelement.h	2019-10-06 17:17:34 UTC (rev 52300)
@@ -17,6 +17,7 @@
 #include "psfile.h"
 #include "texfile.h"
 #include "prcfile.h"
+#include "jsfile.h"
 #include "glrender.h"
 #include "arrayop.h"
 #include "material.h"
@@ -23,10 +24,6 @@
 
 namespace camp {
 
-//extern double Tx[3]; // x-component of current transform
-//extern double Ty[3]; // y-component of current transform
-extern double* Tz; // z-component of current transform
-
 static const double pixel=1.0; // Adaptive rendering constant.
 
 // Return one-sixth of the second derivative of the Bezier curve defined
@@ -36,7 +33,7 @@
 }
 
 // Return one-third of the third derivative of the Bezier curve defined by
-// a,b,c,d.
+// a,b,c,d at 0.
 inline triple bezierPPP(triple a, triple b, triple c, triple d) {
   return d-a+3.0*(b-c);
 }
@@ -82,18 +79,6 @@
     return false;
   }
   
-// Returns true iff the point z lies in the region bounded by b.
-  bool inside(const pair& z) const {
-    bool c=false;
-    for(Int i=0; i < 3; ++i) {
-      pair pi=p[i];
-      pair pj=p[i < 3 ? i+1 : 0];
-      if(((pi.y <= z.y && z.y < pj.y) || (pj.y <= z.y && z.y < pi.y)) &&
-         z.x < pi.x+(pj.x-pi.x)*(z.y-pi.y)/(pj.y-pi.y)) c=!c;
-    }
-    return c;
-  }
-  
   double xmax() {
     return max(max(max(p[0].x,p[1].x),p[2].x),p[3].x);
   }
@@ -112,6 +97,62 @@
   
 };
   
+class bbox2 {
+public:
+  double x,y,X,Y;
+  bbox2(size_t n, const triple *v) {
+    Bounds(v[0]);
+    for(size_t i=1; i < n; ++i)
+      bounds(v[i]);
+  }
+    
+  bbox2(const triple& m, const triple& M) {
+    Bounds(m);
+    bounds(triple(m.getx(),m.gety(),M.getz()));
+    bounds(triple(m.getx(),M.gety(),m.getz()));
+    bounds(triple(m.getx(),M.gety(),M.getz()));
+    bounds(triple(M.getx(),m.gety(),m.getz()));
+    bounds(triple(M.getx(),m.gety(),M.getz()));
+    bounds(triple(M.getx(),M.gety(),m.getz()));
+    bounds(M);
+  }
+    
+  bbox2(const triple& m, const triple& M, const Billboard& BB) {
+    Bounds(BB.transform(m));
+    bounds(BB.transform(triple(m.getx(),m.gety(),M.getz())));
+    bounds(BB.transform(triple(m.getx(),M.gety(),m.getz())));
+    bounds(BB.transform(triple(m.getx(),M.gety(),M.getz())));
+    bounds(BB.transform(triple(M.getx(),m.gety(),m.getz())));
+    bounds(BB.transform(triple(M.getx(),m.gety(),M.getz())));
+    bounds(BB.transform(triple(M.getx(),M.gety(),m.getz())));
+    bounds(BB.transform(M));
+  }
+    
+// Is 2D bounding box formed by projecting 3d points in vector v offscreen?
+  bool offscreen() {
+    double eps=1.0e-2;
+    double min=-1.0-eps;
+    double max=1.0+eps;
+    return X < min || x > max || Y < min || y > max;
+  }
+    
+  void Bounds(const triple& v) {
+    pair V=Transform2T(gl::dprojView,v);
+    x=X=V.getx();
+    y=Y=V.gety();
+  }
+  
+  void bounds(const triple& v) {
+    pair V=Transform2T(gl::dprojView,v);
+    double a=V.getx();
+    double b=V.gety();
+    if(a < x) x=a;
+    else if(a > X) X=a;
+    if(b < y) y=b;
+    else if(b > Y) Y=b;
+  }
+};
+
 typedef mem::vector<box> boxvector;
   
 typedef mem::list<bbox> bboxlist;
@@ -119,10 +160,6 @@
 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:
@@ -129,17 +166,15 @@
   string KEY;
   
   drawElement(const string& key="") : KEY(key == "" ? processData().KEY : key)
-  {}
+                                      {}
   
   virtual ~drawElement() {}
   
+  static mem::vector<triple> center;
+  static size_t centerIndex;
+  static triple lastcenter;
+  static size_t lastcenterIndex;
   
-#ifdef HAVE_GL
-  static mem::vector<Material> material;
-  static MaterialMap materialMap;
-  static size_t materialIndex;
-#endif
-  
   static pen lastpen;  
   static const triple zero;
   
@@ -154,24 +189,24 @@
                      double fuzz, bool &first) {}
   
   virtual void minratio(const double *t, pair &b, double fuzz, bool &first) {
-    ratio(t, b, camp::min, fuzz, first);
+    ratio(t,b,camp::min,fuzz,first);
   }
   
   virtual void maxratio(const double *t,pair &b, double fuzz, bool &first) {
-    ratio(t, b, camp::max, fuzz, first);
+    ratio(t,b,camp::max,fuzz,first);
   }
   
   virtual void ratio(pair &b, double (*m)(double, double), double fuzz,
                      bool &first) {
-    ratio(NULL, b, m, fuzz, first);
+    ratio(NULL,b,m,fuzz,first);
   }
 
   virtual void minratio(pair &b, double fuzz, bool &first) {
-    minratio(NULL, b, fuzz, first);
+    minratio(NULL,b,fuzz,first);
   }
 
   virtual void maxratio(pair &b, double fuzz, bool &first) {
-    maxratio(NULL, b, fuzz, first);
+    maxratio(NULL,b,fuzz,first);
   }
 
   virtual bool islabel() {return false;}
@@ -217,13 +252,30 @@
     return false;
   }
   
+  // Output to a JS file
+  virtual bool write(jsfile *out) {
+    return false;
+  }
+  
   // Used to compute deviation of a surface from a quadrilateral.
   virtual void displacement() {}
 
   // Render with OpenGL
   virtual void render(double size2, const triple& Min, const triple& Max,
-                      double perspective, bool transparent) {}
+                      double perspective, bool remesh) 
+  {}
 
+  virtual void meshinit() {}
+  
+  size_t centerindex(const triple& center) {
+    if(drawElement::center.empty() || center != drawElement::lastcenter) {
+      drawElement::lastcenter=center;
+      drawElement::center.push_back(center);
+      drawElement::lastcenterIndex=drawElement::center.size();
+    }
+    return drawElement::lastcenterIndex;
+  }
+
   // Transform as part of a picture.
   virtual drawElement *transformed(const transform&) {
     return this;
@@ -421,13 +473,18 @@
     glBindBuffer(GL_ARRAY_BUFFER,0);
   }
 }
+#endif
 
+#ifdef HAVE_LIBGLM
 void setcolors(bool colors,
                const prc::RGBAColour& diffuse,
                const prc::RGBAColour& emissive,
                const prc::RGBAColour& specular, double shininess,
-               double metallic, double fresnel0);
+               double metallic, double fresnel0, jsfile *out=NULL);
 #endif
+
+  
+
 }
 
 GC_DECLARE_PTRFREE(camp::box);

Modified: trunk/Build/source/utils/asymptote/drawpath3.cc
===================================================================
--- trunk/Build/source/utils/asymptote/drawpath3.cc	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/drawpath3.cc	2019-10-06 17:17:34 UTC (rev 52300)
@@ -8,7 +8,7 @@
 #include "drawsurface.h"
 #include "material.h"
 
-#ifdef HAVE_GL
+#ifdef HAVE_LIBGLM
 #include <glm/glm.hpp>
 #include <glm/gtc/matrix_transform.hpp>
 #include <glm/gtc/type_ptr.hpp>
@@ -19,13 +19,6 @@
 using vm::array;
 using namespace prc;
   
-#ifdef HAVE_GL
-using gl::modelView;
-
-BezierCurve drawPath3::R;
-Pixel drawPixel::R;
-#endif
-
 bool drawPath3::write(prcfile *out, unsigned int *, double, groupsmap&)
 {
   Int n=g.length();
@@ -57,66 +50,76 @@
   return true;
 }
 
+bool drawPath3::write(jsfile *out)
+{
+#ifdef HAVE_LIBGLM
+  Int n=g.length();
+  if(n == 0 || invisible)
+    return true;
+
+  if(billboard) {
+    meshinit();
+    drawElement::centerIndex=centerIndex;
+  } else drawElement::centerIndex=0;
+  
+  RGBAColour Black(0.0,0.0,0.0,color.A);
+  setcolors(false,Black,color,Black,1.0,0.0,0.04,out);
+  
+  for(Int i=0; i < n; ++i) {
+    if(g.straight(i)) {
+      out->addCurve(g.point(i),g.point(i+1),Min,Max);
+    } else
+      out->addCurve(g.point(i),g.postcontrol(i),
+                    g.precontrol(i+1),g.point(i+1),Min,Max);
+  }
+#endif  
+  return true;
+}
+
 void drawPath3::render(double size2, const triple& b, const triple& B,
-                       double perspective, bool transparent)
+                       double perspective, bool remesh)
 {
 #ifdef HAVE_GL
   Int n=g.length();
-  if(n == 0 || invisible || ((color.A < 1.0) ^ transparent))
-    return;
+  if(n == 0 || invisible) return;
 
-  const bool billboard=interaction == BILLBOARD &&
-    !settings::getSetting<bool>("offscreen");
-  triple m,M;
+  bool offscreen;
+  if(billboard) {
+    drawElement::centerIndex=centerIndex;
+    BB.init(center);
+    offscreen=bbox2(Min,Max,BB).offscreen();
+  } else
+    offscreen=bbox2(Min,Max).offscreen();
   
-  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;
+  if(offscreen) { // Fully offscreen
+    R.Onscreen=false;
+    R.data.clear();
+    return;
   }
+
+  for(Int i=0; i < n; ++i) {
+    triple controls[]={g.point(i),g.postcontrol(i),g.precontrol(i+1),
+                       g.point(i+1)};
+    triple *Controls;
+    triple Controls0[4];
+    if(billboard) {
+      Controls=Controls0;
+      for(size_t i=0; i < 4; i++) {
+        Controls[i]=BB.transform(controls[i]);
+      }
+    } else
+      Controls=controls;
+
+    double s=perspective ? Min.getz()*perspective : 1.0; // Move to glrender
   
-  const pair size3(s*(B.getx()-b.getx()),s*(B.gety()-b.gety()));
+    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();
-
-  if(!billboard && (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;
+    RGBAColour Black(0.0,0.0,0.0,color.A);
+    setcolors(false,Black,color,Black,1.0,0.0,0.04);
   
-  RGBAColour Black(0.0,0.0,0.0,color.A);
-  setcolors(false,Black,color,Black,1.0,0.0,0.04);
+    R.queue(controls,g.straight(i),size3.length()/size2);
+  }
   
-  if(billboard) {
-    for(Int i=0; i < n; ++i) {
-      triple controls[]={BB.transform(g.point(i)),BB.transform(g.postcontrol(i)),
-                         BB.transform(g.precontrol(i+1)),
-                         BB.transform(g.point(i+1))};
-      R.queue(controls,straight,size3.length()/size2,m,M);
-    }
-  } else {
-    BB.init(center);
-    for(Int i=0; i < n; ++i) {
-      triple controls[]={g.point(i),g.postcontrol(i),g.precontrol(i+1),
-                         g.point(i+1)};
-      R.queue(controls,straight,size3.length()/size2,m,M);
-    }
-  }
-  if(BezierCurve::vertexbuffer.size() >= (unsigned) gl::maxvertices) {
-    R.draw();
-    BezierCurve::clear();
-    gl::forceRemesh=true;
-  }
 #endif
 }
 
@@ -216,11 +219,10 @@
 }
 
 void drawNurbsPath3::render(double, const triple&, const triple&,
-                            double, bool transparent)
+                            double, bool remesh)
 {
 #ifdef HAVE_GL
-  if(invisible || ((color.A < 1.0) ^ transparent))
-    return;
+  if(invisible) return;
   
 // TODO: implement NURBS renderer
 #endif
@@ -236,48 +238,35 @@
   return true;
 }
   
+bool drawPixel::write(jsfile *out)
+{
+#ifdef HAVE_LIBGLM
+  if(invisible)
+    return true;
+
+  RGBAColour Black(0.0,0.0,0.0,color.A);
+  setcolors(false,color,color,Black,1.0,0.0,0.04,out);
+  
+  out->addPixel(v,width,Min,Max);
+#endif  
+  return true;
+}
+
 void drawPixel::render(double size2, const triple& b, const triple& B,
-                       double perspective, bool transparent) 
+                       double perspective, bool remesh) 
 {
 #ifdef HAVE_GL
-  if(invisible || ((color.A < 1.0) ^ transparent)) return;
-  triple m,M;
+  if(invisible) return;
   
-  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;
+  if(bbox2(Min,Max).offscreen()) { // Fully offscreen
+    R.data.clear();
+    return;
   }
-  
-  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();
 
-  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;
-  
   RGBAColour Black(0.0,0.0,0.0,color.A);
   setcolors(false,color,color,Black,1.0,0.0,0.04);
   
   R.queue(v,width);
-  
-  if(Pixel::vertexbuffer.size() >= (unsigned) gl::maxvertices) {
-    R.draw();
-    Pixel::clear();
-    gl::forceRemesh=true;
-  }
 #endif
 }
 

Modified: trunk/Build/source/utils/asymptote/drawpath3.h
===================================================================
--- trunk/Build/source/utils/asymptote/drawpath3.h	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/drawpath3.h	2019-10-06 17:17:34 UTC (rev 52300)
@@ -22,20 +22,31 @@
   bool invisible;
   Interaction interaction;
   triple Min,Max;
+  bool billboard;
+  size_t centerIndex;  
 public:
 #ifdef HAVE_GL
-  static BezierCurve R;
+  BezierCurve R;
 #endif  
+  void init() {
+    billboard=interaction == BILLBOARD &&
+      !settings::getSetting<bool>("offscreen");
+    centerIndex=0;
+  }
+  
   drawPath3(path3 g, triple center, const pen& p, Interaction interaction,
             const string& key="") :
     drawElement(key), g(g), center(center), straight(g.piecewisestraight()),
     color(rgba(p)), invisible(p.invisible()), interaction(interaction),
-    Min(g.min()), Max(g.max()) {}
+    Min(g.min()), Max(g.max()) {
+    init();
+  }
     
   drawPath3(const double* t, const drawPath3 *s) :
     drawElement(s->KEY), g(camp::transformed(t,s->g)), straight(s->straight),
     color(s->color), invisible(s->invisible), interaction(s->interaction),
     Min(g.min()), Max(g.max()) {
+    init();
     center=t*s->center;
   }
   
@@ -68,10 +79,16 @@
     } else b=pair(m(b.getx(),z.getx()),m(b.gety(),z.gety()));
   }
   
+  void meshinit() {
+    if(billboard)
+      centerIndex=centerindex(center);
+  }
+  
   bool write(prcfile *out, unsigned int *, double, groupsmap&);
+  bool write(jsfile *out);
   
   void render(double, const triple&, const triple&, double,
-              bool transparent);
+              bool remesh);
 
   drawElement *transformed(const double* t);
 };
@@ -87,7 +104,7 @@
   bool invisible;
   triple Min,Max;
   
-#ifdef HAVE_GL
+#ifdef HAVE_LIBGLM
   GLfloat *Controls;
   GLfloat *Knots;
 #endif  
@@ -126,7 +143,7 @@
     
     run::copyArrayC(knots,knot,0,NoGC);
     
-#ifdef HAVE_GL
+#ifdef HAVE_LIBGLM
     Controls=NULL;
 #endif  
   }
@@ -138,7 +155,7 @@
     for(unsigned int i=0; i < n; ++i)
       controls[i]=t*s->controls[i];
     
-#ifdef HAVE_GL
+#ifdef HAVE_LIBGLM
     Controls=NULL;
 #endif    
   }
@@ -156,7 +173,7 @@
              bool &first);
     
   void render(double size2, const triple& Min, const triple& Max,
-              double perspective, bool transparent);
+              double perspective, bool remesh);
     
   drawElement *transformed(const double* t);
 };
@@ -171,7 +188,7 @@
   triple Min,Max;
 public:
 #ifdef HAVE_GL
-  static Pixel R;
+  Pixel R;
 #endif  
   drawPixel(const triple& v, const pen& p, double width, const string& key="")
     : drawElement(key), v(v), p(p), color(rgba(p)), width(width),
@@ -194,9 +211,10 @@
   }
   
   void render(double size2, const triple& b, const triple& B,
-              double perspective, bool transparent);
+              double perspective, bool remesh);
   
   bool write(prcfile *out, unsigned int *, double, groupsmap&);
+  bool write(jsfile *out);
   
   drawElement *transformed(const double* t);
 };

Modified: trunk/Build/source/utils/asymptote/drawsurface.cc
===================================================================
--- trunk/Build/source/utils/asymptote/drawsurface.cc	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/drawsurface.cc	2019-10-06 17:17:34 UTC (rev 52300)
@@ -12,7 +12,7 @@
 #include <iomanip>
 #include <fstream>
 
-#ifdef HAVE_GL
+#ifdef HAVE_LIBGLM
 #include <glm/glm.hpp>
 #include <glm/gtc/matrix_transform.hpp>
 #include <glm/gtc/type_ptr.hpp>
@@ -20,28 +20,19 @@
 
 using namespace prc;
 #include "material.h"
+
 namespace camp {
 
-#ifdef HAVE_GL
-mem::vector<Material> drawElement::material;
-MaterialMap drawElement::materialMap;
-size_t drawElement::materialIndex;
+mem::vector<triple> drawElement::center;
+size_t drawElement::centerIndex=0;
+triple drawElement::lastcenter=0;
+size_t drawElement::lastcenterIndex=0;
 
-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;
 
 using vm::array;
 
-#ifdef HAVE_GL
-BezierCurve drawSurface::C;
-BezierPatch drawBezierPatch::S;
-BezierTriangle drawBezierTriangle::S;
+#ifdef HAVE_LIBGLM
 
 void storecolor(GLfloat *colors, int i, const vm::array &pens, int j)
 {
@@ -61,24 +52,11 @@
   colors[i+3]=p.A;
 }
 
-void clearMaterialBuffer(bool draw)
-{
-  if(draw) {
-    drawBezierPatch::S.draw();
-    drawPath3::R.draw();
-    drawPixel::R.draw();
-  }
-  drawElement::material.clear();
-  drawElement::material.reserve(nmaterials);
-  drawElement::materialMap.clear();
-  drawElement::materialIndex=0;
-}
-
 void setcolors(bool colors,
                const RGBAColour& diffuse,
                const RGBAColour& emissive,
                const RGBAColour& specular, double shininess,
-               double metallic, double fresnel0) 
+               double metallic, double fresnel0, jsfile *out) 
 {
   Material m;
   if(colors) {
@@ -85,24 +63,27 @@
     static glm::vec4 Black(0.0,0.0,0.0,diffuse.A);
     m=Material(Black,Black,
                glm::vec4(specular.R,specular.G,specular.B,specular.A),
-               shininess, metallic, fresnel0);
-  }  else
+               shininess,metallic,fresnel0);
+  } else
     m=Material(glm::vec4(diffuse.R,diffuse.G,diffuse.B,diffuse.A),
                glm::vec4(emissive.R,emissive.G,emissive.B,emissive.A),
                glm::vec4(specular.R,specular.G,specular.B,specular.A),
-               shininess, metallic, fresnel0);
+               shininess,metallic,fresnel0);
           
-  MaterialMap::iterator p=drawElement::materialMap.find(m);
-  if(p != drawElement::materialMap.end())
-    drawElement::materialIndex=p->second;
+  MaterialMap::iterator p=materialMap.find(m);
+  if(p != materialMap.end()) materialIndex=p->second;
   else {
-    drawElement::materialIndex=drawElement::material.size();
-    if(drawElement::materialIndex >= nmaterials)
+    materialIndex=material.size();
+    if(materialIndex >= nmaterials)
       nmaterials=min(Maxmaterials,2*nmaterials);
-    if(drawElement::materialIndex >= Maxmaterials)
+#ifdef HAVE_GL
+    if(!out && materialIndex >= Maxmaterials)
       clearMaterialBuffer(true);
-    drawElement::material.push_back(m);
-    drawElement::materialMap[m]=drawElement::materialIndex;
+#endif    
+    material.push_back(m);
+    materialMap[m]=materialIndex;
+    if(out)
+      out->addMaterial(materialIndex);
   }
 }
 
@@ -161,8 +142,8 @@
     
     c0=cz[0];
     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);
+    z=bound(cz,min,b.empty ? c0 : min(c0,b.near),fuzz,maxdepth);
+    Z=bound(cz,max,b.empty ? c0 : max(c0,b.far),fuzz,maxdepth);
   }  
   
   b.add(x,y,z);
@@ -238,9 +219,10 @@
 
   if(straight) {
     triple vertices[]={controls[0],controls[12],controls[3],controls[15]};
-    if(colors)
-      out->addQuad(vertices,colors);
-    else
+    if(colors) {
+      prc::RGBAColour Colors[]={colors[0],colors[1],colors[3],colors[2]};
+      out->addQuad(vertices,Colors);
+    } else
       out->addRectangle(vertices,m);
   } else
     out->addPatch(controls,m);
@@ -248,84 +230,89 @@
   return true;
 }
 
+bool drawBezierPatch::write(jsfile *out)
+{
+#ifdef HAVE_LIBGLM
+  if(invisible)
+    return true;
+
+  if(billboard) {
+    meshinit();
+    drawElement::centerIndex=centerIndex;
+  } else drawElement::centerIndex=0;
+  
+  setcolors(colors,diffuse,emissive,specular,shininess,metallic,fresnel0,out);
+  
+  if(straight) {
+    triple Controls[]={controls[0],controls[12],controls[15],controls[3]};
+    out->addPatch(Controls,4,Min,Max,colors,4);
+  } else
+    out->addPatch(controls,16,Min,Max,colors,4);
+                    
+#endif  
+  return true;
+}
+
 void drawBezierPatch::render(double size2, const triple& b, const triple& B,
-                             double perspective, bool transparent)
+                             double perspective, bool remesh)
 {
 #ifdef HAVE_GL
-  if(invisible || 
-     ((colors ? colors[0].A+colors[1].A+colors[2].A+colors[3].A < 4.0 :
-       diffuse.A < 1.0) ^ transparent)) return;
+  if(invisible) return; 
+  transparent=colors ? colors[0].A+colors[1].A+colors[2].A+colors[3].A < 4.0 :
+    diffuse.A < 1.0;
   
-  const bool billboard=interaction == BILLBOARD &&
-    !settings::getSetting<bool>("offscreen");
-  triple m,M;
+  bool offscreen;
+  if(billboard) {
+    drawElement::centerIndex=centerIndex;
+    BB.init(center);
+    offscreen=bbox2(Min,Max,BB).offscreen();
+  } else
+    offscreen=bbox2(Min,Max).offscreen();
   
-  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);
+  if(offscreen) { // Fully offscreen
+    S.Onscreen=false;
+    S.data.clear();
+    return;
+  }
+
+  triple *Controls;
+  triple Controls0[16];
+  if(billboard) {
+    Controls=Controls0;
+    for(size_t i=0; i < 16; i++) {
+     Controls[i]=BB.transform(controls[i]);
+    }
   } else {
-    m=b;
-    M=B;
-    s=1.0;
+    Controls=controls;
+    if(!remesh && S.Onscreen) { // Fully onscreen; no need to re-render
+      S.append();
+      return;
+    }
   }
-  
+
+  double s=perspective ? Min.getz()*perspective : 1.0; // Move to glrender
+    
   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();
-  
-  if(!billboard && (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;
-
   setcolors(colors,diffuse,emissive,specular,shininess,metallic,fresnel0);
   
-  if(billboard) BB.init(center);
-  
   GLfloat c[16];
   if(colors)
     for(size_t i=0; i < 4; ++i)
       storecolor(c,4*i,colors[i]);
   
-  triple *Controls;
-  triple Controls0[16];
-  if(billboard) {
-    Controls=Controls0;
-    for(size_t i=0; i < 16; i++)
-      Controls[i]=BB.transform(controls[i]);
-  } else
-    Controls=controls;
-    
   if(gl::outlinemode) {
     triple edge0[]={Controls[0],Controls[4],Controls[8],Controls[12]};
-    C.queue(edge0,straight,size3.length()/size2,m,M);
+    C.queue(edge0,straight,size3.length()/size2);
     triple edge1[]={Controls[12],Controls[13],Controls[14],Controls[15]};
-    C.queue(edge1,straight,size3.length()/size2,m,M);
+    C.queue(edge1,straight,size3.length()/size2);
     triple edge2[]={Controls[15],Controls[11],Controls[7],Controls[3]};
-    C.queue(edge2,straight,size3.length()/size2,m,M);
+    C.queue(edge2,straight,size3.length()/size2);
     triple edge3[]={Controls[3],Controls[2],Controls[1],Controls[0]};
-    C.queue(edge3,straight,size3.length()/size2,m,M);
-    C.draw();
+    C.queue(edge3,straight,size3.length()/size2);
   } else {
-    S.queue(Controls,straight,size3.length()/size2,m,M,transparent,
+    S.queue(Controls,straight,size3.length()/size2,transparent,
             colors ? c : NULL);
-    if(BezierPatch::nvertices >= gl::maxvertices) {
-      S.drawMaterials();
-      BezierPatch::clear();
-      gl::forceRemesh=true;
-    }
-    if(BezierPatch::Nvertices >= gl::maxvertices) {
-      S.drawColors();
-      BezierPatch::Clear();
-      gl::forceRemesh=true;
-    }
   }
 #endif
 }
@@ -386,8 +373,8 @@
     
     c0=cz[0];
     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);
+    z=boundtri(cz,min,b.empty ? c0 : min(c0,b.near),fuzz,maxdepth);
+    Z=boundtri(cz,max,b.empty ? c0 : max(c0,b.far),fuzz,maxdepth);
   }
     
   b.add(x,y,z);
@@ -474,72 +461,87 @@
   return true;
 }
 
+bool drawBezierTriangle::write(jsfile *out)
+{
+#ifdef HAVE_LIBGLM
+  if(invisible)
+    return true;
+
+  if(billboard) {
+    meshinit();
+    drawElement::centerIndex=centerIndex;
+  } else drawElement::centerIndex=0;
+  
+  setcolors(colors,diffuse,emissive,specular,shininess,metallic,fresnel0,out);
+  
+  if(straight) {
+    triple Controls[]={controls[0],controls[6],controls[9]};
+    out->addPatch(Controls,3,Min,Max,colors,3);
+  } else
+    out->addPatch(controls,10,Min,Max,colors,3);
+                    
+#endif  
+  return true;
+}
+
 void drawBezierTriangle::render(double size2, const triple& b, const triple& B,
-                                double perspective, bool transparent)
+                                double perspective, bool remesh)
 {
 #ifdef HAVE_GL
-  if(invisible || 
-     ((colors ? colors[0].A+colors[1].A+colors[2].A < 3.0 :
-       diffuse.A < 1.0) ^ transparent)) return;
+  if(invisible) return;
+  transparent=colors ? colors[0].A+colors[1].A+colors[2].A < 3.0 :
+    diffuse.A < 1.0;
   
-  const bool billboard=interaction == BILLBOARD &&
-    !settings::getSetting<bool>("offscreen");
-  triple m,M;
+  bool offscreen;
+  if(billboard) {
+    drawElement::centerIndex=centerIndex;
+    BB.init(center);
+    offscreen=bbox2(Min,Max,BB).offscreen();
+  } else
+    offscreen=bbox2(Min,Max).offscreen();
   
-  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);
+  if(offscreen) { // Fully offscreen
+    S.Onscreen=false;
+    S.data.clear();
+    return;
+  }
+
+  triple *Controls;
+  triple Controls0[10];
+  if(billboard) {
+    Controls=Controls0;
+    for(size_t i=0; i < 10; i++) {
+     Controls[i]=BB.transform(controls[i]);
+    }
   } else {
-    m=b;
-    M=B;
-    s=1.0;
+    Controls=controls;
+    if(!remesh && S.Onscreen) { // Fully onscreen; no need to re-render
+      S.append();
+      return;
+    }
   }
-  
+
+  double s=perspective ? Min.getz()*perspective : 1.0; // Move to glrender
+    
   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();
-
-  if(!billboard && (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;
-
   setcolors(colors,diffuse,emissive,specular,shininess,metallic,fresnel0);
   
-  if(billboard) BB.init(center);
-  
-  GLfloat v[12];
+  GLfloat c[12];
   if(colors)
     for(size_t i=0; i < 3; ++i)
-      storecolor(v,4*i,colors[i]);
+      storecolor(c,4*i,colors[i]);
     
-  triple *Controls;
-  triple Controls0[10];
-  if(billboard) {
-    Controls=Controls0;
-    for(size_t i=0; i < 10; i++)
-      Controls[i]=BB.transform(controls[i]);
-  } else 
-    Controls=controls;
-  
   if(gl::outlinemode) {
     triple edge0[]={Controls[0],Controls[1],Controls[3],Controls[6]};
-    C.queue(edge0,straight,size3.length()/size2,m,M);
+    C.queue(edge0,straight,size3.length()/size2);
     triple edge1[]={Controls[6],Controls[7],Controls[8],Controls[9]};
-    C.queue(edge1,straight,size3.length()/size2,m,M);
+    C.queue(edge1,straight,size3.length()/size2);
     triple edge2[]={Controls[9],Controls[5],Controls[2],Controls[0]};
-    C.queue(edge2,straight,size3.length()/size2,m,M);
-    C.draw();
+    C.queue(edge2,straight,size3.length()/size2);
   } else
-    S.queue(Controls,straight,size3.length()/size2,m,M,transparent,
-            colors ? v : NULL);
+    S.queue(Controls,straight,size3.length()/size2,transparent,
+            colors ? c : NULL);
 #endif
 }
 
@@ -651,37 +653,10 @@
 #endif  
 }
 
-void drawNurbs::render(double size2, const triple& Min, const triple& Max,
-                       double perspective, bool transparent)
+void drawNurbs::render(double size2, const triple& b, const triple& B,
+                       double perspective, bool remesh)
 {
-#ifdef HAVE_GL
-  if(invisible || ((colors ? colors[3]+colors[7]+colors[11]+colors[15] < 4.0
-                    : diffuse.A < 1.0) ^ transparent)) return;
-
-  bbox3 B(this->Min,this->Max);
-  B.transform(modelView.T);
-    
-  triple m=B.Min();
-  triple M=B.Max();
-  
-  if(perspective) {
-    double f=m.getz()*perspective;
-    double F=M.getz()*perspective;
-    if(M.getx() < min(f*Min.getx(),F*Min.getx()) || 
-       m.getx() > max(f*Max.getx(),F*Max.getx()) ||
-       M.gety() < min(f*Min.gety(),F*Min.gety()) ||
-       m.gety() > max(f*Max.gety(),F*Max.gety()) ||
-       M.getz() < Min.getz() ||
-       m.getz() > Max.getz()) return;
-  } else {
-    if(M.getx() < Min.getx() || m.getx() > Max.getx() ||
-       M.gety() < Min.gety() || m.gety() > Max.gety() ||
-       M.getz() < Min.getz() || m.getz() > Max.getz()) return;
-  }
-
-  setcolors(colors,diffuse,emissive,specular,shininess,metallic,fresnel0);
 // TODO: implement NURBS renderer
-#endif
 }
 
 void drawSphere::P(triple& t, double x, double y, double z)
@@ -910,41 +885,39 @@
   return true;
 }
 
-void drawTriangles::render(double size2, const triple& Min,
-                           const triple& Max, double perspective,
-                           bool transparent)
+bool drawTriangles::write(jsfile *out)
 {
-#ifdef HAVE_GL
+#ifdef HAVE_LIBGLM
   if(invisible)
-    return;
+    return true;
+  
+  setcolors(nC,diffuse,emissive,specular,shininess,metallic,fresnel0,out);
+  
+  out->addTriangles(nP,P,nN,N,nC,C,nI,PI,NI,CI,Min,Max);
+#endif 
+  return true;
+}
 
-  if(invisible || ((diffuse.A < 1.0) ^ transparent)) return;
+void drawTriangles::render(double size2, const triple& b,
+                           const triple& B, double perspective,
+                           bool remesh)
+{
+#ifdef HAVE_GL
+  if(invisible) return;
+  
+  transparent=diffuse.A < 1.0;
 
-  triple m,M;
+  if(bbox2(Min,Max).offscreen()) { // Fully offscreen
+    R.Onscreen=false;
+    R.data.clear();
+    return;
+  }
 
-  bbox3 B(this->Min,this->Max);
-  B.transform(modelView.T);
-
-  m=B.Min();
-  M=B.Max();
-
-  if(perspective) {
-    const double f=m.getz()*perspective;
-    const double F=M.getz()*perspective;
-    if((M.getx() < min(f*Min.getx(),F*Min.getx()) ||
-        m.getx() > max(f*Max.getx(),F*Max.getx()) ||
-        M.gety() < min(f*Min.gety(),F*Min.gety()) ||
-        m.gety() > max(f*Max.gety(),F*Max.gety()) ||
-        M.getz() < Min.getz() ||
-        m.getz() > Max.getz()))
-      return;
-  } else {
-    if((M.getx() < Min.getx() || m.getx() > Max.getx() ||
-        M.gety() < Min.gety() || m.gety() > Max.gety() ||
-        M.getz() < Min.getz() || m.getz() > Max.getz()))
-      return;
+  if(!remesh && R.Onscreen) { // Fully onscreen; no need to re-render
+    R.append();
+    return;
   }
-
+    
   setcolors(nC,diffuse,emissive,specular,shininess,metallic,fresnel0);
   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-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/drawsurface.h	2019-10-06 17:17:34 UTC (rev 52300)
@@ -13,9 +13,13 @@
 #include "beziercurve.h"
 #include "bezierpatch.h"
 
+namespace run {
+void inverse(double *a, size_t n);
+}
+
 namespace camp {
 
-#ifdef HAVE_GL
+#ifdef HAVE_LIBGLM
 void storecolor(GLfloat *colors, int i, const vm::array &pens, int j);
 #endif  
 
@@ -36,6 +40,8 @@
   double PRCshininess;
   bool invisible;
   Interaction interaction;
+  bool billboard;
+  size_t centerIndex;  
   
   triple Min,Max;
   bool prc;
@@ -42,7 +48,8 @@
   
 public:
 #ifdef HAVE_GL
-  static BezierCurve C;
+  BezierCurve C;
+  bool transparent;
 #endif  
   
   string wrongsize() {
@@ -50,13 +57,22 @@
       string(" array of triples and array of 4 pens required");
   }
   
+  void init() {
+    billboard=interaction == BILLBOARD &&
+      !settings::getSetting<bool>("offscreen");
+    centerIndex=0;
+  }
+  
   drawSurface(const vm::array& g, size_t ncontrols, triple center,
               bool straight, const vm::array&p, double opacity,
-              double shininess, double metallic, double fresnel0, double PRCshininess, const vm::array &pens,
+              double shininess, double metallic, double fresnel0,
+              double PRCshininess, const vm::array &pens,
               Interaction interaction, bool prc, const string& key="") :
     drawElement(key), ncontrols(ncontrols), center(center), straight(straight),
-    opacity(opacity), shininess(shininess), metallic(metallic), fresnel0(fresnel0), PRCshininess(PRCshininess),
-    interaction(interaction), prc(prc) {
+    opacity(opacity), shininess(shininess), metallic(metallic),
+    fresnel0(fresnel0), PRCshininess(PRCshininess), interaction(interaction),
+    prc(prc) {
+    init();
     if(checkArray(&g) != 4 || checkArray(&p) != 3)
       reportError(wrongsize());
     
@@ -81,7 +97,7 @@
     size_t nodes=(ncontrols == 16 ? 4 : 3);
     size_t size=checkArray(&pens);
     if(size > 0) {
-      if(size != nodes) reportError("4 vertex pens required");
+      if(size != nodes) reportError("one vertex pen required per node");
       colors=new(UseGC) prc::RGBAColour[nodes];
       for(size_t i=0; i < nodes; ++i)
       colors[i]=rgba(vm::read<camp::pen>(pens,i));
@@ -96,6 +112,7 @@
     PRCshininess(s->PRCshininess), invisible(s->invisible),
     interaction(s->interaction), prc(s->prc) { 
     
+    init();
     if(s->controls) {
       controls=new(UseGC) triple[ncontrols];
       for(unsigned int i=0; i < ncontrols; ++i)
@@ -102,9 +119,7 @@
         controls[i]=t*s->controls[i];
     } else controls=NULL;
   
-#ifdef HAVE_GL
     center=t*s->center;
-#endif    
   }
   
   virtual ~drawSurface() {}
@@ -115,7 +130,7 @@
 class drawBezierPatch : public drawSurface {
 public:  
 #ifdef HAVE_GL
-  static BezierPatch S;
+  BezierPatch S;
 #endif  
   
   drawBezierPatch(const vm::array& g, triple center, bool straight,
@@ -124,11 +139,10 @@
               double PRCshininess, const vm::array &pens,
               Interaction interaction, bool prc) : 
     drawSurface(g,16,center,straight,p,opacity,
-                shininess,metallic,fresnel0,PRCshininess,pens,interaction,prc) {}
+                shininess,metallic,fresnel0,PRCshininess,pens,interaction,prc)  {}
 
   drawBezierPatch(const double* t, const drawBezierPatch *s) :
-    drawSurface(t,s) {
-  }
+    drawSurface(t,s) {}
   
   void bounds(const double* t, bbox3& b);
   
@@ -135,10 +149,16 @@
   void ratio(const double* t, pair &b, double (*m)(double, double),
              double fuzz, bool &first);
   
+  void meshinit() {
+    if(billboard)
+      centerIndex=centerindex(center);
+  }
+  
   bool write(prcfile *out, unsigned int *, double, groupsmap&);
+  bool write(jsfile *out);
   
-  void render(double, const triple& Min, const triple& Max,
-              double perspective, bool transparent);
+  void render(double, const triple& b, const triple& B,
+              double perspective, bool remesh);
   drawElement *transformed(const double* t);
 };
   
@@ -145,7 +165,7 @@
 class drawBezierTriangle : public drawSurface {
 public:
 #ifdef HAVE_GL
-  static BezierTriangle S;
+  BezierTriangle S;
 #endif  
   
   drawBezierTriangle(const vm::array& g, triple center, bool straight,
@@ -157,8 +177,7 @@
                 PRCshininess,pens,interaction,prc) {}
   
   drawBezierTriangle(const double* t, const drawBezierTriangle *s) :
-    drawSurface(t,s) {
-  }
+    drawSurface(t,s) {}
   
   void bounds(const double* t, bbox3& b);
   
@@ -165,10 +184,16 @@
   void ratio(const double* t, pair &b, double (*m)(double, double),
              double fuzz, bool &first);
   
+  void meshinit() {
+    if(billboard)
+      centerIndex=centerindex(center);
+  }
+  
   bool write(prcfile *out, unsigned int *, double, groupsmap&);
+  bool write(jsfile *out);
   
-  void render(double, const triple& Min, const triple& Max,
-              double perspective, bool transparent);
+  void render(double, const triple& b, const triple& B,
+              double perspective, bool remesh);
   drawElement *transformed(const double* t);
 };
   
@@ -192,7 +217,7 @@
   
   triple Min,Max;
   
-#ifdef HAVE_GL
+#ifdef HAVE_LIBGLM
   GLfloat *colors;
   GLfloat *Controls;
   GLfloat *uKnots;
@@ -260,7 +285,7 @@
     emissive=rgba(vm::read<camp::pen>(p,1));
     specular=rgba(vm::read<camp::pen>(p,2));
     
-#ifdef HAVE_GL
+#ifdef HAVE_LIBGLM
     Controls=NULL;
     int size=checkArray(&pens);
     if(size > 0) {
@@ -287,7 +312,7 @@
     for(unsigned int i=0; i < n; ++i)
       controls[i]=t*s->controls[i];
     
-#ifdef HAVE_GL
+#ifdef HAVE_LIBGLM
     Controls=NULL;
     colors=s->colors;
 #endif    
@@ -305,8 +330,8 @@
   void ratio(const double* t, pair &b, double (*m)(double, double), double,
              bool &first);
 
-  void render(double size2, const triple& Min, const triple& Max,
-              double perspective, bool transparent);
+  void render(double size2, const triple& b, const triple& B,
+              double perspective, bool remesh);
     
   drawElement *transformed(const double* t);
 };
@@ -454,6 +479,7 @@
 protected:
 #ifdef HAVE_GL
   Triangles R;
+  bool transparent;
 #endif  
   
   size_t nP;
@@ -461,6 +487,7 @@
   size_t nN;
   triple* N;
   size_t nI;
+  size_t Ni;
   uint32_t (*PI)[3];
   uint32_t (*NI)[3];
   
@@ -496,24 +523,29 @@
       for(size_t i=0; i < nN; ++i)
         N[i]=vm::read<triple>(n,i);
     
-      if(checkArray(&ni) != nI)
-        reportError("Index arrays have different lengths");
-      NI=new(UseGC) uint32_t[nI][3];
-      for(size_t i=0; i < nI; ++i) {
-        vm::array *nii=vm::read<vm::array*>(ni,i);
-        if(checkArray(nii) != 3) reportError(wrongsize);
-        uint32_t *NIi=NI[i];
-        for(size_t j=0; j < 3; ++j) {
-          size_t index=unsignedcast(vm::read<Int>(nii,j));
-          if(index >= nN) reportError(outofrange);
-          NIi[j]=index;
+      Ni=checkArray(&ni);
+      if(Ni == 0 && nN == nP)
+        NI=PI;
+      else {
+        if(Ni != nI)
+          reportError("Index arrays have different lengths");
+        NI=new(UseGC) uint32_t[nI][3];
+        for(size_t i=0; i < nI; ++i) {
+          vm::array *nii=vm::read<vm::array*>(ni,i);
+          if(checkArray(nii) != 3) reportError(wrongsize);
+          uint32_t *NIi=NI[i];
+          for(size_t j=0; j < 3; ++j) {
+            size_t index=unsignedcast(vm::read<Int>(nii,j));
+            if(index >= nN) reportError(outofrange);
+            NIi[j]=index;
+          }
         }
       }
-    }
+    } else Ni=0;
   }
 
   drawBaseTriangles(const double* t, const drawBaseTriangles *s) :
-    drawElement(s->KEY), nP(s->nP), nN(s->nN), nI(s->nI) {
+    drawElement(s->KEY), nP(s->nP), nN(s->nN), nI(s->nI), Ni(s->Ni) {
     P=new(UseGC) triple[nP];
     for(size_t i=0; i < nP; i++)
       P[i]=t*s->P[i];
@@ -528,16 +560,29 @@
 
     if(nN) {
       N=new(UseGC) triple[nN];
-      for(size_t i=0; i < nN; i++)
-        N[i]=transformNormal(t,s->N[i]);
-    
-      NI=new(UseGC) uint32_t[nI][3];
-      for(size_t i=0; i < nI; ++i) {
-        uint32_t *NIi=NI[i];
-        uint32_t *sNIi=s->NI[i];
-        for(size_t j=0; j < 3; ++j)
-          NIi[j]=sNIi[j];
+      if(t == NULL) {
+        for(size_t i=0; i < nN; i++)
+          N[i]=s->N[i];
+      } else {
+        double T[]={t[0],t[1],t[2],
+                    t[4],t[5],t[6],
+                    t[8],t[9],t[10]};
+        run::inverse(T,3);
+        for(size_t i=0; i < nN; i++)
+          N[i]=unit(Transform3(s->N[i],T));
       }
+
+      if(Ni == 0) {
+        NI=PI;
+      } else {
+        NI=new(UseGC) uint32_t[nI][3];
+        for(size_t i=0; i < nI; ++i) {
+          uint32_t *NIi=NI[i];
+          uint32_t *sNIi=s->NI[i];
+          for(size_t j=0; j < 3; ++j)
+            NIi[j]=sNIi[j];
+        }
+      }
     }
   }
     
@@ -559,6 +604,7 @@
   size_t nC;
   prc::RGBAColour*C;
   uint32_t (*CI)[3];
+  size_t Ci;
    
   // Asymptote material data
   prc::RGBAColour diffuse;
@@ -597,17 +643,22 @@
     
       size_t nI=checkArray(&vi);
     
-      if(checkArray(&ci) != nI)
-        reportError("Index arrays have different lengths");
-      CI=new(UseGC) uint32_t[nI][3];
-      for(size_t i=0; i < nI; ++i) {
-        vm::array *cii=vm::read<vm::array*>(ci,i);
-        if(checkArray(cii) != 3) reportError(wrongsize);
-        uint32_t *CIi=CI[i];
-        for(size_t j=0; j < 3; ++j) {
-          size_t index=unsignedcast(vm::read<Int>(cii,j));
-          if(index >= nC) reportError(outofrange);
-          CIi[j]=index;
+      Ci=checkArray(&ci);
+      if(Ci == 0 && nC == nP)
+        CI=PI;
+      else {
+        if(Ci != nI)
+          reportError("Index arrays have different lengths");
+        CI=new(UseGC) uint32_t[nI][3];
+        for(size_t i=0; i < nI; ++i) {
+          vm::array *cii=vm::read<vm::array*>(ci,i);
+          if(checkArray(cii) != 3) reportError(wrongsize);
+          uint32_t *CIi=CI[i];
+          for(size_t j=0; j < 3; ++j) {
+            size_t index=unsignedcast(vm::read<Int>(cii,j));
+            if(index >= nC) reportError(outofrange);
+            CIi[j]=index;
+          }
         }
       }
     } else {
@@ -620,8 +671,8 @@
     drawBaseTriangles(t,s), nC(s->nC),
     diffuse(s->diffuse), emissive(s->emissive),
     specular(s->specular), opacity(s->opacity), shininess(s->shininess), 
-    metallic(s->metallic), fresnel0(s->fresnel0), PRCshininess(s->PRCshininess),
-    invisible(s->invisible) {
+    metallic(s->metallic), fresnel0(s->fresnel0),
+    PRCshininess(s->PRCshininess), invisible(s->invisible) {
     
     if(nC) {
       C=new(UseGC) prc::RGBAColour[nC];
@@ -640,10 +691,11 @@
  
   virtual ~drawTriangles() {}
  
-  void render(double size2, const triple& Min, const triple& Max,
-              double perspective, bool transparent);
+  void render(double size2, const triple& b, const triple& B,
+              double perspective, bool remesh);
  
   bool write(prcfile *out, unsigned int *, double, groupsmap&);
+  bool write(jsfile *out);
  
   drawElement *transformed(const double* t) {
     return new drawTriangles(t,this);

Modified: trunk/Build/source/utils/asymptote/examples/Klein.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/Klein.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/examples/Klein.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -2,8 +2,6 @@
 
 size(469pt);
 
-viewportmargin=0;
-
 currentprojection=perspective(
 camera=(25.0851928432063,-30.3337528952473,19.3728775115443),
 up=Z,

Modified: trunk/Build/source/utils/asymptote/examples/Sierpinski.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/Sierpinski.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/examples/Sierpinski.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -14,4 +14,4 @@
   }
 }
 
-Sierpinski((0,1),1,9);
+Sierpinski((0,1),1,5);

Modified: trunk/Build/source/utils/asymptote/examples/SierpinskiSponge.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/SierpinskiSponge.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/examples/SierpinskiSponge.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -82,18 +82,15 @@
   for(int n2=0; n2 < 20; ++n2) {
     surface s1;
     for(int n1=0; n1 < 20; ++n1) {
-      for(int k=0; k < 6; ++k){
-        transform3 T=scale3(u)*shift(M[n1])*scale3(0.5);
+      for(int k=0; k < 6; ++k) {
         if(Sponge3[n3][n2][n1][k] > 0) {
-          s1.append(T*Squares[k]);
+          s1.append(scale3(u)*shift(M[n1])*scale3(0.5)*Squares[k]);
         }
       }
     }
-    transform3 T=scale3(u)*shift(M[n2])*scale3(0.5);
-    s2.append(T*s1);
+    s2.append(scale3(u)*shift(M[n2])*scale3(0.5)*s1);
   }
-  transform3 T=scale3(u)*shift(M[n3])*scale3(0.5);
-  s3.append(T*s2);
+  s3.append(scale3(u)*shift(M[n3])*scale3(0.5)*s2);
 }
 s3.colors(palette(s3.map(abs),Rainbow()));
 draw(s3);

Modified: trunk/Build/source/utils/asymptote/examples/animations/earthmoon.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/animations/earthmoon.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/examples/animations/earthmoon.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -9,7 +9,7 @@
 settings.thick=false;
 settings.outformat="mpg";
 currentprojection=orthographic(5,4,2); 
-currentlight=light(specular=black,(0.1,-0.1,1),viewport=true);
+currentlight=light(specular=black,(0.1,-0.1,1));
  
 size(15cm,0); 
  

Modified: trunk/Build/source/utils/asymptote/examples/fequlogo.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/fequlogo.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/examples/fequlogo.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,6 +1,3 @@
-// A compressed version of the required data file may be obtained from:
-// http://www-roc.inria.fr/gamma/download/counter.php?dir=ARCHITEC/&get_obj=uhrturm.obj.gz
-
 import graph3;
 import obj;
 
@@ -14,7 +11,7 @@
 
 currentprojection=perspective(4,1,2);
 currentlight=(4,0,2);
-currentlight.background=blue;
+currentlight.background=black+opacity(0.0);
 
 real R=4;
 
@@ -35,6 +32,6 @@
 
 add(new void(frame f, transform3 t, picture pic, projection P) {
     draw(f,surface(invert(box(min(f,P),max(f,P)),min3(f),P),
-                   new pen[] {orange,red,yellow,brown}));
+                   new pen[] {orange,red,yellow,brown}+opacity(0.9)));
   }
 );

Modified: trunk/Build/source/utils/asymptote/examples/logo3.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/logo3.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/examples/logo3.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,9 +1,11 @@
 import three;
 
-size(560,320,IgnoreAspect);
+//size(105,50,IgnoreAspect);
+size(560,320,IgnoreAspect); // Fullsize
 size3(140,80,15);
 currentprojection=perspective(-2,20,10,up=Y);
 currentlight=White;
+viewportmargin=(0,10);
 
 real a=-0.4;
 real b=0.95;

Modified: trunk/Build/source/utils/asymptote/examples/pdb.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/pdb.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/examples/pdb.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -10,7 +10,7 @@
 defaultrender.merge=true;  // Fast low-quality rendering
 //defaultrender.merge=false; // Slow high-quality rendering
 bool pixel=false; // Set to true to draw dots as pixels.
-real width=10;
+real width=6;
 
 size(200);
 currentprojection=perspective(30,30,15);
@@ -161,4 +161,4 @@
   options="3Dviews="+viewfilename;
 
 shipout(prefix,options=options);
-
+currentpicture.erase();

Modified: trunk/Build/source/utils/asymptote/examples/shellmethod.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/shellmethod.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/examples/shellmethod.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -2,7 +2,7 @@
 import solids;
 
 size(400);
-currentprojection=perspective(0,-1,30,up=Y);
+currentprojection=perspective(2,3,30,up=Y);
 currentlight=light(gray(0.75),(0.25,-0.25,1),(0,1,0));
 
 pen color=green;

Modified: trunk/Build/source/utils/asymptote/examples/triangles.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/triangles.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/examples/triangles.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,12 +1,14 @@
 import three;
 size(10cm);
 
+currentlight=Headlamp;
+
 triple[] v={O,X,X+Y,Y};
 
 triple[] n={Z,X};
 
 int[][] vi={{0,1,2},{2,3,0}};
-int[][] ni={{0,0,0},{1,1,1}};
+int[][] ni={{1,0,1},{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),

Added: trunk/Build/source/utils/asymptote/examples/uhrturm.obj
===================================================================
--- trunk/Build/source/utils/asymptote/examples/uhrturm.obj	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/examples/uhrturm.obj	2019-10-06 17:17:34 UTC (rev 52300)
@@ -0,0 +1,1172 @@
+This file may be used freely for non commercial purposes.
+# Generated by CtrlView V3.00
+# D:\saltel\3DS_FILES\uhrturm.obj
+
+g
+v 1.13195 1.87823 1.13195
+v 1.13195 -1.87823 1.13195
+v 1.13195 -1.87823 -1.13195
+v 1.13195 1.87823 -1.13195
+v -1.13195 1.87823 -1.13195
+v -1.13195 1.87823 1.13195
+v -1.13195 -1.87823 1.13195
+v -1.13195 -1.87823 -1.13195
+v -1.48021 1.33917 1.47956
+v 1.47912 1.33917 1.48065
+v 1.12573 1.33917 1.12694
+v -1.1266 1.33917 1.12606
+v -1.48021 0.589166 1.47956
+v 1.47912 0.589166 1.48065
+v -1.1266 0.589166 1.12606
+v 1.12573 0.589166 1.12694
+v 1.48108 1.33917 -1.47868
+v 1.12727 1.33917 -1.12539
+v 1.48108 0.589166 -1.47868
+v 1.12727 0.589166 -1.12539
+v -1.47824 0.589166 -1.48152
+v -1.47824 1.33917 -1.48152
+v -1.12505 0.589166 -1.1276
+v -1.12505 1.33917 -1.1276
+v -1.26581 1.48992 1.82059
+v -1.26581 0.588913 1.82059
+v -0.530699 0.588913 1.08569
+v -0.530699 1.48992 1.08569
+v -1.15829 1.48992 0.457918
+v -1.15829 0.588913 0.457918
+v -1.8934 0.588913 1.19281
+v -1.8934 1.48992 1.19281
+v 1.16926 1.87107 1.244
+v 1.16932 1.87107 -1.24394
+v 0.585613 4.34992 1.5e-005
+v -0.593474 4.34992 -1.6e-005
+v -1.16176 1.87107 -1.244
+v -1.16183 1.87107 1.24394
+v 0.20932 2.114 1.12512
+v 0.20932 2.239 1.12512
+v 0.209038 2.614 1.62512
+v 0.208967 2.614 1.75012
+v 0.208967 2.864 1.75012
+v 0.209534 2.864 0.750118
+v 0.289322 2.239 1.12516
+v 0.289322 2.114 1.12516
+v 0.289534 2.864 0.750164
+v 0.289038 2.614 1.62516
+v 0.288967 2.864 1.75016
+v 0.288967 2.614 1.75016
+v -0.29068 2.114 1.12484
+v -0.29068 2.239 1.12484
+v -0.290962 2.614 1.62484
+v -0.291033 2.614 1.74984
+v -0.291033 2.864 1.74984
+v -0.290466 2.864 0.749836
+v -0.210678 2.239 1.12488
+v -0.210678 2.114 1.12488
+v -0.210466 2.864 0.749881
+v -0.210962 2.614 1.62488
+v -0.211033 2.864 1.74988
+v -0.211033 2.614 1.74988
+v 0.398979 2.814 1.80184
+v -0.00102 3.214 1.80168
+v -0.00102 3.114 1.80168
+v 0.34898 2.764 1.80182
+v -0.40102 2.814 1.80153
+v -0.351021 2.764 1.80155
+v -0.000319 3.114 0.563502
+v -0.000319 3.214 0.563502
+v 0.399681 2.814 0.563655
+v 0.349682 2.764 0.563636
+v -0.350319 2.764 0.563368
+v -0.400318 2.814 0.563349
+v -1.36571 1.76335 1.30816
+v -1.99019 1.4739 1.20524
+v -1.26193 1.4739 1.93265
+v -0.194054 1.4739 0.862978
+v -0.922319 1.4739 0.135567
+v -0.825571 1.76335 0.767107
+v -1.52113 1.31426 1.52054
+v 1.52009 1.31426 1.52158
+v 1.10309 1.63426 1.10421
+v -1.10388 1.63426 1.10341
+v 1.52204 1.31426 -1.51964
+v 1.10453 1.63426 -1.10276
+v -1.51919 1.31426 -1.52249
+v -1.10243 1.63426 -1.10486
+v 1.1845 2.68385 0.281632
+v 1.18441 2.88385 0.481632
+v 1.18441 2.83385 0.481632
+v 1.18449 2.65885 0.306632
+v 1.18433 2.68385 0.681632
+v 1.18434 2.65885 0.656632
+v 0.565324 2.83385 0.481265
+v 0.565324 2.88385 0.481265
+v 0.565406 2.68385 0.281265
+v 0.565396 2.65885 0.306265
+v 0.565253 2.65885 0.656265
+v 0.565242 2.68385 0.681265
+v -1.80243 1.37433 1.2849
+v -1.79277 0.840846 1.29455
+v -1.38452 0.855616 1.70279
+v -1.39417 1.38909 1.69314
+v -1.17726 1.37433 1.73387
+v -1.17335 0.840846 1.72996
+v -1.00819 0.855616 1.56482
+v -1.0121 1.38909 1.56872
+v -1.63705 1.37433 0.935206
+v -1.64095 0.840846 0.93911
+v -1.80612 0.855616 1.10425
+v -1.80222 1.38909 1.10035
+v 1.88055 1.48992 1.20586
+v 1.88055 0.588913 1.20586
+v 1.14568 0.588913 0.470727
+v 1.14568 1.48992 0.470727
+v 0.517887 1.48992 1.0983
+v 0.517887 0.588913 1.0983
+v 1.25277 0.588913 1.83343
+v 1.25277 1.48992 1.83343
+v 1.36813 1.76335 1.30575
+v 1.26519 1.4739 1.93023
+v 1.99262 1.4739 1.20198
+v 0.922974 1.4739 0.134077
+v 0.195543 1.4739 0.862323
+v 0.827085 1.76335 0.765592
+v 1.34486 1.37433 1.74246
+v 1.35451 0.840846 1.73281
+v 1.76276 0.855616 1.32457
+v 1.75311 1.38909 1.33422
+v 1.79384 1.37433 1.1173
+v 1.78993 0.840846 1.1134
+v 1.62479 0.855616 0.948235
+v 1.6287 1.38909 0.952139
+v 0.995163 1.37433 1.57707
+v 0.999067 0.840846 1.58098
+v 1.1642 0.855616 1.74615
+v 1.1603 1.38909 1.74225
+v 1.26594 1.48992 -1.82051
+v 1.26594 0.588913 -1.82051
+v 0.530787 0.588913 -1.08565
+v 0.530787 1.48992 -1.08565
+v 1.15834 1.48992 -0.457845
+v 1.15834 0.588913 -0.457845
+v 1.89349 0.588913 -1.1927
+v 1.89349 1.48992 -1.1927
+v 1.36581 1.76335 -1.30808
+v 1.99029 1.4739 -1.20512
+v 1.26206 1.4739 -1.93257
+v 0.194132 1.4739 -0.862956
+v 0.922358 1.4739 -0.135507
+v 0.825644 1.76335 -0.767052
+v 1.80253 1.37433 -1.2848
+v 1.79287 0.840846 -1.29445
+v 1.38464 0.855616 -1.70271
+v 1.39429 1.38909 -1.69306
+v 1.17738 1.37433 -1.7338
+v 1.17348 0.840846 -1.72989
+v 1.00831 0.855616 -1.56475
+v 1.01221 1.38909 -1.56865
+v 1.63713 1.37433 -0.935107
+v 1.64103 0.840846 -0.939011
+v 1.80621 0.855616 -1.10414
+v 1.80231 1.38909 -1.10024
+v -1.10388 1.63426 1.10341
+v 1.10309 1.63426 1.10421
+v 1.52009 1.31426 1.52158
+v -1.52113 1.31426 1.52054
+v 1.10453 1.63426 -1.10276
+v 1.52204 1.31426 -1.51964
+v -1.10243 1.63426 -1.10486
+v -1.51919 1.31426 -1.52249
+v 1.13198 1.87823 -1.13191
+v 1.13198 -1.87823 -1.13191
+v -1.13191 -1.87823 -1.13198
+v -1.13191 1.87823 -1.13198
+v -1.13189 1.87823 -1.132
+v -1.13189 -1.87823 -1.132
+v -1.132 -1.87823 1.13189
+v -1.132 1.87823 1.13189
+v -1.13203 1.87823 1.13186
+v -1.13203 -1.87823 1.13186
+v 1.13186 -1.87823 1.13204
+v 1.13186 1.87823 1.13204
+v 0 0.425 1.134
+v -0.122418 0.41429 1.134
+v -0.241117 0.382486 1.134
+v -0.352491 0.330553 1.134
+v -0.453154 0.260071 1.134
+v -0.54005 0.173179 1.134
+v -0.610537 0.072519 1.134
+v -0.662475 -0.038852 1.134
+v -0.694284 -0.157549 1.134
+v -0.705 -0.279967 1.134
+v -0.694296 -0.402386 1.134
+v -0.662497 -0.521087 1.134
+v -0.61057 -0.632462 1.134
+v -0.540092 -0.733129 1.134
+v -0.453204 -0.820029 1.134
+v -0.352547 -0.890521 1.134
+v -0.241179 -0.942463 1.134
+v -0.122483 -0.974279 1.134
+v -6.5e-005 -0.985 1.134
+v 0.122354 -0.974301 1.134
+v 0.241056 -0.942508 1.134
+v 0.352434 -0.890586 1.134
+v 0.453104 -0.820113 1.134
+v 0.540008 -0.733229 1.134
+v 0.610504 -0.632575 1.134
+v 0.662452 -0.521209 1.134
+v 0.694273 -0.402515 1.134
+v 0.705 -0.280098 1.134
+v 0.694307 -0.157678 1.134
+v 0.662519 -0.038975 1.134
+v 0.610602 0.072406 1.134
+v 0.540134 0.173079 1.134
+v 0.453254 0.259987 1.134
+v 0.352604 0.330488 1.134
+v 0.24124 0.382441 1.134
+v 0.122547 0.414267 1.134
+v -0.022031 0.3569 1.144
+v -0.022031 0.1031 1.144
+v 0.022031 0.1031 1.144
+v 0.022031 0.3569 1.144
+v -0.337525 0.260559 1.144
+v -0.210627 0.040761 1.144
+v -0.172467 0.062792 1.144
+v -0.299365 0.28259 1.144
+v -0.562582 0.01938 1.144
+v -0.342787 -0.107524 1.144
+v -0.320755 -0.069365 1.144
+v -0.54055 0.057539 1.144
+v -0.636901 -0.302014 1.144
+v -0.383101 -0.302021 1.144
+v -0.383099 -0.257959 1.144
+v -0.636899 -0.257952 1.144
+v -0.540568 -0.617511 1.144
+v -0.320766 -0.490618 1.144
+v -0.342796 -0.452458 1.144
+v -0.562598 -0.579351 1.144
+v -0.299395 -0.842574 1.144
+v -0.172485 -0.622782 1.144
+v -0.210644 -0.60075 1.144
+v -0.337553 -0.820541 1.144
+v 0.021998 -0.916901 1.144
+v 0.022011 -0.663101 1.144
+v -0.022051 -0.663099 1.144
+v -0.022065 -0.916899 1.144
+v 0.337496 -0.820577 1.144
+v 0.21061 -0.600772 1.144
+v 0.172449 -0.622801 1.144
+v 0.299336 -0.842606 1.144
+v 0.562566 -0.57941 1.144
+v 0.342778 -0.452494 1.144
+v 0.320744 -0.490652 1.144
+v 0.540532 -0.617567 1.144
+v 0.636902 -0.258019 1.144
+v 0.383102 -0.257999 1.144
+v 0.383098 -0.302062 1.144
+v 0.636898 -0.302082 1.144
+v 0.540586 0.057482 1.144
+v 0.320777 -0.069399 1.144
+v 0.342805 -0.10756 1.144
+v 0.562614 0.019321 1.144
+v 0.299425 0.282558 1.144
+v 0.172503 0.062773 1.144
+v 0.210661 0.040738 1.144
+v 0.337582 0.260523 1.144
+v 0.569006 -0.128884 1.135
+v -0.021876 -0.253928 1.135
+v -0.013192 -0.313016 1.135
+v 0.57769 -0.187972 1.135
+v -0.343714 -0.249302 1.13464
+v 0.036147 -0.31015 1.13464
+v 0.042763 -0.250677 1.13464
+v -0.337099 -0.18983 1.13464
+v 1.134 0.425 0
+v 1.134 0.41429 0.122418
+v 1.134 0.382486 0.241117
+v 1.134 0.330553 0.352491
+v 1.134 0.260071 0.453154
+v 1.134 0.173179 0.54005
+v 1.134 0.072519 0.610537
+v 1.134 -0.038852 0.662475
+v 1.134 -0.157549 0.694284
+v 1.134 -0.279967 0.705
+v 1.134 -0.402386 0.694296
+v 1.134 -0.521087 0.662497
+v 1.134 -0.632462 0.61057
+v 1.134 -0.733129 0.540092
+v 1.134 -0.820029 0.453204
+v 1.134 -0.890521 0.352547
+v 1.134 -0.942463 0.241179
+v 1.134 -0.974279 0.122483
+v 1.134 -0.985 6.5e-005
+v 1.134 -0.974301 -0.122354
+v 1.134 -0.942508 -0.241056
+v 1.134 -0.890586 -0.352434
+v 1.134 -0.820113 -0.453104
+v 1.134 -0.733229 -0.540008
+v 1.134 -0.632575 -0.610504
+v 1.134 -0.521209 -0.662452
+v 1.134 -0.402515 -0.694273
+v 1.134 -0.280098 -0.705
+v 1.134 -0.157678 -0.694307
+v 1.134 -0.038975 -0.662519
+v 1.134 0.072406 -0.610602
+v 1.134 0.173079 -0.540134
+v 1.134 0.259987 -0.453254
+v 1.134 0.330488 -0.352604
+v 1.134 0.382441 -0.24124
+v 1.134 0.414267 -0.122547
+v 1.144 0.3569 0.022031
+v 1.144 0.1031 0.022031
+v 1.144 0.1031 -0.022031
+v 1.144 0.3569 -0.022031
+v 1.144 0.260559 0.337525
+v 1.144 0.040761 0.210627
+v 1.144 0.062792 0.172467
+v 1.144 0.28259 0.299365
+v 1.144 0.01938 0.562582
+v 1.144 -0.107524 0.342787
+v 1.144 -0.069365 0.320755
+v 1.144 0.057539 0.54055
+v 1.144 -0.302014 0.636901
+v 1.144 -0.302021 0.383101
+v 1.144 -0.257959 0.383099
+v 1.144 -0.257952 0.636899
+v 1.144 -0.617511 0.540568
+v 1.144 -0.490618 0.320766
+v 1.144 -0.452458 0.342796
+v 1.144 -0.579351 0.562598
+v 1.144 -0.842574 0.299395
+v 1.144 -0.622782 0.172485
+v 1.144 -0.60075 0.210644
+v 1.144 -0.820541 0.337553
+v 1.144 -0.916901 -0.021998
+v 1.144 -0.663101 -0.022011
+v 1.144 -0.663099 0.022051
+v 1.144 -0.916899 0.022065
+v 1.144 -0.820577 -0.337496
+v 1.144 -0.600772 -0.21061
+v 1.144 -0.622801 -0.172449
+v 1.144 -0.842606 -0.299336
+v 1.144 -0.57941 -0.562566
+v 1.144 -0.452494 -0.342778
+v 1.144 -0.490652 -0.320744
+v 1.144 -0.617567 -0.540532
+v 1.144 -0.258019 -0.636902
+v 1.144 -0.257999 -0.383102
+v 1.144 -0.302062 -0.383098
+v 1.144 -0.302082 -0.636898
+v 1.144 0.057482 -0.540586
+v 1.144 -0.069399 -0.320777
+v 1.144 -0.10756 -0.342805
+v 1.144 0.019321 -0.562614
+v 1.144 0.282558 -0.299425
+v 1.144 0.062773 -0.172503
+v 1.144 0.040738 -0.210661
+v 1.144 0.260523 -0.337582
+v 1.135 -0.128884 -0.569006
+v 1.135 -0.253928 0.021876
+v 1.135 -0.313016 0.013192
+v 1.135 -0.187972 -0.57769
+v 1.13464 -0.249302 0.343714
+v 1.13464 -0.31015 -0.036147
+v 1.13464 -0.250677 -0.042763
+v 1.13464 -0.18983 0.337099
+v 0 0.425 -1.134
+v 0.122418 0.41429 -1.134
+v 0.241117 0.382486 -1.134
+v 0.352491 0.330553 -1.134
+v 0.453154 0.260071 -1.134
+v 0.54005 0.173179 -1.134
+v 0.610537 0.072519 -1.134
+v 0.662475 -0.038852 -1.134
+v 0.694284 -0.157549 -1.134
+v 0.705 -0.279967 -1.134
+v 0.694296 -0.402386 -1.134
+v 0.662497 -0.521087 -1.134
+v 0.61057 -0.632462 -1.134
+v 0.540092 -0.733129 -1.134
+v 0.453204 -0.820029 -1.134
+v 0.352547 -0.890521 -1.134
+v 0.241179 -0.942463 -1.134
+v 0.122483 -0.974279 -1.134
+v 6.5e-005 -0.985 -1.134
+v -0.122354 -0.974301 -1.134
+v -0.241056 -0.942508 -1.134
+v -0.352434 -0.890586 -1.134
+v -0.453104 -0.820113 -1.134
+v -0.540008 -0.733229 -1.134
+v -0.610504 -0.632575 -1.134
+v -0.662452 -0.521209 -1.134
+v -0.694273 -0.402515 -1.134
+v -0.705 -0.280098 -1.134
+v -0.694307 -0.157678 -1.134
+v -0.662519 -0.038975 -1.134
+v -0.610602 0.072406 -1.134
+v -0.540134 0.173079 -1.134
+v -0.453254 0.259987 -1.134
+v -0.352604 0.330488 -1.134
+v -0.24124 0.382441 -1.134
+v -0.122547 0.414267 -1.134
+v 0.022031 0.3569 -1.144
+v 0.022031 0.1031 -1.144
+v -0.022031 0.1031 -1.144
+v -0.022031 0.3569 -1.144
+v 0.337525 0.260559 -1.144
+v 0.210627 0.040761 -1.144
+v 0.172467 0.062792 -1.144
+v 0.299365 0.28259 -1.144
+v 0.562582 0.01938 -1.144
+v 0.342787 -0.107524 -1.144
+v 0.320755 -0.069365 -1.144
+v 0.54055 0.057539 -1.144
+v 0.636901 -0.302014 -1.144
+v 0.383101 -0.302021 -1.144
+v 0.383099 -0.257959 -1.144
+v 0.636899 -0.257952 -1.144
+v 0.540568 -0.617511 -1.144
+v 0.320766 -0.490618 -1.144
+v 0.342796 -0.452458 -1.144
+v 0.562598 -0.579351 -1.144
+v 0.299395 -0.842574 -1.144
+v 0.172485 -0.622782 -1.144
+v 0.210644 -0.60075 -1.144
+v 0.337553 -0.820541 -1.144
+v -0.021998 -0.916901 -1.144
+v -0.022011 -0.663101 -1.144
+v 0.022051 -0.663099 -1.144
+v 0.022065 -0.916899 -1.144
+v -0.337496 -0.820577 -1.144
+v -0.21061 -0.600772 -1.144
+v -0.172449 -0.622801 -1.144
+v -0.299336 -0.842606 -1.144
+v -0.562566 -0.57941 -1.144
+v -0.342778 -0.452494 -1.144
+v -0.320744 -0.490652 -1.144
+v -0.540532 -0.617567 -1.144
+v -0.636902 -0.258019 -1.144
+v -0.383102 -0.257999 -1.144
+v -0.383098 -0.302062 -1.144
+v -0.636898 -0.302082 -1.144
+v -0.540586 0.057482 -1.144
+v -0.320777 -0.069399 -1.144
+v -0.342805 -0.10756 -1.144
+v -0.562614 0.019321 -1.144
+v -0.299425 0.282558 -1.144
+v -0.172503 0.062773 -1.144
+v -0.210661 0.040738 -1.144
+v -0.337582 0.260523 -1.144
+v -0.569006 -0.128884 -1.135
+v 0.021876 -0.253928 -1.135
+v 0.013192 -0.313016 -1.135
+v -0.57769 -0.187972 -1.135
+v 0.343714 -0.249302 -1.13464
+v -0.036147 -0.31015 -1.13464
+v -0.042763 -0.250677 -1.13464
+v 0.337099 -0.18983 -1.13464
+v -1.134 0.425 0
+v -1.134 0.41429 -0.122418
+v -1.134 0.382486 -0.241117
+v -1.134 0.330553 -0.352491
+v -1.134 0.260071 -0.453154
+v -1.134 0.173179 -0.54005
+v -1.134 0.072519 -0.610537
+v -1.134 -0.038852 -0.662475
+v -1.134 -0.157549 -0.694284
+v -1.134 -0.279967 -0.705
+v -1.134 -0.402386 -0.694296
+v -1.134 -0.521087 -0.662497
+v -1.134 -0.632462 -0.61057
+v -1.134 -0.733129 -0.540092
+v -1.134 -0.820029 -0.453204
+v -1.134 -0.890521 -0.352547
+v -1.134 -0.942463 -0.241179
+v -1.134 -0.974279 -0.122483
+v -1.134 -0.985 -6.5e-005
+v -1.134 -0.974301 0.122354
+v -1.134 -0.942508 0.241056
+v -1.134 -0.890586 0.352434
+v -1.134 -0.820113 0.453104
+v -1.134 -0.733229 0.540008
+v -1.134 -0.632575 0.610504
+v -1.134 -0.521209 0.662452
+v -1.134 -0.402515 0.694273
+v -1.134 -0.280098 0.705
+v -1.134 -0.157678 0.694307
+v -1.134 -0.038975 0.662519
+v -1.134 0.072406 0.610602
+v -1.134 0.173079 0.540134
+v -1.134 0.259987 0.453254
+v -1.134 0.330488 0.352604
+v -1.134 0.382441 0.24124
+v -1.134 0.414267 0.122547
+v -1.144 0.3569 -0.022031
+v -1.144 0.1031 -0.022031
+v -1.144 0.1031 0.022031
+v -1.144 0.3569 0.022031
+v -1.144 0.260559 -0.337525
+v -1.144 0.040761 -0.210627
+v -1.144 0.062792 -0.172467
+v -1.144 0.28259 -0.299365
+v -1.144 0.01938 -0.562582
+v -1.144 -0.107524 -0.342787
+v -1.144 -0.069365 -0.320755
+v -1.144 0.057539 -0.54055
+v -1.144 -0.302014 -0.636901
+v -1.144 -0.302021 -0.383101
+v -1.144 -0.257959 -0.383099
+v -1.144 -0.257952 -0.636899
+v -1.144 -0.617511 -0.540568
+v -1.144 -0.490618 -0.320766
+v -1.144 -0.452458 -0.342796
+v -1.144 -0.579351 -0.562598
+v -1.144 -0.842574 -0.299395
+v -1.144 -0.622782 -0.172485
+v -1.144 -0.60075 -0.210644
+v -1.144 -0.820541 -0.337553
+v -1.144 -0.916901 0.021998
+v -1.144 -0.663101 0.022011
+v -1.144 -0.663099 -0.022051
+v -1.144 -0.916899 -0.022065
+v -1.144 -0.820577 0.337496
+v -1.144 -0.600772 0.21061
+v -1.144 -0.622801 0.172449
+v -1.144 -0.842606 0.299336
+v -1.144 -0.57941 0.562566
+v -1.144 -0.452494 0.342778
+v -1.144 -0.490652 0.320744
+v -1.144 -0.617567 0.540532
+v -1.144 -0.258019 0.636902
+v -1.144 -0.257999 0.383102
+v -1.144 -0.302062 0.383098
+v -1.144 -0.302082 0.636898
+v -1.144 0.057482 0.540586
+v -1.144 -0.069399 0.320777
+v -1.144 -0.10756 0.342805
+v -1.144 0.019321 0.562614
+v -1.144 0.282558 0.299425
+v -1.144 0.062773 0.172503
+v -1.144 0.040738 0.210661
+v -1.144 0.260523 0.337582
+v -1.135 -0.128884 0.569006
+v -1.135 -0.253928 -0.021876
+v -1.135 -0.313016 -0.013192
+v -1.135 -0.187972 0.57769
+v -1.13464 -0.249302 -0.343714
+v -1.13464 -0.31015 0.036147
+v -1.13464 -0.250677 0.042763
+v -1.13464 -0.18983 -0.337099
+vn 1 0 0.000569096
+vn -1 0 -0.000569096
+vn -1 0 -0.000570691
+vn 1 0 0.000565259
+vn 0.000509719 -0.44721 -0.894429
+vn -0.000499176 0 1
+vn -0.000481064 0.266932 0.963715
+vn -0.000488087 0.514492 0.857495
+vn 0.00042804 -0.514498 -0.857492
+vn -0.000299513 -0.8 0.6
+vn -0.000138291 0.961524 0.274721
+vn 0.000137137 -0.961524 -0.27472
+vn 0 -1 0
+vn 0 1 0
+vn -0.000387739 0 1
+vn 0.000382513 0 -1
+vn 0.707107 0.707106 0.000400743
+vn -1 0 -0.000566154
+vn -0.600001 -0.799999 -0.00033981
+vn -0.707107 -0.707107 -0.000400468
+vn -0.707107 -0.707107 -0.000400332
+vn 0.707113 -0.7071 0.000400901
+vn 0.6 0.8 0.000340172
+vn 1 0 0.000566154
+vn -0.707107 0.707106 -0.000400744
+vn 0.707107 -0.707107 0.000400469
+vn -0.436532 0.786406 0.437042
+vn 0.429319 0.794316 -0.429823
+vn -0.346918 0.871609 -0.346332
+vn 0 -1 0
+vn 0.346918 0.871608 0.346334
+vn -0.000209213 0.793494 0.608578
+vn 0.608566 0.793503 0.000390815
+vn 0.000571085 0.793502 -0.608568
+vn -0.608802 0.793322 -0.000389153
+vn 1 0 0.00042435
+vn 0.000419184 0.707107 -0.707107
+vn -0.000355678 -0.8 0.599999
+vn -0.00041917 -0.707107 0.707107
+vn 0.000419193 -0.707106 -0.707108
+vn 0.000355696 0.8 -0.599999
+vn -0.000419162 0.707107 0.707107
+vn -0.000419164 -0.707105 0.707108
+vn 0.000419163 -0.707107 -0.707107
+vn -0.707094 -6.49068e-006 0.70712
+vn -0.707098 0 0.707115
+vn 0.707069 2.89744e-006 0.707144
+vn 0.707064 0 0.70715
+vn -0.707045 -4.84174e-006 -0.707169
+vn 0.707098 0 0.707115
+vn 0.707157 -1.26403e-005 -0.707056
+vn -0.70719 4.67573e-006 0.707024
+vn -0.707199 -1.1863e-006 0.707015
+
+g
+f 4 1 2
+f 4 2 3
+f 4 5 6
+f 4 6 1
+f 2 7 8
+f 2 8 3
+
+g
+f 9 10 11
+f 9 11 12
+f 9 13 14
+f 9 14 10
+f 16 14 13
+f 16 13 15
+f 15 12 11
+f 15 11 16
+f 10 17 18
+f 10 18 11
+f 10 14 19
+f 10 19 17
+f 20 19 14
+f 20 14 16
+f 17 19 21
+f 17 21 22
+f 23 21 19
+f 23 19 20
+f 20 18 24
+f 20 24 23
+f 22 9 12
+f 22 12 24
+f 22 21 13
+f 22 13 9
+f 15 13 21
+f 15 21 23
+f 23 24 12
+f 23 12 15
+f 28 25 26
+f 28 26 27
+f 32 29 30
+f 32 30 31
+f 29 28 27
+f 29 27 30
+f 32 25 28
+f 32 28 29
+f 25 32 31
+f 25 31 26
+f 27 26 31
+f 27 31 30
+
+g
+f 33 34 35
+f 36 37 38
+f 35 34 37
+f 35 37 36
+f 33 38 37
+f 33 37 34
+f 38 33 35
+f 38 35 36
+
+g
+f 44//2 39//3 40//2
+f 43//2 44//2 40//2
+f 43//2 40//2 41//3
+f 43//2 41//3 42//3
+f 44//1 39//1 40//1
+f 44//1 40//1 41//4
+f 43//1 44//1 41//4
+f 43//1 41//4 42//1
+f 45//1 46//1 47//1
+f 46//5 39//5 44//5
+f 46//5 44//5 47//5
+f 40//7 39//6 46//6
+f 40//7 46//6 45//7
+f 44//8 40//7 45//7
+f 44//8 45//7 47//8
+f 48//4 45//4 47//4
+f 45//9 40//9 44//9
+f 45//9 44//9 47//9
+f 40//10 45//10 48//10
+f 40//10 48//10 41//10
+f 44//11 41//11 48//11
+f 44//11 48//11 47//11
+f 48//4 47//4 49//4
+f 48//4 49//4 50//1
+f 48//12 41//12 44//12
+f 48//12 44//12 47//12
+f 50//13 42//13 41//13
+f 50//13 41//13 48//13
+f 43//6 42//6 50//6
+f 43//6 50//6 49//6
+f 44//14 43//14 49//14
+f 44//14 49//14 47//14
+f 56//2 51//3 52//2
+f 55//2 56//2 52//2
+f 55//2 52//2 53//3
+f 55//2 53//3 54//3
+f 56//1 51//1 52//1
+f 56//1 52//1 53//4
+f 55//1 56//1 53//4
+f 55//1 53//4 54//1
+f 57//1 58//1 59//1
+f 58//5 51//5 56//5
+f 58//5 56//5 59//5
+f 52//7 51//6 58//6
+f 52//7 58//6 57//7
+f 56//8 52//7 57//7
+f 56//8 57//7 59//8
+f 60//4 57//4 59//4
+f 57//9 52//9 56//9
+f 57//9 56//9 59//9
+f 52//10 57//10 60//10
+f 52//10 60//10 53//10
+f 56//11 53//11 60//11
+f 56//11 60//11 59//11
+f 60//4 59//4 61//4
+f 60//4 61//4 62//1
+f 60//12 53//12 56//12
+f 60//12 56//12 59//12
+f 53//13 60//13 62//13
+f 53//13 62//13 54//13
+f 55//6 54//6 62//6
+f 55//6 62//6 61//6
+f 56//14 55//14 61//14
+f 56//14 61//14 59//14
+
+g
+f 63//15 64//15 65//15
+f 65//15 66//15 63//15
+f 65//15 64//15 67//15
+f 65//15 67//15 68//15
+f 69//16 70//16 71//16
+f 63//17 71//17 70//17
+f 63//17 70//17 64//17
+f 65//18 64//18 70//18
+f 65//18 70//18 69//18
+f 69//19 71//19 63//19
+f 69//19 63//19 65//19
+f 71//16 72//16 69//16
+f 69//20 72//20 66//20
+f 69//20 66//20 65//21
+f 72//22 71//22 63//22
+f 72//22 63//22 66//22
+f 63//23 71//23 69//23
+f 63//23 69//23 65//23
+f 74//16 70//16 69//16
+f 74//16 69//16 73//16
+f 64//24 65//24 69//24
+f 64//24 69//24 70//24
+f 74//25 67//25 64//25
+f 74//25 64//25 70//25
+f 74//21 73//21 68//21
+f 74//21 68//21 67//21
+f 65//26 68//26 73//26
+f 65//26 73//26 69//22
+f 75//27 76//27 77//27
+f 78//28 79//28 80//28
+f 80//29 79//29 76//29
+f 80//29 76//29 75//29
+f 76//30 79//30 78//30
+f 76//30 78//30 77//30
+f 77//31 78//31 80//31
+f 77//31 80//31 75//31
+f 81//32 82//32 83//32
+f 81//32 83//32 84//32
+f 82//33 85//33 86//33
+f 82//33 86//33 83//33
+f 85//34 87//34 88//34
+f 85//34 88//34 86//34
+f 87//35 81//35 84//35
+f 87//35 84//35 88//35
+f 89//36 90//24 91//36
+f 91//36 92//36 89//36
+f 91//36 90//24 93//36
+f 91//36 93//36 94//36
+f 95//18 96//18 97//18
+f 89//37 97//37 96//37
+f 89//37 96//37 90//37
+f 91//15 90//15 96//15
+f 91//15 96//15 95//15
+f 95//38 97//38 89//38
+f 95//38 89//38 91//38
+f 97//18 98//18 95//18
+f 95//39 98//39 92//39
+f 95//39 92//39 91//39
+f 89//40 92//40 98//40
+f 89//40 98//40 97//40
+f 89//41 97//41 95//41
+f 89//41 95//41 91//41
+f 100//18 96//18 95//18
+f 100//18 95//18 99//18
+f 90//16 91//16 95//16
+f 90//16 95//16 96//16
+f 100//42 93//42 90//42
+f 100//42 90//42 96//42
+f 94//43 93//43 100//43
+f 94//43 100//43 99//43
+f 91//44 94//44 99//44
+f 91//44 99//44 95//44
+
+g
+f 104//45 101//45 102//45
+f 104//45 102//45 103//46
+f 105//47 106//48 107//47
+f 105//47 107//47 108//47
+f 109//49 110//49 111//49
+f 109//49 111//49 112//49
+
+g
+f 116 113 114
+f 116 114 115
+f 120 117 118
+f 120 118 119
+f 117 116 115
+f 117 115 118
+f 116 117 120
+f 116 120 113
+f 113 120 119
+f 113 119 114
+f 119 118 115
+f 119 115 114
+
+g
+f 121 122 123
+f 124 125 126
+f 126 125 122
+f 126 122 121
+f 122 125 124
+f 122 124 123
+f 123 124 126
+f 123 126 121
+
+g
+f 130//50 127//50 128//50
+f 130//50 128//50 129//50
+f 131//51 132//51 133//51
+f 131//51 133//51 134//51
+f 135//52 136//52 137//52
+f 135//52 137//52 138//53
+
+g
+f 142 139 140
+f 142 140 141
+f 146 143 144
+f 146 144 145
+f 143 142 141
+f 143 141 144
+f 146 139 142
+f 146 142 143
+f 139 146 145
+f 139 145 140
+f 141 140 145
+f 141 145 144
+
+g
+f 147 148 149
+f 150 151 152
+f 152 151 148
+f 152 148 147
+f 150 149 148
+f 150 148 151
+f 149 150 152
+f 149 152 147
+
+g
+f 156 153 154
+f 156 154 155
+f 157 158 159
+f 157 159 160
+f 161 162 163
+f 161 163 164
+
+g
+f 166 167 168
+f 166 168 165
+f 169 170 167
+f 169 167 166
+f 171 172 170
+f 171 170 169
+f 165 168 172
+f 165 172 171
+
+g
+f 176 173 174
+f 176 174 175
+f 180 177 178
+f 180 178 179
+f 184 181 182
+f 184 182 183
+
+g
+f 220 185 186
+f 220 186 187
+f 220 187 188
+f 220 188 189
+f 220 189 190
+f 220 190 191
+f 220 191 192
+f 220 192 193
+f 220 193 194
+f 220 194 195
+f 220 195 196
+f 220 196 197
+f 220 197 198
+f 220 198 199
+f 220 199 200
+f 220 200 201
+f 219 220 201
+f 218 219 201
+f 217 218 201
+f 216 217 201
+f 215 216 201
+f 214 215 201
+f 213 214 201
+f 212 213 201
+f 211 212 201
+f 210 211 201
+f 209 210 201
+f 209 201 202
+f 209 202 203
+f 209 203 204
+f 209 204 205
+f 209 205 206
+f 209 206 207
+f 209 207 208
+
+g
+f 224 221 222
+f 224 222 223
+f 226 227 228
+f 226 228 225
+f 229 230 231
+f 229 231 232
+f 236 233 234
+f 236 234 235
+f 238 239 240
+f 238 240 237
+f 241 242 243
+f 241 243 244
+f 247 248 245
+f 247 245 246
+f 251 252 249
+f 251 249 250
+f 256 253 254
+f 256 254 255
+f 260 257 258
+f 260 258 259
+f 263 264 261
+f 263 261 262
+f 265 266 267
+f 265 267 268
+
+g
+f 272 269 270
+f 272 270 271
+f 275 276 273
+f 275 273 274
+
+g
+f 312 277 278
+f 312 278 279
+f 312 279 280
+f 312 280 281
+f 312 281 282
+f 312 282 283
+f 312 283 284
+f 312 284 285
+f 312 285 286
+f 312 286 287
+f 312 287 288
+f 312 288 289
+f 312 289 290
+f 312 290 291
+f 312 291 292
+f 312 292 293
+f 311 312 293
+f 310 311 293
+f 309 310 293
+f 308 309 293
+f 307 308 293
+f 306 307 293
+f 305 306 293
+f 304 305 293
+f 303 304 293
+f 302 303 293
+f 301 302 293
+f 301 293 294
+f 301 294 295
+f 301 295 296
+f 301 296 297
+f 301 297 298
+f 301 298 299
+f 301 299 300
+
+g
+f 316 313 314
+f 316 314 315
+f 318 319 320
+f 318 320 317
+f 321 322 323
+f 321 323 324
+f 328 325 326
+f 328 326 327
+f 330 331 332
+f 330 332 329
+f 333 334 335
+f 333 335 336
+f 339 340 337
+f 339 337 338
+f 343 344 341
+f 343 341 342
+f 348 345 346
+f 348 346 347
+f 352 349 350
+f 352 350 351
+f 355 356 353
+f 355 353 354
+f 357 358 359
+f 357 359 360
+
+g
+f 364 361 362
+f 364 362 363
+f 367 368 365
+f 367 365 366
+
+g
+f 404 369 370
+f 404 370 371
+f 404 371 372
+f 404 372 373
+f 404 373 374
+f 404 374 375
+f 404 375 376
+f 404 376 377
+f 404 377 378
+f 404 378 379
+f 404 379 380
+f 404 380 381
+f 404 381 382
+f 404 382 383
+f 404 383 384
+f 404 384 385
+f 403 404 385
+f 402 403 385
+f 401 402 385
+f 400 401 385
+f 399 400 385
+f 398 399 385
+f 397 398 385
+f 396 397 385
+f 395 396 385
+f 394 395 385
+f 393 394 385
+f 393 385 386
+f 393 386 387
+f 393 387 388
+f 393 388 389
+f 393 389 390
+f 393 390 391
+f 393 391 392
+
+g
+f 408 405 406
+f 408 406 407
+f 410 411 412
+f 410 412 409
+f 413 414 415
+f 413 415 416
+f 420 417 418
+f 420 418 419
+f 422 423 424
+f 422 424 421
+f 425 426 427
+f 425 427 428
+f 431 432 429
+f 431 429 430
+f 435 436 433
+f 435 433 434
+f 440 437 438
+f 440 438 439
+f 444 441 442
+f 444 442 443
+f 447 448 445
+f 447 445 446
+f 449 450 451
+f 449 451 452
+
+g
+f 456 453 454
+f 456 454 455
+f 459 460 457
+f 459 457 458
+
+g
+f 496 461 462
+f 496 462 463
+f 496 463 464
+f 496 464 465
+f 496 465 466
+f 496 466 467
+f 496 467 468
+f 496 468 469
+f 496 469 470
+f 496 470 471
+f 496 471 472
+f 496 472 473
+f 496 473 474
+f 496 474 475
+f 496 475 476
+f 496 476 477
+f 495 496 477
+f 494 495 477
+f 493 494 477
+f 492 493 477
+f 491 492 477
+f 490 491 477
+f 489 490 477
+f 488 489 477
+f 487 488 477
+f 486 487 477
+f 485 486 477
+f 485 477 478
+f 485 478 479
+f 485 479 480
+f 485 480 481
+f 485 481 482
+f 485 482 483
+f 485 483 484
+
+g
+f 500 497 498
+f 500 498 499
+f 502 503 504
+f 502 504 501
+f 505 506 507
+f 505 507 508
+f 512 509 510
+f 512 510 511
+f 514 515 516
+f 514 516 513
+f 517 518 519
+f 517 519 520
+f 523 524 521
+f 523 521 522
+f 527 528 525
+f 527 525 526
+f 532 529 530
+f 532 530 531
+f 536 533 534
+f 536 534 535
+f 539 540 537
+f 539 537 538
+f 541 542 543
+f 541 543 544
+
+g
+f 548 545 546
+f 548 546 547
+f 551 552 549
+f 551 549 550

Modified: trunk/Build/source/utils/asymptote/examples/vertexshading.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/vertexshading.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/examples/vertexshading.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -4,9 +4,12 @@
 
 currentprojection=perspective(4,5,5);
 
+//draw(shift(2Z)*surface(O--X--Y--cycle),blue);
+
 draw(surface(unitcircle3,new pen[] {red,green,blue,black}));
 draw(surface(shift(Z)*unitsquare3,
-	     new pen[] {red,green+opacity(0.5),blue,black}));
+             new pen[] {red,green+opacity(0.5),blue,black}),
+     prc() ? nolight : currentlight);
 draw(surface(shift(X)*((0,0,0)..controls (1,0,0) and (2,0,0)..(3,0,0)..
              controls (2.5,sqrt(3)/2,0) and (2,sqrt(3),0)..
              (1.5,3*sqrt(3)/2,0)..

Modified: trunk/Build/source/utils/asymptote/examples/washermethod.asy
===================================================================
--- trunk/Build/source/utils/asymptote/examples/washermethod.asy	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/examples/washermethod.asy	2019-10-06 17:17:34 UTC (rev 52300)
@@ -18,7 +18,7 @@
 real x3=1.8043;
 
 path[] p={graph(F,x1,x2,Spline),
-          graph(F,0.7,x1,Spline)--graph(F,x2,x3,Spline),
+          graph(F,0.7,x1,Spline)--graph(F,x2,x3,Spline)&cycle,
           graph(F,0,0.7,Spline)--graph(F,x3,2,Spline)};
 
 pen[] pn=new pen[] {color1,color2,color1};

Modified: trunk/Build/source/utils/asymptote/fileio.h
===================================================================
--- trunk/Build/source/utils/asymptote/fileio.h	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/fileio.h	2019-10-06 17:17:34 UTC (rev 52300)
@@ -117,7 +117,7 @@
   file(const string& name, bool check=true, Mode type=NOMODE, bool binary=false,
        bool closed=false) : 
     name(name), check(check), type(type), linemode(false), csvmode(false),
-    singlereal(false), singleint(true), signedint(true),
+    wordmode(false), singlereal(false), singleint(true), signedint(true),
     closed(closed), standard(name.empty()),
     binary(binary), nullfield(false), whitespace("") {dimension();}
   
@@ -423,7 +423,8 @@
     ifile(name,comment,true,UPDATE,std::ios::in | std::ios::out) {}
 
   Int precision(Int p) {
-    return p == 0 ? stream->precision() : stream->precision(p);
+    return p == 0 ? stream->precision(settings::getSetting<Int>("digits")) :
+      stream->precision(p);
   }
   void flush() {if(fstream) fstream->flush();}
   
@@ -463,6 +464,7 @@
     } else {
       name=outpath(name);
       stream=fstream=new std::ofstream(name.c_str(),mode | std::ios::trunc);
+      stream->precision(settings::getSetting<Int>("digits"));
       index=processData().ofile.add(fstream);
       Check();
     }
@@ -483,7 +485,8 @@
   }
   void clear() {stream->clear();}
   Int precision(Int p) {
-    return p == 0 ? stream->precision() : stream->precision(p);
+    return p == 0 ? stream->precision(settings::getSetting<Int>("digits")) :
+      stream->precision(p);
   }
   void flush() {stream->flush();}
   

Added: trunk/Build/source/utils/asymptote/gl.js
===================================================================
--- trunk/Build/source/utils/asymptote/gl.js	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/gl.js	2019-10-06 17:17:34 UTC (rev 52300)
@@ -0,0 +1 @@
+link webgl/gl.js
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/gl.js
___________________________________________________________________
Added: svn:special
## -0,0 +1 ##
+*
\ No newline at end of property
Modified: trunk/Build/source/utils/asymptote/glew.c
===================================================================
--- trunk/Build/source/utils/asymptote/glew.c	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/glew.c	2019-10-06 17:17:34 UTC (rev 52300)
@@ -2,6 +2,10 @@
 #include "config.h"
 #endif
 
+#ifdef __MSDOS__
+#define _WIN32
+#endif
+
 #ifdef HAVE_LIBGL
 #include "GL/glew.c"
 #endif /* HAVE_LIBGL */

Modified: trunk/Build/source/utils/asymptote/glrender.cc
===================================================================
--- trunk/Build/source/utils/asymptote/glrender.cc	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/glrender.cc	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,6 +1,6 @@
 /*****
  * glrender.cc
- * John Bowman and Orest Shardt
+ * John Bowman, Orest Shardt, and Supakorn "Jamie" Rassameemasmuang
  * Render 3D Bezier paths and surfaces.
  *****/
 
@@ -13,7 +13,6 @@
 #include <cstring>
 #include <sys/time.h>
 
-
 #include "common.h"
 #include "locate.h"
 #include "seconds.h"
@@ -21,7 +20,13 @@
 #include "bezierpatch.h"
 #include "beziercurve.h"
 
+#include "picture.h"
+#include "bbox3.h"
+#include "drawimage.h"
+#include "interact.h"
+
 #ifdef HAVE_GL
+#include "tr.h"
 
 #ifdef HAVE_LIBGLUT
 #ifdef __MSDOS__
@@ -36,13 +41,6 @@
 #define GLUT_BUILDING_LIB
 #endif // HAVE_LIBGLUT
 
-#include "picture.h"
-#include "arcball.h"
-#include "bbox3.h"
-#include "drawimage.h"
-#include "interact.h"
-#include "tr.h"
-
 #ifdef HAVE_LIBGLUT
 #ifdef FREEGLUT
 #include <GL/freeglut_ext.h>
@@ -49,12 +47,7 @@
 #endif
 #endif
 
-#include <glm/glm.hpp>
-#include <glm/gtc/matrix_transform.hpp>
-#include <glm/gtc/type_ptr.hpp>
-
 #include "shaders.h"
-#include "material.h"
 
 #ifdef HAVE_LIBOPENIMAGEIO
 #include <OpenImageIO/imageio.h>
@@ -61,23 +54,47 @@
 #endif
 
 using settings::locateFile;
+using utils::seconds;
+
+namespace camp {
+Billboard BB;
+
+GLint pixelShader;
+GLint noNormalShader;
+GLint materialShader;
+GLint colorShader;
+GLint transparentShader;
+
+vertexBuffer material0Data;
+vertexBuffer material1Data;
+vertexBuffer materialData;
+vertexBuffer colorData;
+vertexBuffer transparentData;
+vertexBuffer triangleData;
+
+const size_t Nbuffer=10000;
+const size_t nbuffer=1000;
+}
+
+#endif /* HAVE_GL */
+
+#ifdef HAVE_LIBGLM
 using camp::Material;
 using camp::Maxmaterials;
 using camp::Nmaterials;
 using camp::nmaterials;
-using utils::seconds;
+using camp::MaterialMap;
 
 namespace camp {
-billboard BB;
-GLint materialShader;
-GLint colorShader;
-GLint noNormalShader;
-GLint pixelShader;
+mem::vector<Material> material;
+MaterialMap materialMap;
+size_t materialIndex;
 
 size_t Maxmaterials;
 size_t Nmaterials=1;
 size_t nmaterials=48;
 }
+
 namespace gl {
   
 bool outlinemode=false;
@@ -85,7 +102,7 @@
 bool initialize=true;
 
 GLint Maxvertices;
-Int maxvertices;
+size_t maxvertices;
 
 using camp::picture;
 using camp::drawRawImage;
@@ -104,28 +121,10 @@
 
 bool queueExport=false;
 bool readyAfterExport=false;
-
-#ifdef HAVE_LIBGLUT
-timeval lasttime;
-timeval lastframetime;
-int oldWidth,oldHeight;
-
-bool Xspin,Yspin,Zspin;
-bool Animate;
-bool Step;
 bool remesh;
-bool forceRemesh=false;
 
-bool queueScreen=false;
+int Mode;
 
-int x0,y0;
-string Action;
-
-double lastangle;
-Arcball arcball;
-int window;
-#endif
-
 double Aspect;
 bool View;
 int Oldpid;
@@ -132,8 +131,8 @@
 string Prefix;
 const picture* Picture;
 string Format;
+int fullWidth,fullHeight;
 int Width,Height;
-int fullWidth,fullHeight;
 double oWidth,oHeight;
 int screenWidth,screenHeight;
 int maxWidth;
@@ -141,10 +140,6 @@
 int maxTileWidth;
 int maxTileHeight;
 
-double T[16];
-
-int Mode;
-
 double Angle;
 bool orthographic;
 double H;
@@ -156,15 +151,18 @@
 double Ymin,Ymax;
 
 pair Shift;
+pair Margin;
 double X,Y;
+int x0,y0;
 double cx,cy;
 double Xfactor,Yfactor;
+double ArcballFactor;
 
 static const double pi=acos(-1.0);
 static const double degrees=180.0/pi;
 static const double radians=1.0/degrees;
 
-double Background[4];
+double *Background;
 size_t Nlights=1; // Maximum number of lights compiled in shader
 size_t nlights; // Actual number of lights
 size_t nlights0;
@@ -177,107 +175,34 @@
 double Zoom0;
 double lastzoom;
 
+GLint lastshader=-1;
+
 using glm::dvec3;
+using glm::dmat3;
+using glm::mat3;
 using glm::mat4;
 using glm::dmat4;
 using glm::value_ptr;
 using glm::translate;
 
+mat3 normMat;
+dmat3 dnormMat;
+
 mat4 projViewMat;
 mat4 viewMat;
-mat4 normMat;
 
 dmat4 dprojMat;
+dmat4 dprojViewMat;
 dmat4 dviewMat;
 dmat4 drotateMat; 
 
-using utils::statistics;
-statistics S;
+const double *dprojView;
+double BBT[9];
 
-ModelView modelView;
+GLuint ubo;
 
-#ifdef HAVE_LIBOPENIMAGEIO
-GLuint envMapBuf;
+unsigned int framecount;
 
-GLuint initHDR() {
-  GLuint tex;
-  glGenTextures(1, &tex);
-
-  auto imagein = OIIO::ImageInput::open(locateFile("res/studio006.hdr").c_str());
-  OIIO::ImageSpec const& imspec = imagein->spec();
-
-  // uses GL_TEXTURE1 for now.
-  glActiveTexture(GL_TEXTURE1);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
-  glBindTexture(GL_TEXTURE_2D, tex);
-  std::vector<float> pixels(imspec.width*imspec.height*3);
-  imagein->read_image(pixels.data());
-
-  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imspec.width, imspec.height, 0, 
-    GL_RGB, GL_FLOAT, pixels.data());
-
-  glGenerateMipmap(GL_TEXTURE_2D);
-  imagein->close();
-
-  glActiveTexture(GL_TEXTURE0);
-  return tex;
-}
-
-#endif 
-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
-OSMesaContext ctx;
-unsigned char *osmesa_buffer;
-#endif
-
-#ifdef HAVE_PTHREAD
-pthread_t mainthread;
-
-pthread_cond_t initSignal=PTHREAD_COND_INITIALIZER;
-pthread_mutex_t initLock=PTHREAD_MUTEX_INITIALIZER;
-
-pthread_cond_t readySignal=PTHREAD_COND_INITIALIZER;
-pthread_mutex_t readyLock=PTHREAD_MUTEX_INITIALIZER;
-
-void endwait(pthread_cond_t& signal, pthread_mutex_t& lock)
-{
-  pthread_mutex_lock(&lock);
-  pthread_cond_signal(&signal);
-  pthread_mutex_unlock(&lock);
-}
-void wait(pthread_cond_t& signal, pthread_mutex_t& lock)
-{
-  pthread_mutex_lock(&lock);
-  pthread_cond_signal(&signal);
-  pthread_cond_wait(&signal,&lock);
-  pthread_mutex_unlock(&lock);
-}
-#endif
-
 template<class T>
 inline T min(T a, T b)
 {
@@ -338,11 +263,18 @@
   }
 }
 
+void updateProjection()
+{
+  dprojViewMat=dprojMat*dviewMat;
+  projViewMat=mat4(dprojViewMat);
+  dprojView=value_ptr(dprojViewMat);
+}
+
 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);
+  updateProjection();
 }
 
 void ortho(GLdouble left, GLdouble right, GLdouble bottom,
@@ -349,7 +281,7 @@
            GLdouble top, GLdouble nearVal, GLdouble farVal)
 {
   dprojMat=glm::ortho(left,right,bottom,top,nearVal,farVal);
-  projViewMat=mat4(dprojMat*dviewMat);
+  updateProjection();
 }
 
 void setProjection()
@@ -357,13 +289,137 @@
   setDimensions(Width,Height,X,Y);
   if(orthographic) ortho(xmin,xmax,ymin,ymax,-zmax,-zmin);
   else frustum(xmin,xmax,ymin,ymax,-zmax,-zmin);
+}
+
+void updateModelViewData()
+{
+  // Like Fortran, OpenGL uses transposed (column-major) format!
+  dnormMat=dmat3(glm::inverse(dviewMat));
+  double *T=value_ptr(dnormMat);
+  for(size_t i=0; i < 9; ++i)
+    BBT[i]=T[i];
+  normMat=mat3(dnormMat);
+}
+
+bool Xspin,Yspin,Zspin;
+bool Animate;
+bool Step;
+
+#ifdef HAVE_GL
+void idle() 
+{
+  glutIdleFunc(NULL);
+  Xspin=Yspin=Zspin=Animate=Step=false;
+}
+#endif
+
+void home(bool webgl=false) 
+{
+  X=Y=cx=cy=0.0;
+#ifdef HAVE_GL  
+#ifdef HAVE_LIBGLUT
+  if(!webgl && !getSetting<bool>("offscreen"))
+    idle();
+#endif
+#endif
+  dviewMat=dmat4(1.0);
+  viewMat=mat4(dviewMat);
   
+  drotateMat=dmat4(1.0); 
+  
+  updateModelViewData();
+
+  remesh=true;
+  lastzoom=Zoom=Zoom0;
+  setDimensions(Width,Height,0,0);
+  framecount=0;
+}
+
+#ifdef HAVE_GL
+
+double T[16];
+
 #ifdef HAVE_LIBGLUT
-  double arcballRadius=getSetting<double>("arcballradius");
-  arcball.set_params(vec2(0.5*Width,0.5*Height),arcballRadius*Zoom);
+timeval lasttime;
+timeval lastframetime;
+int oldWidth,oldHeight;
+
+bool forceRemesh=false;
+
+bool queueScreen=false;
+
+string Action;
+
+double lastangle;
+int window;
 #endif
+
+using utils::statistics;
+statistics S;
+
+#ifdef HAVE_LIBOPENIMAGEIO
+GLuint envMapBuf;
+
+GLuint initHDR() {
+  GLuint tex;
+  glGenTextures(1, &tex);
+
+  auto imagein = OIIO::ImageInput::open(locateFile("res/studio006.hdr").c_str());
+  OIIO::ImageSpec const& imspec = imagein->spec();
+
+  // uses GL_TEXTURE1 for now.
+  glActiveTexture(GL_TEXTURE1);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+  glBindTexture(GL_TEXTURE_2D, tex);
+  std::vector<float> pixels(imspec.width*imspec.height*3);
+  imagein->read_image(pixels.data());
+
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imspec.width, imspec.height, 0, 
+    GL_RGB, GL_FLOAT, pixels.data());
+
+  glGenerateMipmap(GL_TEXTURE_2D);
+  imagein->close();
+
+  glActiveTexture(GL_TEXTURE0);
+  return tex;
 }
 
+#endif 
+GLint shaderProg,shaderProgColor;
+
+void *glrenderWrapper(void *a);
+
+#ifdef HAVE_LIBOSMESA
+OSMesaContext ctx;
+unsigned char *osmesa_buffer;
+#endif
+
+#ifdef HAVE_PTHREAD
+pthread_t mainthread;
+
+pthread_cond_t initSignal=PTHREAD_COND_INITIALIZER;
+pthread_mutex_t initLock=PTHREAD_MUTEX_INITIALIZER;
+
+pthread_cond_t readySignal=PTHREAD_COND_INITIALIZER;
+pthread_mutex_t readyLock=PTHREAD_MUTEX_INITIALIZER;
+
+void endwait(pthread_cond_t& signal, pthread_mutex_t& lock)
+{
+  pthread_mutex_lock(&lock);
+  pthread_cond_signal(&signal);
+  pthread_mutex_unlock(&lock);
+}
+void wait(pthread_cond_t& signal, pthread_mutex_t& lock)
+{
+  pthread_mutex_lock(&lock);
+  pthread_cond_signal(&signal);
+  pthread_cond_wait(&signal,&lock);
+  pthread_mutex_unlock(&lock);
+}
+#endif
+
 void drawscene(int Width, int Height)
 {
 #ifdef HAVE_PTHREAD
@@ -383,23 +439,20 @@
   
   double size2=hypot(Width,Height);
   
-  if(remesh) {
-    camp::BezierPatch::clear();
-    camp::BezierPatch::Clear();
-    camp::BezierPatch::tClear();
-    camp::BezierCurve::clear();
-    camp::Pixel::clear();
+  if(forceRemesh) {
+    remesh=true;
+    forceRemesh=false;
   }
   
-  // Render opaque objects
-  Picture->render(size2,m,M,perspective,false,remesh);
+  camp::clearBuffers();
   
-  // Enable transparency
-  glDepthMask(GL_FALSE);
+  if(remesh)
+    camp::drawElement::center.clear();
   
-  // Render transparent objects
-  Picture->render(size2,m,M,perspective,true,remesh);
-  glDepthMask(GL_TRUE);
+  Picture->render(size2,m,M,perspective,remesh);
+  
+  if(!forceRemesh)
+    remesh=false;
 }
 
 // Return x divided by y rounded up to the nearest integer.
@@ -415,6 +468,7 @@
   glFinish();
   try {
     size_t ndata=3*fullWidth*fullHeight;
+    unsigned border=1;
     unsigned char *data=new unsigned char[ndata];
     if(data) {
       TRcontext *tr=trNew();
@@ -426,7 +480,7 @@
              << fullHeight << " image" << " using tiles of size "
              << width << "x" << height << endl;
 
-      trTileSize(tr,width,height,0);
+      trTileSize(tr,width,height,border);
       trImageSize(tr,fullWidth,fullHeight);
       trImageBuffer(tr,GL_RGB,GL_UNSIGNED_BYTE,data);
 
@@ -477,38 +531,6 @@
 #endif
 }
 
-#ifdef HAVE_LIBGLUT
-void idle() 
-{
-  glutIdleFunc(NULL);
-  Xspin=Yspin=Zspin=Animate=Step=false;
-}
-#endif
-
-void home() 
-{
-  X=Y=cx=cy=0.0;
-#ifdef HAVE_LIBGLUT
-  if(!getSetting<bool>("offscreen")) {
-    idle();
-    arcball.init();
-  }
-#endif
-  viewMat=mat4(1.0f);
-  normMat=mat4(1.0f);
-  
-  dviewMat=dmat4(1.0);
-  drotateMat=dmat4(1.0); 
-  
-  Rotate=value_ptr(drotateMat);
-  updateModelViewData();
-
-  remesh=true;
-  lastzoom=Zoom=Zoom0;
-  setDimensions(Width,Height,0,0);
-  glClearColor(Background[0],Background[1],Background[2],Background[3]);
-}
-
 void nodisplay()
 {
 }
@@ -565,19 +587,20 @@
 {
   remesh=true;
   switch(Mode) {
-    case 0: // wireframe -> regular
+    case 0: // regular
       outlinemode=false;
       nlights=nlights0;
+      lastshader=-1;
       glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
       ++Mode;
       break;
-    case 1: // regular -> outline
+    case 1: // outline
       outlinemode=true;
       nlights=0;
       glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
       ++Mode;
       break;
-    case 2: // outline -> wireframe
+    case 2: // wireframe
       outlinemode=false;
       Mode=0;
       break;
@@ -734,16 +757,20 @@
   if(maxvertices == 0) maxvertices=Maxvertices;
 
   bool fps=settings::verbose > 2;  
-  if(fps) seconds();
   drawscene(Width,Height);
   if(fps) {
-    glFinish();
-    double s=seconds();
-    if(s > 0.0) {
-      double rate=1.0/s;
-      S.add(rate);
-      cout << "FPS=" << rate << "\t" << S.mean() << " +/- " << S.stdev() << endl;
+    if(framecount < 10) // Measure steady-state framerate
+      seconds();
+    else {
+      double s=seconds();
+      if(s > 0.0) {
+        double rate=1.0/s;
+        S.add(rate);
+        cout << "FPS=" << rate << "\t" << S.mean() << " +/- " << S.stdev() 
+             << endl;
+      }
     }
+    ++framecount;
   }
   glutSwapBuffers();
 
@@ -782,6 +809,7 @@
   Animate=getSetting<bool>("autoplay");
   glutShowWindow();
   if(Zoom != lastzoom) remesh=true;
+
   lastzoom=Zoom;
   double cz=0.5*(zmin+zmax);
   
@@ -788,6 +816,7 @@
   dviewMat=translate(translate(dmat4(1.0),dvec3(cx,cy,cz))*drotateMat,
                      dvec3(0,0,-cz));
   viewMat=mat4(dviewMat);
+
   setProjection();
   updateModelViewData();
   
@@ -834,35 +863,31 @@
   
 void shift(int x, int y)
 {
-  if(x > 0 && y > 0) {
-    double Zoominv=1.0/Zoom;
-    X += (x-x0)*Zoominv;
-    Y += (y0-y)*Zoominv;
-    x0=x; y0=y;
-    update();
-  }
+  double Zoominv=1.0/Zoom;
+  X += (x-x0)*Zoominv;
+  Y += (y0-y)*Zoominv;
+  x0=x; y0=y;
+  update();
 }
   
 void pan(int x, int y)
 {
-  if(x > 0 && y > 0) {
-    if(orthographic) {
-      double Zoominv=1.0/Zoom;
-      X += (x-x0)*Zoominv;
-      Y += (y0-y)*Zoominv;
-    } else {
-      cx += (x-x0)*(xmax-xmin)/Width;
-      cy += (y0-y)*(ymax-ymin)/Height;
-    }
-    x0=x; y0=y;
-    update();
+  if(orthographic) {
+    double Zoominv=1.0/Zoom;
+    X += (x-x0)*Zoominv;
+    Y += (y0-y)*Zoominv;
+  } else {
+    cx += (x-x0)*(xmax-xmin)/Width;
+    cy += (y0-y)*(ymax-ymin)/Height;
   }
+  x0=x; y0=y;
+  update();
 }
   
 void capzoom() 
 {
   static double maxzoom=sqrt(DBL_MAX);
-  static double minzoom=1/maxzoom;
+  static double minzoom=1.0/maxzoom;
   if(Zoom <= minzoom) Zoom=minzoom;
   if(Zoom >= maxzoom) Zoom=maxzoom;
   
@@ -873,19 +898,17 @@
 void zoom(int x, int y)
 {
   if(ignorezoom) {ignorezoom=false; y0=y; return;}
-  if(x > 0 && y > 0) {
-    double zoomFactor=getSetting<double>("zoomfactor");
-    if(zoomFactor > 0.0) {
-      double zoomStep=getSetting<double>("zoomstep");
-      const double limit=log(0.1*DBL_MAX)/log(zoomFactor);
-      double s=zoomStep*(y0-y);
-      if(fabs(s) < limit) {
-        Zoom *= pow(zoomFactor,s);
-        capzoom();
-        y0=y;
-        setProjection();
-        glutPostRedisplay();
-      }
+  double zoomFactor=getSetting<double>("zoomfactor");
+  if(zoomFactor > 0.0) {
+    double zoomStep=getSetting<double>("zoomstep");
+    const double limit=log(0.1*DBL_MAX)/log(zoomFactor);
+    double stepPower=zoomStep*(y0-y);
+    if(fabs(stepPower) < limit) {
+      Zoom *= pow(zoomFactor,stepPower);
+      capzoom();
+      y0=y;
+      setProjection();
+      glutPostRedisplay();
     }
   }
 }
@@ -904,20 +927,48 @@
   }
 }
 
+struct arcball {
+  double angle;
+  triple axis;
+  
+  arcball(double x0, double y0, double x, double y) {
+    triple v0=norm(x0,y0);
+    triple v1=norm(x,y);
+    double Dot=dot(v0,v1);
+    if(Dot > 1.0) Dot=1.0;
+    else if(Dot < -1.0) Dot=-1.0;
+    angle=acos(Dot);
+    axis=unit(cross(v0,v1));
+  }
+  
+  triple norm(double x, double y) {
+    double norm=hypot(x,y);
+    if(norm > 1.0) {
+      double denom=1.0/norm;
+      x *= denom;
+      y *= denom;
+    }
+    return triple(x,y,sqrt(max(1.0-x*x-y*y,0.0)));
+  }
+};
+
+inline double glx(int x) {
+  return 2.0*x/Width-1.0;
+}
+
+inline double gly(int y) {
+  return 1.0-2.0*y/Height;
+}
+
 void rotate(int x, int y)
 {
-  if(x > 0 && y > 0) {
-    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];
-      int i4=4*i;
-      for(int j=0; j < 4; ++j)
-        value_ptr(drotateMat)[i4+j]=roti[j];
-    }
-    
+  if(x != x0 || y != y0) {
+    arcball A(glx(x0),gly(y0),glx(x),gly(y));
+    triple v=A.axis;
+    drotateMat=glm::rotate<double>(2*A.angle/lastzoom*ArcballFactor,
+                                   glm::dvec3(v.getx(),v.gety(),v.getz()))*
+      drotateMat;
+    x0=x; y0=y;
     update();
   }
 }
@@ -927,24 +978,12 @@
   return atan2(0.5*Height-y-Y,x-0.5*Width-X)*degrees;
 }
 
-void updateArcball() 
-{
-  Rotate=value_ptr(drotateMat);
-  for(int i=0; i < 4; ++i) {
-    int i4=4*i;
-    ::vec4& roti=arcball.rot[i];
-    for(int j=0; j < 4; ++j)
-      roti[j]=Rotate[i4+j];
-  }
-  update();
-}
-
 void rotateX(double step) 
 {
   dmat4 tmpRot(1.0);
   tmpRot=glm::rotate(tmpRot,glm::radians(step),dvec3(1,0,0));
   drotateMat=tmpRot*drotateMat;
-  updateArcball();
+  update();
 }
 
 void rotateY(double step) 
@@ -952,7 +991,7 @@
   dmat4 tmpRot(1.0);
   tmpRot=glm::rotate(tmpRot,glm::radians(step),dvec3(0,1,0));
   drotateMat=tmpRot*drotateMat;
-  updateArcball();
+  update();
 }
 
 void rotateZ(double step) 
@@ -960,16 +999,28 @@
   dmat4 tmpRot(1.0);
   tmpRot=glm::rotate(tmpRot,glm::radians(step),dvec3(0,0,1));
   drotateMat=tmpRot*drotateMat;
-  updateArcball();
+  update();
 }
 
+void rotateX(int x, int y)
+{
+  double angle=Degrees(x,y);
+  rotateX(angle-lastangle);
+  lastangle=angle;
+}
+
+void rotateY(int x, int y)
+{
+  double angle=Degrees(x,y);
+  rotateY(angle-lastangle);
+  lastangle=angle;
+}
+
 void rotateZ(int x, int y)
 {
-  if(x > 0 && y > 0) {
-    double angle=Degrees(x,y);
-    rotateZ(angle-lastangle);
-    lastangle=angle;
-  }
+  double angle=Degrees(x,y);
+  rotateZ(angle-lastangle);
+  lastangle=angle;
 }
 
 #ifndef GLUT_WHEEL_UP
@@ -1059,8 +1110,8 @@
   }     
   
   if(state == GLUT_DOWN) {
-    if(Action == "rotate" || Action == "rotateX" || Action == "rotateY") {
-      arcball.mouse_down(x,Height-y);
+    if(Action == "rotate") {
+      x0=x; y0=y;
       glutMotionFunc(rotate);
     } else if(Action == "shift") {
       x0=x; y0=y;
@@ -1071,13 +1122,18 @@
     } else if(Action == "zoom" || Action == "zoom/menu") {
       y0=y;
       glutMotionFunc(zoom);
+    } else if(Action == "rotateX") {
+      lastangle=Degrees(x,y);
+      glutMotionFunc(rotateX);
+    } else if(Action == "rotateY") {
+      lastangle=Degrees(x,y);
+      glutMotionFunc(rotateY);
     } else if(Action == "rotateZ") {
       lastangle=Degrees(x,y);
       glutMotionFunc(rotateZ);
     }
   } else {
-    arcball.mouse_up();
-    glutMotionFunc(NULL);
+     glutMotionFunc(NULL);
   }
 }
 
@@ -1155,11 +1211,6 @@
   }
 }
 
-void write(const char *text, const double *v)
-{
-  cout << text << "=(" << v[0] << "," << v[1] << "," << v[2] << ")";
-}
-
 void showCamera()
 {
   projection P=camera();
@@ -1277,6 +1328,8 @@
   
   double cz=0.5*(zmin+zmax);
 
+  double *Rotate=value_ptr(drotateMat);
+
   if(user) {
     for(int i=0; i < 3; ++i) {
       double sumCamera=0.0, sumTarget=0.0, sumUp=0.0;
@@ -1311,8 +1364,8 @@
   
   return projection(orthographic,vCamera,vUp,vTarget,Zoom,
                     2.0*atan(tan(0.5*Angle)/Zoom)/radians,
-                    pair(X/Width*lastzoom+Shift.getx(),
-                         Y/Height*lastzoom+Shift.gety()));
+                    pair(X/Width+Shift.getx(),
+                         Y/Height+Shift.gety()));
 }
 
 void init() 
@@ -1333,7 +1386,6 @@
   glutInit(&argc,argv);
   screenWidth=glutGet(GLUT_SCREEN_WIDTH);
   screenHeight=glutGet(GLUT_SCREEN_HEIGHT);
-  
 #endif
 }
 
@@ -1376,10 +1428,6 @@
   }
 #endif // HAVE_LIBOSMESA
 }
-
-GLuint vertShader,fragShader;
-GLuint vertShaderCol,fragShaderCol;
-
 void initshader()
 {
   Nlights=max(Nlights,nlights);
@@ -1404,45 +1452,47 @@
   std::vector<ShaderfileModePair> shaders;
   shaders.push_back(ShaderfileModePair(vs.c_str(),GL_VERTEX_SHADER));
   shaders.push_back(ShaderfileModePair(fs.c_str(),GL_FRAGMENT_SHADER));
+  if(orthographic)
+    shaderParams.push_back("ORTHOGRAPHIC");
     
-  camp::noNormalShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
-                                            shaderParams);
-
   shaderParams.push_back("WIDTH");
   camp::pixelShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
                                          shaderParams);
   shaderParams.pop_back();
-  
+  camp::noNormalShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
+                                            shaderParams);
   shaderParams.push_back("NORMAL");
   camp::materialShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
                                             shaderParams);
-
-  shaderParams.push_back("EXPLICIT_COLOR");
+  shaderParams.push_back("COLOR");
   camp::colorShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
                                          shaderParams);
+  shaderParams.push_back("TRANSPARENT");
+  camp::transparentShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
+                                               shaderParams);
 }
 
 void deleteshader() 
 {
+  glDeleteProgram(camp::transparentShader);
+  glDeleteProgram(camp::colorShader);
   glDeleteProgram(camp::materialShader);
-  glDeleteProgram(camp::colorShader);
+  glDeleteProgram(camp::pixelShader);
   glDeleteProgram(camp::noNormalShader);
 }
-  
+
+#endif /* HAVE_GL */
+
 // 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,
+              const triple& m, const triple& M, const pair& shift,
+              const pair& margin, double *t,
               double *background, size_t nlightsin, triple *lights,
               double *diffuse, double *specular, bool view, int oldpid)
 {
-  remesh=true;
-  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);
   
@@ -1451,10 +1501,6 @@
   Prefix=prefix;
   Picture=pic;
   Format=format;
-  for(int i=0; i < 16; ++i)
-    T[i]=t[i];
-  for(int i=0; i < 4; ++i)
-    Background[i]=background[i];
   
   nlights0=nlights=nlightsin;
   
@@ -1466,6 +1512,8 @@
   Zoom0=zoom;
   Oldpid=oldpid;
   Shift=shift;
+  Margin=margin;
+  Background=background;
   
   Xmin=m.getx();
   Xmax=M.getx();
@@ -1476,7 +1524,7 @@
   
   orthographic=Angle == 0.0;
   H=orthographic ? 0.0 : -tan(0.5*Angle)*zmax;
-    
+  
   ignorezoom=false;
   Mode=0;
   Xfactor=Yfactor=1.0;
@@ -1487,7 +1535,15 @@
   if(maxTileWidth <= 0) maxTileWidth=1024;
   if(maxTileHeight <= 0) maxTileHeight=768;
 
-  if(offscreen) {
+  bool webgl=Format == "html";
+  
+#ifdef HAVE_GL  
+#ifdef HAVE_PTHREAD
+  static bool initializedView=false;
+#endif  
+  
+  bool offscreen=getSetting<bool>("offscreen");
+  if(offscreen && !webgl) {
     screenWidth=maxTileWidth;
     screenHeight=maxTileHeight;
 
@@ -1499,20 +1555,28 @@
   }
   
   if(glinitialize) {
-    glinitialize=false;
-    init();
+    if(!webgl) init();
     Fitscreen=1;
   }
+#endif
 
   static bool initialized=false;
   if(!initialized || !interact::interactive) {
     antialias=getSetting<Int>("antialias") > 1;
-    double expand=getSetting<double>("render");
-    if(expand < 0)
-      expand *= (Format.empty() || Format == "eps" || Format == "pdf") 
-        ? -2.0 : -1.0;
-    if(antialias) expand *= 2.0;
+    double expand;
+    if(webgl)
+      expand=1.0;
+    else {
+      expand=getSetting<double>("render");
+      if(expand < 0)
+        expand *= (Format.empty() || Format == "eps" || Format == "pdf")                 ? -2.0 : -1.0;
+      if(antialias) expand *= 2.0;
+    }
   
+    oWidth=width;
+    oHeight=height;
+    Aspect=width/height;
+  
     // Force a hard viewport limit to work around direct rendering bugs.
     // Alternatively, one can use -glOptions=-indirect (with a performance
     // penalty).
@@ -1521,26 +1585,40 @@
     maxHeight=(int) ceil(maxViewport.gety());
     if(maxWidth <= 0) maxWidth=max(maxHeight,2);
     if(maxHeight <= 0) maxHeight=max(maxWidth,2);
-    if(screenWidth <= 0) screenWidth=maxWidth;
-    else screenWidth=min(screenWidth,maxWidth);
-    if(screenHeight <= 0) screenHeight=maxHeight;
-    else screenHeight=min(screenHeight,maxHeight);
-  
-    oWidth=width;
-    oHeight=height;
-    Aspect=width/height;
-  
+    
     fullWidth=(int) ceil(expand*width);
     fullHeight=(int) ceil(expand*height);
   
-    Width=min(fullWidth,screenWidth);
-    Height=min(fullHeight,screenHeight);
+    if(webgl) {
+      Width=fullWidth;
+      Height=fullHeight;
+    } else {
+      if(screenWidth <= 0) screenWidth=maxWidth;
+      else screenWidth=min(screenWidth,maxWidth);
+      if(screenHeight <= 0) screenHeight=maxHeight;
+      else screenHeight=min(screenHeight,maxHeight);
+
+      Width=min(fullWidth,screenWidth);
+      Height=min(fullHeight,screenHeight);
   
-    if(Width > Height*Aspect) 
-      Width=min((int) (ceil(Height*Aspect)),screenWidth);
-    else 
-      Height=min((int) (ceil(Width/Aspect)),screenHeight);
+      if(Width > Height*Aspect) 
+        Width=min((int) (ceil(Height*Aspect)),screenWidth);
+      else 
+        Height=min((int) (ceil(Width/Aspect)),screenHeight);
+    }
   
+    home(webgl);
+    setProjection();
+    
+    if(webgl) return;
+    
+    ArcballFactor=1+8.0*hypot(Margin.getx(),Margin.gety())/hypot(Width,Height);
+
+#ifdef HAVE_GL    
+    for(int i=0; i < 16; ++i)
+      T[i]=t[i];
+  
+    remesh=true;
     Aspect=((double) Width)/Height;
 
     if(maxTileWidth <= 0) maxTileWidth=screenWidth;
@@ -1552,8 +1630,10 @@
     if(View && settings::verbose > 1)
       cout << "Rendering " << stripDir(prefix) << " as "
            << Width << "x" << Height << " image" << endl;
+#endif    
   }
 
+#ifdef HAVE_GL    
   bool havewindow=initialized && glthread && !offscreen;
   
 #ifdef HAVE_LIBGLUT    
@@ -1637,13 +1717,6 @@
 #endif // HAVE_LIBGLUT
   initialized=true;
 
-  int result = glewInit();
-
-  if (result != GLEW_OK) {
-    cerr << "GLEW initialization error." << endl;
-    exit(-1);
-  }
-  
   GLint val;
   glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE,&val);
   Maxmaterials=val/sizeof(Material);
@@ -1651,8 +1724,20 @@
 
   glGetIntegerv(GL_MAX_ELEMENTS_VERTICES,&Maxvertices);
 
-  home();
+  if(glinitialize) {
+    glinitialize=false;
+    int result = glewInit();
+
+    if (result != GLEW_OK) {
+      cerr << "GLEW initialization error." << endl;
+      exit(-1);
+    }
     
+    initshader();
+  }
+  
+  glClearColor(Background[0],Background[1],Background[2],Background[3]);
+    
 #ifdef HAVE_LIBGLUT
   if(!offscreen) {
     Animate=getSetting<bool>("autoplay") && glthread;
@@ -1666,8 +1751,6 @@
   }
 #endif
 
-  initshader();
-  
   glEnable(GL_BLEND);
   glEnable(GL_DEPTH_TEST);
   glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
@@ -1684,7 +1767,7 @@
     glutKeyboardFunc(keyboard);
     glutMouseFunc(mouse);
     glutDisplayFunc(display);
-  
+
     glutMainLoop();
 #endif // HAVE_LIBGLUT
   } else {
@@ -1705,10 +1788,16 @@
       quit();
     }
   }
+  
+#endif /* HAVE_GL */  
 }
 
 } // namespace gl
 
+#endif
+
+#ifdef HAVE_GL
+
 namespace camp {
 
 string getLightIndex(size_t const& index, string const& fieldName) {
@@ -1717,63 +1806,205 @@
   return Strdup(buf.str());
 } 
 
+string getCenterIndex(size_t const& index) {
+  ostringstream buf;
+  buf << "Centers[" << index << "]";
+  return Strdup(buf.str());
+} 
+
 void setUniforms(GLint shader)
 {
   if(gl::nlights > gl::Nlights || nmaterials > Nmaterials) {
     gl::deleteshader();
     gl::initshader();
+    gl::lastshader=-1;
   }
   
-  glUseProgram(shader);
+  bool normal=shader != pixelShader && shader != noNormalShader;
+    
+  if(shader != gl::lastshader) {
+    glUseProgram(shader);
+    gl::lastshader=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));
+    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;
+      glUniform3f(glGetUniformLocation(shader,
+                                       getLightIndex(i,"direction").c_str()),
+                  (GLfloat) Lighti.getx(),(GLfloat) Lighti.gety(),
+                  (GLfloat) Lighti.getz());
 
+      glUniform3f(glGetUniformLocation(shader,
+                                       getLightIndex(i,"color").c_str()),
+                  (GLfloat) gl::Diffuse[i4],(GLfloat) gl::Diffuse[i4+1],
+                  (GLfloat) gl::Diffuse[i4+2]);
+    }
+
+#if HAVE_LIBOPENIMAGEIO
+    // textures
+    if (settings::getSetting<bool>("envmap")) { 
+      glActiveTexture(GL_TEXTURE1);
+      glBindBuffer(GL_TEXTURE_2D, gl::envMapBuf);
+      glUniform1i(glGetUniformLocation(shader, "environmentMap"), 1);
+      glActiveTexture(GL_TEXTURE0);
+    }
+#endif
+  }
+  
   GLuint binding=0;
   GLint blockindex=glGetUniformBlockIndex(shader,"MaterialBuffer");
   glUniformBlockBinding(shader,blockindex,binding);
     
-  GLuint ubo;
-  glGenBuffers(1,&ubo);
-  glBindBuffer(GL_UNIFORM_BUFFER,ubo);
+  glGenBuffers(1,&gl::ubo);
+  glBindBuffer(GL_UNIFORM_BUFFER,gl::ubo);
     
-  glBufferData(GL_UNIFORM_BUFFER,drawElement::material.size()*sizeof(Material),
-               drawElement::material.data(),GL_STATIC_DRAW);
-  glBindBufferBase(GL_UNIFORM_BUFFER,binding,ubo);
+  glBufferData(GL_UNIFORM_BUFFER,material.size()*sizeof(Material),
+               material.data(),GL_STATIC_DRAW);
+  glBindBufferBase(GL_UNIFORM_BUFFER,binding,gl::ubo);
   
-  glUniform1i(glGetUniformLocation(shader,"nlights"),gl::nlights);
+  glUniformMatrix4fv(glGetUniformLocation(shader,"projViewMat"),1,GL_FALSE, value_ptr(gl::projViewMat));
   
-  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);
+  glUniformMatrix4fv(glGetUniformLocation(shader,"viewMat"),1,GL_FALSE, value_ptr(gl::viewMat));
+  
+  if(normal)
+    glUniformMatrix3fv(glGetUniformLocation(shader,"normMat"),1,GL_FALSE, value_ptr(gl::normMat));
+}
 
-    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,"specular").c_str()),
-                (GLfloat) gl::Specular[i4],(GLfloat) gl::Specular[i4+1],
-                (GLfloat) gl::Specular[i4+2],(GLfloat) gl::Specular[i4+3]);
+void deleteUniforms()
+{
+  glBindBuffer(GL_UNIFORM_BUFFER,0);
+  glDeleteBuffers(1,&gl::ubo);
+}
+  
+void drawBuffer(vertexBuffer& data, GLint shader)
+{
+  if(data.indices.empty()) return;
+  
+  bool pixel=shader == pixelShader;
+  bool normal=!pixel && (shader != noNormalShader);
+  bool color=shader == colorShader || shader == transparentShader;
+  
+  const size_t size=sizeof(GLfloat);
+  const size_t intsize=sizeof(GLint);
+  const size_t bytestride=color ? sizeof(VertexData) :
+    (normal ? sizeof(vertexData) :
+     (pixel ? sizeof(vertexData0) : sizeof(vertexData1)));
+
+  GLuint vertsBufferIndex;
+  GLuint elemBufferIndex; 
+
+  GLuint vao;
+  
+  glGenVertexArrays(1,&vao);
+  glBindVertexArray(vao);
+
+  glGenBuffers(1,&vertsBufferIndex);
+  glGenBuffers(1,&elemBufferIndex);
+  
+  if(color) registerBuffer(data.Vertices,vertsBufferIndex);
+  else if(normal) registerBuffer(data.vertices,vertsBufferIndex);
+  else if(pixel) registerBuffer(data.vertices0,vertsBufferIndex);
+  else registerBuffer(data.vertices1,vertsBufferIndex);
+  
+  registerBuffer(data.indices,elemBufferIndex);
+  
+  glBindBuffer(GL_ARRAY_BUFFER,vertsBufferIndex);
+  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,elemBufferIndex);
+
+  camp::setUniforms(shader);
+
+  const GLint posAttrib=glGetAttribLocation(shader,"position");
+  const GLint materialAttrib=glGetAttribLocation(shader,"material");
+  GLint normalAttrib,colorAttrib,widthAttrib=0;
+  
+  glVertexAttribPointer(posAttrib,3,GL_FLOAT,GL_FALSE,bytestride,(void *) 0);
+  glEnableVertexAttribArray(posAttrib);
+    
+  if(normal) {
+    normalAttrib=glGetAttribLocation(shader,"normal");
+    glVertexAttribPointer(normalAttrib,3,GL_FLOAT,GL_FALSE,bytestride,
+                          (void *) (3*size));
+    glEnableVertexAttribArray(normalAttrib);
+  } else if(pixel) {
+    widthAttrib=glGetAttribLocation(shader,"width");
+    glVertexAttribPointer(widthAttrib,1,GL_FLOAT,GL_FALSE,bytestride,
+                          (void *) (3*size));
+    glEnableVertexAttribArray(widthAttrib);
   }
+    
+  glVertexAttribIPointer(materialAttrib,1,GL_INT,bytestride, 
+                         (void *) ((normal ? 6 : (pixel ? 4 : 3))*size));
+  glEnableVertexAttribArray(materialAttrib);
 
-#if HAVE_LIBOPENIMAGEIO
-  // textures
-  if (settings::getSetting<bool>("envmap")) { 
-    glActiveTexture(GL_TEXTURE1);
-    glBindBuffer(GL_TEXTURE_2D, gl::envMapBuf);
-    glUniform1i(glGetUniformLocation(shader, "environmentMap"), 1);
-    glActiveTexture(GL_TEXTURE0);
+  if(color) {
+    colorAttrib=glGetAttribLocation(shader,"color");
+    glVertexAttribPointer(colorAttrib,4,GL_UNSIGNED_BYTE,GL_TRUE,bytestride,
+                          (void *) (6*size+intsize));
+    glEnableVertexAttribArray(colorAttrib);
   }
-#endif
+  
+  glFlush(); // Workaround broken MSWindows drivers for Intel GPU
+  glDrawElements(normal ? GL_TRIANGLES : (pixel ? GL_POINTS : GL_LINES),
+                 data.indices.size(),GL_UNSIGNED_INT,(void *) 0);
+
+  glDisableVertexAttribArray(posAttrib);
+  if(normal)
+   glDisableVertexAttribArray(normalAttrib);
+  if(pixel)
+   glDisableVertexAttribArray(widthAttrib);
+  glDisableVertexAttribArray(materialAttrib);
+  if(color)
+    glDisableVertexAttribArray(colorAttrib);
+  
+  deleteUniforms();
+  
+  glBindBuffer(GL_ARRAY_BUFFER,0);
+  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+  glBindVertexArray(0);
+  glDeleteVertexArrays(1,&vao);
+  
+  glDeleteBuffers(1,&vertsBufferIndex);
+  glDeleteBuffers(1,&elemBufferIndex);
 }
 
+void drawBuffers() 
+{
+  drawBuffer(material0Data,pixelShader);
+  drawBuffer(material1Data,noNormalShader);
+  drawBuffer(materialData,materialShader);
+  drawBuffer(colorData,colorShader);
+  drawBuffer(triangleData,transparentShader);
+  sortTriangles();
+  
+  glDepthMask(GL_FALSE); // Enable transparency
+  drawBuffer(transparentData,transparentShader);
+  glDepthMask(GL_TRUE); // Disable transparency
 }
 
-#endif
+void clearBuffers()
+{
+  material0Data.clear();
+  material1Data.clear();
+  materialData.clear();
+  colorData.clear();
+  triangleData.clear();
+  transparentData.clear();
+}
+
+void clearMaterialBuffer(bool draw)
+{
+  if(draw)
+    drawBuffers();
+  material.clear();
+  material.reserve(nmaterials);
+  materialMap.clear();
+  materialIndex=0;
+}
+
+
+}
+
+#endif /* HAVE_GL */

Modified: trunk/Build/source/utils/asymptote/glrender.h
===================================================================
--- trunk/Build/source/utils/asymptote/glrender.h	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/glrender.h	2019-10-06 17:17:34 UTC (rev 52300)
@@ -9,6 +9,13 @@
 #include "common.h"
 #include "triple.h"
 
+#ifdef HAVE_LIBGLM
+#include <glm/glm.hpp>
+#include <glm/gtc/matrix_transform.hpp>
+#include <glm/gtc/type_ptr.hpp>
+#include <glm/gtx/transform.hpp>
+#endif
+
 #ifdef HAVE_GL
 
 #include <csignal>
@@ -47,6 +54,17 @@
 #endif
 #endif
 
+#else
+typedef unsigned int GLuint;
+typedef int GLint;
+typedef float GLfloat;
+typedef double GLdouble;
+#endif
+
+#ifdef HAVE_LIBGLM
+#include "material.h"
+#endif
+
 namespace camp {
 class picture;
 
@@ -78,9 +96,24 @@
 
 extern bool outlinemode;
 extern bool wireframeMode;
-extern Int maxvertices;
+extern size_t maxvertices;
 extern bool forceRemesh;
 
+extern bool orthographic;
+extern double xmin,xmax;
+extern double ymin,ymax;
+extern double zmin,zmax;
+extern int fullWidth,fullHeight;
+extern double Zoom0;
+extern double Angle;
+extern double Zoom0;
+extern camp::pair Margin;
+
+extern camp::triple *Lights; 
+extern size_t nlights;
+extern double *Diffuse;
+extern double *Background;
+
 struct projection 
 {
 public:
@@ -100,72 +133,255 @@
     zoom(zoom), angle(angle), viewportshift(viewportshift) {}
 };
 
+#ifdef HAVE_GL
+extern GLuint ubo;
 GLuint initHDR();
 
+void setUniforms(GLint shader);
+void deleteUniforms();
+#endif
+
 projection camera(bool user=true);
 
 void glrender(const string& prefix, const camp::picture* pic,
               const string& format, double width, double height, double angle,
               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 *specular, bool view, int oldpid=0);
+              const camp::pair& shift, const camp::pair& margin, double *t,
+              double *background, size_t nlights, camp::triple *lights,
+              double *diffuse, double *specular, bool view, int oldpid=0);
 
-struct ModelView {
-  double T[16];
-  double Tinv[16];
-};
+extern const double *dprojView;
 
-extern ModelView modelView;
-
 void initshader();
 void deleteshader();
 
+extern double BBT[9];
+
 }
 
 namespace camp {
 
-struct billboard 
-{
+struct Billboard {
   double cx,cy,cz;
-  triple u,v,w;
   
   void init(const triple& center) {
     cx=center.getx();
     cy=center.gety();
     cz=center.getz();
-    gl::projection P=gl::camera(false);
-    w=unit(P.camera-P.target);
-    v=unit(perp(P.up,w));
-    u=cross(v,w);
   }
     
-  triple transform(const triple& V) {
-    double x=V.getx()-cx;
-    double y=V.gety()-cy;
-    double z=V.getz()-cz;
+  triple transform(const triple& v) const {
+    double x=v.getx()-cx;
+    double y=v.gety()-cy;
+    double z=v.getz()-cz;
     
-    return triple(cx+u.getx()*x+v.getx()*y+w.getx()*z,
-                  cy+u.gety()*x+v.gety()*y+w.gety()*z,
-                  cz+u.getz()*x+v.getz()*y+w.getz()*z);
+    return triple(x*gl::BBT[0]+y*gl::BBT[3]+z*gl::BBT[6]+cx,
+                  x*gl::BBT[1]+y*gl::BBT[4]+z*gl::BBT[7]+cy,
+                  x*gl::BBT[2]+y*gl::BBT[5]+z*gl::BBT[8]+cz);
   }
+};
+
+extern Billboard BB;
+
+#ifdef HAVE_LIBGLM
+typedef mem::map<CONST Material,size_t> MaterialMap;
+
+extern mem::vector<Material> material;
+extern MaterialMap materialMap;
+extern size_t materialIndex;
+extern int MaterialIndex;
+#endif
+
+#ifdef HAVE_GL
+
+extern const size_t Nbuffer; // Initial size of 2D dynamic buffers
+extern const size_t nbuffer; // Initial size of 0D & 1D dynamic buffers
+
+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=MaterialIndex;
+  }
+};
+
+class VertexData
+{
+public:
+  GLfloat position[3];
+  GLfloat normal[3];
+  GLint material;
+  GLubyte color[4];
+  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=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();
+    material=MaterialIndex;
+    color[0]=(int)(bytescale*c[0]);
+    color[1]=(int)(bytescale*c[1]);
+    color[2]=(int)(bytescale*c[2]);
+    color[3]=(int)(bytescale*c[3]);
+  }
+};
+
+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=MaterialIndex;
+  }
+};
+
+class vertexData0 {
+public:
+  GLfloat position[3];
+  GLfloat width;
+  GLint  material;
+  vertexData0() {};
+  vertexData0(const triple& v, double width) : width(width) {
+    position[0]=v.getx();
+    position[1]=v.gety();
+    position[2]=v.getz();
+    material=MaterialIndex;
+  }
+};
+
+class vertexBuffer {
+public:  
+  std::vector<vertexData> vertices;
+  std::vector<VertexData> Vertices;
+  std::vector<vertexData1> vertices1;
+  std::vector<vertexData0> vertices0;
+  std::vector<GLuint> indices;
+  void clear() {
+    vertices.clear();
+    Vertices.clear();
+    vertices1.clear();
+    vertices0.clear();
+    indices.clear();
+    vertices.reserve(Nbuffer);
+    Vertices.reserve(Nbuffer);
+    vertices1.reserve(nbuffer);
+    vertices0.reserve(nbuffer);
+    indices.reserve(Nbuffer);
+  }
   
-  void store(GLfloat* C, const triple& V) {
-    double x=V.getx()-cx;
-    double y=V.gety()-cy;
-    double z=V.getz()-cz;
-    C[0]=cx+u.getx()*x+v.getx()*y+w.getx()*z;
-    C[1]=cy+u.gety()*x+v.gety()*y+w.gety()*z;
-    C[2]=cz+u.getz()*x+v.getz()*y+w.getz()*z;
+// Store the vertex v and its normal vector n.
+  GLuint vertex(const triple &v, const triple& n) {
+    size_t nvertices=vertices.size();
+    vertices.push_back(vertexData(v,n));
+    return nvertices;
+  }     
+  
+// Store the vertex v and its normal vector n, without an explicit color.
+  GLuint tvertex(const triple &v, const triple& n) {
+    size_t nvertices=Vertices.size();
+    Vertices.push_back(VertexData(v,n));
+    return nvertices;
   }
+  
+// Store the vertex v, its normal vector n, and colors c.
+  GLuint Vertex(const triple &v, const triple& n, GLfloat *c) {
+    size_t nvertices=Vertices.size();
+    Vertices.push_back(VertexData(v,n,c));
+    return nvertices;
+  }     
+  
+// Store the vertex v.
+  GLuint vertex1(const triple &v) {
+    size_t nvertices=vertices1.size();
+    vertices1.push_back(vertexData1(v));
+    return nvertices;
+  }     
+  
+// Store the pixel v and its width.
+  GLuint vertex0(const triple &v, double width) {
+    size_t nvertices=vertices0.size();
+    vertices0.push_back(vertexData0(v,width));
+    return nvertices;
+  }     
+  
+  // append array b onto array a with offset
+  void appendOffset(std::vector<GLuint>& a,
+                    const std::vector<GLuint>& b, size_t offset) {
+    size_t n=a.size();
+    size_t m=b.size();
+    a.resize(n+m);
+    for(size_t i=0; i < m; ++i)
+      a[n+i]=b[i]+offset;
+  }
+
+  // append array b onto array a
+  void append(const vertexBuffer& b) {
+    appendOffset(indices,b.indices,vertices.size());
+    vertices.insert(vertices.end(),b.vertices.begin(),b.vertices.end());
+  }
+  
+  void Append(const vertexBuffer& b) {
+    appendOffset(indices,b.indices,Vertices.size());
+    Vertices.insert(Vertices.end(),b.Vertices.begin(),b.Vertices.end());
+  }
+  
+  void append1(const vertexBuffer& b) {
+    appendOffset(indices,b.indices,vertices1.size());
+    vertices1.insert(vertices1.end(),b.vertices1.begin(),b.vertices1.end());
+  }
+  
+  void append0(const vertexBuffer& b) {
+    appendOffset(indices,b.indices,vertices0.size());
+    vertices0.insert(vertices0.end(),b.vertices0.begin(),b.vertices0.end());
+  }
+
 };
 
-extern billboard BB;
+extern GLint pixelShader;
+extern GLint noNormalShader;
+extern GLint materialShader;
+extern GLint colorShader;
+extern GLint transparentShader;
 
-}
+extern vertexBuffer material0Data;   // pixels
+extern vertexBuffer material1Data;   // material Bezier curves
+extern vertexBuffer materialData;    // material Bezier patches & triangles
+extern vertexBuffer colorData;       // colored Bezier patches & triangles
+extern vertexBuffer transparentData; // transparent patches & triangles
+extern vertexBuffer triangleData;    // opaque indexed triangles
 
-#else
-typedef float GLfloat;
+extern void drawBuffer(vertexBuffer& data, GLint shader);
+extern void drawBuffers(); 
+extern void clearBuffers();
+extern void clearMaterialBuffer(bool draw=false);
+
 #endif
 
+}
+
 #endif

Modified: trunk/Build/source/utils/asymptote/install-sh
===================================================================
--- trunk/Build/source/utils/asymptote/install-sh	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/install-sh	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2018-03-11.20; # UTC
+scriptversion=2009-04-28.21; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -35,21 +35,25 @@
 # FSF changes to this file are in the public domain.
 #
 # Calling this script install-sh is preferred over install.sh, to prevent
-# 'make' implicit rules from creating a file called install from it
+# `make' implicit rules from creating a file called install from it
 # when there is no Makefile.
 #
 # This script is compatible with the BSD install script, but was written
 # from scratch.
 
-tab='	'
 nl='
 '
-IFS=" $tab$nl"
+IFS=" ""	$nl"
 
-# Set DOITPROG to "echo" to test this script.
+# set DOITPROG to echo to test this script
 
+# Don't use :- since 4.3BSD and earlier shells don't like it.
 doit=${DOITPROG-}
-doit_exec=${doit:-exec}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
 
 # Put in absolute file names if you don't have them in your path;
 # or use environment vars.
@@ -64,6 +68,17 @@
 rmprog=${RMPROG-rm}
 stripprog=${STRIPPROG-strip}
 
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
 posix_mkdir=
 
 # Desired mode of installed file.
@@ -82,7 +97,7 @@
 dst_arg=
 
 copy_on_change=false
-is_target_a_directory=possibly
+no_target_directory=
 
 usage="\
 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@@ -122,41 +137,36 @@
     -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
-        shift;;
+	shift;;
 
     --help) echo "$usage"; exit $?;;
 
     -m) mode=$2
-        case $mode in
-          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
-            echo "$0: invalid mode: $mode" >&2
-            exit 1;;
-        esac
-        shift;;
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
 
     -o) chowncmd="$chownprog $2"
-        shift;;
+	shift;;
 
     -s) stripcmd=$stripprog;;
 
-    -t)
-        is_target_a_directory=always
-        dst_arg=$2
-        # Protect names problematic for 'test' and other utilities.
-        case $dst_arg in
-          -* | [=\(\)!]) dst_arg=./$dst_arg;;
-        esac
-        shift;;
+    -t) dst_arg=$2
+	shift;;
 
-    -T) is_target_a_directory=never;;
+    -T) no_target_directory=true;;
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
-    --) shift
-        break;;
+    --)	shift
+	break;;
 
-    -*) echo "$0: invalid option: $1" >&2
-        exit 1;;
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
 
     *)  break;;
   esac
@@ -163,16 +173,6 @@
   shift
 done
 
-# We allow the use of options -d and -T together, by making -d
-# take the precedence; this is for compatibility with GNU install.
-
-if test -n "$dir_arg"; then
-  if test -n "$dst_arg"; then
-    echo "$0: target directory not allowed when installing a directory." >&2
-    exit 1
-  fi
-fi
-
 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
   # When -d is used, all remaining arguments are directories to create.
   # When -t is used, the destination is already specified.
@@ -186,10 +186,6 @@
     fi
     shift # arg
     dst_arg=$arg
-    # Protect names problematic for 'test' and other utilities.
-    case $dst_arg in
-      -* | [=\(\)!]) dst_arg=./$dst_arg;;
-    esac
   done
 fi
 
@@ -198,27 +194,14 @@
     echo "$0: no input file specified." >&2
     exit 1
   fi
-  # It's OK to call 'install-sh -d' without argument.
+  # It's OK to call `install-sh -d' without argument.
   # This can happen when creating conditional directories.
   exit 0
 fi
 
 if test -z "$dir_arg"; then
-  if test $# -gt 1 || test "$is_target_a_directory" = always; then
-    if test ! -d "$dst_arg"; then
-      echo "$0: $dst_arg: Is not a directory." >&2
-      exit 1
-    fi
-  fi
-fi
+  trap '(exit $?); exit' 1 2 13 15
 
-if test -z "$dir_arg"; then
-  do_exit='(exit $ret); exit $ret'
-  trap "ret=129; $do_exit" 1
-  trap "ret=130; $do_exit" 2
-  trap "ret=141; $do_exit" 13
-  trap "ret=143; $do_exit" 15
-
   # Set umask so as not to create temps with too-generous modes.
   # However, 'strip' requires both read and write access to temps.
   case $mode in
@@ -228,16 +211,16 @@
 
     *[0-7])
       if test -z "$stripcmd"; then
-        u_plus_rw=
+	u_plus_rw=
       else
-        u_plus_rw='% 200'
+	u_plus_rw='% 200'
       fi
       cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
     *)
       if test -z "$stripcmd"; then
-        u_plus_rw=
+	u_plus_rw=
       else
-        u_plus_rw=,u+rw
+	u_plus_rw=,u+rw
       fi
       cp_umask=$mode$u_plus_rw;;
   esac
@@ -245,9 +228,9 @@
 
 for src
 do
-  # Protect names problematic for 'test' and other utilities.
+  # Protect names starting with `-'.
   case $src in
-    -* | [=\(\)!]) src=./$src;;
+    -*) src=./$src;;
   esac
 
   if test -n "$dir_arg"; then
@@ -269,115 +252,129 @@
       echo "$0: no destination specified." >&2
       exit 1
     fi
+
     dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
 
-    # If destination is a directory, append the input filename.
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
     if test -d "$dst"; then
-      if test "$is_target_a_directory" = never; then
-        echo "$0: $dst_arg: Is a directory" >&2
-        exit 1
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
       fi
       dstdir=$dst
-      dstbase=`basename "$src"`
-      case $dst in
-	*/) dst=$dst$dstbase;;
-	*)  dst=$dst/$dstbase;;
-      esac
+      dst=$dstdir/`basename "$src"`
       dstdir_status=0
     else
-      dstdir=`dirname "$dst"`
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
       test -d "$dstdir"
       dstdir_status=$?
     fi
   fi
 
-  case $dstdir in
-    */) dstdirslash=$dstdir;;
-    *)  dstdirslash=$dstdir/;;
-  esac
-
   obsolete_mkdir_used=false
 
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
-        # Create intermediate dirs using mode 755 as modified by the umask.
-        # This is like FreeBSD 'install' as of 1997-10-28.
-        umask=`umask`
-        case $stripcmd.$umask in
-          # Optimize common cases.
-          *[2367][2367]) mkdir_umask=$umask;;
-          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
 
-          *[0-7])
-            mkdir_umask=`expr $umask + 22 \
-              - $umask % 100 % 40 + $umask % 20 \
-              - $umask % 10 % 4 + $umask % 2
-            `;;
-          *) mkdir_umask=$umask,go-w;;
-        esac
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
 
-        # With -d, create the new directory with the user-specified mode.
-        # Otherwise, rely on $mkdir_umask.
-        if test -n "$dir_arg"; then
-          mkdir_mode=-m$mode
-        else
-          mkdir_mode=
-        fi
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
 
-        posix_mkdir=false
-        case $umask in
-          *[123567][0-7][0-7])
-            # POSIX mkdir -p sets u+wx bits regardless of umask, which
-            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-            ;;
-          *)
-            # Note that $RANDOM variable is not portable (e.g. dash);  Use it
-            # here however when possible just to lower collision chance.
-            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
 
-            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-            # Because "mkdir -p" follows existing symlinks and we likely work
-            # directly in world-writeable /tmp, make sure that the '$tmpdir'
-            # directory is successfully created first before we actually test
-            # 'mkdir -p' feature.
-            if (umask $mkdir_umask &&
-                $mkdirprog $mkdir_mode "$tmpdir" &&
-                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
-            then
-              if test -z "$dir_arg" || {
-                   # Check for POSIX incompatibilities with -m.
-                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-                   # other-writable bit of parent directory when it shouldn't.
-                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-                   test_tmpdir="$tmpdir/a"
-                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
-                   case $ls_ld_tmpdir in
-                     d????-?r-*) different_mode=700;;
-                     d????-?--*) different_mode=755;;
-                     *) false;;
-                   esac &&
-                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
-                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
-                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-                   }
-                 }
-              then posix_mkdir=:
-              fi
-              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
-            else
-              # Remove any dirs left behind by ancient mkdir implementations.
-              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
-            fi
-            trap '' 0;;
-        esac;;
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
     esac
 
     if
       $posix_mkdir && (
-        umask $mkdir_umask &&
-        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
       )
     then :
     else
@@ -387,17 +384,19 @@
       # directory the slow way, step by step, checking for races as we go.
 
       case $dstdir in
-        /*) prefix='/';;
-        [-=\(\)!]*) prefix='./';;
-        *)  prefix='';;
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
       esac
 
+      eval "$initialize_posix_glob"
+
       oIFS=$IFS
       IFS=/
-      set -f
+      $posix_glob set -f
       set fnord $dstdir
       shift
-      set +f
+      $posix_glob set +f
       IFS=$oIFS
 
       prefixes=
@@ -404,34 +403,34 @@
 
       for d
       do
-        test X"$d" = X && continue
+	test -z "$d" && continue
 
-        prefix=$prefix$d
-        if test -d "$prefix"; then
-          prefixes=
-        else
-          if $posix_mkdir; then
-            (umask=$mkdir_umask &&
-             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-            # Don't fail if two instances are running concurrently.
-            test -d "$prefix" || exit 1
-          else
-            case $prefix in
-              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-              *) qprefix=$prefix;;
-            esac
-            prefixes="$prefixes '$qprefix'"
-          fi
-        fi
-        prefix=$prefix/
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
       done
 
       if test -n "$prefixes"; then
-        # Don't fail if two instances are running concurrently.
-        (umask $mkdir_umask &&
-         eval "\$doit_exec \$mkdirprog $prefixes") ||
-          test -d "$dstdir" || exit 1
-        obsolete_mkdir_used=true
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
       fi
     fi
   fi
@@ -444,25 +443,14 @@
   else
 
     # Make a couple of temp file names in the proper directory.
-    dsttmp=${dstdirslash}_inst.$$_
-    rmtmp=${dstdirslash}_rm.$$_
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
 
     # Trap to clean up those temp files at exit.
     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
 
     # Copy the file name to the temp name.
-    (umask $cp_umask &&
-     { test -z "$stripcmd" || {
-	 # Create $dsttmp read-write so that cp doesn't create it read-only,
-	 # which would cause strip to fail.
-	 if test -z "$doit"; then
-	   : >"$dsttmp" # No need to fork-exec 'touch'.
-	 else
-	   $doit touch "$dsttmp"
-	 fi
-       }
-     } &&
-     $doit_exec $cpprog "$src" "$dsttmp") &&
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
 
     # and set any options; do chmod last to preserve setuid bits.
     #
@@ -477,12 +465,15 @@
 
     # If -C, don't bother to copy if it wouldn't change the file.
     if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
-       set -f &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
        set X $old && old=:$2:$4:$5:$6 &&
        set X $new && new=:$2:$4:$5:$6 &&
-       set +f &&
+       $posix_glob set +f &&
+
        test "$old" = "$new" &&
        $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
     then
@@ -495,24 +486,24 @@
       # to itself, or perhaps because mv is so ancient that it does not
       # support -f.
       {
-        # Now remove or move aside any old file at destination location.
-        # We try this two ways since rm can't unlink itself on some
-        # systems and the destination file might be busy for other
-        # reasons.  In this case, the final cleanup might fail but the new
-        # file should still install successfully.
-        {
-          test ! -f "$dst" ||
-          $doit $rmcmd -f "$dst" 2>/dev/null ||
-          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-          } ||
-          { echo "$0: cannot unlink or rename $dst" >&2
-            (exit 1); exit 1
-          }
-        } &&
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
 
-        # Now rename the file to the real destination.
-        $doit $mvcmd "$dsttmp" "$dst"
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
       }
     fi || exit 1
 
@@ -521,9 +512,9 @@
 done
 
 # Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
+# eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC0"
+# time-stamp-time-zone: "UTC"
 # time-stamp-end: "; # UTC"
 # End:

Added: trunk/Build/source/utils/asymptote/jsfile.cc
===================================================================
--- trunk/Build/source/utils/asymptote/jsfile.cc	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/jsfile.cc	2019-10-06 17:17:34 UTC (rev 52300)
@@ -0,0 +1,222 @@
+#include "jsfile.h"
+
+#include "settings.h"
+#include "glrender.h"
+#include "drawelement.h"
+
+#ifdef HAVE_LIBGLM
+
+using namespace settings;
+
+namespace camp {
+
+void jsfile::copy(string name) {
+  std::ifstream fin(locateFile(name).c_str());
+  string s;
+  while(getline(fin,s))
+    out << s << newl;
+}
+
+void jsfile::open(string name) {
+  out.open(name);
+  out << "<!DOCTYPE html>" << newl << newl;
+    
+  bool absolute=getSetting<bool>("absolute");
+  if(!absolute)
+    out << "<!-- Use the following line to include this file within another web page:" << newl
+      << newl
+      << "<object data=\"" << name <<"\" style=\"width:"
+      << gl::fullWidth << ";height:" << gl::fullHeight
+      << ";position:relative;top:0;left:0;\"></object>" << newl << newl
+      << "-->" << newl << newl;
+
+  out.precision(getSetting<Int>("digits"));
+  copy(locateFile(WebGLheader));
+  
+  if(getSetting<bool>("offline")) {
+    out << "<script>" << newl;
+    copy(locateFile(AsyGL));
+    out << "</script>" << newl;
+  } else {
+    out << "<script type=\"text/javascript\"" << newl << "src=\""
+        << getSetting<string>("asygl") << "\"></script>" << newl;
+  }
+  out << "<script type=\"text/javascript\">" << newl;
+  out << newl
+      << "canvasWidth=" << gl::fullWidth << ";" << newl
+      << "canvasHeight=" << gl::fullHeight << ";" << newl
+      << "absolute=" << std::boolalpha << absolute << ";" << newl
+      << newl
+      <<  "b=[" << gl::xmin << "," << gl::ymin << "," << gl::zmin << "];" 
+      << newl
+      <<  "B=[" << gl::xmax << "," << gl::ymax << "," << gl::zmax << "];" 
+      << newl
+      << "orthographic=" << gl::orthographic << ";"
+      << newl
+      << "angle=" << gl::Angle << ";"
+      << newl
+      << "Zoom0=" << gl::Zoom0 << ";" << newl
+       << "zoomFactor=" << getSetting<double>("zoomfactor") << ";" << newl
+      << "zoomPinchFactor=" << getSetting<double>("zoomPinchFactor") << ";"
+      << newl
+      << "zoomPinchCap=" << getSetting<double>("zoomPinchCap") << ";" << newl
+      << "zoomStep=" << getSetting<double>("zoomstep") << ";" << newl
+      << "shiftHoldDistance=" << getSetting<double>("shiftHoldDistance") << ";"
+      << newl
+      << "shiftWaitTime=" << getSetting<double>("shiftWaitTime") << ";"
+      << newl
+      << "vibrateTime=" << getSetting<double>("vibrateTime") << ";"
+      << newl
+     << "viewportmargin=" << gl::Margin << ";" << newl << newl
+      << "Lights=[";
+  for(size_t i=0; i < gl::nlights; ++i) {
+    size_t i4=4*i;
+    out << "new Light(" << newl
+        << "direction=" << gl::Lights[i] << "," << newl 
+        << "color=[" << gl::Diffuse[i4] << "," << gl::Diffuse[i4+1] << ","
+        << gl::Diffuse[i4+2] << "])," << newl;
+  }
+  out << "];" << newl << newl;
+  out << "Background=[" << gl::Background[0] << "," << gl::Background[1] << ","
+      << gl::Background[2] << "," << gl::Background[3] << "];"
+      << newl;
+
+  size_t nmaterials=material.size();
+  out << "Materials=[";
+  for(size_t i=0; i < nmaterials; ++i)
+    out << "new Material(" << newl
+        << material[i]
+        << ")," << newl;
+  out << "];" << newl << newl;
+}
+
+jsfile::~jsfile() {
+  size_t ncenters=drawElement::center.size();
+  if(ncenters > 0) {
+    out << "Centers=[";
+    for(size_t i=0; i < ncenters; ++i)
+      out << newl << drawElement::center[i] << ",";
+    out << newl << "];" << newl;
+  }
+  copy(locateFile(WebGLfooter));
+}
+
+void jsfile::addColor(const prc::RGBAColour& c) 
+{
+  out << "[" << byte(c.R) << "," << byte(c.G) << "," << byte(c.B)
+      << "," << byte(c.A) << "]";
+}
+
+void jsfile::addIndices(const uint32_t *I) 
+{
+  out << "[" << I[0] << "," << I[1] << "," << I[2] << "]";
+}
+
+bool distinct(const uint32_t *I, const uint32_t *J) 
+{
+  return I[0] != J[0] || I[1] != J[1] || I[2] != J[2];
+}
+
+void jsfile::addPatch(triple const* controls, size_t n,
+                      const triple& Min, const triple& Max,
+                      const prc::RGBAColour *c, size_t nc)
+{
+  out << "P.push(new BezierPatch([" << newl;
+  size_t last=n-1;
+  for(size_t i=0; i < last; ++i)
+    out << controls[i] << "," << newl;
+  out << controls[last] << newl << "]," 
+      << drawElement::centerIndex << "," << materialIndex << ","
+      << Min << "," << Max;
+  if(c) {
+    out << ",[" << newl;
+    for(size_t i=0; i < nc; ++i) {
+      addColor(c[i]);
+      out << "," << newl;
+    }
+    out << "]";
+  }
+  out << "));" << newl << newl;
+}
+
+void jsfile::addCurve(const triple& z0, const triple& c0,
+                      const triple& c1, const triple& z1,
+                      const triple& Min, const triple& Max)
+{
+  out << "P.push(new BezierCurve([" << newl;
+  out << z0 << "," << newl
+      << c0 << "," << newl
+      << c1 << "," << newl
+      << z1 << newl << "],"
+      << drawElement::centerIndex << "," << materialIndex << ","
+      << Min << "," << Max << "));" << newl << newl;
+}
+
+void jsfile::addCurve(const triple& z0, const triple& z1,
+                      const triple& Min, const triple& Max)
+{
+  out << "P.push(new BezierCurve([" << newl;
+  out << z0 << "," << newl
+      << z1 << newl << "],"
+      << drawElement::centerIndex << "," << materialIndex << ","
+      << Min << "," << Max << "));" << newl << newl;
+}
+
+void jsfile::addPixel(const triple& z0, double width,
+                      const triple& Min, const triple& Max)
+{
+  out << "P.push(new Pixel(" << newl;
+  out << z0 << "," << width << "," << newl
+      << materialIndex << "," << Min << "," << Max << "));" << newl << newl;
+}
+
+void jsfile::addMaterial(size_t index)
+{
+  out << "Materials.push(new Material(" << newl
+       << material[index]
+      << "));" << newl << newl;
+}
+
+void jsfile::addTriangles(size_t nP, const triple* P, size_t nN,
+                          const triple* N, size_t nC, const prc::RGBAColour* C,
+                          size_t nI, const uint32_t (*PI)[3],
+                          const uint32_t (*NI)[3], const uint32_t (*CI)[3],
+                          const triple& Min, const triple& Max)
+{
+  for(size_t i=0; i < nP; ++i)
+    out << "Positions.push(" << P[i] << ");" << newl;
+  
+  for(size_t i=0; i < nN; ++i)
+    out << "Normals.push(" << N[i] << ");" << newl;
+  
+  for(size_t i=0; i < nC; ++i) {
+    out << "Colors.push(";
+    addColor(C[i]);
+    out << ");" << newl;
+  }
+  
+  for(size_t i=0; i < nI; ++i) {
+    out << "Indices.push(["; 
+    const uint32_t *PIi=PI[i];
+    const uint32_t *NIi=NI[i];
+    bool keepNI=distinct(NIi,PIi);
+    bool keepCI=nC && distinct(CI[i],PIi);
+    addIndices(PIi);
+    if(keepNI || keepCI) {
+      out << ",";
+      if(keepNI) addIndices(NIi);
+    }
+    if(keepCI) {
+      out << ",";
+      addIndices(CI[i]);
+    }
+    out << "]);" << newl;
+  }
+  out << "P.push(new Triangles("
+      << materialIndex << "," << newl
+      << Min << "," << Max << "));" << newl;
+  out << newl;
+}
+
+}
+#endif


Property changes on: trunk/Build/source/utils/asymptote/jsfile.cc
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/jsfile.h
===================================================================
--- trunk/Build/source/utils/asymptote/jsfile.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/jsfile.h	2019-10-06 17:17:34 UTC (rev 52300)
@@ -0,0 +1,49 @@
+#ifndef JSFILE_H
+#define JSFILE_H
+
+#include <fstream>
+#include "common.h"
+#include "triple.h"
+#include "locate.h"
+#include "prcfile.h"
+
+namespace camp {
+
+class jsfile {
+  jsofstream out;
+  
+public:  
+  jsfile() {}
+  ~jsfile();
+  
+  void open(string name);
+  void copy(string name);
+  
+  void addColor(const prc::RGBAColour& c); 
+  void addIndices(const uint32_t *I); 
+    
+  void addPatch(const triple* controls, size_t n, const triple& Min,
+                const triple& Max, const prc::RGBAColour *colors, size_t nc);
+  
+  void addCurve(const triple& z0, const triple& c0,
+                const triple& c1, const triple& z1,
+                const triple& Min, const triple& Max);
+  
+  void addCurve(const triple& z0, const triple& z1,
+                const triple& Min, const triple& Max);
+  
+  void addPixel(const triple& z0, double width,
+                const triple& Min, const triple& Max);
+  
+  void addMaterial(size_t index);
+  
+  void addTriangles(size_t nP, const triple* P, size_t nN, const triple* N,
+                    size_t nC, const prc::RGBAColour* C, size_t nI,
+                    const uint32_t (*PI)[3], const uint32_t (*NI)[3],
+                    const uint32_t (*CI)[3],
+                    const triple& Min, const triple& Max);
+};
+
+} //namespace camp
+
+#endif


Property changes on: trunk/Build/source/utils/asymptote/jsfile.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/utils/asymptote/material.h
===================================================================
--- trunk/Build/source/utils/asymptote/material.h	2019-10-05 23:53:59 UTC (rev 52299)
+++ trunk/Build/source/utils/asymptote/material.h	2019-10-06 17:17:34 UTC (rev 52300)
@@ -1,7 +1,14 @@
-#ifndef MATERIAL_STRUCT
-#define MATERIAL_STRUCT

@@ Diff output truncated at 1234567 characters. @@


More information about the tex-live-commits mailing list