summaryrefslogtreecommitdiff
path: root/graphics
diff options
context:
space:
mode:
Diffstat (limited to 'graphics')
-rw-r--r--graphics/asymptote/ChangeLog298
-rw-r--r--graphics/asymptote/GUI/icons_rc.py3320
-rw-r--r--graphics/asymptote/Makefile.in2
-rw-r--r--graphics/asymptote/ReleaseNotes11
-rw-r--r--graphics/asymptote/aspy.py3
-rw-r--r--graphics/asymptote/asy-keywords.el2
-rw-r--r--graphics/asymptote/asymptote.spec2
-rwxr-xr-xgraphics/asymptote/base/asymptote.py18
-rw-r--r--graphics/asymptote/base/shaders/fragment.glsl5
-rw-r--r--graphics/asymptote/base/three_arrows.asy4
-rw-r--r--graphics/asymptote/base/webgl/WebGLfooter.html10
-rw-r--r--graphics/asymptote/base/webgl/asygl.js6
-rw-r--r--graphics/asymptote/beziercurve.h12
-rw-r--r--graphics/asymptote/bezierpatch.cc5
-rw-r--r--graphics/asymptote/bezierpatch.h26
-rwxr-xr-xgraphics/asymptote/build-scripts/build-asygl23
-rwxr-xr-xgraphics/asymptote/configure18
-rw-r--r--graphics/asymptote/configure.ac2
-rw-r--r--graphics/asymptote/doc/CAD.pdfbin167837 -> 167837 bytes
-rw-r--r--graphics/asymptote/doc/FAQ/asy-faq.info2
-rw-r--r--graphics/asymptote/doc/TeXShopAndAsymptote.pdfbin77101 -> 77101 bytes
-rw-r--r--graphics/asymptote/doc/asy-latex.pdfbin194542 -> 194542 bytes
-rw-r--r--graphics/asymptote/doc/asy.13
-rw-r--r--graphics/asymptote/doc/asyRefCard.pdfbin121144 -> 121144 bytes
-rw-r--r--graphics/asymptote/doc/asymptote.pdfbin1304408 -> 1304319 bytes
-rw-r--r--graphics/asymptote/doc/asymptote.texi18
-rw-r--r--graphics/asymptote/doc/png/asymptote.info673
-rw-r--r--graphics/asymptote/drawelement.h12
-rw-r--r--graphics/asymptote/drawpath3.cc16
-rw-r--r--graphics/asymptote/drawsurface.cc65
-rw-r--r--graphics/asymptote/examples/arrows3.asy19
-rw-r--r--graphics/asymptote/examples/extrudedcontour.asy9
-rw-r--r--graphics/asymptote/examples/pathintersectsurface.asy2
-rw-r--r--graphics/asymptote/examples/tiling.asy7
-rw-r--r--graphics/asymptote/glrender.cc224
-rw-r--r--graphics/asymptote/glrender.h73
-rw-r--r--graphics/asymptote/jsfile.cc26
-rw-r--r--graphics/asymptote/profile.py16
-rw-r--r--graphics/asymptote/revision.cc2
-rw-r--r--graphics/asymptote/settings.cc1
-rw-r--r--graphics/asymptote/triple.h8
-rw-r--r--graphics/asymptote/webgl/fragment.glsl (renamed from graphics/asymptote/base/webgl/WebGLheader.html)97
-rw-r--r--graphics/asymptote/webgl/gl.js464
-rw-r--r--graphics/asymptote/webgl/license18
-rw-r--r--graphics/asymptote/webgl/vertex.glsl84
-rw-r--r--graphics/pstricks/contrib/pst-eucl/Changes13
-rw-r--r--graphics/pstricks/contrib/pst-eucl/doc/pst-eucl-doc.pdfbin543319 -> 1189759 bytes
-rw-r--r--graphics/pstricks/contrib/pst-eucl/doc/pst-eucl-doc.tex2288
-rw-r--r--graphics/pstricks/contrib/pst-eucl/tex/pst-eucl.tex6363
49 files changed, 11570 insertions, 2700 deletions
diff --git a/graphics/asymptote/ChangeLog b/graphics/asymptote/ChangeLog
index 019529c25d..4ec0af6970 100644
--- a/graphics/asymptote/ChangeLog
+++ b/graphics/asymptote/ChangeLog
@@ -1,3 +1,301 @@
+commit e47b19bb47079c8def40e5f4b5eb7946fec6a0c2
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Oct 19 22:36:58 2019 -0600
+
+ Remove obsolete MSDOS Intel GPU workaround.
+
+commit 64ad659eed5015f568fbfc08a4bf65ee66e429a8
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Oct 19 20:29:42 2019 -0600
+
+ Port to MacOSX.
+
+commit 1abf16a851f36541dad9fe29f4ea03701dfd426b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Oct 19 18:10:47 2019 -0600
+
+ Fix warning message.
+
+commit e3103ae3464da73a0af4e9e193139b68a4758333
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Oct 19 17:04:00 2019 -0600
+
+ Update asygl.
+
+commit c05b1d7fab525a7d7f1a153a0af157fa16f99721
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Oct 19 16:17:31 2019 -0600
+
+ Remove unused code.
+
+commit 1af6f8a4adda6fd175b72265fe1a3ddd6d0e95db
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Oct 19 16:12:01 2019 -0600
+
+ Fix transparency bug introduced in a05450337791d59966d12fedecb19e73bebc2415.
+
+commit f634dfe0a8ddedbc1d575cbbe92dcab1f44c3666
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Oct 19 15:16:22 2019 -0600
+
+ Remove maxvertices setting, which is no longer required;
+ fix materialTable resizing.
+
+commit 24feb014dd4bc563d52c8fa6b14c3e097ec3d03a
+Merge: ea84254a 8d8031f7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Oct 19 12:53:50 2019 -0600
+
+ Merge branch 'prune'.
+
+commit 8d8031f70536399553293b76b5893f10c3e0354d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Oct 19 12:27:32 2019 -0600
+
+ Don't reserve space for vertexBuffer data.
+
+commit eed0d85771f12724655450b2a07bcc3a2de3c8e6
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Oct 19 02:47:25 2019 -0600
+
+ Port WebGl material changes to OpenGL.
+
+commit ea84254a34b02cbfb70fb4c312beb1fb57720f68
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Oct 19 02:05:16 2019 -0600
+
+ Make glm happy again.
+
+commit 3f7ebd06a25b02aae4491b063744205414fcbcdd
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Oct 19 01:13:50 2019 -0600
+
+ Fix nontransparent material index for WebGL indexed triangles.
+
+commit 6f74aa05e584c31361db32218d55fb7a99fcf40b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Oct 18 15:55:28 2019 -0600
+
+ Update asygl.
+
+commit 8a741d665941592d420eb212005ad0d9b6700a67
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Oct 18 15:52:51 2019 -0600
+
+ Pass only required material uniforms to each shader; simplify code.
+
+commit a1ea5e709290fe4055cc81f2673ac4310f4f500f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Oct 18 02:15:11 2019 -0600
+
+ Update asygl.
+
+commit c67276f0c8149efb848cf2f6584d861b0659ae55
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Oct 18 02:13:55 2019 -0600
+
+ If needed, use separate material array for transparent elements.
+
+commit 984de25753a7d7c337036fa7b4a1f6525422b2e4
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Oct 18 01:40:30 2019 -0600
+
+ Reindex materials only when needed.
+
+commit d80ab0d128061ce19651a0bb52923cb07ae81b5f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Oct 18 01:28:08 2019 -0600
+
+ Fix revision 82f7f09542dbe478f173efe64b52e24091ab7144.
+
+commit 595397655afd3e6603ead89b57fc923f45bfb44c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Oct 18 00:34:53 2019 -0600
+
+ Revert "Reduce number of materials in elevation.asy."
+
+ This reverts commit 38a4badac82efbb0632ade0ee2ebaf486b8153dc.
+
+commit 82f7f09542dbe478f173efe64b52e24091ab7144
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Oct 18 00:32:54 2019 -0600
+
+ Respect maximum number of uniforms.
+
+commit 256a4a88b5d9e5680c15bebbd7594d67bba858a4
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Oct 17 00:59:43 2019 -0600
+
+ Compress WebGL Material parameters into a single vec4.
+
+commit bb9232f14a9f672b65cfd9a709b1345580dd3f6a
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Oct 16 22:32:28 2019 -0600
+
+ Illustrate Arrow3(position).
+
+commit ca863003b8dd6f18cb94feaeaf64eab639d88671
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Oct 16 22:04:17 2019 -0600
+
+ Fix splitpath settings of arrowhead3.
+
+commit 292b048048a42b75fe686c98bf550efafea730c0
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Oct 16 10:50:23 2019 -0600
+
+ Upload asygl.js; make minor updates to documentation and formatting.
+
+commit 192a328e5b899cc12ad813faf39b096ca3505606
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Oct 15 23:58:59 2019 -0600
+
+ Fix materialAttrib check in OpenGL.
+
+commit 1b357c7161606554d394c3dd05d0971edda82993
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Oct 15 23:56:25 2019 -0600
+
+ Update asygl.
+
+commit 1a07e8e4f74732c5a7302706df5ec658b30e62cf
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Oct 15 23:43:54 2019 -0600
+
+ Fix attributeMaterialIndex check; simplify code.
+
+commit 3903d300105d0822208588e144b4f1ad4b822dd8
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Oct 15 11:55:41 2019 -0600
+
+ Revert "Update asygl."
+
+ This reverts commit 1e14e51305ae550ac4afeb1b259365cf69070783.
+
+commit 1e14e51305ae550ac4afeb1b259365cf69070783
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Oct 15 11:34:56 2019 -0600
+
+ Update asygl.
+
+commit 22139a4951f8b568354cac72e61f613782799c68
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Oct 15 11:32:19 2019 -0600
+
+ Fix shader sharing; use separate buffers for each canvas.
+
+commit 63eabdd7d504be58b4400d999c800c5fc4a444ae
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Oct 15 03:46:41 2019 -0600
+
+ Revert "Update asygl."
+
+ This reverts commit fc5e4423912f59b77a80a656869ded97a47edf60.
+
+commit fc5e4423912f59b77a80a656869ded97a47edf60
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Oct 15 03:39:37 2019 -0600
+
+ Update asygl.
+
+commit 88a383380d6f340524d0b58f8ce0b32ebe3ca383
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Oct 15 03:28:18 2019 -0600
+
+ Move shaders to asygl library; share shaders and buffers among embedded images.
+ Check for unused WebGL attributes.
+
+commit c6db33e7e18c45b52daaed33e10b10e08dabd371
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Oct 15 02:01:19 2019 -0600
+
+ Optimize OpenGL renderer.
+
+commit ce57dbdb9a105320888ac9230b10665185febc7e
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Oct 15 00:53:37 2019 -0600
+
+ Check for unused GLSL attributes; restrict glFlush workaround to MSDOS.
+ Remove unnecessary code.
+
+commit 229f9ca69f9a59e4f393e7f92db027f9bc570325
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Oct 14 12:15:43 2019 -0600
+
+ Update documentation.
+
+commit 38a4badac82efbb0632ade0ee2ebaf486b8153dc
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Oct 14 12:01:43 2019 -0600
+
+ Reduce number of materials in elevation.asy.
+
+commit e0e8e60a15b158c831f5ea1e300ad86486a35481
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Oct 14 09:00:58 2019 -0600
+
+ Simplify example.
+
+commit 089e57508c96518c48b9bb3f21cb922710675f37
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Oct 13 21:52:55 2019 -0600
+
+ Update asygl.
+
+commit 2642e40cc6b1623ea3998a1274540913d9bae824
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Oct 13 21:52:28 2019 -0600
+
+ Apply WebGL scissors.
+
+commit c0a589e08d0078b26443effef18a68da8c53879e
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Oct 13 21:32:43 2019 -0600
+
+ Update asygl.
+
+commit 4498544f5f53dd9ea21f96485a30cb5d3b6a4656
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Oct 13 21:30:20 2019 -0600
+
+ Fix offscreen viewport.
+
+commit 1af5c5ef00aceebb565710e1899f382826db9f8e
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Oct 13 17:25:57 2019 -0600
+
+ Update asygl.
+
+commit 324d09b31ac582d2b1cd0b9f905b7ac0089ae5dc
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Oct 13 17:20:45 2019 -0600
+
+ Organize asygl variables.
+
+commit 2508e0574a5fef5074bf5f6a0037d5190d47b0d7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Oct 13 15:15:43 2019 -0600
+
+ Use a single WebGL rendering context for embedded images.
+
+commit 9cc2fdaee9d2efcca12b587f0902b7a89daea0f9
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Oct 13 15:15:11 2019 -0600
+
+ Update asygl.
+
+commit 14c00ed4351d108338a24af8dc8c35e3099a987c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Oct 12 11:15:02 2019 -0600
+
+ Port miscellaneous Python support files and example to Python3.
+
+commit f80e63cfe85b233560ab9627731ef3fc16701067
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Oct 11 03:12:52 2019 -0600
+
+ Increment version to 2.59.
+
commit bc7fe4b5126184c965fff4d0daaf592b89ef8d01
Author: John Bowman <bowman@ualberta.ca>
Date: Fri Oct 11 00:27:09 2019 -0600
diff --git a/graphics/asymptote/GUI/icons_rc.py b/graphics/asymptote/GUI/icons_rc.py
index 6e896c34bb..0cafdbfb17 100644
--- a/graphics/asymptote/GUI/icons_rc.py
+++ b/graphics/asymptote/GUI/icons_rc.py
@@ -9,7 +9,7 @@
from PyQt5 import QtCore
qt_resource_data = b"\
-\x00\x00\x04\xbd\
+\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\
@@ -30,116 +30,60 @@ qt_resource_data = b"\
\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\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\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\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\x37\x36\x38\x38\x29\x27\x3e\x0a\x3c\x63\
+\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\x31\x30\x38\x35\x37\x27\x20\
+\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\x26\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
-\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x33\x38\
-\x38\x63\x2d\x37\x32\x2e\x35\x39\x37\x2c\x30\x2d\x31\x33\x32\x2d\
-\x35\x39\x2e\x34\x30\x35\x2d\x31\x33\x32\x2d\x31\x33\x32\x63\x30\
-\x2d\x37\x32\x2e\x36\x30\x31\x2c\x35\x39\x2e\x34\x30\x33\x2d\x31\
-\x33\x32\x2c\x31\x33\x32\x2d\x31\x33\x32\x63\x33\x36\x2e\x33\x2c\
-\x30\x2c\x36\x39\x2e\x32\x39\x39\x2c\x31\x35\x2e\x34\x2c\x39\x32\
-\x2e\x34\x30\x36\x2c\x33\x39\x2e\x36\x30\x31\x4c\x32\x37\x38\x2c\
-\x32\x33\x34\x68\x31\x35\x34\x56\x38\x30\x0d\x0a\x09\x09\x6c\x2d\
-\x35\x31\x2e\x36\x39\x38\x2c\x35\x31\x2e\x37\x30\x32\x43\x33\x34\
-\x38\x2e\x34\x30\x36\x2c\x39\x39\x2e\x37\x39\x38\x2c\x33\x30\x34\
-\x2e\x34\x30\x36\x2c\x38\x30\x2c\x32\x35\x36\x2c\x38\x30\x63\x2d\
-\x39\x36\x2e\x37\x39\x37\x2c\x30\x2d\x31\x37\x36\x2c\x37\x39\x2e\
-\x32\x30\x33\x2d\x31\x37\x36\x2c\x31\x37\x36\x73\x37\x38\x2e\x30\
-\x39\x34\x2c\x31\x37\x36\x2c\x31\x37\x36\x2c\x31\x37\x36\x0d\x0a\
-\x09\x09\x63\x38\x31\x2e\x30\x34\x35\x2c\x30\x2c\x31\x34\x38\x2e\
-\x32\x38\x37\x2d\x35\x34\x2e\x31\x33\x34\x2c\x31\x36\x39\x2e\x34\
-\x30\x31\x2d\x31\x32\x38\x48\x33\x37\x38\x2e\x38\x35\x43\x33\x36\
-\x30\x2e\x31\x30\x35\x2c\x33\x35\x33\x2e\x35\x36\x31\x2c\x33\x31\
-\x31\x2e\x37\x31\x32\x2c\x33\x38\x38\x2c\x32\x35\x36\x2c\x33\x38\
-\x38\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\
-\x76\x67\x3e\x0d\x0a\
\x00\x00\x04\x30\
\x3c\
\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
@@ -209,13 +153,29 @@ qt_resource_data = b"\
\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\x02\xbd\
+\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\x38\x2e\x31\x2e\x30\x2c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
@@ -227,35 +187,147 @@ qt_resource_data = b"\
\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\
+\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\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\x52\
+\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\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\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\x05\xca\
\x3c\
\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
@@ -287,63 +359,70 @@ qt_resource_data = b"\
\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\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\x4c\
+\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\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\
@@ -370,35 +449,87 @@ qt_resource_data = b"\
\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\x03\x36\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
+\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
+\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
+\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
+\x0a\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\
+\x3d\x22\x32\x38\x38\x2c\x39\x36\x20\x33\x33\x37\x2e\x39\x2c\x31\
+\x34\x35\x2e\x39\x20\x32\x37\x34\x2c\x32\x30\x39\x2e\x37\x20\x32\
+\x37\x34\x2c\x32\x30\x39\x2e\x37\x20\x31\x34\x35\x2e\x39\x2c\x33\
+\x33\x37\x2e\x39\x20\x39\x36\x2c\x32\x38\x38\x20\x39\x36\x2c\x34\
+\x31\x36\x20\x32\x32\x34\x2c\x34\x31\x36\x20\x31\x37\x34\x2e\x31\
+\x2c\x33\x36\x36\x2e\x31\x20\x33\x35\x37\x2e\x34\x2c\x31\x38\x32\
+\x2e\x39\x20\x33\x36\x36\x2e\x31\x2c\x31\x37\x34\x2e\x31\x20\x0d\
+\x0a\x09\x34\x31\x36\x2c\x32\x32\x34\x20\x34\x31\x36\x2c\x39\x36\
+\x20\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x03\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\x03\x26\
\x3c\
\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
@@ -430,27 +561,26 @@ qt_resource_data = b"\
\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\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x33\x38\
+\x38\x63\x2d\x37\x32\x2e\x35\x39\x37\x2c\x30\x2d\x31\x33\x32\x2d\
+\x35\x39\x2e\x34\x30\x35\x2d\x31\x33\x32\x2d\x31\x33\x32\x63\x30\
+\x2d\x37\x32\x2e\x36\x30\x31\x2c\x35\x39\x2e\x34\x30\x33\x2d\x31\
+\x33\x32\x2c\x31\x33\x32\x2d\x31\x33\x32\x63\x33\x36\x2e\x33\x2c\
+\x30\x2c\x36\x39\x2e\x32\x39\x39\x2c\x31\x35\x2e\x34\x2c\x39\x32\
+\x2e\x34\x30\x36\x2c\x33\x39\x2e\x36\x30\x31\x4c\x32\x37\x38\x2c\
+\x32\x33\x34\x68\x31\x35\x34\x56\x38\x30\x0d\x0a\x09\x09\x6c\x2d\
+\x35\x31\x2e\x36\x39\x38\x2c\x35\x31\x2e\x37\x30\x32\x43\x33\x34\
+\x38\x2e\x34\x30\x36\x2c\x39\x39\x2e\x37\x39\x38\x2c\x33\x30\x34\
+\x2e\x34\x30\x36\x2c\x38\x30\x2c\x32\x35\x36\x2c\x38\x30\x63\x2d\
+\x39\x36\x2e\x37\x39\x37\x2c\x30\x2d\x31\x37\x36\x2c\x37\x39\x2e\
+\x32\x30\x33\x2d\x31\x37\x36\x2c\x31\x37\x36\x73\x37\x38\x2e\x30\
+\x39\x34\x2c\x31\x37\x36\x2c\x31\x37\x36\x2c\x31\x37\x36\x0d\x0a\
+\x09\x09\x63\x38\x31\x2e\x30\x34\x35\x2c\x30\x2c\x31\x34\x38\x2e\
+\x32\x38\x37\x2d\x35\x34\x2e\x31\x33\x34\x2c\x31\x36\x39\x2e\x34\
+\x30\x31\x2d\x31\x32\x38\x48\x33\x37\x38\x2e\x38\x35\x43\x33\x36\
+\x30\x2e\x31\x30\x35\x2c\x33\x35\x33\x2e\x35\x36\x31\x2c\x33\x31\
+\x31\x2e\x37\x31\x32\x2c\x33\x38\x38\x2c\x32\x35\x36\x2c\x33\x38\
+\x38\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\
\x76\x67\x3e\x0d\x0a\
\x00\x00\x07\x80\
\x3c\
@@ -574,163 +704,82 @@ qt_resource_data = b"\
\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\x7d\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\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\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\x20\
+\x00\x00\x04\x22\
\x3c\
-\x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
+\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\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\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\
-\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\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\x02\x79\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x5f\x31\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
-\x0d\x0a\x09\x09\x3c\x67\x3e\x0d\x0a\x09\x09\x09\x3c\x70\x6f\x6c\
-\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\x22\x31\x38\x36\
-\x2e\x33\x30\x31\x2c\x33\x33\x39\x2e\x38\x39\x33\x20\x39\x36\x2c\
-\x32\x34\x39\x2e\x34\x36\x31\x20\x36\x34\x2c\x32\x37\x39\x2e\x39\
-\x36\x38\x20\x31\x38\x36\x2e\x33\x30\x31\x2c\x34\x30\x32\x20\x34\
-\x34\x38\x2c\x31\x34\x30\x2e\x35\x30\x36\x20\x34\x31\x36\x2c\x31\
-\x31\x30\x20\x09\x09\x09\x22\x2f\x3e\x0d\x0a\x09\x09\x3c\x2f\x67\
-\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\
-\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x03\xb5\
+\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
+\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
+\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
+\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\
+\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
+\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
+\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
+\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x2d\x39\x2e\x33\x39\
+\x31\x31\x38\x20\x2d\x30\x4c\x20\x2d\x36\x2e\x36\x34\x30\x35\x37\
+\x20\x2d\x31\x32\x2e\x30\x34\x35\x4c\x20\x38\x2e\x36\x37\x36\x33\
+\x32\x20\x2d\x36\x2e\x35\x31\x38\x37\x31\x4c\x20\x33\x2e\x33\x32\
+\x30\x32\x38\x20\x36\x2e\x30\x32\x32\x35\x27\x20\x66\x69\x6c\x6c\
+\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\
+\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\
+\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\
+\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\
+\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\
+\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\
+\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\
+\x3d\x27\x31\x2e\x37\x35\x36\x35\x36\x27\x2f\x3e\x0a\x3c\x2f\x67\
+\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
+\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
+\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
+\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\
+\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x2d\x39\x2e\x33\
+\x39\x31\x31\x38\x27\x20\x63\x79\x3d\x27\x2d\x30\x27\x20\x72\x3d\
+\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\
+\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
+\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
+\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\
+\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\
+\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\x3c\x63\
+\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x2d\x36\x2e\x36\x34\x30\
+\x35\x37\x27\x20\x63\x79\x3d\x27\x2d\x31\x32\x2e\x30\x34\x35\x27\
+\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\
+\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\
+\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\
+\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\
+\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\
+\x2e\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\
+\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x38\x2e\x36\
+\x37\x36\x33\x32\x27\x20\x63\x79\x3d\x27\x2d\x36\x2e\x35\x31\x38\
+\x37\x31\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\
+\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\
+\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\
+\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\
+\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\
+\x20\x36\x38\x2e\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\
+\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\
+\x33\x2e\x33\x32\x30\x32\x38\x27\x20\x63\x79\x3d\x27\x36\x2e\x30\
+\x32\x32\x35\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\
+\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\
+\x3e\x0a\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\
+\x3e\
+\x00\x00\x03\x0c\
\x3c\
\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\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\
@@ -742,51 +791,40 @@ qt_resource_data = b"\
\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\
+\x3d\x22\x43\x68\x65\x63\x6b\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\
\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\
\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x22\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\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\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\
+\x4d\x38\x2e\x32\x39\x34\x2c\x31\x36\x2e\x39\x39\x38\x63\x2d\x30\
+\x2e\x34\x33\x35\x2c\x30\x2d\x30\x2e\x38\x34\x37\x2d\x30\x2e\x32\
+\x30\x33\x2d\x31\x2e\x31\x31\x31\x2d\x30\x2e\x35\x35\x33\x4c\x33\
+\x2e\x36\x31\x2c\x31\x31\x2e\x37\x32\x34\x63\x2d\x30\x2e\x34\x36\
+\x35\x2d\x30\x2e\x36\x31\x33\x2d\x30\x2e\x33\x34\x34\x2d\x31\x2e\
+\x34\x38\x36\x2c\x30\x2e\x32\x37\x2d\x31\x2e\x39\x35\x31\x0d\x0a\
+\x09\x63\x30\x2e\x36\x31\x35\x2d\x30\x2e\x34\x36\x37\x2c\x31\x2e\
+\x34\x38\x38\x2d\x30\x2e\x33\x34\x34\x2c\x31\x2e\x39\x35\x33\x2c\
+\x30\x2e\x32\x37\x6c\x32\x2e\x33\x35\x31\x2c\x33\x2e\x31\x30\x34\
+\x6c\x35\x2e\x39\x31\x31\x2d\x39\x2e\x34\x39\x32\x63\x30\x2e\x34\
+\x30\x37\x2d\x30\x2e\x36\x35\x32\x2c\x31\x2e\x32\x36\x37\x2d\x30\
+\x2e\x38\x35\x32\x2c\x31\x2e\x39\x32\x31\x2d\x30\x2e\x34\x34\x35\
+\x0d\x0a\x09\x63\x30\x2e\x36\x35\x33\x2c\x30\x2e\x34\x30\x36\x2c\
+\x30\x2e\x38\x35\x34\x2c\x31\x2e\x32\x36\x36\x2c\x30\x2e\x34\x34\
+\x36\x2c\x31\x2e\x39\x32\x4c\x39\x2e\x34\x37\x38\x2c\x31\x36\x2e\
+\x33\x34\x63\x2d\x30\x2e\x32\x34\x32\x2c\x30\x2e\x33\x39\x31\x2d\
+\x30\x2e\x36\x36\x31\x2c\x30\x2e\x36\x33\x35\x2d\x31\x2e\x31\x32\
+\x2c\x30\x2e\x36\x35\x36\x43\x38\x2e\x33\x33\x36\x2c\x31\x36\x2e\
+\x39\x39\x38\x2c\x38\x2e\x33\x31\x36\x2c\x31\x36\x2e\x39\x39\x38\
+\x2c\x38\x2e\x32\x39\x34\x2c\x31\x36\x2e\x39\x39\x38\x7a\x22\x2f\
+\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x02\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\
@@ -818,40 +856,25 @@ qt_resource_data = b"\
\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\x03\x22\
+\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x31\x37\x2e\x34\
+\x2c\x32\x32\x34\x48\x32\x38\x38\x56\x39\x34\x2e\x36\x63\x30\x2d\
+\x31\x36\x2e\x39\x2d\x31\x34\x2e\x33\x2d\x33\x30\x2e\x36\x2d\x33\
+\x32\x2d\x33\x30\x2e\x36\x63\x2d\x31\x37\x2e\x37\x2c\x30\x2d\x33\
+\x32\x2c\x31\x33\x2e\x37\x2d\x33\x32\x2c\x33\x30\x2e\x36\x56\x32\
+\x32\x34\x48\x39\x34\x2e\x36\x43\x37\x37\x2e\x37\x2c\x32\x32\x34\
+\x2c\x36\x34\x2c\x32\x33\x38\x2e\x33\x2c\x36\x34\x2c\x32\x35\x36\
+\x0d\x0a\x09\x63\x30\x2c\x31\x37\x2e\x37\x2c\x31\x33\x2e\x37\x2c\
+\x33\x32\x2c\x33\x30\x2e\x36\x2c\x33\x32\x48\x32\x32\x34\x76\x31\
+\x32\x39\x2e\x34\x63\x30\x2c\x31\x36\x2e\x39\x2c\x31\x34\x2e\x33\
+\x2c\x33\x30\x2e\x36\x2c\x33\x32\x2c\x33\x30\x2e\x36\x63\x31\x37\
+\x2e\x37\x2c\x30\x2c\x33\x32\x2d\x31\x33\x2e\x37\x2c\x33\x32\x2d\
+\x33\x30\x2e\x36\x56\x32\x38\x38\x68\x31\x32\x39\x2e\x34\x63\x31\
+\x36\x2e\x39\x2c\x30\x2c\x33\x30\x2e\x36\x2d\x31\x34\x2e\x33\x2c\
+\x33\x30\x2e\x36\x2d\x33\x32\x0d\x0a\x09\x43\x34\x34\x38\x2c\x32\
+\x33\x38\x2e\x33\x2c\x34\x33\x34\x2e\x33\x2c\x32\x32\x34\x2c\x34\
+\x31\x37\x2e\x34\x2c\x32\x32\x34\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\
+\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x03\x52\
\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\
@@ -882,29 +905,111 @@ qt_resource_data = b"\
\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\
+\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\x05\x27\
+\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\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\
@@ -936,60 +1041,17 @@ qt_resource_data = b"\
\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x5f\x31\x32\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\
-\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\
-\x35\x36\x2c\x36\x34\x43\x31\x35\x30\x2e\x34\x30\x31\x2c\x36\x34\
-\x2c\x36\x34\x2c\x31\x35\x30\x2e\x34\x30\x31\x2c\x36\x34\x2c\x32\
-\x35\x36\x63\x30\x2c\x31\x30\x35\x2e\x36\x30\x34\x2c\x38\x36\x2e\
-\x34\x30\x31\x2c\x31\x39\x32\x2c\x31\x39\x32\x2c\x31\x39\x32\x63\
-\x31\x38\x2e\x31\x33\x36\x2c\x30\x2c\x33\x32\x2d\x31\x33\x2e\x38\
-\x36\x34\x2c\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\x09\x63\x30\x2d\
-\x38\x2e\x35\x33\x31\x2d\x33\x2e\x31\x39\x38\x2d\x31\x36\x2d\x38\
-\x2e\x35\x33\x31\x2d\x32\x31\x2e\x33\x33\x33\x63\x2d\x35\x2e\x33\
-\x33\x33\x2d\x35\x2e\x33\x33\x34\x2d\x38\x2e\x35\x33\x31\x2d\x31\
-\x32\x2e\x38\x30\x33\x2d\x38\x2e\x35\x33\x31\x2d\x32\x31\x2e\x33\
-\x33\x34\x63\x30\x2d\x31\x38\x2e\x31\x33\x35\x2c\x31\x33\x2e\x38\
-\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x68\x33\x38\x2e\x33\
-\x39\x36\x0d\x0a\x09\x09\x09\x63\x35\x38\x2e\x36\x36\x37\x2c\x30\
-\x2c\x31\x30\x36\x2e\x36\x36\x37\x2d\x34\x38\x2c\x31\x30\x36\x2e\
-\x36\x36\x37\x2d\x31\x30\x36\x2e\x36\x36\x36\x43\x34\x34\x38\x2c\
-\x31\x34\x30\x2e\x38\x30\x32\x2c\x33\x36\x31\x2e\x36\x30\x34\x2c\
-\x36\x34\x2c\x32\x35\x36\x2c\x36\x34\x7a\x20\x4d\x31\x33\x38\x2e\
-\x36\x36\x37\x2c\x32\x35\x36\x63\x2d\x31\x38\x2e\x31\x33\x36\x2c\
-\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x34\x2d\x33\x32\x2d\x33\
-\x32\x73\x31\x33\x2e\x38\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\
-\x32\x0d\x0a\x09\x09\x09\x63\x31\x38\x2e\x31\x33\x35\x2c\x30\x2c\
-\x33\x32\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x53\
-\x31\x35\x36\x2e\x38\x30\x32\x2c\x32\x35\x36\x2c\x31\x33\x38\x2e\
-\x36\x36\x37\x2c\x32\x35\x36\x7a\x20\x4d\x32\x30\x32\x2e\x36\x36\
-\x37\x2c\x31\x37\x30\x2e\x36\x36\x37\x63\x2d\x31\x38\x2e\x31\x33\
-\x36\x2c\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x35\x2d\x33\x32\
-\x2d\x33\x32\x63\x30\x2d\x31\x38\x2e\x31\x33\x36\x2c\x31\x33\x2e\
-\x38\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\
-\x09\x63\x31\x38\x2e\x31\x33\x35\x2c\x30\x2c\x33\x32\x2c\x31\x33\
-\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x43\x32\x33\x34\x2e\x36\
-\x36\x37\x2c\x31\x35\x36\x2e\x38\x30\x32\x2c\x32\x32\x30\x2e\x38\
-\x30\x32\x2c\x31\x37\x30\x2e\x36\x36\x37\x2c\x32\x30\x32\x2e\x36\
-\x36\x37\x2c\x31\x37\x30\x2e\x36\x36\x37\x7a\x20\x4d\x33\x30\x39\
-\x2e\x33\x33\x33\x2c\x31\x37\x30\x2e\x36\x36\x37\x63\x2d\x31\x38\
-\x2e\x31\x33\x35\x2c\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x35\
-\x2d\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\x09\x63\x30\x2d\x31\x38\
-\x2e\x31\x33\x36\x2c\x31\x33\x2e\x38\x36\x35\x2d\x33\x32\x2c\x33\
-\x32\x2d\x33\x32\x63\x31\x38\x2e\x31\x33\x36\x2c\x30\x2c\x33\x32\
-\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x43\x33\x34\
-\x31\x2e\x33\x33\x33\x2c\x31\x35\x36\x2e\x38\x30\x32\x2c\x33\x32\
-\x37\x2e\x34\x36\x39\x2c\x31\x37\x30\x2e\x36\x36\x37\x2c\x33\x30\
-\x39\x2e\x33\x33\x33\x2c\x31\x37\x30\x2e\x36\x36\x37\x7a\x20\x4d\
-\x33\x37\x33\x2e\x33\x33\x33\x2c\x32\x35\x36\x0d\x0a\x09\x09\x09\
-\x63\x2d\x31\x38\x2e\x31\x33\x35\x2c\x30\x2d\x33\x32\x2d\x31\x33\
-\x2e\x38\x36\x34\x2d\x33\x32\x2d\x33\x32\x73\x31\x33\x2e\x38\x36\
-\x35\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x63\x31\x38\x2e\x31\x33\
-\x36\x2c\x30\x2c\x33\x32\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\
-\x2c\x33\x32\x53\x33\x39\x31\x2e\x34\x36\x39\x2c\x32\x35\x36\x2c\
-\x33\x37\x33\x2e\x33\x33\x33\x2c\x32\x35\x36\x7a\x22\x2f\x3e\x0d\
-\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
-\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x02\x7f\
+\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\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\
@@ -1016,22 +1078,85 @@ qt_resource_data = b"\
\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\x10\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\x0d\x0a\x09\
+\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x31\
+\x37\x36\x63\x2d\x34\x34\x2e\x30\x30\x34\x2c\x30\x2d\x38\x30\x2e\
+\x30\x30\x31\x2c\x33\x36\x2d\x38\x30\x2e\x30\x30\x31\x2c\x38\x30\
+\x63\x30\x2c\x34\x34\x2e\x30\x30\x34\x2c\x33\x35\x2e\x39\x39\x37\
+\x2c\x38\x30\x2c\x38\x30\x2e\x30\x30\x31\x2c\x38\x30\x63\x34\x34\
+\x2e\x30\x30\x35\x2c\x30\x2c\x37\x39\x2e\x39\x39\x39\x2d\x33\x35\
+\x2e\x39\x39\x36\x2c\x37\x39\x2e\x39\x39\x39\x2d\x38\x30\x0d\x0a\
+\x09\x09\x09\x43\x33\x33\x35\x2e\x39\x39\x39\x2c\x32\x31\x32\x2c\
+\x33\x30\x30\x2e\x30\x30\x35\x2c\x31\x37\x36\x2c\x32\x35\x36\x2c\
+\x31\x37\x36\x7a\x20\x4d\x34\x34\x36\x2e\x39\x33\x38\x2c\x32\x33\
+\x34\x2e\x36\x36\x37\x63\x2d\x39\x2e\x36\x30\x35\x2d\x38\x38\x2e\
+\x35\x33\x31\x2d\x38\x31\x2e\x30\x37\x34\x2d\x31\x36\x30\x2d\x31\
+\x36\x39\x2e\x36\x30\x35\x2d\x31\x36\x39\x2e\x35\x39\x39\x56\x33\
+\x32\x68\x2d\x34\x32\x2e\x36\x36\x36\x76\x33\x33\x2e\x30\x36\x37\
+\x0d\x0a\x09\x09\x09\x63\x2d\x38\x38\x2e\x35\x33\x31\x2c\x39\x2e\
+\x35\x39\x39\x2d\x31\x36\x30\x2c\x38\x31\x2e\x30\x36\x38\x2d\x31\
+\x36\x39\x2e\x36\x30\x34\x2c\x31\x36\x39\x2e\x35\x39\x39\x48\x33\
+\x32\x76\x34\x32\x2e\x36\x36\x37\x68\x33\x33\x2e\x30\x36\x32\x63\
+\x39\x2e\x36\x30\x34\x2c\x38\x38\x2e\x35\x33\x31\x2c\x38\x31\x2e\
+\x30\x37\x32\x2c\x31\x36\x30\x2c\x31\x36\x39\x2e\x36\x30\x34\x2c\
+\x31\x36\x39\x2e\x36\x30\x34\x56\x34\x38\x30\x68\x34\x32\x2e\x36\
+\x36\x36\x76\x2d\x33\x33\x2e\x30\x36\x32\x0d\x0a\x09\x09\x09\x63\
+\x38\x38\x2e\x35\x33\x31\x2d\x39\x2e\x36\x30\x34\x2c\x31\x36\x30\
+\x2d\x38\x31\x2e\x30\x37\x33\x2c\x31\x36\x39\x2e\x36\x30\x35\x2d\
+\x31\x36\x39\x2e\x36\x30\x34\x48\x34\x38\x30\x76\x2d\x34\x32\x2e\
+\x36\x36\x37\x48\x34\x34\x36\x2e\x39\x33\x38\x7a\x20\x4d\x32\x35\
+\x36\x2c\x34\x30\x35\x2e\x33\x33\x33\x63\x2d\x38\x32\x2e\x31\x33\
+\x37\x2c\x30\x2d\x31\x34\x39\x2e\x33\x33\x34\x2d\x36\x37\x2e\x31\
+\x39\x38\x2d\x31\x34\x39\x2e\x33\x33\x34\x2d\x31\x34\x39\x2e\x33\
+\x33\x33\x0d\x0a\x09\x09\x09\x63\x30\x2d\x38\x32\x2e\x31\x33\x36\
+\x2c\x36\x37\x2e\x31\x39\x37\x2d\x31\x34\x39\x2e\x33\x33\x33\x2c\
+\x31\x34\x39\x2e\x33\x33\x34\x2d\x31\x34\x39\x2e\x33\x33\x33\x63\
+\x38\x32\x2e\x31\x33\x35\x2c\x30\x2c\x31\x34\x39\x2e\x33\x33\x32\
+\x2c\x36\x37\x2e\x31\x39\x38\x2c\x31\x34\x39\x2e\x33\x33\x32\x2c\
+\x31\x34\x39\x2e\x33\x33\x33\x43\x34\x30\x35\x2e\x33\x33\x32\x2c\
+\x33\x33\x38\x2e\x31\x33\x35\x2c\x33\x33\x38\x2e\x31\x33\x35\x2c\
+\x34\x30\x35\x2e\x33\x33\x33\x2c\x32\x35\x36\x2c\x34\x30\x35\x2e\
+\x33\x33\x33\x7a\x0d\x0a\x09\x09\x09\x22\x2f\x3e\x0d\x0a\x09\x3c\
+\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\
+\x3e\x0d\x0a\
+\x00\x00\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\x05\xb7\
\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\
@@ -1039,110 +1164,92 @@ qt_resource_data = b"\
\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\xa2\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
-\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x32\x38\x2c\x34\x30\
-\x35\x2e\x34\x32\x39\x43\x31\x32\x38\x2c\x34\x32\x38\x2e\x38\x34\
-\x36\x2c\x31\x34\x37\x2e\x31\x39\x38\x2c\x34\x34\x38\x2c\x31\x37\
-\x30\x2e\x36\x36\x37\x2c\x34\x34\x38\x68\x31\x37\x30\x2e\x36\x36\
-\x37\x43\x33\x36\x34\x2e\x38\x30\x32\x2c\x34\x34\x38\x2c\x33\x38\
-\x34\x2c\x34\x32\x38\x2e\x38\x34\x36\x2c\x33\x38\x34\x2c\x34\x30\
-\x35\x2e\x34\x32\x39\x56\x31\x36\x30\x48\x31\x32\x38\x56\x34\x30\
-\x35\x2e\x34\x32\x39\x7a\x20\x4d\x34\x31\x36\x2c\x39\x36\x0d\x0a\
-\x09\x09\x68\x2d\x38\x30\x6c\x2d\x32\x36\x2e\x37\x38\x35\x2d\x33\
-\x32\x48\x32\x30\x32\x2e\x37\x38\x36\x4c\x31\x37\x36\x2c\x39\x36\
-\x48\x39\x36\x76\x33\x32\x68\x33\x32\x30\x56\x39\x36\x7a\x22\x2f\
-\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
-\x0a\
+\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\
+\x31\x38\x2e\x34\x33\x37\x35\x20\x32\x34\x27\x20\x77\x69\x64\x74\
+\x68\x3d\x27\x31\x38\x2e\x34\x33\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\x36\x32\x38\x32\x20\x37\
+\x34\x2e\x32\x30\x32\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\
+\x3d\x27\x4d\x20\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\
+\x31\x36\x36\x37\x43\x20\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\
+\x32\x2e\x37\x30\x38\x35\x20\x34\x2e\x36\x32\x35\x34\x31\x20\x2d\
+\x31\x33\x2e\x39\x35\x38\x34\x20\x30\x20\x2d\x31\x33\x2e\x39\x35\
+\x38\x34\x43\x20\x2d\x34\x2e\x36\x32\x35\x34\x31\x20\x2d\x31\x33\
+\x2e\x39\x35\x38\x34\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\
+\x31\x32\x2e\x37\x30\x38\x35\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\
+\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\x43\x20\x2d\x38\x2e\x33\x37\
+\x35\x30\x34\x20\x2d\x39\x2e\x36\x32\x34\x39\x32\x20\x2d\x34\x2e\
+\x36\x32\x35\x34\x31\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x30\
+\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x43\x20\x34\x2e\x36\x32\x35\
+\x34\x31\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x38\x2e\x33\x37\
+\x35\x30\x34\x20\x2d\x39\x2e\x36\x32\x34\x39\x32\x20\x38\x2e\x33\
+\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\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\x35\x2e\x36\x32\x38\x32\x20\x37\x34\x2e\x32\x30\x32\x29\
+\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x2d\x38\
+\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\x4c\
+\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x30\x4c\x20\x2d\x38\
+\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x2e\x38\x35\x39\x36\x33\x65\
+\x2d\x31\x35\x43\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\
+\x2e\x32\x33\x39\x37\x35\x65\x2d\x31\x35\x20\x2d\x38\x2e\x33\x37\
+\x35\x30\x34\x20\x2d\x36\x2e\x31\x39\x38\x37\x37\x65\x2d\x31\x36\
+\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x30\x43\x20\x2d\x38\
+\x2e\x33\x37\x35\x30\x34\x20\x31\x2e\x35\x34\x31\x38\x20\x2d\x34\
+\x2e\x36\x32\x35\x34\x31\x20\x32\x2e\x37\x39\x31\x36\x38\x20\x30\
+\x20\x32\x2e\x37\x39\x31\x36\x38\x43\x20\x34\x2e\x36\x32\x35\x34\
+\x31\x20\x32\x2e\x37\x39\x31\x36\x38\x20\x38\x2e\x33\x37\x35\x30\
+\x34\x20\x31\x2e\x35\x34\x31\x38\x20\x38\x2e\x33\x37\x35\x30\x34\
+\x20\x30\x4c\x20\x38\x2e\x33\x37\x35\x30\x34\x20\x30\x4c\x20\x38\
+\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\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\x35\x2e\x36\x32\x38\x32\x20\x37\x34\x2e\x32\x30\x32\
+\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x38\
+\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\x43\
+\x20\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x35\x2e\x37\x39\x32\
+\x31\x20\x34\x2e\x36\x32\x35\x34\x31\x20\x2d\x31\x39\x2e\x35\x34\
+\x31\x38\x20\x30\x20\x2d\x31\x39\x2e\x35\x34\x31\x38\x43\x20\x2d\
+\x34\x2e\x36\x32\x35\x34\x31\x20\x2d\x31\x39\x2e\x35\x34\x31\x38\
+\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x35\x2e\x37\x39\
+\x32\x31\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\
+\x31\x36\x36\x37\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\x3c\x2f\x67\x3e\x0a\
+\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x03\x65\
\x3c\
\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
@@ -1242,7 +1349,190 @@ qt_resource_data = b"\
\x31\x39\x2e\x37\x30\x31\x48\x38\x35\x56\x32\x37\x37\x2e\x33\x37\
\x35\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x04\x22\
+\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\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\x02\xc9\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
+\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
+\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
+\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
+\x0a\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\
+\x3d\x22\x34\x38\x30\x2c\x32\x35\x36\x20\x33\x38\x34\x2c\x31\x36\
+\x30\x20\x33\x38\x34\x2c\x32\x33\x36\x20\x32\x37\x36\x2c\x32\x33\
+\x36\x20\x32\x37\x36\x2c\x31\x32\x38\x20\x33\x35\x32\x2c\x31\x32\
+\x38\x20\x32\x35\x36\x2c\x33\x32\x20\x31\x36\x30\x2c\x31\x32\x38\
+\x20\x32\x33\x36\x2c\x31\x32\x38\x20\x32\x33\x36\x2c\x32\x33\x36\
+\x20\x31\x32\x38\x2c\x32\x33\x36\x20\x31\x32\x38\x2c\x31\x36\x30\
+\x20\x33\x32\x2c\x32\x35\x36\x20\x31\x32\x38\x2c\x33\x35\x32\x20\
+\x0d\x0a\x09\x31\x32\x38\x2c\x32\x37\x36\x20\x32\x33\x36\x2c\x32\
+\x37\x36\x20\x32\x33\x36\x2c\x33\x38\x34\x20\x31\x36\x30\x2c\x33\
+\x38\x34\x20\x32\x35\x36\x2c\x34\x38\x30\x20\x33\x35\x32\x2c\x33\
+\x38\x34\x20\x32\x37\x35\x2e\x38\x2c\x33\x38\x34\x20\x32\x37\x35\
+\x2e\x34\x2c\x32\x37\x35\x2e\x35\x20\x33\x38\x34\x2c\x32\x37\x35\
+\x2e\x38\x20\x33\x38\x34\x2c\x33\x35\x32\x20\x22\x2f\x3e\x0d\x0a\
+\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\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\
@@ -1263,64 +1553,64 @@ qt_resource_data = b"\
\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\
+\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\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\
+\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\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\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\x04\x64\
+\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\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\
@@ -1351,91 +1641,36 @@ qt_resource_data = b"\
\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\x0d\x0a\x09\
-\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x31\
-\x37\x36\x63\x2d\x34\x34\x2e\x30\x30\x34\x2c\x30\x2d\x38\x30\x2e\
-\x30\x30\x31\x2c\x33\x36\x2d\x38\x30\x2e\x30\x30\x31\x2c\x38\x30\
-\x63\x30\x2c\x34\x34\x2e\x30\x30\x34\x2c\x33\x35\x2e\x39\x39\x37\
-\x2c\x38\x30\x2c\x38\x30\x2e\x30\x30\x31\x2c\x38\x30\x63\x34\x34\
-\x2e\x30\x30\x35\x2c\x30\x2c\x37\x39\x2e\x39\x39\x39\x2d\x33\x35\
-\x2e\x39\x39\x36\x2c\x37\x39\x2e\x39\x39\x39\x2d\x38\x30\x0d\x0a\
-\x09\x09\x09\x43\x33\x33\x35\x2e\x39\x39\x39\x2c\x32\x31\x32\x2c\
-\x33\x30\x30\x2e\x30\x30\x35\x2c\x31\x37\x36\x2c\x32\x35\x36\x2c\
-\x31\x37\x36\x7a\x20\x4d\x34\x34\x36\x2e\x39\x33\x38\x2c\x32\x33\
-\x34\x2e\x36\x36\x37\x63\x2d\x39\x2e\x36\x30\x35\x2d\x38\x38\x2e\
-\x35\x33\x31\x2d\x38\x31\x2e\x30\x37\x34\x2d\x31\x36\x30\x2d\x31\
-\x36\x39\x2e\x36\x30\x35\x2d\x31\x36\x39\x2e\x35\x39\x39\x56\x33\
-\x32\x68\x2d\x34\x32\x2e\x36\x36\x36\x76\x33\x33\x2e\x30\x36\x37\
-\x0d\x0a\x09\x09\x09\x63\x2d\x38\x38\x2e\x35\x33\x31\x2c\x39\x2e\
-\x35\x39\x39\x2d\x31\x36\x30\x2c\x38\x31\x2e\x30\x36\x38\x2d\x31\
-\x36\x39\x2e\x36\x30\x34\x2c\x31\x36\x39\x2e\x35\x39\x39\x48\x33\
-\x32\x76\x34\x32\x2e\x36\x36\x37\x68\x33\x33\x2e\x30\x36\x32\x63\
-\x39\x2e\x36\x30\x34\x2c\x38\x38\x2e\x35\x33\x31\x2c\x38\x31\x2e\
-\x30\x37\x32\x2c\x31\x36\x30\x2c\x31\x36\x39\x2e\x36\x30\x34\x2c\
-\x31\x36\x39\x2e\x36\x30\x34\x56\x34\x38\x30\x68\x34\x32\x2e\x36\
-\x36\x36\x76\x2d\x33\x33\x2e\x30\x36\x32\x0d\x0a\x09\x09\x09\x63\
-\x38\x38\x2e\x35\x33\x31\x2d\x39\x2e\x36\x30\x34\x2c\x31\x36\x30\
-\x2d\x38\x31\x2e\x30\x37\x33\x2c\x31\x36\x39\x2e\x36\x30\x35\x2d\
-\x31\x36\x39\x2e\x36\x30\x34\x48\x34\x38\x30\x76\x2d\x34\x32\x2e\
-\x36\x36\x37\x48\x34\x34\x36\x2e\x39\x33\x38\x7a\x20\x4d\x32\x35\
-\x36\x2c\x34\x30\x35\x2e\x33\x33\x33\x63\x2d\x38\x32\x2e\x31\x33\
-\x37\x2c\x30\x2d\x31\x34\x39\x2e\x33\x33\x34\x2d\x36\x37\x2e\x31\
-\x39\x38\x2d\x31\x34\x39\x2e\x33\x33\x34\x2d\x31\x34\x39\x2e\x33\
-\x33\x33\x0d\x0a\x09\x09\x09\x63\x30\x2d\x38\x32\x2e\x31\x33\x36\
-\x2c\x36\x37\x2e\x31\x39\x37\x2d\x31\x34\x39\x2e\x33\x33\x33\x2c\
-\x31\x34\x39\x2e\x33\x33\x34\x2d\x31\x34\x39\x2e\x33\x33\x33\x63\
-\x38\x32\x2e\x31\x33\x35\x2c\x30\x2c\x31\x34\x39\x2e\x33\x33\x32\
-\x2c\x36\x37\x2e\x31\x39\x38\x2c\x31\x34\x39\x2e\x33\x33\x32\x2c\
-\x31\x34\x39\x2e\x33\x33\x33\x43\x34\x30\x35\x2e\x33\x33\x32\x2c\
-\x33\x33\x38\x2e\x31\x33\x35\x2c\x33\x33\x38\x2e\x31\x33\x35\x2c\
-\x34\x30\x35\x2e\x33\x33\x33\x2c\x32\x35\x36\x2c\x34\x30\x35\x2e\
-\x33\x33\x33\x7a\x0d\x0a\x09\x09\x09\x22\x2f\x3e\x0d\x0a\x09\x3c\
-\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\
-\x3e\x0d\x0a\
-\x00\x00\x02\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\x05\xca\
+\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\x03\x93\
\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\
@@ -1447,84 +1682,69 @@ qt_resource_data = b"\
\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\xfc\
+\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\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\
+\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\
@@ -1551,123 +1771,34 @@ qt_resource_data = b"\
\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x5f\x32\x30\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\
-\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\
-\x35\x36\x2c\x34\x38\x43\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\
-\x2c\x34\x38\x2c\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\x2c\x32\
-\x35\x36\x73\x39\x33\x2e\x36\x30\x31\x2c\x32\x30\x38\x2c\x32\x30\
-\x38\x2c\x32\x30\x38\x73\x32\x30\x38\x2d\x39\x33\x2e\x36\x30\x31\
-\x2c\x32\x30\x38\x2d\x32\x30\x38\x53\x33\x37\x30\x2e\x33\x39\x39\
-\x2c\x34\x38\x2c\x32\x35\x36\x2c\x34\x38\x7a\x20\x4d\x32\x35\x36\
-\x2c\x34\x32\x32\x2e\x33\x39\x39\x0d\x0a\x09\x09\x09\x63\x2d\x39\
-\x31\x2e\x35\x31\x38\x2c\x30\x2d\x31\x36\x36\x2e\x33\x39\x39\x2d\
-\x37\x34\x2e\x38\x38\x32\x2d\x31\x36\x36\x2e\x33\x39\x39\x2d\x31\
-\x36\x36\x2e\x33\x39\x39\x53\x31\x36\x34\x2e\x34\x38\x32\x2c\x38\
-\x39\x2e\x36\x2c\x32\x35\x36\x2c\x38\x39\x2e\x36\x53\x34\x32\x32\
-\x2e\x34\x2c\x31\x36\x34\x2e\x34\x38\x32\x2c\x34\x32\x32\x2e\x34\
-\x2c\x32\x35\x36\x53\x33\x34\x37\x2e\x35\x31\x38\x2c\x34\x32\x32\
-\x2e\x33\x39\x39\x2c\x32\x35\x36\x2c\x34\x32\x32\x2e\x33\x39\x39\
-\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\
-\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x05\xb7\
-\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\
-\x31\x38\x2e\x34\x33\x37\x35\x20\x32\x34\x27\x20\x77\x69\x64\x74\
-\x68\x3d\x27\x31\x38\x2e\x34\x33\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\x36\x32\x38\x32\x20\x37\
-\x34\x2e\x32\x30\x32\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\
-\x3d\x27\x4d\x20\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\
-\x31\x36\x36\x37\x43\x20\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\
-\x32\x2e\x37\x30\x38\x35\x20\x34\x2e\x36\x32\x35\x34\x31\x20\x2d\
-\x31\x33\x2e\x39\x35\x38\x34\x20\x30\x20\x2d\x31\x33\x2e\x39\x35\
-\x38\x34\x43\x20\x2d\x34\x2e\x36\x32\x35\x34\x31\x20\x2d\x31\x33\
-\x2e\x39\x35\x38\x34\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\
-\x31\x32\x2e\x37\x30\x38\x35\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\
-\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\x43\x20\x2d\x38\x2e\x33\x37\
-\x35\x30\x34\x20\x2d\x39\x2e\x36\x32\x34\x39\x32\x20\x2d\x34\x2e\
-\x36\x32\x35\x34\x31\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x30\
-\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x43\x20\x34\x2e\x36\x32\x35\
-\x34\x31\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x38\x2e\x33\x37\
-\x35\x30\x34\x20\x2d\x39\x2e\x36\x32\x34\x39\x32\x20\x38\x2e\x33\
-\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\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\x35\x2e\x36\x32\x38\x32\x20\x37\x34\x2e\x32\x30\x32\x29\
-\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x2d\x38\
-\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\x4c\
-\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x30\x4c\x20\x2d\x38\
-\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x2e\x38\x35\x39\x36\x33\x65\
-\x2d\x31\x35\x43\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\
-\x2e\x32\x33\x39\x37\x35\x65\x2d\x31\x35\x20\x2d\x38\x2e\x33\x37\
-\x35\x30\x34\x20\x2d\x36\x2e\x31\x39\x38\x37\x37\x65\x2d\x31\x36\
-\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x30\x43\x20\x2d\x38\
-\x2e\x33\x37\x35\x30\x34\x20\x31\x2e\x35\x34\x31\x38\x20\x2d\x34\
-\x2e\x36\x32\x35\x34\x31\x20\x32\x2e\x37\x39\x31\x36\x38\x20\x30\
-\x20\x32\x2e\x37\x39\x31\x36\x38\x43\x20\x34\x2e\x36\x32\x35\x34\
-\x31\x20\x32\x2e\x37\x39\x31\x36\x38\x20\x38\x2e\x33\x37\x35\x30\
-\x34\x20\x31\x2e\x35\x34\x31\x38\x20\x38\x2e\x33\x37\x35\x30\x34\
-\x20\x30\x4c\x20\x38\x2e\x33\x37\x35\x30\x34\x20\x30\x4c\x20\x38\
-\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\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\x35\x2e\x36\x32\x38\x32\x20\x37\x34\x2e\x32\x30\x32\
-\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x38\
-\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\x43\
-\x20\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x35\x2e\x37\x39\x32\
-\x31\x20\x34\x2e\x36\x32\x35\x34\x31\x20\x2d\x31\x39\x2e\x35\x34\
-\x31\x38\x20\x30\x20\x2d\x31\x39\x2e\x35\x34\x31\x38\x43\x20\x2d\
-\x34\x2e\x36\x32\x35\x34\x31\x20\x2d\x31\x39\x2e\x35\x34\x31\x38\
-\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x35\x2e\x37\x39\
-\x32\x31\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\
-\x31\x36\x36\x37\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\x3c\x2f\x67\x3e\x0a\
-\x3c\x2f\x73\x76\x67\x3e\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
+\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
+\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
+\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
+\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\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\x03\xc4\
\x3c\
\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
@@ -1731,7 +1862,7 @@ qt_resource_data = b"\
\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\xf7\
+\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\
@@ -1758,36 +1889,32 @@ qt_resource_data = b"\
\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
-\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
-\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
-\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
-\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
-\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x31\x37\x2e\x34\
-\x2c\x32\x32\x34\x48\x32\x38\x38\x56\x39\x34\x2e\x36\x63\x30\x2d\
-\x31\x36\x2e\x39\x2d\x31\x34\x2e\x33\x2d\x33\x30\x2e\x36\x2d\x33\
-\x32\x2d\x33\x30\x2e\x36\x63\x2d\x31\x37\x2e\x37\x2c\x30\x2d\x33\
-\x32\x2c\x31\x33\x2e\x37\x2d\x33\x32\x2c\x33\x30\x2e\x36\x56\x32\
-\x32\x34\x48\x39\x34\x2e\x36\x43\x37\x37\x2e\x37\x2c\x32\x32\x34\
-\x2c\x36\x34\x2c\x32\x33\x38\x2e\x33\x2c\x36\x34\x2c\x32\x35\x36\
-\x0d\x0a\x09\x63\x30\x2c\x31\x37\x2e\x37\x2c\x31\x33\x2e\x37\x2c\
-\x33\x32\x2c\x33\x30\x2e\x36\x2c\x33\x32\x48\x32\x32\x34\x76\x31\
-\x32\x39\x2e\x34\x63\x30\x2c\x31\x36\x2e\x39\x2c\x31\x34\x2e\x33\
-\x2c\x33\x30\x2e\x36\x2c\x33\x32\x2c\x33\x30\x2e\x36\x63\x31\x37\
-\x2e\x37\x2c\x30\x2c\x33\x32\x2d\x31\x33\x2e\x37\x2c\x33\x32\x2d\
-\x33\x30\x2e\x36\x56\x32\x38\x38\x68\x31\x32\x39\x2e\x34\x63\x31\
-\x36\x2e\x39\x2c\x30\x2c\x33\x30\x2e\x36\x2d\x31\x34\x2e\x33\x2c\
-\x33\x30\x2e\x36\x2d\x33\x32\x0d\x0a\x09\x43\x34\x34\x38\x2c\x32\
-\x33\x38\x2e\x33\x2c\x34\x33\x34\x2e\x33\x2c\x32\x32\x34\x2c\x34\
-\x31\x37\x2e\x34\x2c\x32\x32\x34\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\
+\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\x03\x93\
+\x00\x00\x03\x22\
\x3c\
\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
@@ -1799,55 +1926,48 @@ qt_resource_data = b"\
\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\x6c\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
+\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x22\x32\x35\x36\x22\
+\x20\x63\x79\x3d\x22\x32\x38\x30\x22\x20\x72\x3d\x22\x36\x33\x22\
+\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\
+\x34\x30\x2c\x39\x36\x68\x2d\x38\x38\x6c\x2d\x33\x32\x2d\x33\x32\
+\x48\x31\x39\x32\x6c\x2d\x33\x32\x2c\x33\x32\x48\x37\x32\x63\x2d\
+\x32\x32\x2e\x30\x39\x32\x2c\x30\x2d\x34\x30\x2c\x31\x37\x2e\x39\
+\x30\x38\x2d\x34\x30\x2c\x34\x30\x76\x32\x37\x32\x63\x30\x2c\x32\
+\x32\x2e\x30\x39\x32\x2c\x31\x37\x2e\x39\x30\x38\x2c\x34\x30\x2c\
+\x34\x30\x2c\x34\x30\x68\x33\x36\x38\x63\x32\x32\x2e\x30\x39\x32\
+\x2c\x30\x2c\x34\x30\x2d\x31\x37\x2e\x39\x30\x38\x2c\x34\x30\x2d\
+\x34\x30\x0d\x0a\x09\x09\x56\x31\x33\x36\x43\x34\x38\x30\x2c\x31\
+\x31\x33\x2e\x39\x30\x38\x2c\x34\x36\x32\x2e\x30\x39\x32\x2c\x39\
+\x36\x2c\x34\x34\x30\x2c\x39\x36\x7a\x20\x4d\x32\x35\x36\x2c\x33\
+\x39\x32\x63\x2d\x36\x31\x2e\x38\x35\x35\x2c\x30\x2d\x31\x31\x32\
+\x2d\x35\x30\x2e\x31\x34\x35\x2d\x31\x31\x32\x2d\x31\x31\x32\x73\
+\x35\x30\x2e\x31\x34\x35\x2d\x31\x31\x32\x2c\x31\x31\x32\x2d\x31\
+\x31\x32\x73\x31\x31\x32\x2c\x35\x30\x2e\x31\x34\x35\x2c\x31\x31\
+\x32\x2c\x31\x31\x32\x0d\x0a\x09\x09\x53\x33\x31\x37\x2e\x38\x35\
+\x35\x2c\x33\x39\x32\x2c\x32\x35\x36\x2c\x33\x39\x32\x7a\x22\x2f\
+\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
+\x0a\
+\x00\x00\x02\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\x38\x2e\x31\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\
@@ -1859,206 +1979,41 @@ qt_resource_data = b"\
\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x53\x61\x76\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\
-\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\
-\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
-\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\
-\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\
-\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\x61\
-\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\
-\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x78\
-\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
-\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\
-\x31\x35\x2e\x31\x37\x33\x2c\x32\x48\x34\x43\x32\x2e\x38\x39\x39\
-\x2c\x32\x2c\x32\x2c\x32\x2e\x39\x2c\x32\x2c\x34\x76\x31\x32\x63\
-\x30\x2c\x31\x2e\x31\x2c\x30\x2e\x38\x39\x39\x2c\x32\x2c\x32\x2c\
-\x32\x68\x31\x32\x63\x31\x2e\x31\x30\x31\x2c\x30\x2c\x32\x2d\x30\
-\x2e\x39\x2c\x32\x2d\x32\x56\x35\x2e\x31\x32\x37\x4c\x31\x35\x2e\
-\x31\x37\x33\x2c\x32\x7a\x20\x4d\x31\x34\x2c\x38\x63\x30\x2c\x30\
-\x2e\x35\x34\x39\x2d\x30\x2e\x34\x35\x2c\x31\x2d\x31\x2c\x31\x48\
-\x37\x0d\x0a\x09\x43\x36\x2e\x34\x35\x2c\x39\x2c\x36\x2c\x38\x2e\
-\x35\x34\x39\x2c\x36\x2c\x38\x56\x33\x68\x38\x56\x38\x7a\x20\x4d\
-\x31\x33\x2c\x34\x68\x2d\x32\x76\x34\x68\x32\x56\x34\x7a\x22\x2f\
-\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\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\
+\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\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\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\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\
-\x00\x00\x04\x79\
+\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\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\
+\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\
@@ -2070,63 +2025,46 @@ qt_resource_data = b"\
\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\x02\xc9\
+\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\
+\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\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\
@@ -2153,27 +2091,66 @@ qt_resource_data = b"\
\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
-\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
-\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
-\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
-\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
-\x0a\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\
-\x3d\x22\x34\x38\x30\x2c\x32\x35\x36\x20\x33\x38\x34\x2c\x31\x36\
-\x30\x20\x33\x38\x34\x2c\x32\x33\x36\x20\x32\x37\x36\x2c\x32\x33\
-\x36\x20\x32\x37\x36\x2c\x31\x32\x38\x20\x33\x35\x32\x2c\x31\x32\
-\x38\x20\x32\x35\x36\x2c\x33\x32\x20\x31\x36\x30\x2c\x31\x32\x38\
-\x20\x32\x33\x36\x2c\x31\x32\x38\x20\x32\x33\x36\x2c\x32\x33\x36\
-\x20\x31\x32\x38\x2c\x32\x33\x36\x20\x31\x32\x38\x2c\x31\x36\x30\
-\x20\x33\x32\x2c\x32\x35\x36\x20\x31\x32\x38\x2c\x33\x35\x32\x20\
-\x0d\x0a\x09\x31\x32\x38\x2c\x32\x37\x36\x20\x32\x33\x36\x2c\x32\
-\x37\x36\x20\x32\x33\x36\x2c\x33\x38\x34\x20\x31\x36\x30\x2c\x33\
-\x38\x34\x20\x32\x35\x36\x2c\x34\x38\x30\x20\x33\x35\x32\x2c\x33\
-\x38\x34\x20\x32\x37\x35\x2e\x38\x2c\x33\x38\x34\x20\x32\x37\x35\
-\x2e\x34\x2c\x32\x37\x35\x2e\x35\x20\x33\x38\x34\x2c\x32\x37\x35\
-\x2e\x38\x20\x33\x38\x34\x2c\x33\x35\x32\x20\x22\x2f\x3e\x0d\x0a\
-\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x03\x46\
+\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\x6c\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x53\x61\x76\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\
+\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\
+\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
+\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\
+\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\
+\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\x61\
+\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\
+\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x78\
+\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
+\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\
+\x31\x35\x2e\x31\x37\x33\x2c\x32\x48\x34\x43\x32\x2e\x38\x39\x39\
+\x2c\x32\x2c\x32\x2c\x32\x2e\x39\x2c\x32\x2c\x34\x76\x31\x32\x63\
+\x30\x2c\x31\x2e\x31\x2c\x30\x2e\x38\x39\x39\x2c\x32\x2c\x32\x2c\
+\x32\x68\x31\x32\x63\x31\x2e\x31\x30\x31\x2c\x30\x2c\x32\x2d\x30\
+\x2e\x39\x2c\x32\x2d\x32\x56\x35\x2e\x31\x32\x37\x4c\x31\x35\x2e\
+\x31\x37\x33\x2c\x32\x7a\x20\x4d\x31\x34\x2c\x38\x63\x30\x2c\x30\
+\x2e\x35\x34\x39\x2d\x30\x2e\x34\x35\x2c\x31\x2d\x31\x2c\x31\x48\
+\x37\x0d\x0a\x09\x43\x36\x2e\x34\x35\x2c\x39\x2c\x36\x2c\x38\x2e\
+\x35\x34\x39\x2c\x36\x2c\x38\x56\x33\x68\x38\x56\x38\x7a\x20\x4d\
+\x31\x33\x2c\x34\x68\x2d\x32\x76\x34\x68\x32\x56\x34\x7a\x22\x2f\
+\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\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\
@@ -2200,35 +2177,30 @@ qt_resource_data = b"\
\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\x03\x6c\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x5f\x32\x30\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\
+\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\
+\x35\x36\x2c\x34\x38\x43\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\
+\x2c\x34\x38\x2c\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\x2c\x32\
+\x35\x36\x73\x39\x33\x2e\x36\x30\x31\x2c\x32\x30\x38\x2c\x32\x30\
+\x38\x2c\x32\x30\x38\x73\x32\x30\x38\x2d\x39\x33\x2e\x36\x30\x31\
+\x2c\x32\x30\x38\x2d\x32\x30\x38\x53\x33\x37\x30\x2e\x33\x39\x39\
+\x2c\x34\x38\x2c\x32\x35\x36\x2c\x34\x38\x7a\x20\x4d\x32\x35\x36\
+\x2c\x34\x32\x32\x2e\x33\x39\x39\x0d\x0a\x09\x09\x09\x63\x2d\x39\
+\x31\x2e\x35\x31\x38\x2c\x30\x2d\x31\x36\x36\x2e\x33\x39\x39\x2d\
+\x37\x34\x2e\x38\x38\x32\x2d\x31\x36\x36\x2e\x33\x39\x39\x2d\x31\
+\x36\x36\x2e\x33\x39\x39\x53\x31\x36\x34\x2e\x34\x38\x32\x2c\x38\
+\x39\x2e\x36\x2c\x32\x35\x36\x2c\x38\x39\x2e\x36\x53\x34\x32\x32\
+\x2e\x34\x2c\x31\x36\x34\x2e\x34\x38\x32\x2c\x34\x32\x32\x2e\x34\
+\x2c\x32\x35\x36\x53\x33\x34\x37\x2e\x35\x31\x38\x2c\x34\x32\x32\
+\x2e\x33\x39\x39\x2c\x32\x35\x36\x2c\x34\x32\x32\x2e\x33\x39\x39\
+\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\
+\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\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\
@@ -2259,39 +2231,76 @@ qt_resource_data = b"\
\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\
-\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\x03\x0c\
+\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\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\x7d\
\x3c\
\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
@@ -2303,39 +2312,30 @@ qt_resource_data = b"\
\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x43\x68\x65\x63\x6b\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\
-\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
-\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\
-\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\
-\x78\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\
-\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\
-\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\
-\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\
-\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\
-\x4d\x38\x2e\x32\x39\x34\x2c\x31\x36\x2e\x39\x39\x38\x63\x2d\x30\
-\x2e\x34\x33\x35\x2c\x30\x2d\x30\x2e\x38\x34\x37\x2d\x30\x2e\x32\
-\x30\x33\x2d\x31\x2e\x31\x31\x31\x2d\x30\x2e\x35\x35\x33\x4c\x33\
-\x2e\x36\x31\x2c\x31\x31\x2e\x37\x32\x34\x63\x2d\x30\x2e\x34\x36\
-\x35\x2d\x30\x2e\x36\x31\x33\x2d\x30\x2e\x33\x34\x34\x2d\x31\x2e\
-\x34\x38\x36\x2c\x30\x2e\x32\x37\x2d\x31\x2e\x39\x35\x31\x0d\x0a\
-\x09\x63\x30\x2e\x36\x31\x35\x2d\x30\x2e\x34\x36\x37\x2c\x31\x2e\
-\x34\x38\x38\x2d\x30\x2e\x33\x34\x34\x2c\x31\x2e\x39\x35\x33\x2c\
-\x30\x2e\x32\x37\x6c\x32\x2e\x33\x35\x31\x2c\x33\x2e\x31\x30\x34\
-\x6c\x35\x2e\x39\x31\x31\x2d\x39\x2e\x34\x39\x32\x63\x30\x2e\x34\
-\x30\x37\x2d\x30\x2e\x36\x35\x32\x2c\x31\x2e\x32\x36\x37\x2d\x30\
-\x2e\x38\x35\x32\x2c\x31\x2e\x39\x32\x31\x2d\x30\x2e\x34\x34\x35\
-\x0d\x0a\x09\x63\x30\x2e\x36\x35\x33\x2c\x30\x2e\x34\x30\x36\x2c\
-\x30\x2e\x38\x35\x34\x2c\x31\x2e\x32\x36\x36\x2c\x30\x2e\x34\x34\
-\x36\x2c\x31\x2e\x39\x32\x4c\x39\x2e\x34\x37\x38\x2c\x31\x36\x2e\
-\x33\x34\x63\x2d\x30\x2e\x32\x34\x32\x2c\x30\x2e\x33\x39\x31\x2d\
-\x30\x2e\x36\x36\x31\x2c\x30\x2e\x36\x33\x35\x2d\x31\x2e\x31\x32\
-\x2c\x30\x2e\x36\x35\x36\x43\x38\x2e\x33\x33\x36\x2c\x31\x36\x2e\
-\x39\x39\x38\x2c\x38\x2e\x33\x31\x36\x2c\x31\x36\x2e\x39\x39\x38\
-\x2c\x38\x2e\x32\x39\x34\x2c\x31\x36\x2e\x39\x39\x38\x7a\x22\x2f\
-\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x5f\x38\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
+\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\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\
"
qt_resource_name = b"\
@@ -2343,98 +2343,93 @@ qt_resource_name = b"\
\x00\x6f\xa6\x53\
\x00\x69\
\x00\x63\x00\x6f\x00\x6e\x00\x73\
-\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\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\x0d\
+\x05\x20\xce\x87\
+\x00\x6f\
+\x00\x70\x00\x65\x00\x6e\x00\x63\x00\x75\x00\x72\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\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\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\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\x08\
-\x08\xf7\x57\x07\
-\x00\x67\
-\x00\x72\x00\x69\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\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\x12\
-\x04\xb2\x21\x47\
+\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\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\x10\
+\x06\xe3\xaf\xe7\
\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\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\x10\
+\x0c\x57\x65\x47\
+\x00\x61\
+\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x72\x00\x65\x00\x73\x00\x69\x00\x7a\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x07\
+\x0c\xf8\x5a\x07\
+\x00\x65\
+\x00\x79\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\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\x16\
-\x01\xfb\x76\x27\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x61\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x62\x00\x61\x00\x63\
-\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x0a\
-\x0f\x68\x53\xe7\
-\x00\x61\
-\x00\x6e\x00\x63\x00\x68\x00\x6f\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x11\
-\x0c\xdb\x38\xe7\
+\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\x09\
+\x0b\x9e\x89\x07\
+\x00\x63\
+\x00\x68\x00\x65\x00\x63\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0e\
+\x0f\xcb\xd5\xc7\
+\x00\x70\
+\x00\x6c\x00\x75\x00\x73\x00\x2d\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x17\
+\x07\x87\x48\x27\
\x00\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\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\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\
\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\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\x12\
-\x08\x79\x97\xe7\
+\x0c\x5e\xd4\xa7\
\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\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\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\x10\
-\x0c\x57\x65\x47\
-\x00\x61\
-\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x72\x00\x65\x00\x73\x00\x69\x00\x7a\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\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\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\x08\
+\x08\xf7\x57\x07\
\x00\x67\
+\x00\x72\x00\x69\x00\x64\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\x0a\
\x0a\xc8\x62\x67\
\x00\x63\
@@ -2444,68 +2439,11 @@ qt_resource_name = b"\
\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\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\x15\
-\x0f\xc4\x59\xe7\
-\x00\x73\
-\x00\x75\x00\x62\x00\x64\x00\x69\x00\x72\x00\x65\x00\x63\x00\x74\x00\x6f\x00\x72\x00\x79\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\
-\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x12\
-\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\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\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\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\
-\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\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\x6c\x00\x65\x00\x66\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x0e\
-\x0f\xcb\xd5\xc7\
-\x00\x70\
-\x00\x6c\x00\x75\x00\x73\x00\x2d\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\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\x08\
-\x08\xc8\x55\xe7\
-\x00\x73\
-\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x17\
-\x06\xc6\x02\xa7\
-\x00\x74\
-\x00\x72\x00\x69\x00\x61\x00\x6e\x00\x67\x00\x6c\x00\x65\x00\x2d\x00\x73\x00\x74\x00\x72\x00\x6f\x00\x6b\x00\x65\x00\x64\x00\x2d\
-\x00\x31\x00\x35\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x08\
-\x0c\xf7\x55\x87\
-\x00\x74\
-\x00\x65\x00\x78\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x0d\
-\x05\x20\xce\x87\
-\x00\x6f\
-\x00\x70\x00\x65\x00\x6e\x00\x63\x00\x75\x00\x72\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x6c\x00\x65\x00\x2d\x00\x72\x00\x69\x00\x67\x00\x68\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x08\
\x05\xa8\x57\x87\
\x00\x63\
@@ -2515,63 +2453,125 @@ qt_resource_name = b"\
\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\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\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\x14\
+\x0f\xa5\xe0\xc7\
+\x00\x6d\
+\x00\x61\x00\x67\x00\x6e\x00\x69\x00\x66\x00\x79\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x67\x00\x6c\x00\x61\x00\x73\x00\x73\x00\x2e\
+\x00\x73\x00\x76\x00\x67\
+\x00\x0a\
+\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\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\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\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\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\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\x08\
\x0b\x07\x57\xa7\
\x00\x65\
\x00\x64\x00\x69\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x09\
-\x0b\x9e\x89\x07\
-\x00\x63\
-\x00\x68\x00\x65\x00\x63\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x12\
+\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\x08\
+\x08\xc8\x55\xe7\
+\x00\x73\
+\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x1c\
+\x08\x8a\x79\x07\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x61\x00\x64\x00\x69\x00\x6f\x00\x2d\x00\x62\x00\x75\x00\x74\
+\x00\x74\x00\x6f\x00\x6e\x00\x2d\x00\x6f\x00\x66\x00\x66\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\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\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\x16\
+\x01\xfb\x76\x27\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x61\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x62\x00\x61\x00\x63\
+\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
"
qt_resource_struct_v1 = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x29\x00\x00\x00\x02\
-\x00\x00\x01\x52\x00\x00\x00\x00\x00\x01\x00\x00\x1a\xa1\
-\x00\x00\x04\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x5e\x12\
-\x00\x00\x01\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x22\x25\
-\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x04\xc1\
-\x00\x00\x04\xb4\x00\x00\x00\x00\x00\x01\x00\x00\x63\xcd\
-\x00\x00\x04\x10\x00\x01\x00\x00\x00\x01\x00\x00\x53\x20\
-\x00\x00\x01\x28\x00\x00\x00\x00\x00\x01\x00\x00\x17\x67\
+\x00\x00\x01\x82\x00\x00\x00\x00\x00\x01\x00\x00\x22\x98\
+\x00\x00\x02\xd6\x00\x00\x00\x00\x00\x01\x00\x00\x45\x37\
+\x00\x00\x06\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x89\x6a\
+\x00\x00\x01\x56\x00\x00\x00\x00\x00\x01\x00\x00\x1f\x6e\
+\x00\x00\x04\x74\x00\x00\x00\x00\x00\x01\x00\x00\x6b\xdf\
+\x00\x00\x00\xd0\x00\x01\x00\x00\x00\x01\x00\x00\x11\x0a\
+\x00\x00\x03\xde\x00\x00\x00\x00\x00\x01\x00\x00\x60\xa0\
+\x00\x00\x03\xba\x00\x00\x00\x00\x00\x01\x00\x00\x5b\xdf\
\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x05\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x76\x46\
-\x00\x00\x05\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x7a\xd7\
-\x00\x00\x05\xd8\x00\x00\x00\x00\x00\x01\x00\x00\x7f\x54\
-\x00\x00\x05\x58\x00\x00\x00\x00\x00\x01\x00\x00\x70\x97\
-\x00\x00\x04\x36\x00\x00\x00\x00\x00\x01\x00\x00\x55\x44\
-\x00\x00\x02\x14\x00\x00\x00\x00\x00\x01\x00\x00\x2b\x02\
-\x00\x00\x03\x92\x00\x00\x00\x00\x00\x01\x00\x00\x4a\x22\
-\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x0e\xe0\
-\x00\x00\x03\x16\x00\x00\x00\x00\x00\x01\x00\x00\x41\x92\
-\x00\x00\x02\x68\x00\x00\x00\x00\x00\x01\x00\x00\x32\xaa\
-\x00\x00\x02\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x3d\x7e\
-\x00\x00\x04\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x5b\x12\
-\x00\x00\x05\x42\x00\x00\x00\x00\x00\x01\x00\x00\x6e\x27\
-\x00\x00\x01\xee\x00\x00\x00\x00\x00\x01\x00\x00\x28\x85\
-\x00\x00\x00\xd6\x00\x01\x00\x00\x00\x01\x00\x00\x12\x36\
-\x00\x00\x05\xfa\x00\x00\x00\x00\x00\x01\x00\x00\x82\x21\
-\x00\x00\x00\x88\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x1f\
-\x00\x00\x03\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x47\xa1\
-\x00\x00\x03\x40\x00\x00\x00\x00\x00\x01\x00\x00\x44\x38\
-\x00\x00\x06\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x85\x6b\
-\x00\x00\x06\x34\x00\x00\x00\x00\x00\x01\x00\x00\x88\xdb\
-\x00\x00\x02\xca\x00\x00\x00\x00\x00\x01\x00\x00\x3a\xfb\
-\x00\x00\x03\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x4e\xb8\
-\x00\x00\x00\x60\x00\x00\x00\x00\x00\x01\x00\x00\x07\xeb\
-\x00\x00\x01\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x25\xca\
-\x00\x00\x05\x8c\x00\x00\x00\x00\x00\x01\x00\x00\x75\x65\
-\x00\x00\x02\x54\x00\x00\x00\x00\x00\x01\x00\x00\x2e\xbb\
-\x00\x00\x00\xec\x00\x00\x00\x00\x00\x01\x00\x00\x14\x17\
-\x00\x00\x01\xac\x00\x00\x00\x00\x00\x01\x00\x00\x24\xa6\
-\x00\x00\x05\x14\x00\x00\x00\x00\x00\x01\x00\x00\x6a\x90\
-\x00\x00\x03\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x4e\x48\
-\x00\x00\x04\xf2\x00\x00\x00\x00\x00\x01\x00\x00\x67\x95\
-\x00\x00\x02\x92\x00\x00\x00\x00\x00\x01\x00\x00\x35\xd0\
+\x00\x00\x03\x82\x00\x00\x00\x00\x00\x01\x00\x00\x54\x95\
+\x00\x00\x03\x98\x00\x00\x00\x00\x00\x01\x00\x00\x59\x12\
+\x00\x00\x02\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x37\xa3\
+\x00\x00\x00\xf6\x00\x00\x00\x00\x00\x01\x00\x00\x13\x2e\
+\x00\x00\x03\x42\x00\x00\x00\x00\x00\x01\x00\x00\x50\xdc\
+\x00\x00\x01\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x2a\x1c\
+\x00\x00\x02\x08\x00\x00\x00\x00\x00\x01\x00\x00\x34\x4d\
+\x00\x00\x05\x34\x00\x00\x00\x00\x00\x01\x00\x00\x7b\xb9\
+\x00\x00\x04\xda\x00\x00\x00\x00\x00\x01\x00\x00\x72\x62\
+\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xf6\
+\x00\x00\x05\x74\x00\x00\x00\x00\x00\x01\x00\x00\x80\xcf\
+\x00\x00\x05\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x7e\x5f\
+\x00\x00\x02\x70\x00\x00\x00\x00\x00\x01\x00\x00\x3c\x71\
+\x00\x00\x02\xc0\x00\x01\x00\x00\x00\x01\x00\x00\x43\x56\
+\x00\x00\x04\x50\x00\x00\x00\x00\x00\x01\x00\x00\x68\x95\
+\x00\x00\x05\x04\x00\x00\x00\x00\x00\x01\x00\x00\x75\x88\
+\x00\x00\x03\x0a\x00\x00\x00\x00\x00\x01\x00\x00\x4e\x5b\
+\x00\x00\x02\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x4a\xf2\
+\x00\x00\x05\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x78\x49\
+\x00\x00\x01\xce\x00\x00\x00\x00\x00\x01\x00\x00\x2e\x42\
+\x00\x00\x01\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x18\xfc\
+\x00\x00\x02\x96\x00\x00\x00\x00\x00\x01\x00\x00\x3e\xee\
+\x00\x00\x00\x30\x00\x00\x00\x00\x00\x01\x00\x00\x04\x91\
+\x00\x00\x04\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x6f\xa7\
+\x00\x00\x00\x58\x00\x00\x00\x00\x00\x01\x00\x00\x08\xc5\
+\x00\x00\x01\x42\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x7f\
+\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x01\x00\x00\x09\xa6\
+\x00\x00\x04\x36\x00\x00\x00\x00\x00\x01\x00\x00\x67\x71\
+\x00\x00\x04\x08\x00\x00\x00\x00\x00\x01\x00\x00\x63\xda\
+\x00\x00\x05\xea\x00\x00\x00\x00\x00\x01\x00\x00\x88\xfa\
+\x00\x00\x01\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x31\x52\
+\x00\x00\x05\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x83\xcf\
"
qt_resource_struct_v2 = b"\
@@ -2579,88 +2579,88 @@ qt_resource_struct_v2 = b"\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x29\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x01\x52\x00\x00\x00\x00\x00\x01\x00\x00\x1a\xa1\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4f\
-\x00\x00\x04\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x5e\x12\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4d\
-\x00\x00\x01\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x22\x25\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4b\
-\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x04\xc1\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4d\
-\x00\x00\x04\xb4\x00\x00\x00\x00\x00\x01\x00\x00\x63\xcd\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4e\
-\x00\x00\x04\x10\x00\x01\x00\x00\x00\x01\x00\x00\x53\x20\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4f\
-\x00\x00\x01\x28\x00\x00\x00\x00\x00\x01\x00\x00\x17\x67\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4c\
+\x00\x00\x01\x82\x00\x00\x00\x00\x00\x01\x00\x00\x22\x98\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x02\xd6\x00\x00\x00\x00\x00\x01\x00\x00\x45\x37\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdc\
+\x00\x00\x06\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x89\x6a\
+\x00\x00\x01\x6d\xe7\x76\xbf\xda\
+\x00\x00\x01\x56\x00\x00\x00\x00\x00\x01\x00\x00\x1f\x6e\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdc\
+\x00\x00\x04\x74\x00\x00\x00\x00\x00\x01\x00\x00\x6b\xdf\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdc\
+\x00\x00\x00\xd0\x00\x01\x00\x00\x00\x01\x00\x00\x11\x0a\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x03\xde\x00\x00\x00\x00\x00\x01\x00\x00\x60\xa0\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdb\
+\x00\x00\x03\xba\x00\x00\x00\x00\x00\x01\x00\x00\x5b\xdf\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4e\
-\x00\x00\x05\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x76\x46\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4f\
-\x00\x00\x05\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x7a\xd7\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4e\
-\x00\x00\x05\xd8\x00\x00\x00\x00\x00\x01\x00\x00\x7f\x54\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4d\
-\x00\x00\x05\x58\x00\x00\x00\x00\x00\x01\x00\x00\x70\x97\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x50\
-\x00\x00\x04\x36\x00\x00\x00\x00\x00\x01\x00\x00\x55\x44\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4c\
-\x00\x00\x02\x14\x00\x00\x00\x00\x00\x01\x00\x00\x2b\x02\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4e\
-\x00\x00\x03\x92\x00\x00\x00\x00\x00\x01\x00\x00\x4a\x22\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4f\
-\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x0e\xe0\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4c\
-\x00\x00\x03\x16\x00\x00\x00\x00\x00\x01\x00\x00\x41\x92\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4c\
-\x00\x00\x02\x68\x00\x00\x00\x00\x00\x01\x00\x00\x32\xaa\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4b\
-\x00\x00\x02\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x3d\x7e\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4e\
-\x00\x00\x04\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x5b\x12\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4d\
-\x00\x00\x05\x42\x00\x00\x00\x00\x00\x01\x00\x00\x6e\x27\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4f\
-\x00\x00\x01\xee\x00\x00\x00\x00\x00\x01\x00\x00\x28\x85\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4c\
-\x00\x00\x00\xd6\x00\x01\x00\x00\x00\x01\x00\x00\x12\x36\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4f\
-\x00\x00\x05\xfa\x00\x00\x00\x00\x00\x01\x00\x00\x82\x21\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4e\
-\x00\x00\x00\x88\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x1f\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4e\
-\x00\x00\x03\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x47\xa1\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4b\
-\x00\x00\x03\x40\x00\x00\x00\x00\x00\x01\x00\x00\x44\x38\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4d\
-\x00\x00\x06\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x85\x6b\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4e\
-\x00\x00\x06\x34\x00\x00\x00\x00\x00\x01\x00\x00\x88\xdb\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4e\
-\x00\x00\x02\xca\x00\x00\x00\x00\x00\x01\x00\x00\x3a\xfb\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4d\
-\x00\x00\x03\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x4e\xb8\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4d\
-\x00\x00\x00\x60\x00\x00\x00\x00\x00\x01\x00\x00\x07\xeb\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4e\
-\x00\x00\x01\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x25\xca\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4c\
-\x00\x00\x05\x8c\x00\x00\x00\x00\x00\x01\x00\x00\x75\x65\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4f\
-\x00\x00\x02\x54\x00\x00\x00\x00\x00\x01\x00\x00\x2e\xbb\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4f\
-\x00\x00\x00\xec\x00\x00\x00\x00\x00\x01\x00\x00\x14\x17\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4d\
-\x00\x00\x01\xac\x00\x00\x00\x00\x00\x01\x00\x00\x24\xa6\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4b\
-\x00\x00\x05\x14\x00\x00\x00\x00\x00\x01\x00\x00\x6a\x90\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4f\
-\x00\x00\x03\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x4e\x48\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4f\
-\x00\x00\x04\xf2\x00\x00\x00\x00\x00\x01\x00\x00\x67\x95\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4f\
-\x00\x00\x02\x92\x00\x00\x00\x00\x00\x01\x00\x00\x35\xd0\
-\x00\x00\x01\x6d\xb9\xf0\xcb\x4c\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x03\x82\x00\x00\x00\x00\x00\x01\x00\x00\x54\x95\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x03\x98\x00\x00\x00\x00\x00\x01\x00\x00\x59\x12\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdc\
+\x00\x00\x02\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x37\xa3\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x00\xf6\x00\x00\x00\x00\x00\x01\x00\x00\x13\x2e\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdb\
+\x00\x00\x03\x42\x00\x00\x00\x00\x00\x01\x00\x00\x50\xdc\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdc\
+\x00\x00\x01\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x2a\x1c\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x02\x08\x00\x00\x00\x00\x00\x01\x00\x00\x34\x4d\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdb\
+\x00\x00\x05\x34\x00\x00\x00\x00\x00\x01\x00\x00\x7b\xb9\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdb\
+\x00\x00\x04\xda\x00\x00\x00\x00\x00\x01\x00\x00\x72\x62\
+\x00\x00\x01\x6d\xe7\x76\xbf\xda\
+\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xf6\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdc\
+\x00\x00\x05\x74\x00\x00\x00\x00\x00\x01\x00\x00\x80\xcf\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdb\
+\x00\x00\x05\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x7e\x5f\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x02\x70\x00\x00\x00\x00\x00\x01\x00\x00\x3c\x71\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdb\
+\x00\x00\x02\xc0\x00\x01\x00\x00\x00\x01\x00\x00\x43\x56\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x04\x50\x00\x00\x00\x00\x00\x01\x00\x00\x68\x95\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdc\
+\x00\x00\x05\x04\x00\x00\x00\x00\x00\x01\x00\x00\x75\x88\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdc\
+\x00\x00\x03\x0a\x00\x00\x00\x00\x00\x01\x00\x00\x4e\x5b\
+\x00\x00\x01\x6d\xe7\x76\xbf\xda\
+\x00\x00\x02\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x4a\xf2\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdc\
+\x00\x00\x05\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x78\x49\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x01\xce\x00\x00\x00\x00\x00\x01\x00\x00\x2e\x42\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdc\
+\x00\x00\x01\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x18\xfc\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdc\
+\x00\x00\x02\x96\x00\x00\x00\x00\x00\x01\x00\x00\x3e\xee\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdb\
+\x00\x00\x00\x30\x00\x00\x00\x00\x00\x01\x00\x00\x04\x91\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x04\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x6f\xa7\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdb\
+\x00\x00\x00\x58\x00\x00\x00\x00\x00\x01\x00\x00\x08\xc5\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x01\x42\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x7f\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x01\x00\x00\x09\xa6\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdc\
+\x00\x00\x04\x36\x00\x00\x00\x00\x00\x01\x00\x00\x67\x71\
+\x00\x00\x01\x6d\xe7\x76\xbf\xda\
+\x00\x00\x04\x08\x00\x00\x00\x00\x00\x01\x00\x00\x63\xda\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x05\xea\x00\x00\x00\x00\x00\x01\x00\x00\x88\xfa\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x01\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x31\x52\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdd\
+\x00\x00\x05\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x83\xcf\
+\x00\x00\x01\x6d\xe7\x76\xbf\xdb\
"
qt_version = [int(v) for v in QtCore.qVersion().split('.')]
diff --git a/graphics/asymptote/Makefile.in b/graphics/asymptote/Makefile.in
index 68bec17d4f..5d0a72c0d1 100644
--- a/graphics/asymptote/Makefile.in
+++ b/graphics/asymptote/Makefile.in
@@ -260,7 +260,7 @@ install-asy: asy sty
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/WebGL*.html base/webgl/asygl.js \
+ ${INSTALL} -p -m 644 base/webgl/asygl.js \
$(webgldir)
-${INSTALL} -p -m 644 GUI/pyUIClass/*.py $(GUIdir)/pyUIClass
${INSTALL} -p -m 644 GUI/configs/*.cson $(GUIdir)/configs
diff --git a/graphics/asymptote/ReleaseNotes b/graphics/asymptote/ReleaseNotes
index c03beb3805..136c9c798b 100644
--- a/graphics/asymptote/ReleaseNotes
+++ b/graphics/asymptote/ReleaseNotes
@@ -1,3 +1,14 @@
+Release Notes for Version 2.59
+
+OpenGL memory allocation and transparency bugs introduced in version 2.54 were
+fixed. Rendering efficiency was improved. In view of limited GPU resources,
+only the required material uniforms are passed to each shader.
+The WebGL vertex and fragment shaders have been moved to the asygl library.
+Multiple embedded images now share a single WebGL context and shaders,
+to work around browser limitations. A bug in 3D arrows was fixed.
+Unavailable material attributes are now ignored. Miscellaneous Python support
+files were ported to Python3. The obsolete maxvertices setting was removed.
+
Release Notes for Version 2.58
Intersection points in geometry.asy are now returned in currentcoordsys;
diff --git a/graphics/asymptote/aspy.py b/graphics/asymptote/aspy.py
index 6b3fb3ec2e..6c657c7bde 100644
--- a/graphics/asymptote/aspy.py
+++ b/graphics/asymptote/aspy.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python3
#####
#
# aspy.py
@@ -339,7 +340,7 @@ def DatumFromCallable(f):
return DatumFromHandle(h)
-print "version", policy.contents.version
+print ("version", policy.contents.version)
state = State(baseState)
diff --git a/graphics/asymptote/asy-keywords.el b/graphics/asymptote/asy-keywords.el
index aa175281db..27b65e2ba9 100644
--- a/graphics/asymptote/asy-keywords.el
+++ b/graphics/asymptote/asy-keywords.el
@@ -2,7 +2,7 @@
;; This file is automatically generated by asy-list.pl.
;; Changes will be overwritten.
;;
-(defvar asy-keywords-version "2.58")
+(defvar asy-keywords-version "2.59")
(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 ))
diff --git a/graphics/asymptote/asymptote.spec b/graphics/asymptote/asymptote.spec
index 0703faf6cb..addcb0b1df 100644
--- a/graphics/asymptote/asymptote.spec
+++ b/graphics/asymptote/asymptote.spec
@@ -3,7 +3,7 @@
%global __python %{__python3}
Name: asymptote
-Version: 2.58
+Version: 2.59
Release: 1%{?dist}
Summary: Descriptive vector graphics language
diff --git a/graphics/asymptote/base/asymptote.py b/graphics/asymptote/base/asymptote.py
index 19b72c5082..1a7aebd0fd 100755
--- a/graphics/asymptote/base/asymptote.py
+++ b/graphics/asymptote/base/asymptote.py
@@ -32,19 +32,15 @@ class asy:
self.send('quit');
self.session.stdin.close();
self.session.wait()
-
-
-
-
if __name__=="__main__":
- g = asy()
+ g=asy()
g.size(200)
- g.draw("unitcircle")
- g.send("draw(unitsquare)")
- g.fill("unitsquare, blue")
- g.clip("unitcircle")
- g.label("\"$O$\", (0,0), SW")
- raw_input("press ENTER to continue")
+ g.draw('unitcircle')
+ g.send('draw(unitsquare)')
+ g.fill('unitsquare,blue')
+ g.clip('unitcircle')
+ g.label('"$O$",(0,0),SW')
+ input('press ENTER to continue')
g.erase()
del g
diff --git a/graphics/asymptote/base/shaders/fragment.glsl b/graphics/asymptote/base/shaders/fragment.glsl
index 83718420e3..cdcc0b49e8 100644
--- a/graphics/asymptote/base/shaders/fragment.glsl
+++ b/graphics/asymptote/base/shaders/fragment.glsl
@@ -131,7 +131,6 @@ void main()
{
vec4 diffuse;
vec4 emissive;
- vec4 parameters;
Material m;
#ifdef TRANSPARENT
@@ -162,9 +161,9 @@ void main()
#endif
#endif
-#ifdef NORMAL
+#if defined(NORMAL) && Nlights > 0
Specular=m.specular.rgb;
- parameters=m.parameters;
+ vec4 parameters=m.parameters;
Roughness2=1.0-parameters[0];
Roughness2=Roughness2*Roughness2;
Metallic=parameters[1];
diff --git a/graphics/asymptote/base/three_arrows.asy b/graphics/asymptote/base/three_arrows.asy
index 4398b9bd78..87fc39c52e 100644
--- a/graphics/asymptote/base/three_arrows.asy
+++ b/graphics/asymptote/base/three_arrows.asy
@@ -71,7 +71,7 @@ struct arrowhead3
real arcsize(pen p)=arcarrowsize;
real gap=1;
real size;
- bool splitpath=true;
+ bool splitpath=false;
surface head(path3 g, position position=EndPoint,
pen p=currentpen, real size=0, real angle=arrowangle,
@@ -286,6 +286,7 @@ arrowhead3 HookHead2(real dir=arrowdir, real barb=arrowbarb, triple normal=O)
};
a.arrowhead2=HookHead;
a.gap=1.005;
+ a.splitpath=true;
return a;
}
arrowhead3 HookHead2=HookHead2();
@@ -308,7 +309,6 @@ arrowhead3 TeXHead2(triple normal=O) {
};
a.arrowhead2=TeXHead;
a.size=TeXHead.size;
- a.splitpath=false;
a.gap=1.005;
return a;
}
diff --git a/graphics/asymptote/base/webgl/WebGLfooter.html b/graphics/asymptote/base/webgl/WebGLfooter.html
deleted file mode 100644
index 4aba96372e..0000000000
--- a/graphics/asymptote/base/webgl/WebGLfooter.html
+++ /dev/null
@@ -1,10 +0,0 @@
-</script>
-
-</head>
-
-
-<body style="overflow: hidden;" onload="webGLStart();">
-<canvas id="Asymptote" style="border: none;" width="0" height="0" />
-</body>
-
-</html>
diff --git a/graphics/asymptote/base/webgl/asygl.js b/graphics/asymptote/base/webgl/asygl.js
index d6417c416e..9b7abe5b84 100644
--- a/graphics/asymptote/base/webgl/asygl.js
+++ b/graphics/asymptote/base/webgl/asygl.js
@@ -1,5 +1,5 @@
/*@license
- gl.js: Render Bezier patches via subdivision with WebGL.
+ AsyGL: Render Bezier patches and triangles via subdivision with WebGL.
Copyright 2019: John C. Bowman and Supakorn "Jamie" Rassameemasmuang
University of Alberta
@@ -16,7 +16,6 @@ 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 r in i)("object"==typeof exports?exports:t)[r]=i[r]}}("undefined"!=typeof self?self:this,function(){return function(t){var e={};function i(r){if(e[r])return e[r].exports;var a=e[r]={i:r,l:!1,exports:{}};return t[r].call(a.exports,a,a.exports,i),a.l=!0,a.exports}return i.m=t,i.c=e,i.d=function(t,e,r){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.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*a},e.equals=function(t,e){return Math.abs(t-e)<=r*Math.max(1,Math.abs(t),Math.abs(e))};var r=e.EPSILON=1e-6;e.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,e.RANDOM=Math.random;var a=Math.PI/180},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.mat4=e.mat3=void 0;var r=s(i(2)),a=s(i(3));function s(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}e.mat3=r,e.mat4=a},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.create=function(){var t=new r.ARRAY_TYPE(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},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],r=e[1],a=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+r*m+a*u;if(!f)return null;return f=1/f,t[0]=d*f,t[1]=(-c*r+a*l)*f,t[2]=(o*r-a*n)*f,t[3]=m*f,t[4]=(c*i-a*h)*f,t[5]=(-o*i+a*s)*f,t[6]=u*f,t[7]=(-l*i+r*h)*f,t[8]=(n*i-r*s)*f,t};var r=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 r.ARRAY_TYPE(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},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],r=e[1],a=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-r*n,M=i*h-a*n,w=i*l-s*n,A=r*h-a*o,S=r*l-s*o,b=a*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;if(!E)return null;return E=1/E,t[0]=(o*T-h*D+l*y)*E,t[1]=(a*D-r*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-a*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]=(r*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-r*z+a*P)*E,t[14]=(v*M-f*A-p*x)*E,t[15]=(c*A-d*M+m*x)*E,t},e.multiply=a,e.translate=function(t,e,i){var r=i[0],a=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;e===t?(t[12]=e[0]*r+e[4]*a+e[8]*s+e[12],t[13]=e[1]*r+e[5]*a+e[9]*s+e[13],t[14]=e[2]*r+e[6]*a+e[10]*s+e[14],t[15]=e[3]*r+e[7]*a+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*r+c*a+f*s+e[12],t[13]=o*r+d*a+v*s+e[13],t[14]=h*r+m*a+p*s+e[14],t[15]=l*r+u*a+g*s+e[15]);return t},e.rotate=function(t,e,i,a){var s=a[0],n=a[1],o=a[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;if(Math.abs(h)<r.EPSILON)return null;s*=h=1/h,n*=h,o*=h,l=Math.sin(i),c=Math.cos(i),d=1-c,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]);return 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 a=i[0],s=i[1],n=i[2],o=Math.sqrt(a*a+s*s+n*n),h=void 0,l=void 0,c=void 0;if(Math.abs(o)<r.EPSILON)return null;return a*=o=1/o,s*=o,n*=o,h=Math.sin(e),l=Math.cos(e),c=1-l,t[0]=a*a*c+l,t[1]=s*a*c+n*h,t[2]=n*a*c-s*h,t[3]=0,t[4]=a*s*c-n*h,t[5]=s*s*c+l,t[6]=n*s*c+a*h,t[7]=0,t[8]=a*n*c+s*h,t[9]=s*n*c-a*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,r,a,s,n){var o=1/(i-e),h=1/(a-r),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]=(a+r)*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,r,a,s,n){var o=1/(e-i),h=1/(r-a),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]=(a+r)*h,t[14]=(n+s)*l,t[15]=1,t};var r=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 a(t,e,i){var r=e[0],a=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*r+w*o+A*d+S*v,t[1]=M*a+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*r+w*o+A*d+S*v,t[5]=M*a+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*r+w*o+A*d+S*v,t[9]=M*a+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*r+w*o+A*d+S*v,t[13]=M*a+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}}])});let Zoom,Zoom0,pixel=.75,BezierFactor=.4,FillFactor=.1,maxViewportWidth=window.innerWidth,maxViewportHeight=window.innerHeight,viewportmargin=0,viewportshift=[0,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,r,a,s){this.diffuse=t,this.emissive=e,this.specular=i,this.shininess=r,this.metallic=a,this.fresnel0=s}setUniform(t,e,i=null){let r;r=null===i?i=>gl.getUniformLocation(t,e+"."+i):r=>gl.getUniformLocation(t,e+"["+i+"]."+r),gl.uniform4fv(r("diffuse"),new Float32Array(this.diffuse)),gl.uniform4fv(r("emissive"),new Float32Array(this.emissive)),gl.uniform4fv(r("specular"),new Float32Array(this.specular)),gl.uniform1f(r("shininess"),this.shininess),gl.uniform1f(r("metallic"),this.metallic),gl.uniform1f(r("fresnel0"),this.fresnel0)}}let enumPointLight=1,enumDirectionalLight=2;class Light{constructor(t,e){this.direction=t,this.color=e}setUniform(t,e,i){let r=r=>gl.getUniformLocation(t,e+"["+i+"]."+r);gl.uniform3fv(r("direction"),new Float32Array(this.direction)),gl.uniform3fv(r("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 r=document.getElementById(e);if(!r)return null;let a=`#version 100\n#ifdef GL_FRAGMENT_PRECISION_HIGH\n precision highp float;\n#else\n precision mediump float;\n#endif\n #define nlights ${Lights.length}\n\n const int nLights=${Math.max(Lights.length,1)};\n\n const int nMaterials=${Math.max(Materials.length,1)};\n`;orthographic&&(a+="#define ORTHOGRAPHIC\n"),i.forEach(t=>a+="#define "+t+"\n");let s,n=r.firstChild;for(;n;)3==n.nodeType&&(a+=n.textContent),n=n.nextSibling;if("x-shader/x-fragment"==r.type)s=t.createShader(t.FRAGMENT_SHADER);else{if("x-shader/x-vertex"!=r.type)return null;s=t.createShader(t.VERTEX_SHADER)}return t.shaderSource(s,a),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 r=e==pixelShader,a=!r&&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,a?24:r?16:12,0),a?gl.vertexAttribPointer(e.vertexNormalAttribute,3,gl.FLOAT,!1,24,12):r&&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(a?gl.TRIANGLES:r?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,r=[0,0,0,0]){let a=6*t;this.vertices[a]=e[0],this.vertices[a+1]=e[1],this.vertices[a+2]=e[2],this.vertices[a+3]=i[0],this.vertices[a+4]=i[1],this.vertices[a+5]=i[2],this.materials[t]=materialIndex;let s=4*t;this.colors[s]=r[0],this.colors[s+1]=r[1],this.colors[s+2]=r[2],this.colors[s+3]=r[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,r=e.length;t.length+=r;for(let a=0;a<r;++a)t[i+a]=e[a]}function appendOffset(t,e,i){let r=t.length,a=e.length;t.length+=e.length;for(let s=0;s<a;++s)t[r+s]=e[s]+i}class Geometry{constructor(){this.data=new vertexBuffer,this.Onscreen=!1,this.m=[]}offscreen(t){let e=projViewMat,i=t[0],r=i[0],a=i[1],s=i[2],n=1/(e[3]*r+e[7]*a+e[11]*s+e[15]);this.x=this.X=(e[0]*r+e[4]*a+e[8]*s+e[12])*n,this.y=this.Y=(e[1]*r+e[5]*a+e[9]*s+e[13])*n;for(let i=1,r=t.length;i<r;++i){let r=t[i],a=r[0],s=r[1],n=r[2],o=1/(e[3]*a+e[7]*s+e[11]*n+e[15]),h=(e[0]*a+e[4]*s+e[8]*n+e[12])*o,l=(e[1]*a+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],r=this.c[2],a=t[0]-e,s=t[1]-i,n=t[2]-r;return[a*normMat[0]+s*normMat[3]+n*normMat[6]+e,a*normMat[1]+s*normMat[4]+n*normMat[7]+i,a*normMat[2]+s*normMat[5]+n*normMat[8]+r]}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 r=0;r<t;++r)e[r]=this.T(i[r])}materialIndex=this.MaterialIndex;let r=orthographic?1:this.Min[2]/B[2],a=pixel*Math.hypot(r*(viewParam.xmax-viewParam.xmin),r*(viewParam.ymax-viewParam.ymin))/size2;this.res2=a*a,this.Epsilon=FillFactor*a,this.data.clear(),this.Onscreen=!0,this.process(e)}}class BezierPatch extends Geometry{constructor(t,e,i,r,a,s){super(),this.controlpoints=t,this.Min=r,this.Max=a,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 r=1;r<i;++r)this.epsilon=Math.max(this.epsilon,abs2([t[r][0]-e[0],t[r][1]-e[1],t[r][2]-e[2]]));this.epsilon*=Fuzz4}processTriangle(t){let e=t[0],i=t[1],r=t[2],a=unit(cross([i[0]-e[0],i[1]-e[1],i[2]-e[2]],[r[0]-e[0],r[1]-e[1],r[2]-e[2]]));this.offscreen([e,i,r])||(this.color?(this.data.indices.push(this.data.Vertex(e,a,this.color[0])),this.data.indices.push(this.data.Vertex(i,a,this.color[1])),this.data.indices.push(this.data.Vertex(r,a,this.color[2]))):(this.data.indices.push(this.vertex(e,a)),this.data.indices.push(this.vertex(i,a)),this.data.indices.push(this.vertex(r,a))),this.append())}processQuad(t){let e=t[0],i=t[1],r=t[2],a=t[3],s=cross([i[0]-e[0],i[1]-e[1],i[2]-e[2]],[r[0]-i[0],r[1]-i[1],r[2]-i[2]]),n=cross([r[0]-a[0],r[1]-a[1],r[2]-a[2]],[a[0]-e[0],a[1]-e[1],a[2]-e[2]]),o=unit([s[0]+n[0],s[1]+n[1],s[2]+n[2]]);if(!this.offscreen([e,i,r,a])){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(r,o,this.color[2]),h=this.data.Vertex(a,o,this.color[3])):(t=this.vertex(e,o),s=this.vertex(i,o),n=this.vertex(r,o),h=this.vertex(a,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],r=t[12],a=t[15],s=this.normal(i,t[2],t[1],e,t[4],t[8],r);iszero(s)&&iszero(s=this.normal(i,t[2],t[1],e,t[13],t[14],a))&&(s=this.normal(a,t[11],t[7],i,t[4],t[8],r));let n=this.normal(e,t[4],t[8],r,t[13],t[14],a);iszero(n)&&iszero(n=this.normal(e,t[4],t[8],r,t[11],t[7],i))&&(n=this.normal(i,t[2],t[1],e,t[13],t[14],a));let o=this.normal(r,t[13],t[14],a,t[11],t[7],i);iszero(o)&&iszero(o=this.normal(r,t[13],t[14],a,t[2],t[1],e))&&(o=this.normal(e,t[4],t[8],r,t[11],t[7],i));let h=this.normal(a,t[11],t[7],i,t[2],t[1],e);if(iszero(h)&&iszero(h=this.normal(a,t[11],t[7],i,t[4],t[8],r))&&(h=this.normal(r,t[13],t[14],a,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(r,n,c),v=this.data.Vertex(a,o,d),p=this.data.Vertex(i,h,m);this.Render(t,u,f,v,p,e,r,a,i,!1,!1,!1,!1,l,c,d,m)}else{let l=this.vertex(e,s),c=this.vertex(r,n),d=this.vertex(a,o),m=this.vertex(i,h);this.Render(t,l,c,d,m,e,r,a,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,r,a,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(r)),this.offscreen([s,o,h])||(this.data.indices.push(e),this.data.indices.push(r),this.data.indices.push(a));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],L=O[15],F=this.normal(O[0],O[4],O[8],O[12],O[13],O[14],O[15]);iszero(F)&&iszero(F=this.normal(O[0],O[4],O[8],O[12],O[11],O[7],O[3]))&&(F=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],L,_[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,F,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(L,U,w);this.Render(O,e,A,z,P,s,Y,L,k,l,!1,!1,m,u,t,w,M),this.Render(B,A,i,S,z,Y,n,j,L,l,c,!1,!1,t,f,g,w),this.Render(_,z,S,r,b,L,j,o,G,!1,c,d,!1,w,g,v,x),this.Render(C,P,z,b,a,k,L,G,h,!1,!1,d,m,M,w,x,p)}else{let t=this.vertex(Y,F),u=this.vertex(j,V),f=this.vertex(G,N),v=this.vertex(k,H),p=this.vertex(L,U);this.Render(O,e,t,p,v,s,Y,L,k,l,!1,!1,m),this.Render(B,t,i,u,p,Y,n,j,L,l,c,!1,!1),this.Render(_,p,u,r,f,L,j,o,G,!1,c,d,!1),this.Render(C,v,p,f,a,k,L,G,h,!1,!1,d,m)}}}process3(t){this.Res2=BezierFactor*BezierFactor*this.res2;let e=t[0],i=t[6],r=t[9],a=this.normal(r,t[5],t[2],e,t[1],t[3],i),s=this.normal(e,t[1],t[3],i,t[7],t[8],r),n=this.normal(i,t[7],t[8],r,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,a,o),d=this.data.Vertex(i,s,h),m=this.data.Vertex(r,n,l);this.Render3(t,c,d,m,e,i,r,!1,!1,!1,o,h,l)}else{let o=this.vertex(e,a),h=this.vertex(i,s),l=this.vertex(r,n);this.Render3(t,o,h,l,e,i,r,!1,!1,!1)}this.data.indices.length>0&&this.append()}Render3(t,e,i,r,a,s,n,o,h,l,c,d,m){if(this.Distance3(t)<this.Res2)this.offscreen([a,s,n])||(this.data.indices.push(e),this.data.indices.push(i),this.data.indices.push(r));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])],L=[.5*(P[0]+y[0]),.5*(P[1]+y[1]),.5*(P[2]+y[2])],F=[.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*(L[0]+U[0]),.5*(L[1]+U[1]),.5*(L[2]+U[2])],q=[.5*(L[0]+N[0]),.5*(L[1]+N[1]),.5*(L[2]+N[2])],K=[.5*(C[0]+V[0]),.5*(C[1]+V[1]),.5*(C[2]+V[2])],$=[.5*(F[0]+V[0]),.5*(F[1]+V[1]),.5*(F[2]+V[2])],Q=[.5*(C[0]+F[0]),.5*(C[1]+F[1]),.5*(C[2]+F[2])],J=[u,O,T,W,[.5*(D[0]+O[0]),.5*(D[1]+O[1]),.5*(D[2]+O[2])],F,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=[Q,K,C,Z,[.5*(b[0]+R[0]),.5*(b[1]+R[1]),.5*(b[2]+R[2])],b,q,L,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],rt=this.normal(k,G,X,q,Z,K,Q),at=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]+a[0]),.5*(n[1]+a[1]),.5*(n[2]+a[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=Q;let lt=[.5*(a[0]+s[0]),.5*(a[1]+s[1]),.5*(a[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,rt,t),p=this.data.Vertex(ht,at,u),g=this.data.Vertex(lt,st,f);this.Render3(J,e,g,p,a,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,r,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,rt),c=this.vertex(ht,at),d=this.vertex(lt,st);this.Render3(J,e,d,c,a,lt,ht,!1,h,l),this.Render3(tt,d,i,t,lt,s,ot,o,!1,l),this.Render3(et,c,t,r,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],r=t[12],a=t[15],s=Distance2(a,e,this.normal(i,t[2],t[1],e,t[4],t[8],r));return s=Math.max(s,Straightness(e,t[1],t[2],i)),s=Math.max(s,Straightness(e,t[4],t[8],r)),s=Math.max(s,Straightness(i,t[7],t[11],a)),s=Math.max(s,Straightness(r,t[13],t[14],a)),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],r=t[6],a=t[9],s=abs2([(e[0]+r[0]+a[0])*third-i[0],(e[1]+r[1]+a[1])*third-i[1],(e[2]+r[2]+a[2])*third-i[2]]);return s=Math.max(s,Straightness(e,t[1],t[3],r)),s=Math.max(s,Straightness(e,t[2],t[5],a)),Math.max(s,Straightness(r,t[7],t[8],a))}derivative(t,e,i,r){let a=[e[0]-t[0],e[1]-t[1],e[2]-t[2]];if(abs2(a)>this.epsilon)return a;let s=bezierPP(t,e,i);return abs2(s)>this.epsilon?s:bezierPPP(t,e,i,r)}sumderivative(t,e,i,r,a,s,n){let o=this.derivative(t,e,i,r),h=this.derivative(t,a,s,n);return[o[0]+h[0],o[1]+h[1],o[2]+h[2]]}normal(t,e,i,r,a,s,n){let o=a[0]-r[0],h=a[1]-r[1],l=a[2]-r[2],c=i[0]-r[0],d=i[1]-r[1],m=i[2]-r[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(r,i,e),g=bezierPP(r,a,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(r,i,e,t),A=bezierPPP(r,a,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,r,a){super(),this.controlpoints=t,this.Min=r,this.Max=a,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 r=t[0],a=t[1],s=t[2],n=t[3];if(Straightness(r,a,s,n)<this.res2)this.offscreen([r,n])||(this.data.indices.push(e),this.data.indices.push(i));else{if(this.offscreen(t))return;let o=[.5*(r[0]+a[0]),.5*(r[1]+a[1]),.5*(r[2]+a[2])],h=[.5*(a[0]+s[0]),.5*(a[1]+s[1]),.5*(a[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=[r,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,r,a){super(),this.controlpoint=t,this.width=e,this.CenterIndex=0,this.MaterialIndex=i,this.Min=r,this.Max=a}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],r=this.Positions[i[0]],a=this.Positions[i[1]],s=this.Positions[i[2]];if(!this.offscreen([r,a,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],r,this.Normals[t[0]],o),this.data.iVertex(i[1],a,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],r,this.Normals[t[0]]),this.data.iVertex(i[1],a,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()}append(){this.transparent?transparentData.append(this.data):triangleData.append(this.data)}}function home(){mat4.identity(rotMat),initProjection(),setProjection(),remesh=!0,redraw=!0}function initShader(t=[]){let e=getShader(gl,"fragment",t),i=getShader(gl,"vertex",t),r=gl.createProgram();return gl.attachShader(r,i),gl.attachShader(r,e),gl.linkProgram(r),gl.getProgramParameter(r,gl.LINK_STATUS)||alert("Could not initialize shaders"),r}class Split3{constructor(t,e,i,r){this.m0=[.5*(t[0]+e[0]),.5*(t[1]+e[1]),.5*(t[2]+e[2])];let a=.5*(e[0]+i[0]),s=.5*(e[1]+i[1]),n=.5*(e[2]+i[2]);this.m2=[.5*(i[0]+r[0]),.5*(i[1]+r[1]),.5*(i[2]+r[2])],this.m3=[.5*(this.m0[0]+a),.5*(this.m0[1]+s),.5*(this.m0[2]+n)],this.m4=[.5*(a+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,r){return[r[0]-t[0]+3*(e[0]-i[0]),r[1]-t[1]+3*(e[1]-i[1]),r[2]-t[2]+3*(e[2]-i[2])]}function Straightness(t,e,i,r){let a=[third*(r[0]-t[0]),third*(r[1]-t[1]),third*(r[2]-t[2])];return Math.max(abs2([e[0]-a[0]-t[0],e[1]-a[1]-t[1],e[2]-a[2]-t[2]]),abs2([r[0]-a[0]-i[0],r[1]-a[1]-i[1],r[2]-a[2]-i[2]]))}function Distance2(t,e,i){let r=dot([t[0]-e[0],t[1]-e[1],t[2]-e[2]],i);return r*r}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.useProgram(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,r,a){if(t==i&&e==r)return;let[s,n]=arcball([t,-e],[i,-r]);mat4.fromRotation(rotMats,2*a*ArcballFactor*s/lastzoom,n),mat4.multiply(rotMat,rotMats,rotMat)}function shiftScene(t,e,i,r){let a=1/lastzoom;shift.x+=(i-t)*a*halfCanvasWidth,shift.y-=(r-e)*a*halfCanvasHeight}function panScene(t,e,i,r){orthographic?shiftScene(t,e,i,r):(center.x+=(i-t)*(viewParam.xmax-viewParam.xmin),center.y-=(r-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],r=Math.hypot(e,i);return r>1&&(denom=1/r,e*=denom,i*=denom),[e,i,Math.sqrt(Math.max(1-i*i-e*e,0))]}function arcball(t,e){let i=normMouse(t),r=normMouse(e),a=dot(i,r);return a>1?a=1:a<-1&&(a=-1),[Math.acos(a),unit(cross(i,r))]}function zoomScene(t,e,i,r){zoomImage(e-r)}const DRAGMODE_ROTATE=1,DRAGMODE_SHIFT=2,DRAGMODE_ZOOM=3,DRAGMODE_PAN=4;function processDrag(t,e,i,r=1){let a;switch(i){case DRAGMODE_ROTATE:a=rotateScene;break;case DRAGMODE_SHIFT:a=shiftScene;break;case DRAGMODE_ZOOM:a=zoomScene;break;case DRAGMODE_PAN:a=panScene;break;default:a=((t,e,i,r)=>{})}a((lastMouseX-halfCanvasWidth)/halfCanvasWidth,(lastMouseY-halfCanvasHeight)/halfCanvasHeight,(t-halfCanvasWidth)/halfCanvasWidth,(e-halfCanvasHeight)/halfCanvasHeight,r),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.getModifierState("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,r=t-lastMouseX,a=i-lastMouseY,s=r*r+a*a<=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],r=viewMat[10];zbuffer.length=t.length;for(let a=0;a<t.length;++a){let s=6*a;zbuffer[a]=e*t[s]+i*t[s+1]+r*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 r=3*e;Ia=t[r],Ib=t[r+1],Ic=t[r+2];let a=3*i;return IA=t[a],IB=t[a+1],IC=t[a+2],zbuffer[Ia]+zbuffer[Ib]+zbuffer[Ic]<zbuffer[IA]+zbuffer[IB]+zbuffer[IC]?-1:1});let r=Array(t.length);for(let a=0;a<e;++a){let e=3*i[a];r[3*a]=t[e],r[3*a+1]=t[e+1],r[3*a+2]=t[e+2]}gl.depthMask(!1),drawBuffer(transparentData,transparentShader,r),gl.depthMask(!0)}remesh=!1}function tick(){requestAnimationFrame(tick),redraw&&(draw(),redraw=!1)}function setDimensions(t,e,i,r){let a=t/e,s=1/lastzoom,n=(i/t+viewportshift[0])*lastzoom,o=(r/e+viewportshift[1])*lastzoom;if(orthographic){let t=B[0]-b[0],e=B[1]-b[1];if(t<e*a){let t=.5*e*a*s,i=2*t*n,r=e*s*o;viewParam.xmin=-t-i,viewParam.xmax=t-i,viewParam.ymin=b[1]*s-r,viewParam.ymax=B[1]*s-r}else{let e=.5*t/(a*Zoom),i=t*s*n,r=2*e*o;viewParam.xmin=b[0]*s-i,viewParam.xmax=B[0]*s-i,viewParam.ymin=-e-r,viewParam.ymax=e-r}}else{let t=H*s,e=t*a,i=2*e*n,r=2*t*o;viewParam.xmin=-e-i,viewParam.xmax=e-i,viewParam.ymin=-t-r,viewParam.ymax=t-r}}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,viewportshift[0]/=Zoom0,viewportshift[1]/=Zoom0,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.
@@ -36,4 +35,5 @@ 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
+THE SOFTWARE.*/
+let vertex="\nattribute vec3 position;\n#ifdef WIDTH\nattribute float width;\n#endif\n#ifdef NORMAL\nattribute vec3 normal;\n#endif\nattribute float materialIndex;\n#ifdef COLOR\nattribute vec4 color;\n#endif\n\nuniform mat3 normMat;\nuniform mat4 viewMat;\nuniform mat4 projViewMat;\n\n#ifdef NORMAL\n#ifndef ORTHOGRAPHIC\nvarying vec3 ViewPosition;\n#endif\nvarying vec3 Normal;\n#endif\nvarying vec4 diffuse;\nvarying vec3 specular;\nvarying float roughness,metallic,fresnel0;\nvarying vec4 emissive;\n\nstruct Material {\n vec4 diffuse,emissive,specular;\n vec4 parameters;\n};\n\nuniform Material Materials[Nmaterials];\n\nvoid main(void)\n{\n vec4 v=vec4(position,1.0);\n gl_Position=projViewMat*v;\n#ifdef NORMAL\n#ifndef ORTHOGRAPHIC\n ViewPosition=(viewMat*v).xyz;\n#endif \n Normal=normal*normMat;\n \n Material m;\n#ifdef TRANSPARENT\n m=Materials[int(abs(materialIndex))-1];\n if(materialIndex >= 0.0) {\n diffuse=m.diffuse;\n emissive=m.emissive;\n } else {\n diffuse=color;\n#if nlights > 0\n emissive=vec4(0.0);\n#else\n emissive=color;\n#endif\n }\n#else\n m=Materials[int(materialIndex)];\n#ifdef COLOR\n diffuse=color;\n#if nlights > 0\n emissive=vec4(0.0);\n#else\n emissive=color;\n#endif\n#else\n diffuse=m.diffuse;\n emissive=m.emissive;\n#endif\n#endif\n specular=m.specular.rgb;\n vec4 parameters=m.parameters;\n roughness=1.0-parameters[0];\n metallic=parameters[1];\n fresnel0=parameters[2];\n#else\n emissive=Materials[int(materialIndex)].emissive;\n#endif\n#ifdef WIDTH\n gl_PointSize=width;\n#endif\n}\n",fragment="\n#ifdef NORMAL\n#ifndef ORTHOGRAPHIC\nvarying vec3 ViewPosition;\n#endif\nvarying vec3 Normal;\nvarying vec4 diffuse;\nvarying vec3 specular;\nvarying float roughness,metallic,fresnel0;\n\nfloat Roughness2;\nvec3 normal;\n\nstruct Light {\n vec3 direction;\n vec3 color;\n};\n\nuniform Light Lights[Nlights];\n\nfloat NDF_TRG(vec3 h)\n{\n float ndoth=max(dot(normal,h),0.0);\n float alpha2=Roughness2*Roughness2;\n float denom=ndoth*ndoth*(alpha2-1.0)+1.0;\n return denom != 0.0 ? alpha2/(denom*denom) : 0.0;\n}\n \nfloat GGX_Geom(vec3 v)\n{\n float ndotv=max(dot(v,normal),0.0);\n float ap=1.0+Roughness2;\n float k=0.125*ap*ap;\n return ndotv/((ndotv*(1.0-k))+k);\n}\n \nfloat Geom(vec3 v, vec3 l)\n{\n return GGX_Geom(v)*GGX_Geom(l);\n}\n \nfloat Fresnel(vec3 h, vec3 v, float fresnel0)\n{\n float a=1.0-max(dot(h,v),0.0);\n float b=a*a;\n return fresnel0+(1.0-fresnel0)*b*b*a;\n}\n \n// physical based shading using UE4 model.\nvec3 BRDF(vec3 viewDirection, vec3 lightDirection)\n{\n vec3 lambertian=diffuse.rgb;\n vec3 h=normalize(lightDirection+viewDirection);\n \n float omegain=max(dot(viewDirection,normal),0.0);\n float omegali=max(dot(lightDirection,normal),0.0);\n \n float D=NDF_TRG(h);\n float G=Geom(viewDirection,lightDirection);\n float F=Fresnel(h,viewDirection,fresnel0);\n \n float denom=4.0*omegain*omegali;\n float rawReflectance=denom > 0.0 ? (D*G)/denom : 0.0;\n \n vec3 dielectric=mix(lambertian,rawReflectance*specular,F);\n vec3 metal=rawReflectance*diffuse.rgb;\n \n return mix(dielectric,metal,metallic);\n}\n#endif\nvarying vec4 emissive;\n \nvoid main(void)\n{\n#if defined(NORMAL) && nlights > 0\n normal=normalize(Normal);\n normal=gl_FrontFacing ? normal : -normal;\n#ifdef ORTHOGRAPHIC\n vec3 viewDir=vec3(0.0,0.0,1.0);\n#else\n vec3 viewDir=-normalize(ViewPosition);\n#endif\n Roughness2=roughness*roughness;\n vec3 color=emissive.rgb;\n for(int i=0; i < nlights; ++i) {\n Light Li=Lights[i];\n vec3 L=Li.direction;\n float cosTheta=max(dot(normal,L),0.0);\n vec3 radiance=cosTheta*Li.color;\n color += BRDF(viewDir,L)*radiance;\n }\n gl_FragColor=vec4(color,diffuse.a);\n#else\n gl_FragColor=emissive;\n#endif\n}\n";!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var i=t();for(var a in i)("object"==typeof exports?exports:e)[a]=i[a]}}("undefined"!=typeof self?self:this,function(){return function(e){var t={};function i(a){if(t[a])return t[a].exports;var r=t[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=e,i.c=t,i.d=function(e,t,a){i.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:a})},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=1)}([function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setMatrixArrayType=function(e){t.ARRAY_TYPE=e},t.toRadian=function(e){return e*r},t.equals=function(e,t){return Math.abs(e-t)<=a*Math.max(1,Math.abs(e),Math.abs(t))};var a=t.EPSILON=1e-6;t.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,t.RANDOM=Math.random;var r=Math.PI/180},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.mat4=t.mat3=void 0;var a=n(i(2)),r=n(i(3));function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t.default=e,t}t.mat3=a,t.mat4=r},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.create=function(){var e=new a.ARRAY_TYPE(9);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=1,e[5]=0,e[6]=0,e[7]=0,e[8]=1,e},t.fromMat4=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[4],e[4]=t[5],e[5]=t[6],e[6]=t[8],e[7]=t[9],e[8]=t[10],e},t.invert=function(e,t){var i=t[0],a=t[1],r=t[2],n=t[3],s=t[4],o=t[5],l=t[6],h=t[7],c=t[8],d=c*s-o*h,m=-c*n+o*l,f=h*n-s*l,u=i*d+a*m+r*f;if(!u)return null;return u=1/u,e[0]=d*u,e[1]=(-c*a+r*h)*u,e[2]=(o*a-r*s)*u,e[3]=m*u,e[4]=(c*i-r*l)*u,e[5]=(-o*i+r*n)*u,e[6]=f*u,e[7]=(-h*i+a*l)*u,e[8]=(s*i-a*n)*u,e};var a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t.default=e,t}(i(0))},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.create=function(){var e=new a.ARRAY_TYPE(16);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e},t.identity=function(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e},t.invert=function(e,t){var i=t[0],a=t[1],r=t[2],n=t[3],s=t[4],o=t[5],l=t[6],h=t[7],c=t[8],d=t[9],m=t[10],f=t[11],u=t[12],v=t[13],g=t[14],p=t[15],x=i*o-a*s,M=i*l-r*s,w=i*h-n*s,A=a*l-r*o,b=a*h-n*o,S=r*h-n*l,R=c*v-d*u,P=c*g-m*u,D=c*p-f*u,T=d*g-m*v,y=d*p-f*v,I=m*p-f*g,z=x*I-M*y+w*T+A*D-b*P+S*R;if(!z)return null;return z=1/z,e[0]=(o*I-l*y+h*T)*z,e[1]=(r*y-a*I-n*T)*z,e[2]=(v*S-g*b+p*A)*z,e[3]=(m*b-d*S-f*A)*z,e[4]=(l*D-s*I-h*P)*z,e[5]=(i*I-r*D+n*P)*z,e[6]=(g*w-u*S-p*M)*z,e[7]=(c*S-m*w+f*M)*z,e[8]=(s*y-o*D+h*R)*z,e[9]=(a*D-i*y-n*R)*z,e[10]=(u*b-v*w+p*x)*z,e[11]=(d*w-c*b-f*x)*z,e[12]=(o*P-s*T-l*R)*z,e[13]=(i*T-a*P+r*R)*z,e[14]=(v*M-u*A-g*x)*z,e[15]=(c*A-d*M+m*x)*z,e},t.multiply=r,t.translate=function(e,t,i){var a=i[0],r=i[1],n=i[2],s=void 0,o=void 0,l=void 0,h=void 0,c=void 0,d=void 0,m=void 0,f=void 0,u=void 0,v=void 0,g=void 0,p=void 0;t===e?(e[12]=t[0]*a+t[4]*r+t[8]*n+t[12],e[13]=t[1]*a+t[5]*r+t[9]*n+t[13],e[14]=t[2]*a+t[6]*r+t[10]*n+t[14],e[15]=t[3]*a+t[7]*r+t[11]*n+t[15]):(s=t[0],o=t[1],l=t[2],h=t[3],c=t[4],d=t[5],m=t[6],f=t[7],u=t[8],v=t[9],g=t[10],p=t[11],e[0]=s,e[1]=o,e[2]=l,e[3]=h,e[4]=c,e[5]=d,e[6]=m,e[7]=f,e[8]=u,e[9]=v,e[10]=g,e[11]=p,e[12]=s*a+c*r+u*n+t[12],e[13]=o*a+d*r+v*n+t[13],e[14]=l*a+m*r+g*n+t[14],e[15]=h*a+f*r+p*n+t[15]);return e},t.rotate=function(e,t,i,r){var n=r[0],s=r[1],o=r[2],l=Math.sqrt(n*n+s*s+o*o),h=void 0,c=void 0,d=void 0,m=void 0,f=void 0,u=void 0,v=void 0,g=void 0,p=void 0,x=void 0,M=void 0,w=void 0,A=void 0,b=void 0,S=void 0,R=void 0,P=void 0,D=void 0,T=void 0,y=void 0,I=void 0,z=void 0,O=void 0,E=void 0;if(Math.abs(l)<a.EPSILON)return null;n*=l=1/l,s*=l,o*=l,h=Math.sin(i),c=Math.cos(i),d=1-c,m=t[0],f=t[1],u=t[2],v=t[3],g=t[4],p=t[5],x=t[6],M=t[7],w=t[8],A=t[9],b=t[10],S=t[11],R=n*n*d+c,P=s*n*d+o*h,D=o*n*d-s*h,T=n*s*d-o*h,y=s*s*d+c,I=o*s*d+n*h,z=n*o*d+s*h,O=s*o*d-n*h,E=o*o*d+c,e[0]=m*R+g*P+w*D,e[1]=f*R+p*P+A*D,e[2]=u*R+x*P+b*D,e[3]=v*R+M*P+S*D,e[4]=m*T+g*y+w*I,e[5]=f*T+p*y+A*I,e[6]=u*T+x*y+b*I,e[7]=v*T+M*y+S*I,e[8]=m*z+g*O+w*E,e[9]=f*z+p*O+A*E,e[10]=u*z+x*O+b*E,e[11]=v*z+M*O+S*E,t!==e&&(e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15]);return e},t.fromTranslation=function(e,t){return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=t[0],e[13]=t[1],e[14]=t[2],e[15]=1,e},t.fromRotation=function(e,t,i){var r=i[0],n=i[1],s=i[2],o=Math.sqrt(r*r+n*n+s*s),l=void 0,h=void 0,c=void 0;if(Math.abs(o)<a.EPSILON)return null;return r*=o=1/o,n*=o,s*=o,l=Math.sin(t),h=Math.cos(t),c=1-h,e[0]=r*r*c+h,e[1]=n*r*c+s*l,e[2]=s*r*c-n*l,e[3]=0,e[4]=r*n*c-s*l,e[5]=n*n*c+h,e[6]=s*n*c+r*l,e[7]=0,e[8]=r*s*c+n*l,e[9]=n*s*c-r*l,e[10]=s*s*c+h,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e},t.frustum=function(e,t,i,a,r,n,s){var o=1/(i-t),l=1/(r-a),h=1/(n-s);return e[0]=2*n*o,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=2*n*l,e[6]=0,e[7]=0,e[8]=(i+t)*o,e[9]=(r+a)*l,e[10]=(s+n)*h,e[11]=-1,e[12]=0,e[13]=0,e[14]=s*n*2*h,e[15]=0,e},t.ortho=function(e,t,i,a,r,n,s){var o=1/(t-i),l=1/(a-r),h=1/(n-s);return e[0]=-2*o,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=-2*l,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=2*h,e[11]=0,e[12]=(t+i)*o,e[13]=(r+a)*l,e[14]=(s+n)*h,e[15]=1,e};var a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t.default=e,t}(i(0));function r(e,t,i){var a=t[0],r=t[1],n=t[2],s=t[3],o=t[4],l=t[5],h=t[6],c=t[7],d=t[8],m=t[9],f=t[10],u=t[11],v=t[12],g=t[13],p=t[14],x=t[15],M=i[0],w=i[1],A=i[2],b=i[3];return e[0]=M*a+w*o+A*d+b*v,e[1]=M*r+w*l+A*m+b*g,e[2]=M*n+w*h+A*f+b*p,e[3]=M*s+w*c+A*u+b*x,M=i[4],w=i[5],A=i[6],b=i[7],e[4]=M*a+w*o+A*d+b*v,e[5]=M*r+w*l+A*m+b*g,e[6]=M*n+w*h+A*f+b*p,e[7]=M*s+w*c+A*u+b*x,M=i[8],w=i[9],A=i[10],b=i[11],e[8]=M*a+w*o+A*d+b*v,e[9]=M*r+w*l+A*m+b*g,e[10]=M*n+w*h+A*f+b*p,e[11]=M*s+w*c+A*u+b*x,M=i[12],w=i[13],A=i[14],b=i[15],e[12]=M*a+w*o+A*d+b*v,e[13]=M*r+w*l+A*m+b*g,e[14]=M*n+w*h+A*f+b*p,e[15]=M*s+w*c+A*u+b*x,e}}])});let canvasWidth,canvasHeight,b,B,angle,Zoom0,viewportmargin,zoomFactor,zoomPinchFactor,zoomPinchCap,zoomStep,shiftHoldDistance,shiftWaitTime,vibrateTime,embedded,canvas,gl,alpha,offscreen,context,maxMaterials,halfCanvasWidth,halfCanvasHeight,Zoom,P=[],Materials=[],Lights=[],Centers=[],Background=[1,1,1,1],absolute=!1,viewportshift=[0,0],nlights=0,Nmaterials=1,materials=[],pixel=.75,BezierFactor=.4,FillFactor=.1,maxViewportWidth=window.innerWidth,maxViewportHeight=window.innerHeight;const windowTrim=10;let lastzoom,H,zmin,zmax,size2,ArcballFactor,positionBuffer,materialBuffer,colorBuffer,indexBuffer,resizeStep=1.2,Fuzz2=1e3*Number.EPSILON,Fuzz4=Fuzz2*Fuzz2,third=1/3,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(e,t,i,a,r,n){this.diffuse=e,this.emissive=t,this.specular=i,this.shininess=a,this.metallic=r,this.fresnel0=n}setUniform(e,t){let i=i=>gl.getUniformLocation(e,"Materials["+t+"]."+i);gl.uniform4fv(i("diffuse"),new Float32Array(this.diffuse)),gl.uniform4fv(i("emissive"),new Float32Array(this.emissive)),gl.uniform4fv(i("specular"),new Float32Array(this.specular)),gl.uniform4f(i("parameters"),this.shininess,this.metallic,this.fresnel0,0)}}let indexExt,enumPointLight=1,enumDirectionalLight=2;class Light{constructor(e,t){this.direction=e,this.color=t}setUniform(e,t){let i=i=>gl.getUniformLocation(e,"Lights["+t+"]."+i);gl.uniform3fv(i("direction"),new Float32Array(this.direction)),gl.uniform3fv(i("color"),new Float32Array(this.color))}}function initShaders(){let e=gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS);maxMaterials=Math.floor((e-14)/4),Nmaterials=Math.min(Math.max(Nmaterials,Materials.length),maxMaterials),noNormalShader=initShader(),pixelShader=initShader(["WIDTH"]),materialShader=initShader(["NORMAL"]),colorShader=initShader(["NORMAL","COLOR"]),transparentShader=initShader(["NORMAL","COLOR","TRANSPARENT"])}function setBuffers(){positionBuffer=gl.createBuffer(),materialBuffer=gl.createBuffer(),colorBuffer=gl.createBuffer(),indexBuffer=gl.createBuffer()}function noGL(){gl||alert("Could not initialize WebGL")}function saveAttributes(){let e=window.parent.document.asygl[alpha];e.gl=gl,e.nlights=Lights.length,e.Nmaterials=Nmaterials,e.maxMaterials=maxMaterials,e.noNormalShader=noNormalShader,e.pixelShader=pixelShader,e.materialShader=materialShader,e.colorShader=colorShader,e.transparentShader=transparentShader}function restoreAttributes(){let e=window.parent.document.asygl[alpha];gl=e.gl,nlights=e.nlights,Nmaterials=e.Nmaterials,maxMaterials=e.maxMaterials,noNormalShader=e.noNormalShader,pixelShader=e.pixelShader,materialShader=e.materialShader,colorShader=e.colorShader,transparentShader=e.transparentShader}function initGL(){if(alpha=Background[3]<1,embedded){let e=window.parent.document;null==e.asygl&&(e.asygl=Array(2)),context=canvas.getContext("2d"),(offscreen=e.offscreen)||(offscreen=e.createElement("canvas"),e.offscreen=offscreen),e.asygl[alpha]&&e.asygl[alpha].gl?(restoreAttributes(),(Lights.length!=nlights||Math.min(Materials.length,maxMaterials)>Nmaterials)&&(initShaders(),saveAttributes())):((gl=offscreen.getContext("webgl",{alpha:alpha}))||noGL(),initShaders(),e.asygl[alpha]={},saveAttributes())}else(gl=canvas.getContext("webgl",{alpha:alpha}))||noGL(),initShaders();setBuffers(),indexExt=gl.getExtension("OES_element_index_uint")}function getShader(e,t,i,a=[]){let r=`#version 100\n#ifdef GL_FRAGMENT_PRECISION_HIGH\n precision highp float;\n#else\n precision mediump float;\n#endif\n #define nlights ${Lights.length}\n\n const int Nlights=${Math.max(Lights.length,1)};\n\n #define Nmaterials ${Nmaterials}\n`;orthographic&&(r+="#define ORTHOGRAPHIC\n"),a.forEach(e=>r+="#define "+e+"\n");let n=e.createShader(i);return e.shaderSource(n,r+t),e.compileShader(n),e.getShaderParameter(n,e.COMPILE_STATUS)?n:(alert(e.getShaderInfoLog(n)),null)}function drawBuffer(e,t,i=e.indices){if(0==e.indices.length)return;let a=t==pixelShader,r=t!=noNormalShader&&!a;setUniforms(e,t),gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer),gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(e.vertices),gl.STATIC_DRAW),gl.vertexAttribPointer(t.vertexPositionAttribute,3,gl.FLOAT,!1,r?24:a?16:12,0),r&&Lights.length>0?gl.vertexAttribPointer(t.vertexNormalAttribute,3,gl.FLOAT,!1,24,12):a&&gl.vertexAttribPointer(t.vertexWidthAttribute,1,gl.FLOAT,!1,16,12),-1!=t.vertexMaterialAttribute&&(gl.bindBuffer(gl.ARRAY_BUFFER,materialBuffer),gl.bufferData(gl.ARRAY_BUFFER,new Int16Array(e.materialIndices),gl.STATIC_DRAW),gl.vertexAttribPointer(t.vertexMaterialAttribute,1,gl.SHORT,!1,2,0)),t!=colorShader&&t!=transparentShader||(gl.bindBuffer(gl.ARRAY_BUFFER,colorBuffer),gl.bufferData(gl.ARRAY_BUFFER,new Uint8Array(e.colors),gl.STATIC_DRAW),gl.vertexAttribPointer(t.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.TRIANGLES:a?gl.POINTS:gl.LINES,i.length,indexExt?gl.UNSIGNED_INT:gl.UNSIGNED_SHORT,0),embedded&&context.drawImage(offscreen,0,0)}class vertexBuffer{constructor(){this.clear()}clear(){this.vertices=[],this.materialIndices=[],this.colors=[],this.indices=[],this.nvertices=0,this.materials=[],this.materialTable=[]}vertex(e,t){return this.vertices.push(e[0]),this.vertices.push(e[1]),this.vertices.push(e[2]),this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.materialIndices.push(materialIndex),this.nvertices++}Vertex(e,t,i=[0,0,0,0]){return this.vertices.push(e[0]),this.vertices.push(e[1]),this.vertices.push(e[2]),this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.materialIndices.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(e){return this.vertices.push(e[0]),this.vertices.push(e[1]),this.vertices.push(e[2]),this.materialIndices.push(materialIndex),this.nvertices++}vertex0(e,t){return this.vertices.push(e[0]),this.vertices.push(e[1]),this.vertices.push(e[2]),this.vertices.push(t),this.materialIndices.push(materialIndex),this.nvertices++}iVertex(e,t,i,a=[0,0,0,0]){let r=6*e;this.vertices[r]=t[0],this.vertices[r+1]=t[1],this.vertices[r+2]=t[2],this.vertices[r+3]=i[0],this.vertices[r+4]=i[1],this.vertices[r+5]=i[2],this.materialIndices[e]=materialIndex;let n=4*e;this.colors[n]=a[0],this.colors[n+1]=a[1],this.colors[n+2]=a[2],this.colors[n+3]=a[3],this.indices.push(e)}append(e){append(this.vertices,e.vertices),append(this.materialIndices,e.materialIndices),append(this.colors,e.colors),appendOffset(this.indices,e.indices,this.nvertices),this.nvertices+=e.nvertices}}let materialIndex,material0Data=new vertexBuffer,material1Data=new vertexBuffer,materialData=new vertexBuffer,colorData=new vertexBuffer,transparentData=new vertexBuffer,triangleData=new vertexBuffer;function append(e,t){let i=e.length,a=t.length;e.length+=a;for(let r=0;r<a;++r)e[i+r]=t[r]}function appendOffset(e,t,i){let a=e.length,r=t.length;e.length+=t.length;for(let n=0;n<r;++n)e[a+n]=t[n]+i}class Geometry{constructor(){this.data=new vertexBuffer,this.Onscreen=!1,this.m=[]}offscreen(e){let t=projViewMat,i=e[0],a=i[0],r=i[1],n=i[2],s=1/(t[3]*a+t[7]*r+t[11]*n+t[15]);this.x=this.X=(t[0]*a+t[4]*r+t[8]*n+t[12])*s,this.y=this.Y=(t[1]*a+t[5]*r+t[9]*n+t[13])*s;for(let i=1,a=e.length;i<a;++i){let a=e[i],r=a[0],n=a[1],s=a[2],o=1/(t[3]*r+t[7]*n+t[11]*s+t[15]),l=(t[0]*r+t[4]*n+t[8]*s+t[12])*o,h=(t[1]*r+t[5]*n+t[9]*s+t[13])*o;l<this.x?this.x=l:l>this.X&&(this.X=l),h<this.y?this.y=h:h>this.Y&&(this.Y=h)}return(this.X<-1.01||this.x>1.01||this.Y<-1.01||this.y>1.01)&&(this.Onscreen=!1,!0)}T(e){let t=this.c[0],i=this.c[1],a=this.c[2],r=e[0]-t,n=e[1]-i,s=e[2]-a;return[r*normMat[0]+n*normMat[3]+s*normMat[6]+t,r*normMat[1]+n*normMat[4]+s*normMat[7]+i,r*normMat[2]+n*normMat[5]+s*normMat[8]+a]}Tcorners(e,t){return[this.T(e),this.T([e[0],e[1],t[2]]),this.T([e[0],t[1],e[2]]),this.T([e[0],t[1],t[2]]),this.T([t[0],e[1],e[2]]),this.T([t[0],e[1],t[2]]),this.T([t[0],t[1],e[2]]),this.T(t)]}setMaterial(e,t){null==e.materialTable[this.MaterialIndex]&&(e.materials.length>=Nmaterials&&t(),e.materialTable[this.MaterialIndex]=e.materials.length,e.materials.push(Materials[this.MaterialIndex])),materialIndex=e.materialTable[this.MaterialIndex]}render(){let e;if(this.setMaterialIndex(),0==this.CenterIndex?e=corners(this.Min,this.Max):(this.c=Centers[this.CenterIndex-1],e=this.Tcorners(this.Min,this.Max)),this.offscreen(e))return void this.data.clear();let t,i=this.controlpoints;if(0==this.CenterIndex){if(!remesh&&this.Onscreen)return void this.append();t=i}else{let e=i.length;t=Array(e);for(let a=0;a<e;++a)t[a]=this.T(i[a])}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(t)}}class BezierPatch extends Geometry{constructor(e,t,i,a,r,n){super(),this.controlpoints=e,this.Min=a,this.Max=r,this.color=n,this.CenterIndex=t;let s=e.length;if(n){let e=n[0][3]+n[1][3]+n[2][3];this.transparent=16==s||4==s?e+n[3][3]<1020:e<765}else this.transparent=Materials[i].diffuse[3]<1;this.MaterialIndex=i,this.vertex=this.transparent?this.data.Vertex.bind(this.data):this.data.vertex.bind(this.data),this.L2norm(this.controlpoints)}setMaterialIndex(){this.transparent?this.setMaterial(transparentData,drawTransparent):this.color?this.setMaterial(colorData,drawColor):this.setMaterial(materialData,drawMaterial)}L2norm(e){let t=e[0];this.epsilon=0;let i=e.length;for(let a=1;a<i;++a)this.epsilon=Math.max(this.epsilon,abs2([e[a][0]-t[0],e[a][1]-t[1],e[a][2]-t[2]]));this.epsilon*=Fuzz4}processTriangle(e){let t=e[0],i=e[1],a=e[2],r=unit(cross([i[0]-t[0],i[1]-t[1],i[2]-t[2]],[a[0]-t[0],a[1]-t[1],a[2]-t[2]]));this.offscreen([t,i,a])||(this.color?(this.data.indices.push(this.data.Vertex(t,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(t,r)),this.data.indices.push(this.vertex(i,r)),this.data.indices.push(this.vertex(a,r))),this.append())}processQuad(e){let t=e[0],i=e[1],a=e[2],r=e[3],n=cross([i[0]-t[0],i[1]-t[1],i[2]-t[2]],[a[0]-i[0],a[1]-i[1],a[2]-i[2]]),s=cross([a[0]-r[0],a[1]-r[1],a[2]-r[2]],[r[0]-t[0],r[1]-t[1],r[2]-t[2]]),o=unit([n[0]+s[0],n[1]+s[1],n[2]+s[2]]);if(!this.offscreen([t,i,a,r])){let e,n,s,l;this.color?(e=this.data.Vertex(t,o,this.color[0]),n=this.data.Vertex(i,o,this.color[1]),s=this.data.Vertex(a,o,this.color[2]),l=this.data.Vertex(r,o,this.color[3])):(e=this.vertex(t,o),n=this.vertex(i,o),s=this.vertex(a,o),l=this.vertex(r,o)),this.data.indices.push(e),this.data.indices.push(n),this.data.indices.push(s),this.data.indices.push(e),this.data.indices.push(s),this.data.indices.push(l),this.append()}}process(e){if(this.transparent&&(materialIndex=this.color?-1-materialIndex:1+materialIndex),10==e.length)return this.process3(e);if(3==e.length)return this.processTriangle(e);if(4==e.length)return this.processQuad(e);let t=e[0],i=e[3],a=e[12],r=e[15],n=this.normal(i,e[2],e[1],t,e[4],e[8],a);iszero(n)&&iszero(n=this.normal(i,e[2],e[1],t,e[13],e[14],r))&&(n=this.normal(r,e[11],e[7],i,e[4],e[8],a));let s=this.normal(t,e[4],e[8],a,e[13],e[14],r);iszero(s)&&iszero(s=this.normal(t,e[4],e[8],a,e[11],e[7],i))&&(s=this.normal(i,e[2],e[1],t,e[13],e[14],r));let o=this.normal(a,e[13],e[14],r,e[11],e[7],i);iszero(o)&&iszero(o=this.normal(a,e[13],e[14],r,e[2],e[1],t))&&(o=this.normal(t,e[4],e[8],a,e[11],e[7],i));let l=this.normal(r,e[11],e[7],i,e[2],e[1],t);if(iszero(l)&&iszero(l=this.normal(r,e[11],e[7],i,e[4],e[8],a))&&(l=this.normal(a,e[13],e[14],r,e[2],e[1],t)),this.color){let h=this.color[0],c=this.color[1],d=this.color[2],m=this.color[3],f=this.data.Vertex(t,n,h),u=this.data.Vertex(a,s,c),v=this.data.Vertex(r,o,d),g=this.data.Vertex(i,l,m);this.Render(e,f,u,v,g,t,a,r,i,!1,!1,!1,!1,h,c,d,m)}else{let h=this.vertex(t,n),c=this.vertex(a,s),d=this.vertex(r,o),m=this.vertex(i,l);this.Render(e,h,c,d,m,t,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(e,t,i,a,r,n,s,o,l,h,c,d,m,f,u,v,g){if(this.Distance(e)<this.res2)this.offscreen([n,s,o])||(this.data.indices.push(t),this.data.indices.push(i),this.data.indices.push(a)),this.offscreen([n,o,l])||(this.data.indices.push(t),this.data.indices.push(a),this.data.indices.push(r));else{if(this.offscreen(e))return;let p=e[0],x=e[3],M=e[12],w=e[15],A=new Split3(p,e[1],e[2],x),b=new Split3(e[4],e[5],e[6],e[7]),S=new Split3(e[8],e[9],e[10],e[11]),R=new Split3(M,e[13],e[14],w),P=new Split3(p,e[4],e[8],M),D=new Split3(A.m0,b.m0,S.m0,R.m0),T=new Split3(A.m3,b.m3,S.m3,R.m3),y=new Split3(A.m5,b.m5,S.m5,R.m5),I=new Split3(A.m4,b.m4,S.m4,R.m4),z=new Split3(A.m2,b.m2,S.m2,R.m2),O=new Split3(x,e[7],e[11],w),E=[p,A.m0,A.m3,A.m5,P.m0,D.m0,T.m0,y.m0,P.m3,D.m3,T.m3,y.m3,P.m5,D.m5,T.m5,y.m5],_=[P.m5,D.m5,T.m5,y.m5,P.m4,D.m4,T.m4,y.m4,P.m2,D.m2,T.m2,y.m2,M,R.m0,R.m3,R.m5],L=[y.m5,I.m5,z.m5,O.m5,y.m4,I.m4,z.m4,O.m4,y.m2,I.m2,z.m2,O.m2,R.m5,R.m4,R.m2,w],N=[A.m5,A.m4,A.m2,x,y.m0,I.m0,z.m0,O.m0,y.m3,I.m3,z.m3,O.m3,y.m5,I.m5,z.m5,O.m5],C=E[15],B=this.normal(E[0],E[4],E[8],E[12],E[13],E[14],E[15]);iszero(B)&&iszero(B=this.normal(E[0],E[4],E[8],E[12],E[11],E[7],E[3]))&&(B=this.normal(E[3],E[2],E[1],E[0],E[13],E[14],E[15]));let F=this.normal(_[12],_[13],_[14],_[15],_[11],_[7],_[3]);iszero(F)&&iszero(F=this.normal(_[12],_[13],_[14],_[15],_[2],_[1],_[0]))&&(F=this.normal(_[0],_[4],_[8],_[12],_[11],_[7],_[3]));let V=this.normal(L[15],L[11],L[7],L[3],L[2],L[1],L[0]);iszero(V)&&iszero(V=this.normal(L[15],L[11],L[7],L[3],L[4],L[8],L[12]))&&(V=this.normal(L[12],L[13],L[14],L[15],L[2],L[1],L[0]));let H=this.normal(N[3],N[2],N[1],N[0],N[4],N[8],N[12]);iszero(H)&&iszero(H=this.normal(N[3],N[2],N[1],N[0],N[13],N[14],N[15]))&&(H=this.normal(N[15],N[11],N[7],N[3],N[4],N[8],N[12]));let G=this.normal(L[3],L[2],L[1],C,L[4],L[8],L[12]),U=this.Epsilon,W=[.5*(n[0]+s[0]),.5*(n[1]+s[1]),.5*(n[2]+s[2])];if(!h)if(h=Straightness(p,e[4],e[8],M)<this.res2){let e=unit(this.derivative(_[0],_[1],_[2],_[3]));W=[W[0]-U*e[0],W[1]-U*e[1],W[2]-U*e[2]]}else W=E[12];let Y=[.5*(s[0]+o[0]),.5*(s[1]+o[1]),.5*(s[2]+o[2])];if(!c)if(c=Straightness(M,e[13],e[14],w)<this.res2){let e=unit(this.derivative(L[12],L[8],L[4],L[0]));Y=[Y[0]-U*e[0],Y[1]-U*e[1],Y[2]-U*e[2]]}else Y=_[15];let j=[.5*(o[0]+l[0]),.5*(o[1]+l[1]),.5*(o[2]+l[2])];if(!d)if(d=Straightness(w,e[11],e[7],x)<this.res2){let e=unit(this.derivative(N[15],L[14],L[13],_[12]));j=[j[0]-U*e[0],j[1]-U*e[1],j[2]-U*e[2]]}else j=L[3];let k=[.5*(l[0]+n[0]),.5*(l[1]+n[1]),.5*(l[2]+n[2])];if(!m)if(m=Straightness(p,e[1],e[2],x)<this.res2){let e=unit(this.derivative(E[3],E[7],E[11],E[15]));k=[k[0]-U*e[0],k[1]-U*e[1],k[2]-U*e[2]]}else k=N[0];if(f){let e=Array(4),p=Array(4),x=Array(4),M=Array(4),w=Array(4);for(let t=0;t<4;++t)e[t]=.5*(f[t]+u[t]),p[t]=.5*(u[t]+v[t]),x[t]=.5*(v[t]+g[t]),M[t]=.5*(g[t]+f[t]),w[t]=.5*(e[t]+x[t]);let A=this.data.Vertex(W,B,e),b=this.data.Vertex(Y,F,p),S=this.data.Vertex(j,V,x),R=this.data.Vertex(k,H,M),P=this.data.Vertex(C,G,w);this.Render(E,t,A,P,R,n,W,C,k,h,!1,!1,m,f,e,w,M),this.Render(_,A,i,b,P,W,s,Y,C,h,c,!1,!1,e,u,p,w),this.Render(L,P,b,a,S,C,Y,o,j,!1,c,d,!1,w,p,v,x),this.Render(N,R,P,S,r,k,C,j,l,!1,!1,d,m,M,w,x,g)}else{let e=this.vertex(W,B),f=this.vertex(Y,F),u=this.vertex(j,V),v=this.vertex(k,H),g=this.vertex(C,G);this.Render(E,t,e,g,v,n,W,C,k,h,!1,!1,m),this.Render(_,e,i,f,g,W,s,Y,C,h,c,!1,!1),this.Render(L,g,f,a,u,C,Y,o,j,!1,c,d,!1),this.Render(N,v,g,u,r,k,C,j,l,!1,!1,d,m)}}}process3(e){this.Res2=BezierFactor*BezierFactor*this.res2;let t=e[0],i=e[6],a=e[9],r=this.normal(a,e[5],e[2],t,e[1],e[3],i),n=this.normal(t,e[1],e[3],i,e[7],e[8],a),s=this.normal(i,e[7],e[8],a,e[5],e[2],t);if(this.color){let o=this.color[0],l=this.color[1],h=this.color[2],c=this.data.Vertex(t,r,o),d=this.data.Vertex(i,n,l),m=this.data.Vertex(a,s,h);this.Render3(e,c,d,m,t,i,a,!1,!1,!1,o,l,h)}else{let o=this.vertex(t,r),l=this.vertex(i,n),h=this.vertex(a,s);this.Render3(e,o,l,h,t,i,a,!1,!1,!1)}this.data.indices.length>0&&this.append()}Render3(e,t,i,a,r,n,s,o,l,h,c,d,m){if(this.Distance3(e)<this.Res2)this.offscreen([r,n,s])||(this.data.indices.push(t),this.data.indices.push(i),this.data.indices.push(a));else{if(this.offscreen(e))return;let f=e[0],u=e[1],v=e[2],g=e[3],p=e[4],x=e[5],M=e[6],w=e[7],A=e[8],b=e[9],S=[.5*(b[0]+x[0]),.5*(b[1]+x[1]),.5*(b[2]+x[2])],R=[.5*(b[0]+A[0]),.5*(b[1]+A[1]),.5*(b[2]+A[2])],P=[.5*(x[0]+v[0]),.5*(x[1]+v[1]),.5*(x[2]+v[2])],D=[.5*(A[0]+p[0]),.5*(A[1]+p[1]),.5*(A[2]+p[2])],T=[.5*(A[0]+w[0]),.5*(A[1]+w[1]),.5*(A[2]+w[2])],y=[.5*(v[0]+p[0]),.5*(v[1]+p[1]),.5*(v[2]+p[2])],I=[.5*(v[0]+f[0]),.5*(v[1]+f[1]),.5*(v[2]+f[2])],z=[.5*(p[0]+g[0]),.5*(p[1]+g[1]),.5*(p[2]+g[2])],O=[.5*(w[0]+M[0]),.5*(w[1]+M[1]),.5*(w[2]+M[2])],E=[.5*(f[0]+u[0]),.5*(f[1]+u[1]),.5*(f[2]+u[2])],_=[.5*(u[0]+g[0]),.5*(u[1]+g[1]),.5*(u[2]+g[2])],L=[.5*(g[0]+M[0]),.5*(g[1]+M[1]),.5*(g[2]+M[2])],N=[.5*(S[0]+P[0]),.5*(S[1]+P[1]),.5*(S[2]+P[2])],C=[.5*(R[0]+T[0]),.5*(R[1]+T[1]),.5*(R[2]+T[2])],B=[.5*(P[0]+I[0]),.5*(P[1]+I[1]),.5*(P[2]+I[2])],F=[.5*D[0]+.25*(p[0]+u[0]),.5*D[1]+.25*(p[1]+u[1]),.5*D[2]+.25*(p[2]+u[2])],V=[.5*(T[0]+O[0]),.5*(T[1]+O[1]),.5*(T[2]+O[2])],H=[.5*y[0]+.25*(p[0]+w[0]),.5*y[1]+.25*(p[1]+w[1]),.5*y[2]+.25*(p[2]+w[2])],G=[.25*(x[0]+p[0])+.5*z[0],.25*(x[1]+p[1])+.5*z[1],.25*(x[2]+p[2])+.5*z[2]],U=[.5*(E[0]+_[0]),.5*(E[1]+_[1]),.5*(E[2]+_[2])],W=[.5*(_[0]+L[0]),.5*(_[1]+L[1]),.5*(_[2]+L[2])],Y=[.5*(H[0]+U[0]),.5*(H[1]+U[1]),.5*(H[2]+U[2])],j=[.5*(H[0]+W[0]),.5*(H[1]+W[1]),.5*(H[2]+W[2])],k=[.5*(U[0]+W[0]),.5*(U[1]+W[1]),.5*(U[2]+W[2])],X=[.5*(G[0]+V[0]),.5*(G[1]+V[1]),.5*(G[2]+V[2])],Z=[.5*(C[0]+G[0]),.5*(C[1]+G[1]),.5*(C[2]+G[2])],q=[.5*(C[0]+V[0]),.5*(C[1]+V[1]),.5*(C[2]+V[2])],K=[.5*(N[0]+F[0]),.5*(N[1]+F[1]),.5*(N[2]+F[2])],$=[.5*(B[0]+F[0]),.5*(B[1]+F[1]),.5*(B[2]+F[2])],Q=[.5*(N[0]+B[0]),.5*(N[1]+B[1]),.5*(N[2]+B[2])],J=[f,E,I,U,[.5*(y[0]+E[0]),.5*(y[1]+E[1]),.5*(y[2]+E[2])],B,k,Y,$,Q],ee=[k,W,j,L,[.5*(z[0]+O[0]),.5*(z[1]+O[1]),.5*(z[2]+O[2])],X,M,O,V,q],te=[Q,K,N,Z,[.5*(S[0]+D[0]),.5*(S[1]+D[1]),.5*(S[2]+D[2])],S,q,C,R,b],ie=[q,Z,X,K,[.25*(P[0]+T[0]+_[0]+p[0]),.25*(P[1]+T[1]+_[1]+p[1]),.25*(P[2]+T[2]+_[2]+p[2])],j,Q,$,Y,k],ae=this.normal(k,j,X,q,Z,K,Q),re=this.normal(q,Z,K,Q,$,Y,k),ne=this.normal(Q,$,Y,k,j,X,q),se=this.Epsilon,oe=[.5*(n[0]+s[0]),.5*(n[1]+s[1]),.5*(n[2]+s[2])];if(!o)if(o=Straightness(M,w,A,b)<this.res2){let e=unit(this.sumderivative(ie[0],ie[2],ie[5],ie[9],ie[1],ie[3],ie[6]));oe=[oe[0]-se*e[0],oe[1]-se*e[1],oe[2]-se*e[2]]}else oe=q;let le=[.5*(s[0]+r[0]),.5*(s[1]+r[1]),.5*(s[2]+r[2])];if(!l)if(l=Straightness(f,v,x,b)<this.res2){let e=unit(this.sumderivative(ie[6],ie[3],ie[1],ie[0],ie[7],ie[8],ie[9]));le=[le[0]-se*e[0],le[1]-se*e[1],le[2]-se*e[2]]}else le=Q;let he=[.5*(r[0]+n[0]),.5*(r[1]+n[1]),.5*(r[2]+n[2])];if(!h)if(h=Straightness(f,u,g,M)<this.res2){let e=unit(this.sumderivative(ie[9],ie[8],ie[7],ie[6],ie[5],ie[2],ie[0]));he=[he[0]-se*e[0],he[1]-se*e[1],he[2]-se*e[2]]}else he=k;if(c){let e=Array(4),f=Array(4),u=Array(4);for(let t=0;t<4;++t)e[t]=.5*(d[t]+m[t]),f[t]=.5*(m[t]+c[t]),u[t]=.5*(c[t]+d[t]);let v=this.data.Vertex(oe,ae,e),g=this.data.Vertex(le,re,f),p=this.data.Vertex(he,ne,u);this.Render3(J,t,p,g,r,he,le,!1,l,h,c,u,f),this.Render3(ee,p,i,v,he,n,oe,o,!1,h,u,d,e),this.Render3(te,g,v,a,le,oe,s,o,l,!1,f,e,m),this.Render3(ie,v,g,p,oe,le,he,!1,!1,!1,e,f,u)}else{let e=this.vertex(oe,ae),c=this.vertex(le,re),d=this.vertex(he,ne);this.Render3(J,t,d,c,r,he,le,!1,l,h),this.Render3(ee,d,i,e,he,n,oe,o,!1,h),this.Render3(te,c,e,a,le,oe,s,o,l,!1),this.Render3(ie,e,c,d,oe,le,he,!1,!1,!1)}}}Distance(e){let t=e[0],i=e[3],a=e[12],r=e[15],n=Distance2(r,t,this.normal(i,e[2],e[1],t,e[4],e[8],a));return n=Math.max(n,Straightness(t,e[1],e[2],i)),n=Math.max(n,Straightness(t,e[4],e[8],a)),n=Math.max(n,Straightness(i,e[7],e[11],r)),n=Math.max(n,Straightness(a,e[13],e[14],r)),n=Math.max(n,Straightness(e[4],e[5],e[6],e[7])),n=Math.max(n,Straightness(e[8],e[9],e[10],e[11])),n=Math.max(n,Straightness(e[1],e[5],e[9],e[13])),Math.max(n,Straightness(e[2],e[6],e[10],e[14]))}Distance3(e){let t=e[0],i=e[4],a=e[6],r=e[9],n=abs2([(t[0]+a[0]+r[0])*third-i[0],(t[1]+a[1]+r[1])*third-i[1],(t[2]+a[2]+r[2])*third-i[2]]);return n=Math.max(n,Straightness(t,e[1],e[3],a)),n=Math.max(n,Straightness(t,e[2],e[5],r)),Math.max(n,Straightness(a,e[7],e[8],r))}derivative(e,t,i,a){let r=[t[0]-e[0],t[1]-e[1],t[2]-e[2]];if(abs2(r)>this.epsilon)return r;let n=bezierPP(e,t,i);return abs2(n)>this.epsilon?n:bezierPPP(e,t,i,a)}sumderivative(e,t,i,a,r,n,s){let o=this.derivative(e,t,i,a),l=this.derivative(e,r,n,s);return[o[0]+l[0],o[1]+l[1],o[2]+l[2]]}normal(e,t,i,a,r,n,s){let o=r[0]-a[0],l=r[1]-a[1],h=r[2]-a[2],c=i[0]-a[0],d=i[1]-a[1],m=i[2]-a[2],f=[l*m-h*d,h*c-o*m,o*d-l*c];if(abs2(f)>this.epsilon)return unit(f);let u=[c,d,m],v=[o,l,h],g=bezierPP(a,i,t),p=bezierPP(a,r,n),x=cross(p,u),M=cross(v,g);if(abs2(f=[x[0]+M[0],x[1]+M[1],x[2]+M[2]])>this.epsilon)return unit(f);let w=bezierPPP(a,i,t,e),A=bezierPPP(a,r,n,s);x=cross(p,g),M=cross(v,w);let b=cross(A,u),S=cross(A,g),R=cross(p,w),P=cross(A,w);return unit([9*x[0]+3*(M[0]+b[0]+S[0]+R[0])+P[0],9*x[1]+3*(M[1]+b[1]+S[1]+R[1])+P[1],9*x[2]+3*(M[2]+b[2]+S[2]+R[2])+P[2]])}}class BezierCurve extends Geometry{constructor(e,t,i,a,r){super(),this.controlpoints=e,this.Min=a,this.Max=r,this.CenterIndex=t,this.MaterialIndex=i}setMaterialIndex(){this.setMaterial(material1Data,drawMaterial1)}processLine(e){let t=e[0],i=e[1];this.offscreen([t,i])||(this.data.indices.push(this.data.vertex1(t)),this.data.indices.push(this.data.vertex1(i)),this.append())}process(e){if(2==e.length)return this.processLine(e);let t=this.data.vertex1(e[0]),i=this.data.vertex1(e[3]);this.Render(e,t,i),this.data.indices.length>0&&this.append()}append(){material1Data.append(this.data)}Render(e,t,i){let a=e[0],r=e[1],n=e[2],s=e[3];if(Straightness(a,r,n,s)<this.res2)this.offscreen([a,s])||(this.data.indices.push(t),this.data.indices.push(i));else{if(this.offscreen(e))return;let o=[.5*(a[0]+r[0]),.5*(a[1]+r[1]),.5*(a[2]+r[2])],l=[.5*(r[0]+n[0]),.5*(r[1]+n[1]),.5*(r[2]+n[2])],h=[.5*(n[0]+s[0]),.5*(n[1]+s[1]),.5*(n[2]+s[2])],c=[.5*(o[0]+l[0]),.5*(o[1]+l[1]),.5*(o[2]+l[2])],d=[.5*(l[0]+h[0]),.5*(l[1]+h[1]),.5*(l[2]+h[2])],m=[.5*(c[0]+d[0]),.5*(c[1]+d[1]),.5*(c[2]+d[2])],f=[a,o,c,m],u=[m,d,h,s],v=this.data.vertex1(m);this.Render(f,t,v),this.Render(u,v,i)}}}class Pixel extends Geometry{constructor(e,t,i,a,r){super(),this.controlpoint=e,this.width=t,this.CenterIndex=0,this.MaterialIndex=i,this.Min=a,this.Max=r}setMaterialIndex(){this.setMaterial(material0Data,drawMaterial0)}process(e){this.data.indices.push(this.data.vertex0(this.controlpoint,this.width)),this.append()}append(){material0Data.append(this.data)}}class Triangles extends Geometry{constructor(e,t,i){super(),this.CenterIndex=0,this.MaterialIndex=e,this.Min=t,this.Max=i,this.Positions=Positions,this.Normals=Normals,this.Colors=Colors,this.Indices=Indices,Positions=[],Normals=[],Colors=[],Indices=[],this.transparent=Materials[e].diffuse[3]<1}setMaterialIndex(){this.transparent?this.setMaterial(transparentData,drawTransparent):this.setMaterial(triangleData,drawTriangle)}process(e){materialIndex=this.Colors.length>0?-1-materialIndex:1+materialIndex;for(let e=0,t=this.Indices.length;e<t;++e){let t=this.Indices[e],i=t[0],a=this.Positions[i[0]],r=this.Positions[i[1]],n=this.Positions[i[2]];if(!this.offscreen([a,r,n])){let e=t.length>1?t[1]:i;if(e&&0!=e.length||(e=i),this.Colors.length>0){let s=t.length>2?t[2]:i;s&&0!=s.length||(s=i);let o=this.Colors[s[0]],l=this.Colors[s[1]],h=this.Colors[s[2]];this.transparent|=o[3]+l[3]+h[3]<765,this.data.iVertex(i[0],a,this.Normals[e[0]],o),this.data.iVertex(i[1],r,this.Normals[e[1]],l),this.data.iVertex(i[2],n,this.Normals[e[2]],h)}else this.data.iVertex(i[0],a,this.Normals[e[0]]),this.data.iVertex(i[1],r,this.Normals[e[1]]),this.data.iVertex(i[2],n,this.Normals[e[2]])}}this.data.nvertices=this.Positions.length,this.data.indices.length>0&&this.append()}append(){this.transparent?transparentData.append(this.data):triangleData.append(this.data)}}function home(){mat4.identity(rotMat),initProjection(),setProjection(),remesh=!0,redraw=!0}function initShader(e=[]){let t=getShader(gl,vertex,gl.VERTEX_SHADER,e),i=getShader(gl,fragment,gl.FRAGMENT_SHADER,e),a=gl.createProgram();return gl.attachShader(a,t),gl.attachShader(a,i),gl.linkProgram(a),gl.getProgramParameter(a,gl.LINK_STATUS)||alert("Could not initialize shaders"),a}class Split3{constructor(e,t,i,a){this.m0=[.5*(e[0]+t[0]),.5*(e[1]+t[1]),.5*(e[2]+t[2])];let r=.5*(t[0]+i[0]),n=.5*(t[1]+i[1]),s=.5*(t[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]+n),.5*(this.m0[2]+s)],this.m4=[.5*(r+this.m2[0]),.5*(n+this.m2[1]),.5*(s+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(e){return 0==e[0]&&0==e[1]&&0==e[2]}function unit(e){let t=1/(Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2])||1);return[e[0]*t,e[1]*t,e[2]*t]}function abs2(e){return e[0]*e[0]+e[1]*e[1]+e[2]*e[2]}function dot(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function cross(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function bezierPP(e,t,i){return[e[0]+i[0]-2*t[0],e[1]+i[1]-2*t[1],e[2]+i[2]-2*t[2]]}function bezierPPP(e,t,i,a){return[a[0]-e[0]+3*(t[0]-i[0]),a[1]-e[1]+3*(t[1]-i[1]),a[2]-e[2]+3*(t[2]-i[2])]}function Straightness(e,t,i,a){let r=[third*(a[0]-e[0]),third*(a[1]-e[1]),third*(a[2]-e[2])];return Math.max(abs2([t[0]-r[0]-e[0],t[1]-r[1]-e[1],t[2]-r[2]-e[2]]),abs2([a[0]-r[0]-i[0],a[1]-r[1]-i[1],a[2]-r[2]-i[2]]))}function Distance2(e,t,i){let a=dot([e[0]-t[0],e[1]-t[1],e[2]-t[2]],i);return a*a}function corners(e,t){return[e,[e[0],e[1],t[2]],[e[0],t[1],e[2]],[e[0],t[1],t[2]],[t[0],e[1],e[2]],[t[0],e[1],t[2]],[t[0],t[1],e[2]],t]}function COBTarget(e,t){mat4.fromTranslation(translMat,[center.x,center.y,center.z]),mat4.invert(cjMatInv,translMat),mat4.multiply(e,t,cjMatInv),mat4.multiply(e,translMat,e)}function setUniforms(e,t){let i=t==pixelShader;gl.useProgram(t),t.vertexPositionAttribute=gl.getAttribLocation(t,"position"),gl.enableVertexAttribArray(t.vertexPositionAttribute),i&&(t.vertexWidthAttribute=gl.getAttribLocation(t,"width"),gl.enableVertexAttribArray(t.vertexWidthAttribute));let a=t!=noNormalShader&&!i&&Lights.length>0;if(a&&(t.vertexNormalAttribute=gl.getAttribLocation(t,"normal"),gl.enableVertexAttribArray(t.vertexNormalAttribute)),t.vertexMaterialAttribute=gl.getAttribLocation(t,"materialIndex"),-1!=t.vertexMaterialAttribute&&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)),a)for(let e=0;e<Lights.length;++e)Lights[e].setUniform(t,e);if(-1!=t.vertexMaterialAttribute)for(let i=0;i<e.materials.length;++i)e.materials[i].setUniform(t,i);gl.uniformMatrix4fv(t.projViewMatUniform,!1,projViewMat),gl.uniformMatrix4fv(t.viewMatUniform,!1,viewMat),gl.uniformMatrix3fv(t.normMatUniform,!1,normMat)}function handleMouseDown(e){mouseDownOrTouchActive=!0,lastMouseX=e.clientX,lastMouseY=e.clientY}let pinchStart,touchStartTime,pinch=!1;function pinchDistance(e){return Math.hypot(e[0].pageX-e[1].pageX,e[0].pageY-e[1].pageY)}function handleTouchStart(e){e.preventDefault();let t=e.targetTouches;swipe=rotate=pinch=!1,zooming||(1!=t.length||mouseDownOrTouchActive||(touchStartTime=(new Date).getTime(),touchId=t[0].identifier,lastMouseX=t[0].pageX,lastMouseY=t[0].pageY),2!=t.length||mouseDownOrTouchActive||(touchId=t[0].identifier,pinchStart=pinchDistance(t),pinch=!0))}function handleMouseUpOrTouchEnd(e){mouseDownOrTouchActive=!1}function rotateScene(e,t,i,a,r){if(e==i&&t==a)return;let[n,s]=arcball([e,-t],[i,-a]);mat4.fromRotation(rotMats,2*r*ArcballFactor*n/lastzoom,s),mat4.multiply(rotMat,rotMats,rotMat)}function shiftScene(e,t,i,a){let r=1/lastzoom;shift.x+=(i-e)*r*halfCanvasWidth,shift.y-=(a-t)*r*halfCanvasHeight}function panScene(e,t,i,a){orthographic?shiftScene(e,t,i,a):(center.x+=(i-e)*(viewParam.xmax-viewParam.xmin),center.y-=(a-t)*(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 e=Math.sqrt(Number.MAX_VALUE),t=1/e;Zoom<=t&&(Zoom=t),Zoom>=e&&(Zoom=e),Zoom!=lastzoom&&(remesh=!0),lastzoom=Zoom}function zoomImage(e){let t=zoomStep*halfCanvasHeight*e;const i=Math.log(.1*Number.MAX_VALUE)/Math.log(zoomFactor);Math.abs(t)<i&&(Zoom*=zoomFactor**t,capzoom())}function normMouse(e){let t=e[0],i=e[1],a=Math.hypot(t,i);return a>1&&(denom=1/a,t*=denom,i*=denom),[t,i,Math.sqrt(Math.max(1-i*i-t*t,0))]}function arcball(e,t){let i=normMouse(e),a=normMouse(t),r=dot(i,a);return r>1?r=1:r<-1&&(r=-1),[Math.acos(r),unit(cross(i,a))]}function zoomScene(e,t,i,a){zoomImage(t-a)}const DRAGMODE_ROTATE=1,DRAGMODE_SHIFT=2,DRAGMODE_ZOOM=3,DRAGMODE_PAN=4;function processDrag(e,t,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=((e,t,i,a)=>{})}r((lastMouseX-halfCanvasWidth)/halfCanvasWidth,(lastMouseY-halfCanvasHeight)/halfCanvasHeight,(e-halfCanvasWidth)/halfCanvasWidth,(t-halfCanvasHeight)/halfCanvasHeight,a),lastMouseX=e,lastMouseY=t,setProjection(),redraw=!0}function handleKey(e){let t=[];switch(e.key){case"x":t=[1,0,0];break;case"y":t=[0,1,0];break;case"z":t=[0,0,1];break;case"h":home();break;case"+":case"=":case">":expand();break;case"-":case"_":case"<":shrink()}t.length>0&&(mat4.rotate(rotMat,rotMat,.1,t),updateViewMatrix(),redraw=!0)}function handleMouseWheel(e){e.preventDefault(),e.deltaY<0?Zoom*=zoomFactor:Zoom/=zoomFactor,capzoom(),setProjection(),redraw=!0}function handleMouseMove(e){if(!mouseDownOrTouchActive)return;let t;processDrag(e.clientX,e.clientY,t=e.getModifierState("Control")?DRAGMODE_SHIFT:e.getModifierState("Shift")?DRAGMODE_ZOOM:e.getModifierState("Alt")?DRAGMODE_PAN:DRAGMODE_ROTATE)}let zooming=!1,swipe=!1,rotate=!1;function handleTouchMove(e){if(e.preventDefault(),zooming)return;let t=e.targetTouches;if(!pinch&&1==t.length&&touchId==t[0].identifier){let e=t[0].pageX,i=t[0].pageY,a=e-lastMouseX,r=i-lastMouseY,n=a*a+r*r<=shiftHoldDistance*shiftHoldDistance;if(n&&!swipe&&!rotate&&(new Date).getTime()-touchStartTime>shiftWaitTime&&(navigator.vibrate&&window.navigator.vibrate(vibrateTime),swipe=!0),swipe)processDrag(e,i,DRAGMODE_SHIFT);else if(!n){rotate=!0,processDrag(t[0].pageX,t[0].pageY,DRAGMODE_ROTATE,.5)}}if(pinch&&!swipe&&2==t.length&&touchId==t[0].identifier){let e=pinchDistance(t),i=e-pinchStart;zooming=!0,(i*=zoomPinchFactor)>zoomPinchCap&&(i=zoomPinchCap),i<-zoomPinchCap&&(i=-zoomPinchCap),zoomImage(i/size2),pinchStart=e,swipe=rotate=zooming=!1,setProjection(),redraw=!0}}let pixelShader,noNormalShader,materialShader,colorShader,transparentShader,zbuffer=[];function transformVertices(e){let t=viewMat[2],i=viewMat[6],a=viewMat[10];zbuffer.length=e.length;for(let r=0;r<e.length;++r){let n=6*r;zbuffer[r]=t*e[n]+i*e[n+1]+a*e[n+2]}}function drawMaterial0(){drawBuffer(material0Data,pixelShader),material0Data.clear()}function drawMaterial1(){drawBuffer(material1Data,noNormalShader),material1Data.clear()}function drawMaterial(){drawBuffer(materialData,materialShader),materialData.clear()}function drawColor(){drawBuffer(colorData,colorShader),colorData.clear()}function drawTriangle(){drawBuffer(triangleData,transparentShader),triangleData.clear()}function drawTransparent(){let e=transparentData.indices;if(e.length>0){transformVertices(transparentData.vertices);let t=e.length/3,i=Array(t).fill().map((e,t)=>t);i.sort(function(t,i){let a=3*t;Ia=e[a],Ib=e[a+1],Ic=e[a+2];let r=3*i;return IA=e[r],IB=e[r+1],IC=e[r+2],zbuffer[Ia]+zbuffer[Ib]+zbuffer[Ic]<zbuffer[IA]+zbuffer[IB]+zbuffer[IC]?-1:1});let a=Array(e.length);for(let r=0;r<t;++r){let t=3*i[r];a[3*r]=e[t],a[3*r+1]=e[t+1],a[3*r+2]=e[t+2]}gl.depthMask(!1),drawBuffer(transparentData,transparentShader,a),gl.depthMask(!0)}transparentData.clear()}function drawBuffers(){drawMaterial0(),drawMaterial1(),drawMaterial(),drawColor(),drawTriangle(),drawTransparent()}function draw(){embedded&&(offscreen.width=canvas.width,offscreen.height=canvas.height,setViewport()),gl.clearColor(Background[0],Background[1],Background[2],Background[3]),gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT);for(let e=0;e<P.length;++e)P[e].render();drawBuffers(),remesh=!1}function tick(){requestAnimationFrame(tick),redraw&&(draw(),redraw=!1)}function setDimensions(e,t,i,a){let r=e/t,n=1/lastzoom,s=(i/e+viewportshift[0])*lastzoom,o=(a/t+viewportshift[1])*lastzoom;if(orthographic){let e=B[0]-b[0],t=B[1]-b[1];if(e<t*r){let e=.5*t*r*n,i=2*e*s,a=t*n*o;viewParam.xmin=-e-i,viewParam.xmax=e-i,viewParam.ymin=b[1]*n-a,viewParam.ymax=B[1]*n-a}else{let t=.5*e/(r*Zoom),i=e*n*s,a=2*t*o;viewParam.xmin=b[0]*n-i,viewParam.xmax=B[0]*n-i,viewParam.ymin=-t-a,viewParam.ymax=t-a}}else{let e=H*n,t=e*r,i=2*t*s,a=2*e*o;viewParam.xmin=-t-i,viewParam.xmax=t-i,viewParam.ymin=-e-a,viewParam.ymax=e-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),gl.scissor(0,0,gl.viewportWidth,gl.viewportHeight)}function setCanvas(){canvas.width=canvasWidth,canvas.height=canvasHeight,embedded&&(offscreen.width=canvasWidth,offscreen.height=canvasHeight),size2=Math.hypot(canvasWidth,canvasHeight),halfCanvasWidth=.5*canvasWidth,halfCanvasHeight=.5*canvasHeight}function setsize(e,t){e>maxViewportWidth&&(e=maxViewportWidth),t>maxViewportHeight&&(t=maxViewportHeight),shift.x*=e/canvasWidth,shift.y*=t/canvasHeight,canvasWidth=e,canvasHeight=t,setCanvas(),setViewport(),home()}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"),embedded=window.parent.document!=document,initGL(),absolute&&!embedded)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 e=canvasWidth/canvasHeight;canvas.width>canvas.height*e?canvas.width=Math.min(canvas.height*e,canvas.width):canvas.height=Math.min(canvas.width/e,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,viewportshift[0]/=Zoom0,viewportshift[1]/=Zoom0,gl.enable(gl.BLEND),gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA),gl.enable(gl.DEPTH_TEST),gl.enable(gl.SCISSOR_TEST),setViewport(),home(),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()}
diff --git a/graphics/asymptote/beziercurve.h b/graphics/asymptote/beziercurve.h
index e3c460e315..842a7d55da 100644
--- a/graphics/asymptote/beziercurve.h
+++ b/graphics/asymptote/beziercurve.h
@@ -39,12 +39,6 @@ struct BezierCurve
void append() {
material1Data.append1(data);
-
- if(material1Data.vertices1.size() >= gl::maxvertices) {
- drawBuffer(material1Data,noNormalShader);
- material1Data.clear();
- gl::forceRemesh=true;
- }
}
void queue(const triple *g, bool straight, double ratio) {
@@ -62,12 +56,6 @@ struct Pixel
void append() {
material0Data.append0(data);
-
- if(material0Data.vertices0.size() >= gl::maxvertices) {
- drawBuffer(material0Data,pixelShader);
- material0Data.clear();
- gl::forceRemesh=true;
- }
}
void queue(const triple& p, double width) {
diff --git a/graphics/asymptote/bezierpatch.cc b/graphics/asymptote/bezierpatch.cc
index 8f7c607c2a..2549e75934 100644
--- a/graphics/asymptote/bezierpatch.cc
+++ b/graphics/asymptote/bezierpatch.cc
@@ -820,9 +820,12 @@ void transform(const std::vector<VertexData>& b)
// ybuffer.resize(n);
zbuffer.resize(n);
+ double Tz0=gl::dView[2];
+ double Tz1=gl::dView[6];
+ double Tz2=gl::dView[10];
for(unsigned i=0; i < n; ++i) {
const GLfloat *v=b[i].position;
- zbuffer[i]=TransformZ(triple(v[0],v[1],v[2]),gl::dprojView);
+ zbuffer[i]=Tz0*v[0]+Tz1*v[1]+Tz2*v[2];
}
}
diff --git a/graphics/asymptote/bezierpatch.h b/graphics/asymptote/bezierpatch.h
index e637eef467..5bea586802 100644
--- a/graphics/asymptote/bezierpatch.h
+++ b/graphics/asymptote/bezierpatch.h
@@ -125,21 +125,11 @@ struct BezierPatch
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;
- }
+ if(color)
+ colorData.Append(data);
+ else
+ materialData.append(data);
}
}
@@ -193,14 +183,8 @@ public:
void append() {
if(transparent)
transparentData.Append(data);
- else {
+ else
triangleData.Append(data);
- if(triangleData.Vertices.size() >= gl::maxvertices) {
- drawBuffer(triangleData,transparentShader);
- triangleData.clear();
- gl::forceRemesh=true;
- }
- }
}
};
diff --git a/graphics/asymptote/build-scripts/build-asygl b/graphics/asymptote/build-scripts/build-asygl
index 46e0cfd082..f1d75a6f80 100755
--- a/graphics/asymptote/build-scripts/build-asygl
+++ b/graphics/asymptote/build-scripts/build-asygl
@@ -1,5 +1,16 @@
#!/bin/sh
-if [ ! $# = 0 ]; then echo Usage: "$0"; exit 1; fi
+if [ $# -gt 1 -o \( $# = 1 -a "$1" != "debug" \) ]; then \
+ echo Usage: "$0 [debug]"; exit 1; \
+fi
+
+if [ $# -eq 1 ]; then \
+UGLIFY=cat; \
+UGLIFYOPT=""; \
+else \
+UGLIFY=uglifyjs; \
+UGLIFYOPTIONS="-m -c --comments"; \
+fi
+
GL_MATRIX_VERSION=2.4.0
GL_MATRIX_DIR=gl-matrix-$GL_MATRIX_VERSION
GL_MATRIX_DIR_PRUNED=$GL_MATRIX_DIR-pruned
@@ -18,4 +29,12 @@ 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.js webgl/gl.js $GL_MATRIX_DIR_PRUNED/LICENSE.js | uglifyjs -m -c -o base/webgl/asygl.js --comments
+SHADERS=`mktemp`
+echo "let vertex=\`" > $SHADERS
+echo "\`;" | cat webgl/vertex.glsl - >> $SHADERS
+echo "let fragment=\`" >> $SHADERS
+echo "\`;" | cat webgl/fragment.glsl - >> $SHADERS
+cat webgl/license $GL_MATRIX_DIR_PRUNED/LICENSE.js \
+ $SHADERS $GL_MATRIX_DIR_PRUNED/dist/gl-matrix.js webgl/gl.js | \
+ $UGLIFY $UGLIFYOPTIONS > base/webgl/asygl.js
+rm $SHADERS
diff --git a/graphics/asymptote/configure b/graphics/asymptote/configure
index c6f69c085f..93e5c4cdde 100755
--- a/graphics/asymptote/configure
+++ b/graphics/asymptote/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for Asymptote 2.58.
+# Generated by GNU Autoconf 2.69 for Asymptote 2.59.
#
# Report bugs to <http://sourceforge.net/projects/asymptote>.
#
@@ -580,8 +580,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='Asymptote'
PACKAGE_TARNAME='asymptote'
-PACKAGE_VERSION='2.58'
-PACKAGE_STRING='Asymptote 2.58'
+PACKAGE_VERSION='2.59'
+PACKAGE_STRING='Asymptote 2.59'
PACKAGE_BUGREPORT='http://sourceforge.net/projects/asymptote'
PACKAGE_URL=''
@@ -1287,7 +1287,7 @@ if test "$ac_init_help" = "long"; then
# 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.58 to adapt to many kinds of systems.
+\`configure' configures Asymptote 2.59 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1352,7 +1352,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of Asymptote 2.58:";;
+ short | recursive ) echo "Configuration of Asymptote 2.59:";;
esac
cat <<\_ACEOF
@@ -1469,7 +1469,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-Asymptote configure 2.58
+Asymptote configure 2.59
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2055,7 +2055,7 @@ cat >config.log <<_ACEOF
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.58, which was
+It was created by Asymptote $as_me 2.59, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -9094,7 +9094,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# 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.58, which was
+This file was extended by Asymptote $as_me 2.59, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -9156,7 +9156,7 @@ _ACEOF
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.58
+Asymptote config.status 2.59
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/graphics/asymptote/configure.ac b/graphics/asymptote/configure.ac
index e6f0147325..9e984ea36d 100644
--- a/graphics/asymptote/configure.ac
+++ b/graphics/asymptote/configure.ac
@@ -3,7 +3,7 @@
# this file.
AC_PREREQ(2)
-AC_INIT([Asymptote],[2.58],[http://sourceforge.net/projects/asymptote])
+AC_INIT([Asymptote],[2.59],[http://sourceforge.net/projects/asymptote])
VERSION=$PACKAGE_VERSION
AC_SUBST(VERSION)
m4_include([ax_pthread.m4])
diff --git a/graphics/asymptote/doc/CAD.pdf b/graphics/asymptote/doc/CAD.pdf
index fb860b540d..dfffd72e34 100644
--- a/graphics/asymptote/doc/CAD.pdf
+++ b/graphics/asymptote/doc/CAD.pdf
Binary files differ
diff --git a/graphics/asymptote/doc/FAQ/asy-faq.info b/graphics/asymptote/doc/FAQ/asy-faq.info
index 1a62046fa9..10dc7be7a4 100644
--- a/graphics/asymptote/doc/FAQ/asy-faq.info
+++ b/graphics/asymptote/doc/FAQ/asy-faq.info
@@ -10,7 +10,7 @@ END-INFO-DIR-ENTRY
File: asy-faq.info, Node: Top, Next: Question 1.1, Up: (dir)
ASYMPTOTE FREQUENTLY ASKED QUESTIONS
- 11 Oct 2019
+ 19 Oct 2019
This is the list of Frequently Asked Questions about Asymptote (asy).
diff --git a/graphics/asymptote/doc/TeXShopAndAsymptote.pdf b/graphics/asymptote/doc/TeXShopAndAsymptote.pdf
index f4b38bdab7..ecff0882c8 100644
--- a/graphics/asymptote/doc/TeXShopAndAsymptote.pdf
+++ b/graphics/asymptote/doc/TeXShopAndAsymptote.pdf
Binary files differ
diff --git a/graphics/asymptote/doc/asy-latex.pdf b/graphics/asymptote/doc/asy-latex.pdf
index 45b3edad0a..8c472a9ca8 100644
--- a/graphics/asymptote/doc/asy-latex.pdf
+++ b/graphics/asymptote/doc/asy-latex.pdf
Binary files differ
diff --git a/graphics/asymptote/doc/asy.1 b/graphics/asymptote/doc/asy.1
index 563f8a3cd6..c720cd7297 100644
--- a/graphics/asymptote/doc/asy.1
+++ b/graphics/asymptote/doc/asy.1
@@ -169,9 +169,6 @@ Mask fpu exceptions; command-line only.
.B \-maxtile pair
Maximum rendering tile size [(1024,768)].
.TP
-.B \-maxvertices n
-Maximum number of vertices to queue [0].
-.TP
.B \-maxviewport pair
Maximum viewport size [(2048,2048)].
.TP
diff --git a/graphics/asymptote/doc/asyRefCard.pdf b/graphics/asymptote/doc/asyRefCard.pdf
index 350b21db27..960814ba4f 100644
--- a/graphics/asymptote/doc/asyRefCard.pdf
+++ b/graphics/asymptote/doc/asyRefCard.pdf
Binary files differ
diff --git a/graphics/asymptote/doc/asymptote.pdf b/graphics/asymptote/doc/asymptote.pdf
index f73a826251..363bb4a434 100644
--- a/graphics/asymptote/doc/asymptote.pdf
+++ b/graphics/asymptote/doc/asymptote.pdf
Binary files differ
diff --git a/graphics/asymptote/doc/asymptote.texi b/graphics/asymptote/doc/asymptote.texi
index d19742bb38..4762044139 100644
--- a/graphics/asymptote/doc/asymptote.texi
+++ b/graphics/asymptote/doc/asymptote.texi
@@ -513,6 +513,7 @@ texcommand
dvips
dvisvgm
convert
+asygl
@end verbatim
@noindent
@@ -7874,11 +7875,11 @@ The examples
@code{@uref{http://asymptote.sourceforge.net/gallery/3Dgraphs/elevation.html,,elevation}@uref{http://asymptote.sourceforge.net/gallery/3Dgraphs/elevation.asy,,.asy}} and @code{@uref{http://asymptote.sourceforge.net/gallery/3Dwebgl/sphericalharmonic.html,,sphericalharmonic}@uref{http://asymptote.sourceforge.net/gallery/3Dwebgl/sphericalharmonic.asy,,.asy}}
illustrate how to draw a surface with patch-dependent colors.
The examples @code{@uref{http://asymptote.sourceforge.net/gallery/3Dwebgl/vertexshading.html,,vertexshading}@uref{http://asymptote.sourceforge.net/gallery/3Dwebgl/vertexshading.asy,,.asy}} and @code{@uref{http://asymptote.sourceforge.net/gallery/3Dgraphs/smoothelevation.html,,smoothelevation}@uref{http://asymptote.sourceforge.net/gallery/3Dgraphs/smoothelevation.asy,,.asy}} illustrate
-vertex-dependent colors, which is supported for both
-@code{Asymptote}'s native @code{OpenGL} renderer and two-dimensional
-projections. Since the @acronym{PRC} output format does not currently support
-vertex shading of Bezier surfaces, @acronym{PRC} patches are shaded
-with the mean of the four vertex colors.
+vertex-dependent colors, which are supported by
+@code{Asymptote}'s native @code{OpenGL}/@code{WebGL} renderers
+and the two-dimensional vector output format (@code{settings.render=0}). Since
+the @acronym{PRC} output format does not currently support vertex
+shading of Bezier surfaces, @acronym{PRC} patches are shaded with the mean of the four vertex colors.
@cindex @code{surface}
@cindex @code{planar}
@@ -8048,18 +8049,17 @@ 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.
+per @code{css} pixel).
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
+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
+small (about 48kB) library within a stand-alone @acronym{HTML} file
that can be viewed offline.
@cindex @code{antialias}
diff --git a/graphics/asymptote/doc/png/asymptote.info b/graphics/asymptote/doc/png/asymptote.info
index 8c668391e2..ccfcd44d54 100644
--- a/graphics/asymptote/doc/png/asymptote.info
+++ b/graphics/asymptote/doc/png/asymptote.info
@@ -1,7 +1,7 @@
This is asymptote.info, produced by makeinfo version 6.5 from
asymptote.texi.
-This file documents 'Asymptote', version 2.58.
+This file documents 'Asymptote', version 2.59.
<http://asymptote.sourceforge.net>
@@ -22,7 +22,7 @@ File: asymptote.info, Node: Top, Next: Description, Prev: (dir), Up: (dir)
Asymptote
*********
-This file documents 'Asymptote', version 2.58.
+This file documents 'Asymptote', version 2.59.
<http://asymptote.sourceforge.net>
@@ -430,6 +430,7 @@ texcommand
dvips
dvisvgm
convert
+asygl
Warnings (such as "unbounded" and "offaxis") may be enabled or
disabled with the functions
@@ -6847,11 +6848,11 @@ the beginning of module 'three'.
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
-vertex-dependent colors, which is supported for both 'Asymptote''s
-native 'OpenGL' renderer and two-dimensional projections. Since the PRC
-output format does not currently support vertex shading of Bezier
-surfaces, PRC patches are shaded with the mean of the four vertex
-colors.
+vertex-dependent colors, which are supported by 'Asymptote''s native
+'OpenGL'/'WebGL' renderers and the two-dimensional vector output format
+('settings.render=0'). Since the PRC output format does not currently
+support vertex shading of Bezier surfaces, PRC patches are shaded with
+the mean of the four vertex colors.
A surface can be constructed from a cyclic 'path3' with the
constructor
@@ -6972,18 +6973,17 @@ There are five choices for viewing 3D 'Asymptote' output:
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.
+ pixels per 'css' pixel).
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,
+ 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
+ 48kB) library within a stand-alone HTML file that can be viewed
offline.
3. Render the scene to a specified rasterized format 'outformat' at
@@ -8158,7 +8158,6 @@ Options (negate by replacing - with -no):
-loop Loop 3D animations [false]
-m,-mask Mask fpu exceptions; command-line only
-maxtile pair Maximum rendering tile size [(1024,768)]
--maxvertices n Maximum number of vertices to queue [0]
-maxviewport pair Maximum viewport size [(2048,2048)]
-multiline Input code over multiple lines at the prompt [false]
-multipleView View output from multiple batch-mode files [false]
@@ -8664,9 +8663,9 @@ Index
* ---: Bezier curves. (line 84)
* -=: Self & prefix operators.
(line 6)
-* -c: Options. (line 195)
-* -l: Options. (line 214)
-* -u: Options. (line 205)
+* -c: Options. (line 194)
+* -l: Options. (line 213)
+* -u: Options. (line 204)
* -V: Configuring. (line 6)
* -V <1>: Drawing in batch mode.
(line 16)
@@ -8679,7 +8678,7 @@ Index
* 2D graphs: graph. (line 6)
* 3D graphs: graph3. (line 6)
* 3D grids: grid3. (line 6)
-* 3D PostScript: three. (line 634)
+* 3D PostScript: three. (line 633)
* :: Arithmetic & logical.
(line 61)
* ::: Bezier curves. (line 70)
@@ -8714,7 +8713,7 @@ Index
(line 35)
* accel: Paths and guides. (line 126)
* accel <1>: Paths and guides. (line 132)
-* accel <2>: three. (line 535)
+* accel <2>: three. (line 534)
* access: Import. (line 6)
* acknowledgments: Credits. (line 6)
* acos: Mathematical functions.
@@ -8727,8 +8726,8 @@ Index
(line 212)
* add <1>: Frames and pictures.
(line 226)
-* add <2>: three. (line 307)
-* addViews: three. (line 428)
+* add <2>: three. (line 306)
+* addViews: three. (line 427)
* adjust: Pens. (line 123)
* Ai: Mathematical functions.
(line 48)
@@ -8739,7 +8738,7 @@ Index
* alias: Structures. (line 62)
* alias <1>: Arrays. (line 174)
* Align: label. (line 12)
-* aligndir: Options. (line 187)
+* aligndir: Options. (line 186)
* all: Arrays. (line 325)
* Allow: Pens. (line 346)
* and: Bezier curves. (line 56)
@@ -8752,22 +8751,22 @@ Index
* animation: animation. (line 6)
* animation <1>: animation. (line 6)
* annotate: annotate. (line 6)
-* antialias: three. (line 249)
-* antialias <1>: Options. (line 156)
+* antialias: three. (line 248)
+* antialias <1>: Options. (line 155)
* 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 318)
+* arc <1>: three. (line 317)
* ArcArrow: draw. (line 26)
-* ArcArrow3: three. (line 601)
+* ArcArrow3: three. (line 600)
* ArcArrows: draw. (line 26)
-* ArcArrows3: three. (line 601)
+* ArcArrows3: three. (line 600)
* arclength: Paths and guides. (line 153)
-* arclength <1>: three. (line 535)
+* arclength <1>: three. (line 534)
* arcpoint: Paths and guides. (line 163)
* arctime: Paths and guides. (line 157)
-* arctime <1>: three. (line 535)
+* arctime <1>: three. (line 534)
* arguments: Default arguments. (line 6)
* arithmetic operators: Arithmetic & logical.
(line 6)
@@ -8781,10 +8780,10 @@ Index
* arrow keys: Drawing in interactive mode.
(line 11)
* arrow keys <1>: GUI usage. (line 6)
-* Arrow3: three. (line 601)
+* Arrow3: three. (line 600)
* arrows: draw. (line 26)
* Arrows: draw. (line 26)
-* Arrows3: three. (line 601)
+* Arrows3: three. (line 600)
* as: Import. (line 67)
* ascii: Data types. (line 308)
* ascii <1>: Data types. (line 308)
@@ -8806,7 +8805,7 @@ Index
* asyinclude: LaTeX usage. (line 45)
* asymptote.sty: LaTeX usage. (line 6)
* asymptote.xml: Editing modes. (line 48)
-* ASYMPTOTE_CONFIG: Options. (line 127)
+* ASYMPTOTE_CONFIG: Options. (line 126)
* atan: Mathematical functions.
(line 6)
* aTan: Mathematical functions.
@@ -8820,8 +8819,8 @@ Index
(line 271)
* attach <1>: LaTeX usage. (line 50)
* attach <2>: graph. (line 406)
-* autoadjust: three. (line 393)
-* autoimport: Options. (line 123)
+* autoadjust: three. (line 392)
+* autoimport: Options. (line 122)
* automatic scaling: graph. (line 690)
* automatic scaling <1>: graph. (line 690)
* axialshade: fill. (line 43)
@@ -8835,11 +8834,11 @@ Index
* background <1>: three. (line 97)
* background color: Frames and pictures.
(line 180)
-* BackView: three. (line 421)
+* BackView: three. (line 420)
* Bar: draw. (line 19)
-* Bar3: three. (line 601)
+* Bar3: three. (line 600)
* Bars: draw. (line 19)
-* Bars3: three. (line 601)
+* Bars3: three. (line 600)
* barsize: draw. (line 19)
* base modules: Base modules. (line 6)
* basealign: Pens. (line 181)
@@ -8848,18 +8847,18 @@ Index
(line 6)
* beep: Data types. (line 381)
* BeginArcArrow: draw. (line 26)
-* BeginArcArrow3: three. (line 601)
+* BeginArcArrow3: three. (line 600)
* BeginArrow: draw. (line 26)
-* BeginArrow3: three. (line 601)
+* BeginArrow3: three. (line 600)
* BeginBar: draw. (line 19)
-* BeginBar3: three. (line 601)
+* BeginBar3: three. (line 600)
* BeginDotMargin: draw. (line 42)
-* BeginDotMargin3: three. (line 617)
+* BeginDotMargin3: three. (line 616)
* BeginMargin: draw. (line 42)
-* BeginMargin3: three. (line 617)
+* BeginMargin3: three. (line 616)
* BeginPenMargin: draw. (line 42)
-* BeginPenMargin2: three. (line 617)
-* BeginPenMargin3: three. (line 617)
+* BeginPenMargin2: three. (line 616)
+* BeginPenMargin3: three. (line 616)
* BeginPoint: label. (line 55)
* Bessel: Mathematical functions.
(line 48)
@@ -8871,7 +8870,7 @@ Index
* bezulate: three. (line 134)
* Bi: Mathematical functions.
(line 48)
-* Billboard: three. (line 505)
+* Billboard: three. (line 504)
* binary: Files. (line 76)
* binary format: Files. (line 76)
* binary operators: Arithmetic & logical.
@@ -8879,7 +8878,7 @@ Index
* binarytree: binarytree. (line 6)
* Bi_deriv: Mathematical functions.
(line 48)
-* black stripes: three. (line 249)
+* black stripes: three. (line 248)
* Blank: draw. (line 26)
* block.bottom: flowchart. (line 19)
* block.bottomleft: flowchart. (line 19)
@@ -8898,7 +8897,7 @@ Index
(line 6)
* Bottom: graph. (line 132)
* BottomTop: graph. (line 138)
-* BottomView: three. (line 421)
+* BottomView: three. (line 420)
* bounding box: Frames and pictures.
(line 180)
* Bounds: graph3. (line 21)
@@ -8906,8 +8905,8 @@ Index
(line 25)
* box <1>: Frames and pictures.
(line 130)
-* box <2>: three. (line 340)
-* box <3>: three. (line 342)
+* box <2>: three. (line 339)
+* box <3>: three. (line 341)
* bp: Drawing in batch mode.
(line 23)
* brace: Paths and guides. (line 51)
@@ -8925,7 +8924,7 @@ Index
* CAD: CAD. (line 6)
* calculateTransform: Frames and pictures.
(line 118)
-* camera: three. (line 387)
+* camera: three. (line 386)
* casts: Casts. (line 6)
* cbrt: Mathematical functions.
(line 6)
@@ -8933,7 +8932,7 @@ Index
* ceil: Mathematical functions.
(line 26)
* Center: label. (line 60)
-* center: three. (line 370)
+* center: three. (line 369)
* checker: Pens. (line 268)
* Chinese: unicode. (line 12)
* choose: Mathematical functions.
@@ -8942,7 +8941,7 @@ Index
(line 48)
* circle: Paths and guides. (line 10)
* Circle: Paths and guides. (line 18)
-* circle <1>: three. (line 314)
+* circle <1>: three. (line 313)
* circle <2>: flowchart. (line 61)
* circlebarframe: markers. (line 18)
* CJK: unicode. (line 12)
@@ -8964,7 +8963,7 @@ Index
* colors: Pens. (line 54)
* comma: Files. (line 61)
* comma-separated-value mode: Arrays. (line 357)
-* command-line options: Configuring. (line 88)
+* command-line options: Configuring. (line 89)
* command-line options <1>: Options. (line 6)
* comment character: Files. (line 16)
* compass directions: Labels. (line 18)
@@ -8976,13 +8975,13 @@ Index
* conditional <1>: Arithmetic & logical.
(line 61)
* config: Configuring. (line 72)
-* config <1>: Options. (line 127)
+* config <1>: Options. (line 126)
* configuration file: Configuring. (line 20)
-* configuration file <1>: Options. (line 127)
+* configuration file <1>: Options. (line 126)
* configuring: Configuring. (line 6)
* conj: Data types. (line 62)
* constructors: Structures. (line 91)
-* context: Options. (line 156)
+* context: Options. (line 155)
* continue: Programming. (line 48)
* continue <1>: Debugger. (line 31)
* contour: contour. (line 6)
@@ -8993,8 +8992,8 @@ Index
* convert: Configuring. (line 72)
* convert <1>: Files. (line 155)
* convert <2>: animation. (line 6)
-* convert <3>: Options. (line 156)
-* convertOptions: Options. (line 142)
+* convert <3>: Options. (line 155)
+* convertOptions: Options. (line 141)
* Coons shading: fill. (line 77)
* copy: Arrays. (line 167)
* cos: Mathematical functions.
@@ -9020,7 +9019,7 @@ Index
* curlSpecifier: Paths and guides. (line 408)
* currentlight: three. (line 76)
* currentpen: Pens. (line 6)
-* currentprojection: three. (line 418)
+* currentprojection: three. (line 417)
* curve: slopefield. (line 20)
* custom axis types: graph. (line 141)
* custom mark routine: graph. (line 577)
@@ -9032,7 +9031,7 @@ Index
* cyclic: Paths and guides. (line 85)
* cyclic <1>: Paths and guides. (line 376)
* cyclic <2>: Arrays. (line 39)
-* cyclic <3>: three. (line 535)
+* cyclic <3>: three. (line 534)
* Cyrillic: unicode. (line 7)
* dashdotted: Pens. (line 102)
* dashed: Pens. (line 102)
@@ -9046,7 +9045,7 @@ Index
* default arguments: Default arguments. (line 6)
* defaultformat: graph. (line 175)
* DefaultHead: draw. (line 26)
-* DefaultHead3: three. (line 601)
+* DefaultHead3: three. (line 600)
* defaultpen: Pens. (line 49)
* defaultpen <1>: Pens. (line 122)
* defaultpen <2>: Pens. (line 127)
@@ -9073,7 +9072,7 @@ Index
* dir <1>: Data types. (line 90)
* dir <2>: Data types. (line 180)
* dir <3>: Paths and guides. (line 109)
-* dir <4>: three. (line 535)
+* dir <4>: three. (line 534)
* direction specifier: Bezier curves. (line 6)
* directory: Files. (line 25)
* dirSpecifier: Paths and guides. (line 390)
@@ -9088,11 +9087,11 @@ Index
* dot <3>: Arrays. (line 254)
* dot <4>: Arrays. (line 257)
* DotMargin: draw. (line 42)
-* DotMargin3: three. (line 617)
+* DotMargin3: three. (line 616)
* DotMargins: draw. (line 42)
-* DotMargins3: three. (line 617)
+* DotMargins3: three. (line 616)
* dotted: Pens. (line 102)
-* double deferred drawing: three. (line 292)
+* double deferred drawing: three. (line 291)
* double precision: Files. (line 76)
* draw: Drawing commands. (line 31)
* draw <1>: draw. (line 6)
@@ -9105,10 +9104,10 @@ Index
* drawline: math. (line 9)
* drawtree: drawtree. (line 6)
* dvips: Configuring. (line 72)
-* dvipsOptions: Options. (line 142)
+* dvipsOptions: Options. (line 141)
* dvisvgm: Configuring. (line 72)
-* dvisvgm <1>: Options. (line 161)
-* dvisvgmOptions: Options. (line 142)
+* dvisvgm <1>: Options. (line 160)
+* dvisvgmOptions: Options. (line 141)
* E: Labels. (line 18)
* E <1>: Mathematical functions.
(line 48)
@@ -9123,34 +9122,34 @@ Index
* else: Programming. (line 26)
* emacs: Editing modes. (line 6)
* embed: embed. (line 6)
-* Embedded: three. (line 505)
+* Embedded: three. (line 504)
* emissivepen: three. (line 66)
* empty: Frames and pictures.
(line 7)
* EndArcArrow: draw. (line 26)
-* EndArcArrow3: three. (line 601)
+* EndArcArrow3: three. (line 600)
* EndArrow: draw. (line 26)
-* EndArrow3: three. (line 601)
+* EndArrow3: three. (line 600)
* EndBar: draw. (line 19)
-* EndBar3: three. (line 601)
+* EndBar3: three. (line 600)
* EndDotMargin: draw. (line 42)
-* EndDotMargin3: three. (line 617)
+* EndDotMargin3: three. (line 616)
* endl: Files. (line 61)
* EndMargin: draw. (line 42)
-* EndMargin3: three. (line 617)
+* EndMargin3: three. (line 616)
* EndPenMargin: draw. (line 42)
-* EndPenMargin2: three. (line 617)
-* EndPenMargin3: three. (line 617)
+* EndPenMargin2: three. (line 616)
+* EndPenMargin3: three. (line 616)
* EndPoint: label. (line 55)
* envelope: Frames and pictures.
(line 25)
-* environment variables: Configuring. (line 92)
+* environment variables: Configuring. (line 93)
* 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 156)
+* EPS <1>: Options. (line 155)
* erase: Drawing in interactive mode.
(line 11)
* erase <1>: Data types. (line 256)
@@ -9187,12 +9186,12 @@ Index
* extension: Paths and guides. (line 246)
* extension <1>: MetaPost. (line 10)
* external: embed. (line 11)
-* extrude: three. (line 529)
+* extrude: three. (line 528)
* F: Mathematical functions.
(line 48)
* fabs: Mathematical functions.
(line 6)
-* face: three. (line 642)
+* face: three. (line 641)
* factorial: Mathematical functions.
(line 39)
* Fedora: UNIX binary distributions.
@@ -9222,7 +9221,7 @@ Index
* firstcut: Paths and guides. (line 262)
* fit: Frames and pictures.
(line 113)
-* fit3: three. (line 305)
+* fit3: three. (line 304)
* fixedscaling: Frames and pictures.
(line 81)
* floor: Mathematical functions.
@@ -9238,13 +9237,13 @@ Index
* fontsize: Pens. (line 192)
* for: Programming. (line 26)
* format: Data types. (line 289)
-* format <1>: Options. (line 156)
+* format <1>: Options. (line 155)
* forum: Help. (line 6)
* frame: Frames and pictures.
(line 7)
* freshnel0: three. (line 66)
* from: Import. (line 16)
-* FrontView: three. (line 421)
+* FrontView: three. (line 420)
* function declarations: Functions. (line 79)
* Function shading: fill. (line 99)
* function shading: fill. (line 99)
@@ -9263,8 +9262,8 @@ Index
* getstring: Files. (line 118)
* gettriple: Files. (line 118)
* git: Git. (line 6)
-* glOptions: three. (line 249)
-* glOptions <1>: Options. (line 142)
+* glOptions: three. (line 248)
+* glOptions <1>: Options. (line 141)
* GNU Scientific Library: Mathematical functions.
(line 48)
* gouraudshade: fill. (line 62)
@@ -9274,7 +9273,7 @@ Index
* graph3: graph3. (line 6)
* graphic: label. (line 78)
* graphical user interface: GUI. (line 6)
-* graphics: Options. (line 161)
+* graphics: Options. (line 160)
* gray: Pens. (line 25)
* grayscale: Pens. (line 25)
* Grayscale: palette. (line 9)
@@ -9286,7 +9285,7 @@ Index
(line 63)
* gsl: Mathematical functions.
(line 48)
-* gsOptions: Options. (line 142)
+* gsOptions: Options. (line 141)
* GUI: GUI. (line 6)
* GUI installation: GUI installation. (line 6)
* GUI usage: GUI usage. (line 6)
@@ -9304,30 +9303,30 @@ Index
* hex <1>: Pens. (line 64)
* hexadecimal: Data types. (line 305)
* hexadecimal <1>: Pens. (line 62)
-* hidden surface removal: three. (line 642)
+* hidden surface removal: three. (line 641)
* histogram: Mathematical functions.
(line 39)
* history: Files. (line 143)
* history <1>: Interactive mode. (line 54)
* historylines: Interactive mode. (line 57)
* HookHead: draw. (line 26)
-* HookHead3: three. (line 601)
+* HookHead3: three. (line 600)
* Horizontal: flowchart. (line 77)
* HTML5: three. (line 220)
* htmlviewer: Configuring. (line 20)
* htmlviewer <1>: Configuring. (line 43)
-* htmlviewerOptions: Options. (line 142)
-* hyperrefOptions: Options. (line 142)
+* htmlviewerOptions: Options. (line 141)
+* hyperrefOptions: Options. (line 141)
* hypot: Mathematical functions.
(line 6)
* I: Mathematical functions.
(line 48)
-* iconify: three. (line 249)
+* iconify: three. (line 248)
* identity: Transforms. (line 24)
* identity <1>: Mathematical functions.
(line 6)
* identity <2>: Arrays. (line 296)
-* identity4: three. (line 473)
+* identity4: three. (line 472)
* if: Programming. (line 26)
* IgnoreAspect: Frames and pictures.
(line 63)
@@ -9335,7 +9334,7 @@ Index
* image <1>: palette. (line 58)
* ImageMagick: Configuring. (line 72)
* ImageMagick <1>: animation. (line 6)
-* ImageMagick <2>: Options. (line 156)
+* ImageMagick <2>: Options. (line 155)
* images: palette. (line 6)
* implicit casts: Casts. (line 6)
* implicit linear solver: MetaPost. (line 10)
@@ -9363,7 +9362,7 @@ Index
* inside: Paths and guides. (line 294)
* inside <1>: Paths and guides. (line 299)
* inside <2>: Paths and guides. (line 305)
-* insphere: three. (line 564)
+* insphere: three. (line 563)
* inst: Debugger. (line 35)
* installation: Installation. (line 6)
* int: Data types. (line 30)
@@ -9383,23 +9382,23 @@ Index
* interpolate: interpolate. (line 6)
* intersect: Paths and guides. (line 195)
* intersect <1>: math. (line 13)
-* intersect <2>: three. (line 535)
+* intersect <2>: three. (line 534)
* intersectionpoint: Paths and guides. (line 238)
* intersectionpoint <1>: math. (line 17)
-* intersectionpoint <2>: three. (line 535)
+* intersectionpoint <2>: three. (line 534)
* intersectionpoints: Paths and guides. (line 242)
-* intersectionpoints <1>: three. (line 535)
-* intersectionpoints <2>: three. (line 548)
+* intersectionpoints <1>: three. (line 534)
+* intersectionpoints <2>: three. (line 547)
* intersections: Paths and guides. (line 206)
* intersections <1>: Paths and guides. (line 213)
-* intersections <2>: three. (line 535)
-* intersections <3>: three. (line 541)
+* intersections <2>: three. (line 534)
+* intersections <3>: three. (line 540)
* 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 463)
+* invert: three. (line 462)
* invisible: Pens. (line 43)
* isnan: Data types. (line 35)
* i_scaled: Mathematical functions.
@@ -9431,7 +9430,7 @@ Index
* label <1>: label. (line 6)
* Label <1>: label. (line 14)
* Label <2>: graph. (line 330)
-* label <2>: three. (line 499)
+* label <2>: three. (line 498)
* labelpath: labelpath. (line 6)
* labelpath3: labelpath3. (line 6)
* labelx: graph. (line 330)
@@ -9440,7 +9439,7 @@ Index
(line 104)
* lastcut: Paths and guides. (line 266)
* lasy-mode: Editing modes. (line 6)
-* latex: Options. (line 156)
+* latex: Options. (line 155)
* LaTeX fonts: Pens. (line 206)
* LaTeX usage: LaTeX usage. (line 6)
* latexmk: LaTeX usage. (line 30)
@@ -9455,7 +9454,7 @@ Index
* LeftSide: label. (line 60)
* LeftTicks: graph. (line 160)
* LeftTicks <1>: graph. (line 233)
-* LeftView: three. (line 421)
+* LeftView: three. (line 420)
* legend: Drawing commands. (line 31)
* legend <1>: draw. (line 64)
* legend <2>: graph. (line 424)
@@ -9467,11 +9466,11 @@ Index
* length <3>: Paths and guides. (line 76)
* length <4>: Paths and guides. (line 373)
* length <5>: Arrays. (line 39)
-* length <6>: three. (line 535)
+* length <6>: three. (line 534)
* letter: Configuring. (line 66)
* lexorder: math. (line 67)
* lexorder <1>: math. (line 70)
-* libgs: Options. (line 161)
+* libgs: Options. (line 160)
* libm routines: Mathematical functions.
(line 6)
* libsigsegv: Functions. (line 100)
@@ -9504,19 +9503,19 @@ Index
* longdashed: Pens. (line 102)
* longitude: Data types. (line 168)
* loop: Programming. (line 26)
-* lualatex: Options. (line 156)
-* luatex: Options. (line 156)
+* lualatex: Options. (line 155)
+* luatex: Options. (line 155)
* MacOS X binary distributions: MacOS X binary distributions.
(line 6)
* makepen: Pens. (line 321)
* map: Arrays. (line 131)
* Margin: draw. (line 42)
* Margin <1>: draw. (line 42)
-* Margin3: three. (line 617)
-* Margin3 <1>: three. (line 617)
+* Margin3: three. (line 616)
+* Margin3 <1>: three. (line 616)
* Margins: draw. (line 42)
-* margins: three. (line 298)
-* Margins3: three. (line 617)
+* margins: three. (line 297)
+* Margins3: three. (line 616)
* mark: graph. (line 480)
* markangle: markers. (line 35)
* marker: graph. (line 480)
@@ -9533,12 +9532,12 @@ Index
(line 7)
* max <2>: Arrays. (line 221)
* max <3>: Arrays. (line 231)
-* max <4>: three. (line 535)
+* max <4>: three. (line 534)
* maxbound: Data types. (line 134)
* maxbound <1>: Data types. (line 204)
-* maxtile: three. (line 249)
+* maxtile: three. (line 248)
* maxtimes: Paths and guides. (line 233)
-* maxviewport: three. (line 249)
+* maxviewport: three. (line 248)
* metallic: three. (line 66)
* MetaPost: MetaPost. (line 6)
* MetaPost ... : Bezier curves. (line 70)
@@ -9548,9 +9547,9 @@ Index
* MetaPost whatever: MetaPost. (line 10)
* Microsoft Windows: Microsoft Windows. (line 6)
* MidArcArrow: draw. (line 26)
-* MidArcArrow3: three. (line 601)
+* MidArcArrow3: three. (line 600)
* MidArrow: draw. (line 26)
-* MidArrow3: three. (line 601)
+* MidArrow3: three. (line 600)
* MidPoint: label. (line 55)
* midpoint: Paths and guides. (line 180)
* min: Paths and guides. (line 275)
@@ -9558,7 +9557,7 @@ Index
(line 7)
* min <2>: Arrays. (line 216)
* min <3>: Arrays. (line 226)
-* min <4>: three. (line 535)
+* min <4>: three. (line 534)
* minbound: Data types. (line 131)
* minbound <1>: Data types. (line 201)
* minipage: label. (line 116)
@@ -9600,12 +9599,12 @@ Index
(line 154)
* nolight: three. (line 76)
* NoMargin: draw. (line 42)
-* NoMargin3: three. (line 617)
+* NoMargin3: three. (line 616)
* None: draw. (line 19)
* None <1>: draw. (line 26)
* none: Files. (line 61)
-* normal: three. (line 521)
-* nosafe: Options. (line 182)
+* normal: three. (line 520)
+* nosafe: Options. (line 181)
* NOT: Arithmetic & logical.
(line 68)
* notaknot: graph. (line 36)
@@ -9617,16 +9616,16 @@ Index
(line 140)
* nullpen <2>: Frames and pictures.
(line 149)
-* NURBS: three. (line 397)
-* O: three. (line 310)
+* NURBS: three. (line 396)
+* O: three. (line 309)
* obj: obj. (line 6)
-* oblique: three. (line 353)
-* obliqueX: three. (line 360)
-* obliqueY: three. (line 366)
-* obliqueZ: three. (line 353)
+* oblique: three. (line 352)
+* obliqueX: three. (line 359)
+* obliqueY: three. (line 365)
+* obliqueZ: three. (line 352)
* ode: ode. (line 6)
* offset: Pens. (line 123)
-* offset <1>: Options. (line 187)
+* offset <1>: Options. (line 186)
* OmitTick: graph. (line 223)
* OmitTickInterval: graph. (line 223)
* OmitTickIntervals: graph. (line 223)
@@ -9650,15 +9649,15 @@ Index
* OR: Arithmetic & logical.
(line 68)
* orient: Data types. (line 108)
-* orient <1>: three. (line 552)
+* orient <1>: three. (line 551)
* orientation: Frames and pictures.
(line 104)
-* orthographic: three. (line 370)
+* orthographic: three. (line 369)
* outformat: three. (line 172)
* outprefix: Frames and pictures.
(line 91)
* output: Files. (line 36)
-* output <1>: Options. (line 156)
+* output <1>: Options. (line 155)
* OutTicks: graph3. (line 35)
* overloading functions: Functions. (line 55)
* overwrite: Pens. (line 343)
@@ -9689,38 +9688,38 @@ Index
* patterns: Pens. (line 254)
* patterns <1>: patterns. (line 6)
* PBR: three. (line 74)
-* PDF: Options. (line 156)
-* pdflatex: Options. (line 156)
-* pdfreloadOptions: Options. (line 142)
+* PDF: Options. (line 155)
+* pdflatex: Options. (line 155)
+* pdfreloadOptions: Options. (line 141)
* pdfviewer: Configuring. (line 20)
-* pdfviewerOptions: Options. (line 142)
+* pdfviewerOptions: Options. (line 141)
* pen: Pens. (line 6)
* PenMargin: draw. (line 42)
-* PenMargin2: three. (line 617)
-* PenMargin3: three. (line 617)
+* PenMargin2: three. (line 616)
+* PenMargin3: three. (line 616)
* PenMargins: draw. (line 42)
-* PenMargins2: three. (line 617)
-* PenMargins3: three. (line 617)
+* PenMargins2: three. (line 616)
+* PenMargins3: three. (line 616)
* periodic: graph. (line 36)
* perl: LaTeX usage. (line 30)
* perpendicular: geometry. (line 6)
-* perspective: three. (line 397)
+* perspective: three. (line 396)
* physically based rendering: three. (line 74)
* picture: Frames and pictures.
(line 39)
* picture alignment: Frames and pictures.
(line 226)
* piecewisestraight: Paths and guides. (line 92)
-* pixel: three. (line 624)
+* pixel: three. (line 623)
* Pl: Mathematical functions.
(line 48)
* plain: plain. (line 6)
* planar: three. (line 116)
-* plane: three. (line 336)
-* planeproject: three. (line 518)
+* plane: three. (line 335)
+* planeproject: three. (line 517)
* point: Paths and guides. (line 95)
* point <1>: Paths and guides. (line 379)
-* point <2>: three. (line 535)
+* point <2>: three. (line 534)
* polar: Data types. (line 148)
* polargraph: graph. (line 88)
* polygon: graph. (line 480)
@@ -9729,7 +9728,7 @@ Index
(line 104)
* position: three. (line 76)
* postcontrol: Paths and guides. (line 146)
-* postcontrol <1>: three. (line 535)
+* postcontrol <1>: three. (line 534)
* postfix operators: Self & prefix operators.
(line 19)
* postscript: Frames and pictures.
@@ -9738,10 +9737,10 @@ Index
* PostScript subpath: Paths. (line 23)
* pow10: Mathematical functions.
(line 6)
-* prc: three. (line 267)
+* prc: three. (line 266)
* precision: Files. (line 93)
* precontrol: Paths and guides. (line 139)
-* precontrol <1>: three. (line 535)
+* precontrol <1>: three. (line 534)
* prefix operators: Self & prefix operators.
(line 6)
* private: Structures. (line 6)
@@ -9749,7 +9748,7 @@ Index
* pstoedit: PostScript to Asymptote.
(line 6)
* psviewer: Configuring. (line 20)
-* psviewerOptions: Options. (line 142)
+* psviewerOptions: Options. (line 141)
* pt: Figure size. (line 18)
* public: Structures. (line 6)
* push: Arrays. (line 39)
@@ -9773,7 +9772,7 @@ Index
* radians: Mathematical functions.
(line 17)
* radius: Paths and guides. (line 135)
-* radius <1>: three. (line 535)
+* radius <1>: three. (line 534)
* Rainbow: palette. (line 12)
* rand: Mathematical functions.
(line 39)
@@ -9802,7 +9801,7 @@ Index
* rename: Files. (line 152)
* render: three. (line 46)
* render <1>: three. (line 172)
-* render <2>: Options. (line 156)
+* render <2>: Options. (line 155)
* replace: Data types. (line 269)
* resetdefaultpen: Pens. (line 370)
* rest arguments: Rest arguments. (line 6)
@@ -9814,7 +9813,7 @@ Index
* reverse <1>: Paths and guides. (line 183)
* reverse <2>: Paths and guides. (line 382)
* reverse <3>: Arrays. (line 136)
-* reverse <4>: three. (line 535)
+* reverse <4>: three. (line 534)
* rewind: Files. (line 93)
* rfind: Data types. (line 246)
* rgb: Pens. (line 30)
@@ -9826,9 +9825,9 @@ Index
* RightSide: label. (line 60)
* RightTicks: graph. (line 160)
* RightTicks <1>: graph. (line 233)
-* RightView: three. (line 421)
+* RightView: three. (line 420)
* Rotate: label. (line 36)
-* rotate: three. (line 489)
+* rotate: three. (line 488)
* Rotate(pair z): label. (line 39)
* round: Mathematical functions.
(line 26)
@@ -9841,7 +9840,7 @@ Index
* runtime imports: Import. (line 97)
* Russian: unicode. (line 7)
* S: Labels. (line 18)
-* safe: Options. (line 182)
+* safe: Options. (line 181)
* save: Frames and pictures.
(line 283)
* saveline: Files. (line 135)
@@ -9851,8 +9850,8 @@ Index
* scale <2>: Transforms. (line 36)
* scale <3>: graph. (line 690)
* Scale <1>: graph. (line 707)
-* scale <4>: three. (line 488)
-* scale3: three. (line 486)
+* scale <4>: three. (line 487)
+* scale3: three. (line 485)
* scaled graph: graph. (line 670)
* scientific graph: graph. (line 387)
* scroll: Files. (line 109)
@@ -9873,7 +9872,7 @@ Index
(line 6)
* sequence: Arrays. (line 118)
* settings: Configuring. (line 20)
-* settings <1>: Options. (line 127)
+* settings <1>: Options. (line 126)
* sgn: Mathematical functions.
(line 26)
* shading: fill. (line 32)
@@ -9881,12 +9880,12 @@ Index
* shift: Transforms. (line 26)
* shift <1>: Transforms. (line 28)
* shift <2>: Transforms. (line 46)
-* shift <3>: three. (line 478)
+* shift <3>: three. (line 477)
* shiftless: Transforms. (line 46)
* shininess: three. (line 66)
* shipout: Frames and pictures.
(line 91)
-* showtarget: three. (line 370)
+* showtarget: three. (line 369)
* Si: Mathematical functions.
(line 48)
* signedint: Files. (line 76)
@@ -9906,9 +9905,9 @@ Index
* singlereal <1>: Files. (line 89)
* sinh: Mathematical functions.
(line 6)
-* SixViews: three. (line 436)
-* SixViewsFR: three. (line 436)
-* SixViewsUS: three. (line 436)
+* SixViews: three. (line 435)
+* SixViewsFR: three. (line 435)
+* SixViewsUS: three. (line 435)
* size: Figure size. (line 6)
* size <1>: Paths and guides. (line 81)
* size <2>: Paths and guides. (line 370)
@@ -9916,9 +9915,9 @@ Index
(line 48)
* size <4>: Frames and pictures.
(line 74)
-* size <5>: three. (line 535)
-* size <6>: Options. (line 156)
-* size3: three. (line 295)
+* size <5>: three. (line 534)
+* size <6>: Options. (line 155)
+* size3: three. (line 294)
* Slant: label. (line 42)
* slant: Transforms. (line 38)
* sleep: Data types. (line 375)
@@ -9962,7 +9961,7 @@ Index
* stop: Debugger. (line 10)
* straight: Paths and guides. (line 88)
* Straight: graph. (line 30)
-* straight <1>: three. (line 535)
+* straight <1>: three. (line 534)
* strftime: Data types. (line 320)
* strftime <1>: Data types. (line 345)
* string: Data types. (line 207)
@@ -9974,7 +9973,7 @@ Index
* struct: Structures. (line 6)
* structures: Structures. (line 6)
* subpath: Paths and guides. (line 186)
-* subpath <1>: three. (line 535)
+* subpath <1>: three. (line 534)
* subpictures: Frames and pictures.
(line 113)
* substr: Data types. (line 261)
@@ -9986,9 +9985,9 @@ Index
* surface <1>: three. (line 116)
* surface <2>: three. (line 130)
* surface <3>: graph3. (line 99)
-* SVG: Options. (line 161)
+* SVG: Options. (line 160)
* system: Data types. (line 353)
-* system <1>: Options. (line 182)
+* system <1>: Options. (line 181)
* syzygy: syzygy. (line 6)
* tab: Files. (line 61)
* tab completion: Drawing in interactive mode.
@@ -9999,7 +9998,7 @@ Index
(line 20)
* tanh: Mathematical functions.
(line 6)
-* target: three. (line 370)
+* target: three. (line 369)
* tell: Files. (line 93)
* tension: Bezier curves. (line 56)
* tension <1>: three. (line 6)
@@ -10009,12 +10008,12 @@ Index
* tessellation: three. (line 142)
* tex: Frames and pictures.
(line 300)
-* tex <1>: Options. (line 156)
+* tex <1>: Options. (line 155)
* TeX fonts: Pens. (line 215)
* TeX string: Data types. (line 207)
* texcommand: Configuring. (line 72)
* TeXHead: draw. (line 26)
-* TeXHead3: three. (line 601)
+* TeXHead3: three. (line 600)
* texpath: Configuring. (line 72)
* texpath <1>: label. (line 113)
* texpreamble: Frames and pictures.
@@ -10028,9 +10027,9 @@ Index
* thin: three. (line 154)
* this: Structures. (line 6)
* three: three. (line 6)
-* ThreeViews: three. (line 436)
-* ThreeViewsFR: three. (line 436)
-* ThreeViewsUS: three. (line 436)
+* ThreeViews: three. (line 435)
+* ThreeViewsFR: three. (line 435)
+* ThreeViewsUS: three. (line 435)
* tick: graph. (line 330)
* ticks: graph. (line 160)
* Ticks: graph. (line 160)
@@ -10045,12 +10044,12 @@ Index
* times: Paths and guides. (line 220)
* times <1>: Paths and guides. (line 224)
* Top: graph. (line 135)
-* TopView: three. (line 421)
+* TopView: three. (line 420)
* trace: Debugger. (line 50)
* trailingzero: graph. (line 175)
* transform: Transforms. (line 6)
-* transform <1>: three. (line 510)
-* transform3: three. (line 473)
+* transform <1>: three. (line 509)
+* transform3: three. (line 472)
* transparency: Pens. (line 237)
* transparent: three. (line 97)
* transpose: Arrays. (line 203)
@@ -10065,7 +10064,7 @@ Index
(line 48)
* triple: Data types. (line 137)
* TrueMargin: draw. (line 42)
-* TrueMargin3: three. (line 617)
+* TrueMargin3: three. (line 616)
* tube: three. (line 154)
* tube <1>: tube. (line 6)
* tutorial: Tutorial. (line 6)
@@ -10087,10 +10086,10 @@ Index
* unit: Data types. (line 83)
* unit <1>: Data types. (line 173)
* unitbox: Paths. (line 44)
-* unitbox <1>: three. (line 342)
+* unitbox <1>: three. (line 341)
* unitcircle: Paths. (line 17)
* unitcircle <1>: Paths. (line 17)
-* unitcircle <2>: three. (line 310)
+* unitcircle <2>: three. (line 309)
* unitrand: Mathematical functions.
(line 39)
* unitsize: Figure size. (line 39)
@@ -10100,7 +10099,7 @@ Index
(line 6)
* unpacking: Rest arguments. (line 39)
* unravel: Import. (line 29)
-* up: three. (line 370)
+* up: three. (line 369)
* update: Files. (line 36)
* UpsideDown: Frames and pictures.
(line 104)
@@ -10128,10 +10127,10 @@ Index
* Vertical: flowchart. (line 77)
* Viewport: three. (line 76)
* viewportheight: LaTeX usage. (line 50)
-* viewportmargin: three. (line 298)
-* viewportsize: three. (line 298)
+* viewportmargin: three. (line 297)
+* viewportsize: three. (line 297)
* viewportwidth: LaTeX usage. (line 50)
-* views: three. (line 267)
+* views: three. (line 266)
* vim: Editing modes. (line 32)
* virtual functions: Structures. (line 181)
* void: Data types. (line 10)
@@ -10148,11 +10147,11 @@ Index
* word: Arrays. (line 349)
* write: Files. (line 53)
* write <1>: Arrays. (line 388)
-* X: three. (line 310)
+* X: three. (line 309)
* xasy: GUI. (line 6)
* xaxis3: graph3. (line 7)
* xdr: Files. (line 76)
-* xelatex: Options. (line 156)
+* xelatex: Options. (line 155)
* XEquals: graph. (line 265)
* xequals: graph. (line 278)
* xlimits: graph. (line 639)
@@ -10161,10 +10160,10 @@ Index
* xpart: Data types. (line 94)
* xpart <1>: Data types. (line 184)
* xscale: Transforms. (line 30)
-* xscale3: three. (line 480)
+* xscale3: three. (line 479)
* xtick: graph. (line 330)
-* XY: three. (line 495)
-* XY <1>: three. (line 510)
+* XY: three. (line 494)
+* XY <1>: three. (line 509)
* XYEquals: graph3. (line 21)
* XYZero: graph3. (line 21)
* XZEquals: graph3. (line 21)
@@ -10174,7 +10173,7 @@ Index
(line 6)
* Y <1>: Mathematical functions.
(line 48)
-* Y <2>: three. (line 310)
+* Y <2>: three. (line 309)
* yaxis3: graph3. (line 7)
* YEquals: graph. (line 128)
* yequals: graph. (line 278)
@@ -10182,14 +10181,14 @@ Index
* ypart: Data types. (line 97)
* ypart <1>: Data types. (line 187)
* yscale: Transforms. (line 32)
-* yscale3: three. (line 482)
+* yscale3: three. (line 481)
* ytick: graph. (line 330)
-* YX: three. (line 510)
-* YZ: three. (line 510)
+* YX: three. (line 509)
+* YZ: three. (line 509)
* YZEquals: graph3. (line 21)
* YZero: graph. (line 123)
* YZZero: graph3. (line 21)
-* Z: three. (line 310)
+* Z: three. (line 309)
* zaxis3: graph3. (line 7)
* zeroTransform: Transforms. (line 44)
* zerowinding: Pens. (line 164)
@@ -10206,10 +10205,10 @@ Index
* zeta: Mathematical functions.
(line 48)
* zpart: Data types. (line 190)
-* zscale3: three. (line 484)
-* ZX: three. (line 510)
-* ZX <1>: three. (line 510)
-* ZY: three. (line 510)
+* zscale3: three. (line 483)
+* ZX: three. (line 509)
+* ZX <1>: three. (line 509)
+* ZY: three. (line 509)

@@ -10221,144 +10220,144 @@ 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: fill42770
-Ref: gradient shading43816
-Node: clip48332
-Node: label48919
-Ref: Label49519
-Node: Bezier curves55390
-Node: Programming59287
-Ref: array iteration61040
-Node: Data types61207
-Ref: format71869
-Node: Paths and guides76315
-Ref: circle76569
-Ref: extension86268
-Node: Pens93077
-Ref: fillrule100766
-Ref: basealign101670
-Ref: transparency104504
-Ref: makepen108096
-Ref: overwrite108979
-Node: Transforms110193
-Node: Frames and pictures112025
-Ref: envelope113183
-Ref: size114276
-Ref: unitsize115263
-Ref: shipout116336
-Ref: filltype118687
-Ref: add121859
-Ref: add about122801
-Ref: tex125830
-Node: Files126726
-Ref: cd127713
-Ref: scroll132398
-Node: Variable initializers135316
-Node: Structures138033
-Node: Operators145535
-Node: Arithmetic & logical145849
-Node: Self & prefix operators148219
-Node: User-defined operators149013
-Node: Implicit scaling149926
-Node: Functions150489
-Ref: stack overflow153632
-Node: Default arguments153914
-Node: Named arguments154670
-Node: Rest arguments157240
-Node: Mathematical functions160362
-Node: Arrays165018
-Ref: sort172126
-Ref: tridiagonal174751
-Ref: solve175982
-Node: Slices180122
-Node: Casts184030
-Node: Import186300
-Node: Static191558
-Node: LaTeX usage194451
-Node: Base modules200945
-Node: plain203502
-Node: simplex204176
-Node: math204450
-Node: interpolate207159
-Node: geometry207438
-Node: trembling208032
-Node: stats208301
-Node: patterns208561
-Node: markers208797
-Node: tree210657
-Node: binarytree210842
-Node: drawtree211508
-Node: syzygy211709
-Node: feynman211983
-Node: roundedpath212258
-Node: animation212541
-Ref: animate212962
-Node: embed214075
-Node: slide215029
-Node: MetaPost215361
-Node: unicode216080
-Node: latin1216954
-Node: babel217323
-Node: labelpath217553
-Node: labelpath3218374
-Node: annotate218685
-Node: CAD219155
-Node: graph219466
-Ref: ticks226627
-Ref: pathmarkers240360
-Ref: marker240831
-Ref: markuniform241185
-Ref: errorbars242993
-Ref: automatic scaling247467
-Node: palette259214
-Ref: images259332
-Ref: image263506
-Ref: logimage264026
-Ref: penimage265131
-Ref: penfunctionimage265393
-Node: three266164
-Ref: PostScript3D295302
-Node: obj297040
-Node: graph3297289
-Ref: GaussianSurface302569
-Node: grid3303718
-Node: solids304502
-Node: tube305494
-Node: flowchart307728
-Node: contour312336
-Node: contour3317651
-Node: smoothcontour3317964
-Node: slopefield319685
-Node: ode321174
-Node: Options321431
-Ref: configuration file328279
-Ref: settings328279
-Ref: texengines329543
-Ref: convert329543
-Node: Interactive mode333031
-Ref: history335181
-Node: GUI336487
-Node: GUI installation337038
-Node: GUI usage337768
-Node: PostScript to Asymptote338684
-Node: Help339442
-Node: Debugger341096
-Node: Credits342852
-Node: Index343869
+Node: Search paths19585
+Node: Compiling from UNIX source20424
+Node: Editing modes23484
+Node: Git25905
+Node: Uninstall26305
+Node: Tutorial26651
+Node: Drawing in batch mode27540
+Node: Drawing in interactive mode28415
+Node: Figure size29447
+Node: Labels31039
+Node: Paths31866
+Ref: unitcircle32481
+Node: Drawing commands34381
+Node: draw36096
+Ref: arrows37278
+Node: fill42776
+Ref: gradient shading43822
+Node: clip48338
+Node: label48925
+Ref: Label49525
+Node: Bezier curves55396
+Node: Programming59293
+Ref: array iteration61046
+Node: Data types61213
+Ref: format71875
+Node: Paths and guides76321
+Ref: circle76575
+Ref: extension86274
+Node: Pens93083
+Ref: fillrule100772
+Ref: basealign101676
+Ref: transparency104510
+Ref: makepen108102
+Ref: overwrite108985
+Node: Transforms110199
+Node: Frames and pictures112031
+Ref: envelope113189
+Ref: size114282
+Ref: unitsize115269
+Ref: shipout116342
+Ref: filltype118693
+Ref: add121865
+Ref: add about122807
+Ref: tex125836
+Node: Files126732
+Ref: cd127719
+Ref: scroll132404
+Node: Variable initializers135322
+Node: Structures138039
+Node: Operators145541
+Node: Arithmetic & logical145855
+Node: Self & prefix operators148225
+Node: User-defined operators149019
+Node: Implicit scaling149932
+Node: Functions150495
+Ref: stack overflow153638
+Node: Default arguments153920
+Node: Named arguments154676
+Node: Rest arguments157246
+Node: Mathematical functions160368
+Node: Arrays165024
+Ref: sort172132
+Ref: tridiagonal174757
+Ref: solve175988
+Node: Slices180128
+Node: Casts184036
+Node: Import186306
+Node: Static191564
+Node: LaTeX usage194457
+Node: Base modules200951
+Node: plain203508
+Node: simplex204182
+Node: math204456
+Node: interpolate207165
+Node: geometry207444
+Node: trembling208038
+Node: stats208307
+Node: patterns208567
+Node: markers208803
+Node: tree210663
+Node: binarytree210848
+Node: drawtree211514
+Node: syzygy211715
+Node: feynman211989
+Node: roundedpath212264
+Node: animation212547
+Ref: animate212968
+Node: embed214081
+Node: slide215035
+Node: MetaPost215367
+Node: unicode216086
+Node: latin1216960
+Node: babel217329
+Node: labelpath217559
+Node: labelpath3218380
+Node: annotate218691
+Node: CAD219161
+Node: graph219472
+Ref: ticks226633
+Ref: pathmarkers240366
+Ref: marker240837
+Ref: markuniform241191
+Ref: errorbars242999
+Ref: automatic scaling247473
+Node: palette259220
+Ref: images259338
+Ref: image263512
+Ref: logimage264032
+Ref: penimage265137
+Ref: penfunctionimage265399
+Node: three266170
+Ref: PostScript3D295249
+Node: obj296987
+Node: graph3297236
+Ref: GaussianSurface302516
+Node: grid3303665
+Node: solids304449
+Node: tube305441
+Node: flowchart307675
+Node: contour312283
+Node: contour3317598
+Node: smoothcontour3317911
+Node: slopefield319632
+Node: ode321121
+Node: Options321378
+Ref: configuration file328163
+Ref: settings328163
+Ref: texengines329427
+Ref: convert329427
+Node: Interactive mode332915
+Ref: history335065
+Node: GUI336371
+Node: GUI installation336922
+Node: GUI usage337652
+Node: PostScript to Asymptote338568
+Node: Help339326
+Node: Debugger340980
+Node: Credits342736
+Node: Index343753

End Tag Table
diff --git a/graphics/asymptote/drawelement.h b/graphics/asymptote/drawelement.h
index b4993a71ef..f048cee28f 100644
--- a/graphics/asymptote/drawelement.h
+++ b/graphics/asymptote/drawelement.h
@@ -463,18 +463,6 @@ public:
}
};
-#ifdef HAVE_GL
-template<class T>
-void registerBuffer(std::vector<T>& buffervector, GLuint bufferIndex) {
- if (!buffervector.empty()) {
- glBindBuffer(GL_ARRAY_BUFFER,bufferIndex);
- glBufferData(GL_ARRAY_BUFFER,sizeof(T)*buffervector.size(),
- buffervector.data(),GL_STATIC_DRAW);
- glBindBuffer(GL_ARRAY_BUFFER,0);
- }
-}
-#endif
-
#ifdef HAVE_LIBGLM
void setcolors(bool colors,
const prc::RGBAColour& diffuse,
diff --git a/graphics/asymptote/drawpath3.cc b/graphics/asymptote/drawpath3.cc
index 0c6d71af9c..f712d9b703 100644
--- a/graphics/asymptote/drawpath3.cc
+++ b/graphics/asymptote/drawpath3.cc
@@ -91,6 +91,11 @@ void drawPath3::render(double size2, const triple& b, const triple& B,
} else
offscreen=bbox2(Min,Max).offscreen();
+ RGBAColour Black(0.0,0.0,0.0,color.A);
+ setcolors(false,Black,color,Black,1.0,0.0,0.04);
+
+ setMaterial(material1Data,drawMaterial1);
+
if(offscreen) { // Fully offscreen
R.Onscreen=false;
R.data.clear();
@@ -114,9 +119,6 @@ void drawPath3::render(double size2, const triple& b, const triple& B,
const pair size3(s*(B.getx()-b.getx()),s*(B.gety()-b.gety()));
- 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);
}
@@ -258,14 +260,16 @@ void drawPixel::render(double size2, const triple& b, const triple& B,
#ifdef HAVE_GL
if(invisible) return;
+ RGBAColour Black(0.0,0.0,0.0,color.A);
+ setcolors(false,color,color,Black,1.0,0.0,0.04);
+
+ setMaterial(material0Data,drawMaterial0);
+
if(bbox2(Min,Max).offscreen()) { // Fully offscreen
R.data.clear();
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);
#endif
}
diff --git a/graphics/asymptote/drawsurface.cc b/graphics/asymptote/drawsurface.cc
index 617474ea4c..c8a154f79a 100644
--- a/graphics/asymptote/drawsurface.cc
+++ b/graphics/asymptote/drawsurface.cc
@@ -56,7 +56,7 @@ void setcolors(bool colors,
const RGBAColour& diffuse,
const RGBAColour& emissive,
const RGBAColour& specular, double shininess,
- double metallic, double fresnel0, jsfile *out)
+ double metallic, double fresnel0, jsfile *out)
{
Material m;
if(colors) {
@@ -76,10 +76,6 @@ void setcolors(bool colors,
materialIndex=material.size();
if(materialIndex >= nmaterials)
nmaterials=min(Maxmaterials,2*nmaterials);
-#ifdef HAVE_GL
- if(!out && materialIndex >= Maxmaterials)
- clearMaterialBuffer(true);
-#endif
material.push_back(m);
materialMap[m]=materialIndex;
if(out)
@@ -275,6 +271,17 @@ void drawBezierPatch::render(double size2, const triple& b, const triple& B,
return;
}
+ setcolors(colors,diffuse,emissive,specular,shininess,metallic,fresnel0);
+
+ if(transparent)
+ setMaterial(transparentData,drawTransparent);
+ else {
+ if(colors)
+ setMaterial(colorData,drawColor);
+ else
+ setMaterial(materialData,drawMaterial);
+ }
+
triple *Controls;
triple Controls0[16];
if(billboard) {
@@ -294,14 +301,8 @@ void drawBezierPatch::render(double size2, const triple& b, const triple& B,
const pair size3(s*(B.getx()-b.getx()),s*(B.gety()-b.gety()));
- setcolors(colors,diffuse,emissive,specular,shininess,metallic,fresnel0);
-
- GLfloat c[16];
- if(colors)
- for(size_t i=0; i < 4; ++i)
- storecolor(c,4*i,colors[i]);
-
if(gl::outlinemode) {
+ setMaterial(material1Data,drawMaterial);
triple edge0[]={Controls[0],Controls[4],Controls[8],Controls[12]};
C.queue(edge0,straight,size3.length()/size2);
triple edge1[]={Controls[12],Controls[13],Controls[14],Controls[15]};
@@ -311,6 +312,11 @@ void drawBezierPatch::render(double size2, const triple& b, const triple& B,
triple edge3[]={Controls[3],Controls[2],Controls[1],Controls[0]};
C.queue(edge3,straight,size3.length()/size2);
} else {
+ GLfloat c[16];
+ if(colors)
+ for(size_t i=0; i < 4; ++i)
+ storecolor(c,4*i,colors[i]);
+
S.queue(Controls,straight,size3.length()/size2,transparent,
colors ? c : NULL);
}
@@ -506,6 +512,17 @@ void drawBezierTriangle::render(double size2, const triple& b, const triple& B,
return;
}
+ setcolors(colors,diffuse,emissive,specular,shininess,metallic,fresnel0);
+
+ if(transparent)
+ setMaterial(transparentData,drawTransparent);
+ else {
+ if(colors)
+ setMaterial(colorData,drawColor);
+ else
+ setMaterial(materialData,drawMaterial);
+ }
+
triple *Controls;
triple Controls0[10];
if(billboard) {
@@ -525,23 +542,23 @@ void drawBezierTriangle::render(double size2, const triple& b, const triple& B,
const pair size3(s*(B.getx()-b.getx()),s*(B.gety()-b.gety()));
- setcolors(colors,diffuse,emissive,specular,shininess,metallic,fresnel0);
-
- GLfloat c[12];
- if(colors)
- for(size_t i=0; i < 3; ++i)
- storecolor(c,4*i,colors[i]);
-
if(gl::outlinemode) {
+ setMaterial(material1Data,drawMaterial);
triple edge0[]={Controls[0],Controls[1],Controls[3],Controls[6]};
C.queue(edge0,straight,size3.length()/size2);
triple edge1[]={Controls[6],Controls[7],Controls[8],Controls[9]};
C.queue(edge1,straight,size3.length()/size2);
triple edge2[]={Controls[9],Controls[5],Controls[2],Controls[0]};
C.queue(edge2,straight,size3.length()/size2);
- } else
+ } else {
+ GLfloat c[12];
+ if(colors)
+ for(size_t i=0; i < 3; ++i)
+ storecolor(c,4*i,colors[i]);
+
S.queue(Controls,straight,size3.length()/size2,transparent,
colors ? c : NULL);
+ }
#endif
}
@@ -913,12 +930,18 @@ void drawTriangles::render(double size2, const triple& b,
return;
}
+ setcolors(nC,diffuse,emissive,specular,shininess,metallic,fresnel0);
+
+ if(transparent)
+ setMaterial(transparentData,drawTransparent);
+ else
+ setMaterial(triangleData,drawTriangle);
+
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
}
diff --git a/graphics/asymptote/examples/arrows3.asy b/graphics/asymptote/examples/arrows3.asy
index 06b986ef5f..b71c08406a 100644
--- a/graphics/asymptote/examples/arrows3.asy
+++ b/graphics/asymptote/examples/arrows3.asy
@@ -11,12 +11,29 @@ currentlight=light(gray(0.5),specularfactor=3,
defaultpen(0.75mm);
path3 g=arc(O,1,90,-60,90,60);
-transform3 t=shift(invert(3S,O));
draw(g,blue,Arrows3(TeXHead3),currentlight);
draw(scale3(3)*g,green,ArcArrows3(HookHead3),currentlight);
draw(scale3(6)*g,red,Arrows3(DefaultHead3),currentlight);
+transform3 t=shift(invert(3S,O));
+
draw(t*g,blue,Arrows3(TeXHead2),currentlight);
draw(t*scale3(3)*g,green,ArcArrows3(HookHead2,NoFill),currentlight);
draw(t*scale3(6)*g,red,Arrows3(DefaultHead2(normal=Z)),currentlight);
+
+transform3 t=shift(invert(6S,O));
+
+draw(t*g,blue,Arrow3(TeXHead3,position=Relative(0.5)),currentlight);
+draw(t*scale3(3)*g,purple,Arrow3(HookHead3,position=Relative(0.5)),
+ currentlight);
+draw(t*scale3(6)*g,red,Arrow3(DefaultHead3,position=Relative(0.5)),
+ currentlight);
+
+transform3 t=shift(invert(9S,O));
+
+draw(t*g,blue,Arrow3(TeXHead2,position=Relative(0.5)),currentlight);
+draw(t*scale3(3)*g,green,Arrow3(HookHead2,position=Relative(0.5),NoFill),
+ currentlight);
+draw(t*scale3(6)*g,red,Arrow3(DefaultHead2(normal=Z),position=Relative(0.5)),
+ currentlight);
diff --git a/graphics/asymptote/examples/extrudedcontour.asy b/graphics/asymptote/examples/extrudedcontour.asy
index dabd56b929..29b12b5c38 100644
--- a/graphics/asymptote/examples/extrudedcontour.asy
+++ b/graphics/asymptote/examples/extrudedcontour.asy
@@ -11,16 +11,15 @@ real b=4;
real f(pair z) {return (z.x+z.y)/(2+cos(z.x)*sin(z.y));}
guide[][] g=contour(f,(-10,-10),(10,10),new real[]{8},150);
-render render=render(merge=true);
for(guide p:g[0]){
- draw(extrude(p,8Z),palered,render);
- draw(path3(p),red+2pt,render);
+ draw(extrude(p,8Z),palered);
+ draw(path3(p),red+2pt);
}
-draw(lift(f,g),red+2pt,render);
+draw(lift(f,g),red+2pt);
surface s=surface(f,(0,0),(10,10),20,Spline);
s.colors(palette(s.map(zpart),Rainbow()+opacity(0.5)));
-draw(s,render);
+draw(s);
axes3("$x$","$y$","$z$",Arrow3);
diff --git a/graphics/asymptote/examples/pathintersectsurface.asy b/graphics/asymptote/examples/pathintersectsurface.asy
index b69b0b859a..73a78460e0 100644
--- a/graphics/asymptote/examples/pathintersectsurface.asy
+++ b/graphics/asymptote/examples/pathintersectsurface.asy
@@ -5,7 +5,7 @@ currentprojection=perspective(-5,-4,2);
path3 g=randompath3(10);
-draw(g,red+thin());
+draw(g,red);
triple[][] P={
{(0,0,0),(1,0,0),(1,0,0),(2,0,0)},
diff --git a/graphics/asymptote/examples/tiling.asy b/graphics/asymptote/examples/tiling.asy
new file mode 100644
index 0000000000..ed817b2a63
--- /dev/null
+++ b/graphics/asymptote/examples/tiling.asy
@@ -0,0 +1,7 @@
+size(0,150);
+import patterns;
+
+add("checker",checker(blue));
+
+filldraw(unitcircle,pattern("checker"));
+
diff --git a/graphics/asymptote/glrender.cc b/graphics/asymptote/glrender.cc
index 5de13b70df..d2077b0f97 100644
--- a/graphics/asymptote/glrender.cc
+++ b/graphics/asymptote/glrender.cc
@@ -74,6 +74,9 @@ vertexBuffer triangleData;
const size_t Nbuffer=10000;
const size_t nbuffer=1000;
+
+GLuint attributeBuffer;
+GLuint indicesBuffer;
}
#endif /* HAVE_GL */
@@ -86,7 +89,7 @@ using camp::nmaterials;
using camp::MaterialMap;
namespace camp {
-mem::vector<Material> material;
+std::vector<Material> material;
MaterialMap materialMap;
size_t materialIndex;
@@ -101,9 +104,6 @@ bool outlinemode=false;
bool glthread=false;
bool initialize=true;
-GLint Maxvertices;
-size_t maxvertices;
-
using camp::picture;
using camp::drawRawImage;
using camp::transform;
@@ -197,6 +197,7 @@ dmat4 dviewMat;
dmat4 drotateMat;
const double *dprojView;
+const double *dView;
double BBT[9];
GLuint ubo;
@@ -323,6 +324,7 @@ void home(bool webgl=false)
#endif
#endif
dviewMat=dmat4(1.0);
+ dView=value_ptr(dviewMat);
viewMat=mat4(dviewMat);
drotateMat=dmat4(1.0);
@@ -344,8 +346,6 @@ timeval lasttime;
timeval lastframetime;
int oldWidth,oldHeight;
-bool forceRemesh=false;
-
bool queueScreen=false;
string Action;
@@ -420,11 +420,11 @@ void wait(pthread_cond_t& signal, pthread_mutex_t& lock)
}
#endif
-void initshaders()
+void initShaders()
{
Nlights=nlights == 0 ? 0 : max(Nlights,nlights);
-
Nmaterials=max(Nmaterials,nmaterials);
+
shaderProg=glCreateProgram();
string vs=locateFile("shaders/vertex.glsl");
string fs=locateFile("shaders/fragment.glsl");
@@ -465,7 +465,7 @@ void initshaders()
shaderParams);
}
-void deleteshaders()
+void deleteShaders()
{
glDeleteProgram(camp::transparentShader);
glDeleteProgram(camp::colorShader);
@@ -474,6 +474,24 @@ void deleteshaders()
glDeleteProgram(camp::noNormalShader);
}
+void setBuffers()
+{
+ glGenBuffers(1,&camp::attributeBuffer);
+ glGenBuffers(1,&camp::indicesBuffer);
+ glGenBuffers(1,&ubo);
+
+ GLuint vao;
+ glGenVertexArrays(1,&vao);
+ glBindVertexArray(vao);
+
+ camp::material0Data.reserve0();
+ camp::material1Data.reserve1();
+ camp::materialData.reserve();
+ camp::colorData.Reserve();
+ camp::triangleData.Reserve();
+ camp::transparentData.Reserve();
+}
+
void drawscene(int Width, int Height)
{
#ifdef HAVE_PTHREAD
@@ -487,8 +505,8 @@ void drawscene(int Width, int Height)
if((nlights == 0 && Nlights > 0) || nlights > Nlights ||
nmaterials > Nmaterials) {
- deleteshaders();
- initshaders();
+ deleteShaders();
+ initShaders();
lastshader=-1;
}
@@ -500,20 +518,12 @@ void drawscene(int Width, int Height)
double size2=hypot(Width,Height);
- if(forceRemesh) {
- remesh=true;
- forceRemesh=false;
- }
-
- camp::clearBuffers();
-
if(remesh)
camp::drawElement::center.clear();
Picture->render(size2,m,M,perspective,remesh);
- if(!forceRemesh)
- remesh=false;
+ remesh=false;
}
// Return x divided by y rounded up to the nearest integer.
@@ -873,6 +883,7 @@ void update()
dviewMat=translate(translate(dmat4(1.0),dvec3(cx,cy,cz))*drotateMat,
dvec3(0,0,-cz));
+ dView=value_ptr(dviewMat);
viewMat=mat4(dviewMat);
setProjection();
@@ -1444,9 +1455,6 @@ void init()
glutInit(&argc,argv);
screenWidth=glutGet(GLUT_SCREEN_WIDTH);
screenHeight=glutGet(GLUT_SCREEN_HEIGHT);
-
- maxvertices=getSetting<Int>("maxvertices");
- if(maxvertices == 0) maxvertices=Maxvertices;
#endif
}
@@ -1732,8 +1740,6 @@ void glrender(const string& prefix, const picture *pic, const string& format,
Maxmaterials=val/sizeof(Material);
if(nmaterials > Maxmaterials) nmaterials=Maxmaterials;
- glGetIntegerv(GL_MAX_ELEMENTS_VERTICES,&Maxvertices);
-
if(glinitialize) {
glinitialize=false;
int result = glewInit();
@@ -1743,7 +1749,8 @@ void glrender(const string& prefix, const picture *pic, const string& format,
exit(-1);
}
- initshaders();
+ initShaders();
+ setBuffers();
}
glClearColor(Background[0],Background[1],Background[2],Background[3]);
@@ -1822,7 +1829,18 @@ string getCenterIndex(size_t const& index) {
return Strdup(buf.str());
}
-void setUniforms(GLint shader)
+template<class T>
+void registerBuffer(const std::vector<T>& buffervector, GLuint bufferIndex,
+ GLint type=GL_ARRAY_BUFFER) {
+ if(!buffervector.empty()) {
+ glBindBuffer(type,bufferIndex);
+ glBufferData(type,buffervector.size()*sizeof(T),
+ buffervector.data(),GL_STATIC_DRAW);
+ glBindBuffer(type,0);
+ }
+}
+
+void setUniforms(const vertexBuffer& data, GLint shader, GLint materialAttrib)
{
bool normal=shader != pixelShader && shader != noNormalShader;
@@ -1857,37 +1875,31 @@ void setUniforms(GLint shader)
#endif
}
- GLuint binding=0;
- GLint blockindex=glGetUniformBlockIndex(shader,"MaterialBuffer");
- glUniformBlockBinding(shader,blockindex,binding);
-
- glGenBuffers(1,&gl::ubo);
- glBindBuffer(GL_UNIFORM_BUFFER,gl::ubo);
-
- glBufferData(GL_UNIFORM_BUFFER,material.size()*sizeof(Material),
- material.data(),GL_STATIC_DRAW);
- glBindBufferBase(GL_UNIFORM_BUFFER,binding,gl::ubo);
+ if(materialAttrib != -1) {
+ GLuint binding=0;
+ GLint blockindex=glGetUniformBlockIndex(shader,"MaterialBuffer");
+ glUniformBlockBinding(shader,blockindex,binding);
+ registerBuffer(data.materials,gl::ubo,GL_UNIFORM_BUFFER);
+ glBindBufferBase(GL_UNIFORM_BUFFER,binding,gl::ubo);
+ }
- glUniformMatrix4fv(glGetUniformLocation(shader,"projViewMat"),1,GL_FALSE, value_ptr(gl::projViewMat));
+ 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,"viewMat"),1,GL_FALSE,
+ value_ptr(gl::viewMat));
if(normal)
- glUniformMatrix3fv(glGetUniformLocation(shader,"normMat"),1,GL_FALSE, value_ptr(gl::normMat));
+ glUniformMatrix3fv(glGetUniformLocation(shader,"normMat"),1,GL_FALSE,
+ value_ptr(gl::normMat));
}
-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 normal=shader != noNormalShader && !pixel;
bool color=shader == colorShader || shader == transparentShader;
const size_t size=sizeof(GLfloat);
@@ -1896,37 +1908,26 @@ void drawBuffer(vertexBuffer& data, GLint shader)
(normal ? sizeof(vertexData) :
(pixel ? sizeof(vertexData0) : sizeof(vertexData1)));
- GLuint vertsBufferIndex;
- GLuint elemBufferIndex;
-
- GLuint vao;
+ if(color) registerBuffer(data.Vertices,attributeBuffer);
+ else if(normal) registerBuffer(data.vertices,attributeBuffer);
+ else if(pixel) registerBuffer(data.vertices0,attributeBuffer);
+ else registerBuffer(data.vertices1,attributeBuffer);
- 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,indicesBuffer);
- registerBuffer(data.indices,elemBufferIndex);
-
- glBindBuffer(GL_ARRAY_BUFFER,vertsBufferIndex);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,elemBufferIndex);
-
- camp::setUniforms(shader);
+ glBindBuffer(GL_ARRAY_BUFFER,attributeBuffer);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indicesBuffer);
const GLint posAttrib=glGetAttribLocation(shader,"position");
const GLint materialAttrib=glGetAttribLocation(shader,"material");
- GLint normalAttrib,colorAttrib,widthAttrib=0;
+ GLint normalAttrib=0,colorAttrib=0,widthAttrib=0;
+ camp::setUniforms(data,shader,materialAttrib);
+
glVertexAttribPointer(posAttrib,3,GL_FLOAT,GL_FALSE,bytestride,(void *) 0);
glEnableVertexAttribArray(posAttrib);
- if(normal) {
+ if(normal && gl::Nlights > 0) {
normalAttrib=glGetAttribLocation(shader,"normal");
glVertexAttribPointer(normalAttrib,3,GL_FLOAT,GL_FALSE,bytestride,
(void *) (3*size));
@@ -1938,9 +1939,11 @@ void drawBuffer(vertexBuffer& data, GLint shader)
glEnableVertexAttribArray(widthAttrib);
}
- glVertexAttribIPointer(materialAttrib,1,GL_INT,bytestride,
- (void *) ((normal ? 6 : (pixel ? 4 : 3))*size));
- glEnableVertexAttribArray(materialAttrib);
+ if(materialAttrib != -1) {
+ glVertexAttribIPointer(materialAttrib,1,GL_INT,bytestride,
+ (void *) ((normal ? 6 : (pixel ? 4 : 3))*size));
+ glEnableVertexAttribArray(materialAttrib);
+ }
if(color) {
colorAttrib=glGetAttribLocation(shader,"color");
@@ -1949,66 +1952,97 @@ void drawBuffer(vertexBuffer& data, GLint shader)
glEnableVertexAttribArray(colorAttrib);
}
- 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(normal && gl::Nlights > 0)
+ glDisableVertexAttribArray(normalAttrib);
if(pixel)
glDisableVertexAttribArray(widthAttrib);
glDisableVertexAttribArray(materialAttrib);
if(color)
glDisableVertexAttribArray(colorAttrib);
- deleteUniforms();
+ if(materialAttrib != -1)
+ glBindBuffer(GL_UNIFORM_BUFFER,0);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
-
- glBindVertexArray(0);
- glDeleteVertexArrays(1,&vao);
-
- glDeleteBuffers(1,&vertsBufferIndex);
- glDeleteBuffers(1,&elemBufferIndex);
}
-void drawBuffers()
+void drawMaterial0()
{
drawBuffer(material0Data,pixelShader);
+ material0Data.clear();
+}
+
+void drawMaterial1()
+{
drawBuffer(material1Data,noNormalShader);
+ material1Data.clear();
+}
+
+void drawMaterial()
+{
drawBuffer(materialData,materialShader);
+ materialData.clear();
+}
+
+void drawColor()
+{
drawBuffer(colorData,colorShader);
+ colorData.clear();
+}
+
+void drawTriangle()
+{
drawBuffer(triangleData,transparentShader);
+ triangleData.clear();
+}
+
+void drawTransparent()
+{
sortTriangles();
-
glDepthMask(GL_FALSE); // Enable transparency
drawBuffer(transparentData,transparentShader);
glDepthMask(GL_TRUE); // Disable transparency
+ transparentData.clear();
}
-void clearBuffers()
+void drawBuffers()
{
- material0Data.clear();
- material1Data.clear();
- materialData.clear();
- colorData.clear();
- triangleData.clear();
- transparentData.clear();
+ drawMaterial0();
+ drawMaterial1();
+ drawMaterial();
+ drawColor();
+ drawTriangle();
+ drawTransparent();
}
-void clearMaterialBuffer(bool draw)
+void clearMaterialBuffer()
{
- if(draw)
- drawBuffers();
material.clear();
material.reserve(nmaterials);
materialMap.clear();
materialIndex=0;
}
-
+void setMaterial(vertexBuffer& data, draw_t *draw)
+{
+ if(materialIndex >= data.materialTable.size() ||
+ data.materialTable[materialIndex] == -1) {
+ if(data.materials.size() >= Maxmaterials)
+ (*draw)();
+ size_t size0=data.materialTable.size();
+ data.materialTable.resize(materialIndex+1);
+ for(size_t i=size0; i < materialIndex; ++i)
+ data.materialTable[i]=-1;
+ data.materialTable[materialIndex]=data.materials.size();
+ data.materials.push_back(material[materialIndex]);
+ }
+ materialIndex=data.materialTable[materialIndex];
}
+}
#endif /* HAVE_GL */
diff --git a/graphics/asymptote/glrender.h b/graphics/asymptote/glrender.h
index 0a0276e339..53f121b1c5 100644
--- a/graphics/asymptote/glrender.h
+++ b/graphics/asymptote/glrender.h
@@ -10,6 +10,7 @@
#include "triple.h"
#ifdef HAVE_LIBGLM
+#define GLM_ENABLE_EXPERIMENTAL
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
@@ -96,8 +97,6 @@ namespace gl {
extern bool outlinemode;
extern bool wireframeMode;
-extern size_t maxvertices;
-extern bool forceRemesh;
extern bool orthographic;
extern double xmin,xmax;
@@ -136,9 +135,6 @@ public:
#ifdef HAVE_GL
extern GLuint ubo;
GLuint initHDR();
-
-void setUniforms(GLint shader);
-void deleteUniforms();
#endif
projection camera(bool user=true);
@@ -151,9 +147,7 @@ void glrender(const string& prefix, const camp::picture* pic,
double *diffuse, double *specular, bool view, int oldpid=0);
extern const double *dprojView;
-
-void initshader();
-void deleteshader();
+extern const double *dView;
extern double BBT[9];
@@ -186,7 +180,7 @@ extern Billboard BB;
#ifdef HAVE_LIBGLM
typedef mem::map<CONST Material,size_t> MaterialMap;
-extern mem::vector<Material> material;
+extern std::vector<Material> material;
extern MaterialMap materialMap;
extern size_t materialIndex;
extern int MaterialIndex;
@@ -281,18 +275,37 @@ public:
std::vector<vertexData1> vertices1;
std::vector<vertexData0> vertices0;
std::vector<GLuint> indices;
+
+ std::vector<Material> materials;
+ std::vector<GLint> materialTable;
+
void clear() {
vertices.clear();
Vertices.clear();
vertices1.clear();
vertices0.clear();
indices.clear();
+ materials.clear();
+ materialTable.clear();
+ }
+
+ void reserve0() {
+ vertices0.reserve(nbuffer);
+ }
+
+ void reserve1() {
+ vertices1.reserve(nbuffer);
+ }
+
+ void reserve() {
vertices.reserve(Nbuffer);
+ indices.reserve(Nbuffer);
+ }
+
+ void Reserve() {
Vertices.reserve(Nbuffer);
- vertices1.reserve(nbuffer);
- vertices0.reserve(nbuffer);
indices.reserve(Nbuffer);
- }
+ }
// Store the vertex v and its normal vector n.
GLuint vertex(const triple &v, const triple& n) {
@@ -300,35 +313,35 @@ public:
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) {
@@ -344,22 +357,21 @@ public:
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 GLint pixelShader;
@@ -372,13 +384,22 @@ 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
+extern vertexBuffer transparentData; // transparent patches & triangles
+
+void drawBuffer(vertexBuffer& data, GLint shader);
+void drawBuffers();
+void clearMaterialBuffer();
+
+typedef void draw_t();
+void setMaterial(vertexBuffer& data, draw_t *draw);
-extern void drawBuffer(vertexBuffer& data, GLint shader);
-extern void drawBuffers();
-extern void clearBuffers();
-extern void clearMaterialBuffer(bool draw=false);
+void drawMaterial0();
+void drawMaterial1();
+void drawMaterial();
+void drawColor();
+void drawTriangle();
+void drawTransparent();
#endif
diff --git a/graphics/asymptote/jsfile.cc b/graphics/asymptote/jsfile.cc
index 784245a53a..e6d8b4313d 100644
--- a/graphics/asymptote/jsfile.cc
+++ b/graphics/asymptote/jsfile.cc
@@ -21,9 +21,7 @@ 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
+ out << "<!-- Use the following line to embed this file within another web page:" << newl
<< newl
<< "<object data=\"" << name <<"\" style=\"width:"
<< gl::fullWidth << ";height:" << gl::fullHeight
@@ -31,22 +29,26 @@ void jsfile::open(string name) {
<< "-->" << newl << newl;
out.precision(getSetting<Int>("digits"));
- copy(locateFile(WebGLheader));
+ out << "<html>"
+ << newl << newl << "<head>"
+ << newl << "<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-1\">"
+ << newl<< "<meta name=\"viewport\" content=\"user-scalable=no\"/>"
+ << newl << newl;
if(getSetting<bool>("offline")) {
out << "<script>" << newl;
copy(locateFile(AsyGL));
- out << "</script>" << newl;
+ out << newl << "</script>" << newl;
} else {
out << "<script type=\"text/javascript\"" << newl << "src=\""
- << getSetting<string>("asygl") << "\"></script>" << newl;
+ << getSetting<string>("asygl") << "\">" << newl << "</script>" << newl;
}
out << "<script type=\"text/javascript\">" << newl;
out << newl
<< "canvasWidth=" << gl::fullWidth << ";" << newl
<< "canvasHeight=" << gl::fullHeight << ";" << newl
- << "absolute=" << std::boolalpha << absolute << ";" << newl
- << newl
+ << "absolute=" << std::boolalpha << getSetting<bool>("absolute") << ";"
+ << newl << newl
<< "b=[" << gl::xmin << "," << gl::ymin << "," << gl::zmin << "];"
<< newl
<< "B=[" << gl::xmax << "," << gl::ymax << "," << gl::zmax << "];"
@@ -100,7 +102,13 @@ jsfile::~jsfile() {
out << newl << drawElement::center[i] << ",";
out << newl << "];" << newl;
}
- copy(locateFile(WebGLfooter));
+ out << "</script>"
+ << newl << newl << "</head>"
+ << newl << newl << "<body style=\"overflow: hidden;\" onload=\"webGLStart();\">"
+ << newl << "<canvas id=\"Asymptote\" style=\"border: none;\" width=\"0\" height=\"0\" />"
+ << newl << "</body>"
+ << newl << newl << "</html>"
+ << newl;
}
void jsfile::addColor(const prc::RGBAColour& c)
diff --git a/graphics/asymptote/profile.py b/graphics/asymptote/profile.py
index f09ea6dea0..bfdd52015b 100644
--- a/graphics/asymptote/profile.py
+++ b/graphics/asymptote/profile.py
@@ -1,3 +1,5 @@
+#!/usr/bin/env python3
+
import sys
from pprint import pprint
@@ -30,8 +32,8 @@ def computeTotals(tree):
+ sum(child['nsecsTotal'] for child in tree['children']))
def printName(name, prefix=''):
- print prefix+"fl=", name[1]
- print prefix+"fn=", name[0]
+ print (prefix+"fl=", name[1])
+ print (prefix+"fn=", name[0])
class Arc:
def __init__(self):
@@ -61,13 +63,13 @@ class Func:
self.addChildTime(child)
def dump(self):
- print POS, self.instructions, self.nsecs
+ print (POS, self.instructions, self.nsecs)
for name in self.arcs:
printName(name, prefix='c')
arc = self.arcs[name]
- print "calls="+str(arc.calls), POS
- print POS, arc.instTotal, arc.nsecsTotal
- print
+ print ("calls="+str(arc.calls), POS)
+ print (POS, arc.instTotal, arc.nsecsTotal)
+ print ()
def analyse(funcs, tree):
funcs[nameFromNode(tree)].analyse(tree)
@@ -75,7 +77,7 @@ def analyse(funcs, tree):
analyse(funcs, child)
def dump(funcs):
- print "events: Instructions Nanoseconds"
+ print ("events: Instructions Nanoseconds")
for name in funcs:
printName(name)
funcs[name].dump()
diff --git a/graphics/asymptote/revision.cc b/graphics/asymptote/revision.cc
index e4840de470..60f2ae9c04 100644
--- a/graphics/asymptote/revision.cc
+++ b/graphics/asymptote/revision.cc
@@ -1,2 +1,2 @@
-const char *REVISION="2.58";
+const char *REVISION="2.59";
const char *AsyGLVersion="1.00";
diff --git a/graphics/asymptote/settings.cc b/graphics/asymptote/settings.cc
index 034d827ed3..36c91da1a5 100644
--- a/graphics/asymptote/settings.cc
+++ b/graphics/asymptote/settings.cc
@@ -1344,7 +1344,6 @@ void initSettings() {
addOption(new userSetting("user", 'u', "string",
"General purpose user string"));
- addOption(new IntSetting("maxvertices", 0, "n", "Maximum number of vertices to queue", 0));
addOption(new realSetting("zoomfactor", 0, "factor", "Zoom step factor",
1.05));
addOption(new realSetting("zoomPinchFactor", 0, "n",
diff --git a/graphics/asymptote/triple.h b/graphics/asymptote/triple.h
index af42e28583..e0caf51192 100644
--- a/graphics/asymptote/triple.h
+++ b/graphics/asymptote/triple.h
@@ -103,14 +103,6 @@ public:
(t[1]*v.x+t[5]*v.y+t[9]*v.z+t[13])*f);
}
- // return z component of v*t.
- friend double TransformZ(const triple& v, const double* t)
- {
- double f=t[3]*v.x+t[7]*v.y+t[11]*v.z+t[15];
- f=1.0/f;
- return (t[2]*v.x+t[6]*v.y+t[10]*v.z+t[14])*f;
- }
-
friend void transformtriples(const double* t, size_t n, triple* d,
const triple* s)
{
diff --git a/graphics/asymptote/base/webgl/WebGLheader.html b/graphics/asymptote/webgl/fragment.glsl
index ac2f083901..de9ab75dac 100644
--- a/graphics/asymptote/base/webgl/WebGLheader.html
+++ b/graphics/asymptote/webgl/fragment.glsl
@@ -1,96 +1,3 @@
-<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;
-#if nlights > 0
- emissive=vec4(0.0);
-#else
- emissive=color;
-#endif
- }
-#else
- m=Materials[int(materialIndex)];
-#ifdef COLOR
- diffuse=color;
-#if nlights > 0
- emissive=vec4(0.0);
-#else
- emissive=color;
-#endif
-#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;
@@ -107,7 +14,8 @@ struct Light {
vec3 direction;
vec3 color;
};
-uniform Light Lights[nLights];
+
+uniform Light Lights[Nlights];
float NDF_TRG(vec3 h)
{
@@ -185,4 +93,3 @@ void main(void)
gl_FragColor=emissive;
#endif
}
-</script>
diff --git a/graphics/asymptote/webgl/gl.js b/graphics/asymptote/webgl/gl.js
index 381a434ff4..79d06c8137 100644
--- a/graphics/asymptote/webgl/gl.js
+++ b/graphics/asymptote/webgl/gl.js
@@ -1,50 +1,55 @@
-/*@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 P=[]; // Array of Bezier patches, triangles, curves, and pixels
+let Materials=[]; // Array of materials
+let Lights=[]; // Array of lights
+let Centers=[]; // Array of billboard centers
+let Background=[1,1,1,1]; // Background color
+let canvasWidth,canvasHeight;
-let gl;
+let absolute=false;
+
+let b,B; // Scene min,max bounding box corners (3-tuples)
+let angle; // Field of view angle
+let Zoom0; // Initial zoom
+let viewportmargin; // Margin around viewport (2-tuple)
+let viewportshift=[0,0]; // Viewport shift (for perspective projection)
+
+let zoomFactor;
+let zoomPinchFactor;
+let zoomPinchCap;
+let zoomStep;
+
+let shiftHoldDistance;
+let shiftWaitTime;
+let vibrateTime;
+
+let embedded; // Is image embedded within another window?
+
+let canvas; // Rendering canvas
+let gl; // WebGL rendering context
+let alpha; // Is background opaque?
+
+let offscreen; // Offscreen rendering canvas for embedded images
+let context; // 2D context for copying embedded offscreen images
+
+let nlights=0; // Number of lights compiled in shader
+let Nmaterials=1; // Maximum number of materials compiled in shader
+
+let materials=[]; // Subset of Materials passed as uniforms
+let maxMaterials; // Limit on number of materials allowed in shader
-let canvas;
-let canvasWidth,canvasHeight;
let halfCanvasWidth,halfCanvasHeight;
let pixel=0.75; // Adaptive rendering constant.
let BezierFactor=0.4;
let FillFactor=0.1;
let Zoom;
-let Zoom0;
let maxViewportWidth=window.innerWidth;
let maxViewportHeight=window.innerHeight;
-let viewportmargin=0;
-let viewportshift=[0,0];
const windowTrim=10;
let resizeStep=1.2;
-let zoomFactor;
-let zoomPinchFactor;
-let zoomPinchCap;
-let zoomStep;
-
-let shiftHoldDistance;
-let shiftWaitTime;
-let vibrateTime;
let lastzoom;
let H; // maximum camera view half-height
@@ -53,15 +58,6 @@ let Fuzz2=1000*Number.EPSILON;
let Fuzz4=Fuzz2*Fuzz2;
let third=1/3;
-let P=[]; // Array of Bezier patches, triangles, curves, and pixels
-let Materials=[]; // Array of materials
-let Lights=[]; // Array of lights
-let Centers=[]; // Array of billboard centers
-let Background=[1,1,1,1]; // Background color
-
-// Don't account for device pixels when embedding in another html document
-let absolute=false;
-
let rotMat=mat4.create();
let projMat=mat4.create(); // projection matrix
let viewMat=mat4.create(); // view matrix
@@ -77,7 +73,6 @@ let zmin,zmax;
let center={x:0,y:0,z:0};
let size2;
let ArcballFactor;
-let b,B; // Scene min,max bounding box corners
let shift={
x:0,y:0
};
@@ -116,22 +111,16 @@ class Material {
this.fresnel0=fresnel0;
}
- setUniform(program,stringLoc,index=null) {
- let getLoc;
- if (index === null)
- getLoc =
- param => gl.getUniformLocation(program,stringLoc+"."+param);
- else
- getLoc =
- param => gl.getUniformLocation(program,stringLoc+"["+index+"]."+param);
+ setUniform(program,index) {
+ let getLoc=
+ param => gl.getUniformLocation(program,"Materials["+index+"]."+param);
gl.uniform4fv(getLoc("diffuse"),new Float32Array(this.diffuse));
gl.uniform4fv(getLoc("emissive"),new Float32Array(this.emissive));
gl.uniform4fv(getLoc("specular"),new Float32Array(this.specular));
- gl.uniform1f(getLoc("shininess"),this.shininess);
- gl.uniform1f(getLoc("metallic"),this.metallic);
- gl.uniform1f(getLoc("fresnel0"),this.fresnel0);
+ gl.uniform4f(getLoc("parameters"),this.shininess,this.metallic,
+ this.fresnel0,0);
}
}
@@ -144,28 +133,119 @@ class Light {
this.color=color;
}
- setUniform(program,stringLoc,index) {
+ setUniform(program,index) {
let getLoc=
- param => gl.getUniformLocation(program,stringLoc+"["+index+"]."+param);
+ param => gl.getUniformLocation(program,"Lights["+index+"]."+param);
gl.uniform3fv(getLoc("direction"),new Float32Array(this.direction));
gl.uniform3fv(getLoc("color"),new Float32Array(this.color));
}
}
-function initGL() {
- try {
- gl=canvas.getContext("webgl",{alpha:Background[3] < 1});
- } catch(e) {}
+function initShaders()
+{
+ let maxUniforms=gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS);
+ maxMaterials=Math.floor((maxUniforms-14)/4);
+ Nmaterials=Math.min(Math.max(Nmaterials,Materials.length),maxMaterials);
+
+ noNormalShader=initShader();
+ pixelShader=initShader(["WIDTH"]);
+ materialShader=initShader(["NORMAL"]);
+ colorShader=initShader(["NORMAL","COLOR"]);
+ transparentShader=initShader(["NORMAL","COLOR","TRANSPARENT"]);
+}
+
+// Create buffers for the patch and its subdivisions.
+function setBuffers()
+{
+ positionBuffer=gl.createBuffer();
+ materialBuffer=gl.createBuffer();
+ colorBuffer=gl.createBuffer();
+ indexBuffer=gl.createBuffer();
+}
+
+function noGL() {
if (!gl)
alert("Could not initialize WebGL");
}
-function getShader(gl,id,options=[]) {
- let shaderScript=document.getElementById(id);
- if(!shaderScript)
- return null;
+function saveAttributes()
+{
+ let a=window.parent.document.asygl[alpha];
+
+ a.gl=gl;
+ a.nlights=Lights.length;
+ a.Nmaterials=Nmaterials;
+ a.maxMaterials=maxMaterials;
+
+ a.noNormalShader=noNormalShader;
+ a.pixelShader=pixelShader;
+ a.materialShader=materialShader;
+ a.colorShader=colorShader;
+ a.transparentShader=transparentShader;
+}
+
+function restoreAttributes()
+{
+ let a=window.parent.document.asygl[alpha];
+
+ gl=a.gl;
+ nlights=a.nlights;
+ Nmaterials=a.Nmaterials;
+ maxMaterials=a.maxMaterials;
+
+ noNormalShader=a.noNormalShader;
+ pixelShader=a.pixelShader;
+ materialShader=a.materialShader;
+ colorShader=a.colorShader;
+ transparentShader=a.transparentShader;
+}
+
+let indexExt;
+
+function initGL()
+{
+ alpha=Background[3] < 1;
+ if(embedded) {
+ let p=window.parent.document;
+
+ if(p.asygl == null)
+ p.asygl=Array(2);
+
+ context=canvas.getContext("2d");
+ offscreen=p.offscreen;
+ if(!offscreen) {
+ offscreen=p.createElement("canvas");
+ p.offscreen=offscreen;
+ }
+
+ if(!p.asygl[alpha] || !p.asygl[alpha].gl) {
+ gl=offscreen.getContext("webgl",{alpha:alpha});
+ if(!gl) noGL();
+ initShaders();
+ p.asygl[alpha]={};
+ saveAttributes();
+ } else {
+ restoreAttributes();
+ if((Lights.length != nlights) ||
+ Math.min(Materials.length,maxMaterials) > Nmaterials) {
+ initShaders();
+ saveAttributes();
+ }
+ }
+ } else {
+ gl=canvas.getContext("webgl",{alpha:alpha});
+ if(!gl) noGL();
+ initShaders();
+ }
+
+ setBuffers();
+ indexExt=gl.getExtension("OES_element_index_uint");
+}
+
+function getShader(gl,shaderScript,type,options=[])
+{
let str=`#version 100
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
@@ -173,29 +253,16 @@ function getShader(gl,id,options=[]) {
precision mediump float;
#endif
#define nlights ${Lights.length}\n
- const int nLights=${Math.max(Lights.length,1)};\n
- const int nMaterials=${Math.max(Materials.length,1)};\n`
+ const int Nlights=${Math.max(Lights.length,1)};\n
+ #define Nmaterials ${Nmaterials}\n`;
if(orthographic)
str += `#define ORTHOGRAPHIC\n`;
options.forEach(s => str += `#define `+s+`\n`);
- let k=shaderScript.firstChild;
- while(k) {
- if(k.nodeType == 3)
- str += k.textContent;
- k=k.nextSibling;
- }
- let shader;
- if(shaderScript.type == "x-shader/x-fragment")
- shader = gl.createShader(gl.FRAGMENT_SHADER);
- else if (shaderScript.type == "x-shader/x-vertex")
- shader = gl.createShader(gl.VERTEX_SHADER);
- else
- return null;
-
- gl.shaderSource(shader,str);
+ let shader=gl.createShader(type);
+ gl.shaderSource(shader,str+shaderScript);
gl.compileShader(shader);
if(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)) {
alert(gl.getShaderInfoLog(shader));
@@ -204,32 +271,34 @@ function getShader(gl,id,options=[]) {
return shader;
}
-
function drawBuffer(data,shader,indices=data.indices)
{
if(data.indices.length == 0) return;
+
let pixel=shader == pixelShader;
- let normal=!pixel && (shader != noNormalShader);
+ let normal=shader != noNormalShader && !pixel;
- setUniforms(shader);
+ setUniforms(data,shader);
gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(data.vertices),
gl.STATIC_DRAW);
gl.vertexAttribPointer(shader.vertexPositionAttribute,
3,gl.FLOAT,false,normal ? 24 : (pixel ? 16 : 12),0);
- if(normal)
+ if(normal && Lights.length > 0)
gl.vertexAttribPointer(shader.vertexNormalAttribute,
3,gl.FLOAT,false,24,12);
else if(pixel)
gl.vertexAttribPointer(shader.vertexWidthAttribute,
1,gl.FLOAT,false,16,12);
- gl.bindBuffer(gl.ARRAY_BUFFER,materialBuffer);
- gl.bufferData(gl.ARRAY_BUFFER,new Int16Array(data.materials),
- gl.STATIC_DRAW);
- gl.vertexAttribPointer(shader.vertexMaterialAttribute,
- 1,gl.SHORT,false,2,0);
+ if(shader.vertexMaterialAttribute != -1) {
+ gl.bindBuffer(gl.ARRAY_BUFFER,materialBuffer);
+ gl.bufferData(gl.ARRAY_BUFFER,new Int16Array(data.materialIndices),
+ gl.STATIC_DRAW);
+ gl.vertexAttribPointer(shader.vertexMaterialAttribute,
+ 1,gl.SHORT,false,2,0);
+ }
if(shader == colorShader || shader == transparentShader) {
gl.bindBuffer(gl.ARRAY_BUFFER,colorBuffer);
@@ -247,6 +316,8 @@ function drawBuffer(data,shader,indices=data.indices)
gl.drawElements(normal ? gl.TRIANGLES : (pixel ? gl.POINTS : gl.LINES),
indices.length,
indexExt ? gl.UNSIGNED_INT : gl.UNSIGNED_SHORT,0);
+ if(embedded)
+ context.drawImage(offscreen,0,0);
}
class vertexBuffer {
@@ -255,10 +326,13 @@ class vertexBuffer {
}
clear() {
this.vertices=[];
- this.materials=[];
+ this.materialIndices=[];
this.colors=[];
this.indices=[];
this.nvertices=0;
+
+ this.materials=[];
+ this.materialTable=[];
}
// material vertex
@@ -269,7 +343,7 @@ class vertexBuffer {
this.vertices.push(n[0]);
this.vertices.push(n[1]);
this.vertices.push(n[2]);
- this.materials.push(materialIndex);
+ this.materialIndices.push(materialIndex);
return this.nvertices++;
}
@@ -281,7 +355,7 @@ class vertexBuffer {
this.vertices.push(n[0]);
this.vertices.push(n[1]);
this.vertices.push(n[2]);
- this.materials.push(materialIndex);
+ this.materialIndices.push(materialIndex);
this.colors.push(c[0]);
this.colors.push(c[1]);
this.colors.push(c[2]);
@@ -294,7 +368,7 @@ class vertexBuffer {
this.vertices.push(v[0]);
this.vertices.push(v[1]);
this.vertices.push(v[2]);
- this.materials.push(materialIndex);
+ this.materialIndices.push(materialIndex);
return this.nvertices++;
}
@@ -304,7 +378,7 @@ class vertexBuffer {
this.vertices.push(v[1]);
this.vertices.push(v[2]);
this.vertices.push(width);
- this.materials.push(materialIndex);
+ this.materialIndices.push(materialIndex);
return this.nvertices++;
}
@@ -317,7 +391,7 @@ class vertexBuffer {
this.vertices[i6+3]=n[0];
this.vertices[i6+4]=n[1];
this.vertices[i6+5]=n[2];
- this.materials[i]=materialIndex;
+ this.materialIndices[i]=materialIndex;
let i4=4*i;
this.colors[i4]=c[0];
this.colors[i4+1]=c[1];
@@ -328,7 +402,7 @@ class vertexBuffer {
append(data) {
append(this.vertices,data.vertices);
- append(this.materials,data.materials);
+ append(this.materialIndices,data.materialIndices);
append(this.colors,data.colors);
appendOffset(this.indices,data.indices,this.nvertices);
this.nvertices += data.nvertices;
@@ -417,10 +491,21 @@ class Geometry {
return [this.T(m),this.T([m[0],m[1],M[2]]),this.T([m[0],M[1],m[2]]),
this.T([m[0],M[1],M[2]]),this.T([M[0],m[1],m[2]]),
this.T([M[0],m[1],M[2]]),this.T([M[0],M[1],m[2]]),this.T(M)];
+ }
+ setMaterial(data,draw) {
+ if(data.materialTable[this.MaterialIndex] == null) {
+ if(data.materials.length >= Nmaterials)
+ draw();
+ data.materialTable[this.MaterialIndex]=data.materials.length;
+ data.materials.push(Materials[this.MaterialIndex]);
+ }
+ materialIndex=data.materialTable[this.MaterialIndex];
}
render() {
+ this.setMaterialIndex();
+
// First check if re-rendering is required
let v;
if(this.CenterIndex == 0)
@@ -452,8 +537,6 @@ class Geometry {
P[i]=this.T(p[i]);
}
- materialIndex=this.MaterialIndex;
-
let s=orthographic ? 1 : this.Min[2]/B[2];
let res=pixel*Math.hypot(s*(viewParam.xmax-viewParam.xmin),
s*(viewParam.ymax-viewParam.ymin))/size2;
@@ -490,16 +573,24 @@ class BezierPatch extends Geometry {
sum+color[3][3] < 1020 : sum < 765;
} else
this.transparent=Materials[MaterialIndex].diffuse[3] < 1;
- if(this.transparent) {
- this.MaterialIndex=color ? -1-MaterialIndex : 1+MaterialIndex;
- this.vertex=this.data.Vertex.bind(this.data);
- } else {
- this.MaterialIndex=MaterialIndex;
- this.vertex=this.data.vertex.bind(this.data);
- }
+ this.MaterialIndex=MaterialIndex;
+
+ this.vertex=this.transparent ? this.data.Vertex.bind(this.data) :
+ this.data.vertex.bind(this.data);
this.L2norm(this.controlpoints);
}
+ setMaterialIndex() {
+ if(this.transparent)
+ this.setMaterial(transparentData,drawTransparent);
+ else {
+ if(this.color)
+ this.setMaterial(colorData,drawColor);
+ else
+ this.setMaterial(materialData,drawMaterial);
+ }
+ }
+
// Render a Bezier patch via subdivision.
L2norm(p) {
let p0=p[0];
@@ -567,6 +658,9 @@ class BezierPatch extends Geometry {
}
process(p) {
+ if(this.transparent) // Override materialIndex to encode color vs material
+ materialIndex=this.color ? -1-materialIndex : 1+materialIndex;
+
if(p.length == 10) return this.process3(p);
if(p.length == 3) return this.processTriangle(p);
if(p.length == 4) return this.processQuad(p);
@@ -1257,6 +1351,10 @@ class BezierCurve extends Geometry {
this.MaterialIndex=MaterialIndex;
}
+ setMaterialIndex() {
+ this.setMaterial(material1Data,drawMaterial1);
+ }
+
processLine(p) {
let p0=p[0];
let p1=p[1];
@@ -1324,6 +1422,10 @@ class Pixel extends Geometry {
this.Max=Max;
}
+ setMaterialIndex() {
+ this.setMaterial(material0Data,drawMaterial0);
+ }
+
process(p) {
this.data.indices.push(this.data.vertex0(this.controlpoint,this.width));
this.append();
@@ -1352,7 +1454,17 @@ class Triangles extends Geometry {
this.transparent=Materials[MaterialIndex].diffuse[3] < 1;
}
+ setMaterialIndex() {
+ if(this.transparent)
+ this.setMaterial(transparentData,drawTransparent);
+ else
+ this.setMaterial(triangleData,drawTriangle);
+ }
+
process(p) {
+ // Override materialIndex to encode color vs material
+ materialIndex=this.Colors.length > 0 ? -1-materialIndex : 1+materialIndex;
+
for(let i=0, n=this.Indices.length; i < n; ++i) {
let index=this.Indices[i];
let PI=index[0];
@@ -1369,12 +1481,10 @@ class Triangles extends Geometry {
let C1=this.Colors[CI[1]];
let C2=this.Colors[CI[2]];
this.transparent |= C0[3]+C1[3]+C2[3] < 765;
- materialIndex=-1-this.MaterialIndex;
this.data.iVertex(PI[0],P0,this.Normals[NI[0]],C0);
this.data.iVertex(PI[1],P1,this.Normals[NI[1]],C1);
this.data.iVertex(PI[2],P2,this.Normals[NI[2]],C2);
} else {
- materialIndex=1+this.MaterialIndex;
this.data.iVertex(PI[0],P0,this.Normals[NI[0]]);
this.data.iVertex(PI[1],P1,this.Normals[NI[1]]);
this.data.iVertex(PI[2],P2,this.Normals[NI[2]]);
@@ -1404,8 +1514,8 @@ function home()
function initShader(options=[])
{
- let fragmentShader=getShader(gl,"fragment",options);
- let vertexShader=getShader(gl,"vertex",options);
+ let vertexShader=getShader(gl,vertex,gl.VERTEX_SHADER,options);
+ let fragmentShader=getShader(gl,fragment,gl.FRAGMENT_SHADER,options);
let shader=gl.createProgram();
gl.attachShader(shader,vertexShader);
@@ -1524,31 +1634,29 @@ function COBTarget(out,mat)
mat4.multiply(out,translMat,out);
}
-function setUniforms(shader)
+function setUniforms(data,shader)
{
let pixel=shader == pixelShader;
gl.useProgram(shader);
- shader.vertexPositionAttribute=
- gl.getAttribLocation(shader,"position");
+ shader.vertexPositionAttribute=gl.getAttribLocation(shader,"position");
gl.enableVertexAttribArray(shader.vertexPositionAttribute);
if(pixel) {
- shader.vertexWidthAttribute=
- gl.getAttribLocation(shader,"width");
+ shader.vertexWidthAttribute=gl.getAttribLocation(shader,"width");
gl.enableVertexAttribArray(shader.vertexWidthAttribute);
}
- if(shader != noNormalShader && !pixel) {
- shader.vertexNormalAttribute=
- gl.getAttribLocation(shader,"normal");
+ let normals=shader != noNormalShader && !pixel && Lights.length > 0;
+ if(normals) {
+ shader.vertexNormalAttribute=gl.getAttribLocation(shader,"normal");
gl.enableVertexAttribArray(shader.vertexNormalAttribute);
}
- shader.vertexMaterialAttribute=
- gl.getAttribLocation(shader,"materialIndex");
- gl.enableVertexAttribArray(shader.vertexMaterialAttribute);
+ shader.vertexMaterialAttribute=gl.getAttribLocation(shader,"materialIndex");
+ if(shader.vertexMaterialAttribute != -1)
+ gl.enableVertexAttribArray(shader.vertexMaterialAttribute);
shader.projViewMatUniform=gl.getUniformLocation(shader,"projViewMat");
shader.viewMatUniform=gl.getUniformLocation(shader,"viewMat");
@@ -1560,11 +1668,15 @@ function setUniforms(shader)
gl.enableVertexAttribArray(shader.vertexColorAttribute);
}
- for(let i=0; i < Materials.length; ++i)
- Materials[i].setUniform(shader,"Materials",i);
+ if(normals) {
+ for(let i=0; i < Lights.length; ++i)
+ Lights[i].setUniform(shader,i);
+ }
- for(let i=0; i < Lights.length; ++i)
- Lights[i].setUniform(shader,"Lights",i);
+ if(shader.vertexMaterialAttribute != -1) {
+ for(let i=0; i < data.materials.length; ++i)
+ data.materials[i].setUniform(shader,i);
+ }
gl.uniformMatrix4fv(shader.projViewMatUniform,false,projViewMat);
gl.uniformMatrix4fv(shader.viewMatUniform,false,viewMat);
@@ -1875,18 +1987,6 @@ function handleTouchMove(event)
}
}
-let indexExt;
-
-// Create buffers for the patch and its subdivisions.
-function setBuffer()
-{
- positionBuffer=gl.createBuffer();
- materialBuffer=gl.createBuffer();
- colorBuffer=gl.createBuffer();
- indexBuffer=gl.createBuffer();
- indexExt=gl.getExtension("OES_element_index_uint");
-}
-
let zbuffer=[];
function transformVertices(vertices)
@@ -1901,28 +2001,38 @@ function transformVertices(vertices)
}
}
-function draw()
+function drawMaterial0()
{
- gl.clearColor(Background[0],Background[1],Background[2],Background[3]);
- gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
-
+ drawBuffer(material0Data,pixelShader);
material0Data.clear();
- material1Data.clear();
- materialData.clear();
- colorData.clear();
- triangleData.clear();
- transparentData.clear();
-
- P.forEach(function(p) {
- p.render();
- });
+}
- drawBuffer(material0Data,pixelShader);
+function drawMaterial1()
+{
drawBuffer(material1Data,noNormalShader);
+ material1Data.clear();
+}
+
+function drawMaterial()
+{
drawBuffer(materialData,materialShader);
+ materialData.clear();
+}
+
+function drawColor()
+{
drawBuffer(colorData,colorShader);
+ colorData.clear();
+}
+
+function drawTriangle()
+{
drawBuffer(triangleData,transparentShader);
+ triangleData.clear();
+}
+function drawTransparent()
+{
let indices=transparentData.indices;
if(indices.length > 0) {
transformVertices(transparentData.vertices);
@@ -1959,6 +2069,34 @@ function draw()
drawBuffer(transparentData,transparentShader,Indices);
gl.depthMask(true); // Disable transparency
}
+ transparentData.clear();
+}
+
+function drawBuffers()
+{
+ drawMaterial0();
+ drawMaterial1();
+ drawMaterial();
+ drawColor();
+ drawTriangle();
+ drawTransparent();
+}
+
+function draw()
+{
+ if(embedded) {
+ offscreen.width=canvas.width;
+ offscreen.height=canvas.height;
+ setViewport();
+ }
+
+ gl.clearColor(Background[0],Background[1],Background[2],Background[3]);
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
+
+ for(let i=0; i < P.length; ++i)
+ P[i].render();
+
+ drawBuffers();
remesh=false;
}
@@ -2040,13 +2178,17 @@ function setViewport()
gl.viewportWidth=canvasWidth;
gl.viewportHeight=canvasHeight;
gl.viewport(0,0,gl.viewportWidth,gl.viewportHeight);
- home();
+ gl.scissor(0,0,gl.viewportWidth,gl.viewportHeight);
}
function setCanvas()
{
canvas.width=canvasWidth;
canvas.height=canvasHeight;
+ if(embedded) {
+ offscreen.width=canvasWidth;
+ offscreen.height=canvasHeight;
+ }
size2=Math.hypot(canvasWidth,canvasHeight);
halfCanvasWidth=0.5*canvasWidth;
halfCanvasHeight=0.5*canvasHeight;
@@ -2067,6 +2209,7 @@ function setsize(w,h)
canvasHeight=h;
setCanvas();
setViewport();
+ home();
}
function expand()
@@ -2085,8 +2228,11 @@ let pixelShader,noNormalShader,materialShader,colorShader,transparentShader;
function webGLStart()
{
canvas=document.getElementById("Asymptote");
+ embedded=window.parent.document != document;
- if(absolute) {
+ initGL();
+
+ if(absolute && !embedded) {
canvasWidth *= window.devicePixelRatio;
canvasHeight *= window.devicePixelRatio;
} else {
@@ -2110,25 +2256,19 @@ function webGLStart()
}
setCanvas();
+
ArcballFactor=1+8*Math.hypot(viewportmargin[0],viewportmargin[1])/size2;
viewportshift[0] /= Zoom0;
viewportshift[1] /= Zoom0;
- initGL();
-
gl.enable(gl.BLEND);
gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA);
gl.enable(gl.DEPTH_TEST);
- setViewport();
+ gl.enable(gl.SCISSOR_TEST);
- noNormalShader=initShader();
- pixelShader=initShader(["WIDTH"]);
- materialShader=initShader(["NORMAL"]);
- colorShader=initShader(["NORMAL","COLOR"]);
- transparentShader=initShader(["NORMAL","COLOR","TRANSPARENT"]);
-
- setBuffer();
+ setViewport();
+ home();
canvas.onmousedown=handleMouseDown;
document.onmouseup=handleMouseUpOrTouchEnd;
diff --git a/graphics/asymptote/webgl/license b/graphics/asymptote/webgl/license
new file mode 100644
index 0000000000..d7a2d1a099
--- /dev/null
+++ b/graphics/asymptote/webgl/license
@@ -0,0 +1,18 @@
+/*@license
+ AsyGL: Render Bezier patches and triangles 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/>.
+*/
diff --git a/graphics/asymptote/webgl/vertex.glsl b/graphics/asymptote/webgl/vertex.glsl
new file mode 100644
index 0000000000..250c0b7b4a
--- /dev/null
+++ b/graphics/asymptote/webgl/vertex.glsl
@@ -0,0 +1,84 @@
+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;
+ vec4 parameters;
+};
+
+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;
+#if nlights > 0
+ emissive=vec4(0.0);
+#else
+ emissive=color;
+#endif
+ }
+#else
+ m=Materials[int(materialIndex)];
+#ifdef COLOR
+ diffuse=color;
+#if nlights > 0
+ emissive=vec4(0.0);
+#else
+ emissive=color;
+#endif
+#else
+ diffuse=m.diffuse;
+ emissive=m.emissive;
+#endif
+#endif
+ specular=m.specular.rgb;
+ vec4 parameters=m.parameters;
+ roughness=1.0-parameters[0];
+ metallic=parameters[1];
+ fresnel0=parameters[2];
+#else
+ emissive=Materials[int(materialIndex)].emissive;
+#endif
+#ifdef WIDTH
+ gl_PointSize=width;
+#endif
+}
diff --git a/graphics/pstricks/contrib/pst-eucl/Changes b/graphics/pstricks/contrib/pst-eucl/Changes
index 70509f1f1b..f05be18cb4 100644
--- a/graphics/pstricks/contrib/pst-eucl/Changes
+++ b/graphics/pstricks/contrib/pst-eucl/Changes
@@ -1,10 +1,15 @@
pst-eucl.pro --------
-1.01 2012/09/21 - fix for introduced bug
-1.00 2011/08/05 - fix bug in /InterLines
+1.01 2012/09/21 - fix for introduced bug
+1.00 2011/08/05 - fix bug in /InterLines
pst-eucl.tex --------
-
+1.66 2019/10/20 - add macros to operate the node coordinates, \pstAbscissa, \pstOrdinate, \pstMoveNode etc.
+ - add optional parameters angleA and angleB for \pstCircleOA and \pstCircleAB.
+ - add optional parameters to output the inner circle center and outer circle center for \pstTriangleIC and \pstTriangleOC.
+ - add macros to draw the tangent line and tangent node of circle.
+ - add macros to draw the external and internal common tangent lines of two circles.
+ - add macros to draw conics (ellipse, parabola and hyperbola) and their geometrical elements, such as focus, directrix and intersections.
1.65 2019/08/19 - new type for angle
1.64 2019/01/31 - fix for PointName and pstInterCC
1.63 2019/01/27 - fix for PointSymbol=none for pstTriangle
@@ -43,7 +48,7 @@ pst-eucl.tex --------
1.36 2010/08/23 - fix for \pstMarkAngle (hv)
1.35 2009/01/19 - new option labelColor (hv)
1.34 2006/01/28 - use \psscalebox instead of \scalebox
- - small tweaks
+ - small tweaks
%% 2000-10-16 : creation of the file from a first LaTeX protype sty file
%% 2001-05-7 : distribution of the first beta version
%% 2002-03-21 : distribution of the second beta version
diff --git a/graphics/pstricks/contrib/pst-eucl/doc/pst-eucl-doc.pdf b/graphics/pstricks/contrib/pst-eucl/doc/pst-eucl-doc.pdf
index f1a31520f1..7f37a4e7ae 100644
--- a/graphics/pstricks/contrib/pst-eucl/doc/pst-eucl-doc.pdf
+++ b/graphics/pstricks/contrib/pst-eucl/doc/pst-eucl-doc.pdf
Binary files differ
diff --git a/graphics/pstricks/contrib/pst-eucl/doc/pst-eucl-doc.tex b/graphics/pstricks/contrib/pst-eucl/doc/pst-eucl-doc.tex
index e81b7cf8d5..25aefc7487 100644
--- a/graphics/pstricks/contrib/pst-eucl/doc/pst-eucl-doc.tex
+++ b/graphics/pstricks/contrib/pst-eucl/doc/pst-eucl-doc.tex
@@ -4,6 +4,8 @@
\usepackage{pst-eucl}
\let\pstEuclideFV\fileversion
\usepackage{multicol}
+\usepackage{ntheorem}
+\newtheorem{theorem}{Theorem}
\usepackage{pst-plot,paralist}
\usepackage[mathscr]{eucal}
\lstset{pos=l,wide=false,language=PSTricks,
@@ -42,7 +44,7 @@
\item Michael Vulis for his fast testing of the documentation using
V\TeX\ which leads to the correction of a bug in the \PS\ code;
\item Manuel Luque and Olivier Reboux for their remarks and their examples.
- \item Alain Delplanque for its modification propositions on automatic
+ \item Alain Delplanque for its modification theorems on automatic
placing of points name and the ability of giving a list of points in
\Lcs{pstGeonode}.
\end{compactitem}
@@ -51,9 +53,10 @@
\vfill
\noindent
-Thanks to:
+Thanks to:
Manuel Luque;
-Thomas Söll.
+Thomas Söll;
+Liao Xiongfei.
@@ -195,19 +198,61 @@ Obviously, the nodes appearing in the picture can be used as normal
\rnode{ici}{here}.
\nccurve[arrowscale=2]{->}{ici}{B_1}
+After v1.65, we add macros \Lcs{pstAbscissa} and \Lcs{pstOrdinate} to
+get the abscissa and ordinate of the specified node, so it is possible
+to define a new node from an already constructed node with them.
+
+\begin{BDef}
+\Lcs{pstAbscissa}\Largb{A}\\
+\Lcs{pstOrdinate}\Largb{A}
+\end{BDef}
+
+Note that the value of abscissa or ordinate are transformed to the \texttt{User coordinate},
+and then put into the stack of \PS, so they can be used to do some compound arithmetic
+without concerned the \texttt{xunit} and \texttt{yunit} in the \PST{} \texttt{SpecialCoor}
+function. You need the other third package to do float arithmetic operation,
+like \Lcs{pscalculate} \footnote{Provided by package \texttt{pst-calculate},
+sometimes it results the numbers more than 9 fraction digits,
+which are not supported good by \PST\space with '! number too big' issue.} to generate the numerical values,
+or the expandable command \Lcs{fpeval}\footnote{Provided by package \texttt{xfp},
+it can truncate the fraction part digits using the \texttt{trunc} function perfectly,
+e.g. \texttt{\textbackslash{}fpeval\{trunc(18/7,3)\}}.} to get a purely numerical result,
+
+The macro \Lcs{pstMoveNode} use them to move node $A$ by abscissa increment $dx$
+and ordinate increment $dy$ to get the target node $B$.
+
+\begin{BDef}
+\Lcs{pstMoveNode}\OptArgs($dx$,\kern 1pt$dy$)\Largb{$A$}\Largb{$B$}
+\end{BDef}
+
+for example:
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\def\ra{3.0}\def\rb{4.0}
+\pstGeonode[PosAngle=-90](1.0,1.5){A}
+\pstGeonode[PosAngle=90](! \pstAbscissa{A} 1 add \pstOrdinate{A} 2 add){B}
+\pstLineAB[linecolor=blue]{A}{B}
+\pstMoveNode[PosAngle=-90,PointSymbol=asterisk](3,2){A}{C}
+\pstLineAB[linecolor=red]{A}{C}
+\pstMoveNode[PosAngle=-90,PointSymbol=diamond](\pscalculate{sqrt(\ra*\ra+\rb*\rb)/2},\pscalculate{\ra*\rb/(2*(\ra+\rb))}){A}{D}
+\pstLineAB[linecolor=cyan]{A}{D}
+\pstMoveNode[PosAngle=-90](\pstAbscissa{B} 3 div,\pstOrdinate{B} neg 3 div){D}{E}
+\pstLineAB[linecolor=green]{A}{E}
+\end{pspicture}
+\end{LTXexample}
+
%\subsubsection{User defined axes}
-\Lcs{pstOIJGeonode} creates a list of points in the landmark $(O;I;J)$. Possible
+\Lcs{pstOIJGeonode} creates a list of points in the landmark $(O;I;J)$. Possible
parameters are \Lkeyword{PointName}, \Lkeyword{PointNameSep}, \Lkeyword{PosAngle},
- \Lkeyword{PointSymbol}, and \Lkeyword{PtNameMath}.
+\Lkeyword{PointSymbol}, and \Lkeyword{PtNameMath}.
+
\begin{BDef}
\Lcs{pstOIJGeonode}\OptArgs\coord1\Largb{$A_1$}\Largb{$O$}\Largb{$I$}\Largb{$J$}
\coord2\Largb{$A_2$}\ldots\cAny\Largb{$A_n$}
\end{BDef}
-\clearpage
-
-
\begin{LTXexample}[width=5.6cm,pos=l]
\psset{unit=.7}
\begin{pspicture*}[showgrid=true](-4,-4)(4,4)
@@ -268,7 +313,7 @@ Several commands are predefined for marking the segment:
The three commands of the family \Lkeyval{MarkHash} draw a line whose inclination is
controled by the parameter \Lkeyword{MarkAngle} (default is 45). Their width and colour
-depends of the width and color of the line when the drawing is done, ass shown is the
+depends of the width and color of the line when the drawing is done, as shown is the
next example.
@@ -277,12 +322,12 @@ next example.
\begin{pspicture}[showgrid=true](-2,-2)(2,2)
\rput{18}{%
\pstGeonode[PosAngle={0,90,180,-90}](2,0){A}(2;72){B}
- (2;144){C}(2;216){D}(2;288){E}}
- \pstSegmentMark{A}{B}
+ (2;144){C}(2;216){D}(2;288){E}}
+ \pstSegmentMark[SegmentSymbol=none]{A}{B}
\pstSegmentMark[linecolor=green]{B}{C}
\psset{linewidth=2\pslinewidth}
\pstSegmentMark[linewidth=2\pslinewidth]{C}{D}
- \pstSegmentMark{D}{E}
+ \pstSegmentMark[MarkAngle=90]{D}{E}
\pstSegmentMark{E}{A}
\end{pspicture}
\end{LTXexample}
@@ -294,18 +339,16 @@ The length and the separation of multiple hases can be set by \Lkeyword{MarkHash
\subsection{Triangles}
-The more classical figure, it has its own macro for a quick definition:
+The more classical figure, it has its own macro \Lcs{pstTriangle} for a quick definition:
\begin{BDef}
-\Lcs{pstTriangle}\OptArgs\coord1\Largb{A}\coord2\Largb{B}\coord3\Largb{C}\\
-\Lcs{pstTriangleIC}\OptArgs\Largb{A}\Largb{B}\Largb{C}\\
-\Lcs{pstTriangleOC}\OptArgs\Largb{A}\Largb{B}\Largb{C}
+\Lcs{pstTriangle}\OptArgs\coord1\Largb{A}\coord2\Largb{B}\coord3\Largb{C}
\end{BDef}
\begin{sloppypar}
Valid optional arguments are \Lkeyword{PointName},
- \Lkeyword{PointNameSep}, %\Lkeyword{PosAngle},
+ \Lkeyword{PointNameSep}, %\Lkeyword{PosAngle},
\Lkeyword{PointSymbol}, \Lkeyword{PointNameA},
\Lkeyword{PosAngleA}, \Lkeyword{PointSymbolA}, \Lkeyword{PointNameB},
\Lkeyword{PosAngleB}, \Lkeyword{PointSymbolB}, \Lkeyword{PointNameC},
@@ -326,6 +369,14 @@ for each points: \Lkeyword{PointSymbolA}, \Lkeyword{PointSymbolB} and
\Lkeyword{PointSymbol}. The management of the default value followed the
same rule.
+The macros \Lcs{pstTriangleIC} and \Lcs{pstTriangleOC} are used to draw the inner circle
+and outer circle of triangle $ABC$.
+
+\begin{BDef}
+\Lcs{pstTriangleIC}\OptArgs\Largb{A}\Largb{B}\Largb{C}\OptArg{I}\OptArg{H}\\
+\Lcs{pstTriangleOC}\OptArgs\Largb{A}\Largb{B}\Largb{C}\OptArg{O}
+\end{BDef}
+
\begin{LTXexample}[width=5cm,pos=l]
\begin{pspicture}[showgrid](-2,-2)(2,2)
\pstTriangle[PointSymbol=square,PointSymbolC=o,
@@ -336,9 +387,19 @@ same rule.
\end{pspicture}
\end{LTXexample}
-The center of the inner circle is called \verb|IC_O| and the outer circle \verb|OC_O|. They are
-only defined, if the macros \Lcs{pstTriangleIC} and \Lcs{pstTriangleOC} are used.
+The center of the inner circle is called \verb|IC_O| as default and the outer circle \verb|OC_O| as default,
+but you can change the node names by the optional parameters \OptArg{I} \OptArg{H} and \OptArg{O}.
+The optional node name $H$ is a node on the inner circle,
+so you can operate the inner circle by center $I$ and node $H$ later.
+The inner center $I$, node $H$ and outer circle center $O$ are not printed out as default,
+but you can setup \Lkeyword{PointSymbol} and \Lkeyword{PointName} to display them.
+For example:
+
+\begin{lstlisting}
+\pstTriangleIC[PosAngle={-90,160},PointName={I,none},PointSymbol={*,none}]{A}{B}{C}[I][D]
+\pstTriangleOC[PosAngle=90,PointSymbol=*,PointName=X]{A}{B}{C}[X]
+\end{lstlisting}
\subsection{Angles}
@@ -379,7 +440,7 @@ For other angles, there is the command:
\begin{sloppypar}
-Valid optional arguments are \Lkeyword{MarkAngleRadius}, \Lkeyword{LabelAngleOffset},
+Valid optional arguments are \Lkeyword{MarkAngleRadius}, \Lkeyword{LabelAngleOffset},
\Lkeyword{MarkAngleType} and
\Lkeyword{Mark}
%
@@ -415,18 +476,18 @@ the angle by specifying a \TeX{} command as argument of parameter \Lkeyword{Mark
\psset{PointSymbol=none,PointNameMathSize=\scriptstyle,PointNameSep=6pt,
RightAngleSize=0.15,PosAngle={135,225,-45,45}}
\pstGeonode(1,2){A}(1,1){B}(2,1){C}(2,2){D}%
-\pstRightAngle[fillstyle=solid,fillcolor=blue!40]{C}{B}{A}
-\pstRightAngle{D}{C}{B} \pstRightAngle{A}{D}{C}
+\pstRightAngle[fillstyle=solid,fillcolor=blue!40]{C}{B}{A}
+\pstRightAngle{D}{C}{B} \pstRightAngle{A}{D}{C}
\pstRightAngle{B}{A}{D} \pspolygon(A)(B)(C)(D)
\psset{RightAngleType=suisseromand}
\pstGeonode(3,2){A}(3,1){B}(4,1){C}(4,2){D}%
-\pstRightAngle[fillstyle=solid,fillcolor=blue!40]{C}{B}{A}
-\pstRightAngle{D}{C}{B} \pstRightAngle{A}{D}{C}
+\pstRightAngle[fillstyle=solid,fillcolor=blue!40]{C}{B}{A}
+\pstRightAngle{D}{C}{B} \pstRightAngle{A}{D}{C}
\pstRightAngle{B}{A}{D} \pspolygon(A)(B)(C)(D)
\psset{RightAngleType=german}
\pstGeonode(5,2){A}(5,1){B}(6,1){C}(6,2){D}%
-\pstRightAngle[fillstyle=solid,fillcolor=blue!40]{C}{B}{A}
-\pstRightAngle{D}{C}{B} \pstRightAngle{A}{D}{C}
+\pstRightAngle[fillstyle=solid,fillcolor=blue!40]{C}{B}{A}
+\pstRightAngle{D}{C}{B} \pstRightAngle{A}{D}{C}
\pstRightAngle{B}{A}{D} \pspolygon(A)(B)(C)(D)
\end{pspicture}
\end{LTXexample}
@@ -469,34 +530,87 @@ parameters is equal to 0.
\begin{LTXexample}[width=5cm,pos=l]
\begin{pspicture}[showgrid](-2,-2)(2,2)
\pstGeonode(1,1){A}(-1,-1){B}
-\pstLineAB[nodesepA=-.4,nodesepB=-1,
+\pstLineAB[nodesepA=-.4,nodesepB=-1,
linecolor=green]{A}{B}
\pstLineAB[nodesep=.4,linecolor=red]{A}{B}
\end{pspicture}
\end{LTXexample}
+The macro \Lcs{pstLine} draws a new line with two nodes, or two coordinates
+or one node and one coordinate. This macro is similar with \Lcs{pstLineAB},
+but more compatible.
+
+\begin{BDef}
+\Lcs{pstLine}\OptArgs\Largb{A}\Largb{B}\\
+\Lcs{pstLine}\OptArgs\Largb{A}\cAny\\
+\Lcs{pstLine}\OptArgs\cAny\Largb{B}\\
+\Lcs{pstLine}\OptArgs\cAny\cAny
+\end{BDef}
+
+The macros \Lcs{pstLineAA} and \Lcs{pstLineAS} draw a new line with one node,
+the slope \texttt{angle} between the line and the horizontal axis, or the
+slope \texttt{gradient} of the line, and create a new node $B$ on the line.
+
+\begin{BDef}
+\Lcs{pstLineAA}\OptArgs\Largb{A}\Largb{angle}\Largb{B}\\
+\Lcs{pstLineAA}\OptArgs\cAny\Largb{angle}\Largb{B}\\
+\Lcs{pstLineAS}\OptArgs\Largb{A}\Largb{gradient}\Largb{B}\\
+\Lcs{pstLineAS}\OptArgs\cAny\Largb{gradient}\Largb{B}
+\end{BDef}
+
+Here are some examples:
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\pstGeonode[PosAngle=90](1.5,1.5){A}
+% draw a line with angle atan(2/1), about 63.43 degree.
+\pstLineAA[linecolor=red,nodesep=-0.5,PosAngle=90]{A}{2 1 atan}{B}
+\pstLineAA[linecolor=yellow,nodesep=-0.5,PosAngle=-120]{A}{-45}{C}
+\pstLineAS[linecolor=green,nodesep=-0.5,PosAngle=30]{A}{-0.5}{D}
+% draw a line with gradient (cos50/sin50).
+\pstLineAS[linecolor=cyan,nodesep=-0.5]{A}{50 cos 50 sin div}{E}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstLineAbsNode} creates a new node $C$ whose abscissa
+is the given value $x_1$ on the line $AB$. The macro \Lcs{pstLineOrdNode} creates a new node $C$ whose ordinate is the given value $y_1$ on the line $AB$.
+You can input $x_1$ or $y_1$ as any number(e.g, 2.0),
+or use \Lcs{pscalculate} or \Lcs{fpeval} to get a purely numerical result,
+or use \Lcs{pstAbscissa} and \Lcs{pstOrdinate} to get the abscissa and ordinate of any other node.
+\begin{BDef}
+\Lcs{pstLineAbsNode}\OptArgs\Largb{A}\Largb{B}\Largb{$x_1$}\Largb{C}\\
+\Lcs{pstLineOrdNode}\OptArgs\Largb{A}\Largb{B}\Largb{$y_1$}\Largb{C}
+\end{BDef}
+For example,
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\pstGeonode[PosAngle=-40](0.8,0.5){A}
+\pstGeonode[PosAngle=-40](1.2,1.0){B}
+\pstLineAB[linecolor=red,nodesep=-0.5]{A}{B}
+\pstLineAbsNode[PosAngle=-40,PointSymbol=o]{A}{B}{2.5}{C}
+\pstLineOrdNode[PosAngle=-40,PointSymbol=o]{A}{B}{3.0}{D}
+\pstLineAB[linecolor=blue,nodesep=-0.5]{C}{D}
+\end{pspicture}
+\end{LTXexample}
- \subsection{Circles}
+\subsection{Circles}
A circle can be defined either with its center and a point of its
circumference, or with two diameterly opposed points. There is two
commands :
-
\begin{BDef}
-\Lcs{pstCircleOA}\OptArgs\Largb{O}\Largb{A}\\
-\Lcs{pstCircleAB}\OptArgs\Largb{O}\Largb{A}\\
-\Lcs{pstDistAB}\OptArgs\Largb{A}\Largb{B}\\
-\Lcs{pstDistVal}\OptArgs\Largb{x}
+\Lcs{pstCircleOA}\OptArgs\Largb{O}\Largb{A}\OptArg{angleA}\OptArg{angleB}\\
+\Lcs{pstCircleAB}\OptArgs\Largb{O}\Largb{A}\OptArg{angleA}\OptArg{angleB}
\end{BDef}
-%\Lcs{pstCircleOA} draws the circle of center $O$ crossing $A$. Possible options are \Lkeyword{Radius} and
-% \Lkeyword{Diameter}.
-
-%\Lcs{pstCircleAB} draws the circle of diameter $AB$ with the same options.
+\Lcs{pstCircleOA} draws the circle of center $O$ crossing $A$ from \Lkeyword{angleA} to \Lkeyword{angleB}, going counter clockwise.
+Possible options are \Lkeyword{Radius} and \Lkeyword{Diameter}.
+
+\Lcs{pstCircleAB} draws the circle of diameter $AB$ with the same options.
For the first macro, it is possible to omit the second point and then
@@ -504,12 +618,16 @@ to specify a radius or a diameter using the parameters \Lkeyword{Radius}
and \Lkeyword{Diameter}. The values of these parameters must be specified
with one of the two following macros :
+\begin{BDef}
+\Lcs{pstDistAB}\OptArgs\Largb{A}\Largb{B}\\
+\Lcs{pstDistVal}\OptArgs\Largb{x}
+\end{BDef}
+
%\Lcs{pstDistAB} Specifies distance $AB$ for the parameters
% \Lkeyword{Radius}, \Lkeyword{Diameter} and \Lkeyword{DistCoef}.
-
+%
%\Lcs{pstDistVal} Specifies a numerical value for the parameters
% \Lkeyword{Radius}, \Lkeyword{Diameter}, and \Lkeyword{DistCoef}.
-
The first specifies a distance between two points. The parameter
\Lkeyword{DistCoef} can be used to specify a coefficient to reduce or
@@ -529,40 +647,22 @@ We will see later how to draw the circle crossing three points.
\item {\color{RoyalBlue} the circle whose diameter is $BC$.}
\end{compactitem}
-\enlargethispage{3\normalbaselineskip}
-
-\bigskip
-\begin{pspicture}[showgrid](-4,-3.3)(5,3)
-\psset{linewidth=2\pslinewidth}
-\pstGeonode[PosAngle={0,-135,90},PointSymbol={*,*,square}](1,0){A}(-2,-1){B}(0,1){C}
-\pstCircleOA[linecolor=red]{A}{B}
-\pstCircleOA[linecolor=green, DistCoef=2 3 div, Radius=\pstDistAB{A}{C}]{A}{}
-\pstCircleOA[linecolor=blue, Radius=\pstDistAB{B}{C}]{A}{}
-\pstCircleOA[linecolor=Sepia, Radius=\pstDistAB{A}{C}]{B}{}
-\pstCircleOA[linecolor=Aquamarine, Diameter=\pstDistAB{A}{C}]{B}{}
-\pstCircleAB[linecolor=RoyalBlue]{B}{C}
-\end{pspicture}
-
-
\clearpage
-\begin{lstlisting}
-\begin{pspicture}[showgrid](-4,-4)(5,3)
+\begin{LTXexample}[width=\linewidth,pos=t]
+\begin{pspicture}[showgrid](-4,-3.3)(4,3)
\psset{linewidth=2\pslinewidth}
\pstGeonode[PosAngle={0,-135,90},PointSymbol={*,*,square}](1,0){A}(-2,-1){B}(0,1){C}
\pstCircleOA[linecolor=red]{A}{B}
\pstCircleOA[linecolor=green, DistCoef=2 3 div, Radius=\pstDistAB{A}{C}]{A}{}
-\pstCircleOA[linecolor=blue, Radius=\pstDistAB{B}{C}]{A}{}
+\pstCircleOA[linecolor=blue, Radius=\pstDistAB{B}{C}]{A}{}[45][270]
\pstCircleOA[linecolor=Sepia, Radius=\pstDistAB{A}{C}]{B}{}
-\pstCircleOA[linecolor=Aquamarine, Diameter=\pstDistAB{A}{C}]{B}{}
+\pstCircleOA[linecolor=Aquamarine, Diameter=\pstDistAB{A}{C}]{B}{}[80][320]
\pstCircleAB[linecolor=RoyalBlue]{B}{C}
\end{pspicture}
-\end{lstlisting}
-
-
- \subsection{Circle arcs}
-
+\end{LTXexample}
+\subsection{Circle arcs}
\begin{BDef}
\Lcs{pstArcOAB}\OptArgs\Largb{O}\Largb{A}\Largb{B}\\
@@ -588,11 +688,77 @@ two points are at the same distance of $O$.
\end{pspicture}
\end{LTXexample}
-\subsection{Curved abscissa}
+\subsection{Circle tangent}
-A point can be positioned on a circle using its curved abscissa.
+The macro \Lcs{pstCircleTangentLine} is used to draw a tangent line $AT$ from a point $A$ on the circle,
+and the macro \Lcs{pstCircleTangentNode} is used to draw the tangent points $T_1$ and $T_2$ from a point $P$ out of the circle.
+\begin{BDef}
+\Lcs{pstCircleTangentLine}\OptArgs\Largb{O}\Largb{A}\Largb{T}\\
+\Lcs{pstCircleTangentNode}\OptArgs\Largb{O}\Largb{A}\Largb{P}\Largb{T1}\Largb{T2}
+\end{BDef}
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\psset{nodesep=-0.8}
+\pstGeonode[PosAngle={90,120,-30}](1,1){O}(-1,0){T}(3,0){S}
+\pstCircleOA[Radius=\pstDistVal{1.5},linecolor=red]{O}{}
+\pstCircleRotNode[Radius=\pstDistVal{1.5},PosAngle=-30,RotAngle=-30]{O}{}{A}
+\pstCircleTangentLine[PosAngle=-10,PointName=A_1]{O}{A}{A1}
+\pstCircleRotNode[Radius=\pstDistVal{1.5},PosAngle=90,RotAngle=90]{O}{}{B}
+\pstCircleTangentLine[PosAngle=90,PointName=B_1]{O}{B}{B1}
+\pstCircleTangentNode[Radius=\pstDistVal{1.5},PosAngle={150,90},PointName={T_1,T_2}]{O}{}{T}{T1}{T2}
+\pstCircleTangentNode[PosAngle={80,200},PointName={S_1,S_2}]{O}{A}{S}{S1}{S2}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstCircleExternalCommonTangent} is used to find the external common tangent lines of two circle $A(O_1)$ and $B(O_2)$,
+and the macro \Lcs{pstCircleInternalCommonTangent} is used to find the internal common tangent lines of two circle $A(O_1)$ and $B(O_2)$.
+They both create four tangent point nodes $T_1,T_2,T_3,T_4$, where $T_1,T_2$ lie on circle $A(O_1)$, and $T_3,T_4$ lie on circle $B(O_2)$.
+
+\begin{BDef}
+\Lcs{pstCircleExternalCommonTangent}\OptArgs\Largb{$O_1$}\Largb{A}\Largb{$O_2$}\Largb{B}\Largb{$T_1$}\Largb{$T_2$}\Largb{$T_3$}\Largb{$T_4$}\\
+\Lcs{pstCircleInternalCommonTangent}\OptArgs\Largb{$O_1$}\Largb{A}\Largb{$O_2$}\Largb{B}\Largb{$T_1$}\Largb{$T_2$}\Largb{$T_3$}\Largb{$T_4$}
+\end{BDef}
+
+You can use \Lkeyword{RadiusA} and \Lkeyword{RadiusB} to define the two circles like as following:
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-2)(3,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\pstGeonode[PosAngle=-90](-1,0){O1}
+\pstGeonode[PosAngle=-60](1.5,1.5){O2}
+\pstCircleOA[Radius=\pstDistVal{2},linecolor=red]{O1}{}
+\pstCircleOA[Radius=\pstDistVal{1},linecolor=blue]{O2}{}
+\pstCircleExternalCommonTangent[RadiusA=\pstDistVal{2},RadiusB=\pstDistVal{1},PosAngle={90,-60,90,-60}]{O1}{}{O2}{}{P}{Q}{R}{S}
+\pstLine[nodesep=-1]{P}{R}
+\pstLine[nodesep=-1]{Q}{S}
+\pstCircleInternalCommonTangent[RadiusA=\pstDistVal{2},RadiusB=\pstDistVal{1},PosAngle={120,60,120,60}]{O1}{}{O2}{}{H}{I}{J}{K}
+\pstLine[nodesep=-1]{H}{J}
+\pstLine[nodesep=-1]{I}{K}
+\end{pspicture}
+\end{LTXexample}
+
+You also can use \Lkeyword{DiameterA} and \Lkeyword{DiameterB} to define the two circles like as following:
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-2)(3,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\pstGeonode[PosAngle=-90](-1,0){O1}
+\pstGeonode[PosAngle=-60](1.5,1.5){O2}
+\pstCircleOA[Diameter=\pstDistVal{3},linecolor=red]{O1}{}
+\pstCircleOA[Diameter=\pstDistVal{2},linecolor=blue]{O2}{}
+\pstCircleExternalCommonTangent[DiameterA=\pstDistVal{3},DiameterB=\pstDistVal{2},PosAngle={100,-60,90,-60}]{O1}{}{O2}{}{P}{Q}{R}{S}
+\pstLine[nodesep=-1]{P}{R}
+\pstLine[nodesep=-1]{Q}{S}
+\pstCircleInternalCommonTangent[DiameterA=\pstDistVal{3},DiameterB=\pstDistVal{2},PosAngle={80,-60,-90,140}]{O1}{}{O2}{}{H}{I}{J}{K}
+\pstLine[nodesep=-1]{H}{J}
+\pstLine[nodesep=-1]{I}{K}
+\end{pspicture}
+\end{LTXexample}
+
+\subsection{Curved abscissa}
+
+A point can be positioned on a circle using its curved abscissa.
\begin{BDef}
@@ -623,6 +789,55 @@ automatically in oirder to be alined with the circle center and the point.
\end{pspicture}
\end{LTXexample}
+
+A point can be positioned on a circle using its absolute abscissa or ordinate too.
+You can input $x_1$ or $y_1$ as any number(e.g, 2.0), or use \Lcs{pscalculate} or \Lcs{fpeval} to generate the value,
+or use \Lcs{pstAbscissa} and \Lcs{pstOrdinate} to get the abscissa and ordinate of any other node.
+
+\begin{BDef}
+\Lcs{pstCircleAbsNode}\OptArgs\Largb{O}\Largb{A}\Largb{$x_1$}\Largb{C}\Largb{C}\\
+\Lcs{pstCircleOrdNode}\OptArgs\Largb{O}\Largb{A}\Largb{$y_1$}\Largb{C}\Largb{C}
+\end{BDef}
+
+for example,
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-1,-1)(4,4)
+\pstGeonode[PosAngle=60](1.5,1.5){O}
+\pstGeonode[PosAngle=-30](2.5,0){A}
+\pstCircleOA[linecolor=red]{O}{A}
+\pstCircleAbsNode[PosAngleA=-60,PosAngleB=60,PointSymbol=*]{O}{A}{1.0}{C}{D}
+\pstCircleOrdNode[PosAngleA=150,PosAngleB=30,PointSymbol=*]{O}{A}{1.0}{E}{F}
+\pstLineAB[linestyle=dashed,linecolor=gray!40,nodesep=-0.5]{C}{D}
+\pstLineAB[linestyle=dashed,linecolor=gray!40,nodesep=-0.5]{E}{F}
+\end{pspicture}
+\end{LTXexample}
+
+A point can be positioned on a circle using its rotation angle by macro \Lcs{pstCircleRotNode}.
+The rotation angle should be passed by the \Lkeyword{RotAngle} in the \texttt{Options}.
+The circle is defined by center $O$ and point $A$ on the circle or \Lkeyword{Radius} in parameter.
+If you not set \Lkeyword{RotAngle}, the default value is $60^\circ$.
+
+\begin{BDef}
+\Lcs{pstCircleRotNode}\OptArgs\Largb{O}\Largb{A}\Largb{X}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-1,-1)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\psset{Radius=\pstDistVal{2.0}}
+\pstGeonode[PosAngle=0](1.5,1.5){O}
+\pstCircleOA[linecolor=red]{O}{}
+\pstCircleRotNode[PosAngle=0,RotAngle=0]{O}{}{A}
+\pstCircleRotNode[PosAngle=60]{O}{}{B} % default 60 degree
+\pstCircleRotNode[PosAngle=90,RotAngle=90]{O}{}{C}
+\pstCircleRotNode[PosAngle=150,RotAngle=\pscalculate{3*360/7}]{O}{}{D}
+\pstCircleRotNode[PosAngle=180,RotAngle=180]{O}{}{E}
+\pstCircleRotNode[PosAngle=230,RotAngle=230]{O}{}{F}
+\pstCircleRotNode[PosAngle=270,RotAngle=270]{O}{}{G}
+\pstCircleRotNode[PosAngle=-45,RotAngle=-45]{O}{}{H}
+\end{pspicture}
+\end{LTXexample}
+
\subsection{Generic curve}
It is possible to generate a set of points using a loop, and to give
@@ -658,6 +873,1871 @@ used to modify the increment from a point to the next one
\end{pspicture}
\end{LTXexample}
+\section{Conics}
+\subsection{Standard Ellipse}
+The Standard Ellipse $E$ with coordinate translation is defined by center $O(x_0,y_0)$,
+the half of the major axis $max(abs(a),abs(b))$, the half of the minor axis $min(abs(a),abs(b))$,
+the equation as following:
+\begin{equation}\label{FunctionOfStandardEllipse}
+\dfrac{(x-x_0)^2}{a^2}+\dfrac{(y-y_0)^2}{b^2}=1
+\end{equation}
+Sometimes we use the parametric function of the Standard Ellipse with coordinate translation:
+\begin{equation}\label{ParametricFunctionOfEllipse}
+\left\{\begin{array}{l}
+x=a\cos\alpha+x_0\\
+y=b\sin\alpha+y_0
+\end{array}\right.
+\end{equation}
+
+The Macro \Lcs{pstEllipse} is used to draw a Standard Ellipse with center $O$ from
+\Lkeyword{angleA} to \Lkeyword{angleB}, going counter clockwise.
+It combines the function like \Lcs{psellipse} and \Lcs{psellipticarc} in \PST.
+If \Lkeyword{angleA} and \Lkeyword{angleB} are not specified,
+the macro will draw the whole ellipse.
+
+\begin{BDef}
+\Lcs{pstEllipse}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{angleA}\OptArg{angleB}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\ra{2.4}\def\rb{0.8}\def\rot{56}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](2,2){O}
+%\psellipse[linecolor=red!60](O)(\ra,\rb)
+\pstEllipse[linecolor=red!60](O)(\ra,\rb)[0][120]
+\pstEllipse[linecolor=green!60,linestyle=dashed,arrows=->,arrowscale=1.2](O)(\ra,\rb)[120][200]
+\pstEllipse[linecolor=blue!60](O)(\ra,\rb)[200][300]
+\pstEllipse[linecolor=purple!60,linestyle=dashed,arrows=->,arrowscale=1.2](O)(\ra,\rb)[300][360]
+\pstEllipse[linecolor=cyan!60](O)(\rb,\ra)
+\end{pspicture}
+\end{LTXexample}
+
+Now you can draw some points on this Ellipse using macro \Lcs{pstEllipseNode} or \Lcs{pstEllipseRotNode}.
+The macro \Lcs{pstEllipseNode} requires an explicit parameter $t$ as $\alpha$ in equation (\ref{ParametricFunctionOfEllipse})
+to calculate the point; but the macro \Lcs{pstEllipseRotNode} requires an implicit parameter \Lkeyword{RotAngle}
+as $\alpha$ in equation (\ref{ParametricFunctionOfEllipse}) to calculate the point.
+
+\begin{BDef}
+\Lcs{pstEllipseNode}\OptArgs\Largr{O}\Largr{$a,b$}\Largb{$t$}\Largb{P}\\
+\Lcs{pstEllipseRotNode}\OptArgs\Largr{O}\Largr{$a,b$}\Largb{P}
+\end{BDef}
+
+The following is the example, note that the \Lkeyword{RotAngle} is not $\angle{HOX}$ in geometrical,
+but $\angle{HOA}$ or $\angle{HOB}$.
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\ra{2.4}\def\rb{0.8}\def\rot{56}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](2,2){O}
+%\psellipse[linecolor=red!60](O)(\ra,\rb)
+\pstEllipse[linecolor=red!60](O)(\ra,\rb)
+\pstEllipseNode[PosAngle=180](O)(\ra,\rb){180}{P}
+\pstEllipseRotNode[PosAngle=0,RotAngle=0](O)(\ra,\rb){Q}
+\pstEllipseRotNode[PosAngle=90,RotAngle=90](O)(\ra,\rb){M}
+\pstEllipseRotNode[PosAngle=-90,RotAngle=-90](O)(\ra,\rb){N}
+\pstCircleOA[linecolor=blue!60,Radius=\pstDistVal{\ra}]{O}{}
+\pstCircleRotNode[PosAngle=\rot,RotAngle=\rot,Radius=\pstDistVal{\ra}]{O}{}{A}
+\pstCircleOA[linecolor=green!60,Radius=\pstDistVal{\rb}]{O}{}
+\pstCircleRotNode[PosAngle=180,RotAngle=\rot,Radius=\pstDistVal{\rb}]{O}{}{B}
+\pstEllipseRotNode[PosAngle=30,RotAngle=\rot](O)(\ra,\rb){X}
+\pstProjection[PosAngle=-90]{P}{Q}{A}[H]
+\pstLineAB[linestyle=dashed]{A}{O}
+\pstLineAB[linestyle=dashed]{A}{H}
+\pstLineAB[linestyle=dashed]{B}{X}
+\pstLineAB[linestyle=dashed]{O}{H}
+\pstMarkAngle[LabelSep=.6,MarkAngleRadius=.3,MarkAngleType=double,fillcolor=red!30,fillstyle=solid]{H}{O}{A}{$\rot^\circ$}
+\end{pspicture}
+\end{LTXexample}
+
+The macros \Lcs{pstEllipseAbsNode} and \Lcs{pstEllipseOrdNode} are used to get the two nodes $A$ and $B$
+whose abscissas or ordinates are the given value $x_1$ or $y_1$ on the Standard Ellipse $E$.
+
+If there is no such point satisfied this condition, then the nodes $A$ and $B$ will be put at the origin.
+
+\begin{BDef}
+\Lcs{pstEllipseAbsNode}\OptArgs\Largr{O}\Largr{$a,b$}\Largb{$x_1$}\Largb{A}\Largb{B}\\
+\Lcs{pstEllipseOrdNode}\OptArgs\Largr{O}\Largr{$a,b$}\Largb{$y_1$}\Largb{A}\Largb{B}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\ra{2.0}\def\rb{-1.2}
+\pstGeonode[PosAngle=-50,PointNameSep=0.2](2,2){O}
+\pstEllipse[linecolor=red!40](O)(\ra,\rb)
+\pstEllipse[linecolor=blue!40](O)(\rb,\ra)
+\pstEllipseAbsNode[PosAngle={120,200}](O)(\ra,\rb){2.5}{A}{B}
+\pstEllipseAbsNode(O)(\ra,\rb){6}{X}{Y} % not exist
+\pstEllipseOrdNode(O)(\ra,\rb){2.5}{A'}{B'}
+\pstEllipseOrdNode(O)(\ra,\rb){6}{X'}{Y'} % not exist
+\end{pspicture}
+\end{LTXexample}
+
+Here we find the focus node of Standard Ellipse! Please use macro \Lcs{pstEllipseFocusNode} to do this work.
+
+\begin{BDef}
+\Lcs{pstEllipseFocusNode}\OptArgs\Largr{O}\Largr{$a,b$}\Largb{A}\Largb{B}
+\end{BDef}
+
+For example:
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\ra{2.0}\def\rb{-1.2}
+\pstGeonode[PosAngle=-50,PointNameSep=0.2](2,2){O}
+\pstEllipse[linecolor=red!40](O)(\ra,\rb)
+\pstEllipse[linecolor=blue!40](O)(\rb,\ra)
+\pstEllipseFocusNode(O)(\ra,\rb){L}{R}
+\pstEllipseFocusNode(O)(\rb,\ra){D}{U}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstEllipseDirectrixLine} is used to draw the two directrix lines of Standard Ellipse,
+and create two new nodes on each of them. The nodes $L_x$, $L_y$ are on the left/down directrix line,
+and $R_x$, $R_y$ are on the right/up directrix line. They are lie on the tangent line of the vertex
+on the other axis.
+
+\begin{BDef}
+\Lcs{pstEllipseDirectrixLine}\OptArgs\Largr{O}\Largr{$a,b$}\Largb{$L_x$}\Largb{$L_y$}\Largb{$R_x$}\Largb{$R_y$}
+\end{BDef}
+
+For example:
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\ra{2.0}\def\rb{-1.2}
+\pstGeonode[PosAngle=-50,PointNameSep=0.2](2,2){O}
+\pstEllipse[linecolor=red!40](O)(\ra,\rb)
+\pstEllipse[linecolor=blue!40](O)(\rb,\ra)
+\pstEllipseDirectrixLine[PointName={L_x,L_y,R_x,R_y},PosAngle={210,210,-30,-30},nodesep=-1,linecolor=red!40](O)(\ra,\rb){Lx}{Ly}{Rx}{Ry}
+\pstEllipseDirectrixLine[PointName={D_x,D_y,U_x,U_y},PosAngle={-30,-30,30,30},nodesep=-1,linecolor=blue!40](O)(\rb,\ra){Dx}{Dy}{Ux}{Uy}
+\pstLine[nodesep=-0.5,linecolor=black!40,linestyle=dashed]{Lx}{Rx}
+\pstLine[nodesep=-0.5,linecolor=black!40,linestyle=dashed]{Ly}{Ry}
+\pstLine[nodesep=-0.5,linecolor=black!40,linestyle=dashed]{Dx}{Ux}
+\pstLine[nodesep=-0.5,linecolor=black!40,linestyle=dashed]{Dy}{Uy}
+\end{pspicture}
+\end{LTXexample}
+
+Sometimes we need to find the intersection of Ellipse and line,
+the Macro \Lcs{pstEllipseLineInter} can do this work, and it can handle any type of line,
+i.e, horizontal, vertical or others lines. It get the two intersection $C$ and $D$ of the
+Standard Ellipse $E$ and the given line $AB$. When there is none intersection,
+$C$ and $D$ are both put at the origin; When there is only on intersection, it will be saved
+at node $C$, and $D$ will be put at the origin.
+
+\begin{BDef}
+\Lcs{pstEllipseLineInter}\OptArgs\Largr{O}\Largr{$a,b$}\Largb{$A$}\Largb{$B$}\Largb{$C$}\Largb{$D$}
+\end{BDef}
+
+Here is examples:
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\ra{2.0}\def\rb{-1.2}
+\pstGeonode[PosAngle=-50,PointNameSep=0.2](2,2){O}
+\pstEllipse[linecolor=red!40](O)(\ra,\rb)
+\pstEllipse[linecolor=blue!40](O)(\rb,\ra)
+\pstLine[nodesep=-0.5,linecolor=black!40,linestyle=dashed]{0,1}{3,4}
+\pstEllipseLineInter[PosAngle={-90,90}](O)(\ra,\rb){0,1}{3,4}{C}{D}
+\pstEllipseLineInter[PosAngle={-90,90}](O)(\rb,\ra){0,1}{3,4}{C'}{D'}
+\pstLine[nodesep=-0.5,linecolor=black!40,linestyle=dashed]{1.5,0}{1.5,4}
+\pstEllipseLineInter[PosAngle={40,60}](O)(\ra,\rb){1.5,0}{1.5,4}{E}{F}
+\pstEllipseLineInter[PosAngle={40,130}](O)(\rb,\ra){1.5,1}{1.5,4}{E'}{F'}
+\pstLine[nodesep=-0.5,linecolor=black!40,linestyle=dashed]{4,2.5}{0,2.5}
+\pstEllipseLineInter[PosAngle={130,50}](O)(\ra,\rb){4,2.5}{0,2.5}{G}{H}
+\pstEllipseLineInter[PosAngle={130,50}](O)(\rb,\ra){4,2.5}{0,2.5}{G'}{H'}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstEllipsePolarNode} is use to draw the tangent line of a point $A$ or $B$
+on the Standard Ellipse. It draws the every tangent line through the point $A$ and $B$ on
+the Standard Ellipse $E$ and get the insection node $T$ of the two tangent lines.
+We call $T$ as the polar point of chord $AB$ as normal.
+
+\begin{BDef}
+\Lcs{pstEllipsePolarNode}\OptArgs\Largr{O}\Largr{$a,b$}\Largb{$A$}\Largb{$B$}\Largb{$T$}
+\end{BDef}
+
+We use the following theorem to find the node $T$:
+\begin{theorem}\label{EllipsePolarPointTheorem}
+Give chord $AB$ on the ellipse, we draw any other two chords $PQ$ and $RS$, $AB$ and $PQ$ intersect at $I$,
+$AQ$ and $BP$ intersect at $X$, $AP$ and $BQ$ intersect at $Y$, we call $XY$ is the polar line of point $I$.
+Also $AB$ and $RS$ intersect at $J$, $AR$ and $BS$ intersect at $M$, $AS$ and $BR$ intersect at $N$,
+we call $MN$ is the polar line of point $J$. Then the intersection $T$ of $XY$ and $MN$ is the polar point of chord $AB$,
+i.e. $TA$ is the tangent line through $A$ and $TB$ is the tangent line through $B$.
+\end{theorem}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\rb{2.0}\def\ra{-1.2}
+\pstGeonode[PosAngle=-50,PointNameSep=0.2](2,2){O}
+\pstEllipse[linecolor=red!40](O)(\ra,\rb)
+\pstLine[nodesep=-0.8,linecolor=black!40,linestyle=dashed]{1,2}{2.5,3.5}
+\pstEllipseLineInter[PosAngle={-100,90}](O)(\ra,\rb){1,2}{2.5,3.5}{A}{B}
+\pstEllipsePolarNode[PosAngle=120](O)(\ra,\rb){A}{B}{T}
+% Here are the auxiliary lines to explain Theorem 1.
+\pstEllipseRotNode[PosAngle=0,RotAngle=5](O)(\ra,\rb){P}
+\pstEllipseRotNode[PosAngle=-10,RotAngle=-61](O)(\ra,\rb){Q}
+\pstEllipseRotNode[PosAngle=-100,RotAngle=-92](O)(\ra,\rb){R}
+\pstEllipseRotNode[PosAngle=0,RotAngle=-30](O)(\ra,\rb){S}
+\pstInterLL[PosAngle=-90]{A}{Q}{B}{P}{X}
+\pstInterLL[PosAngle=-10]{A}{P}{B}{Q}{Y}
+\pstInterLL[PosAngle=-90]{A}{R}{B}{S}{M}
+\pstInterLL[PosAngle=190]{A}{S}{B}{R}{N}
+\psset{linestyle=dashed,linecolor=gray!40}
+\pstLine{A}{Q}\pstLine{B}{P}\pstLine{A}{P}\pstLine{B}{Q}
+\pstLine{A}{R}\pstLine{B}{S}\pstLine{A}{S}\pstLine{B}{R}
+\pstLine{Q}{X}\pstLine{Q}{Y}\pstLine{P}{X}\pstLine{P}{Y}
+\pstLine{R}{M}\pstLine{S}{M}\pstLine{T}{Y}\pstLine{T}{N}
+\pstLine[linestyle=dashed,linecolor=red!40]{X}{Y}
+\pstLine[linestyle=dashed,linecolor=red!40]{M}{N}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstEllipseTangentNode} is use to draw the tangent line of a point $T$
+out of the Standard Ellipse $E$. It draw the two tangent lines through the point $T$
+to the Standard Ellipse $E$ and get the node $A$ and $B$ on the Ellipse.
+
+\begin{BDef}
+\Lcs{pstEllipseTangentNode}\OptArgs\Largr{O}\Largr{$a,b$}\Largb{$T$}\Largb{$A$}\Largb{$B$}
+\end{BDef}
+
+We use the following theorem to find the tangent node of the given $T$:
+\begin{theorem}\label{EllipseTangentPointTheorem}
+Give point $T$ outside of the ellipse, we draw any other two chords $TPQ$ and $TRS$,
+let $PS$ and $QR$ intersect at $I$, $PR$ and $QS$ intersect at $X$, $XI$ and Ellipse intersect at $A$ and $B$,
+then $TA$ is the tangent line through $A$ and $TB$ is the tangent line through $B$.
+\end{theorem}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\ra{2.0}\def\rb{-1.2}
+\pstGeonode[PosAngle=-50,PointNameSep=0.2](2,2){O}
+\pstEllipse[linecolor=red!40](O)(\ra,\rb)
+\pstGeonode[PosAngle=-50,PointNameSep=0.2](-1,-1){T}
+\pstEllipseTangentNode[PosAngle=120](O)(\ra,\rb){T}{A}{B}
+% Here are the auxiliary lines to explain Theorem 2.
+\pstEllipseRotNode[PointName=none,RotAngle=71](O)(\ra,\rb){P0}
+\pstEllipseRotNode[PointName=none,RotAngle=31](O)(\ra,\rb){R0}
+\pstEllipseLineInter[PosAngle=0](O)(\ra,\rb){T}{P0}{P}{Q}
+\pstEllipseLineInter[PosAngle=0](O)(\ra,\rb){T}{R0}{R}{S}
+\pstInterLL[PosAngle=0]{P}{S}{Q}{R}{I}
+\pstInterLL[PosAngle=0]{P}{R}{Q}{S}{X}
+\psset{linestyle=dashed,linecolor=gray!40}
+\pstLine{T}{P}\pstLine{P}{Q}\pstLine{T}{R}\pstLine{R}{S}
+\pstLine{P}{S}\pstLine{Q}{R}\pstLine{P}{R}\pstLine{Q}{S}
+\end{pspicture}
+\end{LTXexample}
+
+\subsection{General Ellipse}
+Now we will introduce some macros for the General Ellipse as same as the Standard Ellipse.
+The General Ellipse $E$ with coordinate translation and rotation is defined by center $O(x_0,y_0)$,
+the half of the major axis $max(abs(a),abs(b))$, the half of the minor axis $min(abs(a),abs(b))$,
+and the rotation angle $\theta$ of the major axis.
+
+The equation can be got from the parametric function of the ellipse equation (\ref{ParametricFunctionOfEllipse}),
+using the rotation transform formula:
+\begin{equation}\label{RotationTransformFormula}
+\left\{\begin{array}{l}
+x'=x\cos\theta-y\sin\theta\\
+y'=x\sin\theta+y\cos\theta
+\end{array}\right.
+\end{equation}
+then we have
+\begin{equation}
+\left\{\begin{array}{l}
+x'=(a\cos\alpha+x_0)\cos\theta-(b\sin\alpha+y_0)\sin\theta=a\cos\alpha\cos\theta-b\sin\alpha\sin\theta+x_0'\\
+y'=(a\cos\alpha+x_0)\sin\theta+(b\sin\alpha+y_0)\cos\theta=a\cos\alpha\sin\theta+b\sin\alpha\cos\theta+y_0'
+\end{array}\right.
+\end{equation}
+where the $x_0'$ and $y_0'$ are the coordinate of the given center $O$ after rotation.
+So we get the parametric function of the General Ellipse with coordinate translation and rotation as following:
+\begin{equation}\label{ParametricFunctionOfGeneralEllipse}
+\left\{\begin{array}{l}
+x=a\cos\alpha\cos\theta-b\sin\alpha\sin\theta+x_0\\
+y=a\cos\alpha\sin\theta+b\sin\alpha\cos\theta+y_0
+\end{array}\right.
+\end{equation}
+
+The Macro \Lcs{pstGeneralEllipse} is used to draw a General Ellipse with center $O$ from
+\Lkeyword{angleA} to \Lkeyword{angleB}, going counter clockwise.
+If \Lkeyword{angleA} and \Lkeyword{angleB} are not specified,
+the macro will draw the whole ellipse.
+If you not input rotation angle $\theta$, the default value is $0^\circ$,
+at this time, the result of this macro is same as \Lcs{pstEllipse}.
+That is, \Lcs{pstGeneralEllipse} is more complex than \Lcs{pstEllipse}!
+
+\begin{BDef}
+\Lcs{pstGeneralEllipse}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\OptArg{angleA}\OptArg{angleB}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\ra{2.4}\def\rb{-1.5}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](2,2){O}
+\pstGeneralEllipse[linecolor=red!40](O)(\ra,\rb)[0]
+\pstGeneralEllipse[linecolor=gray!10](O)(\ra,\rb)[10]
+\pstGeneralEllipse[linecolor=gray!20](O)(\ra,\rb)[20]
+\pstGeneralEllipse[linecolor=gray!30](O)(\ra,\rb)[30]
+\pstGeneralEllipse[linecolor=gray!40](O)(\ra,\rb)[40]
+\pstGeneralEllipse[linecolor=magenta!40](O)(\ra,\rb)[50]
+\end{pspicture}
+\end{LTXexample}
+
+Similarly, we can location the points on the General Ellipse using the macros
+\Lcs{pstGeneralEllipseNode}, \Lcs{pstGeneralEllipseRotNode}, \Lcs{pstGeneralEllipseAbsNode}
+and \Lcs{pstGeneralEllipseOrdNode} as following.
+
+\begin{BDef}
+\Lcs{pstGeneralEllipseNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$t$}\Largb{A}\\
+\Lcs{pstGeneralEllipseRotNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{A}\\
+\Lcs{pstGeneralEllipseAbsNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$x_1$}\Largb{A}\Largb{B}\\
+\Lcs{pstGeneralEllipseOrdNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$y_1$}\Largb{A}\Largb{B}
+\end{BDef}
+
+Some examples all together:
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\ra{2.4}\def\rb{-1.5}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](2,2){O}
+\pstGeneralEllipse[linecolor=magenta!40](O)(\ra,\rb)[50]
+\pstGeneralEllipseNode[PosAngle=30](O)(\ra,\rb)[50]{30}{A}
+\pstGeneralEllipseRotNode[PosAngle=120,RotAngle=120](O)(\ra,\rb)[50]{B}
+\pstGeneralEllipseRotNode[PosAngle=0,RotAngle=0](O)(\ra,\rb)[50]{C}
+\pstGeneralEllipseRotNode[PosAngle=0,RotAngle=90](O)(\ra,\rb)[50]{D}
+\pstGeneralEllipseRotNode[PosAngle=-90,RotAngle=180](O)(\ra,\rb)[50]{E}
+\pstGeneralEllipseRotNode[PosAngle=90,RotAngle=-90](O)(\ra,\rb)[50]{F}
+\pstGeneralEllipseAbsNode[PosAngle={60,240}](O)(\ra,\rb)[50]{2}{I}{J}
+\pstGeneralEllipseOrdNode[PosAngle={-40,210}](O)(\ra,\rb)[50]{1}{M}{N}
+\pstLineAB[nodesep=-1,linecolor=blue!40]{C}{E}
+\pstLineAB[nodesep=-1,linecolor=blue!40]{D}{F}
+\end{pspicture}
+\end{LTXexample}
+
+Using macro \Lcs{pstGeneralEllipseFocusNode} to find the two focus nodes, and macro \\
+\Lcs{pstGeneralEllipseDirectrixLine} to get the two directrix lines.
+
+\begin{BDef}
+\Lcs{pstGeneralEllipseFocusNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$t$}\Largb{A}\\
+\Lcs{pstGeneralEllipseDirectrixLine}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{A}
+\end{BDef}
+
+for example,
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\ra{2.4}\def\rb{-1.5}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](2,2){O}
+\pstGeneralEllipse[linecolor=magenta!40](O)(\ra,\rb)[50]
+\pstGeneralEllipseFocusNode[PosAngle={-40,-40}](O)(\ra,\rb)[50]{L}{R}
+\pstGeneralEllipseDirectrixLine[PointName={L_x,L_y,R_x,R_y},nodesep=-1,linecolor=magenta](O)(\ra,\rb)[50]{Lx}{Ly}{Rx}{Ry}
+\pstLine[nodesep=-1,linecolor=red!40]{L}{R}
+\pstLine[nodesep=-1,linecolor=red!40,linestyle=dashed]{Lx}{Rx}
+\pstLine[nodesep=-1,linecolor=red!40,linestyle=dashed]{Ly}{Ry}
+\end{pspicture}
+\end{LTXexample}
+
+Using \Lcs{pstGeneralEllipseLineInter} to get the two intersections $C$ and $D$ of the General Ellipse $E$ and the given line $AB$!
+
+\begin{BDef}
+\Lcs{pstGeneralEllipseLineInter}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{A}\Largb{B}\Largb{C}\Largb{D}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\ra{1.5}\def\rb{-2.4}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](2,2){O}
+\pstGeneralEllipse[linecolor=blue!40](O)(\ra,\rb)[50]
+\pstLine[nodesep=-0.5,linecolor=black!40,linestyle=dashed]{0,1}{1.5,4}
+\pstGeneralEllipseLineInter[PosAngle={-90,90}](O)(\ra,\rb)[50]{0,1}{1.5,4}{A}{B}
+\pstLine[nodesep=-0.5,linecolor=black!40,linestyle=dashed]{0,3}{3,3}
+\pstGeneralEllipseLineInter[PosAngle={-90,240}](O)(\ra,\rb)[50]{0,3}{3,3}{C}{D}
+\pstLine[nodesep=-0.5,linecolor=black!40,linestyle=dashed]{1,0}{1,4}
+\pstGeneralEllipseLineInter[PosAngle={30,10}](O)(\ra,\rb)[50]{1,1}{1,4}{E}{F}
+\end{pspicture}
+\end{LTXexample}
+
+Using \Lcs{pstGeneralEllipsePolarNode} to find the polar point $T$ of chord $AB$,
+please refer to Theorem \ref{EllipsePolarPointTheorem}.
+
+\begin{BDef}
+\Lcs{pstGeneralEllipsePolarNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{A}\Largb{B}\Largb{T}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\ra{1.5}\def\rb{-2.4}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](2,2){O}
+\pstGeneralEllipse[linecolor=blue!40](O)(\ra,\rb)[50]
+\pstLine[nodesep=-0.5,linecolor=black!40,linestyle=dashed]{0,1}{1.5,4}
+\pstGeneralEllipseLineInter[PosAngle={-90,90}](O)(\ra,\rb)[50]{0,1}{1.5,4}{A}{B}
+\pstGeneralEllipsePolarNode[PosAngle=90](O)(\ra,\rb)[50]{A}{B}{T}
+\end{pspicture}
+\end{LTXexample}
+
+Using \Lcs{pstGeneralEllipseTangentNode} to find the tangent point $A$ and $B$ of outside point $T$,
+please refer to Theorem \ref{EllipseTangentPointTheorem}.
+
+\begin{BDef}
+\Lcs{pstGeneralEllipseTangentNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{T}\Largb{A}\Largb{B}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,0)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\ra{1.5}\def\rb{-2.4}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](2,2){O}
+\pstGeneralEllipse[linecolor=blue!40](O)(\ra,\rb)[50]
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](-1,-1){P}
+\pstGeneralEllipseTangentNode[PosAngle=90](O)(\ra,\rb)[50]{P}{X}{Y}
+\end{pspicture}
+\end{LTXexample}
+
+\clearpage
+
+\subsection{Standard Parabola}
+The Standard Parabola $P$ with coordinate translation is defined by vertex $O(x_0,y_0)$,
+the half of the focus chord axis $abs(p)$.
+Note that the sign of $p$ indicates the direction of the parabola.
+
+The equation can be written as:
+\begin{equation}\label{FunctionOfStandardParabola}
+(x-x_0)^2=2p(y-y_0)
+\end{equation}
+and the parametric function can be written as:
+\begin{equation}\label{ParametricFunctionOfStandardParabola}
+\left\{\begin{array}{l}
+x=t+x_0\\
+y=\dfrac{t^2}{2p}+y_0
+\end{array}\right.
+\end{equation}
+
+The macro \Lcs{pstParabola} is used to draw a Parabola from $x_1$ to $x_2$ with Vertex $O$,
+the half of the focus chord axis $abs(p)$.
+
+\begin{BDef}
+ \Lcs{pstParabola}\OptArgs\Largr{O}\Largb{$p$}\Largb{$x_1$}\Largb{$x_2$}
+\end{BDef}
+
+The macro \Lcs{pstParabolaNode} is used to draw a node whose parameter is the given value $t$ on parabola,
+please refer to equation (\ref{ParametricFunctionOfStandardParabola}).
+The macro \Lcs{pstParabolaAbsNode} is used to draw a node whose abscissa is the given value $x_1$ on parabola.
+The macro \Lcs{pstParabolaOrdNode} is used to draw a node whose ordinate is the given value $y_1$ on parabola.
+Note that \Lcs{pstParabolaOrdNode} will create two nodes $A$ and $B$ at most time.
+
+\begin{BDef}
+\Lcs{pstParabolaNode}\OptArgs\Largr{O}\Largb{$p$}\Largb{$t$}\Largb{A}\\
+\Lcs{pstParabolaAbsNode}\OptArgs\Largr{O}\Largb{$p$}\Largb{$x_1$}\Largb{A}\\
+\Lcs{pstParabolaOrdNode}\OptArgs\Largr{O}\Largb{$p$}\Largb{$y_1$}\Largb{A}\Largb{B}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-130,PointNameSep=0.2](2,0){O}
+\pstParabola[linecolor=red!40](O){\p}{-1.5}{1.5}
+\pstParabolaNode[PosAngle=-90](O){\p}{1.5}{A}
+\pstParabolaAbsNode[PosAngle=-90,PointName=X_1](O){\p}{1.5}{X1}
+\pstParabolaOrdNode[PosAngle=40,PointName={Y_1,Y_2}](O){\p}{1.5}{Y1}{Y2}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstParabolaFocusNode} is used to find the focus of the parabola,
+and the macro \Lcs{pstParabolaDirectrixLine} is used to find the directrix line of the parabola.
+
+\begin{BDef}
+\Lcs{pstParabolaFocusNode}\OptArgs\Largr{O}\Largb{$p$}\Largb{F}\\
+\Lcs{pstParabolaDirectrixLine}\OptArgs\Largr{O}\Largb{$p$}\Largb{$L_x$}\Largb{$L_y$}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-130,PointNameSep=0.2](2,0){O}
+\pstParabola[linecolor=red!40](O){\p}{-1.5}{1.5}
+\pstParabolaFocusNode[linecolor=red!40,PosAngle=50](O){\p}{F}
+\pstParabolaDirectrixLine[linecolor=red!40,nodesepA=-1.8,nodesepB=-1,PosAngle={-50,-50}](O){\p}{A}{B}
+\pstLine[linecolor=red!40,nodesepA=-0.8,nodesepB=-2.5]{A}{F}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstParabolaLineInter} is used to find the intersections $C$ and $D$ of the parabola and the given line $AB$.
+
+\begin{BDef}
+\Lcs{pstParabolaLineInter}\OptArgs\Largr{O}\Largb{$p$}\Largb{A}\Largb{B}\Largb{C}\Largb{D}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](2,0){O}
+\pstParabola[linecolor=red!40](O){\p}{-1.5}{1.5}
+\pstLine[linecolor=gray!40,nodesepA=-0.8,nodesepB=-0.8]{0,2}{4,1}
+\pstParabolaLineInter[linecolor=gray!40,PosAngle={120,210}](O){\p}{0,2}{4,1}{P}{Q}
+\pstLine[linecolor=purple!40,nodesepA=-0.8,nodesepB=-0.8]{2.5,0}{2.5,3}
+\pstParabolaLineInter[linecolor=purple!40,PosAngle={0,210}](O){\p}{2.5,0}{2.5,3}{U}{V}
+\pstLine[linecolor=green!40,nodesepA=-2.5,nodesepB=-1.6]{1.5,2.5}{0.5,2.5}
+\pstParabolaLineInter[linecolor=green!40,PosAngle={210,210}](O){\p}{1.5,2.5}{0.5,2.5}{M}{N}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstParabolaPolarNode} is used to find the polar point $T$ of chord $AB$ on Parabola $P$.
+
+\begin{BDef}
+\Lcs{pstParabolaPolarNode}\OptArgs\Largr{O}\Largb{$p$}\Largb{A}\Largb{B}\Largb{T}\\
+\Lcs{pstParabolaPolarNode}\OptArgs\Largr{O}\Largb{$p$}\Largr{F}\Largb{A}\Largb{B}\Largb{T}\\
+\Lcs{pstParabolaPolarNode}\OptArgs\Largr{O}\Largb{$p$}\Largr{F}\OptArg{$L_x$}\OptArg{$L_y$}\Largb{A}\Largb{B}\Largb{T}
+\end{BDef}
+
+We use the following theorem to find the polar point $T$ of chord $AB$:
+\begin{theorem}\label{ParabolaPolarPointTheorem}
+Give any chord $AB$ on parabola, drawing two focal chord $AFC$ and $BFD$, where $F$ is the focus of parabola,
+then drawing $FX$ which is perpendicular to $AFC$ at point $F$, and intersect with the directrix line at $X$;
+also drawing $FY$ which is perpendicular to $BFD$ at point $F$, and intersect with the directrix line at $Y$.
+Then the intersection $T$ of $AX$ and $BY$ is the polar point of chord $AB$.
+\end{theorem}
+
+If you don't know the focus $F$, or the directrix line, we will find them automated, otherwise you can pass them to this macro.
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-1,-2)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-130,PointNameSep=0.2](2,0){O}
+\pstParabola[linecolor=red!40](O){\p}{-1.5}{1.5}
+\pstLine[linecolor=gray!40,nodesepA=-0.8,nodesepB=-0.8]{0,2}{4,1}
+\pstParabolaLineInter[linecolor=gray!40,PosAngle={120,210}](O){\p}{0,2}{4,1}{P}{Q}
+% if you don't know focus F or directrix line
+\pstParabolaPolarNode[linecolor=purple!40,PosAngle=-90](O){\p}{P}{Q}{T}
+\end{pspicture}
+\end{LTXexample}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-1,-2)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-130,PointNameSep=0.2](2,0){O}
+\pstParabola[linecolor=red!40](O){\p}{-1.5}{1.5}
+\pstParabolaFocusNode[linecolor=red!40](O){\p}{F}
+\pstLine[linecolor=gray!40,nodesepA=-0.8,nodesepB=-0.8]{0,2}{4,1}
+\pstParabolaLineInter[linecolor=gray!40,PosAngle={120,210}](O){\p}{0,2}{4,1}{P}{Q}
+% if you know focus F, but don't known directrix line
+\pstParabolaPolarNode[linecolor=purple!40,PosAngle=-90](O){\p}(F){P}{Q}{T}
+\end{pspicture}
+\end{LTXexample}
+
+\vspace{1cm}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-1,-2)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-130,PointNameSep=0.2](2,0){O}
+\pstParabola[linecolor=red!40](O){\p}{-1.5}{1.5}
+\pstParabolaFocusNode[linecolor=red!40](O){\p}{F}
+\pstParabolaDirectrixLine[linecolor=red!40,nodesepA=-2.8,nodesepB=-2,PosAngle={-50,-50}](O){\p}{A}{B}
+\pstLineAB[linecolor=red!40,nodesepA=-0.8,nodesepB=-2.5]{A}{F}
+\pstLine[linecolor=gray!40,nodesepA=-0.8,nodesepB=-0.8]{0,2}{4,1}
+\pstParabolaLineInter[linecolor=gray!40,PosAngle={120,210}](O){\p}{0,2}{4,1}{P}{Q}
+% if you know focus F and also directrix line
+\pstParabolaPolarNode[linecolor=purple!40,PosAngle=-90](O){\p}(F)[A][B]{P}{Q}{T}
+\end{pspicture}
+\end{LTXexample}
+
+\vspace{10pt}
+
+The macro \Lcs{pstParabolaTangentNode} is used to find the two nodes $A$ and $B$ on the Parabola through the point $T$.
+
+\begin{BDef}
+\Lcs{pstParabolaTangentNode}\OptArgs\Largr{O}\Largb{$p$}\Largb{T}\Largb{A}\Largb{B}
+\end{BDef}
+
+We use the following theorem to find the tangent node $A$ and $B$ of outside point $T$:
+\begin{theorem}\label{ParabolaTangentPointTheorem}
+Give point $T$ outside of the parabola, we draw any other two chords $TPQ$ and $TRS$,
+$PS$ and $QR$ intersect at $I$, $PR$ and $QS$ intersect at $X$, $XI$ and Parabola intersect at $A$ and $B$,
+then $TA$ is the tangent line through $A$ and $TB$ is the tangent line through $B$.
+\end{theorem}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,-2)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-130,PointNameSep=0.2](2,0){O}
+\pstParabola[linecolor=red!40](O){\p}{-1.5}{1.5}
+\pstGeonode[PosAngle=-90](1.5,-1){T}
+\pstParabolaTangentNode[linecolor=red!50,PosAngle={80,140},PointName={T_1,T_2}](O){\p}{T}{T1}{T2}
+\pstGeonode[PosAngle=-90](2,-1){P}
+\pstParabolaTangentNode[linecolor=red!50,PosAngle={80,140},PointName={P_1,P_2}](O){\p}{P}{P1}{P2}
+\pstGeonode[PosAngle=-90](2.3,-1){X}
+\pstParabolaTangentNode[linecolor=red!50,PosAngle={80,140},PointName={X_1,X_2}](O){\p}{X}{X1}{X2}
+\end{pspicture}
+\end{LTXexample}
+
+\subsection{Standard Inversion Parabola}
+The Inversion Parabola $P$ with coordinate translation is defined by vertex $O(x_0,y_0)$,
+the half of the focus chord axis $abs(p)$.
+Note that the sign of $p$ indicates the direction of the parabola.
+The equation can be written as:
+\begin{equation}\label{StandardInversionParabola}
+(y-y_0)^2=2p(x-x_0)
+\end{equation}
+and the parametric function can be written as:
+\begin{equation}\label{ParametricFunctionOfStandardInversionParabola}
+\left\{\begin{array}{l}
+x=\dfrac{t^2}{2p}+x_0\\
+y=t+y_0
+\end{array}\right.
+\end{equation}
+
+The macro \Lcs{pstIParabola} is used to draw a Standard Inversion Parabola from $y_1$ to $y_2$ with Vertex $O$,
+the half of the focus chord axis $abs(p)$.
+
+\begin{BDef}
+\Lcs{pstIParabola}\OptArgs\Largr{O}\Largb{$p$}\Largb{$y_1$}\Largb{$y_2$}
+\end{BDef}
+
+The macro \Lcs{pstIParabolaNode} is used to draw a node whose parameter is the given value $t$ on parabola,
+please refer to equation (\ref{ParametricFunctionOfStandardInversionParabola}).
+The macro \Lcs{pstIParabolaAbsNode} is used to draw a node whose abscissa is the given value $x_1$ on parabola.
+The macro \Lcs{pstIParabolaOrdNode} is used to draw a node whose ordinate is the given value $y_1$ on parabola.
+Note that \Lcs{pstIParabolaAbsNode} will create two nodes $A$ and $B$ at most time.
+
+\begin{BDef}
+\Lcs{pstIParabolaNode}\OptArgs\Largr{O}\Largb{$p$}\Largb{$t$}\Largb{A}\\
+\Lcs{pstIParabolaAbsNode}\OptArgs\Largr{O}\Largb{$p$}\Largb{$x_1$}\Largb{A}\Largb{B}\\
+\Lcs{pstIParabolaOrdNode}\OptArgs\Largr{O}\Largb{$p$}\Largb{$y_1$}\Largb{A}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-2)(3,2)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=0,PointNameSep=0.2](2,0){O}
+\pstIParabola[linecolor=blue!40](O){-\p}{-1.5}{1.5}
+\pstIParabolaNode[PosAngle=90](O){-\p}{1}{A}
+\pstIParabolaAbsNode[PosAngle=90,PointName={X_2,X_3},PosAngle={-90,90}](O){-\p}{1.5}{X2}{X3}
+\pstIParabolaOrdNode[PosAngle=-90,PointName=Y_3](O){-\p}{-1}{Y3}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstIParabolaFocusNode} is used to find the focus of the parabola,
+and the macro \Lcs{pstIParabolaDirectrixLine} is used to find the directrix line of the parabola.
+
+\begin{BDef}
+\Lcs{pstIParabolaFocusNode}\OptArgs\Largr{O}\Largb{$p$}\Largb{F}\\
+\Lcs{pstIParabolaDirectrixLine}\OptArgs\Largr{O}\Largb{$p$}\Largb{$L_x$}\Largb{$L_y$}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-2)(3,2)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-30,PointNameSep=0.2](2,0){O}
+\pstIParabola[linecolor=blue!40](O){-\p}{-1.5}{1.5}
+\pstIParabolaFocusNode[linecolor=blue!40,PosAngle=120](O){-\p}{F}
+\pstIParabolaDirectrixLine[linecolor=blue!40,nodesepA=-2,nodesepB=-1,PosAngle={50,20}](O){-\p}{C}{D}
+\pstLine[linecolor=blue!40,nodesepA=-0.8,nodesepB=-2.5]{C}{F}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstIParabolaLineInter} is used to find the intersections $C$ and $D$ of the parabola and the given line $AB$.
+
+\begin{BDef}
+\Lcs{pstIParabolaLineInter}\OptArgs\Largr{O}\Largb{$p$}\Largb{A}\Largb{B}\Largb{C}\Largb{D}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-2)(3,2)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=0,PointNameSep=0.2](2,0){O}
+\pstIParabola[linecolor=blue!40](O){-\p}{-1.5}{1.5}
+\pstLine[linecolor=gray!40]{0,2}{1,-2}
+\pstIParabolaLineInter[linecolor=gray!40,PosAngle={70,-90}](O){-\p}{1,-2}{0,2}{P}{Q}
+\pstLine[linecolor=purple!40]{1.2,-1.5}{1.2,1.5}
+\pstIParabolaLineInter[linecolor=purple!40,PosAngle={-40,210}](O){-\p}{1.2,-1.5}{1.2,1.5}{U}{V}
+\pstLine[linecolor=green!40]{-1,0.5}{2.5,0.5}
+\pstIParabolaLineInter[linecolor=green!40,PosAngle={70,-90}](O){-\p}{-1,0.5}{2.5,0.5}{M}{N}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstIParabolaPolarNode} is used to find the polar point $T$ of chord $AB$ on Parabola $P$.
+
+\begin{BDef}
+\Lcs{pstIParabolaPolarNode}\OptArgs\Largr{O}\Largb{$p$}\Largb{A}\Largb{B}\Largb{T}\\
+\Lcs{pstIParabolaPolarNode}\OptArgs\Largr{O}\Largb{$p$}\Largr{F}\Largb{A}\Largb{B}\Largb{T}\\
+\Lcs{pstIParabolaPolarNode}\OptArgs\Largr{O}\Largb{$p$}\Largr{F}\OptArg{$L_x$}\OptArg{$L_y$}\Largb{A}\Largb{B}\Largb{T}
+\end{BDef}
+
+We also use the theorem \ref{ParabolaPolarPointTheorem} to find the polar point $T$ of chord $AB$.
+If you don't know the focus $F$, or the directrix line, we will find them automated, otherwise you can pass them to this macro.
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](1,-2)(5,2)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-130,PointNameSep=0.2](2,0){O}
+\pstIParabola[linecolor=red!40](O){\p}{-1.5}{1.5}
+\pstLine[linecolor=gray!40,nodesepA=-0.5]{2,1}{4,-2}
+\pstIParabolaLineInter[PosAngle={80,-100}](O){\p}{2,1}{4,-2}{P}{Q}
+% if you don't know focus F or directrix line
+\pstIParabolaPolarNode[linecolor=purple!40,PosAngle=-90](O){\p}{P}{Q}{T}
+\end{pspicture}
+\end{LTXexample}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](1,-2)(5,2)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-130,PointNameSep=0.2](2,0){O}
+\pstIParabola[linecolor=red!40](O){\p}{-1.5}{1.5}
+\pstIParabolaFocusNode[linecolor=red!40](O){\p}{F}
+\pstLine[linecolor=gray!40,nodesepA=-0.5]{2,1}{4,-2}
+\pstIParabolaLineInter[PosAngle={80,-100}](O){\p}{2,1}{4,-2}{P}{Q}
+% if you know focus F, but don't known directrix line
+\pstIParabolaPolarNode[linecolor=purple!40,PosAngle=-90](O){\p}(F){P}{Q}{T}
+\end{pspicture}
+\end{LTXexample}
+
+\vspace{1cm}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](1,-2)(5,2)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-130,PointNameSep=0.2](2,0){O}
+\pstIParabola[linecolor=red!40](O){\p}{-1.5}{1.5}
+\pstIParabolaFocusNode[linecolor=red!40](O){\p}{F}
+\pstIParabolaDirectrixLine[linecolor=red!40,nodesepA=-2,nodesepB=-1,PosAngle={180,180}](O){\p}{A}{B}
+\pstLine[linecolor=gray!40,nodesepA=-0.5]{2,1}{4,-2}
+\pstIParabolaLineInter[PosAngle={80,-100}](O){\p}{2,1}{4,-2}{P}{Q}
+% if you know focus F and also directrix line
+\pstIParabolaPolarNode[linecolor=purple!40,PosAngle=-90](O){\p}(F)[A][B]{P}{Q}{T}
+\end{pspicture}
+\end{LTXexample}
+
+\vspace{10pt}
+
+The macro \Lcs{pstIParabolaTangentNode} is used to find the two nodes $A$ and $B$ on the Parabola through the point $T$.
+
+\begin{BDef}
+\Lcs{pstIParabolaTangentNode}\OptArgs\Largr{O}\Largb{$p$}\Largb{T}\Largb{A}\Largb{B}
+\end{BDef}
+
+We also use the theorem \ref{ParabolaTangentPointTheorem} to find the tangent node $A$ and $B$ of outside point $T$!
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](1,0)(5,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-45,PointNameSep=0.2](4,2){O}
+\pstIParabola[linecolor=blue!40](O){-\p}{-1.5}{1.5}
+\pstGeonode[PosAngle=0](5,1.5){T}
+\pstIParabolaTangentNode[linecolor=red!50,PosAngle={80,-100},PointName={T_1,T_2}](O){-\p}{T}{T1}{T2}
+\pstGeonode[PosAngle=0](5,2.5){P}
+\pstIParabolaTangentNode[linecolor=red!50,PosAngle={80,90},PointName={P_1,P_2}](O){-\p}{P}{P1}{P2}
+\pstGeonode[PosAngle=0](5,2){X}
+\pstIParabolaTangentNode[linecolor=red!50,PosAngle={80,-100},PointName={X_1,X_2}](O){-\p}{X}{X1}{X2}
+\end{pspicture}
+\end{LTXexample}
+
+\subsection{General Parabola}
+The General Parabola $P$ with coordinate translation and rotation is defined by vertex $O(x_0,y_0)$,
+the half of the focus chord axis $abs(p)$, the sign of $p$ indicates the direction of the parabola,
+and the rotation angle $\theta$ of the symmetrical axis.
+
+The equation can be got from the parametric function of the parabola equation (\ref{ParametricFunctionOfStandardParabola}),
+using the rotation transform formula (\ref{RotationTransformFormula}), then we have
+\begin{equation}
+\left\{\begin{array}{l}
+x'=(t+x_0)\cos\theta-(\dfrac{t^2}{2p}+y_0)\sin\theta=x_0'+t\cos\theta-t^2\dfrac{\sin\theta}{2p}\\
+y'=(t+x_0)\sin\theta+(\dfrac{t^2}{2p}+y_0)\cos\theta=y_0'+t\sin\theta+t^2\dfrac{\cos\theta}{2p}
+\end{array}\right.
+\end{equation}
+where the $x_0'$ and $y_0'$ are the coordinate of the given vertex O after rotation.
+So we get the parametric function of the General Parabola with coordinate translation and rotation as following:
+\begin{equation}\label{ParametricFunctionOfGeneralParabola}
+\left\{\begin{array}{l}
+x=x_0+t\cos\theta-t^2\dfrac{\sin\theta}{2p}\\
+y=y_0+t\sin\theta+t^2\dfrac{\cos\theta}{2p}
+\end{array}\right.
+\end{equation}
+
+The macro \Lcs{pstGeneralParabola} is used to draw a General Parabola from $x_1$ to $x_2$ with Vertex $O$,
+the half of the focus chord axis $abs(p)$.
+
+\begin{BDef}
+\Lcs{pstGeneralParabola}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{$x_1$}\Largb{$x_2$}
+\end{BDef}
+
+The macro \Lcs{pstGeneralParabolaNode} is used to draw a node whose parameter is the given value $t$ on parabola,
+please refer to equation (\ref{ParametricFunctionOfGeneralParabola}).
+The macro \Lcs{pstGeneralParabolaAbsNode} is used to draw a node whose abscissa is the given value $x_1$ on parabola.
+The macro \Lcs{pstGeneralParabolaOrdNode} is used to draw a node whose ordinate is the given value $y_1$ on parabola.
+
+Note that \Lcs{pstGeneralParabolaAbsNode} and \Lcs{pstGeneralParabolaOrdNode} both create two nodes $A$ and $B$
+at most time.
+
+\begin{BDef}
+\Lcs{pstGeneralParabolaNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{$t$}\Largb{A}\\
+\Lcs{pstGeneralParabolaAbsNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{$x_1$}\Largb{A}\Largb{B}\\
+\Lcs{pstGeneralParabolaOrdNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{$y_1$}\Largb{A}\Largb{B}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-1,-1)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-40,PointNameSep=0.2](2,0){O}
+\pstGeneralParabola[linecolor=red!10](O){\p}[0]{-1.5}{1.5}
+\pstGeneralParabola[linecolor=red!15](O){\p}[10]{-1.5}{1.5}
+\pstGeneralParabola[linecolor=red!25](O){\p}[30]{-1.5}{1.5}
+\pstGeneralParabola[linecolor=red!40](O){\p}[50]{-1.5}{1.5}
+\pstGeneralParabola[linecolor=red!60](O){\p}[90]{-1.5}{1.5}
+\pstGeneralParabolaNode[PosAngle=0,linecolor=blue!60](O){\p}[30]{1.0}{A}
+\pstGeneralParabolaAbsNode[PosAngle={0,0},linecolor=blue!60](O){\p}[30]{1.0}{D}{E}
+\pstGeneralParabolaAbsNode[PosAngle={0,0},linecolor=blue!60](O){\p}[50]{1.0}{F}{G}
+\pstGeneralParabolaAbsNode[PosAngle={0,0},linecolor=blue!60](O){\p}[90]{1.0}{H}{I}
+\pstGeneralParabolaOrdNode[PosAngle={90,0},linecolor=purple!60](O){\p}[30]{0.5}{U}{V}
+\pstGeneralParabolaOrdNode[PosAngle={90,90},linecolor=purple!60](O){\p}[50]{0.5}{M}{N}
+\pstGeneralParabolaOrdNode[PosAngle={90,-90},linecolor=purple!60](O){\p}[90]{0.5}{S}{T}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralParabolaFocusNode} is used to find the focus of the parabola,
+and the macro \Lcs{pstGeneralParabolaDirectrixLine} is used to find the directrix line of the parabola.
+
+\begin{BDef}
+\Lcs{pstGeneralParabolaFocusNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{F}\\
+\Lcs{pstGeneralParabolaDirectrixLine}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{$L_x$}\Largb{$L_y$}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](2,0){O}
+\pstGeneralParabola[linecolor=red!40](O){\p}[50]{-1.5}{1.5}
+\pstGeneralParabolaFocusNode[linecolor=red!40,PosAngle=90](O){\p}[50]{F}
+\pstLineAB[linestyle=dashed,linecolor=black!25,nodesepA=-0.5,nodesepB=-2.5]{O}{F}
+\pstGeneralParabolaDirectrixLine[linecolor=red!40,nodesepA=-2,nodesepB=-1,PosAngle={-60,-60},PointName={L_1,L_2}](O){\p}[50]{L1}{L2}
+\pstGeneralParabolaNode[linecolor=red!60](O){\p}[50]{1.0}{A}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralParabolaLineInter} is used to find the intersections $C$ and $D$ of the parabola and the given line $AB$.
+
+\begin{BDef}
+\Lcs{pstGeneralParabolaLineInter}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{A}\Largb{B}\Largb{C}\Largb{D}
+\end{BDef}
+
+When General Parabola becomes a Standard Parabola, the intersections with any kind of lines:
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](2,0){O}
+\pstGeneralParabola[linecolor=red!40](O){\p}[0]{-1.5}{1.5}
+\pstGeneralParabolaFocusNode[linecolor=red!40,PosAngle=50](O){\p}[0]{F}
+\pstLineAB[linestyle=dashed,linecolor=black!25,nodesepA=-0.2,nodesepB=-2.5]{O}{F}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=-0.8]{1,0}{1,2}
+\pstGeneralParabolaLineInter[linecolor=red!40,PosAngle={40,-90}](O){\p}[0]{1,0}{1,2}{A}{B}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=0]{0.5,0.5}{3.5,1}
+\pstGeneralParabolaLineInter[linecolor=red!40,PosAngle={-110,-60}](O){\p}[0]{0.5,0.5}{3.5,1}{C}{D}
+\end{pspicture}
+\end{LTXexample}
+
+Here is the intersections of a real General Parabola with any kind of lines:
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-1,-1)(3,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-60,PointNameSep=0.2](2,0){O}
+\pstGeneralParabola[linecolor=red!40](O){\p}[50]{-1.5}{1.5}
+\pstGeneralParabolaFocusNode[linecolor=red!40,PosAngle=80](O){\p}[50]{F}
+\pstLineAB[linestyle=dashed,linecolor=black!25,nodesepA=-0.2,nodesepB=-2.5]{O}{F}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=-0.8]{1,-1}{1,3}
+\pstGeneralParabolaLineInter[linecolor=red!40,PosAngle={-150,40}](O){\p}[50]{1,-1}{1,3}{A}{B}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=0.0]{-1,0}{3,2}
+\pstGeneralParabolaLineInter[linecolor=red!40,PosAngle={90,70}](O){\p}[50]{-1,0}{3,2}{C}{D}
+% a line with gradient k=-\cos50/\sin50 parallel to OF
+\pstLineAS[linestyle=dashed,linecolor=gray!40,nodesep=-0.8,PointName=none,PointSymbol=none](0,1){50 cos 50 sin div neg}{X}
+\pstGeneralParabolaLineInter[linecolor=red!40,PosAngle={-90,-90}](O){\p}[50]{0,1}{X}{E}{G}
+\end{pspicture}
+\end{LTXexample}
+
+When General Parabola becomes a Standard Inversion Parabola, the intersections with any kind of lines:
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-1,-2)(3,2)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=0,PointNameSep=0.2](2,0){O}
+\pstGeneralParabola[linecolor=red!40](O){\p}[90]{-1.5}{1.5}
+\pstGeneralParabolaFocusNode[linecolor=red!40,PosAngle=120](O){\p}[90]{F}
+\pstLineAB[linestyle=dashed,linecolor=black!25,nodesepA=-0.2,nodesepB=-2.5]{O}{F}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=-0.8]{1,-1}{1,2}
+\pstGeneralParabolaLineInter[linecolor=red!40,PosAngle={-60,60}](O){\p}[90]{1,-1}{1,2}{A}{B}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=-0.8]{0,-1}{2,1}
+\pstGeneralParabolaLineInter[linecolor=red!40,PosAngle={-90,5}](O){\p}[90]{0,-1}{2,1}{C}{D}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralParabolaPolarNode} is used to find the polar point $T$ of chord $AB$ on Parabola $P$.
+
+\begin{BDef}
+\Lcs{pstGeneralParabolaPolarNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{A}\Largb{B}\Largb{T}\\
+\Lcs{pstGeneralParabolaPolarNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largr{F}\Largb{A}\Largb{B}\Largb{T}\\
+\Lcs{pstGeneralParabolaPolarNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largr{F}\OptArg{$L_x$}\OptArg{$L_y$}\Largb{A}\Largb{B}\Largb{T}
+\end{BDef}
+
+We also use the theorem \ref{ParabolaPolarPointTheorem} to find the polar point $T$ of chord $AB$.
+If you don't know the focus $F$, or the directrix line, we will find them automated, otherwise you can pass them to this macro.
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-1,-2)(3,2)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-60,PointNameSep=0.2](2,0){O}
+\pstGeneralParabola[linecolor=red!40](O){\p}[80]{-1.5}{1.5}
+\pstGeneralParabolaFocusNode[linecolor=red!40,PosAngle=200](O){\p}[80]{F}
+\pstGeneralParabolaDirectrixLine[linecolor=red!40,nodesepA=-2,nodesepB=-1,PosAngle={0,0},PointName={L_x,L_y}](O){\p}[80]{Lx}{Ly}
+\pstLine[linestyle=dashed,linecolor=black!25,nodesepA=-0.2,nodesepB=-2.5]{O}{F}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=-0.4]{0.5,-1.2}{2,1}
+\pstGeneralParabolaLineInter[linecolor=red!40,PosAngle={-60,90}](O){\p}[80]{0.5,-1.2}{2,1}{A}{B}
+%\pstGeneralParabolaPolarNode[linecolor=red!40,PosAngle=-90](O){\p}[80]{A}{B}{T}
+%\pstGeneralParabolaPolarNode[linecolor=red!40,PosAngle=-90](O){\p}[80](F){A}{B}{T}
+\pstGeneralParabolaPolarNode[linecolor=red!40,PosAngle=-90](O){\p}[80](F)[Lx][Ly]{A}{B}{T}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralParabolaTangentNode} is used to find the two nodes $A$ and $B$ on the Parabola through the point $T$.
+
+\begin{BDef}
+\Lcs{pstGeneralParabolaTangentNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{T}\Largb{A}\Largb{B}
+\end{BDef}
+
+We also use the theorem \ref{ParabolaTangentPointTheorem} to find the tangent node $A$ and $B$ of outside point $T$.
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-1,-2)(3,2)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=0,PointNameSep=0.2](2,0){O}
+\pstGeneralParabola[linecolor=red!40](O){\p}[80]{-1.5}{1.5}
+\pstGeonode[PosAngle=0](2.5,-0.5){R}(2.5,-0.2){T}(2.5,0.6){S}
+\pstGeneralParabolaTangentNode[linecolor=red!40,PosAngle={-90,220},PointName={R_1,R_2}](O){\p}[80]{R}{R1}{R2}
+\pstGeneralParabolaTangentNode[linecolor=red!40,PosAngle={-90,170},PointName={T_1,T_2}](O){\p}[80]{T}{T1}{T2}
+\pstGeneralParabolaTangentNode[linecolor=red!40,PosAngle={-90,180},PointName={S_1,S_2}](O){\p}[80]{S}{S1}{S2}
+\end{pspicture}
+\end{LTXexample}
+
+\subsection{General Inversion Parabola}
+The General Inversion Parabola $P$ with coordinate translation and rotation is defined by vertex $O$,
+the half of the focus chord axis $abs(p)$, the sign of $p$ indicates the direction of the parabola,
+and the rotation angle $\theta$ of the symmetrical axis.
+
+The equation can be got from the parametric function of the inversion parabola (\ref{ParametricFunctionOfStandardInversionParabola}),
+using the rotation transform formula (\ref{RotationTransformFormula}), then we have
+\begin{equation}
+\left\{\begin{array}{l}
+x'=(\dfrac{t^2}{2p}+x_0)\cos\theta-(t+y_0)\sin\theta=x_0'-t\sin\theta+t^2\dfrac{\cos\theta}{2p}\\
+y'=(\dfrac{t^2}{2p}+x_0)\sin\theta+(t+y_0)\cos\theta=y_0'+t\cos\theta+t^2\dfrac{\sin\theta}{2p}
+\end{array}\right.
+\end{equation}
+where the $x_0'$ and $y_0'$ are the coordinate of the given vertex O after rotation.
+So we get the parametric function of the General Inversion Parabola with coordinate translation and rotation as following:
+\begin{equation}\label{ParametricFunctionOfGeneralInversionParabola}
+\left\{\begin{array}{l}
+x=x_0-t\sin\theta+t^2\dfrac{\cos\theta}{2p}\\
+y=y_0+t\cos\theta+t^2\dfrac{\sin\theta}{2p}
+\end{array}\right.
+\end{equation}
+
+The macro \Lcs{pstGeneralIParabola} is used to draw a Standard Inversion Parabola from $y_1$ to $y_2$ with Vertex $O$,
+the half of the focus chord axis $abs(p)$.
+
+\begin{BDef}
+\Lcs{pstGeneralIParabola}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{$y_1$}\Largb{$y_2$}
+\end{BDef}
+
+The macro \Lcs{pstGeneralIParabolaNode} is used to draw a node whose parameter is the given value $t$ on parabola,
+please refer to equation (\ref{ParametricFunctionOfGeneralInversionParabola}).
+The macro \Lcs{pstGeneralIParabolaAbsNode} is used to draw a node whose abscissa is the given value $x_1$ on parabola.
+The macro \Lcs{pstGeneralIParabolaOrdNode} is used to draw a node whose ordinate is the given value $y_1$ on parabola.
+
+Note that \Lcs{pstGeneralIParabolaAbsNode} and \Lcs{pstGeneralIParabolaOrdNode} will create two nodes $A$ and $B$ at most time.
+
+\begin{BDef}
+\Lcs{pstGeneralIParabolaNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{$t$}\Largb{A}\\
+\Lcs{pstGeneralIParabolaAbsNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{$x_1$}\Largb{A}\Largb{B}\\
+\Lcs{pstGeneralIParabolaOrdNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{$y_1$}\Largb{A}\Largb{B}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-1,0)(3,5)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=210,PointNameSep=0.2](0,2){O}
+\pstGeneralIParabola[linecolor=blue!10](O){\p}[0]{-1.5}{1.5}
+\pstGeneralIParabola[linecolor=blue!15](O){\p}[10]{-1.5}{1.5}
+\pstGeneralIParabola[linecolor=blue!25](O){\p}[30]{-1.5}{1.5}
+\pstGeneralIParabola[linecolor=blue!30](O){\p}[40]{-1.5}{1.5}
+\pstGeneralIParabola[linecolor=blue!40](O){\p}[50]{-1.5}{1.5}
+\pstGeneralIParabola[linecolor=blue!60](O){\p}[90]{-1.5}{1.5}
+\pstGeneralIParabolaNode[linecolor=red!60,PosAngle=90](O){\p}[30]{1.0}{A}
+\pstGeneralIParabolaNode[linecolor=red!60,PosAngle=170](O){\p}[50]{1.0}{B}
+\pstGeneralIParabolaAbsNode[linecolor=red!40,PosAngle={-45,90}](O){\p}[50]{1.0}{C}{D}
+\pstGeneralIParabolaAbsNode[linecolor=red!60,PosAngle={0,-90}](O){\p}[90]{1.0}{E}{F}
+\pstGeneralIParabolaOrdNode[linecolor=red!60,PosAngle={90,150}](O){\p}[50]{2.5}{G}{H}
+\pstGeneralIParabolaOrdNode[linecolor=blue!60,PosAngle={180,-90}](O){\p}[90]{2.5}{J}{K}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralIParabolaFocusNode} is used to find the focus of the parabola,
+and the macro \Lcs{pstGeneralIParabolaDirectrixLine} is used to find the directrix line of the parabola.
+
+\begin{BDef}
+\Lcs{pstGeneralIParabolaFocusNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{F}\\
+\Lcs{pstGeneralIParabolaDirectrixLine}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{$L_x$}\Largb{$L_y$}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,0)(2,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\psset{PointName=none,nodesepA=-2,nodesepB=-1}
+\pstGeonode(0,2){O}\def\p{0.8}
+\psset{linecolor=blue!60}
+\pstGeneralIParabola(O){\p}[0]{-1.5}{1.5}
+\pstGeneralIParabolaFocusNode(O){\p}[0]{A}
+\pstGeneralIParabolaDirectrixLine(O){\p}[0]{A1}{A2}
+\psset{linecolor=red!60}
+\pstGeneralIParabola(O){\p}[45]{-1.5}{1.5}
+\pstGeneralIParabolaFocusNode(O){\p}[45]{B}
+\pstGeneralIParabolaDirectrixLine(O){\p}[45]{B1}{B2}
+\psset{linecolor=green!60}
+\pstGeneralIParabola(O){\p}[90]{-1.5}{1.5}
+\pstGeneralIParabolaFocusNode(O){\p}[90]{C}
+\pstGeneralIParabolaDirectrixLine(O){\p}[90]{C1}{C2}
+\psset{linecolor=cyan!60}
+\pstGeneralIParabola(O){\p}[135]{-1.5}{1.5}
+\pstGeneralIParabolaFocusNode(O){\p}[135]{D}
+\pstGeneralIParabolaDirectrixLine(O){\p}[135]{D1}{D2}
+\psset{linecolor=purple!60}
+\pstGeneralIParabola(O){\p}[180]{-1.5}{1.5}
+\pstGeneralIParabolaFocusNode(O){\p}[180]{E}
+\pstGeneralIParabolaDirectrixLine(O){\p}[180]{E1}{E2}
+\psset{linecolor=yellow!60}
+\pstGeneralIParabola(O){\p}[225]{-1.5}{1.5}
+\pstGeneralIParabolaFocusNode(O){\p}[225]{F}
+\pstGeneralIParabolaDirectrixLine(O){\p}[225]{F1}{F2}
+\psset{linecolor=black!60}
+\pstGeneralIParabola(O){\p}[270]{-1.5}{1.5}
+\pstGeneralIParabolaFocusNode(O){\p}[270]{G}
+\pstGeneralIParabolaDirectrixLine(O){\p}[270]{G1}{G2}
+\psset{linecolor=brown!60}
+\pstGeneralIParabola(O){\p}[315]{-1.5}{1.5}
+\pstGeneralIParabolaFocusNode(O){\p}[315]{H}
+\pstGeneralIParabolaDirectrixLine(O){\p}[315]{H1}{H2}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralIParabolaLineInter} is used to find the intersections $C$ and $D$ of the parabola and the given line $AB$.
+
+\begin{BDef}
+\Lcs{pstGeneralIParabolaLineInter}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{A}\Largb{B}\Largb{C}\Largb{D}
+\end{BDef}
+
+When $\theta=0$, the intersections with any kind of lines:
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](1,-2)(5,2)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=180,PointNameSep=0.2](2,0){O}
+\pstGeneralIParabola[linecolor=red!40](O){\p}[0]{-1.5}{1.5}
+\pstLine[linestyle=dashed,linecolor=gray!40]{3,-2}{3,2}
+\pstGeneralIParabolaLineInter[linecolor=red!40,PosAngle={40,150}](O){\p}[0]{3,-2}{3,2}{A}{B}
+\pstLine[linestyle=dashed,linecolor=gray!40]{2,-2}{4,2}
+\pstGeneralIParabolaLineInter[linecolor=red!40,PosAngle={100,210}](O){\p}[0]{2,-2}{4,2}{C}{D}
+\pstLine[linestyle=dashed,linecolor=gray!40]{1.5,0.5}{4.5,0.5}
+\pstGeneralIParabolaLineInter[linecolor=red!40,PosAngle={120,-90}](O){\p}[0]{1.5,0.5}{4.5,0.5}{E}{F}
+\end{pspicture}
+\end{LTXexample}
+
+When $\theta=50$, the intersections with any kind of lines:
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](1,-1)(5,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-70,PointNameSep=0.2](2,0){O}
+\pstGeneralIParabola[linecolor=red!40](O){\p}[50]{-1.5}{1.5}
+\pstGeneralIParabolaFocusNode[linecolor=red!40,PosAngle=80](O){\p}[50]{F}
+\pstLineAB[linestyle=dashed,linecolor=black!25,nodesepA=-0.2,nodesepB=-2.5]{O}{F}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=-0.8]{3,-1}{3,3}
+\pstGeneralIParabolaLineInter[linecolor=red!40,PosAngle={-60,40}](O){\p}[50]{3,-1}{3,3}{A}{B}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=0.0]{2,3}{4,0}
+\pstGeneralIParabolaLineInter[linecolor=red!40,PosAngle={-10,170}](O){\p}[50]{2,3}{4,0}{C}{D}
+% a line with gradient k=\tan50 parallel to OF
+\pstLineAS[linestyle=dashed,linecolor=gray!40,nodesep=-0.8,PointName=none,PointSymbol=none](2,1){50 tan}{X}
+\pstGeneralIParabolaLineInter[linecolor=red!40,PosAngle={180,-90}](O){\p}[50]{2,1}{X}{E}{G}
+\end{pspicture}
+\end{LTXexample}
+
+When $\theta=90$, the intersections with any kind of lines:
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](0,-1)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](2,0){O}
+\pstGeneralIParabola[linecolor=red!40](O){\p}[90]{-1.5}{1.5}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=-0.5]{1,0}{1,2}
+\pstGeneralIParabolaLineInter[linecolor=red!40,PosAngle={180,-90}](O){\p}[90]{1,0}{1,2}{A}{B}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=-0.5]{1,0}{3,1}
+\pstGeneralIParabolaLineInter[linecolor=red!40,PosAngle={-60,-90}](O){\p}[90]{1,0}{3,1}{C}{D}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=-0.5]{0.8,2}{3,2}
+\pstGeneralIParabolaLineInter[linecolor=red!40,PosAngle={120,60}](O){\p}[90]{0.8,2}{3,2}{E}{G}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralIParabolaPolarNode} is used to find the polar point $T$ of chord $AB$ on Parabola $P$.
+
+\begin{BDef}
+\Lcs{pstGeneralIParabolaPolarNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{A}\Largb{B}\Largb{T}\\
+\Lcs{pstGeneralIParabolaPolarNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largr{F}\Largb{A}\Largb{B}\Largb{T}\\
+\Lcs{pstGeneralIParabolaPolarNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largr{F}\OptArg{$L_x$}\OptArg{$L_y$}\Largb{A}\Largb{B}\Largb{T}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](1,-1)(5,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=240,PointNameSep=0.4](2,0){O}
+\pstGeneralIParabola[linecolor=red!40](O){\p}[50]{-1.5}{1.5}
+\pstGeneralIParabolaFocusNode[linecolor=red!40,PosAngle=80](O){\p}[50]{F}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=0.0]{2,3}{4,0}
+\pstGeneralIParabolaLineInter[linecolor=red!40,PosAngle={-10,170}](O){\p}[50]{2,3}{4,0}{A}{B}
+\pstGeneralIParabolaPolarNode[linecolor=red!40,PosAngle=-90](O){\p}[50](F){A}{B}{T}
+\end{pspicture}
+\end{LTXexample}
+
+We also use the theorem \ref{ParabolaPolarPointTheorem} to find the polar point $T$ of chord $AB$.
+If you don't know the focus $F$, or the directrix line, we will find them automated, otherwise you can pass them to this macro.
+
+The macro \Lcs{pstGeneralIParabolaTangentNode} is used to find the two nodes $A$ and $B$ on the Parabola through the point $T$.
+
+\begin{BDef}
+\Lcs{pstGeneralIParabolaTangentNode}\OptArgs\Largr{O}\Largb{$p$}\OptArg{$\theta$}\Largb{T}\Largb{A}\Largb{B}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](1,-1)(5,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\p{0.4}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](2,0){O}
+\pstGeneralIParabola[linecolor=red!40](O){\p}[60]{-1.5}{1.5}
+\pstGeonode[PosAngle=-90](1,-1){R}(2,-1){T}(2.5,-1){S}
+\pstGeneralIParabolaTangentNode[linecolor=red!40,PosAngle={90,220},PointName={R_1,R_2}](O){\p}[60]{R}{R1}{R2}
+\pstGeneralIParabolaTangentNode[linecolor=red!40,PosAngle={160,60},PointName={T_1,T_2}](O){\p}[60]{T}{T1}{T2}
+\pstGeneralIParabolaTangentNode[linecolor=red!40,PosAngle={-60,40},PointName={S_1,S_2}](O){\p}[60]{S}{S1}{S2}
+\end{pspicture}
+\end{LTXexample}
+
+\subsection{Standard Hyperbola}
+The Standard Hyperbola $H$ with coordinate translation is defined by center $O$,
+the half of the real axis $a$, the half of the imaginary axis $b$.
+The equation can be written as:
+\begin{equation}\label{FunctionOfStandardHyperbola}
+\dfrac{(x-x_0)^2}{a^2}-\dfrac{(y-y_0)^2}{b^2}=1
+\end{equation}
+and the parametric function can be written as:
+\begin{equation}\label{ParametricFunctionOfStandardHyperbola}
+\left\{\begin{array}{l}
+x=a\sec\alpha+x_0\\
+y=b\tan\alpha+y_0
+\end{array}\right.
+\end{equation}
+
+The macro \Lcs{pstHyperbola} is used to draw a Standard Hyperbola with Center $O$,
+the half of the real axis $a$, the half of the imaginary axis $b$.
+The parameter \texttt{angleX} is used to truncate the width of the figure,
+it should be setup from 0 to 90.
+
+\begin{BDef}
+\Lcs{pstHyperbola}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{angleX}
+\end{BDef}
+
+The macro \Lcs{pstHyperbolaNode} is used to draw a node whose parameter is the given value $t$ on Hyperbola,
+please refer to equation (\ref{ParametricFunctionOfStandardHyperbola}).
+The macro \Lcs{pstHyperbolaAbsNode} is used to draw the nodes whose abscissa are the given value $x_1$ on Hyperbola.
+The macro \Lcs{pstHyperbolaOrdNode} is used to draw the nodes whose ordinate are the given value $y_1$ on Hyperbola.
+
+Note that \Lcs{pstHyperbolaAbsNode} and \Lcs{pstHyperbolaOrdNode} will create two nodes $A$ and $B$ at most time.
+
+\begin{BDef}
+\Lcs{pstHyperbolaNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$t$}\Largb{A}\\
+\Lcs{pstHyperbolaAbsNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$x_1$}\Largb{A}\Largb{B}\\
+\Lcs{pstHyperbolaOrdNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$y_1$}\Largb{A}\Largb{B}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-2)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](1,1){O}
+\pstHyperbola[linecolor=blue!40](O)(\a,\b)[80]
+\pstHyperbolaNode[linecolor=blue!40,PosAngle=90](O)(\a,\b){80}{A}
+\pstHyperbolaAbsNode[linecolor=blue!40,PointName={X_1,X_2},PosAngle=0](O)(\a,\b){0}{X1}{X2}
+\pstHyperbolaOrdNode[linecolor=blue!40,PointName={Y_1,Y_2},PosAngle=-90](O)(\a,\b){0}{Y1}{Y2}
+\pstHyperbola[linecolor=red!40](O)(\b,\a)[78]
+\pstHyperbolaNode[linecolor=red!40](O)(\b,\a){-75}{B}
+\pstHyperbolaAbsNode[linecolor=red!40,PointName={X_3,X_4},PosAngle=0](O)(\b,\a){0}{X3}{X4}
+\pstHyperbolaOrdNode[linecolor=red!40,PointName={Y_3,Y_4},PosAngle=-90](O)(\b,\a){0}{Y3}{Y4}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstHyperbolaFocusNode} is used to find the focus nodes of the Hyperbola,
+and the macro \Lcs{pstHyperbolaDirectrixLine} is used to find the directrix lines of the Hyperbola.
+
+\begin{BDef}
+\Lcs{pstHyperbolaFocusNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$F_1$}\Largb{$F_2$}\\
+\Lcs{pstHyperbolaDirectrixLine}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$L_x$}\Largb{$L_y$}\Largb{$R_x$}\Largb{$R_y$}
+\end{BDef}
+
+Note that you can use \Lcs{pstLineAS} to draw the asymptote line of the hyperbola by passing the slope gradient $k=\pm\dfrac{b}{a}$;
+or you can use the macro \Lcs{pstHyperbolaAsymptoteLine} to get them, this macro only create one node on each asymptote line,
+as the other one is the center of the hyperbola.
+
+\begin{BDef}
+\Lcs{pstHyperbolaAsymptoteLine}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$L_1$}\Largb{$L_2$}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-2)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](1,1){O}
+\pstHyperbola[linecolor=blue!40](O)(\a,\b)[80]
+\pstHyperbolaNode[linecolor=blue!40](O)(\a,\b){80}{A}
+\pstLineAS[PointName=S_1,PosAngle=90,nodesepA=-3,nodesepB=-1.5,linecolor=blue!20]{O}{\b\space \a\space div}{S1}
+\pstLineAS[PointName=S_2,PosAngle=-90,nodesepA=-3,nodesepB=-1.5,linecolor=blue!20]{O}{\b\space \a\space div neg}{S2}
+\pstHyperbolaFocusNode[linecolor=blue!40,PointName={F_1,F_2},PosAngle={180,0}](O)(\a,\b){F1}{F2}
+\pstHyperbolaDirectrixLine[linecolor=blue!40,nodesepA=-2,nodesepB=-1,PointName={1,2,3,4},PosAngle=90,PointNameSep=0.2](O)(\a,\b){Lx}{Ly}{Rx}{Ry}
+\pstHyperbola[linecolor=red!40](O)(\b,\a)[78]
+\pstHyperbolaFocusNode[linecolor=red!40,PointName={H_1,H_2},PosAngle={180,0}](O)(\b,\a){H1}{H2}
+\pstHyperbolaDirectrixLine[linecolor=red!40,nodesepA=-2,nodesepB=-1,PointName={5,6,7,8},PosAngle=90,PointNameSep=0.2](O)(\b,\a){Mx}{My}{Nx}{Ny}
+\pstHyperbolaAsymptoteLine[linecolor=red!40,nodesepA=-2,nodesepB=-1,PointName={T_1,T_2},PosAngle=90,PointNameSep=0.2](O)(\b,\a){T1}{T2}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstHyperbolaLineInter} is used to find the intersections $C$ and $D$ of the hyperbola and the given line $AB$.
+
+\begin{BDef}
+\Lcs{pstHyperbolaLineInter}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$A$}\Largb{$B$}\Largb{$C$}\Largb{$D$}
+\end{BDef}
+
+In the following example, the Line $CX$ and $CY$ are parallel to the asymptote of the hyperbola.
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle={-90,90},PointNameSep=0.2](1,1){O}(1,1.5){C}
+\pstHyperbola[linecolor=blue!40](O)(\a,\b)[80]
+\pstLine[linestyle=dashed,linecolor=gray!40]{2,-1}{2,3}
+\pstHyperbolaLineInter[linecolor=blue!40,PosAngle={210,-40}](O)(\a,\b){2,-1}{2,3}{I}{J}
+\pstLineAS[linestyle=dashed,linecolor=gray!60,nodesep=-2,PosAngle=150]{1,1.5}{\b\space \a\space div}{X}
+\pstLineAS[linestyle=dashed,linecolor=gray!60,nodesep=-2,PosAngle=-10]{1,1.5}{\b\space \a\space div neg}{Y}
+\pstLineAS[linestyle=dashed,linecolor=gray!60,nodesep=-2,PosAngle=150]{1,1.5}{0.2}{Z}
+\pstHyperbolaLineInter[linecolor=blue!40,PosAngle={-10,-90}](O)(\a,\b){1,1.5}{X}{P}{Q}
+\pstHyperbolaLineInter[linecolor=blue!40,PosAngle={90,-30}](O)(\a,\b){1,1.5}{Y}{M}{N}
+\pstHyperbolaLineInter[linecolor=blue!40,PosAngle={90,90}](O)(\a,\b){1,1.5}{Z}{D}{E}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstHyperbolaPolarNode} is used to find the polar point $T$ of chord $AB$ on the hyperbola.
+
+\begin{BDef}
+\Lcs{pstHyperbolaPolarNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$A$}\Largb{$B$}\Largb{$T$}
+\end{BDef}
+
+We use the following theorem to find the polar point $T$ of chord $AB$:
+\begin{theorem}\label{HyperbolaPolarPointTheorem}
+Let $P$, $Q$ are vertex points of the hyperbola, for any chord $AB$ of hyperbola, suppose $PA$ and $BQ$ intersect at $E$,
+$PB$ and $AQ$ intersect at $F$, then the middle point $T$ of $EF$ is the polar point of chord $AB$.
+\end{theorem}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle=90,PointNameSep=0.2](1,1){O}
+\pstHyperbola[linecolor=blue!40](O)(\a,\b)[80]
+\pstHyperbolaNode[linecolor=blue!40,PosAngle=80](O)(\a,\b){50}{A}
+\pstHyperbolaNode[linecolor=blue!40,PosAngle=-100](O)(\a,\b){-70}{B}
+\pstHyperbolaPolarNode[linecolor=red!40,PosAngle=-100](O)(\a,\b){A}{B}{T}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=-1]{A}{B}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstHyperbolaTangentNode} is used to find the tangent point $A$ and $B$ of point $T$ outside of the hyperbola.
+
+\begin{BDef}
+\Lcs{pstHyperbolaTangentNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$T$}\Largb{$A$}\Largb{$B$}
+\end{BDef}
+
+We use the following theorem to find the tangent points $A$ and $B$ of $T$:
+\begin{theorem}\label{HyperbolaTangentPointTheorem}
+Let $T$ is a point out of the hyperbola, for any two chords $TPQ$ and $TRS$ of the hyperbola, suppose $PR$ and $QS$ intersect at $X$,
+$RQ$ and $PS$ intersect at $Y$, then the intersection point $A$ and $B$ of $XY$ and the hyperbola are the tangent points from $T$.
+\end{theorem}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle=90,PointNameSep=0.2](1,1){O}
+\pstHyperbola[linecolor=blue!40](O)(\a,\b)[80]
+\pstGeonode[PosAngle=-90](1.2,0.8){T}
+\pstHyperbolaTangentNode[linecolor=red!40,PosAngle={90,90},nodesep=-0.5](O)(\a,\b){T}{A}{B}
+\end{pspicture}
+\end{LTXexample}
+
+\subsection{Standard Inversion Hyperbola}
+The Standard Inversion Hyperbola $H$ with coordinate translation is defined by center $O$,
+the half of the real axis $a$, the half of the imaginary axis $b$.
+The equation can be written as:
+\begin{equation}\label{FunctionOfStandardInversionHyperbola}
+\dfrac{(y-y_0)^2}{a^2}-\dfrac{(x-x_0)^2}{b^2}=1
+\end{equation}
+and the parametric function can be written as:
+\begin{equation}\label{ParametricFunctionOfStandardInversionHyperbola}
+\left\{\begin{array}{l}
+x=b\tan\alpha+x_0\\
+y=a\sec\alpha+y_0
+\end{array}\right.
+\end{equation}
+
+The macro \Lcs{pstIHyperbola} is used to draw a Standard Inversion Hyperbola with Center $O$,
+the half of the real axis $a$, the half of the imaginary axis $b$.
+The parameter \texttt{angleY} is used to truncate the height of the figure,
+it should be setup from 0 to 90.
+
+\begin{BDef}
+\Lcs{pstIHyperbola}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{angleY}
+\end{BDef}
+
+The macro \Lcs{pstIHyperbolaNode} is used to draw a node whose parameter is the given value $t$ on Inversion Hyperbola,
+please refer to equation (\ref{ParametricFunctionOfStandardInversionHyperbola}).
+The macro \Lcs{pstIHyperbolaAbsNode} is used to draw the nodes whose abscissa are the given value $x_1$ on Inversion Hyperbola.
+The macro \Lcs{pstIHyperbolaOrdNode} is used to draw the nodes whose ordinate are the given value $y_1$ on Inversion Hyperbola.
+
+Note that \Lcs{pstIHyperbolaAbsNode} and \Lcs{pstIHyperbolaOrdNode} will create two nodes $A$ and $B$ at most time.
+
+\begin{BDef}
+\Lcs{pstIHyperbolaNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$t$}\Largb{A}\\
+\Lcs{pstIHyperbolaAbsNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$x_1$}\Largb{A}\Largb{B}\\
+\Lcs{pstIHyperbolaOrdNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$y_1$}\Largb{A}\Largb{B}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-2)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}
+\pstGeonode[PosAngle=-90,PointNameSep=0.2](1,1){O}
+\pstIHyperbola[linecolor=blue!40](O)(\a,\b)[80]
+\pstIHyperbolaNode[linecolor=blue!40](O)(\a,\b){75}{A}
+\pstIHyperbolaAbsNode[linecolor=blue!40,PointName={Y_1,Y_2},PosAngle=0](O)(\a,\b){0}{Y1}{Y2}
+\pstIHyperbolaOrdNode[linecolor=red!40,PointName={X_1,X_2},PosAngle=-90](O)(\a,\b){0}{X1}{X2}
+\pstIHyperbola[linecolor=red!40](O)(\b,\a)[78]
+\pstIHyperbolaNode[linecolor=red!40](O)(\b,\a){-75}{B}
+\pstIHyperbolaAbsNode[linecolor=red!40,PointName={Y_3,Y_4},PosAngle=0](O)(\b,\a){0}{Y3}{Y4}
+\pstIHyperbolaOrdNode[linecolor=red!40,PointName={X_3,X_4},PosAngle=-90](O)(\b,\a){0}{X3}{X4}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstIHyperbolaFocusNode} is used to find the focus nodes of the Inversion Hyperbola,
+and the macro \Lcs{pstIHyperbolaDirectrixLine} is used to find the directrix lines of the Inversion Hyperbola.
+
+\begin{BDef}
+\Lcs{pstIHyperbolaFocusNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$F_1$}\Largb{$F_2$}\\
+\Lcs{pstIHyperbolaDirectrixLine}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$L_x$}\Largb{$L_y$}\Largb{$R_x$}\Largb{$R_y$}
+\end{BDef}
+
+Note that you can use \Lcs{pstLineAS} to draw the asymptote line of the hyperbola by passing the slope gradient $k=\pm\dfrac{a}{b}$;
+or you can use the macro \Lcs{pstIHyperbolaAsymptoteLine} to get them, this macro only create one node on each asymptote line,
+as the other one is the center of the hyperbola.
+
+\begin{BDef}
+\Lcs{pstHyperbolaAsymptoteLine}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$L_1$}\Largb{$L_2$}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-2)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}
+\pstGeonode[PosAngle=180,PointNameSep=0.2](1,1){O}
+\pstIHyperbola[linecolor=blue!40](O)(\a,\b)[80]
+\pstIHyperbolaFocusNode[linecolor=blue!40,PointName={F_1,F_2},PosAngle={-90,90}](O)(\a,\b){F1}{F2}
+\pstIHyperbolaDirectrixLine[linecolor=blue!40,nodesepA=-2,nodesepB=-1,PointName={1,2,3,4},PosAngle=180,PointNameSep=0.2](O)(\a,\b){Lx}{Ly}{Rx}{Ry}
+\pstLineAS[PointName=S_1,PosAngle=90,nodesepA=-3,nodesepB=-1.5,linecolor=blue!20]{O}{\a\space \b\space div}{S1}
+\pstLineAS[PointName=S_2,PosAngle=-90,nodesepA=-3,nodesepB=-1.5,linecolor=blue!20]{O}{\a\space \b\space div neg}{S2}
+\pstIHyperbola[linecolor=red!40](O)(\b,\a)[78]
+\pstIHyperbolaFocusNode[linecolor=red!40,PointName={H_1,H_2},PosAngle={-90,90}](O)(\b,\a){H1}{H2}
+\pstIHyperbolaDirectrixLine[linecolor=red!40,nodesepA=-2,nodesepB=-1,PointName={5,6,7,8},PosAngle=0,PointNameSep=0.2](O)(\b,\a){Mx}{My}{Nx}{Ny}
+\pstIHyperbolaAsymptoteLine[linecolor=red!40,nodesepA=-2,nodesepB=-1,PointName={T_1,T_2},PosAngle=90,PointNameSep=0.2](O)(\b,\a){T1}{T2}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstIHyperbolaLineInter} is used to find the intersections $C$ and $D$ of the hyperbola and the given line $AB$.
+
+\begin{BDef}
+\Lcs{pstIHyperbolaLineInter}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$A$}\Largb{$B$}\Largb{$C$}\Largb{$D$}
+\end{BDef}
+
+In the following example, the Line $CX$ and $CY$ are parallel to the asymptote of the hyperbola.
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-2)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.35}
+\pstGeonode[PosAngle={0,180}](1,1){O}(0,1){C}
+\pstIHyperbola[linecolor=blue!40](O)(\a,\b)[82]
+\pstLine[linestyle=dashed,linecolor=gray!40]{2,-2}{2,4}
+\pstIHyperbolaLineInter[linecolor=blue!40,PosAngle={0,-30}](O)(\a,\b){2,-2}{2,4}{I}{J}
+\pstLineAS[linestyle=dashed,linecolor=gray!60,nodesep=-2,PosAngle=150]{0,1}{\a\space \b\space div}{X}
+\pstLineAS[linestyle=dashed,linecolor=gray!60,nodesep=-2,PosAngle=150]{0,1}{\a\space \b\space div neg}{Y}
+\pstLineAS[linestyle=dashed,linecolor=gray!60,nodesepA=-4,PosAngle=210]{0,1}{-3.5}{Z}
+\pstIHyperbolaLineInter[linecolor=blue!40,PosAngle={180,-100}](O)(\a,\b){0,1}{X}{P}{Q}
+\pstIHyperbolaLineInter[linecolor=blue!40,PosAngle={0,180}](O)(\a,\b){0,1}{Y}{M}{N}
+\pstIHyperbolaLineInter[linecolor=blue!40,PosAngle={190,-100}](O)(\a,\b){0,1}{Z}{D}{E}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstIHyperbolaPolarNode} is used to find the polar point $T$ of chord $AB$ on the hyperbola.
+
+\begin{BDef}
+\Lcs{pstIHyperbolaPolarNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$A$}\Largb{$B$}\Largb{$T$}
+\end{BDef}
+
+We also use the theorem \ref{HyperbolaPolarPointTheorem} to find the polar point $T$ of chord $AB$:
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-1,-1)(3,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle=0,PointNameSep=0.2](1,1){O}
+\pstIHyperbola[linecolor=blue!40](O)(\a,\b)[76]
+\pstIHyperbolaNode[linecolor=blue!40,PosAngle=80](O)(\a,\b){50}{A}
+\pstIHyperbolaNode[linecolor=blue!40,PosAngle=-100](O)(\a,\b){-70}{B}
+\pstIHyperbolaPolarNode[linecolor=red!40,PosAngle=180](O)(\a,\b){A}{B}{T}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=-1]{A}{B}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstIHyperbolaTangentNode} is used to find the tangent point $A$ and $B$ of point $T$ outside of the hyperbola.
+
+\begin{BDef}
+\Lcs{pstIHyperbolaTangentNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\Largb{$T$}\Largb{$A$}\Largb{$B$}
+\end{BDef}
+
+We also use the following theorem \ref{HyperbolaTangentPointTheorem} to find the tangent points $A$ and $B$ of $T$.
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle=180](1,1){O}
+\pstIHyperbola[linecolor=blue!40](O)(\a,\b)[78]
+\pstGeonode[PosAngle=0](1.2,0.8){T}
+\pstIHyperbolaTangentNode[linecolor=red!40,PosAngle={80,-90},nodesep=-0.5](O)(\a,\b){T}{A}{B}
+\end{pspicture}
+\end{LTXexample}
+
+\subsection{General Hyperbola}
+The General Hyperbola $H$ with coordinate translation and rotation is defined by center $O$,
+the half of the real axis $a$, the half of the imaginary axis $b$,
+and the rotation angle $\theta$ of the principal axis.
+The equation can be got from the parametric function of the Standard Hyperbola equation (\ref{ParametricFunctionOfStandardHyperbola}),
+using the rotation transform formula (\ref{RotationTransformFormula}), then we have
+\begin{equation}
+\left\{\begin{array}{l}
+x'=(a\sec\alpha+x_0)\cos\theta-(b\tan\alpha+y_0)\sin\theta=x_0'+a\sec\alpha\cos\theta-b\tan\alpha\sin\theta\\
+y'=(a\sec\alpha+x_0)\sin\theta+(b\tan\alpha+y_0)\cos\theta=y_0'+a\sec\alpha\sin\theta+b\tan\alpha\cos\theta
+\end{array}\right.
+\end{equation}
+where the $x_0'$ and $y_0'$ are the coordinate of the given center $O$ after rotation.
+So we get the parametric function of the General Hyperbola with coordinate translation and rotation as following:
+\begin{equation}\label{ParametricFunctionOfGeneralHyperbola}
+\left\{\begin{array}{l}
+x=x_0+a\sec\alpha\cos\theta-b\tan\alpha\sin\theta\\
+y=y_0+a\sec\alpha\sin\theta+b\tan\alpha\cos\theta
+\end{array}\right.
+\end{equation}
+
+The macro \Lcs{pstGeneralHyperbola} is used to draw a General Hyperbola with Center $O$,
+the half of the real axis $a$, the half of the imaginary axis $b$,
+and the rotation angle $\theta$ of the symmetrical axis.
+The parameter \texttt{angleX} is used to truncate the width of the figure,
+it should be setup from 0 to 90.
+
+\begin{BDef}
+\Lcs{pstGeneralHyperbola}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\OptArg{angleX}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle=-90](1,1){O}
+\pstGeneralHyperbola[linecolor=red!20](O)(\a,\b)[0][80]
+\pstGeneralHyperbolaNode[linecolor=red!80,PosAngle=5](O)(\a,\b)[0]{0}{A}
+\pstGeneralHyperbola[linecolor=blue!40](O)(\a,\b)[40][80]
+\pstGeneralHyperbolaNode[linecolor=blue!40,PosAngle=10](O)(\a,\b)[40]{40}{B}
+\pstGeneralHyperbola[linecolor=green!60](O)(\a,\b)[90][80]
+\pstGeneralHyperbolaNode[linecolor=green!60,PosAngle=-90](O)(\a,\b)[90]{200}{C}
+\pstGeneralHyperbola[linecolor=purple!80](O)(\a,\b)[150][80]
+\pstGeneralHyperbolaNode[linecolor=purple!80,PosAngle=150](O)(\a,\b)[150]{50}{D}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralHyperbolaNode} is used to draw a node whose parameter is the given value $t$ on General Hyperbola,
+please refer to equation (\ref{ParametricFunctionOfGeneralHyperbola}).
+The macro \Lcs{pstGeneralHyperbolaAbsNode} is used to draw the nodes whose abscissa are the given value $x_1$ on General Hyperbola.
+The macro \Lcs{pstGeneralHyperbolaOrdNode} is used to draw the nodes whose ordinate are the given value $y_1$ on General Hyperbola.
+
+Note that \Lcs{pstGeneralHyperbolaAbsNode} and \Lcs{pstGeneralHyperbolaOrdNode} will create two nodes $A$ and $B$ at most time.
+
+\begin{BDef}
+\Lcs{pstGeneralHyperbolaNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$t$}\Largb{A}\\
+\Lcs{pstGeneralHyperbolaAbsNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$x_1$}\Largb{A}\Largb{B}\\
+\Lcs{pstGeneralHyperbolaOrdNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$y_1$}\Largb{A}\Largb{B}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle=-90](1,1){O}
+\pstGeneralHyperbola[linecolor=purple!80](O)(\a,\b)[150][80]
+\pstGeneralHyperbolaAbsNode[linecolor=purple!80,PosAngle={200,90}](O)(\a,\b)[150]{2}{P}{Q}
+\pstGeneralHyperbolaAbsNode[linecolor=purple!80,PosAngle={-90,200}](O)(\a,\b)[150]{0}{X}{Y}
+\pstGeneralHyperbolaAbsNode[linecolor=purple!80,PosAngle={40,-40}](O)(\a,\b)[150]{0.59378}{M}{N}
+\pstLine[linestyle=dashed,linecolor=gray!40]{0.59378,-1}{0.59378,3}
+\pstGeneralHyperbolaOrdNode[linecolor=purple!80,PosAngle={200,90}](O)(\a,\b)[150]{2}{G}{H}
+\pstGeneralHyperbolaOrdNode[linecolor=purple!80,PosAngle={-90,200}](O)(\a,\b)[150]{0}{I}{J}
+\pstGeneralHyperbolaOrdNode[linecolor=purple!80,PosAngle={90,-90}](O)(\a,\b)[150]{1}{K}{L}
+\pstLine[linestyle=dashed,linecolor=gray!80,nodesep=-1.5]{K}{L}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralHyperbolaFocusNode} is used to find the focus nodes of the General Hyperbola,
+the macro \Lcs{pstGeneralHyperbolaVertexNode} is used to find the vertex nodes of the General Hyperbola,
+and the macro \Lcs{pstGeneralHyperbolaDirectrixLine} is used to find the directrix lines of the General Hyperbola.
+
+\begin{BDef}
+\Lcs{pstGeneralHyperbolaFocusNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$F_1$}\Largb{$F_2$}\\
+\Lcs{pstGeneralHyperbolaVertexNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$V_1$}\Largb{$V_2$}\\
+\Lcs{pstGeneralHyperbolaDirectrixLine}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$L_x$}\Largb{$L_y$}\Largb{$R_x$}\Largb{$R_y$}
+\end{BDef}
+
+Note that you can use the macro \Lcs{pstGeneralHyperbolaAsymptoteLine} to get the asymptote lines, this macro only create one node on each asymptote line,
+as the other one is the center of the hyperbola.
+
+\begin{BDef}
+\Lcs{pstGeneralHyperbolaAsymptoteLine}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$L_1$}\Largb{$L_2$}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-2)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}
+\pstGeonode[PosAngle=180,PointNameSep=0.2](1,1){O}
+\pstGeneralHyperbola[linecolor=red!40](O)(\a,\b)[0][80]
+\pstGeneralHyperbolaFocusNode[linecolor=red!40,PointName={X_1,X_2},PosAngle={180,0}](O)(\a,\b)[0]{X1}{X2}
+\pstGeneralHyperbolaDirectrixLine[linecolor=red!40,nodesepA=-2,nodesepB=-1,PointName=none](O)(\a,\b)[0]{Lx}{Ly}{Rx}{Ry}
+\pstGeneralHyperbolaAsymptoteLine[linecolor=red!40,nodesepA=-2,nodesepB=-1,PointName=none](O)(\a,\b)[0]{L1}{L2}
+\pstGeneralHyperbola[linecolor=blue!40](O)(\a,\b)[40][80]
+\pstGeneralHyperbolaFocusNode[linecolor=blue!40,PointName={F_1,F_2},PosAngle={220,40}](O)(\a,\b)[40]{F1}{F2}
+\pstGeneralHyperbolaDirectrixLine[linecolor=blue!40,nodesepA=-2,nodesepB=-1,PointName=none](O)(\a,\b)[40]{Dx}{Dy}{Ux}{Uy}
+\pstGeneralHyperbolaAsymptoteLine[linecolor=blue!40,nodesepA=-2,nodesepB=-1,PointName=none](O)(\a,\b)[40]{S1}{S2}
+\pstGeneralHyperbola[linecolor=brown!40](O)(\a,\b)[90][80]
+\pstGeneralHyperbolaFocusNode[linecolor=brown!40,PointName={Y_1,Y_2},PosAngle={-90,90}](O)(\a,\b)[90]{Y1}{Y2}
+\pstGeneralHyperbolaDirectrixLine[linecolor=brown!40,nodesepA=-2,nodesepB=-1,PointName=none](O)(\a,\b)[90]{Tx}{Ty}{Sx}{Sy}
+\pstGeneralHyperbolaAsymptoteLine[linecolor=brown!40,nodesepA=-2,nodesepB=-1,PointName=none](O)(\a,\b)[90]{T1}{T2}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralHyperbolaLineInter} is used to find the intersections $C$ and $D$ of the general hyperbola and the given line $AB$.
+
+\begin{BDef}
+\Lcs{pstGeneralHyperbolaLineInter}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$A$}\Largb{$B$}\Largb{$C$}\Largb{$D$}
+\end{BDef}
+
+In the following example, the lines $YY'$ and $ZZ'$ are parallel to the asymptote of the hyperbola,
+so there are only one intersection $M$ and $P$ for each line, and the second node $N$ and $Q$ are put at the origin.
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle=-90](1,1){O}
+\pstGeneralHyperbola[linecolor=blue!40](O)(\a,\b)[30][80]
+\pstLine[linestyle=dashed,linecolor=gray!40]{0.5,-1}{0.5,3}
+\pstGeneralHyperbolaLineInter[linecolor=blue!40,PosAngle={-30,210}](O)(\a,\b)[30]{0.5,-1}{0.5,3}{A}{B}
+\pstLine[linestyle=dashed,linecolor=gray!40]{-2,0}{3,3}
+\pstGeneralHyperbolaLineInter[linecolor=blue!40,PosAngle={130,-90}](O)(\a,\b)[30]{-2,0}{3,3}{C}{D}
+\pstGeonode[PosAngle={0,100}](2,0){Y}(1,1.8){Z}
+\pstLineAA[nodesepA=-3,nodesepB=-2,linecolor=gray!40,PointName=none,PointSymbol=none]{O}{\b\space \a\space div 1 atan 30 add}{U}
+\pstLineAA[nodesepA=-3,nodesepB=-2,linecolor=red!40,PointName=none,PointSymbol=none]{O}{\b\space \a\space div neg 1 atan 30 add}{V}
+\pstLineAA[nodesepA=-3,nodesepB=-2,linecolor=gray!40,PosAngle=-30]{Y}{\b\space \a\space div 1 atan 30 add}{Y'}
+\pstLineAA[nodesepA=-3,nodesepB=-2,linecolor=red!40,PosAngle=80]{Z}{\b\space \a\space div neg 1 atan 30 add}{Z'}
+\pstGeneralHyperbolaLineInter[linecolor=blue!40,PosAngle={-50,-90}](O)(\a,\b)[30]{Z}{Z'}{M}{N}
+\pstGeneralHyperbolaLineInter[linecolor=blue!40,PosAngle={30,210}](O)(\a,\b)[30]{Y}{Y'}{P}{Q}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralHyperbolaPolarNode} is used to find the polar point $T$ of chord $AB$ on the general hyperbola.
+
+\begin{BDef}
+\Lcs{pstGeneralHyperbolaPolarNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$A$}\Largb{$B$}\Largb{$T$}
+\end{BDef}
+
+We also use the theorem \ref{HyperbolaPolarPointTheorem} to find the polar point $T$ of chord $AB$:
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-1,-1)(3,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle=120,PointNameSep=0.2](1,1){O}
+\pstGeneralHyperbola[linecolor=blue!40](O)(\a,\b)[40][80]
+\pstGeneralHyperbolaNode[linecolor=blue!40,PosAngle=110](O)(\a,\b)[40]{50}{A}
+\pstGeneralHyperbolaNode[linecolor=blue!40,PosAngle=-100](O)(\a,\b)[40]{-70}{B}
+\pstGeneralHyperbolaPolarNode[linecolor=red!40,PosAngle=-90](O)(\a,\b)[40]{A}{B}{T}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=-1]{A}{B}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralHyperbolaTangentNode} is used to find the tangent point $A$ and $B$ of point $T$ outside of the general hyperbola.
+
+\begin{BDef}
+\Lcs{pstGeneralHyperbolaTangentNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$T$}\Largb{$A$}\Largb{$B$}
+\end{BDef}
+
+We also use the following theorem \ref{HyperbolaTangentPointTheorem} to find the tangent points $A$ and $B$ of $T$.
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle=120](1,1){O}
+\pstGeneralHyperbola[linecolor=blue!40](O)(\a,\b)[40][80]
+\pstGeonode[PosAngle=-40](1.2,0.8){T}
+\pstGeneralHyperbolaTangentNode[linecolor=red!40,PosAngle={140,-90},nodesep=-0.5](O)(\a,\b)[40]{T}{A}{B}
+\end{pspicture}
+\end{LTXexample}
+
+\subsection{General Inversion Hyperbola}
+The General Inversion Hyperbola $H$ with coordinate translation and rotation is defined by center $O$,
+the half of the real axis $a$, the half of the imaginary axis $b$,
+and the rotation angle $\theta$ of the principal axis.
+The equation can be got from the parametric function of the Standard Inversion Hyperbola equation (\ref{ParametricFunctionOfStandardInversionHyperbola}),
+using the rotation transform formula (\ref{RotationTransformFormula}), then we have
+\begin{equation}
+\left\{\begin{array}{l}
+x'=(b\tan\alpha+x_0)\cos\theta-(a\sec\alpha+y_0)\sin\theta=x_0'+b\tan\alpha\cos\theta-a\sec\alpha\sin\theta\\
+y'=(b\tan\alpha+x_0)\sin\theta+(a\sec\alpha+y_0)\cos\theta=y_0'+b\tan\alpha\sin\theta+a\sec\alpha\cos\theta
+\end{array}\right.
+\end{equation}
+where the $x_0'$ and $y_0'$ are the coordinate of the given center $O$ after rotation.
+So we get the parametric function of the General Inversion Hyperbola with coordinate translation and rotation as following:
+\begin{equation}\label{ParametricFunctionOfGeneralInversionHyperbola}
+\left\{\begin{array}{l}
+x=x_0+b\tan\alpha\cos\theta-a\sec\alpha\sin\theta\\
+y=y_0+b\tan\alpha\sin\theta+a\sec\alpha\cos\theta
+\end{array}\right.
+\end{equation}
+
+The macro \Lcs{pstGeneralIHyperbola} is used to draw a General Inversion Hyperbola with Center $O$,
+the half of the real axis $a$, the half of the imaginary axis $b$,
+and the rotation angle $\theta$ of the symmetrical axis.
+The parameter \texttt{angleY} is used to truncate the height of the figure,
+it should be setup from 0 to 90.
+
+\begin{BDef}
+\Lcs{pstGeneralIHyperbola}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\OptArg{angleY}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle=-90](1,1){O}
+\pstGeneralIHyperbola[linecolor=red!20](O)(\a,\b)[0][80]
+\pstGeneralIHyperbolaNode[linecolor=red!80,PosAngle=-90](O)(\a,\b)[0]{0}{A}
+\pstGeneralIHyperbola[linecolor=blue!40](O)(\a,\b)[40][80]
+\pstGeneralIHyperbolaNode[linecolor=blue!40,PosAngle=190](O)(\a,\b)[40]{40}{B}
+\pstGeneralIHyperbola[linecolor=green!60](O)(\a,\b)[90][80]
+\pstGeneralIHyperbolaNode[linecolor=green!60,PosAngle=0](O)(\a,\b)[90]{200}{C}
+\pstGeneralIHyperbola[linecolor=purple!80](O)(\a,\b)[150][80]
+\pstGeneralIHyperbolaNode[linecolor=purple!80,PosAngle=-90](O)(\a,\b)[150]{50}{D}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralIHyperbolaNode} is used to draw a node whose parameter is the given value $t$ on General Inversion Hyperbola,
+please refer to equation (\ref{ParametricFunctionOfGeneralInversionHyperbola}).
+
+The macro \Lcs{pstGeneralIHyperbolaAbsNode} is used to draw the nodes whose abscissa are the given value $x_1$ on General Inversion Hyperbola.
+The macro \Lcs{pstGeneralIHyperbolaOrdNode} is used to draw the nodes whose ordinate are the given value $y_1$ on General Inversion Hyperbola.
+
+Note that \Lcs{pstGeneralIHyperbolaAbsNode} and \Lcs{pstGeneralIHyperbolaOrdNode} will create two nodes $A$ and $B$ at most time.
+
+\begin{BDef}
+\Lcs{pstGeneralIHyperbolaNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$t$}\Largb{A}\\
+\Lcs{pstGeneralIHyperbolaAbsNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$x_1$}\Largb{A}\Largb{B}\\
+\Lcs{pstGeneralIHyperbolaOrdNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$y_1$}\Largb{A}\Largb{B}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle=180](1,1){O}
+\pstGeneralIHyperbola[linecolor=purple!80](O)(\a,\b)[150][80]
+\pstGeneralIHyperbolaAbsNode[linecolor=purple!80,PosAngle={200,90}](O)(\a,\b)[150]{2}{P}{Q}
+\pstGeneralIHyperbolaAbsNode[linecolor=purple!80,PosAngle={90,200}](O)(\a,\b)[150]{0}{X}{Y}
+\pstGeneralIHyperbolaAbsNode[linecolor=purple!80,PosAngle={40,-40}](O)(\a,\b)[150]{1}{M}{N}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=-1.5]{M}{N}
+\pstGeneralIHyperbolaOrdNode[linecolor=purple!80,PosAngle={180,90}](O)(\a,\b)[150]{2}{G}{H}
+\pstGeneralIHyperbolaOrdNode[linecolor=purple!80,PosAngle={90,240}](O)(\a,\b)[150]{0}{I}{J}
+\pstGeneralIHyperbolaOrdNode[linecolor=purple!80,PosAngle={-100,-60}](O)(\a,\b)[150]{1.4063}{K}{L}
+\pstLine[linestyle=dashed,linecolor=gray!80,nodesep=-1]{I}{J}
+\pstLine[linestyle=dashed,linecolor=gray!80,nodesep=-1]{-1,1.4063}{3,1.4063}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralIHyperbolaFocusNode} is used to find the focus nodes of the General Inversion Hyperbola,
+the macro \Lcs{pstGeneralIHyperbolaVertexNode} is used to find the vertex nodes of the General Inversion Hyperbola,
+and the macro \Lcs{pstGeneralIHyperbolaDirectrixLine} is used to find the directrix lines of the General Inversion Hyperbola.
+
+\begin{BDef}
+\Lcs{pstGeneralIHyperbolaFocusNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$F_1$}\Largb{$F_2$}\\
+\Lcs{pstGeneralIHyperbolaVertexNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$V_1$}\Largb{$V_2$}\\
+\Lcs{pstGeneralIHyperbolaDirectrixLine}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$L_x$}\Largb{$L_y$}\Largb{$R_x$}\Largb{$R_y$}
+\end{BDef}
+
+Note that you can use the macro \Lcs{pstGeneralIHyperbolaAsymptoteLine} to get the asymptote lines, this macro only create one node on each asymptote line,
+as the other one is the center of the hyperbola.
+
+\begin{BDef}
+\Lcs{pstGeneralHyperbolaAsymptoteLine}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$L_1$}\Largb{$L_2$}
+\end{BDef}
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-2)(4,4)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}
+\pstGeonode[PosAngle=180,PointNameSep=0.2](1,1){O}
+\pstGeneralIHyperbola[linecolor=red!40](O)(\a,\b)[0][80]
+\pstGeneralIHyperbolaFocusNode[linecolor=red!40,PointName={X_1,X_2},PosAngle={90,-90}](O)(\a,\b)[0]{X1}{X2}
+\pstGeneralIHyperbolaDirectrixLine[linecolor=red!40,nodesepA=-2,nodesepB=-1,PointName=none](O)(\a,\b)[0]{Lx}{Ly}{Rx}{Ry}
+\pstGeneralIHyperbolaAsymptoteLine[linecolor=red!40,nodesepA=-2,nodesepB=-1,PointName=none](O)(\a,\b)[0]{T1}{T2}
+\pstGeneralIHyperbola[linecolor=blue!40](O)(\a,\b)[40][80]
+\pstGeneralIHyperbolaFocusNode[linecolor=blue!40,PointName={F_1,F_2},PosAngle={130,-40}](O)(\a,\b)[40]{F1}{F2}
+\pstGeneralIHyperbolaDirectrixLine[linecolor=blue!40,nodesepA=-2,nodesepB=-1,PointName=none](O)(\a,\b)[40]{Dx}{Dy}{Ux}{Uy}
+\pstGeneralIHyperbolaAsymptoteLine[linecolor=blue!40,nodesepA=-2,nodesepB=-1,PointName=none](O)(\a,\b)[40]{S1}{S2}
+\pstGeneralIHyperbola[linecolor=brown!40](O)(\a,\b)[90][80]
+\pstGeneralIHyperbolaFocusNode[linecolor=brown!40,PointName={Y_1,Y_2},PosAngle={180,0}](O)(\a,\b)[90]{Y1}{Y2}
+\pstGeneralIHyperbolaDirectrixLine[linecolor=brown!40,nodesepA=-2,nodesepB=-1,PointName=none](O)(\a,\b)[90]{Tx}{Ty}{Sx}{Sy}
+\pstGeneralIHyperbolaAsymptoteLine[linecolor=brown!40,nodesepA=-2,nodesepB=-1,PointName=none](O)(\a,\b)[90]{R1}{R2}
+\end{pspicture}
+\end{LTXexample}
+
+
+The macro \Lcs{pstGeneralIHyperbolaLineInter} is used to find the intersections $C$ and $D$ of the general inversion hyperbola and the given line $AB$.
+
+\begin{BDef}
+\Lcs{pstGeneralIHyperbolaLineInter}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$A$}\Largb{$B$}\Largb{$C$}\Largb{$D$}
+\end{BDef}
+
+In the following example, the lines $YY'$ and $ZZ'$ are parallel to the asymptote of the hyperbola,
+so there are only one intersection $M$ and $P$ for each line, and the second node $N$ and $Q$ are put at the origin.
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle=225](1,1){O}
+\pstGeneralIHyperbola[linecolor=blue!40](O)(\a,\b)[30][80]
+\pstLine[linestyle=dashed,linecolor=gray!40]{-1,-1}{-1,3}
+\pstGeneralIHyperbolaLineInter[linecolor=blue!40,PosAngle={-30,210}](O)(\a,\b)[30]{-1,-1}{-1,3}{A}{B}
+\pstLine[linestyle=dashed,linecolor=gray!40]{-2,1}{3,3}
+\pstGeneralIHyperbolaLineInter[linecolor=blue!40,PosAngle={130,-90}](O)(\a,\b)[30]{-2,1}{3,3}{C}{D}
+\pstGeonode[PosAngle={-20,100}](2,0){Y}(1.8,2){Z}
+\pstLineAA[nodesepA=-3,nodesepB=-2,linecolor=gray!40,PointName=none,PointSymbol=none]{O}{\a\space \b\space div 1 atan 30 add}{U}
+\pstLineAA[nodesepA=-3,nodesepB=-2,linecolor=red!40,PointName=none,PointSymbol=none]{O}{\a\space \b\space div neg 1 atan 30 add}{V}
+\pstLineAA[nodesepA=-3,nodesepB=-2,linecolor=gray!40,PosAngle=10]{Y}{\a\space \b\space div 1 atan 30 add}{Y'}
+\pstLineAA[nodesepA=-3,nodesepB=-2,linecolor=red!40,PosAngle=80]{Z}{\a\space \b\space div neg 1 atan 30 add}{Z'}
+\pstGeneralIHyperbolaLineInter[linecolor=blue!40,PosAngle={30,-90}](O)(\a,\b)[30]{Z}{Z'}{M}{N}
+\pstGeneralIHyperbolaLineInter[linecolor=blue!40,PosAngle={30,210}](O)(\a,\b)[30]{Y}{Y'}{P}{Q}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralIHyperbolaPolarNode} is used to find the polar point $T$ of chord $AB$ on the general inversion hyperbola.
+
+\begin{BDef}
+\Lcs{pstGeneralIHyperbolaPolarNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$A$}\Largb{$B$}\Largb{$T$}
+\end{BDef}
+
+We also use the theorem \ref{HyperbolaPolarPointTheorem} to find the polar point $T$ of chord $AB$:
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-1,-1)(3,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle=40,PointNameSep=0.2](1,1){O}
+\pstGeneralIHyperbola[linecolor=blue!40](O)(\a,\b)[40][80]
+\pstGeneralIHyperbolaNode[linecolor=blue!40,PosAngle=40](O)(\a,\b)[40]{50}{A}
+\pstGeneralIHyperbolaNode[linecolor=blue!40,PosAngle=-100](O)(\a,\b)[40]{-70}{B}
+\pstGeneralIHyperbolaPolarNode[linecolor=red!40,PosAngle=-90](O)(\a,\b)[40]{A}{B}{T}
+\pstLine[linestyle=dashed,linecolor=gray!40,nodesep=-1]{A}{B}
+\end{pspicture}
+\end{LTXexample}
+
+The macro \Lcs{pstGeneralIHyperbolaTangentNode} is used to find the tangent point $A$ and $B$ of point $T$ outside of the general inversion hyperbola.
+
+\begin{BDef}
+\Lcs{pstGeneralIHyperbolaTangentNode}\OptArgs\Largr{O}\Largr{$a,\,b$}\OptArg{$\theta$}\Largb{$T$}\Largb{$A$}\Largb{$B$}
+\end{BDef}
+
+We also use the following theorem \ref{HyperbolaTangentPointTheorem} to find the tangent points $A$ and $B$ of $T$.
+
+\begin{LTXexample}[width=6cm,pos=l]
+\begin{pspicture}[showgrid=true](-2,-1)(4,3)
+\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize
+\def\a{0.5}\def\b{0.3}\psset{PointNameSep=0.3}
+\pstGeonode[PosAngle=20](1,1){O}
+\pstGeneralIHyperbola[linecolor=blue!40](O)(\a,\b)[40][80]
+\pstGeonode[PosAngle=-40](0,1){T}
+\pstGeneralIHyperbolaTangentNode[linecolor=red!40,PosAngle={-80,120},nodesep=-0.5](O)(\a,\b)[40]{T}{A}{B}
+\end{pspicture}
+\end{LTXexample}
+
\section{Geometric Transformations}
The geometric transformations are the ideal tools to construct geometric figures. All
@@ -686,7 +2766,7 @@ line crossing all images, and thus allow a quick description of a transformed fi
\end{BDef}
\begin{sloppypar}
-Possible optional arguments are
+Possible optional arguments are
\Lkeyword{PointSymbol}, \Lkeyword{PosAngle},
\Lkeyword{PointName}, \Lkeyword{PointNameSep}, \Lkeyword{PtNameMath},
\Lkeyword{CodeFig}, \Lkeyword{CodeFigColor}, and \Lkeyword{CodeFigStyle}.
@@ -699,7 +2779,7 @@ following functions.
\begin{pspicture}[showgrid](-2,-2)(2,2)
\psset{CodeFig=true}
\pstGeonode[PosAngle={20,90,0}]{O}(-.6,1.5){A}(1.6,-.5){B}
-\pstSymO[CodeFigColor=blue,
+\pstSymO[CodeFigColor=blue,
PosAngle={-90,180}]{O}{A, B}[C, D]
\pstLineAB{A}{B}\pstLineAB{C}{D}
\pstLineAB{A}{D}\pstLineAB{C}{B}
@@ -713,7 +2793,7 @@ following functions.
\end{BDef}
\begin{sloppypar}
-Possible optional arguments are
+Possible optional arguments are
\Lkeyword{PointSymbol}, \Lkeyword{PosAngle},
\Lkeyword{PointName}, \Lkeyword{PointNameSep}, \Lkeyword{PtNameMath},
\Lkeyword{CodeFig}, \Lkeyword{CodeFigColor}, and \Lkeyword{CodeFigStyle}.
@@ -745,7 +2825,7 @@ Draws the symmetric point in relation to line $(AB)$.
\end{BDef}
\begin{sloppypar}
-Possible optional arguments are
+Possible optional arguments are
\Lkeyword{PointSymbol}, \Lkeyword{PosAngle},
\Lkeyword{PointName}, \Lkeyword{PointNameSep}, \Lkeyword{PtNameMath}, and \Lkeyword{RotAngle}
for \Lcs{pstRotation} and \Lkeyword{AngleCoef}, \Lkeyword{RotAngle} for \Lcs{pstAngleABC}.
@@ -770,13 +2850,13 @@ contain some text, it is put on the corresponding angle in mathematical mode.
\pstRotation[PosAngle=90,RotAngle=60,
CodeFig,CodeFigColor=blue,
TransformLabel=\frac{\pi}{3}]{A}{B}[C]
-\pstRotation[AngleCoef=.5,
+\pstRotation[AngleCoef=.5,
RotAngle=\pstAngleAOB{B}{A}{C},
CodeFigColor=red, CodeFig,
TransformLabel=\frac{1}{2}\widehat{BAC}]{A}{D}[E]
\end{pspicture}
\end{LTXexample}
-
+
\subsection{Translation}
@@ -785,7 +2865,7 @@ contain some text, it is put on the corresponding angle in mathematical mode.
\end{BDef}
\begin{sloppypar}
-Possible optional arguments are
+Possible optional arguments are
\Lkeyword{PointSymbol}, \Lkeyword{PosAngle},
\Lkeyword{PointName}, \Lkeyword{PointNameSep}, \Lkeyword{PtNameMath}, and \Lkeyword{DistCoef}
%
@@ -822,7 +2902,7 @@ text specified with \Lkeyword{TransformLabel} \DefaultVal{none}.
\end{BDef}
\begin{sloppypar}
-Possible optional arguments are
+Possible optional arguments are
\Lkeyword{HomCoef},
\Lkeyword{PointSymbol}, \Lkeyword{PosAngle},
\Lkeyword{PointName}, \Lkeyword{PointNameSep}, \Lkeyword{PtNameMath}, and \Lkeyword{HomCoef}.
@@ -852,7 +2932,7 @@ coefficient specified with the parameter \Lkeyword{HomCoef}.
\end{BDef}
\begin{sloppypar}
-Possible optional arguments are
+Possible optional arguments are
\Lkeyword{PointSymbol}, \Lkeyword{PosAngle},
\Lkeyword{PointName}, \Lkeyword{PointNameSep}, \Lkeyword{PtNameMath},
\Lkeyword{CodeFig}, \Lkeyword{CodeFigColor}, and\Lkeyword{CodeFigStyle}
@@ -911,7 +2991,7 @@ automatically put below the segment.
\end{BDef}
\begin{sloppypar}
-Possible optional arguments are
+Possible optional arguments are
\Lkeyword{PointName}, \Lkeyword{PointNameSep}, \Lkeyword{PosAngle},
\Lkeyword{PointSymbol}, and \Lkeyword{PtNameMath}
%
@@ -936,12 +3016,12 @@ Draw the $ABC$ triangle centre of gravity $G$.
\end{BDef}
\begin{sloppypar}
-Possible optional arguments are
+Possible optional arguments are
\Lkeyword{PointName}, \Lkeyword{PointNameSep}, \Lkeyword{PosAngle},
\Lkeyword{PointSymbol}, \Lkeyword{PtNameMath}, \Lkeyword{DrawCirABC}, \Lkeyword{CodeFig},
\Lkeyword{CodeFigColor}, \Lkeyword{CodeFigStyle}, \Lkeyword{SegmentSymbolA},
\Lkeyword{SegmentSymbolB}, and \Lkeyword{SegmentSymbolC}.
-%
+%
Draws the circle crossing three points (the circum circle) and put its center $O$.
The effective drawing is controlled by the boolean parameter \Lkeyword{DrawCirABC}
\DefaultVal{true}. Moreover the intermediate constructs (mediator lines) can
@@ -967,7 +3047,7 @@ points are marked on the segemnts using three different marks given by the param
\end{BDef}
\begin{sloppypar}
-Possible optional arguments are
+Possible optional arguments are
\Lkeyword{PointName}, \Lkeyword{PointNameSep}, \Lkeyword{PosAngle},
\Lkeyword{PointSymbol}, \Lkeyword{PtNameMath}, \Lkeyword{CodeFig},
\Lkeyword{CodeFigColor}, \Lkeyword{CodeFigStyle}, and \Lkeyword{SegmentSymbol}.
@@ -1015,7 +3095,7 @@ construction is controlled by the following parameters:
\end{BDef}
\begin{sloppypar}
-Possible optional arguments are
+Possible optional arguments are
\Lkeyword{PointSymbol}, \Lkeyword{PosAngle},
\Lkeyword{PointName}, \Lkeyword{PointNameSep}, and \Lkeyword{PtNameMath}.
%
@@ -1067,7 +3147,7 @@ manage the existence of these points.
\end{BDef}
\begin{sloppypar}
-Possible optional arguments are
+Possible optional arguments are
\Lkeyword{PointSymbol}, \Lkeyword{PosAngle},
\Lkeyword{PointName}, \Lkeyword{PointNameSep}, and \Lkeyword{PtNameMath}.
%
@@ -1110,11 +3190,11 @@ Draw the intersection point between lines $(AB)$ and $(CD)$.
\end{BDef}
\begin{sloppypar}
-Possible optional arguments are
+Possible optional arguments are
\Lkeyword{PointSymbol}, \Lkeyword{PosAngle},
\Lkeyword{PointName}, \Lkeyword{PointNameSep}, \Lkeyword{PtNameMath},
\Lkeyword{PointSymbolA}, \Lkeyword{PosAngleA}, \Lkeyword{PointNameA},
- \Lkeyword{PointSymbolB}, \Lkeyword{PosAngleB}, \Lkeyword{PointNameB},
+ \Lkeyword{PointSymbolB}, \Lkeyword{PosAngleB}, \Lkeyword{PointNameB},
\Lkeyword{Radius}, and \Lkeyword{Diameter}.
%
Draw the one or two intersection point(s) between the line $(AB)$ and
@@ -1177,7 +3257,7 @@ trigonometric (by default) or clockwise. Here is a first example.
\pstCircleOA[linecolor=red]{C}{B}
\pstInterCC[PosAngleA=135, CodeFigA=true, CodeFigAarc=false,
CodeFigColor=magenta]{O}{A}{C}{B}{D}{E}
-\pstInterCC[PosAngleA=170, CodeFigA=true,
+\pstInterCC[PosAngleA=170, CodeFigA=true,
CodeFigAarc=false,
CodeFigColor=green]{B}{E}{C}{B}{F}{G}
\end{pspicture}
@@ -1304,23 +3384,23 @@ of centre $O$ and radius $OA$.
Calculates and prints the values. This is only possible on PostScript level!
-\begin{pspicture}[showgrid](-1,0)(11,8)
+\begin{pspicture}[showgrid](-1,-1)(8,7)
\def\sideC{6} \def\sideA{7} \def\sideB{8}
-\psset{PointSymbol=none,linejoin=1,linewidth=0.4pt,PtNameMath=false,labelsep=0.07,MarkAngleRadius=1.1,decimals=1,comma}
-\pstGeonode[PosAngle={90,90}](0,0){A}(\sideC;10){B}
-\psset{PointName=}
-\pstInterCC[RadiusA=\pstDistVal{\sideB},RadiusB=\pstDistVal{\sideA},PosAngle=-90,PointNameA=C]{A}{}{B}{}{C}{C-}
+\psset{unit=0.8cm,PointSymbol=none,linejoin=1,linewidth=0.4pt,PtNameMath=false,labelsep=0.07,MarkAngleRadius=1.1,decimals=1}
+\pstGeonode[PosAngle={-90,-90}](0,0){A}(\sideC;10){B}
+\pstInterCC[RadiusA=\pstDistVal{\sideB},RadiusB=\pstDistVal{\sideA},PosAngleA=90,PointNameA=C]{A}{}{B}{}{C}{C-}
\pstInterCC[RadiusA=\pstDistAB{A}{B},RadiusB=\pstDistAB{B}{C}]{C}{}{A}{}{D-}{D}
+\psset{PointName=none}
\pstInterLC[Radius=\pstDistAB{A}{C}]{C}{D}{C}{}{A'-}{A'}
\pstInterCC[RadiusA=\pstDistAB{A}{B},RadiusB=\pstDistAB{B}{C}]{A'}{}{C}{}{B'}{B'-}
-\pstInterLL[PosAngle=90,PointName=default]{B'}{C}{A}{B}{E}
+\pstInterLL[PosAngle=-90,PointName=default]{B'}{C}{A}{B}{E}
\pspolygon(A)(B)(C)
\pspolygon[fillstyle=solid,fillcolor=magenta,opacity=0.1](C)(E)(B)
%
-\psGetAngleABC[ArcColor=blue,AngleValue=true,LabelSep=0.7,arrows=->,decimals=0,PSfont=Palatino-Roman](B)(A)(C){}
-\psGetAngleABC[AngleValue=true,ArcColor=red,arrows=->,WedgeOpacity=0.6,WedgeColor=yellow!30,LabelSep=0.5](C)(B)(A){$\beta$}
-\psGetAngleABC[LabelSep=0.7,WedgeColor=green,xShift=-6,yShift=-10](A)(C)(B){$\gamma$}
-\psGetAngleABC[LabelSep=0.7,AngleArc=false,WedgeColor=green,arrows=->,xShift=-15,yShift=0](C)(E)(B){\color{blue}$\gamma$}
+\psGetAngleABC[ArcColor=blue,AngleValue=true,LabelSep=0.4,arrows=->,decimals=0,PSfont=Palatino-Roman](B)(A)(C){}
+\psGetAngleABC[AngleValue=true,ArcColor=red,arrows=->,WedgeOpacity=0.6,WedgeColor=yellow!30,LabelSep=0.4](C)(B)(A){$\beta$}
+\psGetAngleABC[LabelSep=0.4,AngleValue=true,WedgeColor=green,xShift=-6,yShift=-10](A)(C)(B){$\gamma$}
+\psGetAngleABC[LabelSep=0.4,AngleValue=true,AngleArc=false,WedgeColor=green,arrows=->,xShift=-15,yShift=0](C)(E)(B){\color{blue}$\gamma$}
\psGetAngleABC[AngleValue=true,MarkAngleRadius=1.0,LabelSep=0.5,ShowWedge=false,xShift=-5,yShift=7,arrows=->](E)(B)(C){}
%
\pcline[linestyle=none](A)(B)\nbput{\sideC}
@@ -1330,19 +3410,13 @@ Calculates and prints the values. This is only possible on PostScript level!
\psGetDistanceAB[xShift=-17,decimals=2](E)(C){MEC}
\end{pspicture}
-
-
-
-
\begin{lstlisting}
\begin{pspicture}(-1,0)(11,8)
\psgrid[gridlabels=0pt,subgriddiv=2,gridwidth=0.4pt,subgridwidth=0.2pt,gridcolor=black!60,subgridcolor=black!40]
\def\sideC{6} \def\sideA{7} \def\sideB{8}
\psset{PointSymbol=none,linejoin=1,linewidth=0.4pt,PtNameMath=false,labelsep=0.07,MarkAngleRadius=1.1,decimals=1,comma}
-\pstGeonode[PosAngle={90,90}](0,0){A}(\sideC;10){B}
-% \pstGeonode[PosAngle={225,-75}](0,0){A}(\sideC;10){B}
-\psset{PointName=}
-\pstInterCC[RadiusA=\pstDistVal{\sideB},RadiusB=\pstDistVal{\sideA},PosAngle=-90,PointNameA=C]{A}{}{B}{}{C}{C-}
+\pstGeonode[PosAngle={-90,-90}](0,0){A}(\sideC;10){B}
+\pstInterCC[RadiusA=\pstDistVal{\sideB},RadiusB=\pstDistVal{\sideA},PosAngle=90,PointNameA=C]{A}{}{B}{}{C}{C-}
\pstInterCC[RadiusA=\pstDistAB{A}{B},RadiusB=\pstDistAB{B}{C}]{C}{}{A}{}{D-}{D}
\pstInterLC[Radius=\pstDistAB{A}{C}]{C}{D}{C}{}{A'-}{A'}
\pstInterCC[RadiusA=\pstDistAB{A}{B},RadiusB=\pstDistAB{B}{C}]{A'}{}{C}{}{B'}{B'-}
@@ -1350,10 +3424,10 @@ Calculates and prints the values. This is only possible on PostScript level!
\pspolygon(A)(B)(C)
\pspolygon[fillstyle=solid,fillcolor=magenta,opacity=0.1](C)(E)(B)
%
-\psGetAngleABC[ArcColor=blue,AngleValue=true,LabelSep=0.7,arrows=->,decimals=0,PSfont=Palatino-Roman](B)(A)(C){}
+\psGetAngleABC[ArcColor=blue,AngleValue=true,LabelSep=0.8,arrows=->,decimals=0,PSfont=Palatino-Roman](B)(A)(C){}
\psGetAngleABC[AngleValue=true,ArcColor=red,arrows=->,WedgeOpacity=0.6,WedgeColor=yellow!30,LabelSep=0.5](C)(B)(A){$\beta$}
-\psGetAngleABC[LabelSep=0.7,WedgeColor=green,xShift=-6,yShift=-10](A)(C)(B){$\gamma$}
-\psGetAngleABC[LabelSep=0.7,AngleArc=false,WedgeColor=green,arrows=->,xShift=-15,yShift=0](C)(E)(B){\color{blue}$\gamma$}
+\psGetAngleABC[LabelSep=0.8,WedgeColor=green,xShift=-6,yShift=-10](A)(C)(B){$\gamma$}
+\psGetAngleABC[LabelSep=0.8,AngleArc=false,WedgeColor=green,arrows=->,xShift=-15,yShift=0](C)(E)(B){\color{blue}$\gamma$}
\psGetAngleABC[AngleValue=true,MarkAngleRadius=1.0,LabelSep=0.5,ShowWedge=false,xShift=-5,yShift=7,arrows=->](E)(B)(C){}
%
\pcline[linestyle=none](A)(B)\nbput{\sideC}
@@ -1697,7 +3771,7 @@ Drawing of Manuel Luque.
\pstBissectBAC[PointSymbol=none,PointName=none]{C}{A}{B}{AB}
\pstBissectBAC[PointSymbol=none,PointName=none]{A}{B}{C}{BB}
\pstBissectBAC[PointSymbol=none,PointName=none]{B}{C}{A}{CB}
-\pstInterLL{A}{AB}{B}{BB}{I}
+\pstInterLL{A}{AB}{B}{BB}{I}
\psset{linecolor=magenta, linestyle=dashed} \pstProjection{A}{B}{I}[I_C]
\pstLineAB{I}{I_C}\pstRightAngle[linestyle=solid]{A}{I_C}{I}
\pstProjection{A}{C}{I}[I_B]
@@ -1842,7 +3916,7 @@ distance of two points (the focus) is constant.
\begin{LTXexample}
\begin{pspicture}[showgrid](-4,-4)(4,4)
\newcommand\Sommet{1.4142135623730951 } \newcounter{i} \setcounter{i}{1}
-\newcommand\PosFoyer{2 } \newcommand\HypAngle{0}
+\newcommand\PosFoyer{2 } \newcommand\HypAngle{0}
\newcounter{CoefDiv}\setcounter{CoefDiv}{20}
\newcounter{Inc}\setcounter{Inc}{2} \newcounter{n}\setcounter{n}{2}
\newcommand\Ri{ \PosFoyer \Sommet sub \arabic{i}\space\arabic{CoefDiv}\space div add }
@@ -1933,7 +4007,7 @@ is an astroid, a deltoid and in the general case hypo-cycloids.
\begin{pspicture}[showgrid](-3.5,-3.4)(3.5,4)
\HypoCyclo[3]{3}{1}{17}
\psset{linecolor=blue,linewidth=1.5\pslinewidth}
-\pstGenericCurve[GenCurvFirst=P]{N}{1}{6}
+\pstGenericCurve[GenCurvFirst=P]{N}{1}{6}
\pstGenericCurve{N}{6}{12}
\pstGenericCurve[GenCurvLast=P]{N}{12}{17}
\end{pspicture}
diff --git a/graphics/pstricks/contrib/pst-eucl/tex/pst-eucl.tex b/graphics/pstricks/contrib/pst-eucl/tex/pst-eucl.tex
index df8d75a009..8979b313be 100644
--- a/graphics/pstricks/contrib/pst-eucl/tex/pst-eucl.tex
+++ b/graphics/pstricks/contrib/pst-eucl/tex/pst-eucl.tex
@@ -7,20 +7,21 @@
%% of the LaTeX Project Public License Distributed from CTAN
%% archives in directory macros/latex/base/lppl.txt.
%%
-%% Author : Dominique RODRIGUEZ (EN) <dominique.rodriguez@waika9.com>
+%% Author : Dominique RODRIGUEZ (EN) <dominique.rodriguez@waika9.com>
%% : hv hvoss@tug.org
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Require PSTricks and pst-node packages
\ifx\PSTnodesLoaded\endinput\else\input pst-node.tex\fi
\ifx\PSTArrowLoaded\endinput\else\input pst-arrow.tex\fi
\ifx\PSTtoolsLoaded\endinput\else\input pst-tools.tex\fi
+\ifx\PSTplotLoaded\endinput\else\input pst-plot.tex\fi
%\ifx\PSTXKeyLoaded\endinput\else \input pst-xkey\fi
\ifx\MultidoLoaded\endinput \else\input multido.tex \fi
\csname PSTEuclideLoaded\endcsname
\let\PSTEuclideLoaded\endinput
%
-\def\fileversion{1.65}
-\def\filedate{2019/08/19}
+\def\fileversion{1.66}
+\def\filedate{2019/10/20}
%%
\message{`PST-Euclide v\fileversion, \filedate\space (dr,hv)}%
%% prologue for postcript
@@ -151,12 +152,12 @@
PointSymbol=*, %PointSymbolA=*, PointSymbolB=*, PointSymbolC=*,
PointName=default, PointNameA=undef, PointNameB=undef, PointNameC=undef,
PtNameMath=true, PointNameMathSize=\textstyle, PointNameSize=\normalsize,
- PointNameSep=default, PosAngle=undef,
+ PointNameSep=default, PosAngle=undef,
PosAngleA=undef,
PosAngleB=undef, PosAngleC=undef, Mark=undef, mark=undef,SegmentSymbol=MarkHashh,
SegmentSymbolA=MarkHashh, SegmentSymbolB=MarkHash, SegmentSymbolC=MarkHashhh,
RightAngleSize=.4, RightAngleType=default, LabelAngleOffset=0, LabelSep=1,
- LabelRefPt=c, MarkAngle=undef, MarkAngleType=default, MarkAngleRadius=.4,
+ LabelRefPt=c, MarkAngle=undef, MarkAngleType=default, MarkAngleRadius=.4,
HomCoef=.5, RotAngle=60,
CurveType=none, TransformLabel=none, Central@Sym=false, DrawCirABC=true,
CodeFig=false, CodeFigColor=cyan, CodeFigStyle=dashed, CodeFigA=undef,
@@ -228,7 +229,7 @@
\edef\psk@PosAngle{\expandafter\PstParamListLasts\OldPosAngle,undef/}%
\edef\psk@PointSymbol{\expandafter\PstParamListLasts\OldPointSymbol,undef/}}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% create a point with an associated node,
+%% Create a point with an associated node,
%% #1 -> options
%% #2 -> coordinates
%% #3 -> node name
@@ -247,7 +248,7 @@
\@ifnextchar(\Pst@Geonode@ii{\pst@MngTransformCurve\endgroup}}% DR 22032005
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% create a point with an associated node, in a new
+%% Create a point with an associated node, in a new
%% landmark
%% #1 -> options
%% #2 -> coordinates
@@ -458,7 +459,7 @@
\ifx\psk@fillstylename\@none\else
\pscustom[linestyle=none,linewidth=0.01pt,arrows=-]{%
\psline(0,0)
- \psarc(0,0){\psk@MarkAngleRadius}{(#2)}{(#4)}
+ \psarc(0,0){\psk@MarkAngleRadius}{(#2)}{(#4)}
\psline(0,0)
}
\fi
@@ -567,49 +568,70 @@
%% #2 #3 -> 2 nodes defining the line
\def\pstLineAB{\ncline}%@ifnextchar[\Pst@LineAB{\Pst@LineAB[]}}%
%\def\Pst@LineAB[#1]#2#3{\ncline[#1]{#2}{#3}}%
-%% #2 #3 -> 2 nodes defining the center and a point on the circle
-\def\pstCircleOA{\pst@object{pstCircleOA}}%
-\def\pstCircleOA@i#1#2{%
- \bgroup\use@par%
- \rput(#1){%
- \begin@ClosedObj
+%
+%% \pstCircleOA[Options]{O}{A}[angleA][angleB]
+%% Draw a Circle with center O from angleA to angleB, going counter clockwise.
+%% The circle is defined by center $O$ and the other node $A$ on the circle,
+%% or the center $O$ and the given Radius/Diameter in options.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the circle center O
+%% #3 -> [input] the node A on the circle or empty if you setup Radius/Diameter
+%% #4 -> [input] optional. start angle from angleA to angleB, going counter clockwise.
+%% #5 -> [input] optional, start angle from angleA to angleB, going counter clockwise.
+\def\pstCircleOA{\@ifnextchar[\Pst@CircleOA{\Pst@CircleOA[]}}
+\def\Pst@CircleOA[#1]#2#3{%
+ \begingroup
+ \psset{#1}%
+ \def\pst@circle@center{#2}
+ \def\pst@circle@node{#3}
+ \@ifnextchar[\pstCircleOA@i{\pstCircleOA@i[0][360]}}%
+\def\pstCircleOA@i[#1][#2]{%
+ \rput(\pst@circle@center){%
+ \begin@OpenObj
\def\pst@linetype{4}%
\addto@pscode{%
tx@EcldDict begin
- /N@#1 GetNode
+ /N@\pst@circle@center\space GetNode
\ifx\psk@Radius\@none
\ifx\psk@Diameter\@none
- 2 copy /N@#2 GetNode ABDist
- \else\psk@Diameter 2 div
+ 2 copy /N@\pst@circle@node\space GetNode ABDist
+ \else\psk@Diameter\space 2 div
\fi
\else\psk@Radius\space
\fi
end
- \psk@dimen CLW mul sub 0 360 arc closepath}%
+ %\psk@dimen CLW mul sub 0 360 arc closepath}%
+ #1 #2 arc}%
\showpointsfalse
- \end@ClosedObj
+ \end@OpenObj
}%
- \egroup%
+ \endgroup%
}%
%% #2 #3 -> 2 nodes defining a diameter of the circle
-\def\pstCircleAB{\pst@object{pstCircleAB}}%
-\def\pstCircleAB@i#1#2{%
- \bgroup\use@par%
- \Pst@MiddleAB[PointSymbol=none, PointName=none]{#2}{#1}{@MAB}{}
- \rput(#1){%
- \begin@ClosedObj
+\def\pstCircleAB{\@ifnextchar[\Pst@CircleAB{\Pst@CircleAB[]}}
+\def\Pst@CircleAB[#1]#2#3{%
+ \begingroup
+ \psset{#1}%
+ \def\pst@circle@diameter@A{#2}
+ \def\pst@circle@diameter@B{#3}
+ \@ifnextchar[\pstCircleAB@i{\pstCircleAB@i[0][360]}}%
+\def\pstCircleAB@i[#1][#2]{%
+ \Pst@MiddleAB[PointSymbol=none, PointName=none]{\pst@circle@diameter@B}{\pst@circle@diameter@A}{PST@CIRCLE@MAB}
+ \rput(\pst@circle@diameter@A){%
+ \begin@OpenObj
\def\pst@linetype{4}%
\addto@pscode{%
tx@NodeDict begin
- tx@NodeDict /N@@MAB load GetCenter
+ tx@NodeDict /N@PST@CIRCLE@MAB load GetCenter
end
2 copy
- tx@EcldDict begin /N@#2 GetNode ABDist end
- \psk@dimen CLW mul sub 0 360 arc closepath}%
+ tx@EcldDict begin /N@\pst@circle@diameter@B\space GetNode ABDist end
+ \psk@dimen\space CLW mul sub #1 #2 arc}%
\showpointsfalse
- \end@ClosedObj
+ \end@OpenObj
}%
- \egroup%
+ \endgroup%
}%
%% #2 #3 #4 -> 3 nodes defining the center and two points on the circle
\def\pstArcOAB{\pst@object{pstArcOAB}}%
@@ -1582,29 +1604,73 @@
%% Special macros for parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-\def\pstTriangleIC{\pst@object{pstTriangleIC}}% inner circle of a triangle
-\def\pstTriangleIC@i#1#2#3{%
- \begingroup
- \psset{PointSymbol=none,PointName=none,linestyle=none,CodeFig=false}
- \pstBissectBAC{#3}{#1}{#2}{IC_BC}
- \pstBissectBAC{#2}{#3}{#1}{IC_AB}
- \pstInterLL{#3}{IC_AB}{#1}{IC_BC}{IC_O}
- \pstProjection{#1}{#2}{IC_O}[IC_OAB]
- \endgroup
+%% \pstTriangleIC[Options]{A}{B}{C}[I][D]
+%% Draw the inner circle of triangle ABC
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the node A
+%% #3 -> [input] the node B
+%% #4 -> [input] the node C
+%% #5 -> [output] optional, the inner circle center I
+%% #6 -> [output] optional, the node on inner circle
+\def\pstTriangleIC{\@ifnextchar[\Pst@TriangleIC{\Pst@TriangleIC[]}}
+\def\Pst@TriangleIC[#1]#2#3#4{%
\begingroup
- \use@par
- \pstCircleOA{IC_O}{IC_OAB}
+ \@InitListMng %
+ % we should output none point name and symbol as default
+ % to compat with the old version.
+ \psset{PointName=none,PointSymbol=none}
+ % then comes the user local options.
+ \psset{#1}%
+ \def\pst@triangle@node@a{#2}
+ \def\pst@triangle@node@b{#3}
+ \def\pst@triangle@node@c{#4}
+ \@ifnextchar[\Pst@TriangleIC@i{\Pst@TriangleIC@i[IC_O]}}
+\def\Pst@TriangleIC@i[#1]{%
+ \def\pst@triangle@inner@center{#1}
+ \@ifnextchar[\Pst@TriangleIC@j{\Pst@TriangleIC@j[IC_OAB]}}
+\def\Pst@TriangleIC@j[#1]{%
+ \begingroup
+ \psset{PointSymbol=none,PointName=none,linestyle=none,CodeFig=false}
+ \pstBissectBAC{\pst@triangle@node@c}{\pst@triangle@node@a}{\pst@triangle@node@b}{@PST@TRIANGLE@IC_BC}
+ \pstBissectBAC{\pst@triangle@node@b}{\pst@triangle@node@c}{\pst@triangle@node@a}{@PST@TRIANGLE@IC_AB}
+ \pstInterLL{\pst@triangle@node@c}{@PST@TRIANGLE@IC_AB}{\pst@triangle@node@a}{@PST@TRIANGLE@IC_BC}{\pst@triangle@inner@center}
+ \pstProjection{\pst@triangle@node@a}{\pst@triangle@node@b}{\pst@triangle@inner@center}[#1]
+ \endgroup
+ \pstCircleOA{\pst@triangle@inner@center}{#1}
+ \Pst@ManageParamList{\pst@triangle@inner@center}%
+ \Pst@ManageParamList{#1}%
\endgroup
-}
+}%
%
-\def\pstTriangleOC{\pst@object{pstTriangleOC}}% inner circle of a triangle
-\def\pstTriangleOC@i#1#2#3{%
+%% \pstTriangleOC[Options]{A}{B}{C}[O]
+%% Draw the outer circle of triangle ABC
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the node A
+%% #3 -> [input] the node B
+%% #4 -> [input] the node C
+%% #5 -> [output] optional, the outer circle center O
+\def\pstTriangleOC{\@ifnextchar[\Pst@TriangleOC{\Pst@TriangleOC[]}}
+\def\Pst@TriangleOC[#1]#2#3#4{%
\begingroup
- \addbefore@par{PointSymbol=none,PointName=none}
- \use@par
- \pstCircleABC{#1}{#2}{#3}{OC_O}
+ % we should output none point name and symbol as default
+ % to compat with the old version.
+ \psset{PointName=none,PointSymbol=none}
+ % then comes the user local options.
+ \psset{#1}%
+ \def\pst@triangle@node@a{#2}
+ \def\pst@triangle@node@b{#3}
+ \def\pst@triangle@node@c{#4}
+ \@ifnextchar[\Pst@TriangleOC@i{\Pst@TriangleOC@i[OC_O]}}
+\def\Pst@TriangleOC@i[#1]{%
+ \begingroup
+ \psset{PointSymbol=none,PointName=none,CodeFig=false}
+ \pstCircleABC{\pst@triangle@node@a}{\pst@triangle@node@b}{\pst@triangle@node@c}{#1}
+ \endgroup
+ \Pst@geonodelabel{#1}%
\endgroup
-}
+}%
%
%% Distance between two points
\def\pstDistAB#1#2{%
@@ -1704,7 +1770,7 @@
\fi
\pnode(! %
/dec \psk@decimals\space def
- \psk@PSfont findfont \psk@fontscale scalefont setfont \pst@usecolor\pslinecolor
+ \psk@PSfont findfont \psk@fontscale scalefont setfont \pst@usecolor\pslinecolor
\ifpst@psfonts
/s1 { /Symbol findfont \psk@fontscale\space scalefont setfont } bind def
\else
@@ -1730,6 +1796,6203 @@
\ignorespaces
}
%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Here are some functions to operate the Coordinate
+%% of a given node.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%% \pstAbscissa{A}
+%% return the abscissa value of node A, which can be transformed to a new abscissa by pstricks raw code.
+%% Parameters:
+%% #1 -> [input] the input node
+\def\pstAbscissa#1{%
+ tx@EcldDict begin /N@#1 GetNode pop \pst@number\psxunit div end
+}%
+%
+%% \pstOrdinate{A}
+%% return the ordinate value of node A, which can be transformed to a new ordinate by pstricks raw code.
+%% Parameters:
+%% #1 -> [input] the input node
+\def\pstOrdinate#1{%
+ tx@EcldDict begin /N@#1 GetNode exch pop \pst@number\psyunit div end
+}%
+%
+%% \pstMoveNode[Options](dx,dy){A}{B}
+%% move node A by abscissa increment dx and ordinate increment dy to the target node B.
+%% This Macro will create the new node B.
+%% Parameters:
+%% #1 -> options
+%% #2 -> abscissa increment
+%% #3 -> ordinate increment
+%% #4 -> orignal node name
+%% #5 -> target node name
+\def\pstMoveNode{\@ifnextchar[\Pst@MoveNode{\Pst@MoveNode[]}}
+\def\Pst@MoveNode[#1]{%
+ \begingroup
+ \psset{#1}%
+ \Pst@MoveNode@i}
+\def\Pst@MoveNode@i(#1,#2)#3#4{%
+ \pnode(! \pstAbscissa{#3} #1 add \pstOrdinate{#3} #2 add){#4}%
+ \Pst@geonodelabel{#4}%
+ \endgroup%
+}%
+%
+%% \pstLine[Options]{node}{node}
+%% \pstLine[Options]{node}(coor)
+%% \pstLine[Options](coor){node}
+%% \pstLine[Options](coor)(coor)
+%% Create a new line with two nodes, or two coordinate or one node and one coordinate. This macro is similar with \pstLineAB, but more compatible.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the node or coordinate
+%% #3 -> [input] the node or coordinate
+\def\pstLine{\@ifnextchar[\Pst@Line{\Pst@Line[]}}
+\def\Pst@Line[#1]{%
+ \begingroup
+ \psset{#1}%
+ \@ifnextchar(\Pst@Line@i{\Pst@Line@j}}
+\def\Pst@Line@i(#1){%
+ \pnode(#1){@PSTLINE@AUXNODE@A}
+ \@ifnextchar(\Pst@Line@ii{\Pst@Line@jj}}
+\def\Pst@Line@j#1{%
+ \pnode(#1){@PSTLINE@AUXNODE@A}
+ \@ifnextchar(\Pst@Line@ii{\Pst@Line@jj}}
+\def\Pst@Line@ii(#1){%
+ \pnode(#1){@PSTLINE@AUXNODE@B}
+ \ncline{@PSTLINE@AUXNODE@A}{@PSTLINE@AUXNODE@B}
+ \endgroup}
+\def\Pst@Line@jj#1{%
+ \pnode(#1){@PSTLINE@AUXNODE@B}
+ \ncline{@PSTLINE@AUXNODE@A}{@PSTLINE@AUXNODE@B}
+ \endgroup}%
+%
+%% \pstLineAA[Options]{A}{angle}{B}
+%% \pstLineAS[Options]{A}{gradient}{B}
+%% Create a new line with Point A and the slope angle or the gradient. This macro will create the new node B on the line.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the point A on the line
+%% #3 -> [input] the slope angle or the gradient
+%% #4 -> [output] the new node B on the line
+\def\pstLineAA{\@ifnextchar[\Pst@LineAA{\Pst@LineAA[]}}
+\def\Pst@LineAA[#1]{%
+ \begingroup
+ \psset{#1}%
+ \@ifnextchar(\Pst@LineAA@i{\Pst@LineAA@j}}
+\def\Pst@LineAA@i(#1)#2#3{%
+ \pnode(#1){@PSTLINEASAUX}
+ \Pst@LineAA@k{@PSTLINEASAUX}{#2}{#3}}
+\def\Pst@LineAA@j#1#2#3{%
+ \pnode(#1){@PSTLINEASAUX}
+ \Pst@LineAA@k{@PSTLINEASAUX}{#2}{#3}}
+\def\Pst@LineAA@k#1#2#3{%
+ \pnode(!
+ \pstAbscissa{#1} #2 cos add
+ \pstOrdinate{#1} #2 sin add
+ ){#3}
+ \Pst@geonodelabel{#3}%
+ \pstLine{#1}{#3}
+ \endgroup%
+}%
+%
+\def\pstLineAS{\@ifnextchar[\Pst@LineAS{\Pst@LineAS[]}}
+\def\Pst@LineAS[#1]{%
+ \begingroup
+ \psset{#1}%
+ \@ifnextchar(\Pst@LineAS@i{\Pst@LineAS@j}}
+\def\Pst@LineAS@i(#1)#2#3{%
+ \pnode(#1){@PSTLINEASAUX}
+ \Pst@LineAS@k{@PSTLINEASAUX}{#2}{#3}}
+\def\Pst@LineAS@j#1#2#3{%
+ \pnode(#1){@PSTLINEASAUX}
+ \Pst@LineAS@k{@PSTLINEASAUX}{#2}{#3}}
+\def\Pst@LineAS@k#1#2#3{%
+ \pnode(!
+ \pstAbscissa{#1} 1 add
+ \pstOrdinate{#1} #2 add
+ ){#3}
+ \Pst@geonodelabel{#3}%
+ \pstLine{#1}{#3}
+ \endgroup%
+}%
+%
+%% \pstLineAbsNode[Options]{A}{B}{$x_0$}{C}
+%% Create a new node C on the line AB whose abscissa is the given value $x_0$.
+%% You can input $x_0$ as any number(e.g, 2.0), and use \pscalculate{} to generate the value,
+%% or use \pstAbscissa to get the abscissa of any node.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the line point A
+%% #3 -> [input] the line point B
+%% #4 -> [input] the abscissa value
+%% #5 -> [output] the target node name
+\def\pstLineAbsNode{\@ifnextchar[\Pst@LineAbsNode{\Pst@LineAbsNode[]}}
+\def\Pst@LineAbsNode[#1]{%
+ \begingroup
+ \psset{#1}%
+ \Pst@LineAbsNode@i}
+\def\Pst@LineAbsNode@i#1#2#3#4{%
+ \pnode(! #3 0){@LINEABSAUXA#1#2}\pnode(! #3 1){@LINEABSAUXB#1#2}%
+ \pstInterLL{#1}{#2}{@LINEABSAUXA#1#2}{@LINEABSAUXB#1#2}{#4}%
+ \Pst@geonodelabel{#4}%
+ \endgroup%
+}%
+%
+%% \pstLineOrdNode[Options]{A}{B}{$y_0$}{C}
+%% Create a new node C on the line AB whose ordinate is the given value $y_0$.
+%% You can input $y_0$ as any number(e.g, 2.0), and use \pscalculate{} to generate the value,
+%% or use \pstOrdinate to get the ordinate of any node.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the line point A
+%% #3 -> [input] the line point B
+%% #4 -> [input] the ordinate value
+%% #5 -> [output] the target node name
+\def\pstLineOrdNode{\@ifnextchar[\Pst@LineOrdNode{\Pst@LineOrdNode[]}}
+\def\Pst@LineOrdNode[#1]{%
+ \begingroup
+ \psset{#1}%
+ \Pst@LineOrdNode@i}
+\def\Pst@LineOrdNode@i#1#2#3#4{%
+ \pnode(! 0 #3){@LINEORDAUXA#1#2}\pnode(! 1 #3){@LINEORDAUXB#1#2}%
+ \pstInterLL{#1}{#2}{@LINEORDAUXA#1#2}{@LINEORDAUXB#1#2}{#4}%
+ \Pst@geonodelabel{#4}%
+ \endgroup%
+}%
+%
+%% \pstCircleAbsNode[Options]{O}{A}{$x_0$}{C}{D}
+%% Create the new nodes C and D on the Circle O whose abscissas are the given value $x_0$.
+%% The circle O is defined by center O and point A on the circle or Radius in parameter.
+%% You can input $x_0$ as any number(e.g, 2.0), and use \pscalculate{} to generate the value,
+%% or use \pstAbscissa to get the abscissa of any node.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the circle center O
+%% #3 -> [input] the circle point A or empty with Radius parameter
+%% #4 -> [input] the abscissa value
+%% #5 -> [output] the target node name
+%% #6 -> [output] the target node name
+\def\pstCircleAbsNode{\@ifnextchar[\Pst@CircleAbsNode{\Pst@CircleAbsNode[]}}
+\def\Pst@CircleAbsNode[#1]{%
+ \begingroup
+ \psset{#1}%
+ \Pst@CircleAbsNode@i}
+\def\Pst@CircleAbsNode@i#1#2#3#4#5{%
+ \pnode(! #3 0){@LINEABSAUXA#1#2}\pnode(! #3 1){@LINEABSAUXB#1#2}%
+ \pstInterLC{@LINEABSAUXA#1#2}{@LINEABSAUXB#1#2}{#1}{#2}{#4}{#5}%
+ \endgroup%
+}%
+%
+%% \pstCircleOrdNode[Options]{O}{A}{$y_0$}{C}{D}
+%% Create the new nodes C and D on the Circle O whose ordinates are the given value.
+%% The circle O is defined by center O and point A on the circle or Radius in parameter.
+%% You can input $y_0$ as any number(e.g, 2.0), and use \pscalculate{} to generate the value,
+%% or use \pstOrdinate to get the ordinate of any node.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the circle center O
+%% #3 -> [input] the circle point A or empty with Radius parameter
+%% #4 -> [input] the ordinate value
+%% #5 -> [output] the target node name
+%% #6 -> [output] the target node name
+\def\pstCircleOrdNode{\@ifnextchar[\Pst@CircleOrdNode{\Pst@CircleOrdNode[]}}
+\def\Pst@CircleOrdNode[#1]{%
+ \begingroup
+ \psset{#1}%
+ \Pst@CircleOrdNode@i}
+\def\Pst@CircleOrdNode@i#1#2#3#4#5{%
+ \pnode(! 0 #3){@LINEORDAUXA#1#2}\pnode(! 1 #3){@LINEORDAUXB#1#2}%
+ \pstInterLC{@LINEORDAUXA#1#2}{@LINEORDAUXB#1#2}{#1}{#2}{#4}{#5}%
+ \endgroup%
+}%
+%
+%% \pstCircleRotNode[Options]{O}{A}{X}
+%% Create a new node X on the Circle O whose RotAngle is the given value.
+%% The circle O is defined by center O and point A on the circle or Radius in parameter.
+%% If you not set RotAngle, the default value is $60^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the circle center O
+%% #3 -> [input] the circle point A or empty with Radius parameter
+%% #4 -> [output] the target node name
+\def\pstCircleRotNode{\@ifnextchar[\Pst@CircleRotNode{\Pst@CircleRotNode[]}}
+\def\Pst@CircleRotNode[#1]{%
+ \begingroup
+ \psset{#1}%
+ \Pst@CircleRotNode@i}
+\def\Pst@CircleRotNode@i#1#2#3{%
+ \pnode(!
+ tx@EcldDict begin
+ /N@#1 GetNode
+ \ifx\psk@Radius\@none
+ \ifx\psk@Diameter\@none
+ 2 copy /N@#2 GetNode ABDist
+ \else\psk@Diameter 2 div
+ \fi
+ \else\psk@Radius\space
+ \fi
+ end
+ \psk@RotAngle\space sin \psk@RotAngle\space cos %
+ 2 index mul 4 index add \pst@number\psxunit\space div %
+ 5 1 roll mul add \pst@number\psyunit\space div exch pop%
+ ){#3}%
+ \Pst@geonodelabel{#3}%
+ \endgroup%
+}%
+%
+%% \pstCircleTangentLine[Options]{O}{A}{T}
+%% Draw the tangent line from A on the circle, and give the other node B on the line.
+%% The circle O is defined by center O and point A on the circle.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the circle center O
+%% #3 -> [input] the circle point A.
+%% #4 -> [output] the target node name on the tangent line
+\def\pstCircleTangentLine{\@ifnextchar[\Pst@CircleTangentLine{\Pst@CircleTangentLine[]}}
+\def\Pst@CircleTangentLine[#1]{%
+ \begingroup
+ \psset{#1}%
+ \Pst@CircleTangentLine@i}
+\def\Pst@CircleTangentLine@i#1#2#3{%
+ \pst@getcoor{#1}\pst@tempO%
+ \pst@getcoor{#2}\pst@tempA%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempA \tx@UserCoor % x1,y1
+ 0 index 3 index sub abs 1E-5 lt { % if y1=y0
+ 1 index 1 index 1 add
+ 6 2 roll pop pop pop pop
+ } {
+ 1 index 4 index sub abs 1E-5 lt { % if x1=x0
+ 1 index 1 add 1 index
+ 6 2 roll pop pop pop pop
+ } {
+ 1 index 4 index sub % x1-x0
+ 1 index 4 index sub % y1-y0
+ div neg 1 index add % -(x1-x0)/(y1-y0) + y1
+ 2 index 1 add % x=x1+1
+ exch 6 2 roll pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#3}%
+ \Pst@geonodelabel{#3}%
+ \pstLine{#2}{#3}
+ \endgroup%
+}%
+%
+%% \pstCircleTangentNode[Options]{O}{A}{P}{T1}{T2}
+%% Draw the tangent line from P out of the circle A(O), and give the two tangent nodes T1/T2 on the line.
+%% The circle O is defined by center O and point A on the circle or Radius in parameter.
+%% Suppose the coordinate of tangent node is (x,y), and node T is (a,b), the circle radius is r, then we have
+%% $$(y-y0)(y-b)+(x-x0)(x-a)=0$$
+%% but (x,y) is on the circle, so we have
+%% $$x=rcos\theta+x_0, y=rcos\theta+y_0$$
+%% then
+%% $$(x_0-a)\cos\theta+(b-y_0)\sin\theta=r$$
+%% if we take $e=a-x_0$, $f=b-y_0$, we have
+%% $$(e^2+f^2)\sin^\theta-2rf\sin\theta+r^2-e^2=0$$
+%% so
+%% $$\sin\theta=\dfrac{rf\pm{}e\sqrt{e^2+f^2-r^2}}{e^2+f^2}$$
+%% $$\cos\theta=\dfrac{re\mp{}f\sqrt{e^2+f^2-r^2}}{e^2+f^2}$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the circle center O
+%% #3 -> [input] the circle point A or empty with Radius parameter
+%% #4 -> [input] the node name T out of circle
+%% #5 -> [output] the first target name on the circle
+%% #6 -> [output] the second target name on the circle
+\def\pstCircleTangentNode{\@ifnextchar[\Pst@CircleTangentNode{\Pst@CircleTangentNode[]}}
+\def\Pst@CircleTangentNode[#1]{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \Pst@CircleTangentNode@i}
+\def\Pst@CircleTangentNode@i#1#2#3#4#5{%
+ \pst@getcoor{#1}\pst@tempO%
+ \ifx\relax#2\relax\else\pst@getcoor{#2}\pst@tempV\fi%
+ \pst@getcoor{#3}\pst@tempT%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempT \tx@UserCoor % a,b
+ \ifx\psk@Radius\@none
+ \ifx\psk@Diameter\@none
+ \pst@tempV \tx@UserCoor % nx,ny
+ 4 index sub dup mul exch 5 index sub dup mul add sqrt
+ \else\psk@Diameter\space 2 div \pst@number\psxunit div
+ \fi
+ \else\psk@Radius\space \pst@number\psxunit div
+ \fi % r
+ 2 index 5 index sub % e=a-x0
+ 2 index 5 index sub % f=b-y0
+ 1 index dup mul 1 index dup mul add % e^2+f^2
+ 0 index 4 index dup mul sub
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop 0 0
+ } {
+ sqrt % sqrt(e^2+f^2-r^2)
+ 4 index 3 index mul 4 index 2 index mul sub 2 index div % \sin\theta
+ 5 index 5 index mul 4 index 3 index mul add 3 index div % \cos\theta
+ 6 index 1 index mul 11 index add % x_1
+ 7 index 3 index mul 11 index add % y_1
+ 13 2 roll pop pop pop pop pop
+ pop pop pop pop pop pop
+ } ifelse
+ ){#4}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempT \tx@UserCoor % a,b
+ \ifx\psk@Radius\@none
+ \ifx\psk@Diameter\@none
+ \pst@tempV \tx@UserCoor % nx,ny
+ 4 index sub dup mul exch 5 index sub dup mul add sqrt
+ \else\psk@Diameter\space 2 div \pst@number\psxunit div
+ \fi
+ \else\psk@Radius\space \pst@number\psxunit div
+ \fi % r
+ 2 index 5 index sub % e=a-x0
+ 2 index 5 index sub % f=b-y0
+ 1 index dup mul 1 index dup mul add % e^2+f^2
+ 0 index 4 index dup mul sub
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop 0 0
+ } {
+ sqrt % sqrt(e^2+f^2-r^2)
+ 4 index 3 index mul 4 index 2 index mul add 2 index div % \sin\theta
+ 5 index 5 index mul 4 index 3 index mul sub 3 index div % \cos\theta
+ 6 index 1 index mul 11 index add % x_1
+ 7 index 3 index mul 11 index add % y_1
+ 13 2 roll pop pop pop pop pop
+ pop pop pop pop pop pop
+ } ifelse
+ ){#5}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \pstLine{#3}{#4}
+ \pstLine{#3}{#5}
+ \endgroup%
+}%
+%
+%% \pstCircleExternalCommonTangent[Options]{O1}{A}{O2}{B}{T1}{T2}{T3}{T4}
+%% Find the external common tangent lines of the circle A(O1) and B(O2), mark the two tangent nodes T1/T2 on circle A(O1),
+%% and the two tangent nodes T3/T4 on circle B(O2).
+%% The circle A(O1) is defined by center O1 and point A on the circle or RadiusA/DiameterA in parameter.
+%% The circle B(O1) is defined by center O2 and point B on the circle or RadiusB/DiameterB in parameter.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the circle center O
+%% #3 -> [input] the circle point A or empty with Radius parameter
+%% #4 -> [input] the node name T out of circle
+%% #5 -> [output] the first target name on the circle
+%% #6 -> [output] the second target name on the circle
+\def\pstCircleExternalCommonTangent{\@ifnextchar[\Pst@CircleExternalCommonTangent{\Pst@CircleExternalCommonTangent[]}}
+\def\Pst@CircleExternalCommonTangent[#1]{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \Pst@CircleExternCommonTangent@i}
+\def\Pst@CircleExternCommonTangent@i#1#2#3#4#5#6#7#8{%
+ % use edef to save the second Radius or Diameter.
+ \edef\pst@RadiusB@temp{\psk@RadiusB}
+ \edef\pst@DiameterB@temp{\psk@DiameterB}
+ % use RadiusA or DiameterA to find the intersection of A(O1) and O1O2.
+ \ifx\psk@RadiusA\@undef
+ \ifx\psk@DiameterA\@undef\relax\else
+ \psset{Diameter=\psk@DiameterA}
+ \fi
+ \else\psset{Radius=\psk@RadiusA}\fi
+ \pstInterLC[PointName=none,PointSymbol=none]{#1}{#3}{#1}{#2}{@PST@CIRCLE@INTER@A}{@PST@CIRCLE@INTER@C}
+ % clear the used options
+ \let\psk@Radius\@none\let\psk@Diameter\@none
+ % use RadiusB or DiameterB to find the intersection of B(O2) and O1O2.
+ \ifx\psk@RadiusB\@undef
+ \ifx\psk@DiameterB\@undef\relax\else
+ \psset{Diameter=\psk@DiameterB}
+ \fi
+ \else\psset{Radius=\psk@RadiusB}\fi
+ \pstInterLC[PointName=none,PointSymbol=none]{#1}{#3}{#3}{#4}{@PST@CIRCLE@INTER@B}{@PST@CIRCLE@INTER@D}
+ % clear the used options
+ \let\psk@Radius\@none\let\psk@Diameter\@none
+ \pstRotation[RotAngle=90,PointName=none,PointSymbol=none]{#1}{@PST@CIRCLE@INTER@A}[@PST@CIRCLE@INTER@AA]
+ \pstRotation[RotAngle=90,PointName=none,PointSymbol=none]{#3}{@PST@CIRCLE@INTER@B}[@PST@CIRCLE@INTER@BB]
+ \pstInterLL[PointName=none,PointSymbol=none]{#1}{#3}{@PST@CIRCLE@INTER@AA}{@PST@CIRCLE@INTER@BB}{@PST@CIRCLE@INTER@K}
+ \pstMiddleAB[PointName=none,PointSymbol=none]{#1}{@PST@CIRCLE@INTER@K}{@PST@CIRCLE@CENTER@X}
+ \pstMiddleAB[PointName=none,PointSymbol=none]{#3}{@PST@CIRCLE@INTER@K}{@PST@CIRCLE@CENTER@Y}
+ % use RadiusA or DiameterA to find the intersection of A(O1) and K(X).
+ % Note that we should set Radius to @none and set RadiusB and DiameterB to @undef.
+ \ifx\psk@RadiusA\@undef\relax\else\psset{RadiusA=\psk@RadiusA}\fi
+ \ifx\psk@RadiusA\@undef
+ \ifx\psk@DiameterA\@undef\relax\else
+ \psset{DiameterA=\psk@DiameterA}
+ \fi
+ \else\psset{RadiusA=\psk@RadiusA}\fi
+ \let\psk@Radius\@none\let\psk@Diameter\@none
+ \let\psk@RadiusB\@undef\let\psk@DiameterB\@undef
+ \pstInterCC[PointName=none,PointSymbol=none]{#1}{#2}{@PST@CIRCLE@CENTER@X}{#1}{#5}{#6}
+ % use RadiusB or DiameterB to find the intersection of B(O2) and K(Y).
+ % Note that we should set Radius to @none and set RadiusB and DiameterB to @undef.
+ \ifx\pst@RadiusB@temp\@undef
+ \ifx\pst@DiameterB@temp\@undef\relax\else
+ \psset{DiameterA=\pst@DiameterB@temp}
+ \fi
+ \else\psset{RadiusA=\pst@RadiusB@temp}\fi
+ \let\psk@Radius\@none\let\psk@Diameter\@none
+ \let\psk@RadiusB\@undef\let\psk@DiameterB\@undef
+ \pstInterCC[PointName=none,PointSymbol=none]{#3}{#4}{@PST@CIRCLE@CENTER@Y}{#3}{#7}{#8}
+ % CodeFig:
+ %\pstLine{#1}{@PST@CIRCLE@INTER@AA}
+ %\pstLine{#3}{@PST@CIRCLE@INTER@BB}
+ %\pstLine{#1}{@PST@CIRCLE@INTER@K}
+ %\pstLine{@PST@CIRCLE@INTER@K}{@PST@CIRCLE@INTER@AA}
+ %\let\psk@Radius\@none\let\psk@Diameter\@none
+ %\pstCircleOA[linestyle=dashed,linecolor=gray!30]{@PST@CIRCLE@CENTER@X}{#1}
+ %\pstCircleOA[linestyle=dashed,linecolor=blue!30]{@PST@CIRCLE@CENTER@Y}{#3}
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \Pst@ManageParamList{#7}%
+ \Pst@ManageParamList{#8}%
+ \endgroup%
+}%
+%
+%% \pstCircleInternalCommonTangent[Options]{O1}{A}{O2}{B}{T1}{T2}{T3}{T4}
+%% Find the internal common tangent lines of the circle A(O1) and B(O2), mark the two tangent nodes T1/T2 on circle A(O1),
+%% and the two tangent nodes T3/T4 on circle B(O2).
+%% The circle A(O1) is defined by center O1 and point A on the circle or RadiusA/DiameterA in parameter.
+%% The circle B(O1) is defined by center O2 and point B on the circle or RadiusB/DiameterB in parameter.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the circle center O
+%% #3 -> [input] the circle point A or empty with Radius parameter
+%% #4 -> [input] the node name T out of circle
+%% #5 -> [output] the first target name on the circle
+%% #6 -> [output] the second target name on the circle
+\def\pstCircleInternalCommonTangent{\@ifnextchar[\Pst@CircleInternalCommonTangent{\Pst@CircleInternalCommonTangent[]}}
+\def\Pst@CircleInternalCommonTangent[#1]{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \Pst@CircleInternalCommonTangent@i}
+\def\Pst@CircleInternalCommonTangent@i#1#2#3#4#5#6#7#8{%
+ % use edef to save the second Radius or Diameter.
+ \edef\pst@RadiusB@temp{\psk@RadiusB}
+ \edef\pst@DiameterB@temp{\psk@DiameterB}
+ % use RadiusA or DiameterA to find the intersection of A(O1) and O1O2.
+ \ifx\psk@RadiusA\@undef
+ \ifx\psk@DiameterA\@undef\relax\else
+ \psset{Diameter=\psk@DiameterA}
+ \fi
+ \else\psset{Radius=\psk@RadiusA}\fi
+ \pstInterLC[PointName=none,PointSymbol=none]{#1}{#3}{#1}{#2}{@PST@CIRCLE@INTER@A}{@PST@CIRCLE@INTER@C}
+ % clear the used options
+ \let\psk@Radius\@none\let\psk@Diameter\@none
+ % use RadiusB or DiameterB to find the intersection of B(O2) and O1O2.
+ \ifx\psk@RadiusB\@undef
+ \ifx\psk@DiameterB\@undef\relax\else
+ \psset{Diameter=\psk@DiameterB}
+ \fi
+ \else\psset{Radius=\psk@RadiusB}\fi
+ \pstInterLC[PointName=none,PointSymbol=none]{#1}{#3}{#3}{#4}{@PST@CIRCLE@INTER@B}{@PST@CIRCLE@INTER@D}
+ % clear the used options
+ \let\psk@Radius\@none\let\psk@Diameter\@none
+ \pstRotation[RotAngle=90,PointName=none,PointSymbol=none]{#1}{@PST@CIRCLE@INTER@A}[@PST@CIRCLE@INTER@AA]
+ \pstRotation[RotAngle=-90,PointName=none,PointSymbol=none]{#3}{@PST@CIRCLE@INTER@B}[@PST@CIRCLE@INTER@BB]
+ \pstInterLL[PointName=none,PointSymbol=none]{#1}{#3}{@PST@CIRCLE@INTER@AA}{@PST@CIRCLE@INTER@BB}{@PST@CIRCLE@INTER@K}
+ \pstMiddleAB[PointName=none,PointSymbol=none]{#1}{@PST@CIRCLE@INTER@K}{@PST@CIRCLE@CENTER@X}
+ \pstMiddleAB[PointName=none,PointSymbol=none]{#3}{@PST@CIRCLE@INTER@K}{@PST@CIRCLE@CENTER@Y}
+ % use RadiusA or DiameterA to find the intersection of A(O1) and K(X).
+ % Note that we should set Radius to @none and set RadiusB and DiameterB to @undef.
+ \ifx\psk@RadiusA\@undef\relax\else\psset{RadiusA=\psk@RadiusA}\fi
+ \ifx\psk@RadiusA\@undef
+ \ifx\psk@DiameterA\@undef\relax\else
+ \psset{DiameterA=\psk@DiameterA}
+ \fi
+ \else\psset{RadiusA=\psk@RadiusA}\fi
+ \let\psk@Radius\@none\let\psk@Diameter\@none
+ \let\psk@RadiusB\@undef\let\psk@DiameterB\@undef
+ \pstInterCC[PointName=none,PointSymbol=none]{#1}{#2}{@PST@CIRCLE@CENTER@X}{#1}{#5}{#6}
+ % use RadiusB or DiameterB to find the intersection of B(O2) and K(Y).
+ % Note that we should set Radius to @none and set RadiusB and DiameterB to @undef.
+ \ifx\pst@RadiusB@temp\@undef
+ \ifx\pst@DiameterB@temp\@undef\relax\else
+ \psset{DiameterA=\pst@DiameterB@temp}
+ \fi
+ \else\psset{RadiusA=\pst@RadiusB@temp}\fi
+ \let\psk@Radius\@none\let\psk@Diameter\@none
+ \let\psk@RadiusB\@undef\let\psk@DiameterB\@undef
+ \pstInterCC[PointName=none,PointSymbol=none]{#3}{#4}{@PST@CIRCLE@CENTER@Y}{#3}{#7}{#8}
+ % CodeFig:
+ %\pstLine{#1}{@PST@CIRCLE@INTER@AA}
+ %\pstLine{#3}{@PST@CIRCLE@INTER@BB}
+ %\pstLine{#1}{@PST@CIRCLE@INTER@K}
+ %\pstLine{@PST@CIRCLE@INTER@K}{@PST@CIRCLE@INTER@AA}
+ %\let\psk@Radius\@none\let\psk@Diameter\@none
+ %\pstCircleOA[linestyle=dashed,linecolor=gray!30]{@PST@CIRCLE@CENTER@X}{#1}
+ %\pstCircleOA[linestyle=dashed,linecolor=blue!30]{@PST@CIRCLE@CENTER@Y}{#3}
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \Pst@ManageParamList{#7}%
+ \Pst@ManageParamList{#8}%
+ \endgroup%
+}%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Here are some functions to operate the conic curves.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 1. Standard Ellipse with coordinate translation
+%% ----------------------------------------------------------
+%% The Ellipse E is defined by center O, the half of the major axis $max(abs(a),abs(b))$,
+%% the half of the minor axis $min(abs(a),abs(b))$, the equation as following:
+%% \begin{equation}\label{FunctionOfStandardEllipse}
+%% \dfrac{(x-x_o)^2}{a^2}+\dfrac{(y-y_o)^2}{b^2}=1
+%% \end{equation}
+%% Sometimes we use the parametric function of the ellipse:
+%% \begin{equation}\label{ParametricFunctionOfEllipse}
+%% \left\{\begin{array}{l}
+%% x=a\cos\alpha+x_o\\
+%% y=b\sin\alpha+y_0
+%% \end{array}\right.
+%% \end{equation}
+%
+%% \pstEllipse[Options](O)(a,b)[angleA][angleB]
+%% Draw a Ellipse with center O from angleA to angleB, going counter clockwise,
+%% the half of the major axis $max(abs(a),abs(b))$, and the half of the minor axis $min(abs(a),abs(b))$.
+%% This macro is like \psellipse and \psellipticarc in \PST.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] start angle from angleA to angleB, going counter clockwise.
+%% #5 -> [input] start angle from angleA to angleB, going counter clockwise.
+\def\pstEllipse{\@ifnextchar[\Pst@Ellipse{\Pst@Ellipse[]}}
+\def\Pst@Ellipse[#1](#2)(#3){%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@Ellipse@i{\Pst@Ellipse@i[0][360]}}%
+\def\Pst@Ellipse@i[#1][#2]{%
+ \parametricplot{#1}{#2}{%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ 3 index 2 index t cos mul add % x0+a\cos{t}
+ 3 index 2 index t sin mul add % y0+b\sin{t}
+ 6 2 roll pop pop pop pop
+ }%
+ \endgroup%
+}%
+%
+%% \pstEllipseNode[Options](O)(a,b){t}{P}
+%% Create a new node P on the Ellipse E whose parameter is the given value $t$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the parametric argument t.
+%% #5 -> [output] the target node name.
+\def\pstEllipseNode{\@ifnextchar[\Pst@pstEllipseNode{\Pst@pstEllipseNode[]}}
+\def\Pst@pstEllipseNode[#1](#2)(#3)#4#5{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ 3 index 2 index #4 cos mul add % x0+a\cos{t}
+ 3 index 2 index #4 sin mul add % y0+b\sin{t}
+ 6 2 roll pop pop pop pop
+ ){#5}%
+ \Pst@geonodelabel{#5}%
+ \endgroup%
+}%
+%
+%% \pstEllipseRotNode[Options](O)(a,b){P}
+%% Create a new node P on the Ellipse E whose RotAngle is the given value.
+%% If you not set RotAngle, the default value is $60^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [output] the target node name
+\def\pstEllipseRotNode{\@ifnextchar[\Pst@EllipseRotNode{\Pst@EllipseRotNode[]}}
+\def\Pst@EllipseRotNode[#1]{%
+ \begingroup
+ \psset{#1}%
+ \Pst@EllipseRotNode@i}
+\def\Pst@EllipseRotNode@i(#1)(#2)#3{%
+ \pst@getcoor{#1}\pst@tempO%
+ \pst@getcoor{#2}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ 3 index 2 index \psk@RotAngle\space cos mul add % x0+a\cos{t}
+ 3 index 2 index \psk@RotAngle\space sin mul add % y0+b\sin{t}
+ 6 2 roll pop pop pop pop
+ ){#3}%
+ \Pst@geonodelabel{#3}%
+ \endgroup%
+}%
+%
+%% \pstEllipseAbsNode[Options](O)(a,b){x_1}{A}{B}
+%% Create the two nodes A and B whose abscissas are the given value $x_1$ on the Ellipse E.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the given abscissa value $x_1$
+%% #5 -> [output] the first target node name $A$
+%% #6 -> [output] the second target node name $B$
+\def\pstEllipseAbsNode{\@ifnextchar[\Pst@EllipseAbsNode{\Pst@EllipseAbsNode[]}}
+\def\Pst@EllipseAbsNode[#1]{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \Pst@EllipseAbsNode@i}
+\def\Pst@EllipseAbsNode@i(#1)(#2)#3#4#5{%
+ \pst@getcoor{#1}\pst@tempO%
+ \pst@getcoor{#2}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #3 % x_1
+ 2 index dup mul 1 index 6 index sub dup mul sub % a^2-(x_1-x_o)^2
+ dup 0 lt {
+ pop pop pop pop pop pop 0 0
+ }{
+ sqrt 2 index mul 3 index div % b/a sqrt(a^2-(x_1-x_o)^2)
+ 4 index exch sub % y_o-ditto
+ 6 2 roll pop pop pop pop
+ } ifelse
+ ){#4}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #3 % x_1
+ 2 index dup mul 1 index 6 index sub dup mul sub % a^2-(x_1-x_o)^2
+ dup 0 lt {
+ pop pop pop pop pop pop 0 0
+ }{
+ sqrt 2 index mul 3 index div % b/a sqrt(a^2-(x_1-x_o)^2)
+ 4 index add % y_o+ditto
+ 6 2 roll pop pop pop pop
+ } ifelse
+ ){#5}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \endgroup%
+}%
+%
+%% \pstEllipseOrdNode[Options](O)(a,b){y_1}{A}{B}
+%% Create the two nodes A and B whose ordinates are the given value $y_1$ on the Ellipse E.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the given ordinate value $y_1$
+%% #5 -> [output] the first target node name $A$
+%% #6 -> [output] the second target node name $B$
+\def\pstEllipseOrdNode{\@ifnextchar[\Pst@EllipseOrdNode{\Pst@EllipseOrdNode[]}}
+\def\Pst@EllipseOrdNode[#1]{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \Pst@EllipseOrdNode@i}
+\def\Pst@EllipseOrdNode@i(#1)(#2)#3#4#5{%
+ \pst@getcoor{#1}\pst@tempO%
+ \pst@getcoor{#2}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #3 % y_1
+ 1 index dup mul 1 index 5 index sub dup mul sub % b^2-(y_1-y_o)^2
+ dup 0 lt {
+ pop pop pop pop pop pop 0 0
+ }{
+ sqrt 3 index mul 2 index div % a/b sqrt(b^2-(y_1-y_o)^2)
+ 5 index exch sub % x_o-ditto
+ exch 6 2 roll pop pop pop pop
+ } ifelse
+ ){#4}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ abs exch abs exch % |a|,|b|
+ #3 % y_1
+ 1 index dup mul 1 index 5 index sub dup mul sub % b^2-(y_1-y_o)^2
+ dup 0 lt {
+ pop pop pop pop pop pop 0 0
+ }{
+ sqrt 3 index mul 2 index div % a/b sqrt(b^2-(y_1-y_o)^2)
+ 5 index add % x_o+ditto
+ exch 6 2 roll pop pop pop pop
+ } ifelse
+ ){#5}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \endgroup%
+}%
+%
+%% \pstEllipseFocusNode[Options](O)(a,b){$F_1$}{$F_2$}
+%% Get the two focus $F_1$ and $F_2$ point of the Ellipse E and create two new nodes.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [output] the left/down node name
+%% #5 -> [output] the right/up node name
+\def\pstEllipseFocusNode{\@ifnextchar[\Pst@EllipseFocusNode{\Pst@EllipseFocusNode[]}}
+\def\Pst@EllipseFocusNode[#1]{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \Pst@EllipseFocusNode@i}
+\def\Pst@EllipseFocusNode@i(#1)(#2)#3#4{%
+ \pst@getcoor{#1}\pst@tempO%
+ \pst@getcoor{#2}\pst@tempR%
+ \pnode(!
+ \pst@tempO % x0,y0
+ \pst@tempR % a,b
+ abs exch abs exch % |a|,|b|
+ 2 copy gt {% Focus on haxis
+ 1 index dup mul 1 index dup mul sub sqrt % c=sqrt(a^2-b^2)
+ 4 index exch sub % x0-c
+ 3 index 6 2 roll pop pop pop pop % Left(x0-c,y0)
+ }{% Focus on vaxis
+ 0 index dup mul 2 index dup mul sub sqrt % c=sqrt(b^2-a^2)
+ 3 index exch sub % y0-c
+ 4 index exch 6 2 roll pop pop pop pop % Down(x0,y0-c)
+ } ifelse
+ \tx@UserCoor %
+ ){#3}%
+ \pnode(!
+ \pst@tempO % x0,y0
+ \pst@tempR % a,b
+ abs exch abs exch % |a|,|b|
+ 2 copy gt {% Focus on haxis
+ 1 index dup mul 1 index dup mul sub sqrt % c=sqrt(a^2-b^2)
+ 4 index add % x0+c
+ 3 index 6 2 roll pop pop pop pop % Right(x0+c,y0)
+ }{% Focus on vaxis
+ 0 index dup mul 2 index dup mul sub sqrt % c=sqrt(b^2-a^2)
+ 3 index add % y0+c
+ 4 index exch 6 2 roll pop pop pop pop % Up(x0,y0+c)
+ } ifelse
+ \tx@UserCoor %
+ ){#4}%
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \endgroup%
+}%
+%
+%% \pstEllipseDirectrixLine[Options](O)(a,b){Lx}{Ly}{Rx}{Ry}
+%% Get the two directrix line of the Ellipse E and create two new nodes on each of them.
+%% the nodes Lx Ly Rx Ry lie on the tangent line of the vertex on the other axis.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [output] the A node name on the left/down directrix line
+%% #5 -> [output] the B node name on the left/down directrix line
+%% #6 -> [output] the A node name on the right/up directrix line
+%% #7 -> [output] the B node name on the right/up directrix line
+\def\pstEllipseDirectrixLine{\@ifnextchar[\Pst@EllipseDirectrixLine{\Pst@EllipseDirectrixLine[]}}
+\def\Pst@EllipseDirectrixLine[#1]{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1} %
+ \Pst@EllipseDirectrixLine@i}
+\def\Pst@EllipseDirectrixLine@i(#1)(#2)#3#4#5#6{%
+ \pst@getcoor{#1}\pst@tempO%
+ \pst@getcoor{#2}\pst@tempR%
+ \pnode(!
+ \pst@tempO % x0,y0
+ \pst@tempR % a,b
+ abs exch abs exch % |a|,|b|
+ 2 copy gt {% left directrix line perpendicular to the haxis
+ 1 index dup mul 1 index dup mul sub sqrt % c=sqrt(a^2-b^2)
+ 2 index dup mul exch div % a^2/c
+ 4 index exch sub % x0-a^2/c
+ 3 index 2 index sub % y0-b
+ 6 2 roll pop pop pop pop % First A(x0-a^2/c,y0-b)
+ }{% down directrix line perpendicular to the vaxis
+ 0 index dup mul 2 index dup mul sub sqrt % c=sqrt(b^2-a^2)
+ 1 index dup mul exch div % b^2/c
+ 3 index exch sub % y0-b^2/c
+ 4 index 3 index sub % x0-a
+ exch 6 2 roll pop pop pop pop % Fisrt A(x0-a,y0-b^2/c)
+ } ifelse
+ \tx@UserCoor %
+ ){#3}%
+ \pnode(!
+ \pst@tempO % x0,y0
+ \pst@tempR % a,b
+ abs exch abs exch % |a|,|b|
+ 2 copy gt {% left directrix line perpendicular to the haxis
+ 1 index dup mul 1 index dup mul sub sqrt % c=sqrt(a^2-b^2)
+ 2 index dup mul exch div % a^2/c
+ 4 index exch sub % x0-a^2/c
+ 3 index 2 index add % y0+b
+ 6 2 roll pop pop pop pop % First B(x0-a^2/c,y0+b)
+ }{% down directrix line perpendicular to the vaxis
+ 0 index dup mul 2 index dup mul sub sqrt % c=sqrt(b^2-a^2)
+ 1 index dup mul exch div % b^2/c
+ 3 index exch sub % y0-b^2/c
+ 4 index 3 index add % x0+a
+ exch 6 2 roll pop pop pop pop % Fisrt B(x0+a,y0-b^2/c)
+ } ifelse
+ \tx@UserCoor %
+ ){#4}%
+ \pnode(!
+ \pst@tempO % x0,y0
+ \pst@tempR % a,b
+ abs exch abs exch % |a|,|b|
+ 2 copy gt {% right directrix line perpendicular to the haxis
+ 1 index dup mul 1 index dup mul sub sqrt % c=sqrt(a^2-b^2)
+ 2 index dup mul exch div % a^2/c
+ 4 index add % x0+a^2/c
+ 3 index 2 index sub % y0-b
+ 6 2 roll pop pop pop pop % Second A(x0+a^2/c,y0-b)
+ }{% up directrix line perpendicular to the vaxis
+ 0 index dup mul 2 index dup mul sub sqrt % c=sqrt(b^2-a^2)
+ 1 index dup mul exch div % b^2/c
+ 3 index add % y0+b^2/c
+ 4 index 3 index sub % x0-a
+ exch 6 2 roll pop pop pop pop % Second A(x0-a,y0+b^2/c)
+ } ifelse
+ \tx@UserCoor %
+ ){#5}%
+ \pnode(!
+ \pst@tempO % x0,y0
+ \pst@tempR % a,b
+ abs exch abs exch % |a|,|b|
+ 2 copy gt {% right directrix line perpendicular to the haxis
+ 1 index dup mul 1 index dup mul sub sqrt % c=sqrt(a^2-b^2)
+ 2 index dup mul exch div % a^2/c
+ 4 index add % x0+a^2/c
+ 3 index 2 index add % y0+b
+ 6 2 roll pop pop pop pop % Second B(x0+a^2/c,y0+b)
+ }{% up directrix line perpendicular to the vaxis
+ 0 index dup mul 2 index dup mul sub sqrt % c=sqrt(b^2-a^2)
+ 1 index dup mul exch div % b^2/c
+ 3 index add % y0+b^2/c
+ 4 index 3 index add % x0+a
+ exch 6 2 roll pop pop pop pop % Second B(x0+a,y0+b^2/c)
+ } ifelse
+ \tx@UserCoor %
+ ){#6}%
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \pstLineAB{#3}{#4}
+ \pstLineAB{#5}{#6}
+ \endgroup%
+}%
+%
+%% \pstEllipseLineInter[Options](O)(a,b){A}{B}{C}{D}
+%% Get the two intersection $C$ and $D$ of the Ellipse E and the given line AB.
+%% We can represent the line AB as the following function when line AB is not vertical:
+%% $$y=kx+t$$ where $$k=\dfrac{y_2-y_1}{x_2-x_1}, t=\dfrac{x_2y_1-x_1y_2}{x_2-x_1}$$
+%% the intersection points are:
+%% $$x1=x_o-\dfrac{a^2km+ab\sqrt{w}}{u}, x2=x_o-\dfrac{a^2km-ab\sqrt{w}}{u}$$
+%% $$y_{1,2}=kx_{1,2}+t$$
+%% where,
+%% $$u=a^2k^2+b^2, m=kx_o-y_o+t, w=u-m^2$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the node name A on the given line
+%% #5 -> [input] the node name B on the given line
+%% #6 -> [output] the first intersection node name
+%% #7 -> [output] the second intersection node name
+\def\pstEllipseLineInter{\@ifnextchar[\Pst@EllipseLineInter{\Pst@EllipseLineInter[]}}
+\def\Pst@EllipseLineInter[#1](#2)(#3)#4#5#6#7{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pst@getcoor{#4}\pst@tempA%
+ \pst@getcoor{#5}\pst@tempB%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ pop pop pop
+ 2 index dup mul 1 index 6 index sub dup mul sub % a^2-(x_1-x_o)^2
+ dup 0 lt {
+ pop pop pop pop pop pop 0 0
+ }{
+ sqrt 2 index mul 3 index div % b/a sqrt(a^2-(x_1-x_o)^2)
+ 4 index exch sub % y_o-ditto
+ 6 2 roll pop pop pop pop
+ } ifelse
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % t
+ 7 index dup mul 2 index dup mul mul 7 index dup mul add % u
+ 2 index 11 index mul 10 index sub 2 index add % m
+ 1 index 1 index dup mul sub dup 0 lt { % w
+ pop pop pop pop pop pop pop pop pop pop pop pop pop 0 0
+ } {
+ sqrt 10 index mul 9 index mul 10 index dup mul 2 index mul 5 index mul add 2 index div 12 index exch sub % x1
+ dup 5 index mul 4 index add % y1
+ 14 2 roll pop pop pop pop pop pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#6}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ pop pop pop
+ 2 index dup mul 1 index 6 index sub dup mul sub % a^2-(x_1-x_o)^2
+ dup 0 lt {
+ pop pop pop pop pop pop 0 0
+ }{
+ sqrt 2 index mul 3 index div % b/a sqrt(a^2-(x_1-x_o)^2)
+ 4 index add % y_o+ditto
+ 6 2 roll pop pop pop pop
+ } ifelse
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % t
+ 7 index dup mul 2 index dup mul mul 7 index dup mul add % u
+ 2 index 11 index mul 10 index sub 2 index add % m
+ 1 index 1 index dup mul sub dup 0 lt { % w
+ pop pop pop pop pop pop pop pop pop pop pop pop pop 0 0
+ } {
+ sqrt 10 index mul 9 index mul 10 index dup mul 2 index mul 5 index mul sub 2 index div 12 index add % x2
+ dup 5 index mul 4 index add % y2
+ 14 2 roll pop pop pop pop pop pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#7}%
+ \Pst@ManageParamList{#6}%
+ \Pst@ManageParamList{#7}%
+ \endgroup%
+}%
+%
+%% \pstEllipsePolarNode[Options](O)(a,b){A}{B}{T}
+%% Draw the every tangent line through the point $A$ and $B$ on the Ellipse E and get the insection node T of the two tangent lines. We call T as the polar point of chord AB.
+%% We use the intersection of two polar lines to get the tangent line. The proposition can be represented as:
+%% Give chord AB on the ellipse, we draw any other two chords PQ and RS, AB and PQ intersect at I, AQ and BP intersect at X, AP and BQ intersect at Y, we call XY is the polar line of point I. Also AB and RS intersect at J, AR and BS intersect at M, AS and BR intersect at N, we call MN is the polar line of point J. Then the intersection T of XY and MN is the polar point of chord AB, i.e. TA is the tangent line through A and TB is the tangent line through B.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the node name A on the ellipse
+%% #5 -> [input] the node name B on the ellipse
+%% #6 -> [output] the polar point of chord AB
+\def\pstEllipsePolarNode{\@ifnextchar[\Pst@EllipsePolarNode{\Pst@EllipsePolarNode[]}}
+\def\Pst@EllipsePolarNode[#1](#2)(#3)#4#5#6{%
+ \begingroup
+ \psset{#1}%
+ \pstEllipseRotNode[PointName=none,PointSymbol=none,RotAngle=71](#2)(#3){@PSTELLIPSE@POLARAUX@P}
+ \pstEllipseRotNode[PointName=none,PointSymbol=none,RotAngle=-31](#2)(#3){@PSTELLIPSE@POLARAUX@Q}
+ \pstEllipseRotNode[PointName=none,PointSymbol=none,RotAngle=-122](#2)(#3){@PSTELLIPSE@POLARAUX@R}
+ \pstEllipseRotNode[PointName=none,PointSymbol=none,RotAngle=13](#2)(#3){@PSTELLIPSE@POLARAUX@S}
+ \pstInterLL[PointName=none,PointSymbol=none]{#4}{@PSTELLIPSE@POLARAUX@Q}{#5}{@PSTELLIPSE@POLARAUX@P}{@PSTELLIPSE@POLARAUX@X}
+ \pstInterLL[PointName=none,PointSymbol=none]{#4}{@PSTELLIPSE@POLARAUX@P}{#5}{@PSTELLIPSE@POLARAUX@Q}{@PSTELLIPSE@POLARAUX@Y}
+ \pstInterLL[PointName=none,PointSymbol=none]{#4}{@PSTELLIPSE@POLARAUX@R}{#5}{@PSTELLIPSE@POLARAUX@S}{@PSTELLIPSE@POLARAUX@M}
+ \pstInterLL[PointName=none,PointSymbol=none]{#4}{@PSTELLIPSE@POLARAUX@S}{#5}{@PSTELLIPSE@POLARAUX@R}{@PSTELLIPSE@POLARAUX@N}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PSTELLIPSE@POLARAUX@X}{@PSTELLIPSE@POLARAUX@Y}{@PSTELLIPSE@POLARAUX@M}{@PSTELLIPSE@POLARAUX@N}{#6}
+ \Pst@geonodelabel{#6}%
+ \pstLineAB{#4}{#6}
+ \pstLineAB{#5}{#6}
+ \endgroup%
+}%
+%
+%% \pstEllipseTangentNode[Options](O)(a,b){T}{A}{B}
+%% Draw the two tangent lines through the point $T$ to the Ellipse E and get the node A and B on the Ellipse.
+%% We use the following proposition to find the tangent node of T:
+%% Give point T outside of the ellipse, we draw any other two chords TPQ and TRS, PS and QR intersect at I, PR and QS intersect at X, XI and Ellipse intersect at A and B, then TA is the tangent line through A and TB is the tangent line through B.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the node name T outside the ellipse
+%% #5 -> [output] the node name A on the ellipse
+%% #6 -> [output] the node name B on the ellipse
+\def\pstEllipseTangentNode{\@ifnextchar[\Pst@EllipseTangentNode{\Pst@EllipseTangentNode[]}}
+\def\Pst@EllipseTangentNode[#1](#2)(#3)#4#5#6{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pstEllipseRotNode[PointName=none,PointSymbol=none,RotAngle=71](#2)(#3){@PSTELLIPSE@TANGENTAUX@P0}
+ \pstEllipseRotNode[PointName=none,PointSymbol=none,RotAngle=31](#2)(#3){@PSTELLIPSE@TANGENTAUX@R0}
+ \pstEllipseLineInter[PointName=none,PointSymbol=none](#2)(#3){#4}{@PSTELLIPSE@TANGENTAUX@P0}{@PSTELLIPSE@TANGENTAUX@P}{@PSTELLIPSE@TANGENTAUX@Q}
+ \pstEllipseLineInter[PointName=none,PointSymbol=none](#2)(#3){#4}{@PSTELLIPSE@TANGENTAUX@R0}{@PSTELLIPSE@TANGENTAUX@R}{@PSTELLIPSE@TANGENTAUX@S}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PSTELLIPSE@TANGENTAUX@P}{@PSTELLIPSE@TANGENTAUX@S}{@PSTELLIPSE@TANGENTAUX@Q}{@PSTELLIPSE@TANGENTAUX@R}{@PSTELLIPSE@TANGENTAUX@I}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PSTELLIPSE@TANGENTAUX@P}{@PSTELLIPSE@TANGENTAUX@R}{@PSTELLIPSE@TANGENTAUX@Q}{@PSTELLIPSE@TANGENTAUX@S}{@PSTELLIPSE@TANGENTAUX@X}
+ \pstEllipseLineInter[PointName=none,PointSymbol=none](#2)(#3){@PSTELLIPSE@TANGENTAUX@X}{@PSTELLIPSE@TANGENTAUX@I}{#5}{#6}
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \pstLineAB{#4}{#5}
+ \pstLineAB{#4}{#6}
+ \endgroup%
+}%
+%
+% 2. General Ellipse with coordinate translation and rotation
+%% ----------------------------------------------------------
+%% The General Ellipse E is defined by center O, the half of the major axis $max(abs(a),abs(b))$,
+%% the half of the minor axis $min(abs(a),abs(b))$, and the rotation angle $\theta$ of the major axis.
+%%
+%% The equation can be got from the parametric function of the ellipse \ref{ParametricFunctionOfEllipse},
+%% using the rotation transform formula:
+%% \begin{equation}\label{RotationTransformFormula}
+%% \left\{\begin{array}{l}
+%% x'=x\cos\theta-y\sin\theta\\
+%% y'=x\sin\theta+y\cos\theta
+%% \end{array}\right.
+%% \end{equation}
+%% then we have
+%% \begin{equation}
+%% \left\{\begin{array}{l}
+%% x'=(a\cos\alpha+x_o)\cos\theta-(b\sin\alpha+y_o)\sin\theta=a\cos\alpha\cos\theta-b\sin\alpha\sin\theta+x_o'\\
+%% y'=(a\cos\alpha+x_o)\sin\theta+(b\sin\alpha+y_o)\cos\theta=a\cos\alpha\sin\theta+b\sin\alpha\cos\theta+y_o'
+%% \end{array}\right.
+%% \end{equation}
+%% where the $x_o'$ and $y_o'$ are the coordinate of the given center O after rotation.
+%% So we get the parametric function of the general Ellipse with coordinate translation and rotation as following:
+%% \begin{equation}\label{ParametricFunctionOfGeneralEllipse}
+%% \left\{\begin{array}{l}
+%% x=a\cos\alpha\cos\theta-b\sin\alpha\sin\theta+x_o\\
+%% y=a\cos\alpha\sin\theta+b\sin\alpha\cos\theta+y_o
+%% \end{array}\right.
+%% \end{equation}
+%
+%% \pstGeneralEllipse[Options](O)(a,b)[rotation][angleA][angleB]
+%% Draw a General Ellipse with center O from angleA to angleB, going counter clockwise,
+%% the half of the major axis $max(abs(a),abs(b))$, the half of the minor axis $min(abs(a),abs(b))$,
+%% and the rotation angle $\theta$ of the major axis.
+%% If you not input rotation angle, the default value is $0^\circ$, which is same as \pstEllipse.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the rotation angle $\theta$ of the major axis.
+%% #5 -> [input] start angle from angleA to angleB, going counter clockwise.
+%% #6 -> [input] start angle from angleA to angleB, going counter clockwise.
+\def\pstGeneralEllipse{\@ifnextchar[\Pst@GeneralEllipse{\Pst@GeneralEllipse[]}}
+\def\Pst@GeneralEllipse[#1](#2)(#3){%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralEllipse@i{\Pst@GeneralEllipse[0]}}%
+\def\Pst@GeneralEllipse@i[#1]{%
+ \def\PST@GENERALELLIPSE@ROTATION{#1}%
+ \@ifnextchar[\Pst@GeneralEllipse@ii{\Pst@GeneralEllipse@ii[0][360]}}%
+\def\Pst@GeneralEllipse@ii[#1][#2]{%
+ \parametricplot{#1}{#2}{%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor % a,b
+ abs exch abs exch % |a|,|b|
+ \PST@GENERALELLIPSE@ROTATION\space dup cos exch sin % \cos\theta \sin\theta
+ 3 index 2 index mul % a\cos\theta
+ 3 index 2 index mul % b\sin\theta
+ 5 index 3 index mul % a\sin\theta
+ 5 index 5 index mul % b\cos\theta
+ 10 4 roll pop pop pop pop % a\cos\theta b\sin\theta a\sin\theta b\cos\theta x0 y0
+ 5 index t cos mul % a\cos\theta\cos{t}
+ 5 index t sin mul sub 2 index add % a\cos\theta\cos{t}-b\sin\theta\sin{t}+x0
+ 4 index t cos mul % a\sin\theta\cos{t}
+ 4 index t sin mul add 2 index add % a\sin\theta\cos{t}+b\cos\theta\sin{t}+y0
+ 8 2 roll pop pop pop pop pop pop
+ }
+ \endgroup%
+}%
+%
+%% \pstGeneralEllipseNode[Options](O)(a,b)[rotation]{t}{A}
+%% Get the new node A whose parameter is the given value $t$ on the General Ellipse E.
+%% If you not input rotation angle, the default value is $0^\circ$, which is same as \pstEllipse.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the rotation angle $\theta$ of the major axis.
+%% #5 -> [input] the parameter value $t$.
+%% #6 -> [output] the new node name on the ellipse
+\def\pstGeneralEllipseNode{\@ifnextchar[\Pst@GeneralEllipseNode{\Pst@GeneralEllipseNode[]}}
+\def\Pst@GeneralEllipseNode[#1](#2)(#3){%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralEllipseNode@i{\Pst@GeneralEllipseNode@i[0]}}
+\def\Pst@GeneralEllipseNode@i[#1]#2#3{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ #2 cos #2 sin %
+ 5 index 4 index mul 2 index mul % a\cos\theta\cos\alpha
+ 5 index 4 index mul 2 index mul % b\sin\theta\sin\alpha
+ sub 8 index add % a\cos\theta\cos\alpha - b\sin\theta\sin\alpha + x_o
+ 6 index 4 index mul 3 index mul % a\sin\theta\cos\alpha
+ 6 index 6 index mul 3 index mul % b\cos\theta\sin\alpha
+ add 8 index add % a\sin\theta\cos\alpha + b\cos\theta\sin\alpha + y_o
+ 10 2 roll pop pop pop pop pop pop pop pop
+ ){#3}%
+ \Pst@geonodelabel{#3}%
+ \endgroup%
+}%
+%
+%% \pstGeneralEllipseRotNode[Options,RotAngle=<degree>](O)(a,b)[rotation]{A}
+%% Get the new node A whose RotAngle is the given value on the General Ellipse E.
+%% If you not input rotation angle, the default value is $0^\circ$, which is same as \pstEllipse.
+%% If you not set RotAngle, the default value is $60^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the rotation angle $\theta$ of the major axis.
+%% #5 -> [output] the new node name on the ellipse
+\def\pstGeneralEllipseRotNode{\@ifnextchar[\Pst@GeneralEllipseRotNode{\Pst@GeneralEllipseRotNode[]}}
+\def\Pst@GeneralEllipseRotNode[#1](#2)(#3){%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralEllipseRotNode@i{\Pst@GeneralEllipseRotNode@i[0]}}
+\def\Pst@GeneralEllipseRotNode@i[#1]#2{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ \psk@RotAngle\space cos \psk@RotAngle\space sin %
+ 5 index 4 index mul 2 index mul % a\cos\theta\cos\alpha
+ 5 index 4 index mul 2 index mul % b\sin\theta\sin\alpha
+ sub 8 index add % a\cos\theta\cos\alpha - b\sin\theta\sin\alpha + x_o
+ 6 index 4 index mul 3 index mul % a\sin\theta\cos\alpha
+ 6 index 6 index mul 3 index mul % b\cos\theta\sin\alpha
+ add 8 index add % a\sin\theta\cos\alpha + b\cos\theta\sin\alpha + y_o
+ 10 2 roll pop pop pop pop pop pop pop pop
+ ){#2}%
+ \Pst@geonodelabel{#2}%
+ \endgroup%
+}%
+%
+%% \pstGeneralEllipseAbsNode[Options](O)(a,b)[rotation]{x_1}{A}{B}
+%% Create the node A and B whose abbscissa are the given value $x_1$ on the General Ellipse E.
+%% If you not input rotation angle, the default value is $0^\circ$, which is same as \pstEllipse.
+%% When x equals $x_1$, we have
+%% $$y_{1,2}=gc_{1,2}+hs_{1,2}+y_o$$
+%% where,
+%% $$c_1=\dfrac{de+f\sqrt{w}}{u}, s_1=\dfrac{-df+e\sqrt{w}}{u}$$
+%% $$c_2=\dfrac{de-f\sqrt{w}}{u}, s_2=\dfrac{-df-e\sqrt{w}}{u}$$
+%% $$e=a\cos\theta,f=b\sin\theta,g=a\sin\theta,h=b\cos\theta$$
+%% $$d=x_1-x_o,u=e^2+f^2,w=u-d^2$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the rotation angle $\theta$ of the major axis.
+%% #5 -> [input] the given abscissa value $x_1$.
+%% #6 -> [output] the first intersection node $A$
+%% #7 -> [output] the second intersection node $B$
+\def\pstGeneralEllipseAbsNode{\@ifnextchar[\Pst@GeneralEllipseAbsNode{\Pst@GeneralEllipseAbsNode[]}}
+\def\Pst@GeneralEllipseAbsNode[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralEllipseAbsNode@i{\Pst@GeneralEllipseAbsNode@i[0]}}
+\def\Pst@GeneralEllipseAbsNode@i[#1]#2#3#4{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 3 index 2 index mul % e=a\cos\theta
+ 3 index 2 index mul % f=b\sin\theta
+ 5 index 3 index mul % g=a\sin\theta
+ 5 index 5 index mul % h=b\cos\theta
+ #2 9 index sub % d=x_1-x_o
+ 4 index dup mul 4 index dup mul add % u=e^2+f^2
+ 0 index 2 index dup mul sub dup 0 lt { % w=u-d^2
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ 0 0
+ } {
+ sqrt % sqrt(w)
+ %% c_1=(de+f sqrt(w))/u, s_1=(-df+e sqrt(w))/u
+ 2 index 7 index mul 6 index 2 index mul add 2 index div % c1
+ 3 index 7 index mul 8 index 3 index mul exch sub 3 index div % s1
+ %% y_{1,2}=gc_{1,2}+hs_{1,2}+y_o
+ 6 index 2 index mul 6 index 2 index mul add 14 index add % y1
+ #2 exch 17 2 roll pop pop pop pop pop
+ pop pop pop pop pop
+ pop pop pop pop pop
+ } ifelse
+ ){#3}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 3 index 2 index mul % e=a\cos\theta
+ 3 index 2 index mul % f=b\sin\theta
+ 5 index 3 index mul % g=a\sin\theta
+ 5 index 5 index mul % h=b\cos\theta
+ #2 9 index sub % d=x_1-x_o
+ 4 index dup mul 4 index dup mul add % u=e^2+f^2
+ 0 index 2 index dup mul sub dup 0 lt { % w=u-d^2
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ 0 0
+ } {
+ sqrt % sqrt(w)
+ %% c_2=(de-f sqrt(w))/u, s_2=(-df-e sqrt(w))/u
+ 2 index 7 index mul 6 index 2 index mul sub 2 index div % c2
+ 3 index 7 index mul 8 index 3 index mul add neg 3 index div % s2
+ %% y_{1,2}=gc_{1,2}+hs_{1,2}+y_o
+ 6 index 2 index mul 6 index 2 index mul add 14 index add % y2
+ #2 exch 17 2 roll pop pop pop pop pop
+ pop pop pop pop pop
+ pop pop pop pop pop
+ } ifelse
+ ){#4}%
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \endgroup%
+}%
+%
+%% \pstGeneralEllipseOrdNode[Options](O)(a,b)[rotation]{y_1}{A}{B}
+%% Create the node A and B whose ordinates are the given value $y_1$ on the General Ellipse E.
+%% If you not input rotation angle, the default value is $0^\circ$, which is same as \pstEllipse.
+%% when y equals $y_1$, we have
+%% x_{1,2}=ec_{1,2}-fs_{1,2}+x_o
+%% where,
+%% $$c_1=\dfrac{dg+h\sqrt{w}}{u}, s_1=\dfrac{dh-g\sqrt{w}}{u}$$
+%% $$c_2=\dfrac{dg-h\sqrt(w}}{u}, s_2=\dfrac{dh+g\sqrt{w}}{u}$$
+%% $$e=a\cos\theta,f=b\sin\theta,g=a\sin\theta,h=b\cos\theta$$
+%% $$d=y_1-y_o,u=h^2+g^2,w=u-d^2$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the rotation angle $\theta$ of the major axis.
+%% #5 -> [input] the given ordinate value $y_1$.
+%% #6 -> [output] the first intersection node $A$
+%% #7 -> [output] the second intersection node $B$
+\def\pstGeneralEllipseOrdNode{\@ifnextchar[\Pst@GeneralEllipseOrdNode{\Pst@GeneralEllipseOrdNode[]}}
+\def\Pst@GeneralEllipseOrdNode[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralEllipseOrdNode@i{\Pst@GeneralEllipseOrdNode@i[0]}}
+\def\Pst@GeneralEllipseOrdNode@i[#1]#2#3#4{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 3 index 2 index mul % e=a\cos\theta
+ 3 index 2 index mul % f=b\sin\theta
+ 5 index 3 index mul % g=a\sin\theta
+ 5 index 5 index mul % h=b\cos\theta
+ #2 9 index sub % d=y_1-y_o
+ 2 index dup mul 2 index dup mul add % u=h^2+g^2
+ 0 index 2 index dup mul sub dup 0 lt { % w=u-d^2
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ 0 0
+ } {
+ sqrt % sqrt(w)
+ %% c_1=(dg+h sqrt(w))/u, s_1=(dh-g sqrt(w))/u
+ 2 index 5 index mul 4 index 2 index mul add 2 index div % c1
+ 3 index 5 index mul 6 index 3 index mul sub 3 index div % s1
+ %% x_{1,2}=ec_{1,2}-fs_{1,2}+x_o
+ 8 index 2 index mul 8 index 2 index mul sub 15 index add % x1
+ #2 17 2 roll pop pop pop pop pop
+ pop pop pop pop pop
+ pop pop pop pop pop
+ } ifelse
+ ){#3}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 3 index 2 index mul % e=a\cos\theta
+ 3 index 2 index mul % f=b\sin\theta
+ 5 index 3 index mul % g=a\sin\theta
+ 5 index 5 index mul % h=b\cos\theta
+ #2 9 index sub % d=y_1-y_o
+ 2 index dup mul 2 index dup mul add % u=h^2+g^2
+ 0 index 2 index dup mul sub dup 0 lt { % w=u-d^2
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ 0 0
+ } {
+ sqrt % sqrt(w)
+ %% c_2=(dg-h sqrt(w))/u, s_2=(dh+g sqrt(w))/u
+ 2 index 5 index mul 4 index 2 index mul sub 2 index div % c2
+ 3 index 5 index mul 6 index 3 index mul add 3 index div % s2
+ %% x_{1,2}=ec_{1,2}-fs_{1,2}+x_o
+ 8 index 2 index mul 8 index 2 index mul sub 15 index add % x2
+ #2 17 2 roll pop pop pop pop pop
+ pop pop pop pop pop
+ pop pop pop pop pop
+ } ifelse
+ ){#4}%
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \endgroup%
+}%
+%
+%% \pstGeneralEllipseFocusNode[Options](O)(a,b)[rotation]{$F_1$}{$F_2$}
+%% Get the two focus $F_1$ and $F_2$ point of the General Ellipse E and create two new nodes.
+%% If you not input rotation angle, the default value is $0^\circ$, which is same as \pstEllipse.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the rotation angle $\theta$ of the major axis.
+%% #5 -> [output] the left/down node name
+%% #6 -> [output] the right/up node name
+\def\pstGeneralEllipseFocusNode{\@ifnextchar[\Pst@GeneralEllipseFocusNode{\Pst@GeneralEllipseFocusNode[]}}
+\def\Pst@GeneralEllipseFocusNode[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralEllipseFocusNode@i{\Pst@GeneralEllipseFocusNode@i[0]}}
+\def\Pst@GeneralEllipseFocusNode@i[#1]#2#3{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor % a,b
+ abs exch abs exch % |a|,|b|
+ 2 copy gt {% Focus on haxis
+ 1 index dup mul 1 index dup mul sub sqrt % c=sqrt(a^2-b^2)
+ 4 index 1 index #1 cos mul sub % x_o-c\cos\alpha
+ 4 index 2 index #1 sin mul sub % y_o-c\sin\alpha
+ }{% Focus on vaxis
+ 0 index dup mul 2 index dup mul sub sqrt % c=sqrt(b^2-a^2)
+ 4 index 1 index #1 sin mul add % x_o+c\sin\alpha
+ 4 index 2 index #1 cos mul sub % y_o-c\cos\alpha
+ } ifelse
+ 7 2 roll pop pop pop pop pop
+ ){#2}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor % a,b
+ abs exch abs exch % |a|,|b|
+ 2 copy gt {% Focus on haxis
+ 1 index dup mul 1 index dup mul sub sqrt % c=sqrt(a^2-b^2)
+ 4 index 1 index #1 cos mul add % x_o+c\cos\alpha
+ 4 index 2 index #1 sin mul add % y_o+c\sin\alpha
+ }{% Focus on vaxis
+ 0 index dup mul 2 index dup mul sub sqrt % c=sqrt(b^2-a^2)
+ 4 index 1 index #1 sin mul sub % x_o-c\sin\alpha
+ 4 index 2 index #1 cos mul add % y_o+c\cos\alpha
+ } ifelse
+ 7 2 roll pop pop pop pop pop
+ ){#3}%
+ \Pst@ManageParamList{#2}%
+ \Pst@ManageParamList{#3}%
+ \endgroup%
+}%
+%
+%% \pstGeneralEllipseDirectrixLine[Options](O)(a,b)[rotation]{Lx}{Ly}{Rx}{Ry}
+%% Get the two directrix line of the General Ellipse E and create two new nodes for each one.
+%% If you not input rotation angle, the default value is $0^\circ$, which is same as \pstEllipse.
+%% the nodes Lx Ly Rx Ry lie on the tangent line of the vertex on the other axis,
+%% they can be got after the orig nodes rotation $\theta$ about the center $O$, we have
+%% \begin{equation}\label{ExtensionRotationTransformFormula}
+%% \left\{\begin{array}{l}
+%% x=x_o+(x-x_o)\cos\theta-(y-y_o)\sin\theta\\
+%% y=y_o+(x-x_o)\sin\theta+(y-y_o)\cos\theta
+%% \end{array}\right.
+%% \end{equation}
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the rotation angle $\theta$ of the major axis.
+%% #5 -> [output] the A node name on the left/down directrix line
+%% #6 -> [output] the B node name on the left/down directrix line
+%% #7 -> [output] the A node name on the right/up directrix line
+%% #8 -> [output] the B node name on the right/up directrix line
+\def\pstGeneralEllipseDirectrixLine{\@ifnextchar[\Pst@GeneralEllipseDirectrixLine{\Pst@GeneralEllipseDirectrixLine[]}}
+\def\Pst@GeneralEllipseDirectrixLine[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralEllipseDirectrixLine@i{\Pst@GeneralEllipseDirectrixLine@i[0]}}
+\def\Pst@GeneralEllipseDirectrixLine@i[#1]#2#3#4#5{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor % a,b
+ abs exch abs exch % |a|,|b|
+ 2 copy gt {% Focus on haxis
+ 1 index dup mul 1 index dup mul sub sqrt % c=sqrt(a^2-b^2)
+ 4 index 3 index dup mul 2 index div sub % x0-a^2/c
+ 4 index 3 index sub
+ 7 2 roll pop pop pop % (x0-a^2/c,y0-b)
+ }{% Focus on vaxis
+ 0 index dup mul 2 index dup mul sub sqrt % c=sqrt(b^2-a^2)
+ 4 index 3 index sub % x0-a
+ 4 index 3 index dup mul 3 index div sub
+ 7 2 roll pop pop pop % (x0-a,y0-b^2/c)
+ } ifelse
+ #1 cos #1 sin % x y x0 y0 \cos\theta \sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#2}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor % a,b
+ abs exch abs exch % |a|,|b|
+ 2 copy gt {% Focus on haxis
+ 1 index dup mul 1 index dup mul sub sqrt % c=sqrt(a^2-b^2)
+ 4 index 3 index dup mul 2 index div sub % x0-a^2/c
+ 4 index 3 index add
+ 7 2 roll pop pop pop % (x0-a^2/c,y0+b)
+ }{% Focus on vaxis
+ 0 index dup mul 2 index dup mul sub sqrt % c=sqrt(b^2-a^2)
+ 4 index 3 index add % x0+a
+ 4 index 3 index dup mul 3 index div sub
+ 7 2 roll pop pop pop % (x0+a,y0-b^2/c)
+ } ifelse
+ #1 cos #1 sin % x y x0 y0 \cos\theta \sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#3}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor % a,b
+ abs exch abs exch % |a|,|b|
+ 2 copy gt {% Focus on haxis
+ 1 index dup mul 1 index dup mul sub sqrt % c=sqrt(a^2-b^2)
+ 4 index 3 index dup mul 2 index div add % x0+a^2/c
+ 4 index 3 index sub
+ 7 2 roll pop pop pop % (x0+a^2/c,y0-b)
+ }{% Focus on vaxis
+ 0 index dup mul 2 index dup mul sub sqrt % c=sqrt(b^2-a^2)
+ 4 index 3 index sub % x0-a
+ 4 index 3 index dup mul 3 index div add
+ 7 2 roll pop pop pop % (x0-a,y0+b^2/c)
+ } ifelse
+ #1 cos #1 sin % x y x0 y0 \cos\theta \sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#4}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor % a,b
+ abs exch abs exch % |a|,|b|
+ 2 copy gt {% Focus on haxis
+ 1 index dup mul 1 index dup mul sub sqrt % c=sqrt(a^2-b^2)
+ 4 index 3 index dup mul 2 index div add % x0+a^2/c
+ 4 index 3 index add
+ 7 2 roll pop pop pop % (x0+a^2/c,y0+b)
+ }{% Focus on vaxis
+ 0 index dup mul 2 index dup mul sub sqrt % c=sqrt(b^2-a^2)
+ 4 index 3 index add % x0+a
+ 4 index 3 index dup mul 3 index div add
+ 7 2 roll pop pop pop % (x0+a,y0+b^2/c)
+ } ifelse
+ #1 cos #1 sin % x y x0 y0 \cos\theta \sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#5}%
+ \Pst@ManageParamList{#2}%
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \pstLineAB{#2}{#3}
+ \pstLineAB{#4}{#5}
+ \endgroup%
+}%
+%
+%% \pstGeneralEllipseLineInter[Options](O)(a,b)[rotation]{A}{B}{C}{D}
+%% Get the two intersection $C$ and $D$ of the General Ellipse E and the given line AB.
+%% If you not input rotation angle, the default value is $0^\circ$, which is same as \pstEllipse.
+%% We can represent the line AB as the following function when line AB is not vertical:
+%% $$y=kx+t$$ where $$k=\dfrac{y_2-y_1}{x_2-x_1},t=\dfrac{x_2y_1-x_1y_2}{x_2-x_1}$$
+%% The intersections are:
+%% $$x_{1,2}=ec_{1,2}-fs_{1,2}+x_o,y_{1,2}=kx_{1,2}+t$$
+%% where,
+%% $$e=a\cos\theta,f=b\sin\theta,g=a\sin\theta,h=b\cos\theta$$
+%% $$c_1=\dfrac{mA+B\sqrt{w}}{A^2+B^2}$$
+%% $$s_1=\dfrac{mB-A\sqrt{w}}{A^2+B^2}$$
+%% $$c_2=\dfrac{mA-B\sqrt{w}}{A^2+B^2}$$
+%% $$s_2=\dfrac{mB+A\sqrt{w}}{A^2+B^2}$$
+%% $$w=A^2+B^2-m^2, m=kx_o-y_o+t, A=g-ke, B=h+kf$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the rotation angle $\theta$ of the major axis.
+%% #5 -> [input] the node name A on the given line
+%% #6 -> [input] the node name B on the given line
+%% #7 -> [output] the first intersection node name
+%% #8 -> [output] the second intersection node name
+\def\pstGeneralEllipseLineInter{\@ifnextchar[\Pst@GeneralEllipseLineInter{\Pst@GeneralEllipseLineInter[]}}
+\def\Pst@GeneralEllipseLineInter[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralEllipseLineInter@i{\Pst@GeneralEllipseLineInter@i[0]}}
+\def\Pst@GeneralEllipseLineInter@i[#1]#2#3#4#5{%
+ \pst@getcoor{#2}\pst@tempA%
+ \pst@getcoor{#3}\pst@tempB%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ pop pop pop pop
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 3 index 2 index mul % e=a\cos\theta
+ 3 index 2 index mul % f=b\sin\theta
+ 5 index 3 index mul % g=a\sin\theta
+ 5 index 5 index mul % h=b\cos\theta
+ \pst@tempA \tx@UserCoor pop % x1
+ 9 index sub % d=x_1-x_o
+ 4 index dup mul 4 index dup mul add % u=e^2+f^2
+ 0 index 2 index dup mul sub dup 0 lt { % w=u-d^2
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ 0 0
+ } {
+ sqrt % sqrt(w)
+ %% c_1=(de+f sqrt(w))/u, s_1=(-df+e sqrt(w))/u
+ 2 index 7 index mul 6 index 2 index mul add 2 index div % c1
+ 3 index 7 index mul 8 index 3 index mul exch sub 3 index div % s1
+ %% y_{1,2}=gc_{1,2}+hs_{1,2}+y_o
+ 6 index 2 index mul 6 index 2 index mul add 14 index add % y1
+ \pst@tempA \tx@UserCoor pop % x1
+ exch 17 2 roll pop pop pop pop pop
+ pop pop pop pop pop
+ pop pop pop pop pop
+ } ifelse
+ }{
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % t
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 9 index 2 index mul % e=a\cos\theta
+ 9 index 2 index mul % f=b\sin\theta
+ 11 index 3 index mul % g=a\sin\theta
+ 11 index 5 index mul % h=b\cos\theta
+ 1 index 8 index 5 index mul sub % A=g-ke
+ 1 index 9 index 5 index mul add % B=h+kf
+ 1 index dup mul 1 index dup mul add % C=A^2+B^2
+ 10 index 19 index mul 18 index sub 10 index add % m=kx_o-y_o+t
+ 1 index 1 index dup mul sub dup 0 lt { % w=C-m^2
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ 0 0
+ } {
+ sqrt % sqrt(w)
+ 1 index 5 index mul 4 index 2 index mul add 3 index div % c1
+ 2 index 5 index mul 6 index 3 index mul sub 4 index div % s1
+ %% x_{1,2}=ec_{1,2}-fs_{1,2}+x_o,y_{1,2}=kx_{1,2}+t
+ 10 index 2 index mul 10 index 2 index mul sub 23 index add % x1
+ dup 16 index mul 15 index add % y1
+ 25 2 roll pop pop
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#4}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ pop pop pop pop
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 3 index 2 index mul % e=a\cos\theta
+ 3 index 2 index mul % f=b\sin\theta
+ 5 index 3 index mul % g=a\sin\theta
+ 5 index 5 index mul % h=b\cos\theta
+ \pst@tempA \tx@UserCoor pop % x1
+ 9 index sub % d=x_1-x_o
+ 4 index dup mul 4 index dup mul add % u=e^2+f^2
+ 0 index 2 index dup mul sub dup 0 lt { % w=u-d^2
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ 0 0
+ } {
+ sqrt % sqrt(w)
+ %% c_2=(de-f sqrt(w))/u, s_2=(-df-e sqrt(w))/u
+ 2 index 7 index mul 6 index 2 index mul sub 2 index div % c2
+ 3 index 7 index mul 8 index 3 index mul add neg 3 index div % s2
+ %% y_{1,2}=gc_{1,2}+hs_{1,2}+y_o
+ 6 index 2 index mul 6 index 2 index mul add 14 index add % y2
+ \pst@tempA \tx@UserCoor pop % x1
+ exch 17 2 roll pop pop pop pop pop
+ pop pop pop pop pop
+ pop pop pop pop pop
+ } ifelse
+ }{
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % t
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 9 index 2 index mul % e=a\cos\theta
+ 9 index 2 index mul % f=b\sin\theta
+ 11 index 3 index mul % g=a\sin\theta
+ 11 index 5 index mul % h=b\cos\theta
+ 1 index 8 index 5 index mul sub % A=g-ke
+ 1 index 9 index 5 index mul add % B=h+kf
+ 1 index dup mul 1 index dup mul add % C=A^2+B^2
+ 10 index 19 index mul 18 index sub 10 index add % m=kx_o-y_o+t
+ 1 index 1 index dup mul sub dup 0 lt { % w=C-m^2
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ 0 0
+ } {
+ sqrt % sqrt(w)
+ 1 index 5 index mul 4 index 2 index mul sub 3 index div % c2
+ 2 index 5 index mul 6 index 3 index mul add 4 index div % s2
+ %% x_{1,2}=ec_{1,2}-fs_{1,2}+x_o,y_{1,2}=kx_{1,2}+t
+ 10 index 2 index mul 10 index 2 index mul sub 23 index add % x2
+ dup 16 index mul 15 index add % y2
+ 25 2 roll pop pop
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#5}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \endgroup%
+}%
+%
+%% \pstGeneralEllipsePolarNode[Options](O)(a,b)[rotation]{A}{B}{T}
+%% Draw the every tangent line through the point $A$ and $B$ on the General Ellipse E and get the insection node T of the two tangent lines.
+%% If you not input rotation angle, the default value is $0^\circ$, which is same as \pstEllipse.
+%% We call T as the polar point of chord AB, which can be got by the following proposition:
+%% Give chord AB on the ellipse, we draw any other two chords PQ and RS, AB and PQ intersect at I, AQ and BP intersect at X, AP and BQ intersect at Y, we call XY is the polar line of point I. Also AB and RS intersect at J, AR and BS intersect at M, AS and BR intersect at N, we call MN is the polar line of point J. Then the intersection T of XY and MN is the polar point of chord AB, i.e. TA is the tangent line through A and TB is the tangent line through B.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the rotation angle $\theta$ of the major axis.
+%% #5 -> [input] the node name A on the ellipse
+%% #6 -> [input] the node name B on the ellipse
+%% #7 -> [output] the polar point of chord AB
+\def\pstGeneralEllipsePolarNode{\@ifnextchar[\Pst@GeneralEllipsePolarNode{\Pst@GeneralEllipsePolarNode[]}}
+\def\Pst@GeneralEllipsePolarNode[#1](#2)(#3){%
+ \begingroup
+ \psset{#1}%
+ \def\PST@GENERALELLIPSE@CENTER{#2}%
+ \def\PST@GENERALELLIPSE@RADIUS{#3}%
+ \@ifnextchar[\Pst@GeneralEllipsePolarNode@i{\Pst@GeneralEllipsePolarNode@i[0]}}
+\def\Pst@GeneralEllipsePolarNode@i[#1]#2#3#4{%
+ \pstGeneralEllipseRotNode[PointName=none,PointSymbol=none,RotAngle=71](\PST@GENERALELLIPSE@CENTER)(\PST@GENERALELLIPSE@RADIUS)[#1]{@PST@GENERALELLIPSE@POLARAUX@P}
+ \pstGeneralEllipseRotNode[PointName=none,PointSymbol=none,RotAngle=-31](\PST@GENERALELLIPSE@CENTER)(\PST@GENERALELLIPSE@RADIUS)[#1]{@PST@GENERALELLIPSE@POLARAUX@Q}
+ \pstGeneralEllipseRotNode[PointName=none,PointSymbol=none,RotAngle=-122](\PST@GENERALELLIPSE@CENTER)(\PST@GENERALELLIPSE@RADIUS)[#1]{@PST@GENERALELLIPSE@POLARAUX@R}
+ \pstGeneralEllipseRotNode[PointName=none,PointSymbol=none,RotAngle=13](\PST@GENERALELLIPSE@CENTER)(\PST@GENERALELLIPSE@RADIUS)[#1]{@PST@GENERALELLIPSE@POLARAUX@S}
+ \pstInterLL[PointName=none,PointSymbol=none]{#2}{@PST@GENERALELLIPSE@POLARAUX@Q}{#3}{@PST@GENERALELLIPSE@POLARAUX@P}{@PST@GENERALELLIPSE@POLARAUX@X}
+ \pstInterLL[PointName=none,PointSymbol=none]{#2}{@PST@GENERALELLIPSE@POLARAUX@P}{#3}{@PST@GENERALELLIPSE@POLARAUX@Q}{@PST@GENERALELLIPSE@POLARAUX@Y}
+ \pstInterLL[PointName=none,PointSymbol=none]{#2}{@PST@GENERALELLIPSE@POLARAUX@R}{#3}{@PST@GENERALELLIPSE@POLARAUX@S}{@PST@GENERALELLIPSE@POLARAUX@M}
+ \pstInterLL[PointName=none,PointSymbol=none]{#2}{@PST@GENERALELLIPSE@POLARAUX@S}{#3}{@PST@GENERALELLIPSE@POLARAUX@R}{@PST@GENERALELLIPSE@POLARAUX@N}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@GENERALELLIPSE@POLARAUX@X}{@PST@GENERALELLIPSE@POLARAUX@Y}{@PST@GENERALELLIPSE@POLARAUX@M}{@PST@GENERALELLIPSE@POLARAUX@N}{#4}
+ \Pst@geonodelabel{#4}%
+ \pstLineAB{#2}{#4}
+ \pstLineAB{#3}{#4}
+ \endgroup%
+}%
+%
+%% \pstGeneralEllipseTangentNode[Options](O)(a,b)[rotation]{T}{A}{B}
+%% Draw the two tangent lines through the point $T$ to the General Ellipse E and get the node A and B on the Ellipse.
+%% If you not input rotation angle, the default value is $0^\circ$, which is same as \pstEllipse.
+%% We use the following proposition to find the tangent node of T:
+%% Give point T outside of the ellipse, we draw any other two chords TPQ and TRS, PS and QR intersect at I, PR and QS intersect at X, XI and Ellipse intersect at A and B, then TA is the tangent line through A and TB is the tangent line through B.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the ellipse center O
+%% #3 -> [input] the horizontal and vertical radii
+%% #4 -> [input] the rotation angle $\theta$ of the major axis.
+%% #5 -> [input] the node name T outside the ellipse
+%% #6 -> [output] the node name A on the ellipse
+%% #7 -> [output] the node name B on the ellipse
+\def\pstGeneralEllipseTangentNode{\@ifnextchar[\Pst@GeneralEllipseTangentNode{\Pst@GeneralEllipseTangentNode[]}}
+\def\Pst@GeneralEllipseTangentNode[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \def\PST@GENERALELLIPSE@CENTER{#2}%
+ \def\PST@GENERALELLIPSE@RADIUS{#3}%
+ \@ifnextchar[\Pst@GeneralEllipseTangentNode@i{\Pst@GeneralEllipseTangentNode@i[0]}}
+\def\Pst@GeneralEllipseTangentNode@i[#1]#2#3#4{%
+ \pstGeneralEllipseRotNode[PointName=none,PointSymbol=none,RotAngle=71](\PST@GENERALELLIPSE@CENTER)(\PST@GENERALELLIPSE@RADIUS)[#1]{@PST@GENERALELLIPSE@TANGENTAUX@P0}
+ \pstGeneralEllipseRotNode[PointName=none,PointSymbol=none,RotAngle=31](\PST@GENERALELLIPSE@CENTER)(\PST@GENERALELLIPSE@RADIUS)[#1]{@PST@GENERALELLIPSE@TANGENTAUX@R0}
+ \pstGeneralEllipseLineInter[PointName=none,PointSymbol=none](\PST@GENERALELLIPSE@CENTER)(\PST@GENERALELLIPSE@RADIUS)[#1]{#2}{@PST@GENERALELLIPSE@TANGENTAUX@P0}{@PST@GENERALELLIPSE@TANGENTAUX@P}{@PST@GENERALELLIPSE@TANGENTAUX@Q}
+ \pstGeneralEllipseLineInter[PointName=none,PointSymbol=none](\PST@GENERALELLIPSE@CENTER)(\PST@GENERALELLIPSE@RADIUS)[#1]{#2}{@PST@GENERALELLIPSE@TANGENTAUX@R0}{@PST@GENERALELLIPSE@TANGENTAUX@R}{@PST@GENERALELLIPSE@TANGENTAUX@S}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@GENERALELLIPSE@TANGENTAUX@P}{@PST@GENERALELLIPSE@TANGENTAUX@S}{@PST@GENERALELLIPSE@TANGENTAUX@Q}{@PST@GENERALELLIPSE@TANGENTAUX@R}{@PST@GENERALELLIPSE@TANGENTAUX@I}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@GENERALELLIPSE@TANGENTAUX@P}{@PST@GENERALELLIPSE@TANGENTAUX@R}{@PST@GENERALELLIPSE@TANGENTAUX@Q}{@PST@GENERALELLIPSE@TANGENTAUX@S}{@PST@GENERALELLIPSE@TANGENTAUX@X}
+ \pstGeneralEllipseLineInter[PointName=none,PointSymbol=none](\PST@GENERALELLIPSE@CENTER)(\PST@GENERALELLIPSE@RADIUS)[#1]{@PST@GENERALELLIPSE@TANGENTAUX@X}{@PST@GENERALELLIPSE@TANGENTAUX@I}{#3}{#4}
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \pstLineAB{#2}{#3}
+ \pstLineAB{#2}{#4}
+ \endgroup%
+}%
+%
+% 3. Standard Parabola with coordinate translation
+%% ----------------------------------------------------------
+%% The Parabola P is defined by vertex O, the half of the focus chord axis $abs(p)$, the sign of $p$ indicates the direction of the parabola.
+%% The equation can be written as:
+%% \begin{equation}\label{FunctionOfStandardParabola}
+%% (x-x0)^2=2p(y-y0)
+%% \end{equation}
+%% and the parametric function can be written as:
+%% \begin{equation}\label{ParametricFunctionOfStandardParabola}
+%% \left\{\begin{array}{l}
+%% x=t+x_o\\
+%% y=\dfrac{t^2}{2p}+y_o
+%% \end{array}\right.
+%% \end{equation}
+%
+%% \pstParabola[Options](O){p}{x0}{x1}
+%% Draw a Parabola from x0 to x1 with Vertex O, the half of the focus chord axis $abs(p)$, the sign of $p$ indicates the direction of the parabola.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the start of independent variable $x$
+%% #5 -> [input] the end of independent variable $x$
+\def\pstParabola{\@ifnextchar[\Pst@Parabola{\Pst@Parabola[]}}
+\def\Pst@Parabola[#1](#2)#3#4#5{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \parametricplot{#4}{#5}{%
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 % p
+ 2 index t add % t+x0
+ 2 index t dup mul 3 index 2 mul div add % t^2/(2p)+y0
+ 5 2 roll pop pop pop % t+x0,t^2/(2p)+y0
+ }
+ \endgroup%
+}%
+%
+%% \pstParabolaNode[Options](O){p}{$t$}{A}
+%% Draw the node whose parameter is the given value $t$ on the Parabola P.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the given parameter value $t$
+%% #5 -> [output] the node $A$ on the parabola
+\def\pstParabolaNode{\@ifnextchar[\Pst@ParabolaNode{\Pst@ParabolaNode[]}}
+\def\Pst@ParabolaNode[#1](#2)#3#4#5{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 % p
+ 2 index #4 add % t+x0
+ 2 index #4 dup mul 3 index 2 mul div add % t^2/(2p)+y0
+ 5 2 roll pop pop pop % t+x0,t^2/(2p)+y0
+ ){#5}
+ \Pst@geonodelabel{#5}%
+ \endgroup%
+}%
+%
+%% \pstParabolaAbsNode[Options](O){p}{$x_1$}{A}
+%% Draw the node whose abscissa is the given value $x_1$ on the Parabola P.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the given abscissa value $x_1$
+%% #5 -> [output] the node $A$ on the parabola
+\def\pstParabolaAbsNode{\@ifnextchar[\Pst@ParabolaAbsNode{\Pst@ParabolaAbsNode[]}}
+\def\Pst@ParabolaAbsNode[#1](#2)#3#4#5{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 #4 % p x_1
+ 2 index 1 index 5 index sub dup mul 3 index 2 mul div add % y0+(x_1-x_0)^2/(2p)
+ 5 2 roll pop pop pop
+ ){#5}
+ \Pst@geonodelabel{#5}%
+ \endgroup%
+}%
+%
+%% \pstParabolaOrdNode[Options](O){p}{$y_1$}{A}{B}
+%% Draw the nodes whose ordinate is the given value $y_1$ on the Parabola P.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the given abscissa value $x_1$
+%% #5 -> [output] the first node $A$ on the parabola
+%% #6 -> [output] the second node $B$ on the parabola
+\def\pstParabolaOrdNode{\@ifnextchar[\Pst@ParabolaOrdNode{\Pst@ParabolaOrdNode[]}}
+\def\Pst@ParabolaOrdNode[#1](#2)#3#4#5#6{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 #4 % p y_1
+ 2 index sub mul 2 mul dup 0 lt {
+ pop pop pop 0 0
+ }{
+ sqrt 2 index exch sub
+ #4 4 2 roll pop pop
+ } ifelse
+ ){#5}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 #4 % p y_1
+ 2 index sub mul 2 mul dup 0 lt {
+ pop pop pop 0 0
+ }{
+ sqrt 2 index add
+ #4 4 2 roll pop pop
+ } ifelse
+ ){#6}
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \endgroup%
+}%
+%
+%% \pstParabolaFocusNode[Options](O){p}{F}
+%% Draw the focus node of a Parabola P.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [output] the focus node $F$
+\def\pstParabolaFocusNode{\@ifnextchar[\Pst@ParabolaFocusNode{\Pst@ParabolaFocusNode[]}}
+\def\Pst@ParabolaFocusNode[#1](#2)#3#4{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 %p
+ 2 index % x0
+ 2 index 2 index 2 div add % y0+p/2
+ 5 2 roll pop pop pop
+ ){#4}
+ \Pst@geonodelabel{#4}%
+ \endgroup%
+}%
+%
+%% \pstParabolaDirectrixLine[Options](O){p}{LA}{LB}
+%% Draw the directrix line of a Parabola P.
+%% The node LA also lies on the symmetrical axis line, and node LB is another one on the directrix line.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [output] the first node $A$ on the directrix line
+%% #5 -> [output] the second node $B$ on the directrix line
+\def\pstParabolaDirectrixLine{\@ifnextchar[\Pst@ParabolaDirectrixLine{\Pst@ParabolaDirectrixLine[]}}
+\def\Pst@ParabolaDirectrixLine[#1](#2)#3#4#5{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 %p
+ 2 index % x0
+ 2 index 2 index 2 div sub % y0-p/2
+ 5 2 roll pop pop pop
+ ){#4}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 %p
+ 2 index 1 add % x0+1
+ 2 index 2 index 2 div sub % y0-p/2
+ 5 2 roll pop pop pop
+ ){#5}
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \pstLineAB{#4}{#5}
+ \endgroup%
+}%
+%
+%% \pstParabolaLineInter[Options](O){p}{A}{B}{C}{D}
+%% Find the intersections C and D of line AB and the Parabola P.
+%% We can represent the line AB as the following function when line AB is not vertical:
+%% $$y=kx+t$$ where $$k=\dfrac{y_2-y_1}{x_2-x_1},t=\dfrac{x_2y_1-x_1y_2}{x_2-x_1}$$
+%% The intersections are:
+%% $$x_{1,2}=e\pm\sqrt{w}+x_o, y_{1,2}=kx_{1,2}+t$$
+%% where,
+%% $$e=pk, w=e^2+2f, f=pm, m=kx_o-y_o+t$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the node $A$ on the given line
+%% #5 -> [input] the node $B$ on the given line
+%% #6 -> [output] the first intersection node $C$
+%% #7 -> [output] the second intersection node $D$
+\def\pstParabolaLineInter{\@ifnextchar[\Pst@ParabolaLineInter{\Pst@ParabolaLineInter[]}}
+\def\Pst@ParabolaLineInter[#1](#2)#3#4#5#6#7{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#4}\pst@tempA%
+ \pst@getcoor{#5}\pst@tempB%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ 3 index 6 index sub dup mul #3 2 mul div 5 index add % y=(x1-x0)^2/(2p)+y0
+ 2 index exch 8 2 roll pop pop pop pop pop pop
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % t
+ #3 %p
+ 2 index 1 index mul % e=pk
+ 3 index 10 index mul 9 index sub 3 index add % m=kx_o-y_o+t
+ 2 index 1 index mul % f=pm
+ 2 index dup mul 1 index 2 mul add % w=e^2+2f
+ dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(w)
+ %% x_{1,2}=e \pm sqrt(w)+x_o,y_{1,2}=kx_{1,2}+t
+ 3 index 1 index sub 13 index add % x1
+ 7 index 1 index mul 7 index add % y1
+ 15 2 roll
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#6}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ pop pop pop pop pop pop 0 0
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % t
+ #3 %p
+ 2 index 1 index mul % e=pk
+ 3 index 10 index mul 9 index sub 3 index add % m=kx_o-y_o+t
+ 2 index 1 index mul % f=pm
+ 2 index dup mul 1 index 2 mul add % w=e^2+2f
+ dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(w)
+ %% x_{1,2}=e \pm sqrt(w)+x_o,y_{1,2}=kx_{1,2}+t
+ 3 index 1 index add 13 index add % x2
+ 7 index 1 index mul 7 index add % y2
+ 15 2 roll
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#7}
+ \Pst@ManageParamList{#6}%
+ \Pst@ManageParamList{#7}%
+ \endgroup%
+}%
+%
+%% \pstParabolaPolarNode[Options](O){p}(F)[L1][L2]{A}{B}{T}
+%% Find the polar point of chord AB on Parabola P.
+%% We use the following proposition to find the polar point of chord AB:
+%% Give any chord AB, drawing two focal chord AFC and BFD, where F is the focus, then drawing FX which is perpendicular to AFC at point F, and intersect with the directrix line at X; also drawing FY which is perpendicular to BFD at point F, and intersect with the directrix line at Y. Then the intersection T of AX and BY is the polar point of chord AB.
+%% If you don't know the focus F, or the directrix line, we will find them automated, otherwise you can pass them to this macro.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] optional, the focus node/coordinate F of the parabola.
+%% #5 -> [input] optional, the node/coordinate L1 on the directrix line of the parabola.
+%% #6 -> [input] optional, the node/coordinate L2 on the directrix line of the parabola.
+%% #7 -> [input] the node A on the parabola.
+%% #8 -> [input] the node B on the parabola.
+%% #9 -> [output] the polar node T of chord AB.
+\def\pstParabolaPolarNode{\@ifnextchar[\Pst@ParabolaPolarNode{\Pst@ParabolaPolarNode[]}}
+\def\Pst@ParabolaPolarNode[#1](#2)#3{%
+ \begingroup
+ \psset{#1}%
+ \def\pst@parabola@vertex{#2}%
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar(\Pst@ParabolaPolarNode@i{\Pst@ParabolaPolarNode@j}}%
+\def\Pst@ParabolaPolarNode@i(#1){%
+ \def\pst@parabola@focus{#1}%
+ \@ifnextchar[\Pst@ParabolaPolarNode@ii{\Pst@ParabolaPolarNode@jj}}%
+\def\Pst@ParabolaPolarNode@j{%
+ \pstParabolaFocusNode[PointName=none,PointSymbol=none](\pst@parabola@vertex){\pst@parabola@semifocalchord}{@PST@PARABOLA@FOCUS}
+ \Pst@ParabolaPolarNode@i(@PST@PARABOLA@FOCUS)}%
+\def\Pst@ParabolaPolarNode@jj{%
+ \pstParabolaDirectrixLine[PointName=none,PointSymbol=none,linestyle=none](\pst@parabola@vertex){\pst@parabola@semifocalchord}{@PST@PARABOLA@LA}{@PST@PARABOLA@LB}
+ \Pst@ParabolaPolarNode@ii[@PST@PARABOLA@LA][@PST@PARABOLA@LB]}%
+\def\Pst@ParabolaPolarNode@ii[#1][#2]#3#4#5{%
+ \pstParabolaLineInter[PointName=none,PointSymbol=none,linestyle=none](\pst@parabola@vertex){\pst@parabola@semifocalchord}{#3}{\pst@parabola@focus}{@PST@PARABOLA@FOCALCHORDAFC@A}{@PST@PARABOLA@FOCALCHORDAFC@C}
+ \pstParabolaLineInter[PointName=none,PointSymbol=none,linestyle=none](\pst@parabola@vertex){\pst@parabola@semifocalchord}{#4}{\pst@parabola@focus}{@PST@PARABOLA@FOCALCHORDBFD@B}{@PST@PARABOLA@FOCALCHORDBFD@D}
+ \pstRotation[PointName=none,PointSymbol=none,RotAngle=90]{\pst@parabola@focus}{@PST@PARABOLA@FOCALCHORDAFC@A}[@PST@PARABOLA@FOCALCHORDAFC@AA]
+ \pstRotation[PointName=none,PointSymbol=none,RotAngle=90]{\pst@parabola@focus}{@PST@PARABOLA@FOCALCHORDBFD@B}[@PST@PARABOLA@FOCALCHORDBFD@BB]
+ \pstInterLL[PointName=none,PointSymbol=none]{#1}{#2}{\pst@parabola@focus}{@PST@PARABOLA@FOCALCHORDAFC@AA}{@PST@PARABOLA@FOCALCHORD@X}
+ \pstInterLL[PointName=none,PointSymbol=none]{#1}{#2}{\pst@parabola@focus}{@PST@PARABOLA@FOCALCHORDBFD@BB}{@PST@PARABOLA@FOCALCHORD@Y}
+ \pstInterLL{#3}{@PST@PARABOLA@FOCALCHORD@X}{#4}{@PST@PARABOLA@FOCALCHORD@Y}{#5}
+ \Pst@geonodelabel{#5}%
+ \pstLineAB{#3}{#5}
+ \pstLineAB{#4}{#5}
+ \endgroup
+}%
+%
+%% \pstParabolaTangentNode[Options](O){p}{T}{A}{B}
+%% Draw the two tangent lines through the point $T$ to the Parabola P and get the node A and B on the Parabola.
+%% We use the following proposition to find the tangent node of T:
+%% Give point T outside of the parabola, we draw any other two chords TPQ and TRS, PS and QR intersect at I, PR and QS intersect at X, XI and Parabola intersect at A and B, then TA is the tangent line through A and TB is the tangent line through B.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the node name T outside the parabola
+%% #5 -> [output] the tangent node name A on the parabola
+%% #6 -> [output] the tangent node name B on the parabola
+\def\pstParabolaTangentNode{\@ifnextchar[\Pst@ParabolaTangentNode{\Pst@ParabolaTangentNode[]}}
+\def\Pst@ParabolaTangentNode[#1](#2)#3#4#5#6{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pstParabolaAbsNode[PointName=none,PointSymbol=none](#2){#3}{\pstAbscissa{#4} \pstAbscissa{#2} le {\pstAbscissa{#2} #3 abs 2 div add}{\pstAbscissa{#2} #3 abs 2 div sub} ifelse}{@PST@PARABOLA@TANGENTAUX@P0}
+ \pstParabolaAbsNode[PointName=none,PointSymbol=none](#2){#3}{\pstAbscissa{#4} \pstAbscissa{#2} le {\pstAbscissa{#2} #3 abs 4 div add}{\pstAbscissa{#2} #3 abs 4 div sub} ifelse}{@PST@PARABOLA@TANGENTAUX@R0}
+ \pstParabolaLineInter[PointName=none,PointSymbol=none](#2){#3}{#4}{@PST@PARABOLA@TANGENTAUX@P0}{@PST@PARABOLA@TANGENTAUX@P}{@PST@PARABOLA@TANGENTAUX@Q}
+ \pstParabolaLineInter[PointName=none,PointSymbol=none](#2){#3}{#4}{@PST@PARABOLA@TANGENTAUX@R0}{@PST@PARABOLA@TANGENTAUX@R}{@PST@PARABOLA@TANGENTAUX@S}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@PARABOLA@TANGENTAUX@P}{@PST@PARABOLA@TANGENTAUX@S}{@PST@PARABOLA@TANGENTAUX@Q}{@PST@PARABOLA@TANGENTAUX@R}{@PST@PARABOLA@TANGENTAUX@I}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@PARABOLA@TANGENTAUX@P}{@PST@PARABOLA@TANGENTAUX@R}{@PST@PARABOLA@TANGENTAUX@Q}{@PST@PARABOLA@TANGENTAUX@S}{@PST@PARABOLA@TANGENTAUX@X}
+ \pstParabolaLineInter(#2){#3}{@PST@PARABOLA@TANGENTAUX@X}{@PST@PARABOLA@TANGENTAUX@I}{#5}{#6}
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \pstLineAB{#4}{#5}
+ \pstLineAB{#4}{#6}
+ \endgroup%
+}%
+%
+% 4. Standard Inversion Parabola with coordinate translation
+%% ----------------------------------------------------------
+%% The Inversion Parabola P is defined by vertex O, the half of the focus chord axis $abs(p)$, the sign of $p$ indicates the direction of the parabola.
+%% The equation can be written as:
+%% \begin{equation}\label{StandardInversionParabola}
+%% (y-y0)^2=2p(x-x0)
+%% \end{equation}
+%% and the parametric function can be written as:
+%% \begin{equation}\label{ParametricFunctionOfStandardInversionParabola}
+%% \left\{\begin{array}{l}
+%% x=\dfrac{t^2}{2p}+x_o\\
+%% y=t+y_o
+%% \end{array}\right.
+%% \end{equation}
+%
+%% \pstIParabola[Options](O){p}{y0}{y1}
+%% Draw a Inversion Parabola from y0 to y1 with Vertex O, the half of the focus chord axis $abs{p}$, the sign of $p$ indicates the direction of the parabola.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the start of independent variable $y$
+%% #5 -> [input] the end of independent variable $y$
+\def\pstIParabola{\@ifnextchar[\Pst@IParabola{\Pst@IParabola[]}}
+\def\Pst@IParabola[#1](#2)#3#4#5{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \parametricplot{#4}{#5}{%
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 % p
+ 1 index t add % t+y0
+ 3 index t dup mul 3 index 2 mul div add % t^2/(2p)+x0
+ 5 2 roll pop pop pop % t+y0,t^2/(2p)+x0
+ exch % 2pt^2+x0,t+y0
+ }
+ \endgroup%
+}%
+%
+%% \pstIParabolaNode[Options](O){p}{t}{A}
+%% Draw the node whose paramater is the given value $t$ on the Inversion Parabola P.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the given parameter value $t$
+%% #5 -> [output] the node $A$ on the parabola
+\def\pstIParabolaNode{\@ifnextchar[\Pst@IParabolaNode{\Pst@IParabolaNode[]}}
+\def\Pst@IParabolaNode[#1](#2)#3#4#5{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 % p
+ 1 index #4 add % t+y0
+ 3 index #4 dup mul 3 index 2 mul div add % t^2/(2p)+x0
+ 5 2 roll pop pop pop % t+y0,t^2/(2p)+x0
+ exch % 2pt^2+x0,t+y0
+ ){#5}
+ \Pst@geonodelabel{#5}%
+ \endgroup%
+}%
+%
+%% \pstIParabolaOrdNode[Options](O){p}{$y_1$}{A}
+%% Draw the node whose ordinate is the given value $y_1$ on the Inversion Parabola P.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the given ordinate value $y_1$
+%% #5 -> [output] the node $A$ on the parabola
+\def\pstIParabolaOrdNode{\@ifnextchar[\Pst@IParabolaOrdNode{\Pst@IParabolaOrdNode[]}}
+\def\Pst@IParabolaOrdNode[#1](#2)#3#4#5{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 #4 % p y_1
+ 3 index 1 index 4 index sub dup mul 3 index 2 mul div add % x0+(y_1-y_0)^2/(2p)
+ exch 5 2 roll pop pop pop
+ ){#5}
+ \Pst@geonodelabel{#5}%
+ \endgroup%
+}%
+%
+%% \pstIParabolaAbsNode[Options](O){p}{$x_1$}{A}{B}
+%% Draw the nodes whose abscissa is the given value $x_1$ on the Inversion Parabola P.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the given abscissa value $x_1$
+%% #5 -> [output] the first node $A$ on the parabola
+%% #6 -> [output] the second node $B$ on the parabola
+\def\pstIParabolaAbsNode{\@ifnextchar[\Pst@IParabolaAbsNode{\Pst@IParabolaAbsNode[]}}
+\def\Pst@IParabolaAbsNode[#1](#2)#3#4#5#6{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 #4 % p x_1
+ 3 index sub mul 2 mul dup 0 lt {
+ pop pop pop 0 0
+ }{
+ sqrt 1 index exch sub
+ #4 exch 4 2 roll pop pop
+ } ifelse
+ ){#5}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 #4 % p x_1
+ 3 index sub mul 2 mul dup 0 lt {
+ pop pop pop 0 0
+ }{
+ sqrt 1 index add
+ #4 exch 4 2 roll pop pop
+ } ifelse
+ ){#6}
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \endgroup%
+}%
+%
+%% \pstIParabolaFocusNode[Options](O){p}{F}
+%% Draw the focus node of a Inversion Parabola P.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [output] the focus node $F$
+\def\pstIParabolaFocusNode{\@ifnextchar[\Pst@IParabolaFocusNode{\Pst@IParabolaFocusNode[]}}
+\def\Pst@IParabolaFocusNode[#1](#2)#3#4{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 %p
+ 2 index 1 index 2 div add % x0+p/2
+ 2 index % y0
+ 5 2 roll pop pop pop
+ ){#4}
+ \Pst@geonodelabel{#4}%
+ \endgroup%
+}%
+%
+%% \pstIParabolaDirectrixLine[Options](O){p}{LA}{LB}
+%% Draw the directrix line of a Inversion Parabola P.
+%% The node LA also lies on the symmetrical axis line, and node LB is another one on the directrix line.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [output] the first node $A$ on the directrix line
+%% #5 -> [output] the second node $B$ on the directrix line
+\def\pstIParabolaDirectrixLine{\@ifnextchar[\Pst@IParabolaDirectrixLine{\Pst@IParabolaDirectrixLine[]}}
+\def\Pst@IParabolaDirectrixLine[#1](#2)#3#4#5{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 %p
+ 2 index 1 index 2 div sub % x0-p/2
+ 2 index % y0
+ 5 2 roll pop pop pop
+ ){#4}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ #3 %p
+ 2 index 1 index 2 div sub % x0-p/2
+ 2 index 1 add % y0+1
+ 5 2 roll pop pop pop
+ ){#5}
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \pstLineAB{#4}{#5}
+ \endgroup%
+}%
+%
+%% \pstIParabolaLineInter[Options](O){p}{A}{B}{C}{D}
+%% Find the intersections C and D of line AB and the Inversion Parabola P.
+%% We can represent the line AB as the following function when line AB is not vertical:
+%% $$y=kx+t$$ where $$k=\dfrac{y_2-y_1}{x_2-x_1}, t=\dfrac{x_2y_1-x_1y_2}{x_2-x_1}$$
+%% The intersections are:
+%% $$x_{1,2}=\dfrac{e\pm\sqrt{w}{k^2+x_o}, y_{1,2}=kx_{1,2}+t$$
+%% where,
+%% $$e=p-km, w=p^2-2pkm, m=kx_o-y_o+t$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the node $A$ on the given line
+%% #5 -> [input] the node $B$ on the given line
+%% #6 -> [output] the first intersection node $C$
+%% #7 -> [output] the second intersection node $D$
+\def\pstIParabolaLineInter{\@ifnextchar[\Pst@IParabolaLineInter{\Pst@IParabolaLineInter[]}}
+\def\Pst@IParabolaLineInter[#1](#2)#3#4#5#6#7{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#4}\pst@tempA%
+ \pst@getcoor{#5}\pst@tempB%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 2 index 1 index sub abs 1E-5 lt { % if the line AB is horizontal
+ 2 index 5 index sub dup mul #3 2 mul div 6 index add % x=(y1-y0)^2/(2p)+x0
+ 3 index 8 2 roll pop pop pop pop pop pop
+ } {
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ % y_{1,2}=y0 \pm sqrt(2p(x1-x0))
+ 4 index #3 2 mul 5 index 8 index sub mul dup 0 lt {
+ pop pop pop pop pop pop pop pop 0 0
+ }{
+ sqrt sub % y1
+ 2 index exch 8 2 roll pop pop pop pop pop pop
+ } ifelse
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % t
+ #3 %p
+ 2 index 9 index mul 8 index sub 2 index add % m=kx_o-y_o+t
+ 1 index 4 index 2 index mul sub % e=p-km
+ 2 index dup mul 3 index 2 mul 3 index mul 6 index mul sub % w=p^2-2pkm
+ dup 0 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(w)
+ %% x_{1,2}=(e \pm sqrt(w))/k^2+x_o,y_{1,2}=kx_{1,2}+t
+ 1 index 1 index sub 6 index dup mul div 12 index add % x1
+ 6 index 1 index mul 6 index add % y1
+ 14 2 roll
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#6}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 2 index 1 index sub abs 1E-5 lt { % if the line AB is horizontal
+ pop pop pop pop pop pop 0 0
+ } {
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ % y_{1,2}=y0 \pm sqrt(2p(x1-x0))
+ 4 index #3 2 mul 5 index 8 index sub mul dup 0 lt {
+ pop pop pop pop pop pop pop pop 0 0
+ }{
+ sqrt add % y2
+ 2 index exch 8 2 roll pop pop pop pop pop pop
+ } ifelse
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % t
+ #3 %p
+ 2 index 9 index mul 8 index sub 2 index add % m=kx_o-y_o+t
+ 1 index 4 index 2 index mul sub % e=p-km
+ 2 index dup mul 3 index 2 mul 3 index mul 6 index mul sub % w=p^2-2pkm
+ dup 0 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(w)
+ %% x_{1,2}=(e \pm sqrt(w))/k^2+x_o,y_{1,2}=kx_{1,2}+t
+ 1 index 1 index add 6 index dup mul div 12 index add % x1
+ 6 index 1 index mul 6 index add % y1
+ 14 2 roll
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#7}
+ \Pst@ManageParamList{#6}%
+ \Pst@ManageParamList{#7}%
+ \endgroup%
+}%
+%
+%% \pstIParabolaPolarNode[Options](O){p}(F)[L1][L2]{A}{B}{T}
+%% Find the polar point of chord AB on Inversion Parabola P.
+%% We use the following proposition to find the polar point of chord AB:
+%% Give any chord AB, drawing two focal chord AFC and BFD, where F is the focus, then drawing FX which is perpendicular to AFC at point F, and intersect with the directrix line at X; also drawing FY which is perpendicular to BFD at point F, and intersect with the directrix line at Y. Then the intersection T of AX and BY is the polar point of chord AB.
+%% If you don't know the focus F, or the directrix line, we will find them automated, otherwise you can pass them to this macro.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] optional, the focus node/coordinate F of the parabola.
+%% #5 -> [input] optional, the node/coordinate L1 on the directrix line of the parabola.
+%% #6 -> [input] optional, the node/coordinate L2 on the directrix line of the parabola.
+%% #7 -> [input] the node A on the parabola.
+%% #8 -> [input] the node B on the parabola.
+%% #9 -> [output] the polar node T of chord AB.
+\def\pstIParabolaPolarNode{\@ifnextchar[\Pst@IParabolaPolarNode{\Pst@IParabolaPolarNode[]}}
+\def\Pst@IParabolaPolarNode[#1](#2)#3{%
+ \begingroup
+ \psset{#1}%
+ \def\pst@parabola@vertex{#2}%
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar(\Pst@IParabolaPolarNode@i{\Pst@IParabolaPolarNode@j}}%
+\def\Pst@IParabolaPolarNode@i(#1){%
+ \def\pst@parabola@focus{#1}%
+ \@ifnextchar[\Pst@IParabolaPolarNode@ii{\Pst@IParabolaPolarNode@jj}}%
+\def\Pst@IParabolaPolarNode@j{%
+ \pstIParabolaFocusNode[PointName=none,PointSymbol=none](\pst@parabola@vertex){\pst@parabola@semifocalchord}{@PST@IPARABOLA@FOCUS}
+ \Pst@IParabolaPolarNode@i(@PST@IPARABOLA@FOCUS)}%
+\def\Pst@IParabolaPolarNode@jj{%
+ \pstIParabolaDirectrixLine[PointName=none,PointSymbol=none,linestyle=none](\pst@parabola@vertex){\pst@parabola@semifocalchord}{@PST@IPARABOLA@LA}{@PST@IPARABOLA@LB}
+ \Pst@IParabolaPolarNode@ii[@PST@IPARABOLA@LA][@PST@IPARABOLA@LB]}%
+\def\Pst@IParabolaPolarNode@ii[#1][#2]#3#4#5{%
+ \pstIParabolaLineInter[PointName=none,PointSymbol=none,linestyle=none](\pst@parabola@vertex){\pst@parabola@semifocalchord}{#3}{\pst@parabola@focus}{@PST@IPARABOLA@FOCALCHORDAFC@A}{@PST@IPARABOLA@FOCALCHORDAFC@C}
+ \pstIParabolaLineInter[PointName=none,PointSymbol=none,linestyle=none](\pst@parabola@vertex){\pst@parabola@semifocalchord}{#4}{\pst@parabola@focus}{@PST@IPARABOLA@FOCALCHORDBFD@B}{@PST@IPARABOLA@FOCALCHORDBFD@D}
+ \pstRotation[PointName=none,PointSymbol=none,RotAngle=90]{\pst@parabola@focus}{@PST@IPARABOLA@FOCALCHORDAFC@A}[@PST@IPARABOLA@FOCALCHORDAFC@AA]
+ \pstRotation[PointName=none,PointSymbol=none,RotAngle=90]{\pst@parabola@focus}{@PST@IPARABOLA@FOCALCHORDBFD@B}[@PST@IPARABOLA@FOCALCHORDBFD@BB]
+ \pstInterLL[PointName=none,PointSymbol=none]{#1}{#2}{\pst@parabola@focus}{@PST@IPARABOLA@FOCALCHORDAFC@AA}{@PST@IPARABOLA@FOCALCHORD@X}
+ \pstInterLL[PointName=none,PointSymbol=none]{#1}{#2}{\pst@parabola@focus}{@PST@IPARABOLA@FOCALCHORDBFD@BB}{@PST@IPARABOLA@FOCALCHORD@Y}
+ \pstInterLL{#3}{@PST@IPARABOLA@FOCALCHORD@X}{#4}{@PST@IPARABOLA@FOCALCHORD@Y}{#5}
+ \Pst@geonodelabel{#5}%
+ \pstLineAB{#3}{#5}
+ \pstLineAB{#4}{#5}
+ \endgroup
+}%
+%
+%% \pstIParabolaTangentNode[Options](O){p}{T}{A}{B}
+%% Draw the two tangent lines through the point $T$ to the Inversion Parabola P and get the node A and B on the Inversion Parabola.
+%% We use the following proposition to find the tangent node of T:
+%% Give point T outside of the parabola, we draw any other two chords TPQ and TRS, PS and QR intersect at I, PR and QS intersect at X, XI and Parabola intersect at A and B, then TA is the tangent line through A and TB is the tangent line through B.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the node name T outside the parabola
+%% #5 -> [output] the tangent node name A on the parabola
+%% #6 -> [output] the tangent node name B on the parabola
+\def\pstIParabolaTangentNode{\@ifnextchar[\Pst@IParabolaTangentNode{\Pst@IParabolaTangentNode[]}}
+\def\Pst@IParabolaTangentNode[#1](#2)#3#4#5#6{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pstIParabolaOrdNode[PointName=none,PointSymbol=none](#2){#3}{\pstOrdinate{#4} \pstOrdinate{#2} le {\pstOrdinate{#2} #3 abs 2 div add}{\pstOrdinate{#2} #3 abs 2 div sub} ifelse}{@PST@IPARABOLA@TANGENTAUX@P0}
+ \pstIParabolaOrdNode[PointName=none,PointSymbol=none](#2){#3}{\pstOrdinate{#4} \pstOrdinate{#2} le {\pstOrdinate{#2} #3 abs 4 div add}{\pstOrdinate{#2} #3 abs 4 div sub} ifelse}{@PST@IPARABOLA@TANGENTAUX@R0}
+ \pstIParabolaLineInter[PointName=none,PointSymbol=none](#2){#3}{#4}{@PST@IPARABOLA@TANGENTAUX@P0}{@PST@IPARABOLA@TANGENTAUX@P}{@PST@IPARABOLA@TANGENTAUX@Q}
+ \pstIParabolaLineInter[PointName=none,PointSymbol=none](#2){#3}{#4}{@PST@IPARABOLA@TANGENTAUX@R0}{@PST@IPARABOLA@TANGENTAUX@R}{@PST@IPARABOLA@TANGENTAUX@S}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@IPARABOLA@TANGENTAUX@P}{@PST@IPARABOLA@TANGENTAUX@S}{@PST@IPARABOLA@TANGENTAUX@Q}{@PST@IPARABOLA@TANGENTAUX@R}{@PST@IPARABOLA@TANGENTAUX@I}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@IPARABOLA@TANGENTAUX@P}{@PST@IPARABOLA@TANGENTAUX@R}{@PST@IPARABOLA@TANGENTAUX@Q}{@PST@IPARABOLA@TANGENTAUX@S}{@PST@IPARABOLA@TANGENTAUX@X}
+ \pstIParabolaLineInter(#2){#3}{@PST@IPARABOLA@TANGENTAUX@X}{@PST@IPARABOLA@TANGENTAUX@I}{#5}{#6}
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \pstLineAB{#4}{#5}
+ \pstLineAB{#4}{#6}
+ \endgroup%
+}%
+%
+% 5. General Parabola with coordinate translation and rotation
+%% ----------------------------------------------------------
+%% The General Parabola P is defined by vertex O, the half of the focus chord axis $abs(p)$, the sign of $p$ indicates the direction of the parabola,
+%% and the rotation angle $\theta$ of the symmetrical axis.
+%%
+%% The equation can be got from the parametric function of the parabola \ref{ParametricFunctionOfStandardParabola},
+%% using the rotation transform formula \ref{RotationTransformFormula}, then we have
+%% \begin{equation}
+%% \left\{\begin{array}{l}
+%% x'=(t+x_o)\cos\theta-(\dfrac{t^2}{2p}+y_o)\sin\theta=x_o'+t\cos\theta-t^2\dfrac{\sin\theta}{2p}\\
+%% y'=(t+x_o)\sin\theta+(\dfrac{t^2}{2p}+y_o)\cos\theta=y_o'+t\sin\theta+t^2\dfrac{\cos\theta}{2p}
+%% \end{array}\right.
+%% \end{equation}
+%% where the $x_o'$ and $y_o'$ are the coordinate of the given vertex O after rotation.
+%% So we get the parametric function of the General Parabola with coordinate translation and rotation as following:
+%% \begin{equation}\label{ParametricFunctionOfGeneralParabola}
+%% \left\{\begin{array}{l}
+%% x=x_o+t\cos\theta-t^2\dfrac{\sin\theta}{2p}\\
+%% y=y_o+t\sin\theta+t^2\dfrac{\cos\theta}{2p}
+%% \end{array}\right.
+%% \end{equation}
+%
+%% \pstGeneralParabola[Options](O){p}[rotation]{x0}{x1}
+%% Draw a General Parabola from x0 to x1 with Vertex O, the half of the focus chord axis $p$, the sign of $p$ indicates the direction of the parabola,
+%% and the rotation angle $\theta$ of the symmetrical axis.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the start of independent variable $x$
+%% #6 -> [input] the end of independent variable $x$
+\def\pstGeneralParabola{\@ifnextchar[\Pst@GeneralParabola{\Pst@GeneralParabola[]}}
+\def\Pst@GeneralParabola[#1](#2)#3{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO %
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralParabola@i{\Pst@GeneralParabola@i[0]}}%
+\def\Pst@GeneralParabola@i[#1]#2#3{%
+ \parametricplot{#2}{#3}{%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space % p
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 4 index 2 index t mul add % x_o+t\cos\theta
+ 3 index 2 mul t dup mul exch div % t^2/(2p)
+ 2 index mul sub % x_o+t\cos\theta-t^2\dfrac{\sin\theta}{2p}
+ 4 index 2 index t mul add % y_o+t\sin\theta
+ 4 index 2 mul t dup mul exch div % t^2/(2p)
+ 4 index mul add % y_o+t\sin\theta+t^2\dfrac{\cos\theta}{2p}
+ 7 2 roll pop pop pop pop pop
+ }
+ \endgroup%
+}%
+%
+%% \pstGeneralParabolaNode[Options](O){p}[rotation]{t}{A}
+%% Create a new node on the given General Parabola P.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the parameter t to get the node on the parabola.
+%% #6 -> [output] the target node A on the parabola.
+\def\pstGeneralParabolaNode{\@ifnextchar[\Pst@GeneralParabolaNode{\Pst@GeneralParabolaNode[]}}
+\def\Pst@GeneralParabolaNode[#1](#2)#3{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO %
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralParabolaNode@i{\Pst@GeneralParabolaNode@i[0]}}%
+\def\Pst@GeneralParabolaNode@i[#1]#2#3{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space % p
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 4 index 2 index #2 mul add % x_o+t\cos\theta
+ 3 index 2 mul #2 dup mul exch div % t^2/(2p)
+ 2 index mul sub % x_o+t\cos\theta-t^2\dfrac{\sin\theta}{2p}
+ 4 index 2 index #2 mul add % y_o+t\sin\theta
+ 4 index 2 mul #2 dup mul exch div % t^2/(2p)
+ 4 index mul add % y_o+t\sin\theta+t^2\dfrac{\cos\theta}{2p}
+ 7 2 roll pop pop pop pop pop
+ ){#3}
+ \Pst@geonodelabel{#3}%
+ \endgroup%
+}%
+%
+%% \pstGeneralParabolaAbsNode[Options](O){p}[rotation]{$x_1$}{A}{B}
+%% Draw the nodes whose abscissas are the given value $x_1$ on the General Parabola P.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% We use the parametric function \ref{ParametricFunctionOfGeneralParabola}, when $x$ equals $x_1$, we have
+%% $$t=\dfrac{p\cos\theta \pm \sqrt{p^2\cos^2\theta-2p(x_1-x_o)\sin\theta}}{\sin\theta} or x_1-x_o when \sin\theta=0$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the given abscissa value $x_1$
+%% #6 -> [output] the target node A on the parabola.
+%% #7 -> [output] the target node B on the parabola.
+\def\pstGeneralParabolaAbsNode{\@ifnextchar[\Pst@GeneralParabolaAbsNode{\Pst@GeneralParabolaAbsNode[]}}
+\def\Pst@GeneralParabolaAbsNode[#1](#2)#3{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralParabolaAbsNode@i{\Pst@GeneralParabolaAbsNode@i[0]}}%
+\def\Pst@GeneralParabolaAbsNode@i[#1]#2#3#4{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space #2 % p x_1
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ dup abs 1E-5 lt { % like ZeroEq
+ 2 index 6 index sub % t
+ 5 index 1 index dup mul 6 index 2 mul div add % y=y_o+t^2/(2p)
+ 4 index exch 9 2 roll pop pop pop pop pop pop pop
+ } {
+ 3 index dup mul 2 index dup mul mul % p^2\cos^2\theta
+ 4 index 2 mul 4 index 8 index sub mul 2 index mul % 2p(x_1-x_o)\sin\theta
+ sub dup 0 lt {
+ pop pop pop pop pop pop pop 0 0
+ } {
+ sqrt 4 index 3 index mul exch sub 1 index div % t_1
+ 5 index 1 index 3 index mul add 1 index dup mul 6 index 2 mul div 4 index mul add % y_1
+ 4 index exch 9 2 roll pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#3}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space #2 % p x_1
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ dup abs 1E-5 lt { % like ZeroEq
+ pop pop pop pop pop pop 0 0
+ } {
+ 3 index dup mul 2 index dup mul mul % p^2\cos^2\theta
+ 4 index 2 mul 4 index 8 index sub mul 2 index mul % 2p(x_1-x_o)\sin\theta
+ sub dup 0 lt {
+ pop pop pop pop pop pop pop 0 0
+ } {
+ sqrt 4 index 3 index mul add 1 index div % t_2
+ 5 index 1 index 3 index mul add 1 index dup mul 6 index 2 mul div 4 index mul add % y_2
+ 4 index exch 9 2 roll pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#4}
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \endgroup%
+}%
+%
+%% \pstGeneralParabolaOrdNode[Options](O){p}[rotation]{$y_1$}{A}{B}
+%% Draw the nodes whose ordinates are the given value $y_1$ on the General Parabola P.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% We use the parametric function \ref{ParametricFunctionOfGeneralParabola}, when y equals $y_1$, we have
+%% $$t=\dfrac{-p\sin\theta \pm \sqrt{p^2\sin^2\theta+2p(y_1-y_0)\cos\theta}{\cos\theta} or y_1-y_o when \cos\theta=0$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the given ordinate value $y_1$
+%% #6 -> [output] the target node A on the parabola.
+%% #7 -> [output] the target node B on the parabola.
+\def\pstGeneralParabolaOrdNode{\@ifnextchar[\Pst@GeneralParabolaOrdNode{\Pst@GeneralParabolaOrdNode[]}}
+\def\Pst@GeneralParabolaOrdNode[#1](#2)#3{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralParabolaOrdNode@i{\Pst@GeneralParabolaOrdNode@i[0]}}%
+\def\Pst@GeneralParabolaOrdNode@i[#1]#2#3#4{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space #2 % p y_1
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 1 index abs 1E-5 lt { % if \cos\theta=0
+ 2 index 5 index sub % t
+ 6 index 1 index dup mul 6 index 2 mul div sub % x=x_o-t^2/(2p)
+ 4 index 9 2 roll pop pop pop pop pop pop pop
+ } {
+ 3 index dup mul 1 index dup mul mul % p^2\sin^2\theta
+ 4 index 2 mul 4 index 7 index sub mul 3 index mul % 2p(y_1-y_o)\cos\theta
+ add dup 0 lt {
+ pop pop pop pop pop pop pop 0 0
+ } {
+ sqrt 4 index 2 index mul add neg 2 index div % t_1
+ 6 index 1 index 4 index mul add 1 index dup mul 6 index 2 mul div 3 index mul sub % x_1
+ 4 index 9 2 roll pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#3}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space #2 % p y_1
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 1 index abs 1E-5 lt { % if \cos\theta=0
+ pop pop pop pop pop pop 0 0
+ } {
+ 3 index dup mul 1 index dup mul mul % p^2\sin^2\theta
+ 4 index 2 mul 4 index 7 index sub mul 3 index mul % 2p(y_1-y_o)\cos\theta
+ add dup 0 lt {
+ pop pop pop pop pop pop pop 0 0
+ } {
+ sqrt 4 index 2 index mul sub 2 index div % t_2
+ 6 index 1 index 4 index mul add 1 index dup mul 6 index 2 mul div 3 index mul sub % x_2
+ 4 index 9 2 roll pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#4}
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \endgroup%
+}%
+%
+%% \pstGeneralParabolaFocusNode[Options](O){p}[rotation]{F}
+%% Draw the focus nodes of the General Parabola P.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [output] the focus node A of the parabola.
+\def\pstGeneralParabolaFocusNode{\@ifnextchar[\Pst@GeneralParabolaFocusNode{\Pst@GeneralParabolaFocusNode[]}}
+\def\Pst@GeneralParabolaFocusNode[#1](#2)#3{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralParabolaFocusNode@i{\Pst@GeneralParabolaFocusNode@i[0]}}%
+\def\Pst@GeneralParabolaFocusNode@i[#1]#2{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space 2 div % p/2
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 4 index 3 index 2 index mul sub % x=x0-p/2\sin\theta
+ 4 index 4 index 4 index mul add % y=y0+p/2\cos\theta
+ 7 2 roll pop pop pop pop pop
+ ){#2}
+ \Pst@geonodelabel{#2}%
+ \endgroup%
+}%
+%
+%% \pstGeneralParabolaDirectrixLine[Options](O){p}[rotation]{LA}{LB}
+%% Draw the directrix line of the General Parabola P.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% The node LA also lies on the symmetrical axis line, and node LB is another one on the directrix line.
+%% they can be got after the orig nodes rotation $\theta$ about the vertex $O$,
+%% please refer to the extension rotation formula \ref{ExtensionRotationTransformFormula}.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [output] the first node LA on the directrix line.
+%% #6 -> [output] the second node LB on the directrix line.
+\def\pstGeneralParabolaDirectrixLine{\@ifnextchar[\Pst@GeneralParabolaDirectrixLine{\Pst@GeneralParabolaDirectrixLine[]}}
+\def\Pst@GeneralParabolaDirectrixLine[#1](#2)#3{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralParabolaDirectrixLine@i{\Pst@GeneralParabolaDirectrixLine@i[0]}}%
+\def\Pst@GeneralParabolaDirectrixLine@i[#1]#2#3{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space 2 div % p/2
+ 2 index 2 index 2 index sub 5 2 roll pop
+ #1 cos #1 sin % x y x0 y0 \cos\theta \sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#2}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space 2 div % p/2
+ 2 index 1 add 2 index 2 index sub 5 2 roll pop
+ #1 cos #1 sin % x y x0 y0 \cos\theta \sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#3}
+ \Pst@ManageParamList{#2}%
+ \Pst@ManageParamList{#3}%
+ \pstLineAB{#2}{#3}
+ \endgroup%
+}%
+%
+%% \pstGeneralParabolaLineInter[Options](O){p}[rotation]{A}{B}{C}{D}
+%% Find the intersections C and D of line AB and the General Parabola P.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%%
+%% Case 1. When line AB is vertical, i.e, $x_1=x_2$, we have
+%% Case 1.1 When $\sin\theta=0$, we have
+%% $$t=x_1-x_o$$
+%% and $x_{C}=x_1,y_{C}=y_o+\dfrac{t^2}{2p}$, but D is not defined.
+%% Case 1.2 When $\sin\theta\neq0$, we have
+%% $$t_{1,2}=\dfrac{p\cos\theta \pm \sqrt{p^2\cos^2\theta-2p(x_1-x_o)\sin\theta}}{\sin\theta}$$
+%% and $x_{C,D}=x_1,y_{C,D}=y_o+t_{1,2}\sin\theta+\dfrac{t_{1,2}^2}{2p}\cos\theta$.
+%% Case 2. When line AB is not vertical, we can represent the line AB as the following function:
+%% $$y=kx+d$$ where $$k=\dfrac{y_2-y_1}{x_2-x_1}, d=\dfrac{x_2y_1-x_1y_2}{x_2-x_1}
+%% refer to equation (\ref{ParametricFunctionOfGeneralParabola}), we have
+%% $$ft^2-2pet-2pm=0$$
+%% where
+%% $$m=kx_o-y_o+d,e=k\cos\theta-\sin\theta,f=k\sin\theta+\cos\theta$$
+%% Case 2.1 When $f=k\sin\theta+\cos\theta=0$, which gives $\sin\theta\neq0$ and $k=-\dfrac{\cos\theta}{\sin\theta}$,
+%% at this time, we have $t=m\sin\theta$ and then
+%% $$x_{C}=x_o+t\cos\theta-\dfrac{t^2}{2p}\sin\theta, y_{C}=y_o+t\sin\theta+\dfrac{t^2}{2p}\cos\theta$$
+%% but D is not defined.
+%% Case 2.2 When $f=k\sin\theta+\cos\theta\neq0$, we have $t_{1,2}=\dfrac{pe\pm\sqrt{(pe)^2+2fmp}}{f}$, and then
+%% $$x_{C,D}=x_o+t_{1,2}\cos\theta-\dfrac{t_{1,2}^2}{2p}\sin\theta, y_{C,D}=y_o+t_{1,2}\sin\theta+\dfrac{t_{1,2}^2}{2p}\cos\theta$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the node $A$ on the given line
+%% #6 -> [input] the node $B$ on the given line
+%% #7 -> [output] the first intersection node $C$
+%% #8 -> [output] the second intersection node $D$
+\def\pstGeneralParabolaLineInter{\@ifnextchar[\Pst@GeneralParabolaLineInter{\Pst@GeneralParabolaLineInter[]}}
+\def\Pst@GeneralParabolaLineInter[#1](#2)#3{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralParabolaLineInter@i{\Pst@GeneralParabolaLineInter@i[0]}}%
+\def\Pst@GeneralParabolaLineInter@i[#1]#2#3#4#5{%
+ \pst@getcoor{#2}\pst@tempA%
+ \pst@getcoor{#3}\pst@tempB%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ dup abs 1E-5 lt { % like ZeroEq % if \sin\theta=0
+ 5 index 8 index sub % t=x1-x0
+ 7 index 1 index dup mul \pst@parabola@semifocalchord\space 2 mul div add % y=y_o+t^2/(2p)
+ 7 index exch 9 2 roll pop pop pop pop pop pop pop
+ } {
+ \pst@parabola@semifocalchord\space %p
+ 2 index 1 index mul % p\cos\theta
+ dup dup mul 2 index 2 mul 9 index 12 index sub mul 4 index mul sub % p^2\cos^2\theta-2p(x_1-x_o)\sin\theta
+ dup 0 lt {
+ pop pop pop pop pop
+ pop pop pop pop pop
+ pop 0 0
+ } {
+ sqrt 1 index exch sub 3 index div % t_1
+ 9 index 1 index 5 index mul add 1 index dup mul 4 index 2 mul div 6 index mul add % y_1
+ 9 index exch 11 2 roll pop pop pop pop
+ pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % d
+ \pst@parabola@semifocalchord\space %p
+ 2 index 9 index mul 8 index sub 2 index add % m=kx_o-y_o+t
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 5 index 2 index mul 1 index sub % e=k\cos\theta-\sin\theta
+ 6 index 2 index mul 3 index add % f=k\sin\theta+\cos\theta
+ % (aaaaaa----) print pstack (aaaaaa===) print
+ dup abs 1E-5 lt { % like ZeroEq
+ 4 index 3 index mul % t=m\sin\theta
+ 14 index 1 index 6 index mul add 1 index dup mul 8 index 2 mul div 5 index mul sub % x_1
+ 14 index 2 index 6 index mul add 2 index dup mul 9 index 2 mul div 7 index mul add % y_1
+ % (xxxxxx----) print pstack (xxxxxx===) print
+ 17 2 roll pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ pop pop pop
+ } {
+ 5 index 2 index mul % pe
+ dup dup mul 2 index 7 index mul 8 index 2 mul mul add % (pe)^2+2fmp
+ dup 0 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt 1 index exch sub 2 index div % t_1
+ 15 index 1 index 7 index mul add 1 index dup mul 9 index 2 mul div 6 index mul sub % x_1
+ 15 index 2 index 7 index mul add 2 index dup mul 10 index 2 mul div 8 index mul add % y_1
+ % (bbbbbb----) print pstack (bbbbbb===) print
+ 18 2 roll pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#4}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ dup abs 1E-5 lt { % like ZeroEq % if \sin\theta=0
+ pop pop pop pop pop pop pop pop 0 0
+ } {
+ \pst@parabola@semifocalchord\space %p
+ 2 index 1 index mul % p\cos\theta
+ dup dup mul 2 index 2 mul 9 index 12 index sub mul 4 index mul sub % p^2\cos^2\theta-2p(x_1-x_o)\sin\theta
+ dup 0 lt {
+ pop pop pop pop pop
+ pop pop pop pop pop
+ pop 0 0
+ } {
+ sqrt 1 index add 3 index div % t_2
+ 9 index 1 index 5 index mul add 1 index dup mul 4 index 2 mul div 6 index mul add % y_2
+ 9 index exch 11 2 roll pop pop pop pop
+ pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % d
+ \pst@parabola@semifocalchord\space %p
+ 2 index 9 index mul 8 index sub 2 index add % m=kx_o-y_o+d
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 5 index 2 index mul 1 index sub % e=k\cos\theta-\sin\theta
+ 6 index 2 index mul 3 index add % f=k\sin\theta+\cos\theta
+ dup abs 1E-5 lt { % like ZeroEq
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop 0 0
+ } {
+ 5 index 2 index mul % pe
+ dup dup mul 2 index 7 index mul 8 index 2 mul mul add % (pe)^2+2fmp
+ dup 0 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt 1 index add 2 index div % t_2
+ 15 index 1 index 7 index mul add 1 index dup mul 9 index 2 mul div 6 index mul sub % x_2
+ 15 index 2 index 7 index mul add 2 index dup mul 10 index 2 mul div 8 index mul add % y_2
+ % (ccccccc----) print pstack (ccccccc===) print
+ 18 2 roll pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#5}
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \endgroup%
+}%
+%
+%% \pstGeneralParabolaPolarNode[Options](O){p}[rotation](F)[L1][L2]{A}{B}{T}
+%% Find the polar point of chord AB on General Parabola P.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% We use the following proposition to find the polar point of chord AB:
+%% Give any chord AB, drawing two focal chord AFC and BFD, where F is the focus, then drawing FX which is perpendicular to AFC at point F, and intersect with the directrix line at X; also drawing FY which is perpendicular to BFD at point F, and intersect with the directrix line at Y. Then the intersection T of AX and BY is the polar point of chord AB.
+%% If you don't know the focus F, or the directrix line, we will find them automated, otherwise you can pass them to this macro.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] optional, the focus node/coordinate F of the parabola.
+%% #6 -> [input] optional, the node/coordinate L1 on the directrix line of the parabola.
+%% #7 -> [input] optional, the node/coordinate L2 on the directrix line of the parabola.
+%% #8 -> [input] the node A on the parabola.
+%% #9 -> [input] the node B on the parabola.
+%% #10 -> [output] the polar node T of chord AB.
+\def\pstGeneralParabolaPolarNode{\@ifnextchar[\Pst@GeneralParabolaPolarNode{\Pst@GeneralParabolaPolarNode[]}}
+\def\Pst@GeneralParabolaPolarNode[#1](#2)#3{%
+ \begingroup
+ \psset{#1}%
+ \def\pst@generalparabola@vertex{#2}%
+ \def\pst@generalparabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralParabolaPolarNode@i{\Pst@GeneralParabolaPolarNode@i[0]}}%
+\def\Pst@GeneralParabolaPolarNode@i[#1]{%
+ \def\pst@generalparabola@gradientangle{#1}%
+ \@ifnextchar(\Pst@GeneralParabolaPolarNode@j{\Pst@GeneralParabolaPolarNode@k}}%
+\def\Pst@GeneralParabolaPolarNode@j(#1){%
+ \def\pst@generalparabola@focus{#1}%
+ \@ifnextchar[\Pst@GeneralParabolaPolarNode@jj{\Pst@GeneralParabolaPolarNode@kk}}%
+\def\Pst@GeneralParabolaPolarNode@k{%
+ \pstGeneralParabolaFocusNode[PointName=none,PointSymbol=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[\pst@generalparabola@gradientangle]{@PST@GENERALPARABOLA@FOCUS}
+ \Pst@GeneralParabolaPolarNode@j(@PST@GENERALPARABOLA@FOCUS)}%
+\def\Pst@GeneralParabolaPolarNode@kk{%
+ \pstGeneralParabolaDirectrixLine[linestyle=none,PointName=none,PointSymbol=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[\pst@generalparabola@gradientangle]{@PST@GENERALPARABOLA@DIRECTRIXLINEA}{@PST@GENERALPARABOLA@DIRECTRIXLINEB}
+ \Pst@GeneralParabolaPolarNode@jj[@PST@GENERALPARABOLA@DIRECTRIXLINEA][@PST@GENERALPARABOLA@DIRECTRIXLINEB]}%
+\def\Pst@GeneralParabolaPolarNode@jj[#1][#2]#3#4#5{%
+ \pstGeneralParabolaLineInter[PointName=none,PointSymbol=none,linestyle=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[\pst@generalparabola@gradientangle]{#3}{\pst@generalparabola@focus}{@PST@GENERALPARABOLA@FOCALCHORDAFC@A}{@PST@GENERALPARABOLA@FOCALCHORDAFC@C}
+ \pstGeneralParabolaLineInter[PointName=none,PointSymbol=none,linestyle=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[\pst@generalparabola@gradientangle]{#4}{\pst@generalparabola@focus}{@PST@GENERALPARABOLA@FOCALCHORDBFD@B}{@PST@GENERALPARABOLA@FOCALCHORDBFD@D}
+ \pstRotation[PointName=none,PointSymbol=none,RotAngle=90]{\pst@generalparabola@focus}{@PST@GENERALPARABOLA@FOCALCHORDAFC@A}[@PST@GENERALPARABOLA@FOCALCHORDAFC@AA]
+ \pstRotation[PointName=none,PointSymbol=none,RotAngle=90]{\pst@generalparabola@focus}{@PST@GENERALPARABOLA@FOCALCHORDBFD@B}[@PST@GENERALPARABOLA@FOCALCHORDBFD@BB]
+ \pstInterLL[PointName=none,PointSymbol=none]{#1}{#2}{\pst@generalparabola@focus}{@PST@GENERALPARABOLA@FOCALCHORDAFC@AA}{@PST@GENERALPARABOLA@FOCALCHORD@X}
+ \pstInterLL[PointName=none,PointSymbol=none]{#1}{#2}{\pst@generalparabola@focus}{@PST@GENERALPARABOLA@FOCALCHORDBFD@BB}{@PST@GENERALPARABOLA@FOCALCHORD@Y}
+ \pstInterLL{#3}{@PST@GENERALPARABOLA@FOCALCHORD@X}{#4}{@PST@GENERALPARABOLA@FOCALCHORD@Y}{#5}
+ \Pst@geonodelabel{#5}%
+ \pstLineAB{#3}{#5}
+ \pstLineAB{#4}{#5}
+ \endgroup
+}%
+%
+%% \pstGeneralParabolaTangentNode[Options](O){p}[rotation]{T}{A}{B}
+%% Draw the two tangent lines through the point $T$ to the General Parabola P and get the node A and B on the General Parabola.
+%% We use the following proposition to find the tangent node of T:
+%% Give point T outside of the parabola, we draw any other two chords TPQ and TRS, PS and QR intersect at I, PR and QS intersect at X, XI and GeneralParabola intersect at A and B, then TA is the tangent line through A and TB is the tangent line through B.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the given node T outside the parabola
+%% #6 -> [output] the tangent node name A on the parabola
+%% #7 -> [output] the tangent node name B on the parabola
+\def\pstGeneralParabolaTangentNode{\@ifnextchar[\Pst@GeneralParabolaTangentNode{\Pst@GeneralParabolaTangentNode[]}}
+\def\Pst@GeneralParabolaTangentNode[#1](#2)#3{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \def\pst@generalparabola@vertex{#2}%
+ \def\pst@generalparabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralParabolaTangentNode@i{\Pst@GeneralParabolaTangentNode@i[0]}}%
+\def\Pst@GeneralParabolaTangentNode@i[#1]#2#3#4{%
+ \pstGeneralParabolaAbsNode[PointName=none,PointSymbol=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[#1]{\pstAbscissa{#2} \pstAbscissa{\pst@generalparabola@vertex} le {\pstAbscissa{\pst@generalparabola@vertex} \pst@generalparabola@semifocalchord\space abs 2 div add}{\pstAbscissa{\pst@generalparabola@vertex} \pst@generalparabola@semifocalchord\space abs 2 div sub} ifelse}{@PST@GENERALPARABOLA@TANGENTAUX@P0}{@PST@GENERALPARABOLA@TANGENTAUX@P1}
+ \pstGeneralParabolaAbsNode[PointName=none,PointSymbol=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[#1]{\pstAbscissa{#2} \pstAbscissa{\pst@generalparabola@vertex} le {\pstAbscissa{\pst@generalparabola@vertex} \pst@generalparabola@semifocalchord\space abs 4 div add}{\pstAbscissa{\pst@generalparabola@vertex} \pst@generalparabola@semifocalchord\space abs 4 div sub} ifelse}{@PST@GENERALPARABOLA@TANGENTAUX@R0}{@PST@GENERALPARABOLA@TANGENTAUX@R1}
+ \pstGeneralParabolaLineInter[PointName=none,PointSymbol=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[#1]{#2}{@PST@GENERALPARABOLA@TANGENTAUX@P0}{@PST@GENERALPARABOLA@TANGENTAUX@P}{@PST@GENERALPARABOLA@TANGENTAUX@Q}
+ \pstGeneralParabolaLineInter[PointName=none,PointSymbol=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[#1]{#2}{@PST@GENERALPARABOLA@TANGENTAUX@R0}{@PST@GENERALPARABOLA@TANGENTAUX@R}{@PST@GENERALPARABOLA@TANGENTAUX@S}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@GENERALPARABOLA@TANGENTAUX@P}{@PST@GENERALPARABOLA@TANGENTAUX@S}{@PST@GENERALPARABOLA@TANGENTAUX@Q}{@PST@GENERALPARABOLA@TANGENTAUX@R}{@PST@GENERALPARABOLA@TANGENTAUX@I}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@GENERALPARABOLA@TANGENTAUX@P}{@PST@GENERALPARABOLA@TANGENTAUX@R}{@PST@GENERALPARABOLA@TANGENTAUX@Q}{@PST@GENERALPARABOLA@TANGENTAUX@S}{@PST@GENERALPARABOLA@TANGENTAUX@X}
+ \pstGeneralParabolaLineInter(\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[#1]{@PST@GENERALPARABOLA@TANGENTAUX@X}{@PST@GENERALPARABOLA@TANGENTAUX@I}{#3}{#4}
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \pstLineAB{#2}{#3}
+ \pstLineAB{#2}{#4}
+ \endgroup%
+}%
+%
+% 6. General Inversion Parabola with coordinate translation and rotation
+%% ----------------------------------------------------------
+%% The General Inversion Parabola P is defined by vertex O, the half of the focus chord axis $abs(p)$, the sign of $p$ indicates the direction of the parabola,
+%% and the rotation angle $\theta$ of the symmetrical axis.
+%%
+%% The equation can be got from the parametric function of the inversion parabola \ref{ParametricFunctionOfStandardInversionParabola},
+%% using the rotation transform formula \ref{RotationTransformFormula}, then we have
+%% \begin{equation}
+%% \left\{\begin{array}{l}
+%% x'=(\dfrac{t^2}{2p}+x_o)\cos\theta-(t+y_o)\sin\theta=x_o'-t\sin\theta+t^2\dfrac{\cos\theta}{2p}\\
+%% y'=(\dfrac{t^2}{2p}+x_o)\sin\theta+(t+y_o)\cos\theta=y_o'+t\cos\theta+t^2\dfrac{\sin\theta}{2p}
+%% \end{array}\right.
+%% \end{equation}
+%% where the $x_o'$ and $y_o'$ are the coordinate of the given vertex O after rotation.
+%% So we get the parametric function of the General Inversion Parabola with coordinate translation and rotation as following:
+%% \begin{equation}\label{ParametricFunctionOfGeneralInversionParabola}
+%% \left\{\begin{array}{l}
+%% x=x_o-t\sin\theta+t^2\dfrac{\cos\theta}{2p}\\
+%% y=y_o+t\cos\theta+t^2\dfrac{\sin\theta}{2p}
+%% \end{array}\right.
+%% \end{equation}
+%
+%% \pstGeneralIParabola[Options](O){p}[rotation]{y0}{y1}
+%% Draw a General Inversion Parabola from y0 to y1 with Vertex O, the half of the focus chord axis $p$,
+%% and the rotation angle $\theta$ of the symmetrical axis.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the start of independent variable $y$
+%% #6 -> [input] the end of independent variable $y$
+\def\pstGeneralIParabola{\@ifnextchar[\Pst@GeneralIParabola{\Pst@GeneralIParabola[]}}
+\def\Pst@GeneralIParabola[#1](#2)#3{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO %
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralIParabola@i{\Pst@GeneralIParabola@i[0]}}%
+\def\Pst@GeneralIParabola@i[#1]#2#3{%
+ \parametricplot{#2}{#3}{%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space % p
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 4 index 1 index t mul sub % x_o-t\sin\theta
+ 3 index 2 mul t dup mul exch div % t^2/(2p)
+ 3 index mul add % x_o-t\sin\theta+t^2\dfrac{\cos\theta}{2p}
+ 4 index 3 index t mul add % y_o+t\cos\theta
+ 4 index 2 mul t dup mul exch div % t^2/(2p)
+ 3 index mul add % y_o+t\cos\theta+t^2\dfrac{\sin\theta}{2p}
+ 7 2 roll pop pop pop pop pop
+ }
+ \endgroup%
+}%
+%
+%% \pstGeneralIParabolaNode[Options](O){p}[rotation]{t}{A}
+%% Create a new node $A$ whose parameter is the the given value $t$ on the given General Inversion Parabola P.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the parameter t to get the node on the parabola.
+%% #6 -> [output] the target node A on the parabola.
+\def\pstGeneralIParabolaNode{\@ifnextchar[\Pst@GeneralIParabolaNode{\Pst@GeneralIParabolaNode[]}}
+\def\Pst@GeneralIParabolaNode[#1](#2)#3{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO %
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralIParabolaNode@i{\Pst@GeneralIParabolaNode@i[0]}}%
+\def\Pst@GeneralIParabolaNode@i[#1]#2#3{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space % p
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 4 index 1 index #2 mul sub % x_o-t\sin\theta
+ 3 index 2 mul #2 dup mul exch div % t^2/(2p)
+ 3 index mul add % x_o-t\sin\theta+t^2\dfrac{\cos\theta}{2p}
+ 4 index 3 index #2 mul add % y_o+t\cos\theta
+ 4 index 2 mul #2 dup mul exch div % t^2/(2p)
+ 3 index mul add % y_o+t\cos\theta+t^2\dfrac{\sin\theta}{2p}
+ 7 2 roll pop pop pop pop pop
+ ){#3}
+ \Pst@geonodelabel{#3}%
+ \endgroup%
+}%
+%
+%% \pstGeneralIParabolaAbsNode[Options](O){p}[rotation]{x_1}{A}{B}
+%% Find the nodes $A$ and $B$ whose abscissa are the the given value $x_1$ on the given General Inversion Parabola P.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% when $x=x_1$, we have
+%% $$t^2\dfrac{\cos\theta}{2p}-t\sin\theta-(x_1-x_o)=0$$
+%% when $\cos\theta=0$, we have $t=-(x_1-x_o)$, so
+%% $$x=x_1, y=y_o+\dfrac{t^2}{2p}$$
+%% when $\cos\theta\neq0$, we have
+%% $$t_{1,2}=\dfrac{-b\pm\sqrt{b^2-4ac}}{2a}=\dfrac{\sin\theta\pm\sqrt{\sin^2\theta+4\cos\theta/(2p)(x_1-x_o)}}{2\cos\theta/(2p)}$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the abscissa $x_1$ to get the node on the parabola.
+%% #6 -> [output] the first node A on the parabola.
+%% #7 -> [output] the second node B on the parabola.
+\def\pstGeneralIParabolaAbsNode{\@ifnextchar[\Pst@GeneralIParabolaAbsNode{\Pst@GeneralIParabolaAbsNode[]}}
+\def\Pst@GeneralIParabolaAbsNode[#1](#2)#3{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO %
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralIParabolaAbsNode@i{\Pst@GeneralIParabolaAbsNode@i[0]}}%
+\def\Pst@GeneralIParabolaAbsNode@i[#1]#2#3#4{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space % p
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 1 index abs 1E-5 lt { % if \cos\theta=0
+ 4 index #2 sub % t=x0-x1
+ 4 index 1 index dup mul 5 index 2 mul div add % y=y0+t^2/(2p)
+ #2 exch 8 2 roll pop pop pop pop pop pop
+ } {
+ 1 index 3 index div % \cos\theta/p
+ #2 6 index sub 1 index mul 2 mul 2 index dup mul add % 2(x1-x0)\cos\theta/p+\sin^2\theta
+ dup 0 lt {
+ pop pop pop pop pop pop pop 0 0
+ } {
+ sqrt 2 index exch sub 1 index div % t1
+ 5 index 1 index 5 index mul add 1 index dup mul 4 index mul 6 index 2 mul div add % y1
+ #2 exch 9 2 roll pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#3}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space % p
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 1 index abs 1E-5 lt { % if \cos\theta=0
+ pop pop pop pop pop 0 0
+ } {
+ 1 index 3 index div % \cos\theta/p
+ #2 6 index sub 1 index mul 2 mul 2 index dup mul add % 2(x1-x0)\cos\theta/p+\sin^2\theta
+ dup 0 lt {
+ pop pop pop pop pop pop pop 0 0
+ } {
+ sqrt 2 index add 1 index div % t2
+ 5 index 1 index 5 index mul add 1 index dup mul 4 index mul 6 index 2 mul div add % y2
+ #2 exch 9 2 roll pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#4}
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \endgroup%
+}%
+%
+%% \pstGeneralIParabolaOrdNode[Options](O){p}[rotation]{y_1}{A}{B}
+%% Find the nodes $A$ and $B$ whose ordinate are the the given value $y_1$ on the given General Inversion Parabola P.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% when $y=y_1$, we have
+%% $$t^2\dfrac{\sin\theta}{2p}+t\cos\theta-(y_1-y_o)=0$$
+%% when $\sin\theta=0$, we have $t=(y_1-y_o)$, so
+%% $$y=y_1, x=x_o+\dfrac{t^2}{2p}$$
+%% when $\sin\theta\neq0$, we have
+%% $$t_{1,2}=\dfrac{-b\pm\sqrt{b^2-4ac}}{2a}=\dfrac{-\cos\theta\pm\sqrt{\cos^2\theta+4\sin\theta/(2p)(y_1-y_o)}}{2\sin\theta/(2p)}$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the ordinate $y_1$ to get the node on the parabola.
+%% #6 -> [output] the first node A on the parabola.
+%% #7 -> [output] the second node B on the parabola.
+\def\pstGeneralIParabolaOrdNode{\@ifnextchar[\Pst@GeneralIParabolaOrdNode{\Pst@GeneralIParabolaOrdNode[]}}
+\def\Pst@GeneralIParabolaOrdNode[#1](#2)#3{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO %
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralIParabolaOrdNode@i{\Pst@GeneralIParabolaOrdNode@i[0]}}%
+\def\Pst@GeneralIParabolaOrdNode@i[#1]#2#3#4{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space % p
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 0 index abs 1E-5 lt { % if \sin\theta=0
+ #2 4 index sub % t=y1-y0
+ 5 index 1 index dup mul 5 index 2 mul div add % x=x0+t^2/(2p)
+ #2 exch 8 2 roll pop pop pop pop pop pop
+ } {
+ 0 index 3 index div % \sin\theta/p
+ #2 5 index sub 1 index mul 2 mul 3 index dup mul add % 2(y1-y0)\sin\theta/p+\cos^2\theta
+ dup 0 lt {
+ pop pop pop pop pop pop pop 0 0
+ } {
+ sqrt 3 index add neg 1 index div % t1
+ 6 index 1 index 4 index mul sub 1 index dup mul 5 index mul 6 index 2 mul div add % x1
+ #2 9 2 roll pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#3}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space % p
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 0 index abs 1E-5 lt { % if \sin\theta=0
+ #2 4 index sub % t=y1-y0
+ 5 index 1 index dup mul 5 index 2 mul div add % x=x0+t^2/(2p)
+ #2 exch 8 2 roll pop pop pop pop pop pop
+ } {
+ 0 index 3 index div % \sin\theta/p
+ #2 5 index sub 1 index mul 2 mul 3 index dup mul add % 2(y1-y0)\sin\theta/p+\cos^2\theta
+ dup 0 lt {
+ pop pop pop pop pop pop pop 0 0
+ } {
+ sqrt 3 index sub 1 index div % t2
+ 6 index 1 index 4 index mul sub 1 index dup mul 5 index mul 6 index 2 mul div add % x2
+ #2 9 2 roll pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ ){#4}
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \endgroup%
+}%
+%
+%% \pstGeneralIParabolaFocusNode[Options](O){p}[rotation]{F}
+%% Find the focus node $F$ of the given General Inversion Parabola P.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [output] the focus node F of the parabola.
+\def\pstGeneralIParabolaFocusNode{\@ifnextchar[\Pst@GeneralIParabolaFocusNode{\Pst@GeneralIParabolaFocusNode[]}}
+\def\Pst@GeneralIParabolaFocusNode[#1](#2)#3{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO %
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralIParabolaFocusNode@i{\Pst@GeneralIParabolaFocusNode@i[0]}}%
+\def\Pst@GeneralIParabolaFocusNode@i[#1]#2{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space 2 div % p/2
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 4 index 3 index 3 index mul add % x=x0+p/2\cos\theta
+ 4 index 4 index 3 index mul add % y=y0+p/2\sin\theta
+ 7 2 roll pop pop pop pop pop
+ ){#2}
+ \Pst@geonodelabel{#2}%
+ \endgroup%
+}%
+%
+%% \pstGeneralIParabolaDirectrixLine[Options](O){p}[rotation]{LA}{LB}
+%% Draw the directrix line of the General Inversion Parabola P.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% The node LA also lies on the symmetrical axis line, and node LB is another one on the directrix line.
+%% they can be got after the orig nodes rotation $\theta$ about the vertex $O$,
+%% please refer to the extension rotation formula \ref{ExtensionRotationTransformFormula}.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [output] the first node LA on the directrix line.
+%% #6 -> [output] the second node LB on the directrix line.
+\def\pstGeneralIParabolaDirectrixLine{\@ifnextchar[\Pst@GeneralIParabolaDirectrixLine{\Pst@GeneralIParabolaDirectrixLine[]}}
+\def\Pst@GeneralIParabolaDirectrixLine[#1](#2)#3{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralIParabolaDirectrixLine@i{\Pst@GeneralIParabolaDirectrixLine@i[0]}}%
+\def\Pst@GeneralIParabolaDirectrixLine@i[#1]#2#3{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space 2 div % p/2
+ 2 index 1 index sub 2 index 5 2 roll pop
+ #1 cos #1 sin % x y x0 y0 \cos\theta \sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#2}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@parabola@semifocalchord\space 2 div % p/2
+ 2 index 1 index sub 2 index 1 add 5 2 roll pop
+ #1 cos #1 sin % x y x0 y0 \cos\theta \sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#3}
+ \Pst@ManageParamList{#2}%
+ \Pst@ManageParamList{#3}%
+ \pstLineAB{#2}{#3}
+ \endgroup%
+}%
+%
+%% \pstGeneralIParabolaLineInter[Options](O){p}[rotation]{A}{B}{C}{D}
+%% Find the intersections C and D of line AB and the General Imversion Parabola P.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%%
+%% Case 1. When line AB is vertical, i.e, $x_1=x_2$, we have
+%% $$t^2\dfrac{\cos\theta}{2p}-t\sin\theta-(x_1-x_o)=0$$
+%% Case 1.1 When $\cos\theta=0$, we have $t=x_o-x_1$,and then
+%% $$x_{C}=x_1,y_{C}=y_o+\dfrac{t^2}{2p}$$
+%% but D is not defined.
+%%
+%% Case 1.2 When $\cos\theta\neq0$, we have
+%% $$t_{1,2}=\dfrac{p\sin\theta \pm \sqrt{p^2\sin^2\theta+2p(x_1-x_o)\cos\theta}}{\cos\theta}$$
+%% and then
+%% $$x_{C,D}=x_1,y_{C,D}=y_o+t_{1,2}\sin\theta+\dfrac{t_{1,2}^2}{2p}\cos\theta$$
+%%
+%% Case 2. When line AB is not vertical, we can represent the line AB as the following function:
+%% $$y=kx+d$$ where $$k=\dfrac{y_2-y_1}{x_2-x_1}, d=\dfrac{x_2y_1-x_1y_2}{x_2-x_1}$$
+%% refer to equation (\ref{ParametricFunctionOfGeneralInversionParabola}), we have
+%% $$ft^2+2pet-2pm=0$$
+%% where
+%% $$m=kx_o-y_o+d,e=\cos\theta+k\sin\theta,f=\sin\theta-k\cos\theta$$
+%%
+%% Case 2.1 When $f=0$, which gives $\sin\theta\neq0$ and $k=\dfrac{\sin\theta}{\cos\theta}$,
+%% at this time, we have $t=m\cos\theta$, and then
+%% $$x_{C}=x_o-t\sin\theta+t^2\dfrac{\cos\theta}{2p},y_{C}=y_o+t\cos\theta+t^2\dfrac{\sin\theta}{2p}$$
+%% but D is not defined.
+%% Case 2.2 When $f\neq0$, we have
+%% $$t_{1,2}=\dfrac{-pe\pm\sqrt{(pe)^2+2fmp}}{f}$$
+%% and then
+%% $$x_{C,D}=x_o-t_{1,2}\sin\theta+t_{1,2}^2\dfrac{\cos\theta}{2p},y_{C,D}=y_o+t_{1,2}\cos\theta+t_{1,2}^2\dfrac{\sin\theta}{2p}$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the node $A$ on the given line
+%% #6 -> [input] the node $B$ on the given line
+%% #7 -> [output] the first intersection node $C$
+%% #8 -> [output] the second intersection node $D$
+\def\pstGeneralIParabolaLineInter{\@ifnextchar[\Pst@GeneralIParabolaLineInter{\Pst@GeneralIParabolaLineInter[]}}
+\def\Pst@GeneralIParabolaLineInter[#1](#2)#3{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \def\pst@parabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralIParabolaLineInter@i{\Pst@GeneralIParabolaLineInter@i[0]}}%
+\def\Pst@GeneralIParabolaLineInter@i[#1]#2#3#4#5{%
+ \pst@getcoor{#2}\pst@tempA%
+ \pst@getcoor{#3}\pst@tempB%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 1 index abs 1E-5 lt { % like ZeroEq % if \cos\theta=0
+ 7 index 6 index sub % t=x0-x1
+ 7 index 1 index dup mul \pst@parabola@semifocalchord\space 2 mul div add % y=y_o+t^2/(2p)
+ 7 index exch 9 2 roll pop pop pop pop pop pop pop
+ } {
+ \pst@parabola@semifocalchord\space %p
+ 1 index 1 index mul % p\sin\theta
+ dup dup mul 2 index 2 mul 9 index 12 index sub mul 5 index mul add % p^2\sin^2\theta+2p(x_1-x_o)\cos\theta
+ dup 0 lt {
+ pop pop pop pop pop
+ pop pop pop pop pop
+ pop 0 0
+ } {
+ sqrt 1 index exch sub 4 index div % t_1
+ 9 index 1 index 6 index mul add 1 index dup mul 4 index 2 mul div 5 index mul add % y_1
+ 9 index exch 11 2 roll pop pop pop pop
+ pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % d
+ \pst@parabola@semifocalchord\space %p
+ 2 index 9 index mul 8 index sub 2 index add % m=kx_o-y_o+d
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 5 index 1 index mul 2 index add % e=k\sin\theta+\cos\theta
+ 6 index 3 index mul 2 index exch sub % f=\sin\theta-k\cos\theta
+ dup abs 1E-5 lt { % like ZeroEq
+ 4 index 4 index mul % t=m\cos\theta
+ 14 index 1 index 5 index mul sub 1 index dup mul 8 index 2 mul div 6 index mul add % x_1
+ 14 index 2 index 7 index mul add 2 index dup mul 9 index 2 mul div 6 index mul add % y_1
+ 17 2 roll pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ pop pop pop
+ } {
+ 5 index 2 index mul % pe
+ dup dup mul 2 index 7 index mul 8 index 2 mul mul add % (pe)^2+2fmp
+ dup 0 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt 1 index add neg 2 index div % t_1
+ 15 index 1 index 6 index mul sub 1 index dup mul 9 index 2 mul div 7 index mul add % x_1
+ 15 index 2 index 8 index mul add 2 index dup mul 10 index 2 mul div 7 index mul add % y_1
+ 18 2 roll pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#4}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 1 index abs 1E-5 lt { % like ZeroEq % if \cos\theta=0
+ pop pop pop pop pop pop pop pop 0 0
+ } {
+ \pst@parabola@semifocalchord\space %p
+ 1 index 1 index mul % p\sin\theta
+ dup dup mul 2 index 2 mul 9 index 12 index sub mul 5 index mul add % p^2\sin^2\theta+2p(x_1-x_o)\cos\theta
+ dup 0 lt {
+ pop pop pop pop pop
+ pop pop pop pop pop
+ pop 0 0
+ } {
+ sqrt 1 index add 4 index div % t_2
+ 9 index 1 index 6 index mul add 1 index dup mul 4 index 2 mul div 5 index mul add % y_2
+ 9 index exch 11 2 roll pop pop pop pop
+ pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % d
+ \pst@parabola@semifocalchord\space %p
+ 2 index 9 index mul 8 index sub 2 index add % m=kx_o-y_o+t
+ #1 dup cos exch sin % \cos\theta \sin\theta
+ 5 index 1 index mul 2 index add % e=k\sin\theta+\cos\theta
+ 6 index 3 index mul 2 index exch sub % f=\sin\theta-k\cos\theta
+ dup abs 1E-5 lt { % like ZeroEq
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ 0 0
+ } {
+ 5 index 2 index mul % pe
+ dup dup mul 2 index 7 index mul 8 index 2 mul mul add % (pe)^2+2fmp
+ dup 0 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt 1 index sub 2 index div % t_2
+ 15 index 1 index 6 index mul sub 1 index dup mul 9 index 2 mul div 7 index mul add % x_2
+ 15 index 2 index 8 index mul add 2 index dup mul 10 index 2 mul div 7 index mul add % y_2
+ 18 2 roll pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#5}
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \endgroup%
+}%
+%
+%% \pstGeneralIParabolaPolarNode[Options](O){p}[rotation](F)[L1][L2]{A}{B}{T}
+%% Find the polar point of chord AB on General Inversion Parabola P.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% We use the following proposition to find the polar point of chord AB:
+%% Give any chord AB, drawing two focal chord AFC and BFD, where F is the focus, then drawing FX which is perpendicular to AFC at point F, and intersect with the directrix line at X; also drawing FY which is perpendicular to BFD at point F, and intersect with the directrix line at Y. Then the intersection T of AX and BY is the polar point of chord AB.
+%% If you don't know the focus F, or the directrix line, we will find them automated, otherwise you can pass them to this macro.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] optional, the focus node/coordinate F of the parabola.
+%% #6 -> [input] optional, the node/coordinate L1 on the directrix line of the parabola.
+%% #7 -> [input] optional, the node/coordinate L2 on the directrix line of the parabola.
+%% #8 -> [input] the node A on the parabola.
+%% #9 -> [input] the node B on the parabola.
+%% #10 -> [output] the polar node T of chord AB.
+\def\pstGeneralIParabolaPolarNode{\@ifnextchar[\Pst@GeneralIParabolaPolarNode{\Pst@GeneralIParabolaPolarNode[]}}
+\def\Pst@GeneralIParabolaPolarNode[#1](#2)#3{%
+ \begingroup
+ \psset{#1}%
+ \def\pst@generalparabola@vertex{#2}%
+ \def\pst@generalparabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralIParabolaPolarNode@i{\Pst@GeneralIParabolaPolarNode@i[0]}}%
+\def\Pst@GeneralIParabolaPolarNode@i[#1]{%
+ \def\pst@generalparabola@gradientangle{#1}%
+ \@ifnextchar(\Pst@GeneralIParabolaPolarNode@j{\Pst@GeneralIParabolaPolarNode@k}}%
+\def\Pst@GeneralIParabolaPolarNode@j(#1){%
+ \def\pst@generalparabola@focus{#1}%
+ \@ifnextchar[\Pst@GeneralIParabolaPolarNode@jj{\Pst@GeneralIParabolaPolarNode@kk}}%
+\def\Pst@GeneralIParabolaPolarNode@k{%
+ \pstGeneralIParabolaFocusNode[PointName=none,PointSymbol=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[\pst@generalparabola@gradientangle]{@PST@GENERALIPARABOLA@FOCUS}
+ \Pst@GeneralIParabolaPolarNode@j(@PST@GENERALIPARABOLA@FOCUS)}%
+\def\Pst@GeneralIParabolaPolarNode@kk{%
+ \pstGeneralIParabolaDirectrixLine[linestyle=none,PointName=none,PointSymbol=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[\pst@generalparabola@gradientangle]{@PST@GENERALIPARABOLA@DIRECTRIXLINEA}{@PST@GENERALIPARABOLA@DIRECTRIXLINEB}
+ \Pst@GeneralIParabolaPolarNode@jj[@PST@GENERALIPARABOLA@DIRECTRIXLINEA][@PST@GENERALIPARABOLA@DIRECTRIXLINEB]}%
+\def\Pst@GeneralIParabolaPolarNode@jj[#1][#2]#3#4#5{%
+ \pstGeneralIParabolaLineInter[PointName=none,PointSymbol=none,linestyle=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[\pst@generalparabola@gradientangle]{#3}{\pst@generalparabola@focus}{@PST@GENERALIPARABOLA@FOCALCHORDAFC@A}{@PST@GENERALIPARABOLA@FOCALCHORDAFC@C}
+ \pstGeneralIParabolaLineInter[PointName=none,PointSymbol=none,linestyle=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[\pst@generalparabola@gradientangle]{#4}{\pst@generalparabola@focus}{@PST@GENERALIPARABOLA@FOCALCHORDBFD@B}{@PST@GENERALIPARABOLA@FOCALCHORDBFD@D}
+ \pstRotation[PointName=none,PointSymbol=none,RotAngle=90]{\pst@generalparabola@focus}{@PST@GENERALIPARABOLA@FOCALCHORDAFC@A}[@PST@GENERALIPARABOLA@FOCALCHORDAFC@AA]
+ \pstRotation[PointName=none,PointSymbol=none,RotAngle=90]{\pst@generalparabola@focus}{@PST@GENERALIPARABOLA@FOCALCHORDBFD@B}[@PST@GENERALIPARABOLA@FOCALCHORDBFD@BB]
+ \pstInterLL[PointName=none,PointSymbol=none]{#1}{#2}{\pst@generalparabola@focus}{@PST@GENERALIPARABOLA@FOCALCHORDAFC@AA}{@PST@GENERALIPARABOLA@FOCALCHORD@X}
+ \pstInterLL[PointName=none,PointSymbol=none]{#1}{#2}{\pst@generalparabola@focus}{@PST@GENERALIPARABOLA@FOCALCHORDBFD@BB}{@PST@GENERALIPARABOLA@FOCALCHORD@Y}
+ \pstInterLL{#3}{@PST@GENERALIPARABOLA@FOCALCHORD@X}{#4}{@PST@GENERALIPARABOLA@FOCALCHORD@Y}{#5}
+ \Pst@geonodelabel{#5}%
+ \pstLineAB{#3}{#5}
+ \pstLineAB{#4}{#5}
+ \endgroup
+}%
+%
+%% \pstGeneralIParabolaTangentNode[Options](O){p}[rotation]{T}{A}{B}
+%% Draw the two tangent lines through the point $T$ to the General Inversion Parabola P and get the node A and B on the General Inversion Parabola.
+%% We use the following proposition to find the tangent node of T:
+%% Give point T outside of the parabola, we draw any other two chords TPQ and TRS, PS and QR intersect at I, PR and QS intersect at X, XI and GeneralIParabola intersect at A and B, then TA is the tangent line through A and TB is the tangent line through B.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the parabola vertex O
+%% #3 -> [input] the half of focal chord $p$
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the given node T outside the parabola
+%% #6 -> [output] the tangent node name A on the parabola
+%% #7 -> [output] the tangent node name B on the parabola
+\def\pstGeneralIParabolaTangentNode{\@ifnextchar[\Pst@GeneralIParabolaTangentNode{\Pst@GeneralIParabolaTangentNode[]}}
+\def\Pst@GeneralIParabolaTangentNode[#1](#2)#3{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \def\pst@generalparabola@vertex{#2}%
+ \def\pst@generalparabola@semifocalchord{#3}%
+ \@ifnextchar[\Pst@GeneralIParabolaTangentNode@i{\Pst@GeneralIParabolaTangentNode@i[0]}}%
+\def\Pst@GeneralIParabolaTangentNode@i[#1]#2#3#4{%
+ \pstGeneralIParabolaAbsNode[PointName=none,PointSymbol=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[#1]{\pstAbscissa{#2} \pstAbscissa{\pst@generalparabola@vertex} le {\pstAbscissa{\pst@generalparabola@vertex} \pst@generalparabola@semifocalchord\space abs 2 div add}{\pstAbscissa{\pst@generalparabola@vertex} \pst@generalparabola@semifocalchord\space abs 2 div sub} ifelse}{@PST@GENERALIPARABOLA@TANGENTAUX@P0}{@PST@GENERALIPARABOLA@TANGENTAUX@P1}
+ \pstGeneralIParabolaAbsNode[PointName=none,PointSymbol=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[#1]{\pstAbscissa{#2} \pstAbscissa{\pst@generalparabola@vertex} le {\pstAbscissa{\pst@generalparabola@vertex} \pst@generalparabola@semifocalchord\space abs 4 div add}{\pstAbscissa{\pst@generalparabola@vertex} \pst@generalparabola@semifocalchord\space abs 4 div sub} ifelse}{@PST@GENERALIPARABOLA@TANGENTAUX@R0}{@PST@GENERALIPARABOLA@TANGENTAUX@R1}
+ \pstGeneralIParabolaLineInter[PointName=none,PointSymbol=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[#1]{#2}{@PST@GENERALIPARABOLA@TANGENTAUX@P0}{@PST@GENERALIPARABOLA@TANGENTAUX@P}{@PST@GENERALIPARABOLA@TANGENTAUX@Q}
+ \pstGeneralIParabolaLineInter[PointName=none,PointSymbol=none](\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[#1]{#2}{@PST@GENERALIPARABOLA@TANGENTAUX@R0}{@PST@GENERALIPARABOLA@TANGENTAUX@R}{@PST@GENERALIPARABOLA@TANGENTAUX@S}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@GENERALIPARABOLA@TANGENTAUX@P}{@PST@GENERALIPARABOLA@TANGENTAUX@S}{@PST@GENERALIPARABOLA@TANGENTAUX@Q}{@PST@GENERALIPARABOLA@TANGENTAUX@R}{@PST@GENERALIPARABOLA@TANGENTAUX@I}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@GENERALIPARABOLA@TANGENTAUX@P}{@PST@GENERALIPARABOLA@TANGENTAUX@R}{@PST@GENERALIPARABOLA@TANGENTAUX@Q}{@PST@GENERALIPARABOLA@TANGENTAUX@S}{@PST@GENERALIPARABOLA@TANGENTAUX@X}
+ \pstGeneralIParabolaLineInter(\pst@generalparabola@vertex){\pst@generalparabola@semifocalchord}[#1]{@PST@GENERALIPARABOLA@TANGENTAUX@X}{@PST@GENERALIPARABOLA@TANGENTAUX@I}{#3}{#4}
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \pstLineAB{#2}{#3}
+ \pstLineAB{#2}{#4}
+ \endgroup%
+}%
+%
+%
+% 7. Standard Hyperbola with coordinate translation
+%% ----------------------------------------------------------
+%% The Standard Hyperbola H is defined by center O, the half of the real axis $a$, the half of the imaginary axis $b$.
+%% The equation can be written as:
+%% \begin{equation}\label{FunctionOfStandardHyperbola}
+%% \dfrac{(x-x0)^2}{a^2}-\dfrac{(y-y0)^2}{b^2}=1
+%% \end{equation}
+%% and the parametric function can be written as:
+%% \begin{equation}\label{ParametricFunctionOfStandardHyperbola}
+%% \left\{\begin{array}{l}
+%% x=a\sec\alpha+x_o\\
+%% y=b\tan\alpha+y_o
+%% \end{array}\right.
+%% \end{equation}
+%
+%% \pstHyperbola[Options](O)(a,b)[maxAngleX]
+%% Draw a Hyperbola with center O, the half of the real axis $abs(a)$, and the half of the imaginary axis $abs(b)$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the maximal angle to draw the branch.
+\def\pstHyperbola{\@ifnextchar[\Pst@Hyperbola{\Pst@Hyperbola[]}}
+\def\Pst@Hyperbola[#1](#2)(#3){%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@Hyperbola@i{\Pst@Hyperbola@i[85]}}%
+\def\Pst@Hyperbola@i[#1]{%
+ \pst@cnth=#1\pst@cntg=180\pst@cntm=180\pst@cntn=360
+ \ifnum\pst@cnth<0
+ \loop\advance\pst@cnth by 90
+ \ifnum\pst@cnth<0
+ \repeat
+ \fi
+ \ifnum\pst@cnth>90
+ \loop\advance\pst@cnth by -90
+ \ifnum\pst@cnth>90
+ \repeat
+ \fi
+ \ifnum\pst@cnth>85
+ \advance\pst@cnth by -5
+ \fi
+ \advance\pst@cntg by -\pst@cnth
+ \advance\pst@cntm by \pst@cnth
+ \advance\pst@cntn by -\pst@cnth
+ \Pst@Hyperbola@ii[0][\number\pst@cnth]%
+ \Pst@Hyperbola@ii[\number\pst@cntg][180]%
+ \Pst@Hyperbola@ii[180][\number\pst@cntm]%
+ \Pst@Hyperbola@ii[\number\pst@cntn][360]%
+ \endgroup%
+}%
+\def\Pst@Hyperbola@ii[#1][#2]{%
+ \parametricplot{#1}{#2}{%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ t dup cos exch sin % cos{t} sin{t}
+ 1 index abs 1E-5 lt {
+ pop pop pop pop
+ } {
+ 5 index 4 index 3 index div add % x0+a\sec{t}
+ 5 index 4 index 3 index mul 4 index div add % y0+b\tan{t}
+ 8 2 roll pop pop pop pop pop pop
+ } ifelse
+ }%
+}%
+%
+%% \pstHyperbolaNode[Options](O)(a,b){t}{P}
+%% Create a new node P on the Hyperbola E whose parameter is the given value $t$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the parametric argument t.
+%% #5 -> [output] the target node name.
+\def\pstHyperbolaNode{\@ifnextchar[\Pst@HyperbolaNode{\Pst@HyperbolaNode[]}}
+\def\Pst@HyperbolaNode[#1](#2)(#3)#4#5{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #4 dup cos exch sin % cos{t} sin{t}
+ 1 index abs 1E-5 lt {
+ pop pop pop pop
+ }{
+ 5 index 4 index 3 index div add % x0+a\sec{t}
+ 5 index 4 index 3 index 5 index div mul add % y0+b\tan{t}
+ } ifelse
+ 8 2 roll pop pop pop pop pop pop
+ ){#5}%
+ \Pst@geonodelabel{#5}%
+ \endgroup%
+}%
+%
+%% \pstHyperbolaAbsNode[Options](O)(a,b){x_1}{A}{B}
+%% Create a new node P on the Hyperbola E whose abscissa is the given value $x_1$.
+%% when $x=x_1$, we have
+%% $$\dfrac{(x_1-x_0)^2}{a^2}-\dfrac{(y-y_0)^2}{b^2}=1$$
+%% $$(y-y_0)^2=\dfrac{b^2(x_1-x_0)^2-a^2b^2}{a^2}$$
+%% $$y=y_0\pm\dfrac{b}{a}\sqrt{(x_1-x_0)^2-a^2}$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the abbscissa value $x_1$.
+%% #5 -> [output] the first target node name.
+%% #6 -> [output] the first second node name.
+\def\pstHyperbolaAbsNode{\@ifnextchar[\Pst@HyperbolaAbsNode{\Pst@HyperbolaAbsNode[]}}
+\def\Pst@HyperbolaAbsNode[#1](#2)(#3)#4#5#6{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #4 4 index sub dup mul 2 index dup mul sub % (x_1-x_0)^2-a^2
+ dup 0 lt {
+ pop pop pop pop pop 0 0
+ } {
+ sqrt 1 index mul 2 index div 3 index exch sub % y1
+ #4 exch 6 2 roll pop pop pop pop
+ } ifelse
+ ){#5}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #4 4 index sub dup mul 2 index dup mul sub % (x_1-x_0)^2-a^2
+ dup 0 lt {
+ pop pop pop pop pop 0 0
+ } {
+ sqrt 1 index mul 2 index div 3 index add % y2
+ #4 exch 6 2 roll pop pop pop pop
+ } ifelse
+ ){#6}%
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \endgroup%
+}%
+%
+%% \pstHyperbolaOrdNode[Options](O)(a,b){y_1}{A}{B}
+%% Create a new node P on the Hyperbola E whose ordinate is the given value $y_1$.
+%% when $y=y_1$, we have
+%% $$\dfrac{(x-x_0)^2}{a^2}-\dfrac{(y_1-y_0)^2}{b^2}=1$$
+%% $$(x-x_0)^2=\dfrac{a^2(y_1-y_0)^2+a^2b^2}{b^2}$$
+%% $$x=x_0\pm\dfrac{a}{b}\sqrt{(y_1-y_0)^2+b^2}$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the ordinate value $y_1$.
+%% #5 -> [output] the first target node name.
+%% #6 -> [output] the first second node name.
+\def\pstHyperbolaOrdNode{\@ifnextchar[\Pst@HyperbolaOrdNode{\Pst@HyperbolaOrdNode[]}}
+\def\Pst@HyperbolaOrdNode[#1](#2)(#3)#4#5#6{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #4 3 index sub dup mul 1 index dup mul add % (y_1-y_0)^2+b^2
+ sqrt 2 index mul 1 index div 4 index exch sub % x1
+ #4 6 2 roll pop pop pop pop
+ ){#5}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #4 3 index sub dup mul 1 index dup mul add % (y_1-y_0)^2+b^2
+ sqrt 2 index mul 1 index div 4 index add % x2
+ #4 6 2 roll pop pop pop pop
+ ){#6}%
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \endgroup%
+}%
+%
+%% \pstHyperbolaFocusNode[Options](O)(a,b){F1}{F2}
+%% Create the two focus node F1 and F2 of the Hyperbola H.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [output] the first focus node name.
+%% #5 -> [output] the first focus node name.
+\def\pstHyperbolaFocusNode{\@ifnextchar[\Pst@HyperbolaFocusNode{\Pst@HyperbolaFocusNode[]}}
+\def\Pst@HyperbolaFocusNode[#1](#2)(#3)#4#5{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ dup mul exch dup mul add sqrt % c
+ 2 index exch sub 1 index % x0-c,y0
+ 4 2 roll pop pop
+ ){#4}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ dup mul exch dup mul add sqrt % c
+ 2 index add 1 index % x0+c,y0
+ 6 2 roll pop pop pop pop
+ ){#5}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \endgroup%
+}%
+%
+%% \pstHyperbolaDirectrixLine[Options](O)(a,b){Lx}{Ly}{Rx}{Ry}
+%% Draw the two directrix lines L1 and L2 of the Hyperbola H.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [output] the first node name on the first directrix line.
+%% #5 -> [output] the second node name on the first directrix line.
+%% #6 -> [output] the first node name on the second directrix line.
+%% #7 -> [output] the second node name on the second directrix line.
+\def\pstHyperbolaDirectrixLine{\@ifnextchar[\Pst@HyperbolaDirectrixLine{\Pst@HyperbolaDirectrixLine[]}}
+\def\Pst@HyperbolaDirectrixLine[#1](#2)(#3)#4#5#6#7{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 1 index dup mul dup 2 index dup mul add sqrt div % a^2/c
+ 4 index exch sub 3 index % x0-a^2/c,y0
+ 6 2 roll pop pop pop pop
+ ){#4}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 1 index dup mul dup 2 index dup mul add sqrt div % a^2/c
+ 4 index exch sub 3 index 1 add % x0-a^2/c,y0+1
+ 6 2 roll pop pop pop pop
+ ){#5}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 1 index dup mul dup 2 index dup mul add sqrt div % a^2/c
+ 4 index add 3 index % x0+a^2/c,y0
+ 6 2 roll pop pop pop pop
+ ){#6}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 1 index dup mul dup 2 index dup mul add sqrt div % a^2/c
+ 4 index add 3 index 1 add % x0+a^2/c,y0+1
+ 6 2 roll pop pop pop pop
+ ){#7}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \Pst@ManageParamList{#7}%
+ \pstLineAB{#4}{#5}%
+ \pstLineAB{#6}{#7}%
+ \endgroup%
+}%
+%
+%% \pstHyperbolaAsymptoteLine[Options](O)(a,b){L1}{L2}
+%% Draw the two asymptote lines L1 and L2 of the Hyperbola H.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [output] the second node name on the first asymptote line, the first node is the center O.
+%% #5 -> [output] the second node name on the second asymptote line, the first node is the center O.
+\def\pstHyperbolaAsymptoteLine{\@ifnextchar[\Pst@HyperbolaAsymptoteLine{\Pst@HyperbolaAsymptoteLine[]}}
+\def\Pst@HyperbolaAsymptoteLine[#1](#2)(#3)#4#5{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 0 index 2 index div % b/a
+ 4 index 1 add % x=x0+1
+ 4 index 2 index add % y=y0+b/a
+ 7 2 roll pop pop pop pop pop
+ ){#4}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 0 index 2 index div % b/a
+ 4 index 1 add % x=x0+1
+ 4 index 2 index sub % y=y0-b/a
+ 7 2 roll pop pop pop pop pop
+ ){#5}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \pstLineAB{#2}{#4}%
+ \pstLineAB{#2}{#5}%
+ \endgroup%
+}%
+%
+%% \pstHyperbolaLineInter[Options](O)(a,b){A}{B}{C}{D}
+%% Find the two intersection nodes C and D of the Hyperbola H and line AB.
+%%
+%% Case 1. When line AB is vertical, i.e, $x_1=x_2$, we have
+%% $$y=y_0\pm\dfrac{b}{a}\sqrt{(x_1-x_0)^2-a^2}$$
+%%
+%% Case 2. When line AB is not vertical, we can represent the line AB as the following function:
+%% $$y=kx+d$$ where $$k=\dfrac{y_2-y_1}{x_2-x_1}, d=\dfrac{x_2y_1-x_1y_2}{x_2-x_1}$$
+%% refer to equation (\ref{FunctionOfStandardHyperbola}), we have
+%% $$(b^2-k^2a^2)X^2-2a^2kmX-a^2(m^2+b^2)=0$$
+%% $$Y=kX+m$$
+%% where
+%% $$m=kx_o-y_o+d,X=x-x_0,Y=y-y_0$$
+%%
+%% Case 2.1 When $b^2-k^2a^2=0$, which gives $k=\pm\dfrac{b}{a}\neq0$,
+%% at this time, when $m=0$, the line AB becomes the asymptote of the hyperbola,
+%% so there is none intersection any more; else we have
+%% $$x_{C}=x_o-\dfrac{m^2+b^2}{2km},y_{C}=kx_{C}+d$$
+%% but D is not defined.
+%%
+%% Case 2.2 When $b^2-k^2a^2\neq0$, we have
+%% $$x_{C,D}=x_0+\dfrac{a^2km\pm{}ab\sqrt{m^2+b^2-k^2a^2}}{b^2-k^2a^2},y_{C,D}=kx_{C,D}+d$$
+%%
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the first node name on the given line AB.
+%% #5 -> [input] the second node name on the given line AB.
+%% #6 -> [output] the first intersection node.
+%% #7 -> [output] the second intersection node.
+\def\pstHyperbolaLineInter{\@ifnextchar[\Pst@HyperbolaLineInter{\Pst@HyperbolaLineInter[]}}
+\def\Pst@HyperbolaLineInter[#1](#2)(#3)#4#5#6#7{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pst@getcoor{#4}\pst@tempA%
+ \pst@getcoor{#5}\pst@tempB%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ \pst@tempA \tx@UserCoor % x_1,y_1
+ \pst@tempB \tx@UserCoor % x_2,y_2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ %% $$y=y_0\pm\dfrac{b}{a}\sqrt{(x_1-x_0)^2-a^2}$$
+ 3 index 8 index sub dup mul 6 index dup mul sub
+ dup 0 lt {
+ pop pop pop pop pop pop pop pop pop
+ 0 0
+ } {
+ sqrt 5 index mul 6 index div 7 index exch sub % y1
+ 4 index exch % x1
+ 10 2 roll pop pop pop pop pop pop pop pop
+ } ifelse
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % d
+ 1 index 10 index mul 9 index sub 1 index add % m=kx_o-y_o+d
+ 7 index dup mul 9 index 4 index mul dup mul sub % b^2-k^2a^2
+ 0 index abs 1E-5 lt {
+ 1 index abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ 0 0
+ } {
+ %% $$x_{C}=x_o-\dfrac{m^2+b^2}{2km},y_{C}=kx_{C}+d$$
+ 1 index dup mul 9 index dup mul add 2 index 5 index mul 2 mul div % (m^2+b^2)/2km
+ 12 index exch sub % x1
+ 4 index 1 index mul 4 index add % y1
+ 14 2 roll pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ } ifelse
+ } {
+ 1 index dup mul 1 index add % m^2+b^2-k^2a^2
+ dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt 10 index mul 9 index mul 10 index dup mul 5 index mul 3 index mul exch sub 1 index div 12 index add % x1
+ 4 index 1 index mul 4 index add % y1
+ 14 2 roll pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#6}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ \pst@tempA \tx@UserCoor % x_1,y_1
+ \pst@tempB \tx@UserCoor % x_2,y_2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ %% $$y=y_0\pm\dfrac{b}{a}\sqrt{(x_1-x_0)^2-a^2}$$
+ 3 index 8 index sub dup mul 6 index dup mul sub
+ dup 0 lt {
+ pop pop pop pop pop pop pop pop
+ 0 0
+ } {
+ sqrt 5 index mul 6 index div 7 index add % y2
+ 4 index exch % x2
+ 10 2 roll pop pop pop pop pop pop pop pop
+ } ifelse
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % d
+ 1 index 10 index mul 9 index sub 1 index add % m=kx_o-y_o+d
+ 7 index dup mul 9 index dup mul 4 index dup mul mul sub % b^2-k^2a^2
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ 0 0
+ } {
+ 1 index dup mul 1 index add % m^2+b^2-k^2a^2
+ dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt 10 index mul 9 index mul 10 index dup mul 5 index mul 3 index mul add 1 index div 12 index add % x2
+ 4 index 1 index mul 4 index add % y2
+ 14 2 roll pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#7}%
+ \Pst@ManageParamList{#6}%
+ \Pst@ManageParamList{#7}%
+ \endgroup%
+}%
+%
+%% \pstHyperbolaPolarNode[Options](O)(a,b){A}{B}{T}
+%% Find the polar point of chord AB on hyperbola H.
+%% We use the following proposition to find the polar point of chord AB:
+%% Let $P$, $Q$ are vertex points of the hyperbola, for any chord $AB$ of hyperbola, $PA$ and $BQ$ intersect at $E$, $PB$ and $AQ$ intersect at $F$, then the middle point $M$ of $EF$ is the polar point of chord $AB$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the node A on the hyperbola.
+%% #5 -> [input] the node B on the hyperbola.
+%% #6 -> [output] the polar node T of chord AB.
+\def\pstHyperbolaPolarNode{\@ifnextchar[\Pst@HyperbolaPolarNode{\Pst@HyperbolaPolarNode[]}}
+\def\Pst@HyperbolaPolarNode[#1](#2)(#3)#4#5#6{%
+ \begingroup
+ \psset{#1}%
+ \pstHyperbolaOrdNode[PointName=none,PointSymbol=none](#2)(#3){\pstOrdinate{#2}}{@PST@HYPERBOLA@VERTEXA}{@PST@HYPERBOLA@VERTEXB}
+ \pstInterLL[PointName=none,PointSymbol=none]{#4}{@PST@HYPERBOLA@VERTEXA}{#5}{@PST@HYPERBOLA@VERTEXB}{@PST@HYPERBOLA@INTER@X}
+ \pstInterLL[PointName=none,PointSymbol=none]{#5}{@PST@HYPERBOLA@VERTEXA}{#4}{@PST@HYPERBOLA@VERTEXB}{@PST@HYPERBOLA@INTER@Y}
+ \pstMiddleAB{@PST@HYPERBOLA@INTER@X}{@PST@HYPERBOLA@INTER@Y}{#6}
+ \Pst@geonodelabel{#6}%
+ \pstLineAB{#4}{#6}
+ \pstLineAB{#5}{#6}
+ \endgroup
+}%
+%
+%% \pstHyperbolaTangentNode[Options](O)(a,b){T}{A}{B}
+%% Draw the two tangent lines through the point $T$ to the Hyperbola H and get the node A and B on the Hyperbola.
+%% We use the following proposition to find the tangent points $A$ and $B$ of $T$:
+%% Let $T$ is a point out of the hyperbola, we give any two chords $TPQ$ and $TRS$ of the hyperbola, $PR$ and $QS$ intersect at $X$, $RQ$ and $PS$ intersect at $Y$,
+%% then the intersection point $A$ and $B$ of $XY$ and the hyperbola are the tangent points from $T$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the given node T outside the hyperbola
+%% #5 -> [output] the tangent node name A on the hyperbola
+%% #6 -> [output] the tangent node name B on the hyperbola
+\def\pstHyperbolaTangentNode{\@ifnextchar[\Pst@HyperbolaTangentNode{\Pst@HyperbolaTangentNode[]}}
+\def\Pst@HyperbolaTangentNode[#1](#2)(#3)#4#5#6{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pstHyperbolaOrdNode[PointName=none,PointSymbol=none](#2)(#3){\pstOrdinate{#4} 0.3 add}{@PST@HYPERBOLA@TANGENTAUX@P0}{@PST@HYPERBOLA@TANGENTAUX@P1}
+ \pstHyperbolaOrdNode[PointName=none,PointSymbol=none](#2)(#3){\pstOrdinate{#4} 0.3 sub}{@PST@HYPERBOLA@TANGENTAUX@R0}{@PST@HYPERBOLA@TANGENTAUX@R1}
+ \pstHyperbolaLineInter[PointName=none,PointSymbol=none](#2)(#3){#4}{@PST@HYPERBOLA@TANGENTAUX@P0}{@PST@HYPERBOLA@TANGENTAUX@P}{@PST@HYPERBOLA@TANGENTAUX@Q}
+ \pstHyperbolaLineInter[PointName=none,PointSymbol=none](#2)(#3){#4}{@PST@HYPERBOLA@TANGENTAUX@R0}{@PST@HYPERBOLA@TANGENTAUX@R}{@PST@HYPERBOLA@TANGENTAUX@S}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@HYPERBOLA@TANGENTAUX@P}{@PST@HYPERBOLA@TANGENTAUX@S}{@PST@HYPERBOLA@TANGENTAUX@Q}{@PST@HYPERBOLA@TANGENTAUX@R}{@PST@HYPERBOLA@TANGENTAUX@I}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@HYPERBOLA@TANGENTAUX@P}{@PST@HYPERBOLA@TANGENTAUX@R}{@PST@HYPERBOLA@TANGENTAUX@Q}{@PST@HYPERBOLA@TANGENTAUX@S}{@PST@HYPERBOLA@TANGENTAUX@X}
+ \pstHyperbolaLineInter(#2)(#3){@PST@HYPERBOLA@TANGENTAUX@X}{@PST@HYPERBOLA@TANGENTAUX@I}{#5}{#6}
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \pstLineAB{#4}{#5}
+ \pstLineAB{#4}{#6}
+ \endgroup%
+}%
+%
+% 8. Standard Inversion Hyperbola with coordinate translation
+%% ----------------------------------------------------------
+%% The Standard Inversion Hyperbola H is defined by center O, the half of the real axis $a$, the half of the imaginary axis $b$.
+%% The equation can be written as:
+%% \begin{equation}\label{FunctionOfStandardInversionHyperbola}
+%% \dfrac{(y-y0)^2}{a^2}-\dfrac{(x-x0)^2}{b^2}=1
+%% \end{equation}
+%% and the parametric function can be written as:
+%% \begin{equation}\label{ParametricFunctionOfStandardInversionHyperbola}
+%% \left\{\begin{array}{l}
+%% x=b\tan\alpha+x_o\\
+%% y=a\sec\alpha+y_o
+%% \end{array}\right.
+%% \end{equation}
+%
+%% \pstIHyperbola[Options](O)(a,b)[maxAngleY]
+%% Draw a Inversion Hyperbola with center O, the half of the real axis $abs(a)$, and the half of the imaginary axis $abs(b)$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the maximal angle to draw the branch.
+\def\pstIHyperbola{\@ifnextchar[\Pst@IHyperbola{\Pst@IHyperbola[]}}
+\def\Pst@IHyperbola[#1](#2)(#3){%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@IHyperbola@i{\Pst@IHyperbola@i[85]}}%
+\def\Pst@IHyperbola@i[#1]{%
+ \pst@cnth=#1\pst@cntg=180\pst@cntm=180\pst@cntn=360
+ \ifnum\pst@cnth<0
+ \loop\advance\pst@cnth by 90
+ \ifnum\pst@cnth<0
+ \repeat
+ \fi
+ \ifnum\pst@cnth>90
+ \loop\advance\pst@cnth by -90
+ \ifnum\pst@cnth>90
+ \repeat
+ \fi
+ \ifnum\pst@cnth>85
+ \advance\pst@cnth by -5
+ \fi
+ \advance\pst@cntg by -\pst@cnth
+ \advance\pst@cntm by \pst@cnth
+ \advance\pst@cntn by -\pst@cnth
+ \Pst@IHyperbola@ii[0][\number\pst@cnth]%
+ \Pst@IHyperbola@ii[\number\pst@cntg][180]%
+ \Pst@IHyperbola@ii[180][\number\pst@cntm]%
+ \Pst@IHyperbola@ii[\number\pst@cntn][360]%
+ \endgroup%
+}%
+\def\Pst@IHyperbola@ii[#1][#2]{%
+ \parametricplot{#1}{#2}{%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ t dup cos exch sin % cos{t} sin{t}
+ 1 index abs 1E-5 lt {
+ pop pop pop pop
+ } {
+ 5 index 3 index 2 index mul 3 index div add % x0+b\tan{t}
+ 5 index 5 index 4 index div add % y0+a\sec{t}
+ 8 2 roll pop pop pop pop pop pop
+ } ifelse
+ }%
+}%
+%
+%% \pstIHyperbolaNode[Options](O)(a,b){t}{P}
+%% Create a new node P on the Inversion Hyperbola E whose parameter is the given value $t$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the parametric argument t.
+%% #5 -> [output] the target node name.
+\def\pstIHyperbolaNode{\@ifnextchar[\Pst@IHyperbolaNode{\Pst@IHyperbolaNode[]}}
+\def\Pst@IHyperbolaNode[#1](#2)(#3)#4#5{%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #4 dup cos exch sin % cos{t} sin{t}
+ 1 index abs 1E-5 lt {
+ pop pop pop pop
+ }{
+ 5 index 3 index 2 index mul 3 index div add % x0+b\tan{t}
+ 5 index 5 index 4 index div add % y0+a\sec{t}
+ 8 2 roll pop pop pop pop pop pop
+ } ifelse
+ ){#5}%
+ \Pst@geonodelabel{#5}%
+ \endgroup%
+}%
+%
+%% \pstIHyperbolaAbsNode[Options](O)(a,b){x_1}{A}{B}
+%% Create a new node P on the Inversion Hyperbola E whose abscissa is the given value $x_1$.
+%% when $x=x_1$, we have
+%% $$\dfrac{(y-y_0)^2}{a^2}-\dfrac{(x_1-x_0)^2}{b^2}=1$$
+%% $$(y-y_0)^2=\dfrac{a^2(x_1-x_0)^2+a^2b^2}{b^2}$$
+%% $$y=y_0\pm\dfrac{a}{b}\sqrt{(x_1-x_0)^2+b^2}$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the abbscissa value $x_1$.
+%% #5 -> [output] the first target node name.
+%% #6 -> [output] the first second node name.
+\def\pstIHyperbolaAbsNode{\@ifnextchar[\Pst@IHyperbolaAbsNode{\Pst@IHyperbolaAbsNode[]}}
+\def\Pst@IHyperbolaAbsNode[#1](#2)(#3)#4#5#6{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #4 4 index sub dup mul 1 index dup mul add % (x_1-x_0)^2+b^2
+ sqrt 2 index mul 1 index div 3 index exch sub % y1
+ #4 exch 6 2 roll pop pop pop pop
+ ){#5}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #4 4 index sub dup mul 1 index dup mul add % (x_1-x_0)^2+b^2
+ sqrt 2 index mul 1 index div 3 index add % y1
+ #4 exch 6 2 roll pop pop pop pop
+ ){#6}%
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \endgroup%
+}%
+%
+%% \pstIHyperbolaOrdNode[Options](O)(a,b){y_1}{A}{B}
+%% Create a new node P on the Inversion Hyperbola E whose ordinate is the given value $y_1$.
+%% when $y=y_1$, we have
+%% $$\dfrac{(y_1-y_0)^2}{a^2}-\dfrac{(x-x_0)^2}{b^2}=1$$
+%% $$(x-x_0)^2=\dfrac{b^2(y_1-y_0)^2-a^2b^2}{a^2}$$
+%% $$x=x_0\pm\dfrac{b}{a}\sqrt{(y_1-y_0)^2-a^2}$$
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the abbscissa value $x_1$.
+%% #5 -> [output] the first target node name.
+%% #6 -> [output] the first second node name.
+\def\pstIHyperbolaOrdNode{\@ifnextchar[\Pst@IHyperbolaOrdNode{\Pst@IHyperbolaOrdNode[]}}
+\def\Pst@IHyperbolaOrdNode[#1](#2)(#3)#4#5#6{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #4 3 index sub dup mul 2 index dup mul sub % (y_1-y_0)^2-a^2
+ dup 0 lt {
+ pop pop pop pop pop 0 0
+ } {
+ sqrt 1 index mul 2 index div 4 index exch sub % x1
+ #4 6 2 roll pop pop pop pop
+ } ifelse
+ ){#5}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #4 3 index sub dup mul 2 index dup mul sub % (y_1-y_0)^2-a^2
+ dup 0 lt {
+ pop pop pop pop pop 0 0
+ } {
+ sqrt 1 index mul 2 index div 4 index add % x2
+ #4 6 2 roll pop pop pop pop
+ } ifelse
+ ){#6}%
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \endgroup%
+}%
+%
+%% \pstIHyperbolaFocusNode[Options](O)(a,b){F1}{F2}
+%% Create the two focus node F1 and F2 of the Inversion Hyperbola H.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [output] the first focus node name.
+%% #5 -> [output] the first focus node name.
+\def\pstIHyperbolaFocusNode{\@ifnextchar[\Pst@IHyperbolaFocusNode{\Pst@IHyperbolaFocusNode[]}}
+\def\Pst@IHyperbolaFocusNode[#1](#2)(#3)#4#5{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ dup mul exch dup mul add sqrt % c
+ 1 index exch sub 2 index exch % x0,y0-c
+ 4 2 roll pop pop
+ ){#4}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ dup mul exch dup mul add sqrt % c
+ 1 index add 2 index exch % x0,y0+c
+ 4 2 roll pop pop
+ ){#5}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \endgroup%
+}%
+%
+%% \pstIHyperbolaDirectrixLine[Options](O)(a,b){Lx}{Ly}{Rx}{Ry}
+%% Draw the two directrix lines L1 and L2 of the Inversion Hyperbola H.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [output] the first node name on the first directrix line.
+%% #5 -> [output] the second node name on the first directrix line.
+%% #6 -> [output] the first node name on the second directrix line.
+%% #7 -> [output] the second node name on the second directrix line.
+\def\pstIHyperbolaDirectrixLine{\@ifnextchar[\Pst@IHyperbolaDirectrixLine{\Pst@IHyperbolaDirectrixLine[]}}
+\def\Pst@IHyperbolaDirectrixLine[#1](#2)(#3)#4#5#6#7{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 1 index dup mul dup 2 index dup mul add sqrt div % a^2/c
+ 3 index exch sub 4 index exch % x0,y0-a^2/c
+ 6 2 roll pop pop pop pop
+ ){#4}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 1 index dup mul dup 2 index dup mul add sqrt div % a^2/c
+ 3 index exch sub 4 index 1 add exch % x0+1,y0-a^2/c
+ 6 2 roll pop pop pop pop
+ ){#5}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 1 index dup mul dup 2 index dup mul add sqrt div % a^2/c
+ 3 index add 4 index exch % x0,y0+a^2/c
+ 6 2 roll pop pop pop pop
+ ){#6}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 1 index dup mul dup 2 index dup mul add sqrt div % a^2/c
+ 3 index add 4 index 1 add exch % x0+1,y0+a^2/c
+ 6 2 roll pop pop pop pop
+ ){#7}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \Pst@ManageParamList{#7}%
+ \pstLineAB{#4}{#5}%
+ \pstLineAB{#6}{#7}%
+ \endgroup%
+}%
+%
+%% \pstIHyperbolaAsymptoteLine[Options](O)(a,b){L1}{L2}
+%% Draw the two asymptote lines L1 and L2 of the Inversion Hyperbola H.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [output] the second node name on the first asymptote line, the first node is the center O.
+%% #5 -> [output] the second node name on the second asymptote line, the first node is the center O.
+\def\pstIHyperbolaAsymptoteLine{\@ifnextchar[\Pst@IHyperbolaAsymptoteLine{\Pst@IHyperbolaAsymptoteLine[]}}
+\def\Pst@IHyperbolaAsymptoteLine[#1](#2)(#3)#4#5{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 0 index 2 index div % b/a
+ 4 index 1 index sub % x=x0-b/a
+ 4 index 1 add % y=y0+1
+ 7 2 roll pop pop pop pop pop
+ ){#4}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 0 index 2 index div % b/a
+ 4 index 1 index add % x=x0+b/a
+ 4 index 1 add % y=y0+1
+ 7 2 roll pop pop pop pop pop
+ ){#5}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \pstLineAB{#2}{#4}%
+ \pstLineAB{#2}{#5}%
+ \endgroup%
+}%
+%
+%% \pstIHyperbolaLineInter[Options](O)(a,b){A}{B}{C}{D}
+%% Find the two intersection nodes C and D of the Inversion Hyperbola H and line AB.
+%%
+%% Case 1. When line AB is vertical, i.e, $x_1=x_2$, we have
+%% $$y=y_0\pm\dfrac{a}{b}\sqrt{(x_1-x_0)^2+b^2}$$
+%%
+%% Case 2. When line AB is not vertical, we can represent the line AB as the following function:
+%% $$y=kx+d$$ where $$k=\dfrac{y_2-y_1}{x_2-x_1}, d=\dfrac{x_2y_1-x_1y_2}{x_2-x_1}$$
+%% refer to equation (\ref{FunctionOfStandardInversionHyperbola}), we have
+%% $$(b^2k^2-a^2)X^2+2b^2kmX+b^2(m^2-a^2)=0$$
+%% $$Y=kX+m$$
+%% where
+%% $$m=kx_o-y_o+d,X=x-x_0,Y=y-y_0$$
+%%
+%% Case 2.1 When $b^2k^2-a^2=0$, which gives $k=\pm\dfrac{a}{b}\neq0$,
+%% at this time, when $m=0$, the line AB becomes the asymptote of the hyperbola,
+%% so there is none intersection any more; else we have
+%% $$x_{C}=x_o-\dfrac{m^2-a^2}{2km},y_{C}=kx_{C}+d$$
+%% but D is not defined.
+%%
+%% Case 2.2 When $b^2k^2-a^2\neq0$, we have
+%% $$x_{C,D}=x_0+\dfrac{-b^2km\pm{}ab\sqrt{m^2+b^2k^2-a^2}}{b^2k^2-a^2},y_{C,D}=kx_{C,D}+d$$
+%%
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the first node name on the given line AB.
+%% #5 -> [input] the second node name on the given line AB.
+%% #6 -> [output] the first intersection node.
+%% #7 -> [output] the second intersection node.
+\def\pstIHyperbolaLineInter{\@ifnextchar[\Pst@IHyperbolaLineInter{\Pst@IHyperbolaLineInter[]}}
+\def\Pst@IHyperbolaLineInter[#1](#2)(#3)#4#5#6#7{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \pst@getcoor{#4}\pst@tempA%
+ \pst@getcoor{#5}\pst@tempB%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ \pst@tempA \tx@UserCoor % x_1,y_1
+ \pst@tempB \tx@UserCoor % x_2,y_2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ %% $$y=y_0\pm\dfrac{a}{b}\sqrt{(x_1-x_0)^2+b^2}$$
+ 3 index 8 index sub dup mul 5 index dup mul add
+ sqrt 6 index mul 5 index div 7 index exch sub % y1
+ 4 index exch % x1
+ 10 2 roll pop pop pop pop pop pop pop pop
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % d
+ 1 index 10 index mul 9 index sub 1 index add % m=kx_o-y_o+d
+ 7 index dup mul 3 index dup mul mul 9 index dup mul sub % b^2k^2-a^2
+ 0 index abs 1E-5 lt {
+ 1 index abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ 0 0
+ } {
+ %% $$x_{C}=x_o-\dfrac{m^2-a^2}{2km},y_{C}=kx_{C}+d$$
+ 1 index dup mul 10 index dup mul sub 2 index 5 index mul 2 mul div % (m^2-a^2)/2km
+ 12 index exch sub % x1
+ 4 index 1 index mul 4 index add % y1
+ 14 2 roll pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ } ifelse
+ } {
+ 1 index dup mul 1 index add % m^2+b^2k^2-a^2
+ dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt 10 index mul 9 index mul 9 index dup mul 5 index mul 3 index mul add neg 1 index div 12 index add % x1
+ 4 index 1 index mul 4 index add % y1
+ 14 2 roll pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#6}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ \pst@tempA \tx@UserCoor % x_1,y_1
+ \pst@tempB \tx@UserCoor % x_2,y_2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ %% $$y=y_0\pm\dfrac{a}{b}\sqrt{(x_1-x_0)^2+b^2}$$
+ 3 index 8 index sub dup mul 5 index dup mul add
+ sqrt 6 index mul 5 index div 7 index add % y2
+ 4 index exch % x2
+ 10 2 roll pop pop pop pop pop pop pop pop
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % d
+ 1 index 10 index mul 9 index sub 1 index add % m=kx_o-y_o+d
+ 7 index dup mul 3 index dup mul mul 9 index dup mul sub % b^2k^2-a^2
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ 0 0
+ } {
+ 1 index dup mul 1 index add % m^2+b^2k^2-a^2
+ dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt 10 index mul 9 index mul 9 index dup mul 5 index mul 3 index mul sub 1 index div 12 index add % x2
+ 4 index 1 index mul 4 index add % y2
+ 14 2 roll pop pop pop pop pop pop
+ pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#7}%
+ \Pst@ManageParamList{#6}%
+ \Pst@ManageParamList{#7}%
+ \endgroup%
+}%
+%
+%% \pstIHyperbolaPolarNode[Options](O)(a,b){A}{B}{T}
+%% Find the polar point of chord AB on Inversion Hyperbola H.
+%% We use the following proposition to find the polar point of chord AB:
+%% Let $P$, $Q$ are vertex points of the hyperbola, for any chord $AB$ of hyperbola, $PA$ and $BQ$ intersect at $E$, $PB$ and $AQ$ intersect at $F$, then the middle point $M$ of $EF$ is the polar point of chord $AB$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the node A on the hyperbola.
+%% #5 -> [input] the node B on the hyperbola.
+%% #6 -> [output] the polar node T of chord AB.
+\def\pstIHyperbolaPolarNode{\@ifnextchar[\Pst@IHyperbolaPolarNode{\Pst@IHyperbolaPolarNode[]}}
+\def\Pst@IHyperbolaPolarNode[#1](#2)(#3)#4#5#6{%
+ \begingroup
+ \psset{#1}%
+ \pstIHyperbolaAbsNode[PointName=none,PointSymbol=none](#2)(#3){\pstAbscissa{#2}}{@PST@IHYPERBOLA@VERTEXA}{@PST@IHYPERBOLA@VERTEXB}
+ \pstInterLL[PointName=none,PointSymbol=none]{#4}{@PST@IHYPERBOLA@VERTEXA}{#5}{@PST@IHYPERBOLA@VERTEXB}{@PST@IHYPERBOLA@INTER@X}
+ \pstInterLL[PointName=none,PointSymbol=none]{#5}{@PST@IHYPERBOLA@VERTEXA}{#4}{@PST@IHYPERBOLA@VERTEXB}{@PST@IHYPERBOLA@INTER@Y}
+ \pstMiddleAB{@PST@IHYPERBOLA@INTER@X}{@PST@IHYPERBOLA@INTER@Y}{#6}
+ \Pst@geonodelabel{#6}%
+ \pstLineAB{#4}{#6}
+ \pstLineAB{#5}{#6}
+ \endgroup
+}%
+%
+%% \pstIHyperbolaTangentNode[Options](O)(a,b){T}{A}{B}
+%% Draw the two tangent lines through the point $T$ to the Inversion Hyperbola H and get the node A and B on the Inversion Hyperbola.
+%% We use the following proposition to find the tangent points $A$ and $B$ of $T$:
+%% Let $T$ is a point out of the hyperbola, we give any two chords $TPQ$ and $TRS$ of the hyperbola, $PR$ and $QS$ intersect at $X$, $RQ$ and $PS$ intersect at $Y$,
+%% then the intersection point $A$ and $B$ of $XY$ and the hyperbola are the tangent points from $T$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the given node T outside the hyperbola
+%% #5 -> [output] the tangent node name A on the hyperbola
+%% #6 -> [output] the tangent node name B on the hyperbola
+\def\pstIHyperbolaTangentNode{\@ifnextchar[\Pst@IHyperbolaTangentNode{\Pst@IHyperbolaTangentNode[]}}
+\def\Pst@IHyperbolaTangentNode[#1](#2)(#3)#4#5#6{%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pstIHyperbolaAbsNode[PointName=none,PointSymbol=none](#2)(#3){\pstAbscissa{#4} 0.3 add}{@PST@IHYPERBOLA@TANGENTAUX@P0}{@PST@IHYPERBOLA@TANGENTAUX@P1}
+ \pstIHyperbolaAbsNode[PointName=none,PointSymbol=none](#2)(#3){\pstAbscissa{#4} 0.3 sub}{@PST@IHYPERBOLA@TANGENTAUX@R0}{@PST@IHYPERBOLA@TANGENTAUX@R1}
+ \pstIHyperbolaLineInter[PointName=none,PointSymbol=none](#2)(#3){#4}{@PST@IHYPERBOLA@TANGENTAUX@P0}{@PST@IHYPERBOLA@TANGENTAUX@P}{@PST@IHYPERBOLA@TANGENTAUX@Q}
+ \pstIHyperbolaLineInter[PointName=none,PointSymbol=none](#2)(#3){#4}{@PST@IHYPERBOLA@TANGENTAUX@R0}{@PST@IHYPERBOLA@TANGENTAUX@R}{@PST@IHYPERBOLA@TANGENTAUX@S}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@IHYPERBOLA@TANGENTAUX@P}{@PST@IHYPERBOLA@TANGENTAUX@S}{@PST@IHYPERBOLA@TANGENTAUX@Q}{@PST@IHYPERBOLA@TANGENTAUX@R}{@PST@IHYPERBOLA@TANGENTAUX@I}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@IHYPERBOLA@TANGENTAUX@P}{@PST@IHYPERBOLA@TANGENTAUX@R}{@PST@IHYPERBOLA@TANGENTAUX@Q}{@PST@IHYPERBOLA@TANGENTAUX@S}{@PST@IHYPERBOLA@TANGENTAUX@X}
+ \pstIHyperbolaLineInter(#2)(#3){@PST@IHYPERBOLA@TANGENTAUX@X}{@PST@IHYPERBOLA@TANGENTAUX@I}{#5}{#6}
+ \Pst@ManageParamList{#5}%
+ \Pst@ManageParamList{#6}%
+ \pstLineAB{#4}{#5}
+ \pstLineAB{#4}{#6}
+ \endgroup%
+}%
+%
+% 9. General Hyperbola with coordinate translation and rotation
+%% ----------------------------------------------------------
+%% The General Hyperbola H is defined by center O, the half of the real axis $a$, the half of the imaginary axis $b$,
+%% and the rotation angle $\theta$ of the principal axis.
+%% The equation can be got from the parametric function of the Standard Hyperbola \ref{ParametricFunctionOfStandardHyperbola},
+%% using the rotation transform formula \ref{RotationTransformFormula}, then we have
+%% \begin{equation}
+%% \left\{\begin{array}{l}
+%% x'=(a\sec\alpha+x_o)\cos\theta-(b\tan\alpha+y_o)\sin\theta=x_o'+a\sec\alpha\cos\theta-b\tan\alpha\sin\theta\\
+%% y'=(a\sec\alpha+x_o)\sin\theta+(b\tan\alpha+y_o)\cos\theta=y_o'+a\sec\alpha\sin\theta+b\tan\alpha\cos\theta
+%% \end{array}\right.
+%% \end{equation}
+%% where the $x_o'$ and $y_o'$ are the coordinate of the given center O after rotation.
+%% So we get the parametric function of the General Hyperbola with coordinate translation and rotation as following:
+%% \begin{equation}\label{ParametricFunctionOfGeneralHyperbola}
+%% \left\{\begin{array}{l}
+%% x=x_o+a\sec\alpha\cos\theta-b\tan\alpha\sin\theta\\
+%% y=y_o+a\sec\alpha\sin\theta+b\tan\alpha\cos\theta
+%% \end{array}\right.
+%% \end{equation}
+%
+%% \pstGeneralHyperbola[Options](O)(a,b)[rotation][maxAngleX]
+%% Draw a General Hyperbola with center O, the half of the real axis $abs(a)$, the half of the imaginary axis $abs(b)$,
+%% and the rotation angle $\theta$ of the symmetrical axis.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the maximal angle to draw the branch.
+\def\pstGeneralHyperbola{\@ifnextchar[\Pst@GeneralHyperbola{\Pst@GeneralHyperbola[]}}
+\def\Pst@GeneralHyperbola[#1](#2)(#3){%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralHyperbola@i{\Pst@GeneralHyperbola@i[0]}}%
+\def\Pst@GeneralHyperbola@i[#1]{%
+ \def\pst@hyperbola@rotation{#1}%
+ \@ifnextchar[\Pst@GeneralHyperbola@j{\Pst@GeneralHyperbola@j[85]}}%
+\def\Pst@GeneralHyperbola@j[#1]{%
+ \pst@cnth=#1\pst@cntg=180\pst@cntm=180\pst@cntn=360
+ \ifnum\pst@cnth<0
+ \loop\advance\pst@cnth by 90
+ \ifnum\pst@cnth<0
+ \repeat
+ \fi
+ \ifnum\pst@cnth>90
+ \loop\advance\pst@cnth by -90
+ \ifnum\pst@cnth>90
+ \repeat
+ \fi
+ \ifnum\pst@cnth>85
+ \advance\pst@cnth by -5
+ \fi
+ \advance\pst@cntg by -\pst@cnth
+ \advance\pst@cntm by \pst@cnth
+ \advance\pst@cntn by -\pst@cnth
+ \Pst@GeneralHyperbola@k[0][\number\pst@cnth]%
+ \Pst@GeneralHyperbola@k[\number\pst@cntg][180]%
+ \Pst@GeneralHyperbola@k[180][\number\pst@cntm]%
+ \Pst@GeneralHyperbola@k[\number\pst@cntn][360]%
+ \endgroup%
+}%
+\def\Pst@GeneralHyperbola@k[#1][#2]{%
+ \parametricplot{#1}{#2}{%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ t dup cos exch sin % cos{t} sin{t}
+ 1 index abs 1E-5 lt {
+ pop pop pop pop
+ } {
+ \pst@hyperbola@rotation\space dup cos exch sin % cos\theta sin\theta
+ %% x=x_o+a\sec\alpha\cos\theta-b\tan\alpha\sin\theta
+ 7 index 6 index 5 index div 3 index mul add
+ 5 index 4 index mul 5 index div 2 index mul sub
+ %% y=y_o+a\sec\alpha\sin\theta+b\tan\alpha\cos\theta
+ 7 index 7 index 6 index div 3 index mul add
+ 6 index 5 index mul 6 index div 4 index mul add
+ 10 2 roll pop pop pop pop pop pop pop pop
+ } ifelse
+ }%
+}%
+%
+%% \pstGeneralHyperbolaNode[Options](O)(a,b)[rotation]{t}{A}
+%% Draw a node whose parameter value is the given value t on the General Hyperbola.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the parameter value t.
+%% #6 -> [output] the target node name.
+\def\pstGeneralHyperbolaNode{\@ifnextchar[\Pst@GeneralHyperbolaNode{\Pst@GeneralHyperbolaNode[]}}
+\def\Pst@GeneralHyperbolaNode[#1](#2)(#3){%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralHyperbolaNode@i{\Pst@GeneralHyperbolaNode@i[0]}}%
+\def\Pst@GeneralHyperbolaNode@i[#1]#2#3{%
+ \pnode(!%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #2 dup cos exch sin % cos{t} sin{t}
+ 1 index abs 1E-5 lt {
+ pop pop pop pop
+ } {
+ #1 dup cos exch sin % cos\theta sin\theta
+ %% x=x_o+a\sec\alpha\cos\theta-b\tan\alpha\sin\theta
+ 7 index 6 index 5 index div 3 index mul add
+ 5 index 4 index mul 5 index div 2 index mul sub
+ %% y=y_o+a\sec\alpha\sin\theta+b\tan\alpha\cos\theta
+ 7 index 7 index 6 index div 3 index mul add
+ 6 index 5 index mul 6 index div 4 index mul add
+ 10 2 roll pop pop pop pop pop pop pop pop
+ } ifelse
+ ){#3}%
+ \Pst@geonodelabel{#3}%
+ \endgroup%
+}%
+%
+%% \pstGeneralHyperbolaAbsNode[Options](O)(a,b)[rotation]{x_1}{A}{B}
+%% Draw the nodes whose abscissa value are the given value x_1 on the General Hyperbola.
+%%
+%% set $e=a\cos\theta$, $f=b\sin\theta$, $g=a\sin\theta$, $h=b\cos\theta$, then we have
+%% $$x=x_0+e\sec\alpha-f\tan\alpha, y=y_0+g\sec\alpha+h\tan\alpha$$
+%% when $x=x_1$, we get
+%% $$e\sec\alpha-f\tan\alpha=x_1-x_0$$
+%% set $n=x_1-x_0$, we have
+%% $$n\cos\alpha+f\sin\alpha=e$$
+%% then
+%% $$(n^2+f^2)\sin^2\alpha-2ef\sin\alpha+e^2-n^2=0$$
+%% if $n^2+f^2=0$, we have $n=f=0$, i.e, $x_1=x_0$ and $\sin\theta=0$, but the last equation gives $e=0$, which is not possible.
+%% so $n^2+f^2\neq0$, we get
+%% $$\sin_{1,2}\alpha=\dfrac{ef\pm{}n\sqrt{n^2+f^2-e^2}}{n^2+f^2}$$
+%% and
+%% $$\cos_{1,2}\alpha=\dfrac{en\mp{}f\sqrt{n^2+f^2-e^2}}{n^2+f^2}$$
+%% where $\cos\alpha$ can not be zero, but when $f=\pm{}e$, we have $\cos\alpha=0$, we should skip it.
+%%
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the abscissa value x_1.
+%% #6 -> [output] the first target node name.
+%% #7 -> [output] the second target node name.
+\def\pstGeneralHyperbolaAbsNode{\@ifnextchar[\Pst@GeneralHyperbolaAbsNode{\Pst@GeneralHyperbolaAbsNode[]}}
+\def\Pst@GeneralHyperbolaAbsNode[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralHyperbolaAbsNode@i{\Pst@GeneralHyperbolaAbsNode@i[0]}}%
+\def\Pst@GeneralHyperbolaAbsNode@i[#1]#2#3#4{%
+ \pnode(!%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 2 index mul % e=a\cos\theta
+ 3 index 2 index mul % f=b\sin\theta
+ 5 index 3 index mul % g=a\sin\theta
+ 5 index 5 index mul % h=b\cos\theta
+ #2 10 index sub % n=x1-x0
+ 0 index dup mul 4 index dup mul add % n^2+f^2
+ 0 index abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ 0 index 6 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(n^2+f^2-e^2)
+ %% \sin_{1,2}\alpha=\dfrac{ef\pm{}n\sqrt{n^2+f^2-e^2}}{n^2+f^2}
+ 2 index 1 index mul 7 index 7 index mul exch sub 2 index div % sin
+ %% \cos_{1,2}\alpha=\dfrac{en\mp{}f\sqrt{n^2+f^2-e^2}}{n^2+f^2}
+ 6 index 2 index mul 8 index 5 index mul add 3 index div % cos
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop 0 0
+ } {
+ 14 index 9 index 2 index div add 8 index 3 index mul 2 index div sub % x_1=x_0+e\sec\alpha-f\tan\alpha
+ 14 index 8 index 3 index div add 7 index 4 index mul 3 index div add % y_1=y_0+g\sec\alpha+h\tan\alpha
+ 17 2 roll pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#3}%
+ \pnode(!%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 2 index mul % e=a\cos\theta
+ 3 index 2 index mul % f=b\sin\theta
+ 5 index 3 index mul % g=a\sin\theta
+ 5 index 5 index mul % h=b\cos\theta
+ #2 10 index sub % n=x1-x0
+ 0 index dup mul 4 index dup mul add % n^2+f^2
+ 0 index abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ 0 index 6 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(n^2+f^2-e^2)
+ %% \sin_{1,2}\alpha=\dfrac{ef\pm{}n\sqrt{n^2+f^2-e^2}}{n^2+f^2}
+ 2 index 1 index mul 7 index 7 index mul add 2 index div % sin
+ %% \cos_{1,2}\alpha=\dfrac{en\mp{}f\sqrt{n^2+f^2-e^2}}{n^2+f^2}
+ 6 index 2 index mul 8 index 5 index mul exch sub 3 index div % cos
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop 0 0
+ } {
+ 14 index 9 index 2 index div add 8 index 3 index mul 2 index div sub % x_2=x_0+e\sec\alpha-f\tan\alpha
+ 14 index 8 index 3 index div add 7 index 4 index mul 3 index div add % y_2=y_0+g\sec\alpha+h\tan\alpha
+ 17 2 roll pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#4}%
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \endgroup%
+}%
+%
+%% \pstGeneralHyperbolaOrdNode[Options](O)(a,b)[rotation]{y_1}{A}{B}
+%% Draw the nodes whose ordinate value are the given value y_1 on the General Hyperbola.
+%%
+%% set $e=a\cos\theta$, $f=b\sin\theta$, $g=a\sin\theta$, $h=b\cos\theta$, then we have
+%% $$x=x_0+e\sec\alpha-f\tan\alpha, y=y_0+g\sec\alpha+h\tan\alpha$$
+%% when $y=y_1$, we get
+%% $$g\sec\alpha+h\tan\alpha=y_1-y_0$$
+%% set $m=y_1-y_0$, we have
+%% $$m\cos\alpha-h\sin\alpha=g$$
+%% then
+%% $$(m^2+h^2)\sin^2\alpha+2gh\sin\alpha+g^2-m^2=0$$
+%% if $m^2+h^2=0$, we have $m=h=0$, i.e, $y_1=y_0$ and $\cos\theta=0$, but the last equation gives $e=0$, which is not possible.
+%% so $m^2+h^2\neq0$, we get
+%% $$\sin_{1,2}\alpha=\dfrac{-gh\pm{}m\sqrt{m^2+h^2-g^2}}{m^2+h^2}$$
+%% and
+%% $$\cos_{1,2}\alpha=\dfrac{gm\pm{}h\sqrt{m^2+h^2-g^2}}{m^2+h^2}$$
+%% where $\cos\alpha$ can not be zero, but when $h=\pm{}g$, we have $\cos\alpha=0$, we should skip it.
+%%
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the ordinate value y_1.
+%% #6 -> [output] the first target node name.
+%% #7 -> [output] the second target node name.
+\def\pstGeneralHyperbolaOrdNode{\@ifnextchar[\Pst@GeneralHyperbolaOrdNode{\Pst@GeneralHyperbolaOrdNode[]}}
+\def\Pst@GeneralHyperbolaOrdNode[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralHyperbolaOrdNode@i{\Pst@GeneralHyperbolaOrdNode@i[0]}}%
+\def\Pst@GeneralHyperbolaOrdNode@i[#1]#2#3#4{%
+ \pnode(!%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 2 index mul % e=a\cos\theta
+ 3 index 2 index mul % f=b\sin\theta
+ 5 index 3 index mul % g=a\sin\theta
+ 5 index 5 index mul % h=b\cos\theta
+ #2 9 index sub % m=y1-y0
+ 0 index dup mul 2 index dup mul add % m^2+h^2
+ 0 index abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ 0 index 4 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(m^2+h^2-g^2)
+ %% \sin_{1,2}\alpha=\dfrac{-gh\pm{}m\sqrt{m^2+h^2-g^2}}{m^2+h^2}
+ 2 index 1 index mul 5 index 5 index mul add neg 2 index div % sin
+ %% \cos_{1,2}\alpha=\dfrac{gm\pm{}h\sqrt{m^2+h^2-g^2}}{m^2+h^2}
+ 4 index 2 index mul 6 index 5 index mul exch sub 3 index div % cos
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop 0 0
+ } {
+ 14 index 9 index 2 index div add 8 index 3 index mul 2 index div sub % x_1=x_0+e\sec\alpha-f\tan\alpha
+ 14 index 8 index 3 index div add 7 index 4 index mul 3 index div add % y_1=y_0+g\sec\alpha+h\tan\alpha
+ 17 2 roll pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#3}%
+ \pnode(!%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 2 index mul % e=a\cos\theta
+ 3 index 2 index mul % f=b\sin\theta
+ 5 index 3 index mul % g=a\sin\theta
+ 5 index 5 index mul % h=b\cos\theta
+ #2 9 index sub % m=y1-y0
+ 0 index dup mul 2 index dup mul add % m^2+h^2
+ 0 index abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ 0 index 4 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(m^2+h^2-g^2)
+ %% \sin_{1,2}\alpha=\dfrac{-gh\pm{}m\sqrt{m^2+h^2-g^2}}{m^2+h^2}
+ 2 index 1 index mul 5 index 5 index mul sub 2 index div % sin
+ %% \cos_{1,2}\alpha=\dfrac{gm\pm{}h\sqrt{m^2+h^2-g^2}}{m^2+h^2}
+ 4 index 2 index mul 6 index 5 index mul add 3 index div % cos
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop 0 0
+ } {
+ 14 index 9 index 2 index div add 8 index 3 index mul 2 index div sub % x_1=x_0+e\sec\alpha-f\tan\alpha
+ 14 index 8 index 3 index div add 7 index 4 index mul 3 index div add % y_1=y_0+g\sec\alpha+h\tan\alpha
+ 17 2 roll pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#4}%
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \endgroup%
+}%
+%
+%% \pstGeneralHyperbolaFocusNode[Options](O)(a,b)[rotation]{F1}{F2}
+%% Draw the focus nodes of the General Hyperbola H.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [output] the focus node F1 of the Hyperbola.
+%% #6 -> [output] the focus node F2 of the Hyperbola.
+\def\pstGeneralHyperbolaFocusNode{\@ifnextchar[\Pst@GeneralHyperbolaFocusNode{\Pst@GeneralHyperbolaFocusNode[]}}
+\def\Pst@GeneralHyperbolaFocusNode[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralHyperbolaFocusNode@i{\Pst@GeneralHyperbolaFocusNode@i[0]}}%
+\def\Pst@GeneralHyperbolaFocusNode@i[#1]#2#3{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index dup mul 3 index dup mul add sqrt % c=sqrt(a^2+b^2)
+ 6 index 1 index 4 index mul sub % x=x0-c\cos\theta
+ 6 index 2 index 4 index mul sub % y=y0-c\sin\theta
+ 9 2 roll pop pop pop pop pop pop pop
+ ){#2}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index dup mul 3 index dup mul add sqrt % c=sqrt(a^2+b^2)
+ 6 index 1 index 4 index mul add % x=x0+c\cos\theta
+ 6 index 2 index 4 index mul add % y=y0+c\sin\theta
+ 9 2 roll pop pop pop pop pop pop pop
+ ){#3}
+ \Pst@ManageParamList{#2}%
+ \Pst@ManageParamList{#3}%
+ \endgroup%
+}%
+%
+%% \pstGeneralHyperbolaVertexNode[Options](O)(a,b)[rotation]{V1}{V2}
+%% Draw the vertex nodes of the General Hyperbola H.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [output] the vertex node V1 of the Hyperbola.
+%% #6 -> [output] the vertex node V2 of the Hyperbola.
+\def\pstGeneralHyperbolaVertexNode{\@ifnextchar[\Pst@GeneralHyperbolaVertexNode{\Pst@GeneralHyperbolaVertexNode[]}}
+\def\Pst@GeneralHyperbolaVertexNode[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralHyperbolaVertexNode@i{\Pst@GeneralHyperbolaVertexNode@i[0]}}%
+\def\Pst@GeneralHyperbolaVertexNode@i[#1]#2#3{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 5 index 4 index 3 index mul sub % x=x0-a\cos\theta
+ 5 index 5 index 3 index mul sub % y=y0-a\sin\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#2}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 5 index 4 index 3 index mul add % x=x0+a\cos\theta
+ 5 index 5 index 3 index mul add % y=y0+a\sin\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#3}
+ \Pst@ManageParamList{#2}%
+ \Pst@ManageParamList{#3}%
+ \endgroup%
+}%
+%
+%% \pstGeneralHyperbolaDirectrixLine[Options](O)(a,b)[rotation]{Lx}{Ly}{Rx}{Ry}
+%% Draw the two directrix lines of the General Hyperbola H.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [output] the first node Lx on the first directrix line.
+%% #6 -> [output] the second node Lx on the first directrix line.
+%% #7 -> [output] the first node Lx on the second directrix line.
+%% #8 -> [output] the second node Lx on the second directrix line.
+\def\pstGeneralHyperbolaDirectrixLine{\@ifnextchar[\Pst@GeneralHyperbolaDirectrixLine{\Pst@GeneralHyperbolaDirectrixLine[]}}
+\def\Pst@GeneralHyperbolaDirectrixLine[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralHyperbolaDirectrixLine@i{\Pst@GeneralHyperbolaDirectrixLine@i[0]}}%
+\def\Pst@GeneralHyperbolaDirectrixLine@i[#1]#2#3#4#5{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ 1 index dup mul 1 index dup mul add sqrt % c=sqrt(a^2+b^2)
+ 2 index dup mul 1 index div 5 index exch sub 4 index % x0-a^2/c,y0
+ 7 2 roll pop pop pop % x,y,x0,y0
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#2}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ 1 index dup mul 1 index dup mul add sqrt % c=sqrt(a^2+b^2)
+ 2 index dup mul 1 index div 5 index exch sub 4 index 1 add % x0-a^2/c,y0+1
+ 7 2 roll pop pop pop % x,y,x0,y0
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#3}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ 1 index dup mul 1 index dup mul add sqrt % c=sqrt(a^2+b^2)
+ 2 index dup mul 1 index div 5 index add 4 index % x0+a^2/c,y0
+ 7 2 roll pop pop pop % x,y,x0,y0
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#4}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ 1 index dup mul 1 index dup mul add sqrt % c=sqrt(a^2+b^2)
+ 2 index dup mul 1 index div 5 index add 4 index 1 add % x0+a^2/c,y0+1
+ 7 2 roll pop pop pop % x,y,x0,y0
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#5}
+ \Pst@ManageParamList{#2}%
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \pstLineAB{#2}{#3}%
+ \pstLineAB{#4}{#5}%
+ \endgroup%
+}%
+%
+%% \pstGeneralHyperbolaAsymptoteLine[Options](O)(a,b)[rotation]{L1}{L2}
+%% Draw the two asymptote lines L1 and L2 of the General Hyperbola H.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [output] the second node name on the first asymptote line, the first node is the center O.
+%% #6 -> [output] the second node name on the second asymptote line, the first node is the center O.
+\def\pstGeneralHyperbolaAsymptoteLine{\@ifnextchar[\Pst@GeneralHyperbolaAsymptoteLine{\Pst@GeneralHyperbolaAsymptoteLine[]}}
+\def\Pst@GeneralHyperbolaAsymptoteLine[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \def\pst@hyperbola@center{#2}
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralHyperbolaAsymptoteLine@i{\Pst@GeneralHyperbolaAsymptoteLine@i[0]}}%
+\def\Pst@GeneralHyperbolaAsymptoteLine@i[#1]#2#3{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 0 index 2 index div % b/a
+ 4 index 1 add % x=x0+1
+ 4 index 2 index add % y=y0+b/a
+ 7 2 roll pop pop pop % x y x_0 y_0
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#2}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 0 index 2 index div % b/a
+ 4 index 1 add % x=x0+1
+ 4 index 2 index sub % y=y0-b/a
+ 7 2 roll pop pop pop % x y x_0 y_0
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#3}%
+ \Pst@ManageParamList{#2}%
+ \Pst@ManageParamList{#3}%
+ \pstLineAB{\pst@hyperbola@center}{#2}%
+ \pstLineAB{\pst@hyperbola@center}{#3}%
+ \endgroup%
+}%
+%
+%% \pstGeneralHyperbolaLineInter[Options](O)(a,b)[rotation]{A}{B}{C}{D}
+%% Find the intersection nodes $C$ and $D$ of the given line AB with the General Hyperbola H.
+%%
+%% set $e=a\cos\theta$, $f=b\sin\theta$, $g=a\sin\theta$, $h=b\cos\theta$, then we have
+%% $$x=x_0+e\sec\alpha-f\tan\alpha, y=y_0+g\sec\alpha+h\tan\alpha$$
+%% when line AB is vertical, the solve is like as pstGeneralHyperbolaLineInter,
+%% else we can represent the line AB as the following function:
+%% $$y=kx+d$$ where $$k=\dfrac{y_2-y_1}{x_2-x_1}, d=\dfrac{x_2y_1-x_1y_2}{x_2-x_1}$$
+%% Let $X=x-x_0$, $Y=y-y_0$, then we have $Y=kX+m$, where $m=kx_0-y_0+d$, then
+%% $$g\sec\alpha+h\tan\alpha=k(e\sec\alpha-f\tan\alpha)+m$$
+%% $$(kf+h)\sin\alpha=m\cos\alpha+ke-g$$
+%% $$(kf+h)^2\sin^2\alpha=m^2\cos^2\alpha+2m(ke-g)\cos\alpha+(ke-g)^2$$
+%% $$(m^2+(kf+h)^2)\cos^2\alpha-2m(g-ke)\cos\alpha+(g-ke)^2-(kf+h)^2=0$$
+%% when $m^2+(kf+h)^2=0$, we have $m=kf+h=0$, at this time $ke-g=0$, we get
+%% $$k=-\dfrac{\cos\theta}{\sin\theta}=\dfrac{\sin\theta}{\cos\theta}$$
+%% which is not possible.
+%% let $p=kf+h$, $q=g-ke$, so we have
+%% $$(m^2+p^2)\cos^2\alpha-2mq\cos\alpha+q^2-p^2=0$$
+%% then
+%% $$\cos_{1,2}\alpha=\dfrac{mq\pm{}p\sqrt{m^2+p^2-q^2}}{m^2+p^2},\sin_{1,2}\alpha=\dfrac{-qp\pm{}m\sqrt{m^2+p^2-q^2}}{m^2+p^2}$$
+%% where $\cos\alpha$ can not be zero, we should skip it.
+%%
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the first node on the given line.
+%% #6 -> [input] the second node on the given line.
+%% #7 -> [output] the first intersection node name.
+%% #8 -> [output] the second intersection node name.
+\def\pstGeneralHyperbolaLineInter{\@ifnextchar[\Pst@GeneralHyperbolaLineInter{\Pst@GeneralHyperbolaLineInter[]}}
+\def\Pst@GeneralHyperbolaLineInter[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralHyperbolaLineInter@i{\Pst@GeneralHyperbolaLineInter@i[0]}}%
+\def\Pst@GeneralHyperbolaLineInter@i[#1]#2#3#4#5{%
+ \pst@getcoor{#2}\pst@tempA%
+ \pst@getcoor{#3}\pst@tempB%
+ \pnode(!%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ #1 dup cos exch sin % cos\theta sin\theta
+ 7 index 2 index mul % e=a\cos\theta
+ 7 index 2 index mul % f=b\sin\theta
+ 9 index 3 index mul % g=a\sin\theta
+ 9 index 5 index mul % h=b\cos\theta
+ 7 index 14 index sub % n=x1-x0
+ 0 index dup mul 4 index dup mul add % n^2+f^2
+ 0 index abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ 0 index 6 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(n^2+f^2-e^2)
+ %% \sin_{1,2}\alpha=\dfrac{ef\pm{}n\sqrt{n^2+f^2-e^2}}{n^2+f^2}
+ 2 index 1 index mul 7 index 7 index mul exch sub 2 index div % sin
+ %% \cos_{1,2}\alpha=\dfrac{en\mp{}f\sqrt{n^2+f^2-e^2}}{n^2+f^2}
+ 6 index 2 index mul 8 index 5 index mul add 3 index div % cos
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop 0 0
+ } {
+ 18 index 9 index 2 index div add 8 index 3 index mul 2 index div sub % x_1=x_0+e\sec\alpha-f\tan\alpha
+ 18 index 8 index 3 index div add 7 index 4 index mul 3 index div add % y_1=y_0+g\sec\alpha+h\tan\alpha
+ 21 2 roll pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % d
+ 1 index 10 index mul 9 index sub 1 index add % m=kx_o-y_o+d
+ #1 dup cos exch sin % cos\theta sin\theta
+ 10 index 2 index mul % e=a\cos\theta
+ 10 index 2 index mul % f=b\sin\theta
+ 12 index 3 index mul % g=a\sin\theta
+ 12 index 5 index mul % h=b\cos\theta
+ 0 index 9 index 4 index mul add % p=h+kf
+ 2 index 10 index 6 index mul sub % q=g-ke
+ 8 index dup mul 2 index dup mul add % m^2+p^2
+ dup 1E-5 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ 0 0
+ } {
+ 0 index 2 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ pop 0 0
+ } {
+ sqrt % sqrt(m^2+p^2-q^2)
+ % \sin_{1,2}\alpha=\dfrac{-qp\pm{}m\sqrt{m^2+p^2-q^2}}{m^2+p^2}
+ 10 index 1 index mul 4 index 4 index mul sub 2 index div % \sin\alpha
+ % \cos_{1,2}\alpha=\dfrac{mq\pm{}p\sqrt{m^2+p^2-q^2}}{m^2+p^2}
+ 4 index 2 index mul 12 index 5 index mul add 3 index div % \cos\alpha
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop 0 0
+ } {
+ % x=x_0+e\sec\alpha-f\tan\alpha, y=y_0+g\sec\alpha+h\tan\alpha
+ 22 index 10 index 2 index div add 9 index 3 index mul 2 index div sub % x_1
+ 22 index 9 index 3 index div add 8 index 4 index mul 3 index div add % y_1
+ 25 2 roll
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#4}%
+ \pnode(!%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ #1 dup cos exch sin % cos\theta sin\theta
+ 7 index 2 index mul % e=a\cos\theta
+ 7 index 2 index mul % f=b\sin\theta
+ 9 index 3 index mul % g=a\sin\theta
+ 9 index 5 index mul % h=b\cos\theta
+ 7 index 14 index sub % n=x1-x0
+ 0 index dup mul 4 index dup mul add % n^2+f^2
+ 0 index abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ 0 index 6 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(n^2+f^2-e^2)
+ %% \sin_{1,2}\alpha=\dfrac{ef\pm{}n\sqrt{n^2+f^2-e^2}}{n^2+f^2}
+ 2 index 1 index mul 7 index 7 index mul add 2 index div % sin
+ %% \cos_{1,2}\alpha=\dfrac{en\mp{}f\sqrt{n^2+f^2-e^2}}{n^2+f^2}
+ 6 index 2 index mul 8 index 5 index mul exch sub 3 index div % cos
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop 0 0
+ } {
+ 18 index 9 index 2 index div add 8 index 3 index mul 2 index div sub % x_2=x_0+e\sec\alpha-f\tan\alpha
+ 18 index 8 index 3 index div add 7 index 4 index mul 3 index div add % y_2=y_0+g\sec\alpha+h\tan\alpha
+ 21 2 roll pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % d
+ 1 index 10 index mul 9 index sub 1 index add % m=kx_o-y_o+d
+ #1 dup cos exch sin % cos\theta sin\theta
+ 10 index 2 index mul % e=a\cos\theta
+ 10 index 2 index mul % f=b\sin\theta
+ 12 index 3 index mul % g=a\sin\theta
+ 12 index 5 index mul % h=b\cos\theta
+ 0 index 9 index 4 index mul add % p=h+kf
+ 2 index 10 index 6 index mul sub % q=g-ke
+ 8 index dup mul 2 index dup mul add % m^2+p^2
+ dup 1E-5 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ 0 0
+ } {
+ 0 index 2 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ pop 0 0
+ } {
+ sqrt % sqrt(m^2+p^2-q^2)
+ % \sin_{1,2}\alpha=\dfrac{-qp\pm{}m\sqrt{m^2+p^2-q^2}}{m^2+p^2}
+ 10 index 1 index mul 4 index 4 index mul add neg 2 index div % \sin\alpha
+ % \cos_{1,2}\alpha=\dfrac{mq\pm{}p\sqrt{m^2+p^2-q^2}}{m^2+p^2}
+ 4 index 2 index mul 12 index 5 index mul exch sub 3 index div % \cos\alpha
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop 0 0
+ } {
+ % x=x_0+e\sec\alpha-f\tan\alpha, y=y_0+g\sec\alpha+h\tan\alpha
+ 22 index 10 index 2 index div add 9 index 3 index mul 2 index div sub % x_1
+ 22 index 9 index 3 index div add 8 index 4 index mul 3 index div add % y_1
+ 25 2 roll
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#5}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \endgroup%
+}%
+%
+%% \pstGeneralHyperbolaPolarNode[Options](O)(a,b)[rotation]{A}{B}{T}
+%% Find the polar point of chord AB on General Hyperbola H.
+%% We use the following proposition to find the polar point of chord AB:
+%% Let $P$, $Q$ are vertex points of the hyperbola, for any chord $AB$ of hyperbola, $PA$ and $BQ$ intersect at $E$, $PB$ and $AQ$ intersect at $F$, then the middle point $M$ of $EF$ is the polar point of chord $AB$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the node A on the hyperbola.
+%% #6 -> [input] the node B on the hyperbola.
+%% #7 -> [output] the polar node T of chord AB.
+\def\pstGeneralHyperbolaPolarNode{\@ifnextchar[\Pst@GeneralHyperbolaPolarNode{\Pst@GeneralHyperbolaPolarNode[]}}
+\def\Pst@GeneralHyperbolaPolarNode[#1](#2)(#3){%
+ \begingroup
+ \psset{#1}%
+ \def\pst@hyperbola@center{#2}
+ \def\pst@hyperbola@radii{#3}
+ \@ifnextchar[\Pst@GeneralHyperbolaPolarNode@i{\Pst@GeneralHyperbolaPolarNode@i[0]}}%
+\def\Pst@GeneralHyperbolaPolarNode@i[#1]#2#3#4{%
+ \pstGeneralHyperbolaVertexNode[PointName=none,PointSymbol=none](\pst@hyperbola@center)(\pst@hyperbola@radii)[#1]{@PST@GENERALHYPERBOLA@VERTEXA}{@PST@GENERALHYPERBOLA@VERTEXB}
+ \pstInterLL[PointName=none,PointSymbol=none]{#2}{@PST@GENERALHYPERBOLA@VERTEXA}{#3}{@PST@GENERALHYPERBOLA@VERTEXB}{@PST@GENERALHYPERBOLA@INTER@X}
+ \pstInterLL[PointName=none,PointSymbol=none]{#3}{@PST@GENERALHYPERBOLA@VERTEXA}{#2}{@PST@GENERALHYPERBOLA@VERTEXB}{@PST@GENERALHYPERBOLA@INTER@Y}
+ \pstMiddleAB{@PST@GENERALHYPERBOLA@INTER@X}{@PST@GENERALHYPERBOLA@INTER@Y}{#4}
+ \Pst@geonodelabel{#4}%
+ \pstLineAB{#2}{#4}
+ \pstLineAB{#3}{#4}
+ \endgroup
+}%
+%
+%% \pstGeneralHyperbolaTangentNode[Options](O)(a,b)[rotation]{T}{A}{B}
+%% Draw the two tangent lines through the point $T$ to the General Hyperbola H and get the node A and B on the General Hyperbola.
+%% We use the following proposition to find the tangent points $A$ and $B$ of $T$:
+%% Let $T$ is a point out of the hyperbola, we give any two chords $TPQ$ and $TRS$ of the hyperbola, $PR$ and $QS$ intersect at $X$, $RQ$ and $PS$ intersect at $Y$,
+%% then the intersection point $A$ and $B$ of $XY$ and the hyperbola are the tangent points from $T$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the given node T outside the hyperbola
+%% #6 -> [output] the tangent node name A on the hyperbola
+%% #7 -> [output] the tangent node name B on the hyperbola
+\def\pstGeneralHyperbolaTangentNode{\@ifnextchar[\Pst@GeneralHyperbolaTangentNode{\Pst@GeneralHyperbolaTangentNode[]}}
+\def\Pst@GeneralHyperbolaTangentNode[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \def\pst@hyperbola@center{#2}
+ \def\pst@hyperbola@radii{#3}
+ \@ifnextchar[\Pst@GeneralHyperbolaTangentNode@i{\Pst@GeneralHyperbolaTangentNode@i[0]}}%
+\def\Pst@GeneralHyperbolaTangentNode@i[#1]#2#3#4{%
+ \pstGeneralHyperbolaNode[PointName=none,PointSymbol=none](\pst@hyperbola@center)(\pst@hyperbola@radii)[#1]{10}{@PST@GENERALHYPERBOLA@TANGENTAUX@P0}
+ \pstGeneralHyperbolaNode[PointName=none,PointSymbol=none](\pst@hyperbola@center)(\pst@hyperbola@radii)[#1]{-10}{@PST@GENERALHYPERBOLA@TANGENTAUX@R0}
+ \pstGeneralHyperbolaLineInter[PointName=none,PointSymbol=none](\pst@hyperbola@center)(\pst@hyperbola@radii)[#1]{#2}{@PST@GENERALHYPERBOLA@TANGENTAUX@P0}{@PST@GENERALHYPERBOLA@TANGENTAUX@P}{@PST@GENERALHYPERBOLA@TANGENTAUX@Q}
+ \pstGeneralHyperbolaLineInter[PointName=none,PointSymbol=none](\pst@hyperbola@center)(\pst@hyperbola@radii)[#1]{#2}{@PST@GENERALHYPERBOLA@TANGENTAUX@R0}{@PST@GENERALHYPERBOLA@TANGENTAUX@R}{@PST@GENERALHYPERBOLA@TANGENTAUX@S}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@GENERALHYPERBOLA@TANGENTAUX@P}{@PST@GENERALHYPERBOLA@TANGENTAUX@S}{@PST@GENERALHYPERBOLA@TANGENTAUX@Q}{@PST@GENERALHYPERBOLA@TANGENTAUX@R}{@PST@GENERALHYPERBOLA@TANGENTAUX@I}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@GENERALHYPERBOLA@TANGENTAUX@P}{@PST@GENERALHYPERBOLA@TANGENTAUX@R}{@PST@GENERALHYPERBOLA@TANGENTAUX@Q}{@PST@GENERALHYPERBOLA@TANGENTAUX@S}{@PST@GENERALHYPERBOLA@TANGENTAUX@X}
+ \pstGeneralHyperbolaLineInter(\pst@hyperbola@center)(\pst@hyperbola@radii)[#1]{@PST@GENERALHYPERBOLA@TANGENTAUX@X}{@PST@GENERALHYPERBOLA@TANGENTAUX@I}{#3}{#4}
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \pstLineAB{#2}{#3}
+ \pstLineAB{#2}{#4}
+ \endgroup%
+}%
+%
+% 10. General Inversion Hyperbola with coordinate translation and rotation
+%% ----------------------------------------------------------
+%% The General Inversion Hyperbola H is defined by center O, the half of the real axis $a$, the half of the imaginary axis $b$,
+%% and the rotation angle $\theta$ of the principal axis.
+%% The equation can be got from the parametric function of the Standard Inversion Hyperbola \ref{ParametricFunctionOfStandardInversionHyperbola},
+%% using the rotation transform formula \ref{RotationTransformFormula}, then we have
+%% \begin{equation}
+%% \left\{\begin{array}{l}
+%% x'=(b\tan\alpha+x_o)\cos\theta-(a\sec\alpha+y_o)\sin\theta=x_o'+b\tan\alpha\cos\theta-a\sec\alpha\sin\theta\\
+%% y'=(b\tan\alpha+x_o)\sin\theta+(a\sec\alpha+y_o)\cos\theta=y_o'+b\tan\alpha\sin\theta+a\sec\alpha\cos\theta
+%% \end{array}\right.
+%% \end{equation}
+%% where the $x_o'$ and $y_o'$ are the coordinate of the given center O after rotation.
+%% So we get the parametric function of the General Inversion Hyperbola with coordinate translation and rotation as following:
+%% \begin{equation}\label{ParametricFunctionOfGeneralInversionHyperbola}
+%% \left\{\begin{array}{l}
+%% x=x_o+b\tan\alpha\cos\theta-a\sec\alpha\sin\theta\\
+%% y=y_o+b\tan\alpha\sin\theta+a\sec\alpha\cos\theta
+%% \end{array}\right.
+%% \end{equation}
+%
+%% \pstGeneralIHyperbola[Options](O)(a,b)[rotation][maxAngleX]
+%% Draw a General Inversion Hyperbola with center O, the half of the real axis $abs(a)$, the half of the imaginary axis $abs(b)$,
+%% and the rotation angle $\theta$ of the symmetrical axis.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the maximal angle to draw the branch.
+\def\pstGeneralIHyperbola{\@ifnextchar[\Pst@GeneralIHyperbola{\Pst@GeneralIHyperbola[]}}
+\def\Pst@GeneralIHyperbola[#1](#2)(#3){%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralIHyperbola@i{\Pst@GeneralIHyperbola@i[0]}}%
+\def\Pst@GeneralIHyperbola@i[#1]{%
+ \def\pst@hyperbola@rotation{#1}%
+ \@ifnextchar[\Pst@GeneralIHyperbola@j{\Pst@GeneralIHyperbola@j[85]}}%
+\def\Pst@GeneralIHyperbola@j[#1]{%
+ \pst@cnth=#1\pst@cntg=180\pst@cntm=180\pst@cntn=360
+ \ifnum\pst@cnth<0
+ \loop\advance\pst@cnth by 90
+ \ifnum\pst@cnth<0
+ \repeat
+ \fi
+ \ifnum\pst@cnth>90
+ \loop\advance\pst@cnth by -90
+ \ifnum\pst@cnth>90
+ \repeat
+ \fi
+ \ifnum\pst@cnth>85
+ \advance\pst@cnth by -5
+ \fi
+ \advance\pst@cntg by -\pst@cnth
+ \advance\pst@cntm by \pst@cnth
+ \advance\pst@cntn by -\pst@cnth
+ \Pst@GeneralIHyperbola@k[0][\number\pst@cnth]%
+ \Pst@GeneralIHyperbola@k[\number\pst@cntg][180]%
+ \Pst@GeneralIHyperbola@k[180][\number\pst@cntm]%
+ \Pst@GeneralIHyperbola@k[\number\pst@cntn][360]%
+ \endgroup%
+}%
+\def\Pst@GeneralIHyperbola@k[#1][#2]{%
+ \parametricplot{#1}{#2}{%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ t dup cos exch sin % cos{t} sin{t}
+ 1 index abs 1E-5 lt {
+ pop pop pop pop
+ } {
+ \pst@hyperbola@rotation\space dup cos exch sin % cos\theta sin\theta
+ %% x=x_o+b\tan\alpha\cos\theta-a\sec\alpha\sin\theta
+ 7 index 5 index 5 index div 4 index mul 3 index mul add
+ 6 index 5 index div 2 index mul sub
+ %% y=y_o+b\tan\alpha\sin\theta+a\sec\alpha\cos\theta
+ 7 index 6 index 5 index mul 6 index div 3 index mul add
+ 7 index 6 index div 4 index mul add
+ 10 2 roll pop pop pop pop pop pop pop pop
+ } ifelse
+ }%
+}%
+%
+%% \pstGeneralIHyperbolaNode[Options](O)(a,b)[rotation]{t}{A}
+%% Draw a node whose parameter value is the given value t on the General Inversion Hyperbola.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the parameter value t.
+%% #6 -> [output] the target node name.
+\def\pstGeneralIHyperbolaNode{\@ifnextchar[\Pst@GeneralIHyperbolaNode{\Pst@GeneralIHyperbolaNode[]}}
+\def\Pst@GeneralIHyperbolaNode[#1](#2)(#3){%
+ \begingroup
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralIHyperbolaNode@i{\Pst@GeneralIHyperbolaNode@i[0]}}%
+\def\Pst@GeneralIHyperbolaNode@i[#1]#2#3{%
+ \pnode(!%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #2 dup cos exch sin % cos{t} sin{t}
+ 1 index abs 1E-5 lt {
+ pop pop pop pop
+ } {
+ #1 dup cos exch sin % cos\theta sin\theta
+ %% x=x_o+b\tan\alpha\cos\theta-a\sec\alpha\sin\theta
+ 7 index 5 index 5 index div 4 index mul 3 index mul add
+ 6 index 5 index div 2 index mul sub
+ %% y=y_o+b\tan\alpha\sin\theta+a\sec\alpha\cos\theta
+ 7 index 6 index 5 index mul 6 index div 3 index mul add
+ 7 index 6 index div 4 index mul add
+ 10 2 roll pop pop pop pop pop pop pop pop
+ } ifelse
+ ){#3}%
+ \Pst@geonodelabel{#3}%
+ \endgroup%
+}%
+%
+%% \pstGeneralIHyperbolaAbsNode[Options](O)(a,b)[rotation]{x_1}{A}{B}
+%% Draw the nodes whose abscissa value are the given value x_1 on the General Inversion Hyperbola.
+%%
+%% set $e=a\cos\theta$, $f=b\sin\theta$, $g=a\sin\theta$, $h=b\cos\theta$, then we have
+%% $$x=x_0+h\tan\alpha-g\sec\alpha, y=y_0+f\tan\alpha+e\sec\alpha$$
+%% when $x=x_1$, we get
+%% $$h\tan\alpha-g\sec\alpha=x_1-x_0$$
+%% set $n=x_1-x_0$, we have
+%% $$h\sin\alpha-n\cos\alpha=g$$
+%% then
+%% $$(n^2+h^2)\cos^2\alpha+2ng\cos\alpha+g^2-h^2=0$$
+%% if $n^2+h^2=0$, we have $n=h=0$, i.e, $x_1=x_0$ and $\cos\theta=0$, but the last equation gives $g=0$, which is not possible.
+%% so $n^2+h^2\neq0$, we get
+%% $$\cos_{1,2}\alpha=\dfrac{-ng\pm{}h\sqrt{n^2+h^2-g^2}}{n^2+h^2}$$
+%% and
+%% $$\sin_{1,2}\alpha=\dfrac{gh\pm{}n\sqrt{n^2+h^2-g^2}}{n^2+h^2}$$
+%% where $\cos\alpha$ can not be zero, but when $h=\pm{}g$, we have $\cos\alpha=0$, we should skip it.
+%%
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the abscissa value x_1.
+%% #6 -> [output] the first target node name.
+%% #7 -> [output] the second target node name.
+\def\pstGeneralIHyperbolaAbsNode{\@ifnextchar[\Pst@GeneralIHyperbolaAbsNode{\Pst@GeneralIHyperbolaAbsNode[]}}
+\def\Pst@GeneralIHyperbolaAbsNode[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralIHyperbolaAbsNode@i{\Pst@GeneralIHyperbolaAbsNode@i[0]}}%
+\def\Pst@GeneralIHyperbolaAbsNode@i[#1]#2#3#4{%
+ \pnode(!%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 2 index mul % e=a\cos\theta
+ 3 index 2 index mul % f=b\sin\theta
+ 5 index 3 index mul % g=a\sin\theta
+ 5 index 5 index mul % h=b\cos\theta
+ #2 10 index sub % n=x1-x0
+ 0 index dup mul 2 index dup mul add % n^2+h^2
+ 0 index abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ 0 index 4 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(n^2+h^2-g^2)
+ %% \sin_{1,2}\alpha=\dfrac{gh\pm{}n\sqrt{n^2+h^2-g^2}}{n^2+h^2}
+ 2 index 1 index mul 5 index 5 index mul exch sub 2 index div % sin
+ %% \cos_{1,2}\alpha=\dfrac{-ng\pm{}h\sqrt{n^2+h^2-g^2}}{n^2+h^2}
+ 4 index 2 index mul 4 index 7 index mul add neg 3 index div % cos
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop 0 0
+ } {
+ 14 index 6 index 3 index mul 2 index div add 7 index 2 index div sub % x_1=x_0+h\tan\alpha-g\sec\alpha
+ 14 index 9 index 4 index mul 3 index div add 10 index 3 index div add % y_1=y_0+f\tan\alpha+e\sec\alpha
+ 17 2 roll pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#3}%
+ \pnode(!%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 2 index mul % e=a\cos\theta
+ 3 index 2 index mul % f=b\sin\theta
+ 5 index 3 index mul % g=a\sin\theta
+ 5 index 5 index mul % h=b\cos\theta
+ #2 10 index sub % n=x1-x0
+ 0 index dup mul 2 index dup mul add % n^2+h^2
+ 0 index abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ 0 index 4 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(n^2+h^2-g^2)
+ %% \sin_{1,2}\alpha=\dfrac{gh\pm{}n\sqrt{n^2+h^2-g^2}}{n^2+h^2}
+ 2 index 1 index mul 5 index 5 index mul add 2 index div % sin
+ %% \cos_{1,2}\alpha=\dfrac{-ng\pm{}h\sqrt{n^2+h^2-g^2}}{n^2+h^2}
+ 4 index 2 index mul 4 index 7 index mul sub 3 index div % cos
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop 0 0
+ } {
+ 14 index 6 index 3 index mul 2 index div add 7 index 2 index div sub % x_2=x_0+h\tan\alpha-g\sec\alpha
+ 14 index 9 index 4 index mul 3 index div add 10 index 3 index div add % y_2=y_0+f\tan\alpha+e\sec\alpha
+ 17 2 roll pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#4}%
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \endgroup%
+}%
+%
+%% \pstGeneralIHyperbolaOrdNode[Options](O)(a,b)[rotation]{y_1}{A}{B}
+%% Draw the nodes whose ordinate value are the given value y_1 on the General Inversion Hyperbola.
+%%
+%% set $e=a\cos\theta$, $f=b\sin\theta$, $g=a\sin\theta$, $h=b\cos\theta$, then we have
+%% $$x=x_0+h\tan\alpha-g\sec\alpha, y=y_0+f\tan\alpha+e\sec\alpha$$
+%% when $y=y_1$, we get
+%% $$f\tan\alpha+e\sec\alpha=y_1-y_0$$
+%% set $m=y_1-y_0$, we have
+%% $$m\cos\alpha-f\sin\alpha=e$$
+%% then
+%% $$(m^2+f^2)\sin^2\alpha+2fe\sin\alpha+e^2-m^2=0$$
+%% if $m^2+f^2=0$, we have $m=f=0$, i.e, $y_1=y_0$ and $\sin\theta=0$, but the last equation gives $e=0$, which is not possible.
+%% so $m^2+f^2\neq0$, we get
+%% $$\sin_{1,2}\alpha=\dfrac{-fe\pm{}m\sqrt{m^2+f^2-e^2}}{m^2+f^2}$$
+%% and
+%% $$\cos_{1,2}\alpha=\dfrac{em\pm{}f\sqrt{m^2+f^2-e^2}}{m^2+f^2}$$
+%% where $\cos\alpha$ can not be zero, but when $f=\pm{}e$, we have $\cos\alpha=0$, we should skip it.
+%%
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the ordinate value y_1.
+%% #6 -> [output] the first target node name.
+%% #7 -> [output] the second target node name.
+\def\pstGeneralIHyperbolaOrdNode{\@ifnextchar[\Pst@GeneralIHyperbolaOrdNode{\Pst@GeneralIHyperbolaOrdNode[]}}
+\def\Pst@GeneralIHyperbolaOrdNode[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralIHyperbolaOrdNode@i{\Pst@GeneralIHyperbolaOrdNode@i[0]}}%
+\def\Pst@GeneralIHyperbolaOrdNode@i[#1]#2#3#4{%
+ \pnode(!%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 2 index mul % e=a\cos\theta
+ 3 index 2 index mul % f=b\sin\theta
+ 5 index 3 index mul % g=a\sin\theta
+ 5 index 5 index mul % h=b\cos\theta
+ #2 9 index sub % m=y1-y0
+ 0 index dup mul 4 index dup mul add % m^2+f^2
+ 0 index abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ 0 index 6 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(m^2+f^2-e^2)
+ %% \sin_{1,2}\alpha=\dfrac{-fe\pm{}m\sqrt{m^2+f^2-e^2}}{m^2+f^2}
+ 2 index 1 index mul 7 index 7 index mul add neg 2 index div % sin
+ %% \cos_{1,2}\alpha=\dfrac{em\pm{}f\sqrt{m^2+f^2-e^2}}{m^2+f^2}
+ 6 index 2 index mul 8 index 5 index mul exch sub 3 index div % cos
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop 0 0
+ } {
+ 14 index 6 index 3 index mul 2 index div add 7 index 2 index div sub % x_1=x_0+h\tan\alpha-g\sec\alpha
+ 14 index 9 index 4 index mul 3 index div add 10 index 3 index div add % y_1=y_0+f\tan\alpha+e\sec\alpha
+ 17 2 roll pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#3}%
+ \pnode(!%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 2 index mul % e=a\cos\theta
+ 3 index 2 index mul % f=b\sin\theta
+ 5 index 3 index mul % g=a\sin\theta
+ 5 index 5 index mul % h=b\cos\theta
+ #2 9 index sub % m=y1-y0
+ 0 index dup mul 4 index dup mul add % m^2+f^2
+ 0 index abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ 0 index 6 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(m^2+f^2-e^2)
+ %% \sin_{1,2}\alpha=\dfrac{-fe\pm{}m\sqrt{m^2+f^2-e^2}}{m^2+f^2}
+ 2 index 1 index mul 7 index 7 index mul sub 2 index div % sin
+ %% \cos_{1,2}\alpha=\dfrac{em\pm{}f\sqrt{m^2+f^2-e^2}}{m^2+f^2}
+ 6 index 2 index mul 8 index 5 index mul add 3 index div % cos
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop 0 0
+ } {
+ 14 index 6 index 3 index mul 2 index div add 7 index 2 index div sub % x_2=x_0+h\tan\alpha-g\sec\alpha
+ 14 index 9 index 4 index mul 3 index div add 10 index 3 index div add % y_2=y_0+f\tan\alpha+e\sec\alpha
+ 17 2 roll pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#4}%
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \endgroup%
+}%
+%
+%% \pstGeneralIHyperbolaFocusNode[Options](O)(a,b)[rotation]{F1}{F2}
+%% Draw the focus nodes of the General Inversion Hyperbola H.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [output] the focus node F1 of the Hyperbola.
+%% #6 -> [output] the focus node F2 of the Hyperbola.
+\def\pstGeneralIHyperbolaFocusNode{\@ifnextchar[\Pst@GeneralIHyperbolaFocusNode{\Pst@GeneralIHyperbolaFocusNode[]}}
+\def\Pst@GeneralIHyperbolaFocusNode[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralIHyperbolaFocusNode@i{\Pst@GeneralIHyperbolaFocusNode@i[0]}}%
+\def\Pst@GeneralIHyperbolaFocusNode@i[#1]#2#3{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index dup mul 3 index dup mul add sqrt % c=sqrt(a^2+b^2)
+ 6 index 1 index 3 index mul sub % x=x0-c\sin\theta
+ 6 index 2 index 5 index mul add % y=y0+c\cos\theta
+ 9 2 roll pop pop pop pop pop pop pop
+ ){#2}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index dup mul 3 index dup mul add sqrt % c=sqrt(a^2+b^2)
+ 6 index 1 index 3 index mul add % x=x0+c\sin\theta
+ 6 index 2 index 5 index mul sub % y=y0-c\cos\theta
+ 9 2 roll pop pop pop pop pop pop pop
+ ){#3}
+ \Pst@ManageParamList{#2}%
+ \Pst@ManageParamList{#3}%
+ \endgroup%
+}%
+%
+%% \pstGeneralIHyperbolaVertexNode[Options](O)(a,b)[rotation]{V1}{V2}
+%% Draw the vertex nodes of the General Inversion Hyperbola H.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [output] the vertex node V1 of the Hyperbola.
+%% #6 -> [output] the vertex node V2 of the Hyperbola.
+\def\pstGeneralIHyperbolaVertexNode{\@ifnextchar[\Pst@GeneralIHyperbolaVertexNode{\Pst@GeneralIHyperbolaVertexNode[]}}
+\def\Pst@GeneralIHyperbolaVertexNode[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralIHyperbolaVertexNode@i{\Pst@GeneralIHyperbolaVertexNode@i[0]}}%
+\def\Pst@GeneralIHyperbolaVertexNode@i[#1]#2#3{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 5 index 4 index 2 index mul sub % x=x0-a\sin\theta
+ 5 index 5 index 4 index mul add % y=y0+a\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#2}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ #1 dup cos exch sin % cos\theta sin\theta
+ 5 index 4 index 2 index mul add % x=x0+a\sin\theta
+ 5 index 5 index 4 index mul sub % y=y0-a\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#3}
+ \Pst@ManageParamList{#2}%
+ \Pst@ManageParamList{#3}%
+ \endgroup%
+}%
+%
+%% \pstGeneralIHyperbolaDirectrixLine[Options](O)(a,b)[rotation]{Lx}{Ly}{Rx}{Ry}
+%% Draw the two directrix lines of the General Inversion Hyperbola H.
+%% If you not input the rotation angle, the default value is $0^\circ$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [output] the first node Lx on the first directrix line.
+%% #6 -> [output] the second node Lx on the first directrix line.
+%% #7 -> [output] the first node Lx on the second directrix line.
+%% #8 -> [output] the second node Lx on the second directrix line.
+\def\pstGeneralIHyperbolaDirectrixLine{\@ifnextchar[\Pst@GeneralIHyperbolaDirectrixLine{\Pst@GeneralIHyperbolaDirectrixLine[]}}
+\def\Pst@GeneralIHyperbolaDirectrixLine[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralIHyperbolaDirectrixLine@i{\Pst@GeneralIHyperbolaDirectrixLine@i[0]}}%
+\def\Pst@GeneralIHyperbolaDirectrixLine@i[#1]#2#3#4#5{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ 1 index dup mul 1 index dup mul add sqrt % c=sqrt(a^2+b^2)
+ 2 index dup mul 1 index div 4 index exch sub 5 index exch % x0,y0-a^2/c
+ 7 2 roll pop pop pop % x,y,x0,y0
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#2}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ 1 index dup mul 1 index dup mul add sqrt % c=sqrt(a^2+b^2)
+ 2 index dup mul 1 index div 4 index exch sub 5 index 1 add exch % x0+1,y0-a^2/c
+ 7 2 roll pop pop pop % x,y,x0,y0
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#3}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ 1 index dup mul 1 index dup mul add sqrt % c=sqrt(a^2+b^2)
+ 2 index dup mul 1 index div 4 index add 5 index exch % x0,y0+a^2/c
+ 7 2 roll pop pop pop % x,y,x0,y0
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#4}
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ 1 index dup mul 1 index dup mul add sqrt % c=sqrt(a^2+b^2)
+ 2 index dup mul 1 index div 4 index add 5 index 1 add exch % x0+1,y0+a^2/c
+ 7 2 roll pop pop pop % x,y,x0,y0
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#5}
+ \Pst@ManageParamList{#2}%
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \pstLineAB{#2}{#3}%
+ \pstLineAB{#4}{#5}%
+ \endgroup%
+}%
+%
+%% \pstGeneralIHyperbolaAsymptoteLine[Options](O)(a,b)[rotation]{L1}{L2}
+%% Draw the two asymptote lines L1 and L2 of the General Inversion Hyperbola H.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [output] the second node name on the first asymptote line, the first node is the center O.
+%% #6 -> [output] the second node name on the second asymptote line, the first node is the center O.
+\def\pstGeneralIHyperbolaAsymptoteLine{\@ifnextchar[\Pst@GeneralIHyperbolaAsymptoteLine{\Pst@GeneralIHyperbolaAsymptoteLine[]}}
+\def\Pst@GeneralIHyperbolaAsymptoteLine[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \def\pst@hyperbola@center{#2}
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralIHyperbolaAsymptoteLine@i{\Pst@GeneralIHyperbolaAsymptoteLine@i[0]}}%
+\def\Pst@GeneralIHyperbolaAsymptoteLine@i[#1]#2#3{%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 0 index 2 index div % b/a
+ 4 index 1 index sub % x=x0-b/a
+ 4 index 1 add % y=y0+1
+ 7 2 roll pop pop pop % x y x_0 y_0
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#2}%
+ \pnode(!
+ \pst@tempO \tx@UserCoor % x_o,y_o
+ \pst@tempR \tx@UserCoor % a,b
+ 0 index 2 index div % b/a
+ 4 index 1 index add % x=x0+b/a
+ 4 index 1 add % y=y0+1
+ 7 2 roll pop pop pop % x y x_0 y_0
+ #1 dup cos exch sin % cos\theta sin\theta
+ 3 index 6 index 5 index sub 3 index mul add 5 index 4 index sub 2 index mul sub % x0+(x-x0)\cos\theta-(y-y0)\sin\theta
+ 3 index 7 index 6 index sub 3 index mul add 6 index 5 index sub 4 index mul add % y0+(x-x0)\sin\theta+(y-y0)\cos\theta
+ 8 2 roll pop pop pop pop pop pop
+ ){#3}%
+ \Pst@ManageParamList{#2}%
+ \Pst@ManageParamList{#3}%
+ \pstLineAB{\pst@hyperbola@center}{#2}%
+ \pstLineAB{\pst@hyperbola@center}{#3}%
+ \endgroup%
+}%
+%
+%
+%% \pstGeneralIHyperbolaLineInter[Options](O)(a,b)[rotation]{A}{B}{C}{D}
+%% Find the intersection nodes $C$ and $D$ of the given line AB with the General Inversion Hyperbola H.
+%%
+%% set $e=a\cos\theta$, $f=b\sin\theta$, $g=a\sin\theta$, $h=b\cos\theta$, then we have
+%% $$x=x_0+h\tan\alpha-g\sec\alpha, y=y_0+f\tan\alpha+e\sec\alpha$$
+%% when line AB is vertical, the solve is like as pstGeneralIHyperbolaAbsNode,
+%% else we can represent the line AB as the following function:
+%% $$y=kx+d$$ where $$k=\dfrac{y_2-y_1}{x_2-x_1}, d=\dfrac{x_2y_1-x_1y_2}{x_2-x_1}$$
+%% Let $X=x-x_0$, $Y=y-y_0$, then we have $Y=kX+m$, where $m=kx_0-y_0+d$, then
+%% $$f\tan\alpha+e\sec\alpha=k(h\tan\alpha-g\sec\alpha)+m$$
+%% $$(kh-f)\sin\alpha+m\cos\alpha=kg+e$$
+%% $$(kh-f)^2\sin^2\alpha=m^2\cos^2\alpha-2m(kg+e)\cos\alpha+(kg+e)^2$$
+%% $$(m^2+(kh-f)^2)\cos^2\alpha-2m(kg+e)\cos\alpha+(kg+e)^2-(kh-f)^2=0$$
+%% when $m^2+(kh-f)^2=0$, we have $m=kh-f=0$, at this time $kg+e=0$, we get
+%% $$k=\dfrac{\sin\theta}{\cos\theta}=-\dfrac{\cos\theta}{\sin\theta}$$
+%% which is not possible.
+%%
+%% let $p=kh-f$, $q=kg+e$, so we have
+%% $$(m^2+p^2)\cos^2\alpha-2mq\cos\alpha+q^2-p^2=0$$
+%% then
+%% $$\cos_{1,2}\alpha=\dfrac{mq\pm{}p\sqrt{m^2+p^2-q^2}}{m^2+p^2},\sin_{1,2}\alpha=\dfrac{qp\mp{}m\sqrt{m^2+p^2-q^2}}{m^2+p^2}$$
+%% where $\cos\alpha$ can not be zero, we should skip it.
+%%
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the first node on the given line.
+%% #6 -> [input] the second node on the given line.
+%% #7 -> [output] the first intersection node name.
+%% #8 -> [output] the second intersection node name.
+\def\pstGeneralIHyperbolaLineInter{\@ifnextchar[\Pst@GeneralIHyperbolaLineInter{\Pst@GeneralIHyperbolaLineInter[]}}
+\def\Pst@GeneralIHyperbolaLineInter[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempO%
+ \pst@getcoor{#3}\pst@tempR%
+ \@ifnextchar[\Pst@GeneralIHyperbolaLineInter@i{\Pst@GeneralIHyperbolaLineInter@i[0]}}%
+\def\Pst@GeneralIHyperbolaLineInter@i[#1]#2#3#4#5{%
+ \pst@getcoor{#2}\pst@tempA%
+ \pst@getcoor{#3}\pst@tempB%
+ \pnode(!%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ #1 dup cos exch sin % cos\theta sin\theta
+ 7 index 2 index mul % e=a\cos\theta
+ 7 index 2 index mul % f=b\sin\theta
+ 9 index 3 index mul % g=a\sin\theta
+ 9 index 5 index mul % h=b\cos\theta
+ 7 index 14 index sub % n=x1-x0
+ 0 index dup mul 2 index dup mul add % n^2+h^2
+ 0 index abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ 0 index 4 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(n^2+h^2-g^2)
+ %% \sin_{1,2}\alpha=\dfrac{gh\pm{}n\sqrt{n^2+h^2-g^2}}{n^2+h^2}
+ 2 index 1 index mul 5 index 5 index mul exch sub 2 index div % sin
+ %% \cos_{1,2}\alpha=\dfrac{-ng\pm{}h\sqrt{n^2+h^2-g^2}}{n^2+h^2}
+ 4 index 2 index mul 4 index 7 index mul add neg 3 index div % cos
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop 0 0
+ } {
+ 18 index 6 index 3 index mul 2 index div add 7 index 2 index div sub % x_1=x_0+h\tan\alpha-g\sec\alpha
+ 18 index 9 index 4 index mul 3 index div add 10 index 3 index div add % y_1=y_0+f\tan\alpha+e\sec\alpha
+ 21 2 roll pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % d
+ 1 index 10 index mul 9 index sub 1 index add % m=kx_o-y_o+d
+ #1 dup cos exch sin % cos\theta sin\theta
+ 10 index 2 index mul % e=a\cos\theta
+ 10 index 2 index mul % f=b\sin\theta
+ 12 index 3 index mul % g=a\sin\theta
+ 12 index 5 index mul % h=b\cos\theta
+ 8 index 1 index mul 3 index sub % p=kh-f
+ 9 index 3 index mul 5 index add % q=kg+e
+ 8 index dup mul 2 index dup mul add % m^2+p^2
+ dup 1E-5 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ 0 0
+ } {
+ 0 index 2 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ pop 0 0
+ } {
+ sqrt % sqrt(m^2+p^2-q^2)
+ % \sin_{1,2}\alpha=\dfrac{qp\mp{}m\sqrt{m^2+p^2-q^2}}{m^2+p^2}
+ 10 index 1 index mul 4 index 4 index mul add 2 index div % \sin\alpha
+ % \cos_{1,2}\alpha=\dfrac{mq\pm{}p\sqrt{m^2+p^2-q^2}}{m^2+p^2}
+ 4 index 2 index mul 12 index 5 index mul exch sub 3 index div % \cos\alpha
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop 0 0
+ } {
+ % x=x_0+h\tan\alpha-g\sec\alpha, y=y_0+f\tan\alpha+e\sec\alpha
+ 22 index 8 index 2 index div sub 7 index 3 index mul 2 index div add % x_1
+ 22 index 11 index 3 index div add 10 index 4 index mul 3 index div add % y_1
+ 25 2 roll
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#4}%
+ \pnode(!%
+ \pst@tempO \tx@UserCoor % x0,y0
+ \pst@tempR \tx@UserCoor abs exch abs exch % |a|,|b|
+ \pst@tempA \tx@UserCoor % x1,y1
+ \pst@tempB \tx@UserCoor % x2,y2
+ 3 index 2 index sub abs 1E-5 lt { % if the line AB is vertical
+ #1 dup cos exch sin % cos\theta sin\theta
+ 7 index 2 index mul % e=a\cos\theta
+ 7 index 2 index mul % f=b\sin\theta
+ 9 index 3 index mul % g=a\sin\theta
+ 9 index 5 index mul % h=b\cos\theta
+ 7 index 14 index sub % n=x1-x0
+ 0 index dup mul 2 index dup mul add % n^2+h^2
+ 0 index abs 1E-5 lt {
+ pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ 0 index 4 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop
+ pop pop pop pop pop pop 0 0
+ } {
+ sqrt % sqrt(n^2+h^2-g^2)
+ %% \sin_{1,2}\alpha=\dfrac{gh\pm{}n\sqrt{n^2+h^2-g^2}}{n^2+h^2}
+ 2 index 1 index mul 5 index 5 index mul add 2 index div % sin
+ %% \cos_{1,2}\alpha=\dfrac{-ng\pm{}h\sqrt{n^2+h^2-g^2}}{n^2+h^2}
+ 4 index 2 index mul 4 index 7 index mul sub 3 index div % cos
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop 0 0
+ } {
+ 18 index 6 index 3 index mul 2 index div add 7 index 2 index div sub % x_2=x_0+h\tan\alpha-g\sec\alpha
+ 18 index 9 index 4 index mul 3 index div add 10 index 3 index div add % y_2=y_0+f\tan\alpha+e\sec\alpha
+ 21 2 roll pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ } {
+ 0 index 3 index sub 2 index 5 index sub div % k
+ 2 index 4 index mul 2 index 6 index mul sub 3 index 6 index sub div % d
+ 1 index 10 index mul 9 index sub 1 index add % m=kx_o-y_o+d
+ #1 dup cos exch sin % cos\theta sin\theta
+ 10 index 2 index mul % e=a\cos\theta
+ 10 index 2 index mul % f=b\sin\theta
+ 12 index 3 index mul % g=a\sin\theta
+ 12 index 5 index mul % h=b\cos\theta
+ 8 index 1 index mul 3 index sub % p=kh-f
+ 9 index 3 index mul 5 index add % q=kg+e
+ 8 index dup mul 2 index dup mul add % m^2+p^2
+ dup 1E-5 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ 0 0
+ } {
+ 0 index 2 index dup mul sub dup 0 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ pop 0 0
+ } {
+ sqrt % sqrt(m^2+p^2-q^2)
+ % \sin_{1,2}\alpha=\dfrac{qp\mp{}m\sqrt{m^2+p^2-q^2}}{m^2+p^2}
+ 10 index 1 index mul 4 index 4 index mul exch sub 2 index div % \sin\alpha
+ % \cos_{1,2}\alpha=\dfrac{mq\pm{}p\sqrt{m^2+p^2-q^2}}{m^2+p^2}
+ 4 index 2 index mul 12 index 5 index mul add 3 index div % \cos\alpha
+ dup abs 1E-5 lt {
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop 0 0
+ } {
+ % x=x_0+h\tan\alpha-g\sec\alpha, y=y_0+f\tan\alpha+e\sec\alpha
+ 22 index 8 index 2 index div sub 7 index 3 index mul 2 index div add % x_2
+ 22 index 11 index 3 index div add 10 index 4 index mul 3 index div add % y_2
+ 25 2 roll
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop pop pop pop pop pop pop pop
+ pop pop pop
+ } ifelse
+ } ifelse
+ } ifelse
+ } ifelse
+ ){#5}%
+ \Pst@ManageParamList{#4}%
+ \Pst@ManageParamList{#5}%
+ \endgroup%
+}%
+%
+%% \pstGeneralIHyperbolaPolarNode[Options](O)(a,b)[rotation]{A}{B}{T}
+%% Find the polar point of chord AB on General Inversion Hyperbola H.
+%% We use the following proposition to find the polar point of chord AB:
+%% Let $P$, $Q$ are vertex points of the hyperbola, for any chord $AB$ of hyperbola, $PA$ and $BQ$ intersect at $E$, $PB$ and $AQ$ intersect at $F$, then the middle point $M$ of $EF$ is the polar point of chord $AB$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the node A on the hyperbola.
+%% #6 -> [input] the node B on the hyperbola.
+%% #7 -> [output] the polar node T of chord AB.
+\def\pstGeneralIHyperbolaPolarNode{\@ifnextchar[\Pst@GeneralIHyperbolaPolarNode{\Pst@GeneralIHyperbolaPolarNode[]}}
+\def\Pst@GeneralIHyperbolaPolarNode[#1](#2)(#3){%
+ \begingroup
+ \psset{#1}%
+ \def\pst@hyperbola@center{#2}
+ \def\pst@hyperbola@radii{#3}
+ \@ifnextchar[\Pst@GeneralIHyperbolaPolarNode@i{\Pst@GeneralIHyperbolaPolarNode@i[0]}}%
+\def\Pst@GeneralIHyperbolaPolarNode@i[#1]#2#3#4{%
+ \pstGeneralIHyperbolaVertexNode[PointName=none,PointSymbol=none](\pst@hyperbola@center)(\pst@hyperbola@radii)[#1]{@PST@GENERALIHYPERBOLA@VERTEXA}{@PST@GENERALIHYPERBOLA@VERTEXB}
+ \pstInterLL[PointName=none,PointSymbol=none]{#2}{@PST@GENERALIHYPERBOLA@VERTEXA}{#3}{@PST@GENERALIHYPERBOLA@VERTEXB}{@PST@GENERALIHYPERBOLA@INTER@X}
+ \pstInterLL[PointName=none,PointSymbol=none]{#3}{@PST@GENERALIHYPERBOLA@VERTEXA}{#2}{@PST@GENERALIHYPERBOLA@VERTEXB}{@PST@GENERALIHYPERBOLA@INTER@Y}
+ \pstMiddleAB{@PST@GENERALIHYPERBOLA@INTER@X}{@PST@GENERALIHYPERBOLA@INTER@Y}{#4}
+ \Pst@geonodelabel{#4}%
+ \pstLineAB{#2}{#4}
+ \pstLineAB{#3}{#4}
+ \endgroup
+}%
+%
+%% \pstGeneralIHyperbolaTangentNode[Options](O)(a,b)[rotation]{T}{A}{B}
+%% Draw the two tangent lines through the point $T$ to the General Inversion Hyperbola H and get the node A and B on the General Inversion Hyperbola.
+%% We use the following proposition to find the tangent points $A$ and $B$ of $T$:
+%% Let $T$ is a point out of the hyperbola, we give any two chords $TPQ$ and $TRS$ of the hyperbola, $PR$ and $QS$ intersect at $X$, $RQ$ and $PS$ intersect at $Y$,
+%% then the intersection point $A$ and $B$ of $XY$ and the hyperbola are the tangent points from $T$.
+%% Parameters:
+%% #1 -> options
+%% #2 -> [input] the hyperbola center O
+%% #3 -> [input] the radii of real and imaginary axis
+%% #4 -> [input] the rotation angle $\theta$ of the symmetrical axis.
+%% #5 -> [input] the given node T outside the hyperbola
+%% #6 -> [output] the tangent node name A on the hyperbola
+%% #7 -> [output] the tangent node name B on the hyperbola
+\def\pstGeneralIHyperbolaTangentNode{\@ifnextchar[\Pst@GeneralIHyperbolaTangentNode{\Pst@GeneralIHyperbolaTangentNode[]}}
+\def\Pst@GeneralIHyperbolaTangentNode[#1](#2)(#3){%
+ \begingroup
+ \@InitListMng %
+ \psset{#1}%
+ \def\pst@hyperbola@center{#2}
+ \def\pst@hyperbola@radii{#3}
+ \@ifnextchar[\Pst@GeneralIHyperbolaTangentNode@i{\Pst@GeneralIHyperbolaTangentNode@i[0]}}%
+\def\Pst@GeneralIHyperbolaTangentNode@i[#1]#2#3#4{%
+ \pstGeneralIHyperbolaNode[PointName=none,PointSymbol=none](\pst@hyperbola@center)(\pst@hyperbola@radii)[#1]{10}{@PST@GENERALIHYPERBOLA@TANGENTAUX@P0}
+ \pstGeneralIHyperbolaNode[PointName=none,PointSymbol=none](\pst@hyperbola@center)(\pst@hyperbola@radii)[#1]{-10}{@PST@GENERALIHYPERBOLA@TANGENTAUX@R0}
+ \pstGeneralIHyperbolaLineInter[PointName=none,PointSymbol=none](\pst@hyperbola@center)(\pst@hyperbola@radii)[#1]{#2}{@PST@GENERALIHYPERBOLA@TANGENTAUX@P0}{@PST@GENERALIHYPERBOLA@TANGENTAUX@P}{@PST@GENERALIHYPERBOLA@TANGENTAUX@Q}
+ \pstGeneralIHyperbolaLineInter[PointName=none,PointSymbol=none](\pst@hyperbola@center)(\pst@hyperbola@radii)[#1]{#2}{@PST@GENERALIHYPERBOLA@TANGENTAUX@R0}{@PST@GENERALIHYPERBOLA@TANGENTAUX@R}{@PST@GENERALIHYPERBOLA@TANGENTAUX@S}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@GENERALIHYPERBOLA@TANGENTAUX@P}{@PST@GENERALIHYPERBOLA@TANGENTAUX@S}{@PST@GENERALIHYPERBOLA@TANGENTAUX@Q}{@PST@GENERALIHYPERBOLA@TANGENTAUX@R}{@PST@GENERALIHYPERBOLA@TANGENTAUX@I}
+ \pstInterLL[PointName=none,PointSymbol=none]{@PST@GENERALIHYPERBOLA@TANGENTAUX@P}{@PST@GENERALIHYPERBOLA@TANGENTAUX@R}{@PST@GENERALIHYPERBOLA@TANGENTAUX@Q}{@PST@GENERALIHYPERBOLA@TANGENTAUX@S}{@PST@GENERALIHYPERBOLA@TANGENTAUX@X}
+ \pstGeneralIHyperbolaLineInter(\pst@hyperbola@center)(\pst@hyperbola@radii)[#1]{@PST@GENERALIHYPERBOLA@TANGENTAUX@X}{@PST@GENERALIHYPERBOLA@TANGENTAUX@I}{#3}{#4}
+ \Pst@ManageParamList{#3}%
+ \Pst@ManageParamList{#4}%
+ \pstLineAB{#2}{#3}
+ \pstLineAB{#2}{#4}
+ \endgroup%
+}%
+%
\catcode`\@=\PstAtCode\relax
%
\endinput