packages feed

reanimate 0.3.1.0 → 0.3.2.0

raw patch · 161 files changed

+6109/−244 lines, 161 filesdep +arraydep +cerealdep +fingertreedep ~vectordep ~websocketsbinary-added

Dependencies added: array, cereal, fingertree, hmatrix, split, tasty-quickcheck, vector-space

Dependency ranges changed: vector, websockets

Files

ChangeLog.md view
@@ -1,5 +1,11 @@ # Revision history for reanimate +## 0.3.2.0 -- 2020-05-16++* Fix bug that forced GIF width to 320 pixels.+* Add helper for creating custom viewboxes, withViewBox.+* Add newSprite_, newSpriteSVG_.+ ## 0.3.1.0 -- 2020-05-12  * Expose 'mkImage'
docs/gifs/doc_addStatic.gif view

binary file changed (14095 → 14822 bytes)

docs/gifs/doc_andThen.gif view

binary file changed (15433 → 16053 bytes)

docs/gifs/doc_applyVar.gif view

binary file changed (61174 → 62651 bytes)

docs/gifs/doc_bellS.gif view

binary file changed (11942 → 12483 bytes)

docs/gifs/doc_bonneP.gif view

binary file changed (18463 → 18488 bytes)

docs/gifs/doc_bottomleyP.gif view

binary file changed (22206 → 22231 bytes)

docs/gifs/doc_chainT.gif view

binary file changed (44019 → 46593 bytes)

docs/gifs/doc_circlePlot.gif view

binary file changed (17221 → 17246 bytes)

docs/gifs/doc_cividis.gif view

binary file changed (5622 → 5647 bytes)

docs/gifs/doc_collignonP.gif view

binary file changed (18159 → 18184 bytes)

docs/gifs/doc_constantS.gif view

binary file changed (2578 → 2628 bytes)

docs/gifs/doc_cubicBezierS.gif view

binary file changed (11580 → 11977 bytes)

docs/gifs/doc_curveS.gif view

binary file changed (11487 → 12013 bytes)

docs/gifs/doc_destroySprite.gif view

binary file changed (3391 → 3314 bytes)

docs/gifs/doc_drawBox.gif view

binary file changed (2813 → 2738 bytes)

docs/gifs/doc_drawCircle.gif view

binary file changed (14117 → 14855 bytes)

docs/gifs/doc_drawProgress.gif view

binary file changed (11795 → 12127 bytes)

docs/gifs/doc_eckert1P.gif view

binary file changed (25302 → 25327 bytes)

docs/gifs/doc_eckert3P.gif view

binary file changed (27906 → 27931 bytes)

docs/gifs/doc_eckert5P.gif view

binary file changed (26453 → 26478 bytes)

docs/gifs/doc_equirectangularP.gif view

binary file changed (30057 → 30082 bytes)

docs/gifs/doc_fadeT.gif view

binary file changed (49019 → 50803 bytes)

docs/gifs/doc_faheyP.gif view

binary file changed (17300 → 17325 bytes)

docs/gifs/doc_fork.gif view

binary file changed (18188 → 18892 bytes)

docs/gifs/doc_fromToS.gif view

binary file changed (11298 → 11590 bytes)

docs/gifs/doc_githubIcon.gif view

binary file changed (4494 → 4519 bytes)

docs/gifs/doc_greyscale.gif view

binary file changed (5625 → 5650 bytes)

docs/gifs/doc_hammerP.gif view

binary file changed (25323 → 25348 bytes)

docs/gifs/doc_haskellLogo.gif view

binary file changed (4096 → 4121 bytes)

docs/gifs/doc_hsv.gif view

binary file changed (15005 → 5648 bytes)

docs/gifs/doc_hsvComponents.gif view

binary file changed (5625 → 5650 bytes)

docs/gifs/doc_hsvMatlab.gif view

binary file changed (5625 → 5650 bytes)

− docs/gifs/doc_identityS.gif

binary file changed (11373 → absent bytes)

docs/gifs/doc_inferno.gif view

binary file changed (5620 → 5645 bytes)

docs/gifs/doc_jet.gif view

binary file changed (5622 → 5647 bytes)

docs/gifs/doc_labComponents.gif view

binary file changed (5620 → 5645 bytes)

docs/gifs/doc_lambertP.gif view

binary file changed (30532 → 30557 bytes)

docs/gifs/doc_latex.gif view

binary file changed (3471 → 3496 bytes)

docs/gifs/doc_latexAlign.gif view

binary file changed (4406 → 4431 bytes)

docs/gifs/doc_lchComponents.gif view

binary file changed (5610 → 5635 bytes)

docs/gifs/doc_magma.gif view

binary file changed (5620 → 5645 bytes)

docs/gifs/doc_mapA.gif view

binary file changed (6836 → 7228 bytes)

docs/gifs/doc_mercatorP.gif view

binary file changed (33082 → 33107 bytes)

docs/gifs/doc_mkBackground.gif view

binary file changed (1793 → 1818 bytes)

docs/gifs/doc_mkImage.gif view

binary file changed (4096 → 4121 bytes)

docs/gifs/doc_mkText.gif view

binary file changed (8482 → 8532 bytes)

docs/gifs/doc_mollweideP.gif view

binary file changed (25580 → 25605 bytes)

docs/gifs/doc_newSprite.gif view

binary file changed (30268 → 31317 bytes)

docs/gifs/doc_newSpriteA'.gif view

binary file changed (20429 → 21040 bytes)

docs/gifs/doc_newSpriteA.gif view

binary file changed (33729 → 34557 bytes)

docs/gifs/doc_newSpriteSVG.gif view

binary file changed (14095 → 14822 bytes)

docs/gifs/doc_orthoP.gif view

binary file changed (16625 → 16650 bytes)

docs/gifs/doc_oscillateS.gif view

binary file changed (12190 → 12544 bytes)

docs/gifs/doc_overlapT.gif view

binary file changed (19986 → 21227 bytes)

docs/gifs/doc_parA.gif view

binary file changed (29837 → 30658 bytes)

docs/gifs/doc_parDropA.gif view

binary file changed (30575 → 31372 bytes)

docs/gifs/doc_parLoopA.gif view

binary file changed (34088 → 34923 bytes)

docs/gifs/doc_parula.gif view

binary file changed (5613 → 5638 bytes)

docs/gifs/doc_pathify.gif view

binary file changed (9235 → 9884 bytes)

docs/gifs/doc_pause.gif view

binary file changed (12484 → 12841 bytes)

docs/gifs/doc_pauseAround.gif view

binary file changed (13194 → 13578 bytes)

docs/gifs/doc_pauseAtBeginning.gif view

binary file changed (12395 → 12748 bytes)

docs/gifs/doc_pauseAtEnd.gif view

binary file changed (12594 → 12949 bytes)

docs/gifs/doc_plasma.gif view

binary file changed (5623 → 5648 bytes)

docs/gifs/doc_play.gif view

binary file changed (16118 → 16780 bytes)

docs/gifs/doc_playThenReverseA.gif view

binary file changed (27345 → 28826 bytes)

docs/gifs/doc_queryNow.gif view

binary file changed (20539 → 21296 bytes)

docs/gifs/doc_repeatA.gif view

binary file changed (20923 → 22005 bytes)

docs/gifs/doc_reverseA.gif view

binary file changed (15444 → 16202 bytes)

docs/gifs/doc_reverseS.gif view

binary file changed (11609 → 11890 bytes)

docs/gifs/doc_rgbComponents.gif view

binary file changed (5625 → 5650 bytes)

docs/gifs/doc_seqA.gif view

binary file changed (16118 → 16780 bytes)

docs/gifs/doc_signalA.gif view

binary file changed (14083 → 14516 bytes)

− docs/gifs/doc_signalFlat.gif

binary file changed (2528 → absent bytes)

− docs/gifs/doc_signalT.gif

binary file changed (49019 → absent bytes)

docs/gifs/doc_simpleVar.gif view

binary file changed (70631 → 73603 bytes)

docs/gifs/doc_sinebow.gif view

binary file changed (5625 → 5650 bytes)

docs/gifs/doc_sinusoidalP.gif view

binary file changed (21520 → 21545 bytes)

docs/gifs/doc_smallEarth.gif view

binary file changed (30057 → 30082 bytes)

docs/gifs/doc_spriteE.gif view

binary file changed (30213 → 31870 bytes)

docs/gifs/doc_spriteMap.gif view

binary file changed (14799 → 15448 bytes)

docs/gifs/doc_spriteTween.gif view

binary file changed (20908 → 21781 bytes)

docs/gifs/doc_spriteVar.gif view

binary file changed (61174 → 62651 bytes)

docs/gifs/doc_spriteZ.gif view

binary file changed (4530 → 4580 bytes)

docs/gifs/doc_svgLogo.gif view

binary file changed (6462 → 6487 bytes)

docs/gifs/doc_ternaryPlot.gif view

binary file changed (5107 → 5132 bytes)

docs/gifs/doc_turbo.gif view

binary file changed (5614 → 5639 bytes)

docs/gifs/doc_unVar.gif view

binary file changed (48066 → 50426 bytes)

docs/gifs/doc_viridis.gif view

binary file changed (5617 → 5642 bytes)

docs/gifs/doc_wait.gif view

binary file changed (16891 → 17544 bytes)

docs/gifs/doc_waitOn.gif view

binary file changed (16118 → 16780 bytes)

docs/gifs/doc_wernerP.gif view

binary file changed (18344 → 18369 bytes)

+ docs/gifs/doc_withViewBox.gif view

binary file changed (absent → 1713 bytes)

docs/gifs/doc_writeVar.gif view

binary file changed (6810 → 6885 bytes)

docs/gifs/doc_xelatex.gif view

binary file changed (3379 → 3404 bytes)

docs/gifs/doc_xyzComponents.gif view

binary file changed (5613 → 5638 bytes)

examples/bug_play1.hs view
@@ -3,7 +3,6 @@ module Main(main) where  import Reanimate-import Reanimate.Scene  -- This should give circle. main :: IO ()
examples/bug_play2.hs view
@@ -3,7 +3,6 @@ module Main(main) where  import Reanimate-import Reanimate.Scene  -- This should give rect. main :: IO ()
examples/bug_play3.hs view
@@ -3,7 +3,6 @@ module Main(main) where  import Reanimate-import Reanimate.Scene  -- This should give rect. main :: IO ()
examples/doc_pathify.golden view
@@ -1,50 +1,50 @@-0<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0 -1,0 -1,0" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L0,0" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0 -1,0 -1,0" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-1,-1" /></g></g></g></g></g></svg>-1<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.045084 -0.997016,0.089472 -0.991236,0.132976" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L0.163265,0" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.022542 -0.997016,0.044736 -0.991236,0.066488" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.959184,-0.959184" /></g></g></g></g></g></svg>-2<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.090169 -0.988066,0.177551 -0.965691,0.260651" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L0.326531,0" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.045084 -0.988066,0.088775 -0.965691,0.130326" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.918367,-0.918367" /></g></g></g></g></g></svg>-3<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.135253 -0.973148,0.264235 -0.924485,0.381906" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L0.489796,0" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.067627 -0.973148,0.132118 -0.924485,0.190953" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.877551,-0.877551" /></g></g></g></g></g></svg>-4<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.180338 -0.952264,0.349526 -0.868738,0.495619" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L0.653061,0" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.090169 -0.952264,0.174763 -0.868738,0.247809" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.836735,-0.836735" /></g></g></g></g></g></svg>-5<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.225422 -0.925412,0.433424 -0.799569,0.600671" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L0.816327,0" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.112711 -0.925412,0.216712 -0.799569,0.300335" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.795918,-0.795918" /></g></g></g></g></g></svg>-6<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.270507 -0.892593,0.515927 -0.7181,0.695941" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L0.979592,0" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.135253 -0.892593,0.257964 -0.7181,0.347971" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.755102,-0.755102" /></g></g></g></g></g></svg>-7<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.315591 -0.853807,0.597037 -0.625449,0.780311" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L1.142857,0" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.157796 -0.853807,0.298519 -0.625449,0.390156" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.714286,-0.714286" /></g></g></g></g></g></svg>-8<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.360676 -0.809054,0.676754 -0.522737,0.85266" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L1.306122,0" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.180338 -0.809054,0.338377 -0.522737,0.42633" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.673469,-0.673469" /></g></g></g></g></g></svg>-9<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.40576 -0.758334,0.755076 -0.411085,0.911868" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L1.469388,0" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.20288 -0.758334,0.377538 -0.411085,0.455934" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.632653,-0.632653" /></g></g></g></g></g></svg>-10<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.450845 -0.701647,0.832005 -0.291611,0.956814" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L1.632653,0" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.225422 -0.701647,0.416003 -0.291611,0.478407" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.591837,-0.591837" /></g></g></g></g></g></svg>-11<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.495929 -0.638993,0.907541 -0.165436,0.986379" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L1.795918,0" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.247965 -0.638993,0.45377 -0.165436,0.49319" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.55102,-0.55102" /></g></g></g></g></g></svg>-12<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.541014 -0.570372,0.981682 -0.03368,0.999444" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L1.959184,0" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.270507 -0.570372,0.490841 -0.03368,0.499722" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.510204,-0.510204" /></g></g></g></g></g></svg>-13<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.033813,1 0.067235,0.998322 0.100185,0.995044" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,0.122449" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.033813,0.5 0.067235,0.499161 0.100185,0.497522" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.469388,-0.469388" /></g></g></g></g></g></svg>-14<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.078898,1 0.155662,0.990863 0.229291,0.973589" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,0.285714" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.078898,0.5 0.155662,0.495431 0.229291,0.486795" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.428571,-0.428571" /></g></g></g></g></g></svg>-15<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.123982,1 0.242695,0.977437 0.352255,0.936193" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,0.44898" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.123982,0.5 0.242695,0.488719 0.352255,0.468097" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.387755,-0.387755" /></g></g></g></g></g></svg>-16<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.169067,1 0.328334,0.958044 0.467959,0.883976" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,0.612245" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.169067,0.5 0.328334,0.479022 0.467959,0.441988" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.346939,-0.346939" /></g></g></g></g></g></svg>-17<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.214151,1 0.41258,0.932684 0.575281,0.818058" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,0.77551" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.214151,0.5 0.41258,0.466342 0.575281,0.409029" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.306122,-0.306122" /></g></g></g></g></g></svg>-18<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.259236,1 0.495432,0.901357 0.673102,0.739559" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,0.938776" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.259236,0.5 0.495432,0.450679 0.673102,0.369779" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.265306,-0.265306" /></g></g></g></g></g></svg>-19<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.30432,1 0.576891,0.864063 0.760302,0.649599" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,1.102041" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.30432,0.5 0.576891,0.432032 0.760302,0.324799" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.22449,-0.22449" /></g></g></g></g></g></svg>-20<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.349405,1 0.656955,0.820802 0.835761,0.549297" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,1.265306" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.349405,0.5 0.656955,0.410401 0.835761,0.274649" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.183673,-0.183673" /></g></g></g></g></g></svg>-21<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.394489,1 0.735626,0.771574 0.898359,0.439775" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,1.428571" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.394489,0.5 0.735626,0.385787 0.898359,0.219887" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.142857,-0.142857" /></g></g></g></g></g></svg>-22<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.439574,1 0.812904,0.716379 0.946976,0.322151" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,1.591837" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.439574,0.5 0.812904,0.358189 0.946976,0.161076" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.102041,-0.102041" /></g></g></g></g></g></svg>-23<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.484658,1 0.888788,0.655216 0.980491,0.197546" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,1.755102" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.484658,0.5 0.888788,0.327608 0.980491,0.098773" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.061224,-0.061224" /></g></g></g></g></g></svg>-24<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.529743,1 0.963278,0.588087 0.997786,0.067081" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,1.918367" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.529743,0.5 0.963278,0.294044 0.997786,0.03354" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L-0.020408,-0.020408" /></g></g></g></g></g></svg>-25<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.022542 0.999254,-0.04491 0.997786,-0.067081" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L1.918367,2" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.011271 0.999254,-0.022455 0.997786,-0.03354" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.020408,0.020408" /></g></g></g></g></g></svg>-26<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.067627 0.993287,-0.133686 0.980491,-0.197546" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L1.755102,2" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.033813 0.993287,-0.066843 0.980491,-0.098773" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.061224,0.061224" /></g></g></g></g></g></svg>-27<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.112711 0.981353,-0.221067 0.946976,-0.322151" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L1.591837,2" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.056356 0.981353,-0.110534 0.946976,-0.161076" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.102041,0.102041" /></g></g></g></g></g></svg>-28<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.157796 0.963452,-0.307055 0.898359,-0.439775" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L1.428571,2" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.078898 0.963452,-0.153527 0.898359,-0.219887" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.142857,0.142857" /></g></g></g></g></g></svg>-29<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.20288 0.939584,-0.391649 0.835761,-0.549297" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L1.265306,2" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.10144 0.939584,-0.195825 0.835761,-0.274649" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.183673,0.183673" /></g></g></g></g></g></svg>-30<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.247965 0.909748,-0.47485 0.760302,-0.649599" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L1.102041,2" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.123982 0.909748,-0.237425 0.760302,-0.324799" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.22449,0.22449" /></g></g></g></g></g></svg>-31<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.293049 0.873946,-0.556657 0.673102,-0.739559" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0.938776,2" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.146525 0.873946,-0.278328 0.673102,-0.369779" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.265306,0.265306" /></g></g></g></g></g></svg>-32<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.338134 0.832177,-0.63707 0.575281,-0.818058" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0.77551,2" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.169067 0.832177,-0.318535 0.575281,-0.409029" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.306122,0.306122" /></g></g></g></g></g></svg>-33<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.383218 0.78444,-0.716089 0.467959,-0.883976" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0.612245,2" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.191609 0.78444,-0.358045 0.467959,-0.441988" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.346939,0.346939" /></g></g></g></g></g></svg>-34<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.428302 0.730737,-0.793715 0.352255,-0.936193" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0.44898,2" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.214151 0.730737,-0.396858 0.352255,-0.468097" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.387755,0.387755" /></g></g></g></g></g></svg>-35<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.473387 0.671066,-0.869947 0.229291,-0.973589" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0.285714,2" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.236693 0.671066,-0.434974 0.229291,-0.486795" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.428571,0.428571" /></g></g></g></g></g></svg>-36<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.518471 0.605429,-0.944786 0.100185,-0.995044" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0.122449,2" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.259236 0.605429,-0.472393 0.100185,-0.497522" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.469388,0.469388" /></g></g></g></g></g></svg>-37<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.011271,-1 -0.022499,-0.999814 -0.03368,-0.999444" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,1.959184" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.011271,-0.5 -0.022499,-0.499907 -0.03368,-0.499722" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.510204,0.510204" /></g></g></g></g></g></svg>-38<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.056356,-1 -0.111622,-0.995338 -0.165436,-0.986379" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,1.795918" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.056356,-0.5 -0.111622,-0.497669 -0.165436,-0.49319" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.55102,0.55102" /></g></g></g></g></g></svg>-39<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.10144,-1 -0.199352,-0.984896 -0.291611,-0.956814" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,1.632653" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.10144,-0.5 -0.199352,-0.492448 -0.291611,-0.478407" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.591837,0.591837" /></g></g></g></g></g></svg>-40<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.146525,-1 -0.285689,-0.968487 -0.411085,-0.911868" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,1.469388" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.146525,-0.5 -0.285689,-0.484243 -0.411085,-0.455934" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.632653,0.632653" /></g></g></g></g></g></svg>-41<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.191609,-1 -0.370631,-0.94611 -0.522737,-0.85266" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,1.306122" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.191609,-0.5 -0.370631,-0.473055 -0.522737,-0.42633" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.673469,0.673469" /></g></g></g></g></g></svg>-42<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.236693,-1 -0.45418,-0.917767 -0.625449,-0.780311" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,1.142857" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.236693,-0.5 -0.45418,-0.458883 -0.625449,-0.390156" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.714286,0.714286" /></g></g></g></g></g></svg>-43<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.281778,-1 -0.536336,-0.883456 -0.7181,-0.695941" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,0.979592" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.281778,-0.5 -0.536336,-0.441728 -0.7181,-0.347971" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.755102,0.755102" /></g></g></g></g></g></svg>-44<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.326862,-1 -0.617097,-0.843178 -0.799569,-0.600671" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,0.816327" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.326862,-0.5 -0.617097,-0.421589 -0.799569,-0.300335" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.795918,0.795918" /></g></g></g></g></g></svg>-45<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.371947,-1 -0.696465,-0.796934 -0.868738,-0.495619" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,0.653061" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.371947,-0.5 -0.696465,-0.398467 -0.868738,-0.247809" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.836735,0.836735" /></g></g></g></g></g></svg>-46<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.417031,-1 -0.774439,-0.744722 -0.924485,-0.381906" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,0.489796" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.417031,-0.5 -0.774439,-0.372361 -0.924485,-0.190953" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.877551,0.877551" /></g></g></g></g></g></svg>-47<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.462116,-1 -0.85102,-0.686543 -0.965691,-0.260651" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,0.326531" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.462116,-0.5 -0.85102,-0.343272 -0.965691,-0.130326" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.918367,0.918367" /></g></g></g></g></g></svg>-48<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.5072,-1 -0.926207,-0.622398 -0.991236,-0.132976" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,0.163265" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.5072,-0.5 -0.926207,-0.311199 -0.991236,-0.066488" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L0.959184,0.959184" /></g></g></g></g></g></svg>-49<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-2.666667, 1.5)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.552285,-1 -1,-0.552285 -1,-0" /></g><g transform="translate(2.666667, 1.5)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,0" /></g></g><g transform="translate(-2.666667, -1.5)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.552285,-0.5 -1,-0.276142 -1,-0" /></g><g transform="translate(2.666667, -1.5)"><path d="M-1,-1 L1,1" /></g></g></g></g></g></svg>+0<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0 -1,0 -1,0" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L0,0" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0 -1,0 -1,0" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-1,-1" /></g></g></g></g></g></svg>+1<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.045084 -0.997016,0.089472 -0.991236,0.132976" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L0.163265,0" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.022542 -0.997016,0.044736 -0.991236,0.066488" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.959184,-0.959184" /></g></g></g></g></g></svg>+2<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.090169 -0.988066,0.177551 -0.965691,0.260651" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L0.326531,0" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.045084 -0.988066,0.088775 -0.965691,0.130326" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.918367,-0.918367" /></g></g></g></g></g></svg>+3<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.135253 -0.973148,0.264235 -0.924485,0.381906" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L0.489796,0" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.067627 -0.973148,0.132118 -0.924485,0.190953" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.877551,-0.877551" /></g></g></g></g></g></svg>+4<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.180338 -0.952264,0.349526 -0.868738,0.495619" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L0.653061,0" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.090169 -0.952264,0.174763 -0.868738,0.247809" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.836735,-0.836735" /></g></g></g></g></g></svg>+5<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.225422 -0.925412,0.433424 -0.799569,0.600671" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L0.816327,0" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.112711 -0.925412,0.216712 -0.799569,0.300335" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.795918,-0.795918" /></g></g></g></g></g></svg>+6<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.270507 -0.892593,0.515927 -0.7181,0.695941" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L0.979592,0" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.135253 -0.892593,0.257964 -0.7181,0.347971" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.755102,-0.755102" /></g></g></g></g></g></svg>+7<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.315591 -0.853807,0.597037 -0.625449,0.780311" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L1.142857,0" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.157796 -0.853807,0.298519 -0.625449,0.390156" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.714286,-0.714286" /></g></g></g></g></g></svg>+8<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.360676 -0.809054,0.676754 -0.522737,0.85266" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L1.306122,0" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.180338 -0.809054,0.338377 -0.522737,0.42633" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.673469,-0.673469" /></g></g></g></g></g></svg>+9<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.40576 -0.758334,0.755076 -0.411085,0.911868" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L1.469388,0" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.20288 -0.758334,0.377538 -0.411085,0.455934" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.632653,-0.632653" /></g></g></g></g></g></svg>+10<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.450845 -0.701647,0.832005 -0.291611,0.956814" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L1.632653,0" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.225422 -0.701647,0.416003 -0.291611,0.478407" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.591837,-0.591837" /></g></g></g></g></g></svg>+11<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.495929 -0.638993,0.907541 -0.165436,0.986379" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L1.795918,0" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.247965 -0.638993,0.45377 -0.165436,0.49319" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.55102,-0.55102" /></g></g></g></g></g></svg>+12<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.541014 -0.570372,0.981682 -0.03368,0.999444" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L1.959184,0" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.270507 -0.570372,0.490841 -0.03368,0.499722" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.510204,-0.510204" /></g></g></g></g></g></svg>+13<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.033813,1 0.067235,0.998322 0.100185,0.995044" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,0.122449" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.033813,0.5 0.067235,0.499161 0.100185,0.497522" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.469388,-0.469388" /></g></g></g></g></g></svg>+14<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.078898,1 0.155662,0.990863 0.229291,0.973589" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,0.285714" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.078898,0.5 0.155662,0.495431 0.229291,0.486795" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.428571,-0.428571" /></g></g></g></g></g></svg>+15<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.123982,1 0.242695,0.977437 0.352255,0.936193" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,0.44898" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.123982,0.5 0.242695,0.488719 0.352255,0.468097" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.387755,-0.387755" /></g></g></g></g></g></svg>+16<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.169067,1 0.328334,0.958044 0.467959,0.883976" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,0.612245" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.169067,0.5 0.328334,0.479022 0.467959,0.441988" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.346939,-0.346939" /></g></g></g></g></g></svg>+17<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.214151,1 0.41258,0.932684 0.575281,0.818058" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,0.77551" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.214151,0.5 0.41258,0.466342 0.575281,0.409029" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.306122,-0.306122" /></g></g></g></g></g></svg>+18<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.259236,1 0.495432,0.901357 0.673102,0.739559" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,0.938776" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.259236,0.5 0.495432,0.450679 0.673102,0.369779" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.265306,-0.265306" /></g></g></g></g></g></svg>+19<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.30432,1 0.576891,0.864063 0.760302,0.649599" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,1.102041" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.30432,0.5 0.576891,0.432032 0.760302,0.324799" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.22449,-0.22449" /></g></g></g></g></g></svg>+20<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.349405,1 0.656955,0.820802 0.835761,0.549297" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,1.265306" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.349405,0.5 0.656955,0.410401 0.835761,0.274649" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.183673,-0.183673" /></g></g></g></g></g></svg>+21<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.394489,1 0.735626,0.771574 0.898359,0.439775" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,1.428571" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.394489,0.5 0.735626,0.385787 0.898359,0.219887" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.142857,-0.142857" /></g></g></g></g></g></svg>+22<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.439574,1 0.812904,0.716379 0.946976,0.322151" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,1.591837" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.439574,0.5 0.812904,0.358189 0.946976,0.161076" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.102041,-0.102041" /></g></g></g></g></g></svg>+23<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.484658,1 0.888788,0.655216 0.980491,0.197546" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,1.755102" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.484658,0.5 0.888788,0.327608 0.980491,0.098773" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.061224,-0.061224" /></g></g></g></g></g></svg>+24<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.529743,1 0.963278,0.588087 0.997786,0.067081" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,1.918367" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.529743,0.5 0.963278,0.294044 0.997786,0.03354" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L-0.020408,-0.020408" /></g></g></g></g></g></svg>+25<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.022542 0.999254,-0.04491 0.997786,-0.067081" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L1.918367,2" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.011271 0.999254,-0.022455 0.997786,-0.03354" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.020408,0.020408" /></g></g></g></g></g></svg>+26<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.067627 0.993287,-0.133686 0.980491,-0.197546" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L1.755102,2" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.033813 0.993287,-0.066843 0.980491,-0.098773" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.061224,0.061224" /></g></g></g></g></g></svg>+27<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.112711 0.981353,-0.221067 0.946976,-0.322151" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L1.591837,2" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.056356 0.981353,-0.110534 0.946976,-0.161076" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.102041,0.102041" /></g></g></g></g></g></svg>+28<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.157796 0.963452,-0.307055 0.898359,-0.439775" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L1.428571,2" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.078898 0.963452,-0.153527 0.898359,-0.219887" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.142857,0.142857" /></g></g></g></g></g></svg>+29<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.20288 0.939584,-0.391649 0.835761,-0.549297" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L1.265306,2" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.10144 0.939584,-0.195825 0.835761,-0.274649" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.183673,0.183673" /></g></g></g></g></g></svg>+30<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.247965 0.909748,-0.47485 0.760302,-0.649599" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L1.102041,2" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.123982 0.909748,-0.237425 0.760302,-0.324799" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.22449,0.22449" /></g></g></g></g></g></svg>+31<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.293049 0.873946,-0.556657 0.673102,-0.739559" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0.938776,2" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.146525 0.873946,-0.278328 0.673102,-0.369779" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.265306,0.265306" /></g></g></g></g></g></svg>+32<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.338134 0.832177,-0.63707 0.575281,-0.818058" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0.77551,2" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.169067 0.832177,-0.318535 0.575281,-0.409029" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.306122,0.306122" /></g></g></g></g></g></svg>+33<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.383218 0.78444,-0.716089 0.467959,-0.883976" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0.612245,2" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.191609 0.78444,-0.358045 0.467959,-0.441988" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.346939,0.346939" /></g></g></g></g></g></svg>+34<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.428302 0.730737,-0.793715 0.352255,-0.936193" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0.44898,2" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.214151 0.730737,-0.396858 0.352255,-0.468097" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.387755,0.387755" /></g></g></g></g></g></svg>+35<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.473387 0.671066,-0.869947 0.229291,-0.973589" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0.285714,2" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.236693 0.671066,-0.434974 0.229291,-0.486795" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.428571,0.428571" /></g></g></g></g></g></svg>+36<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.518471 0.605429,-0.944786 0.100185,-0.995044" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0.122449,2" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.259236 0.605429,-0.472393 0.100185,-0.497522" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.469388,0.469388" /></g></g></g></g></g></svg>+37<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.011271,-1 -0.022499,-0.999814 -0.03368,-0.999444" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,1.959184" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.011271,-0.5 -0.022499,-0.499907 -0.03368,-0.499722" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.510204,0.510204" /></g></g></g></g></g></svg>+38<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.056356,-1 -0.111622,-0.995338 -0.165436,-0.986379" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,1.795918" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.056356,-0.5 -0.111622,-0.497669 -0.165436,-0.49319" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.55102,0.55102" /></g></g></g></g></g></svg>+39<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.10144,-1 -0.199352,-0.984896 -0.291611,-0.956814" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,1.632653" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.10144,-0.5 -0.199352,-0.492448 -0.291611,-0.478407" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.591837,0.591837" /></g></g></g></g></g></svg>+40<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.146525,-1 -0.285689,-0.968487 -0.411085,-0.911868" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,1.469388" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.146525,-0.5 -0.285689,-0.484243 -0.411085,-0.455934" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.632653,0.632653" /></g></g></g></g></g></svg>+41<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.191609,-1 -0.370631,-0.94611 -0.522737,-0.85266" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,1.306122" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.191609,-0.5 -0.370631,-0.473055 -0.522737,-0.42633" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.673469,0.673469" /></g></g></g></g></g></svg>+42<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.236693,-1 -0.45418,-0.917767 -0.625449,-0.780311" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,1.142857" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.236693,-0.5 -0.45418,-0.458883 -0.625449,-0.390156" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.714286,0.714286" /></g></g></g></g></g></svg>+43<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.281778,-1 -0.536336,-0.883456 -0.7181,-0.695941" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,0.979592" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.281778,-0.5 -0.536336,-0.441728 -0.7181,-0.347971" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.755102,0.755102" /></g></g></g></g></g></svg>+44<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.326862,-1 -0.617097,-0.843178 -0.799569,-0.600671" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,0.816327" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.326862,-0.5 -0.617097,-0.421589 -0.799569,-0.300335" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.795918,0.795918" /></g></g></g></g></g></svg>+45<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.371947,-1 -0.696465,-0.796934 -0.868738,-0.495619" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,0.653061" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.371947,-0.5 -0.696465,-0.398467 -0.868738,-0.247809" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.836735,0.836735" /></g></g></g></g></g></svg>+46<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.417031,-1 -0.774439,-0.744722 -0.924485,-0.381906" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,0.489796" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.417031,-0.5 -0.774439,-0.372361 -0.924485,-0.190953" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.877551,0.877551" /></g></g></g></g></g></svg>+47<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.462116,-1 -0.85102,-0.686543 -0.965691,-0.260651" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,0.326531" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.462116,-0.5 -0.85102,-0.343272 -0.965691,-0.130326" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.918367,0.918367" /></g></g></g></g></g></svg>+48<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.5072,-1 -0.926207,-0.622398 -0.991236,-0.132976" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,0.163265" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.5072,-0.5 -0.926207,-0.311199 -0.991236,-0.066488" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L0.959184,0.959184" /></g></g></g></g></g></svg>+49<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FFFFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g stroke-width="0.1" stroke="#000000" fill-opacity="0"><g><g transform="translate(-4, 2.25)"><path d="M-1,0 C-1,0.552285 -0.552285,1 0,1 C0.552285,1 1,0.552285 1,0 C1,-0.552285 0.552285,-1 0,-1 C-0.552285,-1 -1,-0.552285 -1,-0" /></g><g transform="translate(4, 2.25)"><g transform="translate(-1, -1)"><path stroke-linecap="square" d="M0,0 L2,0 L2,2 L0,2 L0,0" /></g></g><g transform="translate(-4, -2.25)"><path d="M-1,0 C-1,0.276142 -0.552285,0.5 0,0.5 C0.552285,0.5 1,0.276142 1,0 C1,-0.276142 0.552285,-0.5 0,-0.5 C-0.552285,-0.5 -1,-0.276142 -1,-0" /></g><g transform="translate(4, -2.25)"><path d="M-1,-1 L1,1" /></g></g></g></g></g></svg>
examples/doc_queryNow.hs view
@@ -5,7 +5,6 @@  import Reanimate import Reanimate.Builtin.Documentation-import Data.Monoid ((<>)) import qualified Data.Text as T  main :: IO ()
+ examples/doc_withViewBox.golden view
@@ -0,0 +1,50 @@+0<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+1<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+2<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+3<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+4<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+5<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+6<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+7<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+8<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+9<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+10<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+11<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+12<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+13<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+14<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+15<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+16<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+17<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+18<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+19<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+20<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+21<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+22<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+23<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+24<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+25<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+26<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+27<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+28<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+29<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+30<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+31<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+32<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+33<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+34<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+35<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+36<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+37<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+38<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+39<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+40<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+41<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+42<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+43<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+44<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+45<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+46<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+47<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+48<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>+49<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g stroke-width="0" fill="#FFFF00" transform="translate(-8, -4.5)" fill-opacity="1">    <rect width="16" height="9" />  </g></svg></g></g></svg>
+ examples/doc_withViewBox.hs view
@@ -0,0 +1,10 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+module Main (main) where++import           Reanimate++main :: IO ()+main = reanimate $ animate $ const $+  withViewBox (0,0,1,1) $ mkBackground "yellow"
examples/fourier.hs view
@@ -8,7 +8,6 @@  import           Graphics.SvgTree import           Reanimate-import           Reanimate.LaTeX  (latex)  waveMultiplier :: Int -- waveMultiplier = 1 -- Sawtooth wave
+ examples/intro_canvas.golden view
@@ -0,0 +1,50 @@+0<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(0, 0)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">0.0,0.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">0.0,0.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+1<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(0, 0)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">0.0,0.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">0.0,0.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+2<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(0.001735, 0.041649)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">0.0,0.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">0.0,0.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+3<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(0.065618, 0.25616)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">0.1,0.3</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">0.1,0.3</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+4<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(0.426576, 0.653128)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">0.4,0.7</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">0.4,0.7</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+5<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(1.4599, 1.208263)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">1.5,1.2</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">1.5,1.2</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+6<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(2.737516, 1.654544)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">2.7,1.7</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">2.7,1.7</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+7<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(3.680133, 1.918367)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">3.7,1.9</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">3.7,1.9</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+8<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(4, 2)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">4.0,2.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">4.0,2.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+9<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(4, 2)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">4.0,2.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">4.0,2.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+10<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(3.758281, 1.90579)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">3.8,1.9</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">3.8,1.9</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+11<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(2.672487, 1.547223)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">2.7,1.5</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">2.7,1.5</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+12<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(0.832136, 1.218065)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">0.8,1.2</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">0.8,1.2</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+13<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-1.420108, 1.438767)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-1.4,1.4</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-1.4,1.4</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+14<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-2.967097, 2.153686)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-3.0,2.2</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-3.0,2.2</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+15<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-3.779658, 2.788874)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-3.8,2.8</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-3.8,2.8</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+16<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-4, 3)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-4.0,3.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-4.0,3.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+17<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-4, 3)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-4.0,3.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-4.0,3.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+18<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-3.782108, 2.83187)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-3.8,2.8</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-3.8,2.8</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+19<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-3.007408, 2.129163)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-3.0,2.1</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-3.0,2.1</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+20<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-2.171731, 0.879084)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-2.2,0.9</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-2.2,0.9</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+21<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-2.140775, -0.795918)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-2.1,-0.8</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-2.1,-0.8</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+22<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-2.957345, -2.075585)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-3.0,-2.1</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-3.0,-2.1</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+23<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-3.752042, -2.80788)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-3.8,-2.8</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-3.8,-2.8</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+24<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-4, -3)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-4.0,-3.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-4.0,-3.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+25<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-4, -3)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-4.0,-3.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-4.0,-3.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+26<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-3.742815, -2.813006)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-3.7,-2.8</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-3.7,-2.8</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+27<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-2.74371, -2.194272)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-2.7,-2.2</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-2.7,-2.2</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+28<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(-0.926281, -1.470637)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">-0.9,-1.5</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">-0.9,-1.5</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+29<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(1.590092, -1.210818)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">1.6,-1.2</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">1.6,-1.2</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+30<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(3.56967, -1.524769)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">3.6,-1.5</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">3.6,-1.5</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+31<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(4.720569, -1.891839)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">4.7,-1.9</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">4.7,-1.9</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+32<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(5, -2)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">5.0,-2.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">5.0,-2.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+33<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(5, -2)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">5.0,-2.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">5.0,-2.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+34<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(5.065987, -1.716304)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">5.1,-1.7</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">5.1,-1.7</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+35<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(5.193253, -0.827155)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">5.2,-0.8</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">5.2,-0.8</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+36<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(5.035335, 0.324182)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">5.0,0.3</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">5.0,0.3</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+37<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(4.141502, 1.102152)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">4.1,1.1</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">4.1,1.1</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+38<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(2.998683, 1.179824)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">3.0,1.2</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">3.0,1.2</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+39<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(2.191369, 1.04563)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">2.2,1.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">2.2,1.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+40<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(2, 1)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">2.0,1.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">2.0,1.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+41<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(2, 1)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">2.0,1.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">2.0,1.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+42<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(1.840067, 0.920033)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">1.8,0.9</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">1.8,0.9</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+43<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(1.368758, 0.684379)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">1.4,0.7</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">1.4,0.7</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+44<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(0.72995, 0.364975)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">0.7,0.4</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">0.7,0.4</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+45<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(0.213288, 0.106644)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">0.2,0.1</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">0.2,0.1</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+46<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(0.032809, 0.016404)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">0.0,0.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">0.0,0.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+47<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(0.000867, 0.000434)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">0.0,0.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">0.0,0.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+48<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(0, 0)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">0.0,0.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">0.0,0.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>+49<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g><g stroke-width="0.025" stroke="#808080"><g><g transform="translate(0, -5)"><line x1="-16" x2="16" /></g><g transform="translate(0, -4)"><line x1="-16" x2="16" /></g><g transform="translate(0, -3)"><line x1="-16" x2="16" /></g><g transform="translate(0, -2)"><line x1="-16" x2="16" /></g><g transform="translate(0, -1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 0)"><line x1="-16" x2="16" /></g><g transform="translate(0, 1)"><line x1="-16" x2="16" /></g><g transform="translate(0, 2)"><line x1="-16" x2="16" /></g><g transform="translate(0, 3)"><line x1="-16" x2="16" /></g><g transform="translate(0, 4)"><line x1="-16" x2="16" /></g></g><g><g transform="translate(-8, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(-1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(0, 0)"><line y1="-9" y2="9" /></g><g transform="translate(1, 0)"><line y1="-9" y2="9" /></g><g transform="translate(2, 0)"><line y1="-9" y2="9" /></g><g transform="translate(3, 0)"><line y1="-9" y2="9" /></g><g transform="translate(4, 0)"><line y1="-9" y2="9" /></g><g transform="translate(5, 0)"><line y1="-9" y2="9" /></g><g transform="translate(6, 0)"><line y1="-9" y2="9" /></g><g transform="translate(7, 0)"><line y1="-9" y2="9" /></g><g transform="translate(8, 0)"><line y1="-9" y2="9" /></g></g></g><line stroke="#808080" x1="-16" x2="16" /><line stroke="#808080" y1="-9" y2="9" /><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-7.95,4.5 C-7.95,3.5 0,4.5 0,3.5 C0,4.5 7.95,3.5 7.95,4.5" /><g transform="translate(0, 3)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">16 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">16 units</text></g></g></g></g><path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-8,-4.45 C-7,-4.45 -8,0 -7,0 C-8,0 -7,4.45 -8,4.45" /><g transform="translate(-6.5, 0)"><g transform="rotate(90)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">9 units</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">9 units</text></g></g></g></g></g></g><g transform="translate(0, 0)"><g><g transform="translate(0, -0.5)"><g transform="scale(0.5)"><g><g transform="translate(0, 0)"><g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle"><text font-size="2">0.0,0.0</text></g></g><g transform="translate(0, 0)"><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">0.0,0.0</text></g></g></g></g></g><circle fill="#FF0000" r="0.1" /></g></g></g></g></svg>
+ examples/intro_canvas.hs view
@@ -0,0 +1,108 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+module Main+  ( main+  )+where++import           Reanimate+import           Reanimate.Builtin.Documentation+import           Linear.V2+import           Linear.Vector+import           Linear.Metric+import           Graphics.SvgTree                  hiding ( Text+                                                          , Point+                                                          , height+                                                          )+import           Data.Text                                ( Text )+import qualified Data.Text                     as T+import           Text.Printf+import           Geom2D.CubicBezier                       ( QuadBezier(..)+                                                          , evalBezier+                                                          , Point(..)+                                                          )++main :: IO ()+main = reanimate $ sceneAnimation $ do+  newSpriteSVG_ $ mkBackgroundPixel rtfdBackgroundColor+  newSpriteSVG_ static+  dotPath  <- newVar (QuadBezier (Point 0 0) (Point 0 0) (Point 0 0))+  dotParam <- newVar 0+  newSprite_ $ redDot <$> (evalBezier <$> unVar dotPath <*> unVar dotParam)+  let moveDot a b = do+        pos <- evalBezier <$> readVar dotPath <*> pure 1+        writeVar dotPath $ QuadBezier pos a b+        writeVar dotParam 0+        tweenVar dotParam 5 $ \v -> fromToS v 1 . curveS 2+        wait 1+  wait 1+  moveDot (Point 0 1)    (Point 4 2)+  moveDot (Point (-1) 0) (Point (-4) 3)+  moveDot (Point (0) 0)  (Point (-4) (-3))+  moveDot (Point (0) 0)  (Point (5) (-2))+  moveDot (Point (6) 2)  (Point 2 1)+  moveDot (Point (0) 0)  (Point 0 0)++redDot :: Point Double -> SVG+redDot (Point x y) = translate x y $ mkGroup+  [ translate 0 (-0.5) $ scale 0.5 $ outlinedText $ T.pack $ printf "%.1f,%.1f" x y+  , withFillColor "red" $ mkCircle 0.1+  ]++static :: SVG+static = mkGroup+  [ grid+  , withStrokeColor "grey" $ mkLine (-screenWidth, 0) (screenWidth, 0)+  , withStrokeColor "grey" $ mkLine (0, -screenHeight) (0, screenHeight)+  , curlyBracket (V2 (-screenWidth / 2 + defaultStrokeWidth) (screenHeight / 2))+                 (V2 (screenWidth / 2 - defaultStrokeWidth) (screenHeight / 2))+                 1+  , translate 0 3 $ outlinedText "16 units"+  , curlyBracket (V2 (-screenWidth / 2) (-screenHeight / 2 + defaultStrokeWidth))+                 (V2 (-screenWidth / 2) (screenHeight / 2 - defaultStrokeWidth))+                 1+  , translate (-6.5) 0 $ rotate 90 $ outlinedText "9 units"+  ]++outlinedText :: Text -> SVG+outlinedText txt = mkGroup+  [ center+  $ withStrokeColorPixel rtfdBackgroundColor+  $ withStrokeWidth (defaultStrokeWidth * 8)+  $ withFillOpacity 0+  $ latex txt+  , center $ latex txt+  ]++curlyBracket :: RPoint -> RPoint -> Double -> SVG+curlyBracket from to height =+  withStrokeColor "black"+    $ withFillOpacity 0+    $ withStrokeWidth (defaultStrokeWidth * 2)+    $ mkPath+        [ MoveTo OriginAbsolute [from]+        , CurveTo OriginAbsolute [(from + outwards, halfway, halfway + outwards)]+        , CurveTo OriginAbsolute [(halfway, to + outwards, to)]+        ]+ where+  outwards = case normalize (from - to) ^* height of+    V2 x y -> V2 (-y) x+  halfway = lerp 0.5 from to++grid :: SVG+grid = withStrokeColor "grey" $ withStrokeWidth (defaultStrokeWidth * 0.5) $ mkGroup+  [ mkGroup+    [ translate+          0+          (i / (screenHeight) * screenHeight - screenHeight / 2 - screenHeight / 18)+        $ mkLine (-screenWidth, 0) (screenWidth, 0)+    | i <- [0 .. screenHeight]+    ]+  , mkGroup+    [ translate (i / (screenWidth) * screenWidth - screenWidth / 2) 0+        $ mkLine (0, -screenHeight) (0, screenHeight)+    | i <- [0 .. screenWidth]+    ]+  ]+
+ examples/intro_canvas_square.golden view
@@ -0,0 +1,50 @@+0<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(0, 0)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">0.0,0.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">0.0,0.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+1<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(0.003729, 0.084499)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">0.0,0.1</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">0.0,0.1</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+2<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(0.05967, 0.315621)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">0.1,0.3</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">0.1,0.3</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+3<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(0.302079, 0.626237)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">0.3,0.6</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">0.3,0.6</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+4<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(0.871486, 0.884474)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">0.9,0.9</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">0.9,0.9</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+5<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(1.476536, 0.980182)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">1.5,1.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">1.5,1.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+6<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(1.889484, 0.999215)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">1.9,1.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">1.9,1.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+7<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(2, 1)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">2.0,1.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">2.0,1.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+8<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(2, 1)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">2.0,1.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">2.0,1.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+9<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(1.822773, 0.942273)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">1.8,0.9</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">1.8,0.9</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+10<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(1.192359, 0.762385)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">1.2,0.8</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">1.2,0.8</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+11<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(0.280577, 0.607114)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">0.3,0.6</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">0.3,0.6</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+12<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-0.563432, 0.719384)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-0.6,0.7</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-0.6,0.7</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+13<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-0.915365, 1.066639)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-0.9,1.1</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-0.9,1.1</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+14<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-0.995002, 1.381716)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-1.0,1.4</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-1.0,1.4</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+15<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-1, 1.5)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-1.0,1.5</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-1.0,1.5</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+16<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-1, 1.5)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-1.0,1.5</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-1.0,1.5</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+17<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-0.962721, 1.441871)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-1.0,1.4</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-1.0,1.4</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+18<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-0.803264, 1.118568)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-0.8,1.1</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-0.8,1.1</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+19<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-0.668736, 0.437344)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-0.7,0.4</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-0.7,0.4</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+20<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-0.841214, -0.718783)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-0.8,-0.7</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-0.8,-0.7</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+21<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-1.326875, -1.873233)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-1.3,-1.9</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-1.3,-1.9</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+22<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-1.785371, -2.668646)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-1.8,-2.7</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-1.8,-2.7</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+23<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-1.99667, -2.995003)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-2.0,-3.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-2.0,-3.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+24<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-2, -3)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-2.0,-3.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-2.0,-3.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+25<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-1.95676, -2.935693)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-2.0,-2.9</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-2.0,-2.9</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+26<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-1.606642, -2.454803)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-1.6,-2.5</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-1.6,-2.5</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+27<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(-0.88403, -1.672032)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">-0.9,-1.7</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">-0.9,-1.7</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+28<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(0.252131, -0.946846)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">0.3,-0.9</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">0.3,-0.9</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+29<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(1.378655, -0.751675)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">1.4,-0.8</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">1.4,-0.8</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+30<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(2.134695, -0.874464)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">2.1,-0.9</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">2.1,-0.9</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+31<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(2.47985, -0.992002)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">2.5,-1.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">2.5,-1.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+32<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(2.5, -1)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">2.5,-1.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">2.5,-1.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+33<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(2.504752, -0.976079)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">2.5,-1.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">2.5,-1.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+34<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(2.564981, -0.63384)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">2.6,-0.6</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">2.6,-0.6</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+35<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(2.624556, 0.009691)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">2.6,0.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">2.6,0.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+36<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(2.519384, 0.708376)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">2.5,0.7</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">2.5,0.7</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+37<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(2.152459, 1.054957)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">2.2,1.1</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">2.2,1.1</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+38<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(1.763263, 1.067315)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">1.8,1.1</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">1.8,1.1</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+39<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(1.528703, 1.009351)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">1.5,1.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">1.5,1.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+40<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(1.5, 1)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">1.5,1.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">1.5,1.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+41<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(1.496404, 0.997602)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">1.5,1.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">1.5,1.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+42<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(1.328855, 0.885904)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">1.3,0.9</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">1.3,0.9</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+43<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(0.953494, 0.635663)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">1.0,0.6</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">1.0,0.6</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+44<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(0.4822, 0.321467)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">0.5,0.3</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">0.5,0.3</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+45<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(0.135638, 0.090425)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">0.1,0.1</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">0.1,0.1</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+46<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(0.020179, 0.013453)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">0.0,0.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">0.0,0.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+47<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(0.000466, 0.000311)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">0.0,0.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">0.0,0.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+48<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(0, 0)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">0.0,0.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">0.0,0.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>+49<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g transform="translate(-8, -4.5)"><svg viewBox="-4 -4 8 8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="16" height="9" preserveAspectRatio="none">  <g>    <g stroke-width="0" fill="#FCFCFC" transform="translate(-8, -4.5)" fill-opacity="1">      <rect width="16" height="9" />    </g>    <g>      <g stroke-width="0.025" stroke="#808080">        <g>          <g transform="translate(0, -5)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -4)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, -1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 0)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 1)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 2)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 3)">            <line x1="-16" x2="16" />          </g>          <g transform="translate(0, 4)">            <line x1="-16" x2="16" />          </g>        </g>        <g>          <g transform="translate(-8, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(-1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(0, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(1, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(2, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(3, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(4, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(5, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(6, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(7, 0)">            <line y1="-9" y2="9" />          </g>          <g transform="translate(8, 0)">            <line y1="-9" y2="9" />          </g>        </g>      </g>      <line stroke="#808080" x1="-16" x2="16" />      <line stroke="#808080" y1="-9" y2="9" />      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-3.95,4 C-3.95,3 0,4 0,3 C0,4 3.95,3 3.95,4" />      <g transform="translate(0, 2.5)">        <g>          <g transform="translate(0, 0)">            <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>          <g transform="translate(0, 0)">            <g transform="scale(1, -1)" text-anchor="middle">              <text font-size="2">8 units</text>            </g>          </g>        </g>      </g>      <path stroke-width="0.1" stroke="#000000" fill-opacity="0" d="M-4,-3.95 C-3,-3.95 -4,0 -3,0 C-4,0 -3,3.95 -4,3.95" />      <g transform="translate(-2.5, 0)">        <g transform="rotate(90)">          <g>            <g transform="translate(0, 0)">              <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>            <g transform="translate(0, 0)">              <g transform="scale(1, -1)" text-anchor="middle">                <text font-size="2">8 units</text>              </g>            </g>          </g>        </g>      </g>    </g>    <g transform="translate(0, 0)">      <g>        <g transform="translate(0, -0.5)">          <g transform="scale(0.5)">            <g>              <g transform="translate(0, 0)">                <g stroke-width="0.4" stroke="#FCFCFC" transform="scale(1, -1)" fill-opacity="0" text-anchor="middle">                  <text font-size="2">0.0,0.0</text>                </g>              </g>              <g transform="translate(0, 0)">                <g transform="scale(1, -1)" text-anchor="middle">                  <text font-size="2">0.0,0.0</text>                </g>              </g>            </g>          </g>        </g>        <circle fill="#FF0000" r="0.1" />      </g>    </g>  </g></svg></g></g></svg>
+ examples/intro_canvas_square.hs view
@@ -0,0 +1,113 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+module Main+  ( main+  )+where++import           Reanimate+import           Reanimate.Builtin.Documentation+import           Linear.V2+import           Linear.Vector+import           Linear.Metric+import           Graphics.SvgTree                  hiding ( Text+                                                          , Point+                                                          , height+                                                          )+import           Data.Text                                ( Text )+import qualified Data.Text                     as T+import           Text.Printf+import           Geom2D.CubicBezier                       ( QuadBezier(..)+                                                          , evalBezier+                                                          , Point(..)+                                                          )++newWidth, newHeight :: Double+newWidth = 8+newHeight = 8++main :: IO ()+main = reanimate $ mapA squareViewBox $ sceneAnimation $ do+  newSpriteSVG_ $ mkBackgroundPixel rtfdBackgroundColor+  newSpriteSVG_ static+  dotPath  <- newVar (QuadBezier (Point 0 0) (Point 0 0) (Point 0 0))+  dotParam <- newVar 0+  newSprite_ $ redDot <$> (evalBezier <$> unVar dotPath <*> unVar dotParam)+  let moveDot a b = do+        pos <- evalBezier <$> readVar dotPath <*> pure 1+        writeVar dotPath $ QuadBezier pos a b+        writeVar dotParam 0+        tweenVar dotParam 5 $ \v -> fromToS v 1 . curveS 2+        wait 1+  moveDot (Point 0 1)     (Point 2 1)+  moveDot (Point (-1) 0)  (Point (-1) 1.5)+  moveDot (Point (0) 0)   (Point (-2) (-3))+  moveDot (Point (0) 0)   (Point (2.5) (-1))+  moveDot (Point (3) 1.5) (Point 1.5 1)+  moveDot (Point (0) 0)   (Point 0 0)++squareViewBox :: SVG -> SVG+squareViewBox = withViewBox (-4, -4, 8, 8)++redDot :: Point Double -> SVG+redDot (Point x y) = translate x y $ mkGroup+  [ translate 0 (-0.5) $ scale 0.5 $ outlinedText $ T.pack $ printf "%.1f,%.1f" x y+  , withFillColor "red" $ mkCircle 0.1+  ]++static :: SVG+static = mkGroup+  [ grid+  , withStrokeColor "grey" $ mkLine (-screenWidth, 0) (screenWidth, 0)+  , withStrokeColor "grey" $ mkLine (0, -screenHeight) (0, screenHeight)+  , curlyBracket (V2 (-newWidth / 2 + defaultStrokeWidth) (newHeight / 2))+                 (V2 (newWidth / 2 - defaultStrokeWidth) (newHeight / 2))+                 1+  , translate 0 2.5 $ outlinedText "8 units"+  , curlyBracket (V2 (-newWidth / 2) (-newHeight / 2 + defaultStrokeWidth))+                 (V2 (-newWidth / 2) (newHeight / 2 - defaultStrokeWidth))+                 1+  , translate (-2.5) 0 $ rotate 90 $ outlinedText "8 units"+  ]++outlinedText :: Text -> SVG+outlinedText txt = mkGroup+  [ center+  $ withStrokeColorPixel rtfdBackgroundColor+  $ withStrokeWidth (defaultStrokeWidth * 8)+  $ withFillOpacity 0+  $ latex txt+  , center $ latex txt+  ]++curlyBracket :: RPoint -> RPoint -> Double -> SVG+curlyBracket from to height =+  withStrokeColor "black"+    $ withFillOpacity 0+    $ withStrokeWidth (defaultStrokeWidth * 2)+    $ mkPath+        [ MoveTo OriginAbsolute [from]+        , CurveTo OriginAbsolute [(from + outwards, halfway, halfway + outwards)]+        , CurveTo OriginAbsolute [(halfway, to + outwards, to)]+        ]+ where+  outwards = case normalize (from - to) ^* height of+    V2 x y -> V2 (-y) x+  halfway = lerp 0.5 from to++grid :: SVG+grid = withStrokeColor "grey" $ withStrokeWidth (defaultStrokeWidth * 0.5) $ mkGroup+  [ mkGroup+    [ translate+          0+          (i / (screenHeight) * screenHeight - screenHeight / 2 - screenHeight / 18)+        $ mkLine (-screenWidth, 0) (screenWidth, 0)+    | i <- [0 .. screenHeight]+    ]+  , mkGroup+    [ translate (i / (screenWidth) * screenWidth - screenWidth / 2) 0+        $ mkLine (0, -screenHeight) (0, screenHeight)+    | i <- [0 .. screenWidth]+    ]+  ]
+ examples/intro_hello.golden view
@@ -0,0 +1,50 @@+0<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+1<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+2<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+3<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+4<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+5<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+6<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+7<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+8<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+9<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+10<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+11<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+12<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+13<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+14<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+15<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+16<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+17<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+18<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+19<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+20<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+21<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+22<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+23<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+24<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+25<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+26<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+27<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+28<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+29<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+30<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+31<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+32<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+33<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+34<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+35<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+36<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+37<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+38<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+39<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+40<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+41<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+42<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+43<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+44<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+45<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+46<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+47<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+48<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>+49<svg viewBox="-8 -4.5 16 9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" preserveAspectRatio="none"><g stroke-width="0.05" transform="scale(1, -1)"><g><g stroke-width="0" fill="#00FFFF" transform="translate(-8, -4.5)" fill-opacity="1"><rect width="16" height="9" /></g><g transform="scale(1, -1)" text-anchor="middle"><text font-size="2">Hello world</text></g></g></g></svg>
+ examples/intro_hello.hs view
@@ -0,0 +1,7 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+import           Reanimate++main :: IO ()+main = reanimate $ addStatic (mkBackground "cyan") $ staticFrame 1 $ mkText "Hello world"
+ examples/morphology_closest.hs view
@@ -0,0 +1,61 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ParallelListComp  #-}+module Main(main) where++import           Codec.Picture+import           Codec.Picture.Types+import           Control.Monad+import           Graphics.SvgTree         (LineJoin (..))+import           Reanimate+import           Reanimate.Morph.Common+import           Reanimate.Morph.Linear++bgColor :: PixelRGBA8+bgColor = PixelRGBA8 252 252 252 0xFF++main :: IO ()+main = reanimate $+  addStatic (mkBackgroundPixel bgColor) $+  mapA (withStrokeWidth defaultStrokeWidth) $+  mapA (withStrokeColor "black") $+  mapA (withStrokeLineJoin JoinRound) $+  mapA (withFillOpacity 1) $+    sceneAnimation $ do+      _ <- newSpriteSVG $+        withStrokeWidth 0 $ translate (-4) 4 $+        center $ latex "no-op"+      _ <- newSpriteSVG $+        withStrokeWidth 0 $ translate (4) 4 $+        center $ latex "closest"+      forM_ pairs $ uncurry showPair+  where+    showPair from to =+      waitOn $ do+        fork $ play $ mkAnimation 4 (morph rawLinear from to)+          # mapA (translate (-4) (-0.5))+          # signalA (curveS 4)+        fork $ play $ mkAnimation 4 (morph linear from to)+          # mapA (translate (4) (-0.5))+          # signalA (curveS 4)++    pairs = zip stages (tail stages ++ [head stages])+    stages = map (lowerTransformations . scale 8 . pathify . center) $ colorize+      [ latex "X"+      , latex "$\\aleph$"+      , latex "Y"+      , latex "$\\infty$"+      , latex "I"+      , latex "$\\pi$"+      , latex "1"+      , latex "S"+      , mkRect 0.5 0.5+      ]++colorize :: [SVG] -> [SVG]+colorize lst =+  [ withFillColorPixel (promotePixel $ parula (n/fromIntegral (length lst-1))) elt+  | elt <- lst+  | n <- [0..]+  ]
+ examples/morphology_color.hs view
@@ -0,0 +1,45 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ParallelListComp  #-}+module Main(main) where++import           Codec.Picture+import           Reanimate+import           Reanimate.Interpolate+import           Reanimate.Morph.Common+import           Reanimate.Morph.Linear++bgColor :: PixelRGBA8+bgColor = PixelRGBA8 252 252 252 0xFF++main :: IO ()+main = reanimate $+  addStatic (mkBackgroundPixel bgColor) $+  setDuration 5 $+  mapA (withStrokeWidth 0) $+  mapA (withFillOpacity 1) $+    sceneAnimation $ do+      doMorph yellow blue+      doMorph blue yellow+  where+    doMorph from to =+      play $ pauseAtEnd 0.5 $ animate $ \t ->+        mkGroup+          [ translate (-screenWidth/2 + screenWidth/6*(n*2+1)) 0 $ mkGroup+            [ translate 0 3 $ scale 1.5 $ center $ latex label+            , translate 0 (-0.5) $ morph conf from to t+            ]+          | conf <- [ linear+                    , linear{morphColorComponents=xyzComponents}+                    , linear{morphColorComponents=hsvComponents}]+          | label <- ["LAB", "XYZ", "HSV"]+          | n <- [0..]+          ]+    radius = 2.5+    yellow = withFillColor "yellow" $ mkCircle radius+    blue   = withFillColor "blue" $ mkCircle radius+    -- green  = withFillColor "green" $ mkCircle radius+    -- pink   = withFillColor "pink" $ mkCircle radius+    -- red    = withFillColor "red" $ mkCircle radius+    -- purple = withFillColor "purple" $ mkCircle radius
+ examples/morphology_intro.hs view
@@ -0,0 +1,36 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ParallelListComp  #-}+module Main(main) where++import           Codec.Picture+import           Reanimate+import           Reanimate.Morph.Common+import           Reanimate.Morph.Linear++bgColor :: PixelRGBA8+bgColor = PixelRGBA8 252 252 252 0xFF++main :: IO ()+main = reanimate $+  addStatic (mkBackgroundPixel bgColor) $+  mapA (withStrokeWidth 0) $+  mapA (withStrokeColor "black") $+  mapA (withFillOpacity 1) $+    sceneAnimation $ do+      play $ step stage1 stage2+      play $ step stage2 stage3+      play $ step stage3 stage4+      play $ step stage4 stage1+        # setDuration 5+  where+    radius = 2.5+    step from to =+      signalA (curveS 4) $ animate $ morph linear from to+    stage1 = translate (-3) 0 $ withFillColor "red" $ mkCircle radius+    stage2 = translate 3 0 $ withFillColor "blue" $ mkRect (radius*2) (radius*2)+    stage3 = mkGroup+      [translate (-1) (-1) $ withFillColor "green" $ mkRect (radius*0.5) (radius*0.5)+      ,translate 1 (1) $ withFillColor "black" $ mkRect (radius*0.5) (radius*0.5) ]+    stage4 = translate (-3) 0 $ withFillColor "purple" $ mkCircle (radius*0.24)
+ examples/morphology_leastwork.hs view
@@ -0,0 +1,69 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ParallelListComp  #-}+module Main(main) where++import           Codec.Picture+import           Codec.Picture.Types+import           Control.Monad+import           Graphics.SvgTree          (LineJoin (..))+import           Reanimate+import           Reanimate.Morph.Common+import           Reanimate.Morph.LeastWork+import           Reanimate.Morph.Linear++bgColor :: PixelRGBA8+bgColor = PixelRGBA8 252 252 252 0xFF++main :: IO ()+main = reanimate $+  addStatic (mkBackgroundPixel bgColor) $+  mapA (withStrokeWidth defaultStrokeWidth) $+  mapA (withStrokeColor "black") $+  mapA (withStrokeLineJoin JoinRound) $+  mapA (withFillOpacity 1) $+    sceneAnimation $ do+      _ <- newSpriteSVG $+        withStrokeWidth 0 $ translate (-3) 4 $+        center $ latex "linear"+      _ <- newSpriteSVG $+        withStrokeWidth 0 $ translate (3) 4 $+        center $ latex "least-work"+      forM_ pairs $ uncurry showPair+  where+    showPair from to =+      waitOn $ do+        fork $ play $ mkAnimation 4 (morph linear from to)+          # mapA (translate (-3) (-0.5))+          # signalA (curveS 4)+        fork $ play $ mkAnimation 4 (morph myMorph from to)+          # mapA (translate (3) (-0.5))+          # signalA (curveS 4)++    stretchCosts = defaultStretchCosts+      { stretchStiffness = 2 }+    bendCosts = defaultBendCosts+    myMorph = linear{morphPointCorrespondence = leastWork stretchCosts bendCosts }+    pairs = zip stages (tail stages ++ [head stages])+    stages = map (lowerTransformations . scale 6 . pathify . center) $ colorize+      [ latex "X"+      , latex "$\\aleph$"+      , latex "Y"+      , latex "$\\infty$"+      , latex "I"+      , latex "$\\pi$"+      , latex "1"+      , latex "T"+      , latex "I"+      , latex "L"+      , latex "S"+      , mkRect 0.5 0.5+      ]++colorize :: [SVG] -> [SVG]+colorize lst =+  [ withFillColorPixel (promotePixel $ parula (n/fromIntegral (length lst-1))) elt+  | elt <- lst+  | n <- [0..]+  ]
+ examples/morphology_linear.hs view
@@ -0,0 +1,60 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ParallelListComp  #-}+module Main(main) where++import           Codec.Picture+import           Codec.Picture.Types+import           Graphics.SvgTree         (LineJoin (..))+import           Reanimate+import           Reanimate.Morph.Common+import           Reanimate.Morph.Linear++bgColor :: PixelRGBA8+bgColor = PixelRGBA8 252 252 252 0xFF++main :: IO ()+main = reanimate $+  addStatic (mkBackgroundPixel bgColor) $+  mapA (withStrokeWidth defaultStrokeWidth) $+  mapA (withStrokeColor "black") $+  mapA (withStrokeLineJoin JoinRound) $+  mapA (withFillOpacity 1) $+    sceneAnimation $+      showPair (stages ++ take 1 stages)+  where+    showPair (from:to:rest) =+      waitOn $ do+        toS <- newSpriteSVG $+          translate (4) 0 to+        spriteE toS $ overBeginning 0.2 fadeInE+        spriteE toS $ overEnding 0.2 fadeOutE+        m <- fork $ newSpriteA $ animate (morph linear from to)+          # signalA (curveS 4)+          # mapA (translate (-4) 0)+        wait 4+        destroySprite m+        destroySprite toS+        showPair (to:rest)+        return ()+    showPair _ = return ()++    stages = map (lowerTransformations . scale 8 . pathify . center) $ colorize+      [ latex "X"+      , latex "$\\aleph$"+      , latex "Y"+      , latex "$\\infty$"+      , latex "I"+      , latex "$\\pi$"+      , latex "1"+      , latex "S"+      , mkRect 0.5 0.5+      ]++colorize :: [SVG] -> [SVG]+colorize lst =+  [ withFillColorPixel (promotePixel $ parula (n/fromIntegral (length lst-1))) elt+  | elt <- lst+  | n <- [0..]+  ]
+ examples/morphology_linebend.hs view
@@ -0,0 +1,63 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ParallelListComp  #-}+module Main(main) where++import           Codec.Picture+import           Codec.Picture.Types+import           Control.Monad+import           Graphics.SvgTree         (LineJoin (..))+import           Reanimate+import           Reanimate.Morph.Common+import           Reanimate.Morph.Linear+import           Reanimate.Morph.LineBend++bgColor :: PixelRGBA8+bgColor = PixelRGBA8 252 252 252 0xFF++main :: IO ()+main = reanimate $+  addStatic (mkBackgroundPixel bgColor) $+  mapA (withStrokeWidth defaultStrokeWidth) $+  mapA (withStrokeColor "black") $+  mapA (withStrokeLineJoin JoinRound) $+  mapA (withFillOpacity 1) $+    sceneAnimation $ do+      _ <- newSpriteSVG $+        withStrokeWidth 0 $ translate (-3) 4 $+        center $ latex "linear"+      _ <- newSpriteSVG $+        withStrokeWidth 0 $ translate (3) 4 $+        center $ latex "line bend"+      forM_ pairs $ uncurry showPair+  where+    showPair from to =+      waitOn $ do+        fork $ play $ mkAnimation 4 (morph linear from to)+          # mapA (translate (-3) (-0.5))+          # signalA (curveS 4)+        fork $ play $ mkAnimation 4 (morph myMorph from to)+          # mapA (translate (3) (-0.5))+          # signalA (curveS 4)++    myMorph = linear{morphTrajectory = lineBend }+    pairs = zip stages (tail stages ++ [head stages])+    stages = map (lowerTransformations . scale 6 . pathify . center) $ colorize+      [ latex "X"+      , latex "$\\aleph$"+      , latex "Y"+      , latex "$\\infty$"+      , latex "I"+      , latex "$\\pi$"+      , latex "1"+      , latex "S"+      , mkRect 0.5 0.5+      ]++colorize :: [SVG] -> [SVG]+colorize lst =+  [ withFillColorPixel (promotePixel $ parula (n/fromIntegral (length lst-1))) elt+  | elt <- lst+  | n <- [0..]+  ]
+ examples/morphology_linebend_intro.hs view
@@ -0,0 +1,100 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ParallelListComp  #-}+module Main(main) where++import           Codec.Picture+import           Control.Monad+import           Data.List                (transpose)+import qualified Data.Vector              as V+import           Graphics.SvgTree         (LineJoin (..))+import           Linear.V2+import           Reanimate+import           Reanimate.Math.Polygon+import           Reanimate.Morph.Common+import           Reanimate.Morph.Linear+import           Reanimate.Morph.LineBend++bgColor :: PixelRGBA8+bgColor = PixelRGBA8 252 252 252 0xFF++spike1 :: Polygon+spike1 = pScale 2.5 $ mkPolygon $ V.map (\x -> x - V2 1 1) $ V.fromList+  [ V2 0 0, V2 2 0+  , V2 2 1 ]++spike2 :: Polygon+spike2 = pScale 2.5 $ mkPolygon $ V.map (\x -> x - V2 1 1) $ V.fromList+  [ V2 0 0, V2 2 0+  , V2 0 1 ]++spike3 :: Polygon+spike3 = pScale 2.5 $ mkPolygon $ V.map (\x -> x - V2 1 1) $ V.fromList+  [ V2 0.5 0, V2 1.5 0+  , V2 1 2 ]++polygonShape :: Polygon -> SVG+polygonShape p = mkLinePathClosed+  [ (x,y) | V2 x y <- map (fmap realToFrac) $ V.toList (polygonPoints p) ]+++main :: IO ()+main = reanimate $+  addStatic (mkBackgroundPixel bgColor) $+  mapA (withStrokeWidth defaultStrokeWidth) $+  mapA (withStrokeColor "black") $+  mapA (withStrokeLineJoin JoinRound) $+  mapA (withFillOpacity 1) $+    sceneAnimation $ do+      _ <- newSpriteSVG $+        withStrokeWidth 0 $ translate (-4) 4 $+        center $ latex "linear"+      _ <- newSpriteSVG $+        withStrokeWidth 0 $ translate (4) 4 $+        center $ latex "line bend"+      showTrails+      forM_ pairs $ uncurry showPair+  where+    showTrails = do+      _ <- newSpriteSVG $+            translate (-4) (-0.5) $+            genTrails (map linearTrajectory pairs)+      _ <- newSpriteSVG $+            translate (4) (-0.5) $+            genTrails (map lineBend pairs)+      return ()+    showPair from to =+      waitOn $ do+        fork $ play $ mkAnimation 4 (morph linear (polygonShape from) (polygonShape to))+          # mapA (translate (-4) (-0.5))+          # mapA (withFillColor "lightgreen")+          # signalA (curveS 4)+        fork $ play $ mkAnimation 4 (morph myMorph (polygonShape from) (polygonShape to))+          # mapA (translate (4) (-0.5))+          # mapA (withFillColor "cyan")+          # signalA (curveS 4)+    myMorph = linear{morphTrajectory = lineBend }+    pairs = zip stages (tail stages ++ [head stages])+    stages =+      [ spike1+      , spike2+      , spike3+      ]++genTrails :: [(Double -> Polygon)] -> SVG+genTrails plotters =+    withFillOpacity 0 $+    withStrokeWidth (defaultStrokeWidth*0.5) $+    withStrokeColor "black" $+    withStrokeDashArray [0.1,0.05] $+    mkGroup $ map mkTrail $ transpose $ concat+      [+        [ V.toList $ V.map (fmap realToFrac) (polygonPoints poly)+        | n <- [0..steps]+        , let poly = plotter (fromIntegral n / fromIntegral steps)+        ]+      | plotter <- plotters ]+  where+    steps = 100 :: Int+    mkTrail lst = mkLinePath [ (x,y) | V2 x y <- lst ]
+ examples/morphology_object_correspondence.hs view
@@ -0,0 +1,59 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ParallelListComp  #-}+module Main(main) where++import           Codec.Picture+import           Reanimate+import           Reanimate.Morph.Common+import           Reanimate.Morph.Linear++bgColor :: PixelRGBA8+bgColor = PixelRGBA8 252 252 252 0xFF++main :: IO ()+main = reanimate $+  addStatic (mkBackgroundPixel bgColor) $+  mapA (withStrokeWidth 0) $+  mapA (withStrokeColor "black") $+  mapA (withFillOpacity 1) $+    sceneAnimation $ do+      let showLabel label = do+            fork $ play $ staticFrame 4 (center $ latex label)+              # mapA (translate 0 4)+              # applyE (overBeginning 0.1 fadeInE)+              # applyE (overEnding 0.1 fadeOutE)+      let sides = mkGroup+            [ translate (-4) 0 $ withFillColor "blue" $+              mkCircle 2+            , translate 4 0 $ withFillColor "green" $+              mkCircle 2]+          middle =+            withFillColor "red" $+            mkRect 4 4++      showLabel "Cut"+      play $ step sides middle+        # pauseAtEnd 1+      play $ step middle sides+        # pauseAtEnd 1++      showLabel "Overlap"+      play $ stepDup sides middle+        # pauseAtEnd 1+      play $ stepDup middle sides+        # pauseAtEnd 1++      showLabel "Obliterate"+      play $ stepGenesis sides middle+        # pauseAtEnd 1+      play $ stepGenesis middle sides+        # pauseAtEnd 1+  where+    step from to =+      signalA (curveS 2) $ animate $ morph linear from to+    stepDup from to =+      signalA (curveS 2) $ animate $ morph linear{morphObjectCorrespondence=dupObjectCorrespondence} from to+    stepGenesis from to =+      signalA (curveS 2) $ animate $ morph linear{morphObjectCorrespondence=genesisObjectCorrespondence} from to
+ examples/morphology_point_correspondence.hs view
@@ -0,0 +1,100 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ParallelListComp  #-}+module Main(main) where++import           Codec.Picture+import           Codec.Picture.Types+import           Control.Monad                   (replicateM_)+import qualified Data.Text                       as T+import qualified Data.Vector                     as V+import           Linear.V2+import           Linear.Vector+import           Reanimate+import           Reanimate.Math.Polygon+import           Reanimate.Morph.Common+import           Reanimate.Morph.Linear++bgColor :: PixelRGBA8+bgColor = PixelRGBA8 252 252 252 0xFF++main :: IO ()+main = reanimate $+  addStatic (mkBackgroundPixel bgColor) $+  mapA (withStrokeWidth 0) $+  mapA (withStrokeColor "black") $+  mapA (withFillOpacity 1) $+    sceneAnimation $ do+      let pl1 = translate (-4) 0 $ mkGroup+            [ lowerTransformations $ scale 3 $ withFillOpacity 1 $+              withStrokeColor "black" $+              withStrokeWidth defaultStrokeWidth $+              withFillColor "lightgreen" $+              polygonShape octogon+            , lowerTransformations $ scale 3 $ polygonNumDots octogon 0+            ]+          pl2 n t = translate 4 0 $ lowerTransformations $ scale 3 $ mkGroup+            [ withFillOpacity 1 $+              withStrokeColor "black" $+              withStrokeWidth defaultStrokeWidth $+              withFillColor "cyan" $+              polygonShape (pSetOffset star n)+            , polygonNumDots (pSetOffset star n) t ]+      offset <- newVar 0+      slide <- newVar 0+      _ <- newSprite $ pl2 <$> unVar offset <*> unVar slide+      _ <- newSpriteSVG $ pl1+      let slideLeft = do+            tweenVar slide 1 $ \v -> fromToS v 1 . curveS 4+            writeVar slide 0+            modifyVar offset succ+      replicateM_ 8 $ do+        offsetVal <- readVar offset+        play $ step pl1 (pl2 offsetVal 0)+          # setDuration 3+        slideLeft+  where+    step from to =+      signalA (curveS 2) $ animate $ morph rawLinear from to++octogon :: Polygon+octogon = mkPolygon $ V.fromList+  [ realToFrac <$> V2 (cos phi) (sin phi)+  | n <- [0..7]+  , let phi = n*2*pi/8 + pi/8 :: Double+  ]++star :: Polygon+star = pScale 0.5 $ mkPolygon $ V.fromList+  [ V2 0 1, V2 (-2) 2, V2 (-1) 0+  , V2 (-2) (-2), V2 0 (-1), V2 2 (-2)+  , V2 1 0, V2 2 2 ]++genColor :: Int -> Int -> PixelRGBA8+genColor n m =+    promotePixel $ parula (fromIntegral (n+offset) / fromIntegral (m+offset))+  where+    offset = 5++polygonNumDots :: Polygon -> Double -> SVG+polygonNumDots p t = mkGroup $ reverse+    [ mkGroup+      [ colored n $ withStrokeWidth (defaultStrokeWidth*0.5) $ withStrokeColor "black" $+        translate x y $ pathify $ mkCircle circR+      , withFillColor "black" $+        translate x y $ ppNum n ]+    | n <- [0..pSize p-1]+    , let a = realToFrac <$> pAccess p n+          b = realToFrac <$> pAccess p (pNext p n)+          V2 x y = lerp t b a ]+  where+    circR = 0.1+    colored n =+      let c = genColor n (pSize p-1)+      in withFillColorPixel c+    ppNum n = scaleToHeight (circR*1.5) $ center $ latex $ T.pack $ "\\texttt{" ++ show n ++ "}"++polygonShape :: Polygon -> SVG+polygonShape p = mkLinePathClosed+  [ (x,y) | V2 x y <- map (fmap realToFrac) $ V.toList (polygonPoints p) ]
+ examples/morphology_point_trajectory.hs view
@@ -0,0 +1,320 @@+#!/usr/bin/env stack+-- stack --resolver lts-15.04 runghc --package reanimate+module Main where++import           Codec.Picture.Types+import           Control.Lens+import           Control.Monad+import           Data.List+import           Data.Maybe+import qualified Data.Text                     as T+import           Data.Tuple+import qualified Data.Vector                   as V+import           Linear.V2+import           Linear.Vector+import qualified Numeric.LinearAlgebra         as Matrix+import           Numeric.LinearAlgebra.HMatrix (Matrix, linearSolve, toLists,+                                                (><))+import           Reanimate+import           Reanimate.Math.Common+import           Reanimate.Math.Polygon++bgColor :: PixelRGBA8+bgColor = PixelRGBA8 252 252 252 0xFF++type Points = V.Vector (V2 Double)+type Edges = [(Int, Int, Int)]+data Mesh = Mesh { meshPoints :: Points, meshEdges :: Edges }+data MeshPair = MeshPair Points Points Edges+-- The points in a RelMesh are:+--   relMeshStatic ++ x where Ax = B+data RelMesh = RelMesh+  { relMeshStatic :: Points+  , relMeshEdges  :: Edges+  , relMeshA      :: Matrix Double+  , relMeshB      :: Matrix Double+  }+data RelMeshPair = RelMeshPair Points Edges (Matrix Double) (Matrix Double) (Matrix Double) (Matrix Double)+-- Linear interpolation on RelMesh gives smooth morph.+-- solveMesh :: RelMesh -> Mesh+-- mkRelative :: Mesh -> RelMesh+-- mkRelativePair :: MeshPair -> RelMeshPair+-- triangulate :: Polygon -> Polygon -> MeshPair ?+-- embed :: MeshPair -> MeshPair+-- compatible :: Mesh -> Mesh -> Maybe MeshPair+-- linearInterpolate :: MeshPair -> Double -> Mesh+-- convexInterpolate :: RelMeshPair -> Double -> RelMesh++meshToPolygon :: Mesh -> Polygon+meshToPolygon mesh = pScale 2 $ mkPolygon $ V.fromList+    [ realToFrac <$> (meshPoints mesh V.! (n-1))+    | n <- polygonNodes ]+  where+    polygonNodes :: [Int]+    polygonNodes = [5,8,9,7,4,6]++main :: IO ()+main = reanimate morphAnimation++genTrails :: (Double -> Mesh) -> SVG+genTrails mkMesh =+    withFillOpacity 0 $+    withStrokeWidth (defaultStrokeWidth*0.5) $+    withStrokeColor "black" $+    withStrokeDashArray [0.1,0.1] $+    mkGroup $ map mkTrail $ transpose+      [ V.toList $ V.map (fmap realToFrac) $ polygonPoints $ meshToPolygon mesh+      | n <- [0..steps]+      , let mesh = mkMesh (fromIntegral n / fromIntegral steps)+      ]+  where+    steps = 100 :: Int+    mkTrail lst =mkLinePath [ (x,y) | V2 x y <- lst ]++morphAnimation :: Animation+morphAnimation = playThenReverseA $ pauseAround 1 1 $ addStatic (mkBackgroundPixel bgColor) $+  signalA (curveS 2) $ mkAnimation 5 $ \t -> lowerTransformations $ scale 3 $ pathify $+  mkGroup+  [ translate (-1.5) 0 $ withFillColor "lightgreen" $ mkGroup+    [ withStrokeWidth defaultStrokeWidth $+      withStrokeColor "black" $+      polygonShape $ meshToPolygon $ linearInterpolate meshPair t+    , linearTrails+    , polygonNumDots (meshToPolygon $ linearInterpolate meshPair t) 0+    ]+  , translate 1 0 $ withFillColor "cyan" $ mkGroup+    [ withStrokeWidth defaultStrokeWidth $+      withStrokeColor "black" $+      polygonShape $ meshToPolygon $ solveMesh $ convexInterpolate relPair t+    , curveTrails+    , polygonNumDots (meshToPolygon $ solveMesh $ convexInterpolate relPair t) 0+    ]+  ]+  where+    linearTrails = genTrails (linearInterpolate meshPair)+    curveTrails = genTrails (solveMesh . convexInterpolate relPair)+    relPair = mkRelativePair meshPair+    meshPair = fromJust $ compatible example1 example2++mkLineP :: P -> P -> SVG+mkLineP (V2 x1 y1) (V2 x2 y2) = mkLine (x1,y1) (x2,y2)++-- FIXME: Check that the triangles are all anticlockwise.+-- FIXME: Check that the edges connect all the points.+-- FIXME: Check that the edgse leave no gaps.+compatible :: Mesh -> Mesh -> Maybe MeshPair+compatible a b =+  if meshEdges a == meshEdges b && V.length (meshPoints a) == V.length (meshPoints b)+    then Just $ MeshPair (meshPoints a) (meshPoints b) (meshEdges a)+    else Nothing++linearInterpolate :: MeshPair -> Double -> Mesh+linearInterpolate (MeshPair aP bP edges) t = Mesh+    { meshPoints = V.zipWith (lerp (1-t)) aP bP+    , meshEdges = edges }++example1 :: Mesh+example1 = Mesh points edges+  where+    points = V.fromList+      [ V2 1 0+      , V2 (-1/2) (sqrt 3 / 2)+      , V2 (-1/2) (-sqrt 3 / 2)+      , 3 * points V.! 0 ^/ 4+      , 3 * points V.! 1 ^/ 4+      , 3 * points V.! 2 ^/ 4+      , points V.! 0 ^/ 2+      , points V.! 1 ^/ 2+      , points V.! 2 ^/ 2+      ]+    edges =+      [ (1,5,4), (1,2,5), (2,6,5), (2,3,6), (3,4,6), (3,1,4)+      , (4,8,7), (4,5,8), (5,9,8), (5,6,9), (6,7,9), (6,4,7), (7,8,9)]++example2 :: Mesh+example2 = Mesh points edges+  where+    points = V.fromList+      [ V2 1 0+      , V2 (-1/2) (sqrt 3 / 2)+      , V2 (-1/2) (-sqrt 3 / 2)+      , 3 * points V.! 2 ^/ 4+      , 3 * points V.! 0 ^/ 4+      , 3 * points V.! 1 ^/ 4+      , points V.! 1  ^/ 2+      , points V.! 2 ^/ 2+      , points V.! 0 ^/ 2+      ]+    edges = meshEdges example1++-- T = (U, G)+-- G = [Polygon]+-- U = nub $ concat G++findStarNeighbours :: Eq a => [(a,a,a)] -> a -> [(a, a)]+findStarNeighbours allTrig self =+  [ (b,c)+  | (a,b,c) <- allTrig+  , self == a+  ] +++  [ (c,a)+  | (a,b,c) <- allTrig+  , self == b+  ] +++  [ (a,b)+  | (a,b,c) <- allTrig+  , self == c+  ]++isInterior :: Eq a => [(a, a)] -> Bool+isInterior = isJust . getExteriorPoly++getExteriorPoly :: Eq a => [(a, a)] -> Maybe [a]+getExteriorPoly [] = Nothing+getExteriorPoly ((a,b):rest) = worker [a] a b rest+  where+    worker acc start this [] = do+      guard (start == this)+      return (reverse acc)+    worker acc start this xs =+      case lookup this xs of+        Just next -> worker (this:acc) start next (delete (this,next) xs)+        Nothing   ->+          case lookup this (map swap xs) of+            Just next -> worker (this:acc) start next (delete (next, this) xs)+            Nothing   -> Nothing++convexInterpolate :: RelMeshPair -> Double -> RelMesh+convexInterpolate (RelMeshPair static edges leftM leftB rightM rightB) t =+  RelMesh+  { relMeshStatic = static+  , relMeshEdges  = edges+  , relMeshA      = Matrix.scale (1-t) leftM ++                    Matrix.scale t rightM+  , relMeshB      = Matrix.scale (1-t) leftB ++                    Matrix.scale t rightB+  }++solveMesh :: RelMesh -> Mesh+solveMesh (RelMesh static edges m b) =+  case linearSolve m b of+    Nothing -> error "Failed to solve mesh"+    Just ret ->+      Mesh (static <> V.fromList (worker (toLists ret))) edges+  where+    worker []             = []+    worker ([x]:[y]:rest) = V2 x y : worker rest+    worker _              = error "invalid result"++mkRelative :: Mesh -> RelMesh+mkRelative (Mesh points edges) = RelMesh (V.fromList exteriorPoints) edges mM bM+  where+    mM = (s><s) (concat m)+    bM = (s><1) b+    (s,exterior, (m, b)) = toParameters points edges+    exteriorPoints =+      [ points V.! (i-1)+      | i <- exterior+      ]++mkRelativePair :: MeshPair -> RelMeshPair+mkRelativePair (MeshPair p1 p2 edges) =+  let RelMesh static _ leftM leftB = mkRelative (Mesh p1 edges)+      RelMesh _ _ rightM rightB = mkRelative (Mesh p2 edges)+  in RelMeshPair static edges leftM leftB rightM rightB++toParameters :: (Ord b, Fractional b) => V.Vector (V2 b) -> [(Int, Int, Int)] -> (Int, [Int], ([[b]], [b]))+toParameters points groups = (length interior*2,exterior,unzip $ concat+  [ let lst = [(if i == j then -1 else t)+              | j <- interior+              , let t = fromMaybe 0 $ lookup (i,j) lam_ij_cache+              ]+        pos = negate $ sum+           [ pj ^* t+           | j <- exterior+           , let t = fromMaybe 0 $ lookup (i,j) lam_ij_cache+                 pj = points V.! (j-1)+           ]+    in [ (dupX lst, pos ^. _x)+       , (dupY lst, pos ^. _y)]+  | i <- interior ])+  where+    lam_ij_cache = lam_ij points groups+    dupX []     = []+    dupX (x:xs) = x:0:dupX xs+    dupY []     = []+    dupY (x:xs) = 0:x:dupY xs+    (interior, exterior) =+      partition (isInterior . findStarNeighbours groups) [1 .. length points]++lam_ij :: (Ord b, Fractional b) => V.Vector (V2 b) -> [(Int, Int, Int)] -> [((Int, Int), b)]+lam_ij points groups =+  [ ((i, j), t)+  | i <- [1..V.length points]+  , (j, t) <- lam_j points groups i+  ]++lam_j :: (Ord b, Fractional b) => V.Vector (V2 b) -> [(Int, Int, Int)] -> Int -> [(Int, b)]+lam_j points groups p =+  [ (nP, sum [ t | (j,_k,t) <- mu, j == nP ] / fromIntegral (length nPoints))+  | let n = findStarNeighbours groups p+        nPoints = fromMaybe [] $ getExteriorPoly n+        mu = calcMu points groups p+  , nP <- nPoints ]++calcMu :: (Ord c, Fractional c) => V.Vector (V2 c) -> [(Int, Int, Int)] -> Int -> [(Int, Int, c)]+calcMu points groups p = concat+    [ [ (nP, nP, t1)+      , (a, nP, t2)+      , (b, nP, t3) ]+      -- (nP, a, b)+    | {-p <- [1..length points]-}+      let selfVert = points V.! (p-1)+          n = findStarNeighbours groups p+          nPoints :: [Int]+          nPoints = fromMaybe [] $ getExteriorPoly n+    , nP <- nPoints+    , let vert = points V.! (nP-1)+    , let line = (vert, selfVert)+    , let (a,b,aP,bP) = head $+            [ (_a,_b,_aP,_bP)+            | (_a,_b) <- n+            , let _aP = points V.! (_a-1)+                  _bP = points V.! (_b-1)+                  segment = (points V.! (_a-1), points V.! (_b-1))+            , case rayIntersect line segment of+                Nothing -> False+                Just u  -> isBetween u segment+            , _a /= nP+            , _b /= nP ]+    -- , b == (nPoints ++ nPoints) !! i+    , let (t1,t2,t3) = barycentricCoords vert aP bP selfVert+    ]++genColor :: Int -> Int -> PixelRGBA8+genColor n m =+    promotePixel $ parula (fromIntegral (n+offset) / fromIntegral (m+offset))+  where+    offset = 5++polygonNumDots :: Polygon -> Double -> SVG+polygonNumDots p t = mkGroup $ reverse+    [ mkGroup+      [ colored n $ withStrokeWidth (defaultStrokeWidth*0.5) $ withStrokeColor "black" $+        translate x y $ mkCircle circR+      , withFillColor "black" $+        translate x y $ ppNum n ]+    | n <- [0..pSize p-1]+    , let a = realToFrac <$> pAccess p n+          b = realToFrac <$> pAccess p (pNext p n)+          V2 x y = lerp t b a ]+  where+    circR = 0.1+    colored n =+      let c = genColor n (pSize p-1)+      in withFillColorPixel c+    ppNum n = scaleToHeight (circR*1.5) $ center $ latex $ T.pack $ "\\texttt{" ++ show n ++ "}"++polygonShape :: Polygon -> SVG+polygonShape p = mkLinePathClosed+  [ (x,y) | V2 x y <- map (fmap realToFrac) $ V.toList (polygonPoints p) ]
+ examples/morphology_rotational.hs view
@@ -0,0 +1,63 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ParallelListComp  #-}+module Main(main) where++import           Codec.Picture+import           Codec.Picture.Types+import           Control.Monad+import           Graphics.SvgTree (LineJoin(..))+import           Reanimate+import           Reanimate.Morph.Common+import           Reanimate.Morph.Linear+import           Reanimate.Morph.Rotational++bgColor :: PixelRGBA8+bgColor = PixelRGBA8 252 252 252 0xFF++main :: IO ()+main = reanimate $+  addStatic (mkBackgroundPixel bgColor) $+  mapA (withStrokeWidth defaultStrokeWidth) $+  mapA (withStrokeColor "black") $+  mapA (withStrokeLineJoin JoinRound) $+  mapA (withFillOpacity 1) $+    sceneAnimation $ do+      _ <- newSpriteSVG $+        withStrokeWidth 0 $ translate (-3) 4 $+        center $ latex "linear"+      _ <- newSpriteSVG $+        withStrokeWidth 0 $ translate (3) 4 $+        center $ latex "rotational"+      forM_ pairs $ uncurry showPair+  where+    showPair from to =+      waitOn $ do+        fork $ play $ mkAnimation 4 (morph linear from to)+          # mapA (translate (-3) (-0.5))+          # signalA (curveS 4)+        fork $ play $ mkAnimation 4 (morph myMorph from to)+          # mapA (translate (3) (-0.5))+          # signalA (curveS 4)+    myMorph = linear{morphTrajectory = rotationalTrajectory origin }+    origin = (0.5, 0.5)+    pairs = zip stages (tail stages ++ [head stages])+    stages = map (lowerTransformations . scale 6 . pathify . center) $ colorize+      [ latex "X"+      , latex "$\\aleph$"+      , latex "Y"+      , latex "$\\infty$"+      , latex "I"+      , latex "$\\pi$"+      , latex "1"+      , latex "S"+      , mkRect 0.5 0.5+      ]++colorize :: [SVG] -> [SVG]+colorize lst =+  [ withFillColorPixel (promotePixel $ parula (n/fromIntegral (length lst-1))) elt+  | elt <- lst+  | n <- [0..]+  ]
+ examples/morphology_rotational_intro.hs view
@@ -0,0 +1,125 @@+#!/usr/bin/env stack+-- stack runghc --package reanimate+{-# LANGUAGE ApplicativeDo     #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ParallelListComp  #-}+module Main(main) where++import           Codec.Picture+import           Data.List                  (transpose)+import qualified Data.Vector                as V+import           Graphics.SvgTree           (LineJoin (..))+import           Linear.V2+import           Linear.Vector+import           Reanimate+import           Reanimate.Math.Polygon+import           Reanimate.Morph.Common+import           Reanimate.Morph.Linear+import           Reanimate.Morph.Rotational++bgColor :: PixelRGBA8+bgColor = PixelRGBA8 252 252 252 0xFF++spike1 :: Polygon+spike1 = pScale 2.5 $ mkPolygon $ V.map (\x -> x - V2 1 1) $ V.fromList+  [ V2 0 0, V2 2 0+  , V2 2 1 ]++spike2 :: Polygon+spike2 = pScale 2.5 $ mkPolygon $ V.map (\x -> x - V2 1 1) $ V.fromList+  [ V2 0 0, V2 2 0+  , V2 0 1 ]++polygonShape :: Polygon -> SVG+polygonShape p = mkLinePathClosed+  [ (x,y) | V2 x y <- map (fmap realToFrac) $ V.toList (polygonPoints p) ]+++main :: IO ()+main = reanimate $+  addStatic (mkBackgroundPixel bgColor) $+  mapA (withStrokeWidth defaultStrokeWidth) $+  mapA (withStrokeColor "black") $+  mapA (withStrokeLineJoin JoinRound) $+  mapA (withFillOpacity 1) $+    sceneAnimation $ do+      _ <- newSpriteSVG $+        withStrokeWidth 0 $ translate (-4) 4 $+        center $ latex "linear"+      _ <- newSpriteSVG $+        withStrokeWidth 0 $ translate (4) 4 $+        center $ latex "rotational"+      originVar <- newVar (0.5, 0.5)++      showTrails originVar++      let pushLeft newOrigin = do+            fork $ tweenVar originVar 0.5 $ \(x,y) t ->+                let t' = curveS 2 t in+                (fromToS x (fst newOrigin) t', fromToS y (snd newOrigin) t')+            showPair originVar spike1 spike2+          pushRight newOrigin = do+                fork $ tweenVar originVar 0.5 $ \(x,y) t ->+                    let t' = curveS 2 t in+                    (fromToS x (fst newOrigin) t', fromToS y (snd newOrigin) t')+                showPair originVar spike2 spike1++      pushLeft (1, 0.5)+      pushRight (0.1, 0.95)+      pushLeft (0.5, 1)+      pushRight (0.5, 2)+      pushLeft (-0.3, -0.2)+      pushRight (0.5, 0.5)+  where+    showTrails originVar = do+      _ <- newSpriteSVG $+            translate (-4) (-0.5) $+            genTrails (map linearTrajectory [(spike1, spike2)])+      _ <- newSprite $ do+            origin <- unVar originVar+            pure $+              translate (4) (-0.5) $+              genTrails (map (rotationalTrajectory origin) [(spike1, spike2)])+      return ()+    showPair originVar from to =+      waitOn $ do+        fork $ play $ mkAnimation 2 (morph linear (polygonShape from) (polygonShape to))+          # mapA (translate (-4) (-0.5))+          # mapA (withFillColor "lightgreen")+          # signalA (curveS 4)+        s <- fork $ newSprite $ do+          origin <- unVar originVar+          t <- spriteT+          d <- spriteDuration+          pure $+            let localTime = curveS 4 (t/d)+                myMorph = linear{morphTrajectory = rotationalTrajectory origin }+                originSrc = polygonOrigin from origin+                originDst = polygonOrigin to origin+                V2 originX originY = lerp localTime originDst originSrc+            in+            translate (4) (-0.5) $ mkGroup+            [ withFillColor "cyan" $+              morph myMorph (polygonShape from) (polygonShape to) localTime+            , withFillColor "red" $ translate originX originY $+              mkCircle 0.1+            ]+        wait 2+        destroySprite s++genTrails :: [(Double -> Polygon)] -> SVG+genTrails plotters =+    withFillOpacity 0 $+    withStrokeWidth (defaultStrokeWidth*0.5) $+    withStrokeColor "black" $+    withStrokeDashArray [0.1,0.05] $+    mkGroup $ map mkTrail $ transpose $ concat+      [+        [ V.toList $ V.map (fmap realToFrac) (polygonPoints poly)+        | n <- [0..steps]+        , let poly = plotter (fromIntegral n / fromIntegral steps)+        ]+      | plotter <- plotters ]+  where+    steps = 100 :: Int+    mkTrail lst = mkLinePath [ (x,y) | V2 x y <- lst ]
examples/signals.hs view
@@ -3,7 +3,6 @@ {-# LANGUAGE OverloadedStrings #-} module Main (main) where -import           Data.Monoid         ((<>)) import           Data.Text           (Text, pack) import           Graphics.SvgTree    hiding (Text) import           Numeric
+ examples/voice_transcript.hs view
@@ -0,0 +1,229 @@+#!/usr/bin/env stack+-- stack --resolver lts-15.04 runghc --package reanimate+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ApplicativeDo #-}+{-# LANGUAGE RecordWildCards #-}+module Main where++import           Codec.Picture.Types+import           Control.Monad+import           Data.Hashable+import           Data.Aeson+import           Data.Char+import           System.IO.Unsafe+import           Data.Function+import           Data.List+import           Data.Maybe+import           Data.Ratio+import qualified Data.Text                     as T+import           Data.Tuple+import qualified Data.Vector                   as V+import           Debug.Trace+import           Reanimate+import           Reanimate.Animation+import           Reanimate.Interpolate+import           Reanimate.Svg+import           Graphics.SvgTree                         ( Texture(..)+                                                          , ElementRef(..)+                                                          )++data Transcript = Transcript+  { transcriptText  :: T.Text+  , transcriptWords :: [TWord]+  } deriving (Show)++instance FromJSON Transcript where+  parseJSON =+    withObject "transcript" $ \o -> Transcript <$> o .: "transcript" <*> o .: "words"++data TWord = TWord+  { wordAligned     :: T.Text+  , wordCase        :: T.Text+  , wordStart       :: Double+  , wordStartOffset :: Int+  , wordEnd         :: Double+  , wordEndOffset   :: Int+  , wordPhones      :: [Phone]+  , wordReference   :: T.Text+  } deriving (Show)++instance FromJSON TWord where+  parseJSON = withObject "word" $ \o ->+    TWord+      <$> o+      .:? "alignedWord"+      .!= T.empty+      <*> o+      .:  "case"+      <*> o+      .:? "start"+      .!= 0+      <*> o+      .:  "startOffset"+      <*> o+      .:? "end"+      .!= 0+      <*> o+      .:  "endOffset"+      <*> o+      .:? "phones"+      .!= []+      <*> o+      .:  "word"++data Phone = Phone+  { phoneDuration :: Double+  , phoneType     :: T.Text+  } deriving (Show)++instance FromJSON Phone where+  parseJSON = withObject "phone" $ \o -> Phone <$> o .: "duration" <*> o .: "phone"++-- transcript :: Transcript+-- transcript = case unsafePerformIO (decodeFileStrict "voice_transcript.json") of+--   Nothing -> error "bad json"+--   Just t  -> t++transcript :: Transcript+transcript = fakeTranscript+  "Testing transcript.\n\n\+  \Second paragraph"++data Token = TokenWord Int Int T.Text | TokenComma | TokenPeriod | TokenParagraph+  deriving (Show)++lexText :: T.Text -> [Token]+lexText = worker 0+ where+  worker offset txt = case T.uncons txt of+    Nothing -> []+    Just (c, cs)+      | isSpace c+      -> let (w, rest) = T.span (=='\n') txt in+         if T.length w >= 2+           then TokenParagraph : worker (offset + T.length w) rest+           else worker (offset+1) cs+      | c == '.'+      -> TokenPeriod : worker (offset + 1) cs+      | c == ','+      -> TokenComma : worker (offset + 1) cs+      | isAlphaNum c+      -> let (w, rest) = T.span isAlphaNum txt+             newOffset = offset + T.length w+         in  TokenWord offset newOffset w : worker newOffset rest+      | otherwise+      -> worker (offset + 1) cs++fakeTranscript :: T.Text -> Transcript+fakeTranscript input = Transcript { transcriptText  = input+                                  , transcriptWords = worker 0 (lexText input)+                                  }+ where+  worker now []             = []+  worker now (token : rest) = case token of+    TokenWord start end w ->+      let duration = 60 / wpm+      in  TWord { wordAligned     = T.toLower w+                , wordCase        = "success"+                , wordStart       = now+                , wordStartOffset = 0+                , wordEnd         = now + duration+                , wordEndOffset   = 0+                , wordPhones      = []+                , wordReference   = w+                }+            : worker (now + duration) rest+    TokenComma -> worker (now + commaPause) rest+    TokenPeriod -> worker (now + periodPause) rest+    TokenParagraph -> worker (now + paragraphPause) rest+  wpm            = 130+  paragraphPause = 0.1+  commaPause     = 0.05+  periodPause    = 0.05++-- tweenVar :: Var s a -> Duration -> (a -> Time -> a) -> Scene s ()+-- interpolateRGBA8 :: ColorComponents -> PixelRGBA8 -> PixelRGBA8 -> (Double -> PixelRGBA8)+toColor :: String -> PixelRGBA8+toColor c = case mkColor c of+  ColorRef pixel -> pixel++main :: IO ()+main = reanimate $ sceneAnimation $ do+  newSpriteSVG_ $ mkBackground "black"+  let maskSVG =+        simplify $ withStrokeWidth 0 $ lowerTransformations $ center $ latex "Masked"+  -- newSpriteSVG $ maskSVG+  -- newSpriteA $ animate $ \t -> mkGroup+  --   [ maskedIn t maskSVG (withFillColor "blue" $ mkRect (svgWidth maskSVG) screenHeight)+  --   , maskedOut t maskSVG (withFillColor "white" $ mkRect (svgWidth maskSVG) screenHeight)+  --   ]+  newSpriteSVG $ withFillColor "grey" $ scale 0.8 $ center $ latex $ transcriptText+    transcript++  -- wait 10+  -- _ <- newSpriteSVG $ withStrokeWidth (defaultStrokeWidth*0.5) $+  --       withStrokeColor "white" $ mkLine (-screenWidth, 0) (screenWidth, 0)+  -- _ <- newSpriteSVG $ withStrokeWidth (defaultStrokeWidth*0.5) $+  --       withStrokeColor "white" $ mkLine (0, -screenHeight) (0,screenHeight)+  cOpacity <- newVar 0+  cFill    <- newVar $ toColor "black"+  let+    pushFill newColor = do+      prevColor <- readVar cFill+      tweenVar cFill 0.2+        $ \p t -> if t > 0+            then interpolateRGBA8 labComponents prevColor (toColor newColor) t+            else p+  c <- newSprite $ do+    o <- unVar cOpacity+    f <- unVar cFill+    pure+      $ withGroupOpacity o+      $ withStrokeColor "white"+      $ withFillColorPixel f+      $ translate 4 0+      $ mkCircle 1+  txtVar <- newVar (mkGroup [])+  t      <- newSprite $ do+    screenText <- unVar txtVar+    pure $ withFillColor "white" $ screenText+  -- waitOn $ forM_ (transcriptWords transcript) $ \TWord {..} ->+  --   fork $ when (wordCase == "success") $ do+  --     wait (wordStart - 0.1)+  --     when (wordReference == "circle") $ do+  --       wait (-0.1)+  --       tweenVar cOpacity 0.2 $ \v -> fromToS v 1+  --     when (wordReference == "red") $ pushFill "red"+  --     when (wordReference == "green") $ pushFill "green"+  --     when (wordReference == "blue") $ pushFill "blue"+  --     when (wordReference == "Cyan") $ pushFill "cyan"+  --     when (wordReference == "Purple") $ pushFill "purple"+  --     when (wordReference == "White") $ pushFill "white"+  --     writeVar txtVar $ alignText $ forceLayout wordReference+  wait 3+  return ()++maskedIn :: Double -> SVG -> SVG -> SVG+maskedIn t maskSVG targetSVG = mkGroup+  [ mkClipPath label $ removeGroups maskSVG+  , withClipPathRef (Ref label) $ translate (-svgWidth maskSVG * (1 - t)) 0 targetSVG+  ]+  where label = "word-mask-" ++ show (hash $ renderTree maskSVG)++maskedOut :: Double -> SVG -> SVG -> SVG+maskedOut t maskSVG targetSVG = mkGroup+  [ mkClipPath label $ removeGroups maskSVG+  , withClipPathRef (Ref label) $ translate (svgWidth maskSVG * t) 0 targetSVG+  ]+  where label = "word-mask-" ++ show (hash $ renderTree maskSVG)+++forceLayout txt =+  fst $ splitGlyphs [0, 1, 2, 3] (latex $ "\\fbox{\\phantom{TyhILW}}" <> txt)++alignText :: SVG -> SVG+alignText txt = translate 0 (svgHeight ref / 2) $ centerX txt+  where ref = latex "\\fbox{Thy}"++-- abc, width=14.92 height=7.02+-- Thy, width=32.73 height=8.95
reanimate.cabal view
@@ -3,7 +3,7 @@ --  see http://haskell.org/cabal/users-guide/  name:                reanimate-version:             0.3.1.0+version:             0.3.2.0 -- synopsis: -- description: license:             PublicDomain@@ -36,6 +36,11 @@     Type:      git     Location:  git://github.com/lemmih/reanimate.git +Flag hmatrix+  Description: Enable hmatrix dependency (requires blas and lapack)+  Default:     True+  Manual:      True+ Flag test   Description: Enable testing (requires stack)   Default:     False@@ -58,6 +63,24 @@                       -- Reanimate.Diagrams                       Reanimate.Transform                       Reanimate.Misc+                      Reanimate.Math.Common+                      Reanimate.Math.Polygon+                      Reanimate.Math.Triangulate+                      Reanimate.Math.DCEL+                      Reanimate.Math.EarClip+                      Reanimate.Math.Visibility+                      Reanimate.Math.SSSP+                      Reanimate.Math.Balloon+                      Reanimate.Math.Compatible+                      Reanimate.Math.Render+                      Reanimate.Math.Smooth+                      Reanimate.Morph.Common+                      Reanimate.Morph.Linear+                      Reanimate.Morph.Rotational+                      Reanimate.Morph.LeastWork+                      Reanimate.Morph.LineBend+                      Reanimate.Morph.Cache+                      Reanimate.Morph.Rigid                       Reanimate.Raster                       Reanimate.ColorMap                       Reanimate.ColorSpace@@ -89,12 +112,16 @@                        time, text, filepath, process, directory,                        containers, reanimate-svg >= 0.9.7.0, xml, bytestring, lens, linear, mtl, matrix,                        JuicyPixels, attoparsec, parallel,-                       cubicbezier, websockets,+                       cubicbezier, websockets >= 0.12.7.0,                        hashable, fsnotify, open-browser, random-shuffle, base64-bytestring,                        vector >= 0.12.0.0, colour, cassava, ansi-wl-pprint, here, temporary,                        optparse-applicative, chiphunk >= 0.1.2.1,-                       geojson, aeson >= 1.3.0.0-  ghc-options: -Wall+                       geojson, aeson >= 1.3.0.0,+                       split, fingertree, array, cereal, vector-space+  if flag(hmatrix) {+    build-depends: hmatrix >= 0.20.0.0+  }+  ghc-options: -Wall -fno-ignore-asserts  test-suite spec   type: exitcode-stdio-1.0@@ -102,16 +129,20 @@   default-language:   Haskell2010   other-modules:     UnitTests+    Properties+    Helpers   hs-source-dirs: test   if !flag(test) {     Buildable: False   }+  ghc-options: -w   build-depends:     base,     directory,     filepath,     bytestring, process,-    reanimate,-    QuickCheck >= 2.1.0,+    reanimate, vector, linear,+    QuickCheck >= 2.1.0, text,     tasty, tasty-golden, tasty-hunit,+    tasty-quickcheck,     ansi-wl-pprint
src/Reanimate.hs view
@@ -103,9 +103,11 @@   , spriteT           -- :: Frame s Time   , spriteDuration    -- :: Frame s Duration   , newSprite         -- :: Frame s SVG -> Scene s (Sprite s)+  , newSprite_        -- :: Frame s SVG -> Scene s ()   , newSpriteA        -- :: Animation -> Scene s (Sprite s)   , newSpriteA'       -- :: Sync -> Animation -> Scene s (Sprite s)   , newSpriteSVG      -- :: SVG -> Scene s (Sprite s)+  , newSpriteSVG_     -- :: SVG -> Scene s ()   , destroySprite     -- :: Sprite s -> Scene s ()   , applyVar          -- :: Var s a -> Sprite s -> (a -> SVG -> SVG) -> Scene s ()   , spriteModify      -- :: Sprite s -> Frame s ((SVG,ZIndex) -> (SVG, ZIndex)) -> Scene s ()
src/Reanimate/Cache.hs view
@@ -5,10 +5,12 @@   , cacheDiskSvg   , cacheDiskKey   , cacheDiskLines+  , encodeInt   ) where  import           Control.Exception import           Control.Monad       (unless)+import           Data.Bits import           Data.Hashable import           Data.IORef import           Data.Map            (Map)@@ -40,11 +42,11 @@       renameOrCopyFile tmp path     evaluate path -cacheDisk :: (T.Text -> Maybe a) -> (a -> T.Text) -> (Text -> IO a) -> (Text -> IO a)-cacheDisk parse render gen key = do+cacheDisk :: String -> (T.Text -> Maybe a) -> (a -> T.Text) -> (Text -> IO a) -> (Text -> IO a)+cacheDisk cacheType parse render gen key = do     root <- getXdgDirectory XdgCache "reanimate"     createDirectoryIfMissing True root-    let path = root </> show (hash key)+    let path = root </> encodeInt (hash key) <.> cacheType     hit <- doesFileExist path     if hit       then do@@ -55,7 +57,7 @@       else genCache root path   where     genCache root path = do-      (tmpPath, tmpHandle) <- openTempFile root (show (hash key))+      (tmpPath, tmpHandle) <- openTempFile root (encodeInt (hash key))       new <- gen key       T.hPutStr tmpHandle (render new)       hClose tmpHandle@@ -66,7 +68,7 @@ cacheDiskKey key gen = cacheDiskSvg (const gen) key  cacheDiskSvg :: (Text -> IO Tree) -> (Text -> IO Tree)-cacheDiskSvg = cacheDisk parse render+cacheDiskSvg = cacheDisk "svg" parse render   where     parse txt = case parseXML txt of       [Elem t] -> Just (unparse t)@@ -74,7 +76,7 @@     render = T.pack . renderTree  cacheDiskLines :: (Text -> IO [Text]) -> (Text -> IO [Text])-cacheDiskLines = cacheDisk parse render+cacheDiskLines = cacheDisk "txt" parse render   where     parse = Just . T.lines     render = T.unlines@@ -96,3 +98,14 @@         -- don't store the result.         None -> pure None         _    -> atomicModifyIORef cache (\m -> (Map.insert key svg m, svg))++encodeInt :: Int -> String+encodeInt i = worker (fromIntegral i) 60+  where+    worker :: Word -> Int -> String+    worker key sh+      | sh < 0 = []+      | otherwise =+        case (key `shiftR` sh) `mod` 64 of+          idx -> alphabet !! fromIntegral idx : worker key (sh-6)+    alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+$"
src/Reanimate/Driver.hs view
@@ -1,17 +1,23 @@+{-# LANGUAGE MultiWayIf      #-} {-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE MultiWayIf #-}-module Reanimate.Driver ( reanimate ) where+module Reanimate.Driver+  ( reanimate+  )+where -import           Control.Applicative      ((<|>))+import           Control.Applicative                      ( (<|>) ) import           Data.Maybe-import           Reanimate.Animation      (Animation)+import           Reanimate.Animation                      ( Animation ) import           Reanimate.Driver.Check import           Reanimate.Driver.CLI import           Reanimate.Driver.Compile import           Reanimate.Driver.Server import           Reanimate.Parameters-import           Reanimate.Render         (FPS, Format (..), Height, Width,-                                            render, renderSnippets, renderSvgs, selectRaster)+import           Reanimate.Render                         ( render+                                                          , renderSnippets+                                                          , renderSvgs+                                                          , selectRaster+                                                          ) import           System.Directory import           System.FilePath import           Text.Printf@@ -26,7 +32,7 @@  presetFPS :: Preset -> FPS presetFPS Youtube    = 60-presetFPS ExampleGif = 24+presetFPS ExampleGif = 25 presetFPS Quick      = 15 presetFPS MediumQ    = 30 presetFPS HighQ      = 30@@ -45,7 +51,7 @@  formatFPS :: Format -> FPS formatFPS RenderMp4  = 60-formatFPS RenderGif  = 24+formatFPS RenderGif  = 25 formatFPS RenderWebm = 60  formatWidth :: Format -> Width@@ -95,18 +101,19 @@ -} reanimate :: Animation -> IO () reanimate animation = do-  Options{..} <- getDriverOptions+  Options {..} <- getDriverOptions   case optsCommand of-    Raw        -> setFPS 60 >> renderSvgs animation-    Test       -> do+    Raw  -> setFPS 60 >> renderSvgs animation+    Test -> do       setNoExternals True       -- hSetBinaryMode stdout True       renderSnippets animation-    Check      -> checkEnvironment-    View       -> serve-    Render{..} -> do-      let fmt = guessParameter renderFormat (fmap presetFormat renderPreset) $-                case renderTarget of+    Check       -> checkEnvironment+    View        -> serve+    Render {..} -> do+      let fmt =+            guessParameter renderFormat (fmap presetFormat renderPreset)+              $ case renderTarget of                   -- Format guessed from output                   Just target -> case takeExtension target of                     ".mp4"  -> RenderMp4@@ -125,38 +132,54 @@             RenderWebm -> replaceExtension self "webm"         Just target -> makeAbsolute target -      let fps = guessParameter renderFPS (fmap presetFPS renderPreset) $ formatFPS fmt-          (width, height) =-            fromMaybe-              ( maybe (formatWidth fmt) presetWidth renderPreset-              , maybe (formatHeight fmt) presetHeight renderPreset )-              (userPreferredDimensions renderWidth renderHeight)+      let+        fps =+          guessParameter renderFPS (fmap presetFPS renderPreset) $ formatFPS fmt+        (width, height) = fromMaybe+          ( maybe (formatWidth fmt)  presetWidth  renderPreset+          , maybe (formatHeight fmt) presetHeight renderPreset+          )+          (userPreferredDimensions renderWidth renderHeight)        if renderCompile-        then-          compile-            ["render"-            ,"--fps", show fps-            ,"--width", show width-            ,"--height", show height-            ,"--format", showFormat fmt-            ,"--raster", showRaster renderRaster-            ,"--target", target-            ,"+RTS", "-N", "-RTS"]+        then compile+          [ "render"+          , "--fps"+          , show fps+          , "--width"+          , show width+          , "--height"+          , show height+          , "--format"+          , showFormat fmt+          , "--raster"+          , showRaster renderRaster+          , "--target"+          , target+          , "+RTS"+          , "-N"+          , "-RTS"+          ]         else do           raster <- selectRaster renderRaster           setRaster raster           setFPS fps           setWidth width           setHeight height-          printf "Animation options:\n\+          printf+            "Animation options:\n\                  \  fps:    %d\n\                  \  width:  %d\n\                  \  height: %d\n\                  \  fmt:    %s\n\                  \  target: %s\n\                  \  raster: %s\n"-            fps width height (showFormat fmt) target (show raster)+            fps+            width+            height+            (showFormat fmt)+            target+            (show raster)            render animation target raster fmt width height fps @@ -166,13 +189,14 @@  -- If user specifies exactly one dimension explicitly, calculate the other userPreferredDimensions :: Maybe Width -> Maybe Height -> Maybe (Width, Height)-userPreferredDimensions (Just width) (Just height)  = Just (width, height)-userPreferredDimensions (Just width) Nothing        = Just (width, makeEven $ width * 9 `div` 16)-userPreferredDimensions Nothing      (Just height)  = Just (makeEven $ height * 16 `div` 9, height)-userPreferredDimensions Nothing      Nothing        = Nothing+userPreferredDimensions (Just width) (Just height) = Just (width, height)+userPreferredDimensions (Just width) Nothing =+  Just (width, makeEven $ width * 9 `div` 16)+userPreferredDimensions Nothing (Just height) =+  Just (makeEven $ height * 16 `div` 9, height)+userPreferredDimensions Nothing Nothing = Nothing  -- Avoid ffmpeg failures "height not divisible by 2" makeEven :: Int -> Int-makeEven x-  | even x    = x-  | otherwise = x - 1+makeEven x | even x    = x+           | otherwise = x - 1
src/Reanimate/Driver/Server.hs view
@@ -47,7 +47,12 @@     unless hasConn openViewer    putStrLn "Listening..."-  runServerWith "127.0.0.1" 9161 opts $ \pending -> do+  let options = ServerOptions+        { serverHost = "127.0.0.1"+        , serverPort = 9161+        , serverConnectionOptions = opts+        , serverRequirePong = Nothing }+  runServerWithOptions options $ \pending -> do     putStrLn "New connection received."     hasConn <- swapMVar hasConnectionVar True     if hasConn
src/Reanimate/Interpolate.hs view
@@ -1,18 +1,20 @@ {-# LANGUAGE RecordWildCards #-} module Reanimate.Interpolate where -import Codec.Picture-import Data.Colour-import Data.Colour.CIE-import Data.Colour.CIE.Illuminant (d65)-import Data.Colour.SRGB-import Data.Colour.RGBSpace.HSV-import Data.Colour.RGBSpace-import Data.Fixed+import           Codec.Picture+import           Codec.Picture.Types+import           Data.Colour+import           Data.Colour.CIE+import           Data.Colour.CIE.Illuminant (d65)+import           Data.Colour.RGBSpace+import           Data.Colour.RGBSpace.HSV+import           Data.Colour.SRGB+import           Data.Fixed+import           Reanimate.Signal  data ColorComponents = ColorComponents   { colorUnpack :: Colour Double -> (Double, Double, Double)-  , colorPack :: Double -> Double -> Double -> Colour Double }+  , colorPack   :: Double -> Double -> Double -> Colour Double }  -- | > interpolate rgbComponents yellow blue --@@ -78,6 +80,15 @@  interpolateRGB8 :: ColorComponents -> PixelRGB8 -> PixelRGB8 -> (Double -> PixelRGB8) interpolateRGB8 comps from to = toRGB8 . interpolate comps (fromRGB8 from) (fromRGB8 to)++interpolateRGBA8 :: ColorComponents -> PixelRGBA8 -> PixelRGBA8 -> (Double -> PixelRGBA8)+interpolateRGBA8 comps from to = \t ->+  case interp t of+    PixelRGB8 r g b ->+      let alpha = fromToS (fromIntegral $ pixelOpacity from) (fromIntegral $ pixelOpacity to) t+      in PixelRGBA8 r g b (round alpha)+  where+    interp = interpolateRGB8 comps (dropTransparency from) (dropTransparency to)  toRGB8 :: Colour Double -> PixelRGB8 toRGB8 c = PixelRGB8 r g b
src/Reanimate/LaTeX.hs view
@@ -3,7 +3,6 @@ module Reanimate.LaTeX (latex,xelatex,latexAlign) where  import qualified Data.ByteString   as B-import           Data.Monoid ((<>)) import           Data.Text         (Text) import qualified Data.Text         as T import qualified Data.Text.IO      as T
+ src/Reanimate/Math/Balloon.hs view
@@ -0,0 +1,167 @@+{-# LANGUAGE MultiWayIf        #-}+{-# LANGUAGE OverloadedStrings #-}+module Reanimate.Math.Balloon where++import           Control.Lens+import qualified Data.Vector                as V+import           Graphics.SvgTree           (drawAttributes)+import           Linear.V2+import           Linear.Vector+import           Reanimate.Animation+import           Reanimate.Math.Common+import           Reanimate.Math.Polygon+import           Reanimate.Morph.Common     (toShapes)+import           Reanimate.Svg.Constructors++-- import           Debug.Trace++balloon :: SVG -> (Double -> SVG)+balloon = balloon' 0.01++balloon' :: Double -> SVG -> (Double -> SVG)+balloon' tol svg = \t ->+    mkGroup+    [ polygonShape (gen t) & drawAttributes .~ attr+    | (attr, gen) <- lst ]+  where+    polygonShape :: Polygon -> SVG+    polygonShape p = mkLinePathClosed+      [ (x,y) | V2 x y <- map (fmap realToFrac) $ V.toList (polygonPoints p) ]+    lst =+      [ (attr, balloonP $ shiftLongestDiameter poly)+      | (attr, poly) <- toShapes tol svg+      ]++-- x <= 1+-- diameter (balloonP x p) = diameter p * x+balloonP :: Polygon -> Double -> Polygon+balloonP p = \t ->+    let targetLength = d * t+        nodeVisible x = ds V.! x <= targetLength+        -- Move 'a' closer to 'target' such that the length from point 0 to 'a'+        -- is targetLength.+        moveCloser :: Int -> V2 Rational -> V2 Rational+        moveCloser target a =+          let targetDist = ds V.! target+              aDist = distance' (pAccess p target) a+              frac = min 1 $ realToFrac $ (targetLength - targetDist) / aDist+          in lerp frac a (pAccess p target)+        worker 0 = [pAccess p 0]+        worker a =+          let b = pNext p a in+          if nodeVisible a && nodeVisible b+            then (pAccess p a : pAccess p b : [])+            else+              chunkRight a b (pAccess p a) (pAccess p b) (fst $ getFunnel a b) +++              chunkCenter a b +++              chunkLeft a b (pAccess p a) (pAccess p b) (snd $ getFunnel a b)+        chunkRight ai bi a b (x:y:xs) =+          case rayIntersect (a,b) (pAccess p x,pAccess p y) of+            Just u ->+              if nodeVisible x+                then+                    map (moveCloser x) (split a u) +++                    chunkRight ai bi u b (y:xs)+                else chunkRight ai bi u b (y:xs)+            _ -> -- error $ "chunkRight: urk: " ++ show (ai,bi,x,y)+              if nodeVisible x+                then map (moveCloser x) [a]+                else []+        chunkRight _ai _bi _a _b _ = []+        chunkLeft ai bi a b (x:y:xs) =+          case rayIntersect (a,b) (pAccess p x,pAccess p y) of+            Just u ->+              if nodeVisible x+                then+                    chunkLeft ai bi a u (y:xs) +++                    map (moveCloser x) (split u b)+                else chunkLeft ai bi a u (y:xs)+            _ -> -- error $ "chunkLeft: urk: " ++ show (ai,bi, x,y)+              if nodeVisible x+                then map (moveCloser x) [b]+                else []+        chunkLeft _ai _bi _a _b _ = []+        chunkCenter a b =+          let (aF, bF) = getFunnel a b+              aP = pAccess p a+              bP = pAccess p b in+          case (reverse aF, reverse bF) of+            ([x], [_]) | nodeVisible x ->+                map (moveCloser x) (split aP bP)+            ([x], _:left:_) | nodeVisible x ->+              case rayIntersect (aP,bP) (pAccess p x,pAccess p left) of+                Just v  ->+                  map (moveCloser x) (split aP v)+                Nothing -> map (moveCloser x) [aP,bP]+            (x:right:_, [_]) | nodeVisible x ->+              case rayIntersect (aP,bP) (pAccess p x,pAccess p right) of+                Just u  -> map (moveCloser x) (split u bP)+                Nothing -> map (moveCloser x) [aP,bP] -- error $ "urk: " ++ show (a,b, right)+            (x:right:_, _:left:_) | nodeVisible x ->+              case rayIntersect (aP,bP) (pAccess p x,pAccess p right) of+                Just u ->+                  case rayIntersect (aP,bP) (pAccess p x,pAccess p left) of+                    Just v  -> map (moveCloser x) (split u v)+                    Nothing -> map (moveCloser x) [aP,bP]+                Nothing -> map (moveCloser x) [aP,bP]+            _ -> []+    in mkPolygon $ V.fromList $ clearDups $+        concatMap worker [0..pSize p-1]+  where+    clearDups (x:y:xs)+      | x == y = clearDups (x:xs)+    clearDups (x:xs) = x : clearDups xs+    clearDups [] = []++    getParents 0 = []+    getParents x =+      let parent = pParent p 0 x+      in parent : getParents parent+    getFunnel a b =+      let aP = getParents a+          bP = getParents b in+      (takeUntil (`elem` bP) aP+      ,takeUntil (`elem` aP) bP)+    split aP bP =+      let steps = 50 in+      [ lerp (t/steps) bP aP+      | t <- [0 .. steps]+      ]+    d = V.maximum ds+    ds = ssspDistances p++takeUntil :: (a -> Bool) -> [a] -> [a]+takeUntil _fn [] = []+takeUntil fn (x:xs)+  | fn x = [x]+  | otherwise = x : takeUntil fn xs++diameter :: Polygon -> Double+diameter p = V.maximum (ssspDistances p)++shiftLongestDiameter :: Polygon -> Polygon+shiftLongestDiameter p = findBest 0 p (pCycles p)+  where+    margin = 0.01+    findBest _score elt [] = elt+    findBest score elt (x:xs) =+      let newScore = diameter x in+      if+        | newScore-score > score * margin    -> findBest newScore x xs+        | score-newScore > newScore * margin -> findBest score elt xs+        | isTopLeft x elt                    -> findBest newScore x xs+        | otherwise                          -> findBest score elt xs+    isTopLeft a b =+      case pAccess a 0-pAccess b 0 of+        V2 x y -> y > x++-- Shortest distances from point 0 to all other points.+ssspDistances :: Polygon -> V.Vector Double+ssspDistances p = arr+  where+    arr = V.generate (pSize p) $ \i ->+      case i of+        0 -> 0+        _ ->+          let parent = pParent p 0 i in+          arr V.! parent + distance' (pAccess p i) (pAccess p parent)
+ src/Reanimate/Math/Common.hs view
@@ -0,0 +1,168 @@+module Reanimate.Math.Common+  ( -- * Ring+    Ring(..)+  , ringSize            -- :: Ring a -> Int+  , ringAccess          -- :: Ring a -> Int -> V2 a+  , ringClamp           -- :: Ring a -> Int -> Int+  , ringUnpack          -- :: Ring a -> Vector (V2 a)+  , ringPack            -- :: Vector (V2 a) -> Ring a+  , ringMap             -- :: (V2 a -> V2 b) -> Ring a -> Ring b+  , ringRayIntersect    -- :: Ring Rational -> (Int, Int) -> (Int,Int) -> Maybe (V2 Rational)+    -- * Math+  , area                -- :: Fractional a => V2 a -> V2 a -> V2 a -> a+  , area2X              -- :: Fractional a => V2 a -> V2 a -> V2 a -> a+  , epsilon             -- :: Fractional a => a+  , epsEq               -- :: (Ord a, Fractional a) => a -> a -> Bool+  , isLeftTurn          -- :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> Bool+  , isLeftTurnOrLinear  -- :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> Bool+  , isRightTurn         -- :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> Bool+  , isRightTurnOrLinear -- :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> Bool+  , direction           -- :: Fractional a => V2 a -> V2 a -> V2 a -> a+  , isInside            -- :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> V2 a -> Bool+  , barycentricCoords   -- :: Fractional a => V2 a -> V2 a -> V2 a -> V2 a -> (a, a, a)+  , rayIntersect        -- :: (Fractional a, Ord a) => (V2 a,V2 a) -> (V2 a,V2 a) -> Maybe (V2 a)+  , isBetween           -- :: (Ord a, Fractional a) => V2 a -> (V2 a, V2 a) -> Bool+  , lineIntersect       -- :: (Ord a, Fractional a) => (V2 a, V2 a) -> (V2 a, V2 a) -> Maybe (V2 a)+  , distSquared         -- :: (Fractional a) => V2 a -> V2 a -> a+  , approxDist          -- :: (Real a, Fractional a) => V2 a -> V2 a -> a+  , distance'           -- :: (Real a, Fractional a) => V2 a -> V2 a -> Double+  , triangleAngles      -- :: V2 Double -> V2 Double -> V2 Double -> (Double, Double, Double)+  ) where++import           Data.Vector    (Vector)+import qualified Data.Vector    as V+import           Linear.Matrix  (det33)+import           Linear.Metric+import           Linear.V2+import           Linear.V3+import           Linear.Vector++newtype Ring a = Ring (Vector (V2 a))++ringSize :: Ring a -> Int+ringSize (Ring v) = length v++ringAccess :: Ring a -> Int -> V2 a+ringAccess (Ring v) i = v V.! mod i (length v)++ringClamp :: Ring a -> Int -> Int+ringClamp (Ring v) i = mod i (length v)++ringUnpack :: Ring a -> Vector (V2 a)+ringUnpack (Ring v) = v++ringPack :: Vector (V2 a) -> Ring a+ringPack = Ring++ringMap :: (V2 a -> V2 b) -> Ring a -> Ring b+ringMap fn (Ring v) = Ring (V.map fn v)++ringRayIntersect :: Ring Rational -> (Int, Int) -> (Int,Int) -> Maybe (V2 Rational)+ringRayIntersect p (a,b) (c,d) =+  rayIntersect (ringAccess p a, ringAccess p b) (ringAccess p c, ringAccess p d)+++area :: Fractional a => V2 a -> V2 a -> V2 a -> a+area a b c = 1/2 * area2X a b c++area2X :: Fractional a => V2 a -> V2 a -> V2 a -> a+area2X (V2 a1 a2) (V2 b1 b2) (V2 c1 c2) =+  det33 (V3 (V3 a1 a2 1)+            (V3 b1 b2 1)+            (V3 c1 c2 1))++epsilon :: Fractional a => a+epsilon = 1e-9++epsEq :: (Ord a, Fractional a) => a -> a -> Bool+epsEq a b = abs (a-b) < epsilon++-- Left turn.+isLeftTurn :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> Bool+isLeftTurn p1 p2 p3 =+  let d = direction p1 p2 p3 in+  case compare d 0 of+    LT -> True+    EQ -> False -- colnear+    GT -> False++isLeftTurnOrLinear :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> Bool+isLeftTurnOrLinear p1 p2 p3 =+  let d = direction p1 p2 p3 in+  case compare d 0 of+    LT -> True+    EQ -> True -- colnear+    GT -> False++isRightTurn :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> Bool+isRightTurn a b c = not (isLeftTurnOrLinear a b c)++isRightTurnOrLinear :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> Bool+isRightTurnOrLinear a b c = not (isLeftTurn a b c)++direction :: Fractional a => V2 a -> V2 a -> V2 a -> a+direction p1 p2 p3 = crossZ (p3-p1) (p2-p1)++isInside :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> V2 a -> Bool+isInside a b c d =+    s >= 0 && s <= 1 && t >= 0 && t <= 1+  where+    (s, t, _) = barycentricCoords a b c d++barycentricCoords :: Fractional a => V2 a -> V2 a -> V2 a -> V2 a -> (a, a, a)+barycentricCoords (V2 x1 y1) (V2 x2 y2) (V2 x3 y3) (V2 x y) =+    (lam1, lam2, lam3)+  where+    lam1 = ((y2-y3)*(x-x3) + (x3 - x2)*(y-y3)) /+           ((y2-y3)*(x1-x3) + (x3-x2)*(y1-y3))+    lam2 = ((y3-y1)*(x-x3) + (x1-x3)*(y-y3)) /+           ((y2-y3)*(x1-x3) + (x3-x2)*(y1-y3))+    lam3 = 1 - lam1 - lam2+++{-# INLINE rayIntersect #-}+rayIntersect :: (Fractional a, Ord a) => (V2 a,V2 a) -> (V2 a,V2 a) -> Maybe (V2 a)+rayIntersect (V2 x1 y1,V2 x2 y2) (V2 x3 y3, V2 x4 y4)+  | yBot == 0 = Nothing+  | otherwise = Just $+    V2 (xTop/xBot) (yTop/yBot)+  where+    xTop = (x1*y2 - y1*x2)*(x3-x4) - (x1 - x2)*(x3*y4-y3*x4)+    xBot = (x1-x2)*(y3-y4)-(y1-y2)*(x3-x4)+    yTop = (x1*y2 - y1*x2)*(y3-y4) - (y1-y2)*(x3*y4-y3*x4)+    yBot = (x1-x2)*(y3-y4) - (y1-y2)*(x3-x4)++{-# INLINE isBetween #-}+isBetween :: (Ord a, Fractional a) => V2 a -> (V2 a, V2 a) -> Bool+isBetween (V2 x y) (V2 x1 y1, V2 x2 y2) =+  ((y1 > y) /= (y2 > y) || y == y1 || y == y2) && -- y is between y1 and y2+  ((x1 > x) /= (x2 > x) || x == x1 || x == x2)++{-# INLINE lineIntersect #-}+lineIntersect :: (Ord a, Fractional a) => (V2 a, V2 a) -> (V2 a, V2 a) -> Maybe (V2 a)+lineIntersect a b =+  case rayIntersect a b of+    Just u+      | isBetween u a && isBetween u b -> Just u+    _ -> Nothing++-- circleIntersect :: (Ord a, Fractional a) => (V2 a, V2 a) -> (V2 a, V2 a) -> [V2 a]++distSquared :: (Fractional a) => V2 a -> V2 a -> a+distSquared a b = quadrance (a ^-^ b)++approxDist :: (Real a, Fractional a) => V2 a -> V2 a -> a+approxDist a b = realToFrac (sqrt (realToFrac (distSquared a b) :: Double))++distance' :: (Real a, Fractional a) => V2 a -> V2 a -> Double+distance' a b = sqrt (realToFrac (distSquared a b))++-- sum of angles is always pi.+triangleAngles :: V2 Double -> V2 Double -> V2 Double -> (Double, Double, Double)+triangleAngles a b c =+    (findAngle (b-a) (c-a)+    ,findAngle (c-b) (a-b)+    ,findAngle (a-c) (b-c))+  where+    findAngle v1 v2 = abs (atan2 (crossZ v1 v2) (dot v1 v2))+    -- findAngle v1 v2 = acos (dot v1 v2 / (norm v1 * norm v2))
+ src/Reanimate/Math/Compatible.hs view
@@ -0,0 +1,284 @@+{-# LANGUAGE MultiWayIf #-}+module Reanimate.Math.Compatible where++import           Data.List+import           Data.Maybe+import           Data.Ord+import qualified Data.Vector                   as V+import           Linear.V2+import           Linear.Vector+import           Reanimate.Math.Common+import           Reanimate.Math.Polygon++import           Debug.Trace++mkSteinerPoints :: V2 Rational -> V2 Rational -> Int -> [V2 Rational]+mkSteinerPoints a b s_ = [ lerp (i/(s+1)) b a | i <- [1..s]]+  where+    s = fromIntegral s_++-- 0..i,j..n-1+-- i..j+split1Link :: Polygon -> Int -> Int -> Int -> (Polygon, Polygon)+split1Link p i j s | j < i = split1Link p j i s+split1Link p i j s =+    (mkPolygon $ V.fromList left+    ,mkPolygon $ V.fromList right)+  where+    n = pSize p+    sp = mkSteinerPoints (pAccess p i) (pAccess p j) s+    left = map (pAccess p) [0..i] ++ sp ++ map (pAccess p) [j..n-1]+    right = map (pAccess p) [i..j] ++ reverse sp++steiner2Link :: Polygon -> Int -> Int -> V2 Rational+steiner2Link p i j | j < i = steiner2Link p j i+steiner2Link p i j+    | isNeighbour = error "steiner2Link: Points are neighbours"+    | isParent    = error "steiner2Link: Points can directly see each other."+    | not (isStraightLine || isGrandparent || oneBendBetween p i j) =+      error $ "steiner2Link: Cannot construct 2-link chain between points: " ++ show (i,j,pParent p i j,pParent p i (pParent p i j))+    | otherwise =+      lerp 0.5 (fst vect) (intersects!!0)+  where+    distToV = approxDist (fst vect)+    isNeighbour = i == pNext p j || i == pPrev p j+    isParent = pParent p i j == i+    isGrandparent = pParent p i (pParent p i j) == i+    isStraightLine =+      direction+        (pAccess p j)+        (pAccess p $ pParent p i j)+        (pAccess p i) == 0+    intersects = sortOn distToV $+      snd vect :+      [ u+      | n <- [0..pSize p-1]+      , let edge = (pAccess p n, pAccess p $ pNext p n)+      , u <- case rayIntersect vect edge of+               Nothing -> []+               Just u  -> [u]+      , isBetween u edge+      , u /= fst vect+      , isForward vect u+      ]+    iP = pAdjustOffset p i+    jP = pAdjustOffset p j+    vect+      | isStraightLine =+          let p1 = lerp 0.5 (pAccess p i) (pAccess p j)+              p2 =+                case p1-pAccess p i of+                  V2 x y -> p1 + V2 (-y) x -- rotate 90 degrees.+          in (p1,p2)+      | otherwise = fromMaybe (error $ "No window overlap: " ++ show (isStraightLine, isGrandparent, oneBendBetween p i j)) $ listToMaybe $+        [ (p1, p1+(p2-p1) + (p3-p1))+        | (a,b) <- ssspWindows iP+        , (c,d) <- ssspWindows jP+        , (p1,p2,p3) <-+            if | a == c -> pure (a, b, d)+               | a == d -> pure (a, b, c)+               | b == c -> pure (b, a, d)+               | b == d -> pure (b, a, c)+               | otherwise -> []+        ]+    isForward (a,b) v =+      not (isBetween a (b,v))++-- 0..i,s,j..n-1+-- i..j,s+split2Link :: Polygon -> Int -> Int -> (Polygon, Polygon)+split2Link p i j | j < i = split2Link p j i+split2Link p i j =+    (mkPolygon $ V.fromList left+    ,mkPolygon $ V.fromList right)+  where+    s = steiner2Link p i j+    n = pSize p+    left = map (pAccess p) [0..i] ++ [s] ++ map (pAccess p) [j..n-1]+    right = map (pAccess p) [i..j] ++ [s]++data Link = OneLink | TwoLink++splitNLink :: Polygon -> Int -> [(Link,Int)] -> (Polygon, Polygon)+splitNLink p i js =+    (mkPolygon $ V.fromList left+    ,mkPolygon $ V.fromList right)+  where+    n = pSize p+    left = map (pAccess p) [0..i] ++ steiners ++ map (pAccess p) [j..n-1]+    right = map (pAccess p) [i..j] ++ reverse steiners+    j = snd (last js)+    steiners = splitNLinks p i js+-- 0, [(TwoLink,2),(OneLink,3)]+-- 0, [(OneLink,5),(TwoLink,3)]+splitNLinks :: Polygon -> Int -> [(Link,Int)] -> [V2 Rational]+splitNLinks _p _i [] = []+splitNLinks p i [(TwoLink,j)] = [steiner2Link p i j]+splitNLinks _p _i [(OneLink,_j)] = []+splitNLinks p i ((TwoLink,j):(OneLink,j'):xs) =+  let (l,r) = split2Link p i j+      p' = selectContains l r (pAccess p j')+      s = steiner2Link p i j+      sIdx = fromMaybe (error "missing steiner") $ V.elemIndex s (polygonPoints p')+  in s : splitNLinks p' sIdx ((TwoLink,j') : xs)+splitNLinks p i ((TwoLink,j):(TwoLink,j'):xs) =+  let (l,r) = split2Link p i j+      p' = selectContains l r (pAccess p j')+      s = steiner2Link p i j+      sIdx = fromMaybe (error "missing steiner") $ V.elemIndex s (polygonPoints p')+  in s : splitNLinks p' sIdx ((OneLink,j):(TwoLink,j') : xs)+splitNLinks p i ((OneLink,j):(TwoLink,j'):xs) =+  let (l,r) = split2Link p j j'+      p' = selectContains l r (pAccess p i)+      p'' = selectContains l r (pAccess p j')+      s = steiner2Link p j j'+      s' = steiner2Link p' i sIdx+      sIdx = fromMaybe (error "missing steiner sIdx") $ V.elemIndex s (polygonPoints p')+      sIdx' = fromMaybe (error "missing steiner sIdx'") $ V.elemIndex s' (polygonPoints p'')+  in s' : s : splitNLinks p'' sIdx' ((OneLink,j') : xs)+splitNLinks _p _i _ = error "splitNLinks: invalid input"++selectContains :: Polygon -> Polygon -> V2 Rational -> Polygon+selectContains p1 p2 elt+  | V.elem elt (polygonPoints p1) = p1+  | V.elem elt (polygonPoints p2) = p2+  | otherwise     = error "elt not member of either polygons"+-- [(P, Vis)] -> Polygon -> [P]+{-+If there is a 1-link path, connect it.+  Recurse into the two new polygon pairs.++If there is a 2-link path, connect it, possibly add bogus steiner point.+  Recurse into the two new polygon pairs.++If there is a n-link path, connect it, add bogus steiner points.+  Recurse into the two new polygon pairs.+-}++-- a 2 b 1 c+-- ab = 2-link of (a,b)+-- abc = 2-link of (cut-a-ab-b, c)+-- steps: a ab abc c+-- a, [(2,b), (1,c)]+-- [(ab, p1,p2)]++{-+, mkGroup+  [ withStrokeColor "green" $mkGroup+    [ mkLine (x1,y1) (x2,y2)+    , mkLine (x1',y1') (x2',y2') ]+  | (a,b) <- mWins+  , (i,j) <- oWins+  , a == i || a == j || b == i || b == j+  , not (sort [a,b] == sort [i,j])+  , let V2 x1 y1 = realToFrac <$> a+        V2 x2 y2 = realToFrac <$> b+        V2 x1' y1' = realToFrac <$> i+        V2 x2' y2' = realToFrac <$> j+  ]+-}++++type Points = V.Vector (V2 Rational)+type Edges = [(Int, Int, Int)]+data Mesh = Mesh { meshPoints :: Points, meshEdges :: Edges }+data MeshPair = MeshPair Points Points Edges+-- The points in a RelMesh are:+--   relMeshStatic ++ x where Ax = B+-- data RelMesh = RelMesh+--   { relMeshStatic :: Points+--   , relMeshEdges  :: Edges+--   , relMeshA      :: Matrix Double+--   , relMeshB      :: Matrix Double+--   }+-- data RelMeshPair = RelMeshPair Points Edges (Matrix Double) (Matrix Double) (Matrix Double) (Matrix Double)+--+--++-- Use SSSP to find 1-link connections+-- Compute visibility windows for each node+-- Check windows for ovelap, giving 2-link connections.+-- Use floyd to generate all other connections+-- (a,b,1)+-- (a,b,2)+-- floyd+compatiblyTriangulateP :: Polygon -> Polygon -> [(Polygon, Polygon)]+compatiblyTriangulateP a b+  | pSize a /= pSize b = error "polygon size mismatch"+  | otherwise = compatiblyTriangulateP' (pSetOffset a 0) (pSetOffset a 0) (pSetOffset b 0)++compatiblyTriangulateP' :: Polygon -> Polygon -> Polygon -> [(Polygon, Polygon)]+compatiblyTriangulateP' aOrigin a b+  | trace ("Polygon size: " ++ show (pSize a)) False = undefined+  | n == 3 = trace ("Done") $+    [(a,b)]+  | otherwise =+    case bestOneLink of+      Nothing ->+        case bestTwoLink of+          Nothing -> error $ "no 2-links"+          Just (nodeL, nodeR) -> trace (show ("two link"::String, toOriginIndex nodeL, toOriginIndex nodeR)) $+            let (aL, aR) =+                  if (nodeL, nodeR) `elem` aOneLink+                    then split1Link a nodeL nodeR 1+                    else split2Link a nodeL nodeR+                (bL, bR) =+                  if (nodeL, nodeR) `elem` bOneLink+                    then split1Link b nodeL nodeR 1+                    else split2Link b nodeL nodeR+            in compatiblyTriangulateP' aOrigin aL bL ++ compatiblyTriangulateP' aOrigin aR bR+      Just (nodeL,nodeR) -> trace (show ("one link"::String, toOriginIndex nodeL, toOriginIndex nodeR)) $+        let (aL, aR) = split1Link a nodeL nodeR 0+            (bL, bR) = split1Link b nodeL nodeR 0+        in compatiblyTriangulateP' aOrigin aL bL ++ compatiblyTriangulateP' aOrigin aR bR+  where+    toOriginIndex idx =+      (idx,fromMaybe (-1) (V.elemIndex (pAccess a idx) (polygonPoints aOrigin)) ++      polygonOffset aOrigin)+    n = pSize a+    bestOneLink = listToMaybe (sortOn (Down . nodeDist)+      (aOneLink `intersect` bOneLink))+    bestTwoLink = listToMaybe (sortOn (Down . nodeDist)+      ((aOneLink++aTwoLink) `intersect` (bOneLink++bTwoLink)))+    aOneLink = polygonOneLinks a+    bOneLink = polygonOneLinks b+    aTwoLink = polygonTwoLinks a+    bTwoLink = polygonTwoLinks b+    nodeDist (i,j) = min (j-i) (n-j+i)++oneBendBetween :: Polygon -> Int -> Int -> Bool+oneBendBetween _p _a _b = False+-- oneBendBetween p a b =+--     direction+--       (pAccess p b)+--       (pAccess p (pParent p a b))+--       (pAccess p $ obstructedBy b) == 0 &&+--     (pParent p a b) /= obstructedBy b+--   where+--     obstructedBy n =+--       case pParent p a n of+--         i -> if i == a then n else obstructedBy i++polygonTwoLinks :: Polygon -> [(Int,Int)]+polygonTwoLinks p =+  [ (i, j)+  | i <- [0 .. n-1]+  , j <- [i+2 .. n-1]+  , not (i==0 && j == n-1)+  , pParent p i j /= i -- check for 1-link+  , let isTwoLink = pParent p i (pParent p i j) == i+        isStraightLine = oneBendBetween p i j+  -- Points on a straight line should be 2-link even though they are not+  -- direct grandparents.+  , isTwoLink || isStraightLine+  ] where n = pSize p++polygonOneLinks :: Polygon -> [(Int,Int)]+polygonOneLinks p =+  [ (i, j)+  | i <- [0 .. pSize p-1]+  , j <- [i+2 .. pSize p-1]+  , not (i==0 && j == pSize p-1)+  , pParent p i j == i+  ]
+ src/Reanimate/Math/DCEL.hs view
@@ -0,0 +1,136 @@+{-# LANGUAGE RecordWildCards #-}+module Reanimate.Math.DCEL where+{-+import           Control.Applicative+import           Data.List.Split+import           Data.Vector           (Vector)+import qualified Data.Vector           as V+import           Linear.Matrix+import           Linear.V2+import           Linear.V3+import           Text.Printf++import           Reanimate.Math.Common++type EdgeIdx = Int+type VertexIdx = Int+type FaceIdx = Int++data DCEL = DCEL+  { dcelFaces    :: Vector EdgeIdx+  , dcelVertices :: Vector EdgeIdx+  , dcelEdges    :: Vector Edge+  , dcelPoints   :: Vector P+  } deriving (Show)++data Edge = Edge+  { edgeVertex :: VertexIdx+  , edgeFace   :: FaceIdx+  , edgeTwin   :: EdgeIdx+  , edgeNext   :: EdgeIdx+  , edgePrev   :: EdgeIdx+  } deriving (Show)++getPoint :: Int -> DCEL -> P+getPoint i DCEL{..} = dcelPoints V.! (i `mod` V.length dcelPoints)++dcelSize :: DCEL -> Int+dcelSize DCEL{..} = V.length dcelPoints++++isValidDCEL :: DCEL -> Maybe String+isValidDCEL DCEL{..} = foldr (<|>) empty $+  [ V.all (< V.length dcelEdges) dcelFaces ~> "Bad face"+  , V.all (< V.length dcelEdges) dcelVertices ~> "Bad vertice"+  , V.all (< V.length dcelEdges) (V.map edgeNext dcelEdges) ~> "Bad next"+  , V.all (< V.length dcelEdges) (V.map edgePrev dcelEdges) ~> "Bad prev"+  , V.all (< V.length dcelEdges) (V.map edgeTwin dcelEdges) ~> "Bad twin"+  , V.all (< V.length dcelPoints) (V.map edgeVertex dcelEdges) ~> "Bad edge vertex"+  , V.all (< V.length dcelFaces) (V.map edgeFace dcelEdges) ~> "Bad edge face"+  , V.length dcelVertices == V.length dcelPoints ~> "Vertex/Point mismatch"+  ]+  where+    infix 0 ~>+    True ~> _    = Nothing+    False ~> msg = Just msg++ppDCEL :: DCEL -> String+ppDCEL DCEL{..} =+  unlines+  [ "Faces: Edge"+  , unlines+    [ printf "%3d:  %3d" face edge+    | (face, edge) <- zip [0::Int .. ] (V.toList dcelFaces)+    ]+  , "Vertices: Edge"+  , unlines+    [ printf "%3d:     %3d" vertex edge+    | (vertex, edge) <- zip [0::Int ..] (V.toList dcelVertices)+    ]+  , "Edges: Vertex Face Twin Next Prev"+  , unlines+    [ printf "%3d:   %3d   %3d  %3d  %3d  %3d"+        edge edgeVertex edgeFace edgeTwin edgeNext edgePrev+    | (edge, Edge{..}) <- zip [0::Int ..] (V.toList dcelEdges)+    ]+  , "Points:"+  , unlines+    [ printf "%3d:  " (idx*chunkSize) +++      unwords [ printf "<%.1f,%.1f>" x y | V2 x y <- chunk ]+    | (idx, chunk) <- zip [0::Int ..] (chunksOf chunkSize (V.toList dcelPoints))+    ]+  ]+  where chunkSize = 5++emptyDCEL :: DCEL+emptyDCEL = undefined++{-+faces: [0,1] -- 0 is outside, 1 is inside.+vertices: [0..n-1]+edges:+  i: vertex=i+     face=1+     twin=i+n+     next=(i+1)%n+     prev=(i-1)%n+  i: j=i-n+     vertex=edge[j].prev.vertex+     face=0+     twin=j+     next=(j-1)%n + i+     prev=(j+1)%n +i+points: pts+-}+fromSimplePolygon :: [V2 Double] -> DCEL+fromSimplePolygon [] = error "empty polygon"+fromSimplePolygon pts | not (isCCW $ V.fromList pts) = error "Polygon not counter-clockwise"+fromSimplePolygon pts = DCEL+    { dcelFaces = V.fromList [0,1]+    , dcelVertices = V.fromList [0..n-1]+    , dcelEdges = V.fromList $+      [ Edge+        { edgeVertex = i+        , edgeFace = 1+        , edgeTwin = i+n+        , edgeNext = (i+1) `mod` n+        , edgePrev = (i-1) `mod` n }+      | i <- [0..n-1] ] +++      [ Edge+        { edgeVertex = (i-1) `mod` n+        , edgeFace = 0+        , edgeTwin = i+        , edgeNext = (i-1) `mod` n + i+        , edgePrev = (i-1) `mod` n + i }+      | i <- [0..n-1] ]+    , dcelPoints = V.fromList pts+    }+  where+    n = length pts++-- addEdge :: VertexIdx -> VertexIdx -> DCEL -> DCEL ->+-- addEdge a b dcel =+--   add edge, vertex=a, face=a+--   add twin+-}
+ src/Reanimate/Math/EarClip.hs view
@@ -0,0 +1,98 @@+module Reanimate.Math.EarClip+  ( earClip+  , earClip'+  , isEarCorner+  ) where++import           Data.List+import qualified Data.Set                   as Set++import           Reanimate.Math.Common+import           Reanimate.Math.Triangulate++-- import Debug.Trace++-- Triangulation by ear clipping. O(n^2)+earClip :: (Fractional a, Ord a) => Ring a -> Triangulation+earClip = last . earClip'++earClip' :: (Fractional a, Ord a) => Ring a -> [Triangulation]+earClip' p = map (edgesToTriangulation $ ringSize p) $ inits $+  let ears = Set.fromList [ i+             | i <- elts+             , isEarCorner p elts (mod (i-1) n) i (mod (i+1) n) ]+  in worker ears (mkQueue elts)+  where+    n = ringSize p+    elts = [0 .. n-1]+    -- worker :: Set.Set Int -> PolyQueue Int -> [(P,P)]+    worker _ears queue | isSimpleQ queue = []+    worker ears queue+      -- | trace (show (x, Set.member x ears)) False = undefined+      | x `Set.member` ears =+        let dq = dropQ queue+            v0 = prevQ 1 queue+            v1 = prevQ 0 queue+            v3 = peekQ dq+            v4 = peekQ (nextQ dq)+            e1 = if isEarCorner p (toList dq) v0 v1 v3+                  then Set.insert v1 ears+                  else Set.delete v1 ears+            e2 = if isEarCorner p (toList dq) v1 v3 v4+                  then Set.insert v3 e1+                  else Set.delete v3 e1+        in (v1,v3) : worker e2 dq+      | otherwise = worker ears (nextQ queue)+      where+        x = peekQ queue++data PolyQueue a = PolyQueue a [a] [a] [a]++-- sizeQ :: PolyQueue a -> Int+-- sizeQ (PolyQueue _ a b _) = 1 + length a + length b++mkQueue :: [a] -> PolyQueue a+mkQueue (x:xs) = PolyQueue x xs [] (reverse (x:xs))+mkQueue []     = error "mkQueue: empty"++toList :: PolyQueue a -> [a]+toList (PolyQueue e a b _) = e : a ++ b++isSimpleQ :: PolyQueue a -> Bool+isSimpleQ (PolyQueue _ xs ys _) =+  case xs ++ ys of+    [_,_] -> True+    _     -> False++peekQ :: PolyQueue a -> a+peekQ (PolyQueue e _ _ _) = e++nextQ :: PolyQueue a -> PolyQueue a+nextQ (PolyQueue x [] ys p)     =+  let (y:xs) = reverse (x:ys)+  in PolyQueue y xs [] (x:p)+nextQ (PolyQueue x (y:xs) ys p) = PolyQueue y xs (x:ys) (x:p)++dropQ :: PolyQueue a -> PolyQueue a+dropQ (PolyQueue _ [] ys p)    =+  let (x:xs) = reverse ys+  in PolyQueue x xs [] p+dropQ (PolyQueue _ (x:xs) ys p) = PolyQueue x xs ys p++prevQ :: Int -> PolyQueue a -> a+prevQ nth (PolyQueue _ _ _ p) = p!!nth++-- O(n)+-- Returns true if ac can be cut from polygon. That is, true if 'b' is an ear.+-- isEarCorner polygon a b c = True iff ac can be cut+isEarCorner :: (Fractional a, Ord a) => Ring a -> [Int] -> Int -> Int -> Int -> Bool+isEarCorner p polygon a b c =+    isLeftTurn aP bP cP &&+    -- If it is a right turn then the line ac will be outside the polygon+    and [ not (isInside aP bP cP (ringAccess p k))+    | k <- polygon, k /= a && k /= b && k /= c+    ]+  where+    aP = ringAccess p a+    bP = ringAccess p b+    cP = ringAccess p c
+ src/Reanimate/Math/Polygon.hs view
@@ -0,0 +1,693 @@+module Reanimate.Math.Polygon+  ( APolygon(..)+  , Polygon+  , FPolygon+  , P+  , mkPolygon     -- :: (Fractional a, Ord a) => V.Vector (V2 a) -> APolygon a+  , mkPolygonFromRing -- :: (Fractional a, Ord a) => Ring a -> APolygon a+  , pParent       -- :: Polygon -> Int -> Int -> Int+  , pSetOffset    -- :: APolygon a -> Int -> APolygon a+  , pAdjustOffset -- :: APolygon a -> Int -> APolygon a+  , pSize         -- :: APolygon a -> Int+  , pNull         -- :: APolygon a -> Bool+  , pNext         -- :: APolygon a -> Int -> Int+  , pPrev         -- :: APolygon a -> Int -> Int+  , pIsSimple     -- :: Polygon -> Bool+  , pIsConvex     -- :: Polygon -> Bool+  , pIsCCW        -- :: Polygon -> Bool+  , pScale        -- :: Rational -> Polygon -> Polygon+  , pAtCentroid   -- :: Polygon -> Polygon+  , pAtCenter     -- :: Polygon -> Polygon+  , pTranslate    -- :: V2 Rational -> Polygon -> Polygon+  , pCenter       -- :: Polygon -> V2 Rational+  , pBoundingBox  -- :: Polygon -> (Rational, Rational, Rational, Rational)+  , pIsInside     -- :: Polygon -> V2 Rational -> Bool+  , pAccess       -- :: APolygon a -> Int -> V2 a+  , pMkWinding    -- :: Int -> Polygon+  , pDeoverlap    -- :: Polygon -> Polygon+  , pCycles       -- :: Polygon -> [Polygon]+  , pCycle        -- :: (Real a, Fractional a, Ord a) => APolygon a -> Double -> APolygon a+  , pCentroid     -- :: Polygon -> V2 Rational+  , pMapEdges     -- :: (V2 Rational -> V2 Rational -> a) -> Polygon -> V.Vector a+  , pArea         -- :: Polygon -> Rational+  , pCircumference   -- :: (Real a, Fractional a) => APolygon a -> a+  , pCircumference'  -- :: (Real a, Fractional a) => APolygon a -> Double+  , pAddPoints       -- :: Int -> Polygon -> Polygon+  , pRayIntersect    -- :: Polygon -> (Int, Int) -> (Int,Int) -> Maybe (V2 Rational)+  -- * Triangulation+  , isValidTriangulation     -- :: Polygon -> Triangulation -> Bool+  , triangulationsToPolygons -- :: Polygon -> Triangulation -> [Polygon]+  -- * Single-Source-Shortest-Path+  , ssspVisibility -- :: Polygon -> Polygon+  , ssspWindows -- :: Polygon -> [(V2 Rational, V2 Rational)]+  -- * Duals+  , pdualPolygons -- :: Polygon -> PDual -> [Polygon]+  -- * Built-in shapes for testing+  , triangle  -- :: Polygon+  , triangle' -- :: [P]+  , shape1  -- :: Polygon+  , shape2  -- :: Polygon+  , shape3  -- :: Polygon+  , shape4  -- :: Polygon+  , shape5  -- :: Polygon+  , shape6  -- :: Polygon+  , shape7  -- :: Polygon+  , shape8  -- :: Polygon+  , shape9  -- :: Polygon+  , shape10 -- :: Polygon+  , shape11 -- :: Polygon+  , shape12 -- :: Polygon+  , shape13 -- :: Polygon+  , shape14 -- :: Polygon+  , shape15 -- :: Polygon+  , shape16 -- :: Polygon+  , shape17 -- :: Polygon+  , shape18 -- :: Polygon+  , shape19 -- :: Polygon+  , shape20 -- :: Polygon+  , shape21 -- :: Polygon+  , shape22 -- :: Polygon+  , shape23 -- :: Polygon+  , concave -- :: Polygon+  -- * Internals+  , pRing       -- :: APolygon a -> Ring a+  , pUnsafeMap  -- :: (Ring a -> Ring a) -> APolygon a -> APolygon a+  , pCopy       -- :: Polygon -> Polygon+  , pGenerate   -- :: [(Double, Double)] -> Polygon+  , pUnGenerate -- :: Polygon -> [(Double, Double)]+  ) where++import           Data.Hashable+import           Data.List                  (intersect, tails, sort, maximumBy)+import           Data.Maybe+import           Data.Ratio+import           Data.Serialize+import           Data.Vector                (Vector)+import qualified Data.Vector                as V+import           Linear.V2+import           Linear.Vector+import           Reanimate.Math.Common+import           Reanimate.Math.EarClip+import           Reanimate.Math.SSSP+import           Reanimate.Math.Triangulate++-- import Debug.Trace++-- Generate random polygons, options:+--   1. put corners around a circle. Vary the radius.+--   2. close a hilbert curve+type FPolygon = APolygon Double+-- Optimize representation?+--   Polygon = (Vector XNumerator, Vector XDenominator+--             ,Vector YNumerator, Vector YDenominator)+data APolygon a = Polygon+  { polygonPoints        :: Vector (V2 a)+  , polygonOffset        :: Int+  , polygonTriangulation :: Triangulation+  , polygonSSSP          :: Vector SSSP+  }+type Polygon = APolygon Rational+type P = V2 Double++instance Show a => Show (APolygon a) where+  show = show . V.toList . polygonPoints++instance Hashable a => Hashable (APolygon a) where+  hashWithSalt s p = V.foldl' hashWithSalt s (polygonPoints p)++instance (Fractional a, Ord a, Serialize a) => Serialize (APolygon a) where+  put = put . V.toList . polygonPoints+  get = mkPolygon . V.fromList <$> get++pRing :: APolygon a -> Ring a+pRing = ringPack . polygonPoints++mkPolygon :: (Fractional a, Ord a) => V.Vector (V2 a) -> APolygon a+mkPolygon points = Polygon+    { polygonPoints = points+    , polygonOffset = 0+    , polygonTriangulation = trig+    , polygonSSSP = V.generate n $ \i -> sssp ring (dual i trig)+    }+  where+    n = length points+    ring = ringPack points+    trig = earClip ring++mkPolygonFromRing :: (Fractional a, Ord a) => Ring a -> APolygon a+mkPolygonFromRing = mkPolygon . ringUnpack++pUnsafeMap :: (Ring a -> Ring a) -> APolygon a -> APolygon a+pUnsafeMap fn p = p{ polygonPoints = ringUnpack (fn (pRing p)) }++-- pParent p i j = shortest-path parent from j to i+pParent :: Polygon -> Int -> Int -> Int+pParent p i j =+    (sTree V.! mod (j + polygonOffset p) n - polygonOffset p) `mod` n+  where+    sTree = polygonSSSP p V.! mod (i + polygonOffset p) n+    n = pSize p++pCopy :: Polygon -> Polygon+pCopy p = mkPolygon $ V.generate (pSize p) $ pAccess p++pSetOffset :: APolygon a -> Int -> APolygon a+pSetOffset p offset =+  p { polygonOffset = offset `mod` pSize p }++pAdjustOffset :: APolygon a -> Int -> APolygon a+pAdjustOffset p offset =+  p { polygonOffset = (polygonOffset p + offset) `mod` pSize p }++pSize :: APolygon a -> Int+pSize = length . polygonPoints++pNull :: APolygon a -> Bool+pNull = V.null . polygonPoints++pNext :: APolygon a -> Int -> Int+pNext p i = (i+1) `mod` pSize p++pPrev :: APolygon a -> Int -> Int+pPrev p i = (i-1) `mod` pSize p++-- When is a polygon valid/simple?+--   It is counter-clockwise.+--   No edges intersect.+-- O(n^2)+-- 'checkEdge' takes 90% of the time.+pIsSimple :: Polygon -> Bool+pIsSimple p | pSize p < 3 = False+pIsSimple p = pIsCCW p && noDups && checkEdge 0 2+  where+    noDups = checkForDups (sort (V.toList (polygonPoints p)))+    checkForDups (x:y:xs)+      = x /= y && checkForDups (y:xs)+    checkForDups _ = True+    len = pSize p+    -- check i,i+1 against j,j+1+    -- j > i+1+    checkEdge i j+      | j >= len = (i > len-3) || checkEdge (i+1) (i+3)+      | otherwise =+        case lineIntersect (pAccess p i, pAccess p $ i+1)+                           (pAccess p j, pAccess p $ j+1) of+          Just u | u /= pAccess p i -> False+          _nothing                  -> checkEdge i (j+1)++pScale :: Rational -> Polygon -> Polygon+pScale s = pUnsafeMap (ringMap (^* s))++pAtCentroid :: Polygon -> Polygon+pAtCentroid p = pTranslate (negate c) p+  where c = pCentroid p ^/ 2++pAtCenter :: Polygon -> Polygon+pAtCenter p = pTranslate (negate $ pCenter p) p++pTranslate :: V2 Rational -> Polygon -> Polygon+pTranslate v = pUnsafeMap (ringMap (+v))++pCenter :: Polygon -> V2 Rational+pCenter p = V2 (x+w/2) (y+h/2)+  where+    (x,y,w,h) = pBoundingBox p++-- Returns (min-x, min-y, width, height)+pBoundingBox :: Polygon -> (Rational, Rational, Rational, Rational)+pBoundingBox = \p ->+    let V2 x y = pAccess p 0 in+    case V.foldl' worker (x, y, 0, 0) (polygonPoints p) of+      (xMin, yMin, xMax, yMax) ->+        (xMin, yMin, xMax-xMin, yMax-yMin)+  where+    worker (xMin,yMin,xMax,yMax) (V2 thisX thisY) =+      (min xMin thisX, min yMin thisY+      ,max xMax thisX, max yMax thisY)++-- Place n points on a circle, use one parameter to slide the points back and forth.+-- Use second parameter to move points closer to center circle.+pGenerate :: [(Double, Double)] -> Polygon+pGenerate points+  | len < 4 = error "pGenerate: require at least four points"+  | otherwise = mkPolygon $ V.fromList+  [ V2 (realToFrac $ cos ang * rMod)+       (realToFrac $ sin ang * rMod)+  | (i,(angMod,rMod))  <- zip [0..] points+  , let minAngle = tau / len * i - pi+        maxAngle = tau / len * (i+1) - pi+        ang = minAngle + (maxAngle-minAngle)*angMod+  ]+  where+    tau = 2*pi+    len = fromIntegral (length points)++pUnGenerate :: Polygon -> [(Double, Double)]+pUnGenerate p =+    [ worker i (fmap realToFrac e)+    | (i,e) <- zip [0..] (V.toList $ polygonPoints p) ]+  where+    len = fromIntegral (pSize p)+    worker i (V2 x y) =+      let ang = atan2 y x+          minAngle = tau / len * i - pi+          maxAngle = tau / len * (i+1) - pi+      in ((ang-minAngle)/(maxAngle-minAngle), sqrt (x*x+y*y))+    tau = 2*pi++-- When is a triangulation valid?+--   Intersection: No internal edges intersect.+--   Completeness: All edge neighbours share a single internal edge.+isValidTriangulation :: Polygon -> Triangulation -> Bool+isValidTriangulation p t = isComplete && intersectionFree+  where+    o = polygonOffset p+    isComplete = all isProper [0 .. pSize p-1]+    isProper i =+      let j = pNext p i in+      length ((pPrev p i : (t V.! i)) `intersect` (pNext p j : t V.! j)) == 1+    intersectionFree = and+      [ case lineIntersect (pAccess p (a-o), pAccess p (b-o)) (pAccess p (c-o), pAccess p (d-o)) of+          Nothing -> True+          Just u  -> u == pAccess p (a-o) || u == pAccess p (b-o) ||+                     u == pAccess p (c-o) || u == pAccess p (d-o)+      | ((a,b),(c,d)) <- edgePairs ]+    edgePairs = [ (e1, e2) | (e1, rest) <- zip edges (drop 1 $ tails edges), e2 <- rest]+    edges =+      [ (n, i)+      | (n, lst) <- zip [0..] (V.toList t)+      , i <- lst+      , n < i+      ]++triangulationsToPolygons :: Polygon -> Triangulation -> [Polygon]+triangulationsToPolygons p t =+  [ mkPolygon $ V.fromList+    [ pAccess p g, pAccess p i, pAccess p j ]+  | i <- [0 .. pSize p-1]+  , let js = filter (i<) $ t V.! i+  , (g, j) <- zip (i-1:js) js+  ]++pIsInside :: Polygon -> V2 Rational -> Bool+pIsInside p point = or+  [ isInside (rawAccess g) (rawAccess i) (rawAccess j) point+  | i <- [0 .. pSize p-1]+  , let js = filter (i<) $ polygonTriangulation p V.! i+  , (g, j) <- zip (i-1:js) js+  ]+  where+    rawAccess x = polygonPoints p V.! x++-- reducePolygons :: Int -> [Polygon] -> [Polygon]+-- reducePolygons n ps+--   | length ps <= n = ps+--   | otherwise =+--     let p = findSmallest ps+--         es = edges p+--         e = findSmallest es+--     in reducePolygons n (merge p e : delete p (delete e ps))+--   where+--     findSmallest = minimumBy (comparing area2X)+--     shareEdge p1 p2 =+++pAccess :: APolygon a -> Int -> V2 a+pAccess p i = polygonPoints p V.! ((polygonOffset p + i) `mod` pSize p)++triangle :: Polygon+triangle = mkPolygon $ V.fromList [V2 1 1, V2 0 0, V2 2 0]++triangle' :: [P]+triangle' = reverse [V2 1 1, V2 0 0, V2 2 0]++shape1 :: Polygon+shape1 = mkPolygon $ V.fromList+  [ V2 0 0, V2 2 0+  , V2 2 1, V2 2 2, V2 2 3, V2 2 4, V2 2 5, V2 2 6+  , V2 1 1, V2 0 1 ]++shape2 :: Polygon+shape2 = mkPolygon $ V.fromList+  [ V2 0 0, V2 1 0, V2 1 1, V2 2 1, V2 2 (-1), V2 0 (-1), V2 0 (-2)+  , V2 3 (-2), V2 3 2, V2 0 2]++shape3 :: Polygon+shape3 = mkPolygon $ V.fromList+  [ V2 0 0, V2 1 0, V2 1 1, V2 2 1, V2 2 2, V2 0 2]++shape4 :: Polygon+shape4 = mkPolygon $ V.fromList+  [ V2 0 0, V2 1 0, V2 1 1, V2 2 1, V2 2 (-1), V2 3 (-1),V2 3 2, V2 0 2]++shape5 :: Polygon+shape5 = pCycles shape4 !! 2++-- square+shape6 :: Polygon+shape6 = mkPolygon $ V.fromList [ V2 0 0, V2 1 0, V2 1 1, V2 0 1 ]++shape7 :: Polygon+shape7 = pScale 6 $ mkPolygon $ V.fromList+        [V2 ((-1567171105775771) % 144115188075855872) ((-7758063241391039) % 1152921504606846976)+        ,V2 ((-2711114907999263) % 18014398509481984) ((-3561889280168807) % 18014398509481984)+        ,V2 ((-6897139157863177) % 72057594037927936) ((-1632144794297397) % 4503599627370496)+        ,V2 (5592137945106423 % 36028797018963968) ((-71351641856107) % 281474976710656)+        ,V2 (2568147525079071 % 4503599627370496) ((-4312925637247687) % 18014398509481984)+        ,V2 (1291079014395023 % 2251799813685248) (321513444515769 % 2251799813685248)+        ,V2 (2071709221627247 % 4503599627370496) (4019115966736491 % 9007199254740992)+        ,V2 ((-1589087869859839) % 144115188075855872) (4904023654354179 % 9007199254740992)+        ,V2 ((-2328090886101149) % 36028797018963968) (2587887893460759 % 36028797018963968)+        ,V2 ((-7990199074159871) % 18014398509481984) (1301850651537745 % 4503599627370496)]++shape8 :: Polygon+shape8 = pScale 10 $ pGenerate+          [(0.36,0.4),(0.7,1.8e-2),(0.7,0.2),(0.1,0.4),(0.2,0.2),(0.7,0.1),(0.4,8.0e-2)]++shape9 :: Polygon+shape9 = pScale 5 $ pGenerate+  [(0.5,0.2),(0.7,0.6),(0.4,0.3),(0.1,0.7),(0.3,1.0e-2),(0.5,0.3),(0.2,0.8),(0.1,0.8),(0.7,6.0e-2),(0.1,0.6)]++shape10 :: Polygon+shape10 = pGenerate+  [(0.4,0.7),(0.2,0.2),(0.3,0.9),(5.0e-2,0.1),(0.7,1.0e-2),(0.7,0.9),(0.2,0.1),(0.5,6.0e-2),(0.6,9.0e-2)]++shape11 :: Polygon+shape11 = pGenerate+  [(0.1,0.8),(0.7,0.6),(0.7,0.4),(0.3,0.5),(0.8,0.9),(0.8,6.0e-2),(1.0e-2,4.0e-2),(0.8,0.1)]++shape12 :: Polygon+shape12 = mkPolygon $ V.fromList+  [ V2 0 0, V2 0.5 1.5, V2 2 2, V2 (-2) 2, V2 (-0.5) 1.5 ]++-- F shape+shape13 :: Polygon+shape13 = pCycles (mkPolygon $ V.reverse (V.fromList+  [ V2 0 0, V2 0 2+  , V2 1 2, V2 1 1.7, V2 0.3 1.7, V2 0.3 1+  , V2 1 1, V2 1 0.7+  , V2 0.3 0.7, V2 0.3 0 ])) !! 7++-- E shape+shape14 :: Polygon+shape14 = pCycles (mkPolygon $ V.reverse $ V.fromList+  [ V2 0 0, V2 0 2 -- up+  , V2 1 2, V2 1 1.7, V2 0.3 1.7, V2 0.3 1 -- first prong+  , V2 1 1, V2 1 0.7, V2 0.3 0.7, V2 0.3 0.3 -- second prong+  , V2 1 0.3, V2 1 0 -- last prong+  ]) !! 9++--+shape15 :: Polygon+shape15 = mkPolygon $ V.fromList+  [ V2 0 0, V2 2 0+  , V2 2 2, V2 1 2+  , V2 1 1, V2 0 1]++shape16 :: Polygon+shape16 = mkPolygon $ V.fromList+  [ V2 0 0, V2 2 0+  , V2 2 1, V2 1 1+  , V2 1 2, V2 0 2]++shape17 :: Polygon+shape17 = mkPolygon $ V.fromList+  [ V2 2 0, V2 2 1+  , V2 1 1, V2 1 2+  , V2 0 2, V2 0 1, V2 0 0 ]++shape18 :: Polygon+shape18 = mkPolygon $ V.fromList+  [ V2 2 0, V2 2 1, V2 2 2+  , V2 1 2, V2 1 1+  , V2 0 1, V2 0 0 ]++shape19 :: Polygon+shape19 = mkPolygon $ V.fromList+  [ V2 (-3) (-3), V2 0 (-1)+  , V2 3 (-3), V2 1 0+  , V2 3 3, V2 0 1+  , V2 (-3) 3, V2 (-1) 0 ]++shape20 :: Polygon+shape20 = mkPolygon $ V.fromList+  [ V2 (-3) (-3)+  , V2 0 (-1)+  , V2 3 (-3)+  , V2 5 0+  , V2 2.5 (-2)+  , V2 1 0+  , V2 3 3+  , V2 0 1+  , V2 (-3) 3+  , V2 (-1) 0 ]++shape21 :: Polygon+shape21 = mkPolygon $ V.fromList+  [V2 0.0 0.0,V2 1.0 0.0,V2 1.0 1.0,V2 2.0 1.0,V2 2.0 (-1.0),V2 3.0 (-1.0)+  ,V2 3.0 2.0,V2 0.0 2.0]++shape22 :: Polygon+shape22 = pScale 2 $ mkPolygon $ V.fromList+  [V2 (-0.17) (-0.08)+  ,V2 (-0.34) (-0.21)+  ,V2 0.0 0.0+  ,V2 (-0.10) 0.60+  ,V2 (-0.14) 0.19+  ,V2 (-0.05) 0.03+  ]++shape23 :: Polygon+shape23 = mkPolygon $ V.fromList+  [ V2 0 0, V2 4 0+  , V2 4 3, V2 2 3+  , V2 2 2, V2 3 2+  , V2 3 1, V2 1 1+  , V2 1 2, V2 2 2+  , V2 2 3, V2 0 3 ]++concave :: Polygon+concave = mkPolygon $+  V.fromList [V2 0 0, V2 2 0, V2 2 2, V2 1 1, V2 0 2]++pMkWinding :: Int -> Polygon+pMkWinding n | n < 1 = error "Polygon must have at least one winding."+pMkWinding n = mkPolygon $+    V.fromList $ p0 : p1 : walkTo p1 1 n (V2 1 0) ++ reverse (walkTo p0 1 (n+2) (V2 (-1) 0))+  where+    p0 = V2 0 0+    p1 = V2 0 1+    walkTo at a b dir+      | a == b = []+      | otherwise =+        let newAt = at + (dir ^* toRational a)+        in newAt : walkTo newAt (a+1) b (rot dir)+    rot (V2 x y) =+      V2 y (-x)++pDeoverlap :: Polygon -> Polygon+pDeoverlap p = mkPolygon arr+  where+    arr = V.generate (pSize p) worker+    worker 0 = pAccess p 0+    worker n =+      if length (V.elemIndices (pAccess p n) (polygonPoints p)) /= 1+        then+          let prev = arr V.! (n-1)+              this = pAccess p n+          in lerp 0.99999 this prev+        else pAccess p n++pCycles :: Polygon -> [Polygon]+pCycles p = map (pAdjustOffset p) [0 .. pSize p-1]++pCycle :: (Real a, Fractional a, Ord a) => APolygon a -> Double -> APolygon a+pCycle p 0 = p+pCycle p t = mkPolygon $ worker 0 0+  where+    worker acc i+      -- | segment + acc == limit =+      --   V.drop i p <>+      --   V.take i p+      | segment + acc > limit =+        V.singleton (lerp (realToFrac $ (segment + acc - limit)/segment) x y) <>+        -- V.drop (i+1) (polygonPoints p) <>+        V.fromList (map (pAccess p) [i+1..pSize p-1]) <>+        V.fromList (map (pAccess p) [0 .. i])+        -- V.take (i+1) (polygonPoints p)+      | i == pSize p-1  = V.fromList (map (pAccess p) [0 .. pSize p-1])+      | otherwise = worker (acc+segment) (i+1)+        where+          x = pAccess p i+          y = pAccess p $ i+1+          segment = distance' x y+    len = pCircumference' p+    limit = t * len++pCentroid :: Polygon -> V2 Rational+pCentroid p = V2 cx cy+  where+    a = pArea p+    cx = recip (6*a) * V.sum (pMapEdges fnX p)+    cy = recip (6*a) * V.sum (pMapEdges fnY p)+    fnX (V2 x y) (V2 x' y') = (x+x')*(x*y' - x'*y)+    fnY (V2 x y) (V2 x' y') = (y+y')*(x*y' - x'*y)++pMapEdges :: (V2 Rational -> V2 Rational -> a) -> Polygon -> V.Vector a+pMapEdges fn p = V.generate (pSize p) $ \i ->+  fn (pAccess p i) (pAccess p $ i+1)++pArea :: Polygon -> Rational+pArea p =+  0.5 * V.sum (pMapEdges (\(V2 x y) (V2 x' y') -> x*y' - x'*y) p)++pCircumference :: (Real a, Fractional a) => APolygon a -> a+pCircumference p = sum+  [ approxDist (pAccess p i) (pAccess p $ i+1)+  | i <- [0 .. pSize p-1]]++pCircumference' :: (Real a, Fractional a) => APolygon a -> Double+pCircumference' p = sum+  [ distance' (pAccess p i) (pAccess p $ i+1)+  | i <- [0 .. pSize p-1]]+++-- Add points by splitting the longest lines in half repeatedly.+pAddPoints :: Int -> Polygon -> Polygon+pAddPoints n p | n <= 0 = p+pAddPoints n p = pAddPoints (n-1) $+    mkPolygon $ V.fromList $ concatMap worker [0 .. pSize p-1]+  where+    worker idx+      | idx == longestEdge =+        let start = pAccess p idx+            end = pAccess p $ idx+1+            middle = lerp 0.5 end start+        in [start, middle]+      | otherwise = [pAccess p idx]+    longestEdge = maximumBy cmpLength [0 .. pSize p-1]+    cmpLength a b =+      distSquared (pAccess p a) (pAccess p $ a+1) `compare`+      distSquared (pAccess p b) (pAccess p $ b+1)++-- addPoints :: Int -> Polygon -> Polygon+-- addPoints n p = mkPolygon $ V.fromList $ worker n 0 (map (pAccess p) [0..s])+--   where+--     worker 0 _ rest = init rest+--     worker i acc (x:y:xs) =+--       let xy = approxDist x y in+--       if acc + xy > limit+--         then x : worker (i-1) 0 (lerp ((limit-acc)/xy) y x : y:xs)+--         else x : worker i (acc+xy) (y:xs)+--     worker _ _ [_] = []+--     worker _ _ _ = error "addPoints: invalid polygon"+--     s = pSize p+--     len = polygonLength p+--     limit = len / fromIntegral (n+1)++pIsConvex :: Polygon -> Bool+pIsConvex p = and+  [ area2X (pAccess p i) (pAccess p j) (pAccess p k) > 0+  | i <- [0..n-1]+  , j <- [i+1..n-1]+  , k <- [j+1..n-1]+  ]+  where n = pSize p++pIsCCW :: Polygon -> Bool+pIsCCW p | pNull p = False+pIsCCW p = V.sum (pMapEdges fn p) < 0+  where+    fn (V2 x1 y1) (V2 x2 y2) = (x2-x1)*(y2+y1)++pRayIntersect :: Polygon -> (Int, Int) -> (Int,Int) -> Maybe (V2 Rational)+pRayIntersect p (a,b) (c,d) =+  rayIntersect (pAccess p a, pAccess p b) (pAccess p c, pAccess p d)++++++---------------------------------------------------------+-- SSSP visibility and SSSP windows++ssspVisibility :: Polygon -> Polygon+ssspVisibility p = mkPolygon $+    V.fromList $ clearDups $ go [0 .. pSize p-1] -- ([root..pSize p-1]  ++ [0 .. root-1])+  where+    clearDups (x:y:xs)+      | x == y = clearDups (y:xs)+      | otherwise = x : clearDups (y:xs)+    clearDups xs = xs+    obstructedBy n =+      case pParent p 0 n of+        0 -> n+        i -> obstructedBy i+    go [] = []+    go [x] = [pAccess p x]+    go (x:y:xs) =+      let xO = obstructedBy x+          yO = obstructedBy y+      in case () of+          ()+            -- Both ends are visible.+            | xO == x && yO == y -> pAccess p x : go (y:xs)+            -- X is visible, x to intersect (0,yO) (x,y)+            | xO == x   ->+              pAccess p x : fromMaybe (pAccess p y) (pRayIntersect p (0,yO) (x,y)) : go (y:xs)+            -- Y is visible+            | yO == y   -> fromMaybe (pAccess p x) (pRayIntersect p (0,xO) (x,y)) : pAccess p y : go (y:xs)+            -- Neither is visible and they've obstructed by the same point+            -- so the entire edge is hidden.+            | xO == yO -> go (y:xs)+            -- Neither is visible. Cast shadow from obstruction points to+            -- find if a subsection of the edge is visible.+            | otherwise ->+              let a = fromMaybe (error "a") (pRayIntersect p (0,xO) (x,y))+                  b = fromMaybe (error "b") (pRayIntersect p (0,yO) (x,y))+              in if a /= b+                then a : b : go (y:xs)+                else go (y:xs)++ssspWindows :: Polygon -> [(V2 Rational, V2 Rational)]+ssspWindows p = clearDups $ go (pAccess p 0) [0..pSize p-1]+  where+    clearDups (x:y:xs)+      | x == y = clearDups (y:xs)+      | otherwise = x : clearDups (y:xs)+    clearDups xs = xs+    obstructedBy n =+      case pParent p 0 n of+        0 -> n+        i -> obstructedBy i+    go _ [] = []+    go _ [_] = []+    go l (x:y:xs) =+      let xO = obstructedBy x+          yO = obstructedBy y+      in case () of+          ()+            -- Both ends are visible.+            | xO == x && yO == y -> go (pAccess p x) (y:xs)+            -- X is visible, x to intersect (0,yO) (x,y)+            | xO == x   ->+              go (fromMaybe (pAccess p y) (pRayIntersect p (0,yO) (x,y))) (y:xs)+            -- Y is visible+            | yO == y   ->+              let newL = fromMaybe (pAccess p x) (pRayIntersect p (0,xO) (x,y)) in+              (l, newL) :+              go newL (y:xs)+            -- Neither is visible and they've obstructed by the same point+            -- so the entire edge is hidden.+            | xO == yO -> go l (y:xs)+            -- Neither is visible. Cast shadow from obstruction points to+            -- find if a subsection of the edge is visible.+            | otherwise ->+              let a = fromMaybe (error "a") (pRayIntersect p (0,xO) (x,y))+                  b = fromMaybe (error "b") (pRayIntersect p (0,yO) (x,y))+              in if a /= b+                then (l, a) : (b, pAccess p yO) : go (pAccess p yO) (y:xs)+                else go l (y:xs)++pdualPolygons :: Polygon -> PDual -> [Polygon]+pdualPolygons p pdual = map mkPolygonFromRing (pdualRings (pRing p) pdual)
+ src/Reanimate/Math/Render.hs view
@@ -0,0 +1,231 @@+module Reanimate.Math.Render where++import           Codec.Picture.Types+import           Control.Monad+-- import           Data.List+import qualified Data.Text                  as T+import qualified Data.Vector                as V+import           Linear.V2+import           Reanimate.Animation+import           Reanimate.ColorMap+-- import           Reanimate.Constants+import           Reanimate.LaTeX+-- import           Reanimate.Math.Compatible+-- import           Reanimate.Math.EarClip+import           Reanimate.Math.Polygon+import           Reanimate.Math.Common+import           Reanimate.Math.SSSP+import           Reanimate.Math.Triangulate+-- import           Reanimate.Math.Visibility+import           Reanimate.Scene+import           Reanimate.Svg+++-- drawVisibility :: Polygon -> Animation+-- drawVisibility p' = mkAnimation 5 $ \t ->+--   let p = cyclePolygon p' (t::Double) in+--   centerUsing (polygonShape p) $+--   mkGroup+--   [ withFillColor "grey" $ polygonShape p+--   , withFillColor "grey" $ polygonDots p+--   , withFillColor "white" $ mkLinePathClosed+--     [ (x,y) | V2 x y <- visibility (map (fmap realToFrac) $ V.toList $ polygonPoints p) ]+--   , let V2 x y = fmap realToFrac $ pAccess p 0 in+--     translate x y $ withFillColor "red" $ mkCircle 0.1+--   -- , withFillColor "blue" $ latex $ T.pack $ show (t)+--   ]++-- drawSSSPVisibility :: Polygon -> Animation+-- drawSSSPVisibility p' = mkAnimation 5 $ \t ->+--   let p = pSetOffset p' (round $ t*(fromIntegral $ pSize p'-1))+--       vis = ssspVisibility p in+--   centerUsing (polygonShape p) $+--   mkGroup+--   [ withFillColor "grey" $ polygonShape p+--   -- , withFillColor "grey" $ polygonDots p+--   -- , withFillColor "white" $ polygonShape vis+--   , let V2 x y = fmap realToFrac $ pAccess p 0 in+--     translate x y $ withFillColor "red" $ mkCircle 0.1+--   -- , withFillColor "blue" $ latex $ T.pack $ show (t)+--   ]++-- drawSSSPVisibilityFast :: Polygon -> Animation+-- drawSSSPVisibilityFast p' = mkAnimation 5 $ \t ->+--   let root = min (pSize p-1) $ (floor $ t*(fromIntegral $ pSize p))+--       p = pSetOffset p' root+--       vis = ssspVisibility p in+--   -- centerUsing (polygonShape p) $+--   mkGroup+--   [ withFillColor "grey" $ polygonShape p+--   , withFillColor "white" $ polygonShape vis+--   , withFillColor "grey" $ polygonNumDots p+--   , let V2 x y = fmap realToFrac $ pAccess p 0 in+--     translate x y $ withFillColor "red" $ mkCircle 0.09+--   -- , withFillColor "blue" $ latex $ T.pack $ show (t)+--   ]++-- drawCompatible :: Polygon -> Polygon -> Animation+-- drawCompatible a b = sceneAnimation $ do+--   newSpriteSVG $ translate (-3) 0 $ mkGroup+--     [ withFillColor "grey" $ polygonShape a+--     , withFillColor "grey" $ polygonNumDots a+--     ]+--   newSpriteSVG $ translate (3) 0 $ mkGroup+--     [ withFillColor "grey" $ polygonShape b+--     , withFillColor "grey" $ polygonNumDots b+--     ]+--   let compat = compatiblyTriangulateP a b+--   forM_ compat $ \(l, r) -> do+--     fork $ play $ staticFrame 1 $+--       translate (-3) 0 $ withStrokeColor "white" $ withStrokeWidth (defaultStrokeWidth*0.2) $+--       withFillOpacity 0 $ polygonShape l+--     fork $ play $ staticFrame 1 $+--       translate (3) 0 $ withStrokeColor "white" $ withStrokeWidth (defaultStrokeWidth*0.2) $+--       withFillOpacity 0 $ polygonShape r++-- drawWindow :: Polygon -> SVG+-- drawWindow p =+--   let mWins = ssspWindows p+--       in+--   mkGroup+--   [ mkGroup+--     [ mkLine (x1,y1) (x2,y2)+--     | (a,b) <- mWins+--     , let V2 x1 y1 = realToFrac <$> a+--           V2 x2 y2 = realToFrac <$> b+--     ]+--   ]++-- drawWindowOverlap :: Polygon -> Int -> Int -> SVG+-- drawWindowOverlap p a b =+--   let aWins = ssspWindows (modOffset p a)+--       bWins = ssspWindows (modOffset p b)+--       in+--   mkGroup+--   [ mkGroup $+--     [ withStrokeColor "green" $mkGroup+--       [ mkLine (x1,y1) (x2,y2)+--       , mkLine (x1',y1') (x2',y2') ]+--     | (a,b) <- aWins+--     , (i,j) <- bWins+--     , a == i || a == j || b == i || b == j+--     , not (sort [a,b] == sort [i,j])+--     , let V2 x1 y1 = realToFrac <$> a+--           V2 x2 y2 = realToFrac <$> b+--           V2 x1' y1' = realToFrac <$> i+--           V2 x2' y2' = realToFrac <$> j+--     ]+--   ]++polygonShape :: Polygon -> SVG+polygonShape p = mkLinePathClosed+  [ (x,y) | V2 x y <- map (fmap realToFrac) $ V.toList (polygonPoints p) ]++polygonDots :: Polygon -> SVG+polygonDots p = mkGroup+  [ translate x y $ mkCircle 0.1 | V2 x y <- V.toList $ V.map (fmap realToFrac) $ polygonPoints p ]++polygonNumDots :: Polygon -> SVG+polygonNumDots p = mkGroup $ reverse+    [ mkGroup+      [ colored n $+        translate x y $ mkCircle circR+      , withFillColor "black" $+        translate x y $ ppNum n ]+    | n <- [0..pSize p-1]+    , let V2 x y = realToFrac <$> pAccess p n ]+  where+    circR = 0.05+    colored n =+      let c = promotePixel $ turbo (fromIntegral (n+2) / fromIntegral (pSize p-1+2))+      in withStrokeColorPixel c . withFillColorPixel c+    ppNum n =+      scaleToSize (circR*1.7) (circR*1.5) $+      center $ latex $ T.pack $ "\\texttt{" ++ show n ++ "}"++-- drawSSSP :: Polygon -> (Polygon -> SSSP) -> Animation+-- drawSSSP p gen = mkAnimation 5 $ \t -> centerUsing outline $+--   let p' = cyclePolygons p !! (round $ t*(fromIntegral $ pSize p-1)) in+--   mkGroup+--   [ outline+--   , renderSSSP p' (gen p')+--   , withFillColor "grey" $ polygonNumDots $ p'+--   ]+--   where+--     outline =+--       withFillColor "grey" $ mkLinePathClosed+--         [ (x,y) | V2 x y <- map (fmap realToFrac) (V.toList (polygonPoints p)  ++ [pAccess p 0]) ]++drawSSSP :: Polygon -> Animation+drawSSSP p = mkAnimation 5 $ \t -> centerUsing (polygonShape p) $+  let root = round $ t*fromIntegral (pSize p-1)+      sTree = polygonSSSP p V.! root in+  mkGroup+  [ polygonShape p+  , renderSSSP p sTree+  , polygonNumDots p+  ]++-- Inline such that 'trees' is only computed once.+{-# INLINE drawSSSPNaive #-}+drawSSSPNaive :: Polygon -> Animation+drawSSSPNaive p = mkAnimation 5 $ \t -> centerUsing (polygonShape p) $+  let root = round $ t*fromIntegral (pSize p-1) in+  mkGroup+  [ polygonShape p+  , renderSSSP p (trees !! root)+  , polygonNumDots p+  ]+  where+    trees =+      [ naive $ pRing $ pCopy $ pSetOffset p i+      | i <- [0 .. pSize p-1]]++renderSSSP :: Polygon -> SSSP -> SVG+renderSSSP p s = withFillOpacity 0 $ withStrokeColor "white" $ mkGroup+  [ mkLinePath (lineFrom i)+  | i <- [0 .. length s-1] ]+  where+    lineFrom i =+      let V2 ax ay = realToFrac <$> pAccess p i+          next = (s V.! i)+      in (ax,ay) : if next == i then [] else lineFrom next++drawTriangulation :: Polygon -> (Ring Rational -> [Triangulation]) -> Animation+drawTriangulation p gen = sceneAnimation $+  forM_ (gen $ pRing p) $ \t -> play $ staticFrame 1 $ renderTriangulation p t++renderTriangulation :: Polygon -> Triangulation -> SVG+renderTriangulation p t = center $ mkGroup+  [ withFillColor "grey" $ polygonShape p+  , withStrokeColor "white" $ mkGroup $ concat+    [ [ mkLine (ax,ay) (bx,by) ]+    | i <- [0..pSize p-1]+    , y <- t V.! i+    , let V2 ax ay = realToFrac <$> rawAccess i+          V2 bx by = realToFrac <$> rawAccess y+    ]+  , withFillColor "grey" $ polygonNumDots p+  ]+  where+    rawAccess x = polygonPoints p V.! x++renderDual :: Ring Rational -> Dual -> SVG+renderDual ring d = case d of+    Dual (a,b,c) l r -> mkGroup+      [ withFillColor "blue" $ mkTrig a b c+      , worker c a l+      , worker b c r+      ]+  where+    mkTrig a b c =+      let V2 x1 y1 = realToFrac <$> ringAccess ring a+          V2 x2 y2 = realToFrac <$> ringAccess ring b+          V2 x3 y3 = realToFrac <$> ringAccess ring c+      in mkLinePathClosed [ (x1, y1), (x2,y2), (x3,y3) ]+    worker _p1 _p2 EmptyDual = mkGroup []+    worker p1 p2 (NodeDual x l r) = mkGroup+      [ mkTrig p1 p2 x+      , worker x p2 l+      , worker p1 x r+      ]
+ src/Reanimate/Math/SSSP.hs view
@@ -0,0 +1,341 @@+{-# LANGUAGE FlexibleInstances     #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+module Reanimate.Math.SSSP+  ( -- * Single-Source-Shortest-Path+    SSSP+  , sssp                -- :: (Fractional a, Ord a) => Ring a -> Dual -> SSSP+  , dual                -- :: Int -> Triangulation -> Dual+  , Dual(..)+  , DualTree(..)+  , PDual+  , toPDual             -- :: Ring Rational -> Dual -> PDual+  , pdualRings          -- :: Ring Rational -> PDual -> [Ring Rational]+    -- * Misc+  , dualToTriangulation -- :: Ring Rational -> Dual -> Triangulation+  , pdualReduce         -- :: Ring Rational -> PDual -> Int -> PDual+  , visibilityArray     -- :: Ring Rational -> V.Vector [Int]+  , naive               -- :: Ring Rational -> SSSP+  , naive2              -- :: Ring Rational -> SSSP+  , drawDual            -- :: Dual -> String+  ) where++import           Control.Monad+import           Control.Monad.ST+-- import           Data.FingerTree            (SearchResult (..), (|>))+-- import qualified Data.FingerTree            as F+import           Data.Foldable+import           Data.List+import qualified Data.Map                   as Map+import           Data.Maybe+import           Data.Ord+import           Data.STRef+import           Data.Tree+import qualified Data.Vector                as V+import qualified Data.Vector.Mutable        as MV+import           Reanimate.Math.Common+import           Reanimate.Math.Triangulate++-- import           Debug.Trace++type SSSP = V.Vector Int+++-- ssspParent :: Polygon -> SSSP -> Int -> Int+-- ssspParent p sTree x =+--     (sTree V.! ((x - polygonOffset p) `mod` n) + polygonOffset p) `mod` n+--   where+--     n = polygonSize p++visibilityArray :: Ring Rational -> V.Vector [Int]+visibilityArray p = arr+  where+    n = ringSize p+    arr = V.fromList+        [ visibility y+        | y <- [0..n-1]+        ]+    visibility y =+      [ i+      | i <- [0..y-1]+      , y `elem` arr V.! i ] +++      [ i+      | i <- [y+1 .. n-1]+      , let pI = ringAccess p i+            isOpen = isRightTurn pYp pY pYn+      , ringClamp p (y+1) == i || ringClamp p (y-1) == i || if isOpen+        then isLeftTurnOrLinear pY pYn pI ||+             isLeftTurnOrLinear pYp pY pI+        else not $ isRightTurn pY pYn pI ||+                   isRightTurn pYp pY pI+      , let myEdges = [(e1,e2) | (e1,e2) <- edges, e1/=y, e1/=i, e2/=y,e2/=i]+      , all (isNothing . lineIntersect (pY,pI))+              [ (ringAccess p e1, ringAccess p e2) | (e1,e2) <- myEdges ]]+      where+        pY = ringAccess p y+        pYn = ringAccess p $ y+1+        pYp = ringAccess p $ y-1+        edges = zip [0..n-1] (tail [0..n-1] ++ [0])++++-- Iterative Single Source Shortest Path solver. Quite slow.+naive :: Ring Rational -> SSSP+naive p =+    V.fromList $ Map.elems $+    Map.map snd $+    worker initial+  where+    initial = Map.singleton 0 (0,0)+    visibility = visibilityArray p+    worker :: Map.Map Int (Rational, Int) -> Map.Map Int (Rational, Int)+    worker m+        | m==newM   = newM+        | otherwise = worker newM+      where+        ms' = [ Map.fromList+                    [ case Map.lookup v m of+                        Nothing -> (v, (distThroughI, i))+                        Just (otherDist,parent)+                          | otherDist > distThroughI -> (v, (distThroughI, i))+                          | otherwise -> (v, (otherDist, parent))+                    | v <- visibility V.! i+                    , let distThroughI = dist + approxDist (ringAccess p i) (ringAccess p v) ]+              | (i,(dist,_)) <- Map.toList m+              ]+        newM = Map.unionsWith g (m:ms') :: Map.Map Int (Rational,Int)+    g a b = if fst a < fst b then a else b++naive2 :: Ring Rational -> SSSP+naive2 p = runST $ do+    parents <- MV.replicate (ringSize p) (-1)+    costs <- MV.replicate (ringSize p) (-1)+    MV.write parents 0 0+    MV.write costs 0 0+    changedRef <- newSTRef False+    let loop i+          | i == ringSize p = do+            changed <- readSTRef changedRef+            when changed $ do+              writeSTRef changedRef False+              loop 0+          | otherwise = do+            myCost <- MV.read costs i+            unless (myCost < 0) $+              forM_ (visibility V.! i) $ \n -> do+                -- n is visible from i.+                theirCost <- MV.read costs n+                let throughCost = myCost + approxDist (ringAccess p i) (ringAccess p n)+                when (throughCost < theirCost || theirCost < 0) $ do+                    MV.write parents n i+                    MV.write costs n throughCost+                    writeSTRef changedRef True+            loop (i+1)+    loop 0+    V.unsafeFreeze parents+  where+    visibility = visibilityArray p++data PDual = PDual (V.Vector Int) Rational [PDual]+  deriving (Show)++toPDual :: Ring Rational -> Dual -> PDual+toPDual p d =+  case d of+    Dual (a,b,c) l r ->+      PDual (V.fromList [a,b,c])+        (area2X (ringAccess p a) (ringAccess p b) (ringAccess p c))+        (catMaybes [ worker c a l, worker b c r])+  where+    worker _ _ EmptyDual = Nothing+    worker a b (NodeDual x l r) = Just $+      PDual (V.fromList [a,x,b])+        (area2X (ringAccess p a) (ringAccess p x) (ringAccess p b))+        (catMaybes [ worker x b l, worker a x r])++pdualSize :: PDual -> Int+pdualSize (PDual _ _ children) = 1 + sum (map pdualSize children)++pdualArea :: PDual -> Rational+pdualArea (PDual _ faceArea _) = faceArea++-- FIXME: 'origin' isn't used. Remove.+pdualReduce :: Ring Rational -> PDual -> Int -> PDual+pdualReduce origin pdual n+  | pdualSize pdual <= n = pdual+  | otherwise =+    let smallest = minimum $ pAreas pdual+    in pdualReduce origin (merge smallest pdual) n+  where+    merge _s (PDual p faceArea []) = PDual p faceArea []+    merge s (PDual p faceArea children)+      | faceArea == s =+        let (PDual p2 area2 children2:xs) = sortBy (comparing pdualArea) children+        in PDual (joinP p p2) (faceArea+area2) (children2++xs)+      | otherwise =+        let (PDual p2 area2 children2:xs) = sortBy (comparing pdualArea) children+        in if area2 == s+            then PDual (joinP p p2) (faceArea+area2) (children2++xs)+            else PDual p faceArea (map (merge s) children)+    pAreas (PDual _ faceArea children) = faceArea : concatMap pAreas children+    joinP a b = V.fromList (sort (V.toList a ++ V.toList b))++pdualRings :: Ring Rational -> PDual -> [Ring Rational]+pdualRings p (PDual pts _area children) =+  ringPack (V.map (ringAccess p) pts) : concatMap (pdualRings p) children++-- Dual of triangulated polygon+data Dual = Dual (Int,Int,Int) -- (a,b,c)+                  DualTree -- borders ca+                  DualTree -- borders bc+  deriving (Show)++data DualTree+  = EmptyDual+  | NodeDual Int -- axb triangle, a and b are from parent.+      DualTree -- borders xb+      DualTree -- borders ax+  deriving (Show)++drawDual :: Dual -> String+drawDual d = drawTree $+  case d of+    Dual (a,b,c) l r -> Node (show (a,b,c)) [worker c a l, worker b c r]+  where+    worker _a _b EmptyDual = Node "Leaf" []+    worker a b (NodeDual x l r) =+      Node (show (b,a,x)) [worker x b l, worker a x r]++dualToTriangulation :: Ring Rational -> Dual -> Triangulation+dualToTriangulation p d = edgesToTriangulation (ringSize p) $ filter goodEdge $+    case d of+      Dual (a,b,c) l r ->+        (a,b):(a,c):(b,c):worker c a l ++ worker b c r+  where+    goodEdge (a,b)+      = a /= ringClamp p (b+1) && a /= ringClamp p (b-1)+    worker _a _b EmptyDual = []+    worker a b (NodeDual x l r) =+      (a,x) : (x, b) : worker x b l ++ worker a x r++-- Dual path:+-- (Int,Int,Int) + V.Vector Int + V.Vector LeftOrRight++-- simplifyDual :: DualTree -> DualTree+-- -- simplifyDual (NodeDual x EmptyDual EmptyDual) = NodeLeaf x+-- -- simplifyDual (NodeDual x l EmptyDual) = NodeDualL x l+-- -- simplifyDual (NodeDual x EmptyDual r) = NodeDualR x r+-- simplifyDual d = d++dual :: Int -> Triangulation -> Dual+dual root t =+  case hasTriangle of+    []    -> error "weird triangulation"+    -- [] -> Dual (0,1,V.length t-1) EmptyDual (dualTree t (1, (V.length t-1)) 0)+    (x:_) -> Dual (root,rootNext,x) (dualTree t (x,root) rootNext) (dualTree t (rootNext,x) root)+  where+    rootNext = idx (root+1)+    rootPrev = idx (root-1)+    rootNNext = idx (root+2)+    idx i = i `mod` n+    hasTriangle = (rootPrev : t V.! root) `intersect` (rootNNext : t V.! rootNext)+    n = V.length t++-- a=6, b=0, e=1+dualTree :: Triangulation -> (Int,Int) -> Int -> DualTree+dualTree t (a,b) e = -- simplifyDual $+    case hasTriangle of+      [] -> EmptyDual+      [(ab)] ->+        NodeDual ab+          (dualTree t (ab,b) a)+          (dualTree t (a,ab) b)+      _ -> error $ "Invalid triangulation: " ++ show (a,b,e,hasTriangle)+  where+    hasTriangle = (prev a : next a : t V.! a) `intersect` (prev b : next b : t V.! b)+      \\ [e]+    n = V.length t+    next x = (x+1) `mod` n+    prev x = (x-1) `mod` n++-- data MinMax = MinMax Int Int | MinMaxEmpty deriving (Show)+-- instance Semigroup MinMax where+--   MinMaxEmpty <> b = b+--   a <> MinMaxEmpty = a+--   MinMax a b <> MinMax c d+--     = MinMax (min a c) (max b d)+--     -- = MinMax c b+-- instance Monoid MinMax where+--   mempty = MinMaxEmpty+--+-- instance F.Measured MinMax Int where+--   measure i = MinMax i i++-- dualRoot :: Dual -> Int+-- dualRoot (Dual (a,_,_) _ _) = a++-- O(n*ln n), could be O(n) if I could figure out how to use fingertrees...+sssp :: (Fractional a, Ord a) => Ring a -> Dual -> SSSP+sssp p d = toSSSP $+    case d of+      Dual (a,b,c) l r ->+        (a, a) :+        (b, a) :+        (c, a) :+        worker [c] [b] a r +++        loopLeft a c l+  where+    toSSSP edges =+      (V.fromList . map snd . sortOn fst) edges+    loopLeft a outer l =+      case l of+        EmptyDual -> []+        NodeDual x l' r' ->+          (x,a) :+          worker [x] [outer] a r' +++          loopLeft a x l'+    searchFn _checkStep _cusp _x [] = Nothing+    searchFn checkStep cusp x (y:ys)+      | not (checkStep (ringAccess p cusp) (ringAccess p y) (ringAccess p x))+        = Just $ helper [] y ys+      | otherwise = Nothing+      where+        helper acc v [] = (v, [], reverse acc)+        helper acc v1 (v2:vs)+          | checkStep (ringAccess p v1) (ringAccess p v2) (ringAccess p x) =+            (v1, v2:vs, reverse acc)+          | otherwise = helper (v1:acc) v2 vs+    searchRight = searchFn isLeftTurn+    searchLeft = searchFn isRightTurn+    -- adj x = x -- ringClamp p (x-dualRoot d)+    -- optTrace msg =+    --   if False -- dualRoot d == 1 || dualRoot d == 0+    --     then trace msg+    --     else id+    worker _ _ _ EmptyDual = []+    worker f1 f2 cusp (NodeDual x l r) =+        -- (optTrace ("Funnel: " ++ show+        --       (map adj $ toList f1+        --       ,adj cusp+        --       ,map adj $ toList f2+        --       ,adj x+        --       , dualRoot d))+        --   ) $+        case searchLeft cusp x (toList f1) of+          Just (v, f1Hi, f1Lo) ->+                -- optTrace ("  Visble from left: " ++ show (adj x,adj v)) $+                (x, v::Int) :+                worker f1Hi [x] v l +++                worker (f1Lo ++ [v, x]) f2 cusp r+          Nothing ->+            case searchRight cusp x (toList f2) of+              Just (v, f2Hi, f2Lo) ->+                -- optTrace ("  Visble from right: " ++ show (adj x,adj v)) $+                (x, v::Int) :+                worker f1 (f2Lo ++ [v, x]) cusp l +++                worker [x] f2Hi v r+              Nothing ->+                -- optTrace ("  Visble from cusp: " ++ show (adj x,adj cusp)) $+                (x, cusp::Int) :+                worker f1 [x] cusp l +++                worker [x] f2 cusp r
+ src/Reanimate/Math/Smooth.hs view
@@ -0,0 +1,289 @@+{-# LANGUAGE ScopedTypeVariables #-}+module Reanimate.Math.Smooth+  ( steinerPoints+  , renderMesh+  , renderAMesh+  , smoothMesh+  , smoothStep+  , angleSmooth+  , meshMinAngle+  , splitMeshEdges+  )+where++import qualified Data.IntSet                   as ISet+import           Control.Monad+import           Control.Monad.ST+import           Data.STRef+import           Data.List+import qualified Data.Vector                   as V+import qualified Data.Vector.Mutable           as MV+import           Linear.V2+import           Linear.Metric+import           Linear.Vector+import           Reanimate.Animation+import           Reanimate.Constants+import           Reanimate.Math.Common+import           Reanimate.Math.Polygon+import           Reanimate.Math.Render+import           Reanimate.Math.Triangulate+import           Reanimate.Morph.Rigid+import           Reanimate.Svg++steinerPoints :: Polygon -> [Polygon] -> [V2 Rational]+steinerPoints outerPolygon = concatMap+  (V.toList . V.filter isSteiner . polygonPoints)+  where isSteiner p = V.notElem p (polygonPoints outerPolygon)+-- compatiblyTriangulateP :: Polygon -> Polygon -> [(Polygon, Polygon)]++renderMesh :: Polygon -> [Polygon] -> SVG+renderMesh outerPolygon innerPolygons = mkGroup+  [ mkGroup+    [ withFillOpacity 1+      $ withStrokeWidth (defaultStrokeWidth * 0)+      $ withStrokeColor "black"+      $ withFillColor "lightgreen"+      $ polygonShape p+    | p <- innerPolygons+    ]+  , mkGroup+    [ withFillColor "red" $ aroundCenter (scale 0.2) $ drawPoint+        (realToFrac <$> p)+    | p <- steiners+    ]+  ]+  where steiners = steinerPoints outerPolygon innerPolygons++renderAMesh :: Mesh -> SVG+renderAMesh m = mkGroup+  [ translate (-1.5) 0 $ renderMesh+    (mkPolygon outlineA)+    [ mkPolygon $ V.fromList $ map (fmap realToFrac)+                                   [pA V.! a, pA V.! b, pA V.! c]+    | (a, b, c) <- V.toList (meshTriangles m)+    ]+  , translate (1.5) 0 $ renderMesh+    (mkPolygon outlineB)+    [ mkPolygon $ V.fromList $ map (fmap realToFrac)+                                   [pB V.! a, pB V.! b, pB V.! c]+    | (a, b, c) <- V.toList (meshTriangles m)+    ]+  ]+ where+  pA       = meshPointsA m+  pB       = meshPointsB m+  outlineA = V.map (\i -> realToFrac <$> meshPointsA m V.! i) (meshOutline m)+  outlineB = V.map (\i -> realToFrac <$> meshPointsB m V.! i) (meshOutline m)+++drawPoint :: V2 Double -> SVG+drawPoint (V2 x y) = translate x y $ mkCircle 0.1+++-- Plot angles for a mesh.+-- Plot min-angles for meshes as they are iteratively smoothed.++-- Smoothing algorithm:+--   For each steiner point:+--      Find desired position from each vertex, take average, update position.+--   For each edge:+--     Does flipping it increase min-angle in both meshes?+--       If yes, do it.+--   For long edges:+--     Cut in half:+--       Cut the two connected faces in half.+-- all points+-- steiner points+--++{-+data Mesh = Mesh+  { meshPointsA :: Vector P+  , meshPointsB :: Vector P+  , meshOutline :: Vector Int+  -- , meshSteiner :: Vector Int+  , meshTriangles :: Vector RelTrig }++-}+smoothMesh :: Mesh -> [Mesh]+smoothMesh m = runST $ do+  trigs <- edgesToTriangulationM (length $ meshPointsA m) $ concat+    [ [(a, b), (b, c), (c, a)] | (a, b, c) <- V.toList (meshTriangles m) ]+  pA <- V.thaw $ V.map (fmap realToFrac) (meshPointsA m)+  pB <- V.thaw $ V.map (fmap realToFrac) (meshPointsB m)+  replicateM 120 $ do+    smoothStep trigs pA steiner+    smoothStep trigs pB steiner+    newA <- V.freeze pA+    newB <- V.freeze pB+    return $ m { meshPointsA = newA, meshPointsB = newB }+ where+  steiner = V.fromList+    [ i | i <- [0 .. length (meshPointsA m) - 1], V.notElem i (meshOutline m) ]+++smoothStep+  :: forall s+   . V.MVector s [Int]+  -> V.MVector s (V2 Double)+  -> V.Vector Int+  -> ST s ()+smoothStep triangulation pts steiner =+  forM_ [0 .. length steiner - 1] {-length steiner-1-}+                                  $ \s_i -> do+    let i = steiner V.! s_i+    pt    <- MV.read pts i+    edges <- V.fromList <$> (sortEdges pt =<< MV.read triangulation i)+    let angleBased = angleSmooth pt edges+        laplacian  = sum edges ^/ (fromIntegral $ length edges) -- laplacian+    -- unsafeIOToST $ hPrint stderr (pt, edges, newX)+    if isValidLocation pt edges angleBased+      then MV.write pts i angleBased+      else if isValidLocation pt edges laplacian+        then MV.write pts i laplacian+        else return ()+ where+  sortEdges :: V2 Double -> [Int] -> ST s [V2 Double]+  sortEdges pt edges = do+    edgePoints <- mapM (MV.read pts) edges+    return $ sortOn (dir pt) edgePoints+  -- Direction from south of 'a', to 'a', to 'b'.+  dir :: V2 Double -> V2 Double -> Double+  dir a b = (atan2 (crossZ (V2 0 1) (b - a)) (dot (V2 0 1) (b - a)))++angleSmooth :: V2 Double -> V.Vector (V2 Double) -> V2 Double+angleSmooth origin js = V.sum (V.generate n nth) ^/ V.sum (V.generate n factor)+ where+  n = length js+  factor i =+    let n_self   = js V.! i+        n_origin = origin - n_self+        n_prev   = js V.! mod (i - 1) n - n_self+        n_next   = js V.! mod (i + 1) n - n_self+        a1       = acos (dot n_origin n_next / (norm n_origin * norm n_next))+        a2       = acos (dot n_origin n_prev / (norm n_origin * norm n_prev))+        alpha    = a1 + a2+    in  recip (alpha * alpha)+  nth i =+    let V2      x         y = origin+        n_self@(V2 x_0 y_0) = js V.! i+        n_origin            = origin - n_self+        n_prev              = js V.! mod (i - 1) n - n_self+        n_next              = js V.! mod (i + 1) n - n_self+        a1 = acos (dot n_origin n_next / (norm n_origin * norm n_next))+        a2 = acos (dot n_origin n_prev / (norm n_origin * norm n_prev))+        alpha               = a1 + a2+        b                   = (a2 - a1) / 2+        x'                  = x_0 + (x - x_0) * cos b - (y - y_0) * sin b+        y'                  = y_0 + (x - x_0) * sin b + (y - y_0) * cos b+    in  V2 x' y' ^/ (alpha * alpha)++isValidLocation :: V2 Double -> V.Vector (V2 Double) -> V2 Double -> Bool+isValidLocation origin edges newLoc =+  or+      [ isInside origin a b newLoc+      | i <- [0 .. length edges - 1]+      , let a = edges V.! i+            b = edges V.! mod (i + 1) (length edges)+      ]+    && V.toList edges+    == sortOn (dir newLoc) (V.toList edges)+    && minAngle origin edges+    <  minAngle newLoc edges+ where+  dir :: V2 Double -> V2 Double -> Double+  dir a b = (atan2 (crossZ (V2 0 1) (b - a)) (dot (V2 0 1) (b - a)))++minAngle :: V2 Double -> V.Vector (V2 Double) -> Double+minAngle origin edges = minimum $ concat+  [ [a1, a2, a3]+  | i <- [0 .. length edges - 1]+  , let a            = edges V.! i+        b            = edges V.! mod (i + 1) (length edges)+        (a1, a2, a3) = triangleAngles origin a b+  ]++meshMinAngle :: Mesh -> (Double, Double)+meshMinAngle m =+  ( minimum $ concat+    [ [a1, a2, a3]+    | (a, b, c) <- V.toList (meshTriangles m)+    , let (a1, a2, a3) = triangleAngles (meshPointsA m V.! a)+                                        (meshPointsA m V.! b)+                                        (meshPointsA m V.! c)+    ]+  , minimum $ concat+    [ [a1, a2, a3]+    | (a, b, c) <- V.toList (meshTriangles m)+    , let (a1, a2, a3) = triangleAngles (meshPointsB m V.! a)+                                        (meshPointsB m V.! b)+                                        (meshPointsB m V.! c)+    ]+  )++-- Smooth:+--   Find all edges+--   Sort counter-clockwise from 12 o'clock. (ie direction from south)+--   Compute new position.+--   Update position.++{-+data Mesh = Mesh+  { meshPointsA :: Vector P+  , meshPointsB :: Vector P+  , meshOutline :: Vector Int+  -- , meshSteiner :: Vector Int+  , meshTriangles :: Vector RelTrig }+-}+-- edge: a to b+-- opposite points: c and d+-- delete edge (a,b)+-- insert point p+-- insert edge (a,p)+-- insert edge (p,b)+-- insert edge (c,p)+-- insert edge (p,d)+splitMeshEdges :: Double -> Mesh -> Mesh+splitMeshEdges maxLen mesh = runST $ do+  t <- MV.replicate (n * 2) []+  forM_ (V.toList (meshTriangles mesh)) $ \(a, b, c) -> do+    insertEdge t a b+    insertEdge t b c+    insertEdge t a c+  forM_ [0 .. n - 1] $ \i -> MV.modify t (ISet.toList . ISet.fromList) i+  triangulation <- V.freeze t+  newPoints     <- newSTRef []+  offset        <- newSTRef n+  forM_ [0 .. n - 1] $ \i -> forM_ (triangulation V.! i) $ \j ->+    when (i < j) $ when (maxEdgeDistanceSquared i j > maxLen * maxLen) $ do+      p <- readSTRef offset+      writeSTRef offset (p + 1)+      let (p1, p2) = splitEdge i j+      modifySTRef newPoints ((p1, p2) :)+      let [c, d] = (triangulation V.! i) `intersect` (triangulation V.! j)+      deleteEdge t i j+      insertEdge t i p+      insertEdge t j p+      insertEdge t c p+      insertEdge t d p+  return undefined+ where+  splitEdge i j =+    ( lerp 0.5 (meshPointsA mesh V.! i) (meshPointsA mesh V.! j)+    , lerp 0.5 (meshPointsB mesh V.! i) (meshPointsB mesh V.! j)+    )+  maxEdgeDistanceSquared i j =+    distSquared (meshPointsA mesh V.! i) (meshPointsA mesh V.! j)+      `max` distSquared (meshPointsB mesh V.! i) (meshPointsB mesh V.! j)+  n = length (meshPointsA mesh)+  deleteEdge v a b = do+    MV.modify v (delete b) a+    MV.modify v (delete a) b+  insertEdge v a b = do+    MV.modify v (b :) a+    MV.modify v (a :) b+  -- sortEdges :: V.Vector (V2 Double) -> V2 Double -> V2 Double -> [Int] -> [Int]+  -- sortEdges v prev pt = sortOn (\i -> dir prev pt (v V.! i))++  -- dir :: V2 Double -> V2 Double -> V2 Double -> Double+  -- dir l a b = atan2 (crossZ (l - a) (b - a)) (dot (l - a) (b - a))
+ src/Reanimate/Math/Triangulate.hs view
@@ -0,0 +1,54 @@+module Reanimate.Math.Triangulate+  ( Triangulation+  , edgesToTriangulation+  , edgesToTriangulationM+  , trianglesToTriangulation+  , trianglesToTriangulationM+  )+where++import           Control.Monad+import qualified Data.IntSet                   as ISet+import qualified Data.Vector                   as V+import qualified Data.Vector.Mutable           as MV+import           Control.Monad.ST++-- Max edges: n-2+-- Each edge is represented twice: 2n-4+-- Flat structure:+--   edges   :: V.Vector Int -- max length (2n-4)+--   offsets :: V.Vector Int -- length n+-- Combine the two vectors? < n => offsets, >= n => edges?+type Triangulation = V.Vector [Int]++-- FIXME: Move to Common or a Triangulation module+-- O(n)+edgesToTriangulation :: Int -> [(Int, Int)] -> Triangulation+edgesToTriangulation size edges = runST $ do+  v <- edgesToTriangulationM size edges+  V.unsafeFreeze v++edgesToTriangulationM :: Int -> [(Int, Int)] -> ST s (V.MVector s [Int])+edgesToTriangulationM size edges = do+  v <- MV.replicate size []+  forM_ edges $ \(e1, e2) -> do+    MV.modify v (e1 :) e2+    MV.modify v (e2 :) e1+  forM_ [0 .. size - 1] $ \i -> MV.modify v (ISet.toList . ISet.fromList) i+  return v++trianglesToTriangulation :: Int -> V.Vector (Int, Int, Int) -> Triangulation+trianglesToTriangulation size edges = runST $ do+  v <- trianglesToTriangulationM size edges+  V.unsafeFreeze v++trianglesToTriangulationM+  :: Int -> V.Vector (Int, Int, Int) -> ST s (V.MVector s [Int])+trianglesToTriangulationM size trigs = do+  v <- MV.replicate size []+  forM_ (V.toList trigs) $ \(a, b, c) -> do+    MV.modify v (\x -> b : c : x) a+    MV.modify v (\x -> a : c : x) b+    MV.modify v (\x -> a : b : x) c+  forM_ [0 .. size - 1] $ \i -> MV.modify v (ISet.toList . ISet.fromList) i+  return v
+ src/Reanimate/Math/Visibility.hs view
@@ -0,0 +1,118 @@+module Reanimate.Math.Visibility where++-- import qualified Data.Set              as Set+import           Data.Maybe+import           Linear.V2+import           Reanimate.Math.Common+import           Reanimate.Math.Polygon++-- import           Debug.Trace++visibility :: [P] -> [P]+visibility (z:v:vs) = reverse $ go z [v,z] vs+visibility _        = undefined++-- visibility (z:v0:v1:rest)+--   | isLeftTurn z v0 v1 = left z [v1,v0] rest+--   | otherwise = scanA++-- Three cases:+--   v is visible: zsv is a left-turn+--   v moves in front of the stack: s'sv is right turn+--   v moves behind stack:+go :: (Ord a, Fractional a) => V2 a -> [V2 a] -> [V2 a] -> [V2 a]+go _z stack [] = stack+go z stack@(s:s':_ss) (v:vs)+  -- | isLeftTurn z s v && isRightTurn s' s v = trace ("FF: " ++ show (z,s,s',v)) $ fastForward z stack s (v:vs)+  | isLeftTurn z s v  = {-trace ("Left: " ++ show (z,s,v)) $ -}go z (v:stack) vs+  | isLeftTurn s' s v = {-trace ("Right: " ++ show (s',s,v,vs)) $ -}rightTurn z stack v vs+  | otherwise         = {-trace ("FF: " ++ show (z,s,s',v)) $ -}fastForward z stack s (v:vs)+go _ _ _ = undefined++{-+z: 2,2+stack: [1,1  2,6]+v: 0,1+-}++rightTurn :: (Ord a, Fractional a) => V2 a -> [V2 a] -> V2 a -> [V2 a] -> [V2 a]+rightTurn z stack' v (v1:vs)+  | isRightTurn z v v1 = {-trace ("Double right: " ++ show (v,v1)) $ -}rightTurn z stack v1 vs+  | isLeftTurn z v v1 && isRightTurn (head stack') v v1+    = {-trace ("Right->Left: " ++ show (v,v1)) $ -}go z (v:stack) (v1:vs)+  | otherwise+    = {-trace ("Scan: " ++ show (v, stack')) $ -}scanc z stack v (v1:vs)+  where+    stack@(_s1:_ss) = unwindStack z stack' v (v1:vs)+rightTurn z stack v [] = unwindStack z stack v []++-- scan forwards until edge intersects zv ray+scanc :: (Ord a, Fractional a) => V2 a -> [V2 a] -> V2 a -> [V2 a] -> [V2 a]+scanc z stack v (v1:v2:vs)+  | isBetween u (v1,v2) = -- trace ("Found: " ++ show (u, stack)) $+    go z (u:stack) (v2:vs)+    --rightTurn z stack u (v2:vs)+  | otherwise           = scanc z stack v (v2:vs)+  where+    Just u = rayIntersect (z,v) (v1,v2)+scanc _z stack _v _vs = stack++unwindStack :: (Ord a, Fractional a) => V2 a -> [V2 a] -> V2 a -> t -> [V2 a]+unwindStack z (s1:s2:ss) v vs+  | isRightTurn z s1 v && isLeftTurn z s2 v = (u:s2:ss)+  | otherwise                               = unwindStack z (s2:ss) v vs+  where+    Just u = rayIntersect (z,v) (s1,s2)+unwindStack _z stack _v _vs = stack++-- We've moved into shadow. There are three ways out:+--  1. Find edge that crosses zv from right to left.+--     In this case, push intersection point to the stack and continue as normal.+--  2. Find edge that crosses zv from left to right and is above v+--     unwind stack+--  3. Find edge that crosses zv from left to right and is below v++fastForward :: (Ord a, Fractional a) => V2 a -> [V2 a] -> V2 a -> [V2 a] -> [V2 a]+fastForward z stack v (v1:v2:vs)+  | isNothing i || not (isBetween u (v1, v2))        = {-trace ("FF past: " ++ show (z,v,v1,v2)) $ -}fastForward z stack v (v2:vs)+  | distSquared v u > distSquared z u = {-trace ("FF skip: " ++ show (z,v,v1,v2)) $ -}fastForward z stack v (v2:vs)+  | isLeftTurn z u v2                 = {-trace ("FF to: " ++ show u) $ -}go z (v2:u:stack) vs+  | distSquared z v < distSquared z u = {-trace ("FF unwind: " ++ show (z,v,v1,v2,u)) $ -}unwindStack z stack v2 (vs)+  | otherwise                         = fastForward z stack v (v2:vs)+  where+    i = rayIntersect (z, v) (v1, v2)+    Just u = rayIntersect (z, v) (v1, v2)+fastForward _z stack _v _vs = stack++{-+v2: 2,1+v1: 1,1+v: 1,0+-}++{-+left z [] [] = finish+left z stack@(s1:s2:ss) (v1:vs)+  | isLeftTurn z s1 v1+    = left z (v1:stack) rest+  | isRightTurn z s1 v1 && isRightTurn s2 s1 v1+    = scanA+  | otherwise+    = right++-- We've made a right turn and need to find the edge in the stack that+-- intersects the zv ray.+-- zv intersects the segment ab iff zav is right-turn and zbv is a left-turn.+right z [] v vs = []+right z (s1:s2:ss) v1 (v2:vs)+  | isRightTurn z s1 v1 && isLeftTurn z s2 v1+  = let u = lineIntersect (z,v) (s1,s2)+    in if isRightTurn z v1 v2+      then right+      else if isLeftTurn z v1 v2 && isRightTurn+  -}++-- Joe and Simpson.+-- vispol (z:v0:v1:vs)+--   | isLeftTurn z v0 v1 = left z [v1,v0] vs+--   | otherwise = scana z [v0] (v1:vs)
src/Reanimate/Misc.hs view
@@ -16,7 +16,6 @@ import           System.Directory  (copyFile, createDirectory, findExecutable,                                     getTemporaryDirectory, removeFile,                                     renameFile)-import           System.Exit       (ExitCode (..)) import           System.FilePath   ((<.>), (</>)) import           System.IO         (hClose, hGetContents, hIsEOF, openTempFile) import           System.Process    (readProcessWithExitCode,
+ src/Reanimate/Morph/Cache.hs view
@@ -0,0 +1,42 @@+module Reanimate.Morph.Cache+  ( cachePointCorrespondence -- :: Int -> PointCorrespondence -> PointCorrespondence+  ) where++import           Control.Exception+import qualified Data.ByteString        as B+import           Data.Hashable+import           Data.Serialize+import           Reanimate.Cache        (encodeInt)+import           Reanimate.Morph.Common+import           System.Directory+import           System.FilePath+import           System.IO+import           System.IO.Temp+import           System.IO.Unsafe++-- type PointCorrespondence = Polygon → Polygon → (Polygon, Polygon)+cachePointCorrespondence :: Int -> PointCorrespondence -> PointCorrespondence+cachePointCorrespondence ident fn src dst = unsafePerformIO $ do+    root <- getXdgDirectory XdgCache "reanimate"+    createDirectoryIfMissing True root+    let path = root </> template+    hit <- doesFileExist path+    if hit+      then do+        inp <- B.readFile path+        case decode inp of+          Left{} -> do+            removeFile path+            gen path+          Right out -> return out+      else gen path+  where+    gen path = do+      correspondence <- evaluate (fn src dst)+      withSystemTempFile template $ \tmp h -> do+        hClose h+        B.writeFile tmp (encode correspondence)+        renameFile tmp path+      return correspondence+    template = encodeInt key <.> "morph"+    key = hashWithSalt ident (src,dst)
+ src/Reanimate/Morph/Common.hs view
@@ -0,0 +1,188 @@+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TupleSections   #-}+{-# LANGUAGE UnicodeSyntax   #-}+module Reanimate.Morph.Common+  ( PointCorrespondence+  , Trajectory+  , ObjectCorrespondence+  , Morph(..)+  , morph+  , splitObjectCorrespondence+  , dupObjectCorrespondence+  , genesisObjectCorrespondence+  , toShapes+  , normalizePolygons+  , annotatePolygons+  , unsafeSVGToPolygon+  ) where++import           Control.Lens+import qualified Data.Vector            as V+import           Graphics.SvgTree       (DrawAttributes, Texture (..),+                                         drawAttributes, fillColor, fillOpacity,+                                         groupOpacity, strokeColor,+                                         strokeOpacity)+import           Linear.V2+import           Reanimate.Animation+import           Reanimate.Interpolate+import           Reanimate.Math.EarClip+import           Reanimate.Math.Polygon (Polygon, mkPolygon, pAddPoints,+                                         pCentroid, pRing, pSize, pdualPolygons,+                                         polygonPoints)+import           Reanimate.Math.SSSP+import           Reanimate.PolyShape+import           Reanimate.Signal+import           Reanimate.Svg++-- Correspondence+-- Trajectory+-- Color interpolation+-- Polygon holes+-- Polygon splitting++-- Graphical polygon? FIXME: Come up with a better name.+type GPolygon = (DrawAttributes, Polygon)++type PointCorrespondence = Polygon → Polygon → (Polygon, Polygon)+type Trajectory = (Polygon, Polygon) → (Double → Polygon)+type ObjectCorrespondence = [GPolygon] → [GPolygon] → [(GPolygon, GPolygon)]++data Morph = Morph+  { morphTolerance            :: Double+  , morphColorComponents      :: ColorComponents+  , morphPointCorrespondence  :: PointCorrespondence+  , morphTrajectory           :: Trajectory+  , morphObjectCorrespondence :: ObjectCorrespondence+  }++morph :: Morph -> SVG -> SVG -> Double -> SVG+morph Morph{..} src dst = \t ->+  case t of+    -- 0 -> lowerTransformations src+    -- 1 -> lowerTransformations dst+    _ -> mkGroup+          [ render (genPoints t)+              & drawAttributes .~ genAttrs t+          | (genAttrs, genPoints) <- gens+          ]+  where+    render p = mkLinePathClosed+        [ (x,y) | V2 x y <- map (fmap realToFrac) $ V.toList $ polygonPoints p ]+    srcShapes = toShapes morphTolerance src+    dstShapes = toShapes morphTolerance dst+    pairs = morphObjectCorrespondence srcShapes dstShapes+    gens =+      [ (interpolateAttrs morphColorComponents srcAttr dstAttr, morphTrajectory arranged)+      | ((srcAttr, srcPoly'), (dstAttr, dstPoly')) <- pairs+      , let arranged = morphPointCorrespondence srcPoly' dstPoly'+      ]++normalizePolygons :: Polygon -> Polygon -> (Polygon, Polygon)+normalizePolygons src dst =+    (pAddPoints (max 0 $ dstN-srcN) src+    ,pAddPoints (max 0 $ srcN-dstN) dst)+  where+    srcN = pSize src+    dstN = pSize dst++interpolateAttrs :: ColorComponents -> DrawAttributes -> DrawAttributes -> Double -> DrawAttributes+interpolateAttrs colorComps src dst t =+    src & fillColor .~ (interpColor <$> src^.fillColor <*> dst^.fillColor)+        & strokeColor .~ (interpColor <$> src^.strokeColor <*> dst^.strokeColor)+        & fillOpacity .~ (interpOpacity <$> src^.fillOpacity <*> dst^.fillOpacity)+        & groupOpacity .~ (interpOpacity <$> src^.groupOpacity <*> dst^.groupOpacity)+        & strokeOpacity .~ (interpOpacity <$> src^.strokeOpacity <*> dst^.strokeOpacity)+  where+    interpColor (ColorRef a) (ColorRef b) =+      ColorRef $ interpolateRGBA8 colorComps a b t+    -- interpolateColor (ColorRef a) FillNone = ColorRef a+    interpColor a _ = a+    interpOpacity a b = realToFrac (fromToS (realToFrac a) (realToFrac b) t)++genesisObjectCorrespondence :: ObjectCorrespondence+genesisObjectCorrespondence left right =+  case (left, right) of+    ([] , []) -> []+    ([], (y1,y2):ys) ->+      ((y1,y2), (y1, emptyFrom y2 y2)) : genesisObjectCorrespondence [] ys+    ((x1,x2):xs, []) ->+      ((x1,x2), (x1, emptyFrom x2 x2)) : genesisObjectCorrespondence xs []+    (x:xs, y:ys) ->+      (x,y) : genesisObjectCorrespondence xs ys+  where+    emptyFrom a b = mkPolygon $ V.map (const $ pCentroid a) (polygonPoints b)++dupObjectCorrespondence :: ObjectCorrespondence+dupObjectCorrespondence left right =+  case (left, right) of+    (_, []) -> []+    ([], _) -> []+    ([x], [y]) ->+      [(x,y)]+    ([(x1,x2)], yShapes) ->+      let x2s = replicate (length yShapes) x2+      in dupObjectCorrespondence (map (x1,) x2s) yShapes+    (xShapes, [(y1,y2)]) ->+      let y2s = replicate (length xShapes) y2+      in dupObjectCorrespondence xShapes (map (y1,) y2s)+    (x:xs, y:ys) ->+      (x, y) : dupObjectCorrespondence xs ys++splitObjectCorrespondence :: ObjectCorrespondence+splitObjectCorrespondence left right =+  case (left, right) of+    (_, []) -> []+    ([], _) -> []+    ([x], [y]) ->+      [(x,y)]+    ([(x1,x2)], yShapes) ->+      let x2s = splitPolygon (length yShapes) x2+      in splitObjectCorrespondence (map (x1,) x2s) yShapes+    (xShapes, [(y1,y2)]) ->+      let y2s = splitPolygon (length xShapes) y2+      in splitObjectCorrespondence xShapes (map (y1,) y2s)+    (x:xs, y:ys) ->+      (x,y) : splitObjectCorrespondence xs ys++splitPolygon :: Int -> Polygon -> [Polygon]+splitPolygon n polygon =+    let trig = earClip $ pRing polygon+        d = dual 0 trig+        pd = toPDual (pRing polygon) d+        reduced = pdualReduce (pRing polygon) pd n+        polygons = pdualPolygons polygon reduced+    in polygons+++-- joinPairs :: Correspondence -> [(DrawAttributes, PolyShape)] -> [(DrawAttributes, PolyShape)]+--           -> [(DrawAttributes, DrawAttributes, [(RPoint, RPoint)])]+-- joinPairs _ _ [] = []+-- joinPairs _ [] _ = []+-- joinPairs corr [(x1,x2)] [(y1,y2)] =+--   [(x1,y1, corr x2 y2)]+-- joinPairs corr [(x1,x2)] yShapes =+--   let x2s = splitPolyShape 0.001 (length yShapes) x2+--   in joinPairs corr (map (x1,) x2s) yShapes+-- joinPairs corr xShapes [(y1,y2)] =+--   let y2s = reverse $ splitPolyShape 0.001 (length xShapes) y2+--   in joinPairs corr xShapes (map (y1,) y2s)+-- joinPairs corr ((x1,x2):xs) ((y1,y2):ys) =+--   (x1,y1, corr x2 y2) : joinPairs corr xs ys+-- joinPairs _ _ _ = []++-- FIXME: sort by size, smallest to largest+toShapes :: Double -> SVG -> [(DrawAttributes, Polygon)]+toShapes tol src =+  [ (attrs, plToPolygon tol shape)+  | (_, attrs, glyph) <- svgGlyphs $ lowerTransformations $ pathify src+  , shape <- map mergePolyShapeHoles $ plGroupShapes $ svgToPolyShapes glyph+  ]++unsafeSVGToPolygon :: Double -> SVG -> Polygon+unsafeSVGToPolygon tol src = snd $ head $ toShapes tol src++annotatePolygons :: (Polygon -> SVG) -> SVG -> SVG+annotatePolygons fn svg = mkGroup+  [ fn poly & drawAttributes .~ attr+  | (attr, poly) <- toShapes 0.001 svg+  ]
+ src/Reanimate/Morph/LeastWork.hs view
@@ -0,0 +1,449 @@+{-# LANGUAGE BangPatterns      #-}+{-# LANGUAGE MultiWayIf        #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards   #-}+module Reanimate.Morph.LeastWork+  ( StretchCosts(..)+  , defaultStretchCosts+  , zeroStretchCosts+  , stretchWork+  , BendCosts(..)+  , defaultBendCosts+  , bendWork+  , bendInfo+  , leastWork+  , anyLeastWork+  , rawLeastWork+  , leastWork'+  ) where++import           Control.Monad+import           Control.Monad.ST+import           Control.Monad.ST.Unsafe+import           Data.Array.Base+import           Data.Hashable+import           Data.Maybe+import qualified Data.Vector             as V+import qualified Data.Vector.Unboxed     as VU+import           Linear.Metric+import           Linear.V2+import           Linear.Vector+import           Reanimate.Math.Common+import           Reanimate.Math.Polygon+import           Reanimate.Morph.Cache+import           Reanimate.Morph.Common+import           Reanimate.Morph.Linear+import           System.IO+-- import           Text.Printf++-- import           Debug.Trace++data StretchCosts = StretchCosts+  { stretchStiffness       :: Double+  , stretchCollapsePenalty :: Double+  , stretchElasticity      :: Double+  }++instance Hashable StretchCosts where+  hashWithSalt salt StretchCosts{..} =+    hashWithSalt salt (stretchStiffness, stretchCollapsePenalty, stretchElasticity)++defaultStretchCosts :: StretchCosts+defaultStretchCosts = StretchCosts+  { stretchStiffness       = 1+  , stretchCollapsePenalty = 2+  , stretchElasticity      = 2 }++zeroStretchCosts :: StretchCosts+zeroStretchCosts = defaultStretchCosts{ stretchStiffness = 0 }++-- stretch work paramters:+--   stretch stiffness+--   collapse penalty+--   exponent+stretchWork :: StretchCosts -> Double -> Double -> Double+stretchWork _ 0 0 = 0+stretchWork StretchCosts{..} lenStart lenEnd = checkNaN $+    stretchStiffness * (delta**stretchElasticity)/+    ((1-c)*lenMin + c*lenMax)+  where+    checkNaN v+      | isNaN v   = 0+      | otherwise = v+    c = recip stretchCollapsePenalty+    lenMin = min lenStart lenEnd+    lenMax = max lenStart lenEnd+    delta = lenEnd-lenStart+++data BendCosts = BendCosts+  { bendStiffness        :: Double+  , bendElasticity       :: Double+  , bendDeviationPenalty :: Double+  , bendZeroPenalty      :: Double+  }++instance Hashable BendCosts where+  hashWithSalt salt BendCosts{..} =+    hashWithSalt salt+      (bendStiffness+      ,bendElasticity+      ,bendDeviationPenalty+      ,bendZeroPenalty)++defaultBendCosts :: BendCosts+defaultBendCosts = BendCosts+  { bendStiffness        = 1+  , bendElasticity       = 2+  , bendDeviationPenalty = 10+  , bendZeroPenalty      = 1000 }++type PType = Double++bendWork :: BendCosts -> V2 PType -> V2 PType -> V2 PType -> V2 PType -> Double+bendWork BendCosts{..} startA endA startB endB =+  case bendInfo startA endA startB endB of+    (deltaAngle, deviation, throughZero) ->+      (bendStiffness * (deltaAngle + bendDeviationPenalty * deviation))**bendElasticity ++      if throughZero then bendZeroPenalty else 0++-- deltaX :: Fractional a => V2 a+-- deltaX = V2 (recip 1000000000) 0++-- testBendInfo :: Polygon -> Polygon -> [Int] -> [Int] -> (Double, Double, Bool)+-- testBendInfo a b ~[a1,a2,a3] ~[b1,b2,b3] =+--   let startA = realToFrac <$> (pAccess a a1 - pAccess a a2)+--       endA   = realToFrac <$> (pAccess b b1 - pAccess b b2)+--       endB   = realToFrac <$> (pAccess b b3 - pAccess b b2)+--       startB = realToFrac <$> (pAccess a a3 - pAccess a a2)+--   in bendInfo startA endA startB endB++-- zeroBendFactor :: Fractional a => a+-- zeroBendFactor = 1++vZero :: (Ord a, Fractional a) => V2 a -> Bool+vZero (V2 x y) = abs x < epsilon && abs y < epsilon++bendInfo :: V2 PType -> V2 PType -> V2 PType -> V2 PType -> (Double, Double, Bool)+-- bendInfo startA endA startB endB+--   | vZero startA, not (vZero endA) = bendInfo (endA ^* zeroBendFactor) endA startB endB+--   | vZero endA, not (vZero startA) = bendInfo startA (startA ^* zeroBendFactor) startB endB+--   | vZero startB, not (vZero endB) = bendInfo startA endA (endB ^* zeroBendFactor) endB+--   | vZero endB, not (vZero startB) = bendInfo startA endA startB (startB ^* zeroBendFactor)+bendInfo startA endA startB endB =+    -- trace (show $ map (fmap realToFrac) [startA, endA, startB, endB]) $+    -- trace (show (realToFrac <$> q0, realToFrac <$> q1, realToFrac <$> q2)) $+    -- (ang4, alpha+beta, throughZero)+    (ang4, alpha+beta, throughZero)+  where+    !x0 = dot startA startB+    !y0 = crossZ startA startB+    !x1 = (dot endA startB + dot startA endB) / 2+    !y1 = (crossZ endA startB + crossZ startA endB) / 2+    !x2 = dot endA endB+    !y2 = crossZ endA endB+    fudge x | vZero x = V2 (-0.1) 0+    fudge x = x+    q0,q1, q2 :: V2 PType+    !q0 = fudge $ V2 x0 y0+    !q1 = V2 x1 y1+    !q2 = fudge $ V2 x2 y2+    curve n = q0^*squared (1-n) + q1^*(2*n*(1-n)) + q2^*squared n+    squared a = a*a+    ang3 = abs (angleR q0 q2)+    ang4 = if isWrap then 2*pi - ang3 else ang3+    d0 = crossZ q0 q1+    d1 = crossZ q0 q2 / 2+    d2 = crossZ q1 q2+    roots = filter (>0) $ filter (<1) $ quadraticRoot (d0+d2-2*d1) (2*d1-2*d0) d0+    alpha = fromMaybe 0 $ listToMaybe+      [ min q0Angle q2Angle - ang+      | root <- roots+      , let ang = angleR (V2 1 0) (curve root)+      , ang < min q0Angle q2Angle  ]+    beta = fromMaybe 0 $ listToMaybe+      [ ang - max q0Angle q2Angle+      | root <- roots+      , let ang = angleR (V2 1 0) (curve root)+      , ang > max q0Angle q2Angle  ]+    q0Angle = angleR (V2 1 0) q0+    q2Angle = angleR (V2 1 0) q2+    isWrap = d1*d1 - d0*d2 < 0 && isInside q0 q1 q2 (V2 0 0)+    throughZero = quadThroughZero q0 q1 q2++angleR :: V2 Double -> V2 Double -> Double+angleR a b = atan2 (realToFrac $ crossZ a b) (realToFrac $ dot a b)++leastWork :: StretchCosts -> BendCosts -> PointCorrespondence+leastWork stretchCosts bendCosts =+    cachePointCorrespondence key (leastWork_ stretchCosts bendCosts)+  where+    key = hash ("leastWork v0"::String, stretchCosts, bendCosts)++leastWork_ :: StretchCosts -> BendCosts -> PointCorrespondence+leastWork_ stretchCosts bendCosts src dst+  | pSize src > pSize dst =+    case leastWork stretchCosts bendCosts dst src of+      (dst', src') -> (src', dst')+leastWork_ stretchCosts bendCosts src dst =+    worker undefined (-1) options+  where+    worker bestP _bestPScore [] =+      --trace ("\nBest score: " ++ show _bestPScore)+      bestP+    worker bestP bestPScore (x:xs) =+      let (src',dst', newScore) = leastWork' stretchCosts bendCosts src x in+      if newScore < bestPScore || bestPScore < 0+        then worker (src',dst') newScore xs+        else worker bestP bestPScore xs+    options = pCycles dst+    -- options = [pCycles dst !! 79 ]++anyLeastWork :: StretchCosts -> BendCosts -> PointCorrespondence+anyLeastWork stretchCosts bendCosts src dst =+  case closestLinearCorrespondence src dst of+    (src', dst') -> case leastWork' stretchCosts bendCosts src' dst' of+      (src'', dst'', _score) -> (src'', dst'')++rawLeastWork :: StretchCosts -> BendCosts -> PointCorrespondence+rawLeastWork stretchCosts bendCosts src dst =+  case leastWork' stretchCosts bendCosts src dst of+    (src', dst', _score) -> (src', dst')++-- type PointCorrespondence = Polygon → Polygon → (Polygon, Polygon)+leastWork' :: StretchCosts -> BendCosts -> Polygon -> Polygon -> (Polygon, Polygon, Double)+leastWork' stretchCosts bendCosts src dst =+    leastWork'' stretchCosts bendCosts src dst+      srcV dstV (mkDistances srcV) (mkDistances dstV)+  where+    srcV = V.map (fmap realToFrac) $ polygonPoints src+    dstV = V.map (fmap realToFrac) $ polygonPoints dst+    mkDistances poly = VU.generate (length poly) $ \i ->+      distance (V.unsafeIndex poly i) (V.unsafeIndex poly ((i+1) `mod` length poly))++leastWork'' :: StretchCosts -> BendCosts -> Polygon -> Polygon+  -> V.Vector (V2 Double) -> V.Vector (V2 Double)+  -> VU.Vector Double -> VU.Vector Double+  -> (Polygon, Polygon, Double)+leastWork'' stretchCosts bendCosts src dst srcV dstV srcDist dstDist = runST $ do+    -- unsafeIOToST $ hPutStrLn stderr $ "Size: " ++ show (nSrc, nDst)+    -- unsafeIOToST $ hFlush stderr+    work <- asArray $ newArray ((0,0),(nSrc,nDst)) (0::Double)+    north <- asArray $ newArray ((0,0),(nSrc,nDst)) (0::Int)+    west <- asArray $ newArray ((0,0),(nSrc,nDst)) (0::Int)+    let -- calc :: Int -> Int -> ST s ()+        calc = \i j -> do+          let cond = False -- i==14 && j==26+          w0 <- if i==0 then return 0 else do+            prevWork <- readArray work (i-1,j)+            prevWest <- readArray west (i-1,j)+            prevNorth <- readArray north (i-1,j)+            let !len = VU.unsafeIndex srcDist (i-1)+                -- !len = distance (realToFrac <$> pAccess src (i-1)) (realToFrac <$> pAccess src i)+                !sWork = stretchWork stretchCosts len 0+                -- !srcPrev   = realToFrac <$> pAccess src (i-1-prevWest)+                !srcPrev   = V.unsafeIndex srcV (i-1-prevWest)+                -- !srcMiddle = realToFrac <$> pAccess src (i-1)+                !srcMiddle   = V.unsafeIndex srcV (i-1)+                -- !srcNext   = realToFrac <$> pAccess src i+                !srcNext   = V.unsafeIndex srcV i+                -- !dstPrev   = realToFrac <$> pAccess dst (j-prevNorth)+                !dstPrev   = V.unsafeIndex dstV (j-prevNorth)+                -- !dstMiddle = realToFrac <$> pAccess dst j+                !dstMiddle = V.unsafeIndex dstV j+                !bWork =+                  bendWork bendCosts+                    (srcPrev-srcMiddle) (dstPrev-dstMiddle)+                    (srcNext-srcMiddle) (V2 0 0)+            -- when (len' /= len) $ do+            --   error $ "w0: Bad length: " ++ show (len', len, i, j)+            when cond $ do+              unsafeIOToST $ hPutStrLn stderr $ "West:  " ++ show (i-1-prevWest, i-1, i)+              unsafeIOToST $ hPutStrLn stderr $ "West:  " ++ show (j-prevNorth, j, j)+              unsafeIOToST $ hPutStrLn stderr $ "bWork: " ++ show (bWork)+              unsafeIOToST $ hPutStrLn stderr $ "len:    " ++ show (len)+              unsafeIOToST $ hPutStrLn stderr $ "sWork:  " ++ show (sWork)+            return (prevWork + sWork + bWork + if prevWest==0&&prevNorth==1 then 10000 else 0)+          w1 <- if j==0 then return 0 else do+            prevWork <- readArray work (i,j-1)+            prevWest <- readArray west (i,j-1)+            prevNorth <- readArray north (i,j-1)+            let len = VU.unsafeIndex dstDist (j-1)+                --len = distance (realToFrac <$> pAccess dst (j-1)) (realToFrac <$> pAccess dst j)+                sWork = stretchWork stretchCosts 0 len+                -- srcPrev   = realToFrac <$> pAccess src (i-prevWest)+                -- srcMiddle = realToFrac <$> pAccess src i+                -- dstPrev   = realToFrac <$> pAccess dst (j-1-prevNorth)+                -- dstMiddle = realToFrac <$> pAccess dst (j-1)+                -- dstNext   = realToFrac <$> pAccess dst j+                srcPrev   = V.unsafeIndex srcV (i-prevWest)+                srcMiddle = V.unsafeIndex srcV i+                dstPrev   = V.unsafeIndex dstV (j-1-prevNorth)+                dstMiddle = V.unsafeIndex dstV (j-1)+                dstNext   = V.unsafeIndex dstV j+                bWork =+                  bendWork bendCosts+                      (srcPrev-srcMiddle) (dstPrev-dstMiddle)+                      (V2 0 0) (dstNext-dstMiddle)+            -- when (len' /= len) $ do+            --   error $ "w1: Bad length: " ++ show (len', len, j, realToFrac <$> pAccess dst (j-1),  realToFrac <$> pAccess dst j)+            when (isNaN bWork) $+              error $ "bWork NaN: " ++ show (i,j)+            when (isNaN sWork) $+              error $ "sWork NaN: " ++ show (i,j, len)+            when cond $ do+              unsafeIOToST $ hPutStrLn stderr $ "North:  " ++ show (i-prevWest, i, i)+              unsafeIOToST $ hPutStrLn stderr $ "North:  " ++ show (j-1-prevNorth, j-1, j)+              unsafeIOToST $ hPutStrLn stderr $ "bWork:  " ++ show (bWork)+              unsafeIOToST $ hPutStrLn stderr $ "len:    " ++ show (len)+              unsafeIOToST $ hPutStrLn stderr $ "sWork:  " ++ show (sWork)+            return (prevWork + sWork + bWork + if prevWest==1&&prevNorth==0 then 10000 else 0)+          w2 <- if j==0 || i==0 then return 0 else do+            prevWork <- readArray work (i-1,j-1)+            prevWest <- readArray west (i-1,j-1)+            prevNorth <- readArray north (i-1,j-1)+            -- let findPrev key = do+            --       keyNorth <- readArray north+            let -- startLen = distance (realToFrac <$> pAccess src (i-1)) (realToFrac <$> pAccess src i)+                -- endLen = distance (realToFrac <$> pAccess dst (j-1)) (realToFrac <$> pAccess dst j)+                startLen = VU.unsafeIndex srcDist (i-1)+                endLen = VU.unsafeIndex dstDist (j-1)+                sWork = stretchWork stretchCosts startLen endLen+                -- srcPrev   = realToFrac <$> pAccess src (i-1-prevWest)+                -- srcMiddle = realToFrac <$> pAccess src (i-1)+                -- srcNext   = realToFrac <$> pAccess src i+                -- dstPrev   = realToFrac <$> pAccess dst (j-1-prevNorth)+                -- dstMiddle = realToFrac <$> pAccess dst (j-1)+                -- dstNext   = realToFrac <$> pAccess dst j+                srcPrev   = V.unsafeIndex srcV (i-1-prevWest)+                srcMiddle = V.unsafeIndex srcV (i-1)+                srcNext   = V.unsafeIndex srcV i+                dstPrev   = V.unsafeIndex dstV (j-1-prevNorth)+                -- dstPrev'   = V.unsafeIndex dstV (j-2)+                dstMiddle = V.unsafeIndex dstV (j-1)+                dstNext   = V.unsafeIndex dstV j+                bWork =+                  bendWork bendCosts+                    (srcPrev-srcMiddle) (dstPrev-dstMiddle)+                    (srcNext-srcMiddle) (dstNext-dstMiddle)+                -- bWork' =+                --   bendWork bendCosts+                --     (srcPrev-srcMiddle) (dstPrev'-dstMiddle)+                --     (srcNext-srcMiddle) (dstNext-dstMiddle)+            when cond $ do+              unsafeIOToST $ hPutStrLn stderr $ "Diag:  " ++ show (i-1-prevWest, i-1, i)+              unsafeIOToST $ hPutStrLn stderr $ "Diag:  " ++ show (j-1-prevNorth, j-1, j)+              unsafeIOToST $ hPutStrLn stderr $ "bWork: " ++ show (bWork)+              -- unsafeIOToST $ hPutStrLn stderr $ "bWork': " ++ show (bWork')+            return (prevWork + sWork + bWork)+          let goNorth = do+                when cond $ do+                  unsafeIOToST $ hPutStrLn stderr "Go north"+                  unsafeIOToST $ hPrint stderr (w0, w1, w2)+                writeArray work (i,j) w1+                writeArray north (i,j) 1+              goWest = do+                when cond $ do+                  unsafeIOToST $ hPutStrLn stderr "Go west"+                  unsafeIOToST $ hPrint stderr (w0, w1, w2)+                writeArray work (i,j) w0+                writeArray west (i,j) 1+              goNorthWest = do+                when cond $+                  unsafeIOToST $ hPutStrLn stderr "Go northwest"+                writeArray work (i,j) w2+                writeArray north (i,j) 1+                writeArray west (i,j) 1+          -- when (j==2 && i==2) $+          --   unsafeIOToST $ hPrint stderr (i,j,w0, w1, w2)+          when (isNaN w0 || isNaN w1 || isNaN w2) $+            error $ "NaN: " ++ show (w0,w1,w2, i, j)+          if | i==0                 -> goNorth+             | j==0                 -> goWest+             | w2 <= w0 && w2 <= w1 -> goNorthWest+             | w0 <= w1 && w0 <= w2 -> goWest+             | w1 <= w0 && w1 <= w2 -> goNorth+             | otherwise            -> error $ "urk: " ++ show (w0, w1, w2, i, j)+    forM_ [1.. max nSrc nDst-1] $ \idx -> do+      forM_ [0..idx-1] $ \i -> do+        when (idx < nSrc && i < nDst) $+          calc idx i+        when (i < nSrc && idx < nDst) $+          calc i idx+      when (idx < nSrc && idx < nDst) $+        calc idx idx+    -- workMatrix <- unsafeFreeze work+    -- unsafeIOToST $ do+    --   hPutStr stderr "   "+    --   forM_ [0..nSrc-1] $ \i -> do+    --     hPutStr stderr (printf "%6d " i)+    --   hPutStr stderr "\n"+    --   forM_ [0..nDst-1] $ \j -> do+    --     hPutStr stderr (printf "%2d " j)+    --     forM_ [0..nSrc-1] $ \i -> do+    --       hPutStr stderr (printf "%6.1f " (workMatrix ! (i,j)))+    --     hPutStr stderr "\n"+    finalWork <- readArray work (nSrc-1,nDst-1)+    let walk = \i j acc -> do+          -- w <- readArray work (i,j)+          -- when (i==14) $+          --   unsafeIOToST $ hPrint stderr (i,j)+          let acc' = (i,j):acc+          if (i==0 && j==0)+            then return acc'+            else do+              isNorth <- (==1) <$> readArray north (i,j)+              isWest  <- (==1) <$> readArray west (i,j)+              if | isNorth && isWest -> walk (i-1) (j-1) acc'+                 | isNorth           -> walk i (j-1) acc'+                 | otherwise         -> walk (i-1) j acc'+    pairs <- walk (nSrc-1) (nDst-1) []+    return+      ( mkPolygon $ V.fromList [ pAccess src idx | idx <- map fst pairs ]+      , mkPolygon $ V.fromList [ pAccess dst idx | idx <- map snd pairs ]+      , finalWork+      )+  where+    nSrc = pSize src+    nDst = pSize dst+    asArray :: ST s (STUArray s i e) -> ST s (STUArray s i e)+    asArray = id++{-+quadToCubic (QuadBezier a b c) =+  CubicBezier a ((1/3)*^(a ^+^ 2*^b)) ((1/3)*^(2*^b ^+^ c)) c++cubicRoot (p3 - 3*p2 + 3*p1 - p0) (3*p2 - 6*p1 + 3*p0) (3*p1 - 3*p0) p0+  where (CubicBezier (Point p0 _) (Point p1 _) (Point p2 _) (Point p3 _)) = b++p3 = a+p2 = ((1/3)*^(a ^+^ 2*^b))+p1 = ((1/3)*^(2*^b ^+^ c))+p0 = c+cubicRoot 0 (a - 2b + c) (2b - 2c) c+-}++quadThroughZero :: V2 Double -> V2 Double -> V2 Double -> Bool+quadThroughZero a@(V2 _ q0) b@(V2 _ q1) c@(V2 _ q2) =+    any (xPositive . eval) $ filter (\x -> x > 0 && x < 1) extrema+  where+    xPositive (V2 x _) = x>0+    eval n = a^*squared (1-n) + b^*(2*n*(1-n)) + c^*squared n+    squared x = x*x+    extrema = quadraticRoot (q2-2*q1+q0) (2*q1-2*q0) q0++quadraticRoot :: Double -> Double -> Double -> [Double]+quadraticRoot a b c+  | a == 0 && b == 0 = []+  | a == 0 = [-c/b]+  | otherwise = result+  where+    d = b*b - 4*a*c+    bSign | b < 0 = -1+          | otherwise = 1+    q = - (b + bSign * sqrt d) / 2+    x1 = q/a+    x2 = c/q+    result | d < 0     = []+           | d == 0    = [x1]+           | otherwise = [x1, x2]
+ src/Reanimate/Morph/LineBend.hs view
@@ -0,0 +1,108 @@+module Reanimate.Morph.LineBend+  ( lineBend+  , lineBendRaw+  ) where++import qualified Data.Vector            as V+import           Linear.Matrix          (det22)+import           Linear.Metric+import           Linear.V2+import           Linear.Vector+import           Reanimate.Math.Common+import           Reanimate.Math.Polygon+import           Reanimate.Morph.Common++lineBend :: Trajectory+lineBend = lineBend' True++lineBendRaw :: Trajectory+lineBendRaw = lineBend' False++-- Note: Returns polygon with n+1 elements.+lineBend' :: Bool -> Trajectory+lineBend' corrected (a,b) = \t ->+    let u = 1 - t+        -- phi = V.zipWith (\l r -> u*l + t*r) phi_a phi_b+        phi = V.zipWith (\l r -> lerpAngle l r t) phi_a phi_b+        -- alpha_zero = u * alpha_a_zero + t * alpha_b_zero+        alpha_zero = lerpAngle alpha_a_zero alpha_b_zero t+        alpha = V.scanl (+) alpha_zero phi+        bigE =+          V.sum $ V.zipWith (\diff alp -> squared diff * squared (cos alp)) lengths_diff alpha+        bigF =+          V.sum $ V.zipWith (\diff alp -> squared diff * sin alp * cos alp) lengths_diff alpha+        bigG =+          V.sum $ V.zipWith (\diff alp -> squared diff * squared (sin alp)) lengths_diff alpha+        bigU =+          2 * V.sum+          (V.zipWith3 (\len_a len_b alp -> (u*len_a + t*len_b) * cos alp) lengths_a lengths_b alpha)+        bigV =+          2 * V.sum+          (V.zipWith3 (\len_a len_b alp -> (u*len_a + t*len_b) * sin alp) lengths_a lengths_b alpha)+        lam1 = det22 (V2 (V2 bigU bigF) (V2 bigV bigG)) /+               det22 (V2 (V2 bigE bigF) (V2 bigF bigG))+        lam2 = det22 (V2 (V2 bigE bigU) (V2 bigF bigV)) /+               det22 (V2 (V2 bigE bigF) (V2 bigF bigG))+        s_vect = V.fromList+          [ -0.5 * squared (lengths_diff V.! n) *+            (lam1 * cos (alpha V.! n) ++             lam2 * sin (alpha V.! n))+          | n <- [0 .. pSize a-1]]+        lengths = V.zipWith3 (\l r s -> u*l + t*r + if corrected then s else 0) lengths_a lengths_b s_vect+        movingCenter :: V2 Double+        movingCenter = lerp t (realToFrac <$> pCentroid b) (realToFrac <$> pCentroid a)+        centerAng :: Double+        centerAng = lerpAngle centoid_angle_a centoid_angle_b t+        centerLen = u*centoid_len_a + t*centoid_len_b+        -- V2 x_zero y_zero = lerp t (realToFrac <$> b V.! 0) (realToFrac <$> a V.! 0)+        V2 x_zero y_zero = movingCenter + V2 (cos centerAng * centerLen) (sin centerAng * centerLen)+        x_modifiers = V.zipWith (*) lengths (V.map cos alpha)+        y_modifiers = V.zipWith (*) lengths (V.map sin alpha)+        xs = V.scanl (+) x_zero x_modifiers+        ys = V.scanl (+) y_zero y_modifiers+    in mkPolygon $ V.map (fmap realToFrac) $ V.zipWith V2 xs ys+  where+    squared x = x*x+    centoid_angle_a :: Double+    centoid_angle_a = lineAngle (pCentroid a + V2 1 0) (pCentroid a) (pAccess a 0)+    centoid_angle_b = lineAngle (pCentroid b + V2 1 0) (pCentroid b) (pAccess b 0)+    centoid_len_a :: Double+    centoid_len_a = realToFrac $ approxDist (pCentroid a) (pAccess a 0)+    centoid_len_b = realToFrac $ approxDist (pCentroid b) (pAccess b 0)+    alpha_a_zero = lineAngle (pAccess a 0 + V2 1 0) (pAccess a 0) (pAccess a 1)+    alpha_b_zero = lineAngle (pAccess b 0 + V2 1 0) (pAccess b 0) (pAccess b 1)+    lengths_a = computeLength a+    lengths_b = computeLength b+    lengths_diff' = V.zipWith (\l r -> abs (l-r)) lengths_a lengths_b+    lengths_tol = 0.0001 * V.maximum lengths_diff'+    lengths_diff = V.map (max lengths_tol) lengths_diff'+    phi_a = computePhi a+    phi_b = computePhi b++    computeLength :: Polygon -> V.Vector Double+    computeLength poly = V.fromList+      [ realToFrac $ approxDist this next+      | n <- [0 .. pSize poly-1]+      , let this = pAccess poly n+            next = pAccess poly (pNext a n)+      ]+    computePhi poly = V.fromList $+      [ negate $ angle' (next-this) ((prev-this) ^* (-1))+      | n <- [1 .. pSize poly-1]+      , let prev = pAccess poly (n-1)+            this = pAccess poly n+            next = pAccess poly (pNext a n)+      ]++lerpAngle :: Double -> Double -> (Double -> Double)+lerpAngle fromAng toAng t+  | abs (fromAng - (toAng+2*pi)) < abs (fromAng - toAng) = (1-t)*fromAng + t*(toAng+2*pi)+  | abs (fromAng - (toAng-2*pi)) < abs (fromAng - toAng) = (1-t)*fromAng + t*(toAng-2*pi)+  | otherwise = (1-t)*fromAng + t*toAng++-- Angle from a through b to c. Measured on the right-hand side, from 0 to tau+lineAngle :: V2 Rational -> V2 Rational -> V2 Rational -> Double+lineAngle a b c = angle' (a-b) (c-b)++angle' :: V2 Rational -> V2 Rational -> Double+angle' a b = atan2 (realToFrac $ crossZ a b) (realToFrac $ dot a b)
+ src/Reanimate/Morph/Linear.hs view
@@ -0,0 +1,52 @@+module Reanimate.Morph.Linear+  ( linear, rawLinear+  , linearCorrespondence+  , closestLinearCorrespondence+  , linearTrajectory+  ) where++import           Data.Hashable+import qualified Data.Vector            as V+import           Linear.Vector+import           Reanimate.Interpolate+import           Reanimate.Math.Common+import           Reanimate.Math.Polygon+import           Reanimate.Morph.Cache+import           Reanimate.Morph.Common++linear :: Morph+linear = rawLinear+  { morphPointCorrespondence  =+      cachePointCorrespondence (hash ("closest"::String))+        closestLinearCorrespondence }++rawLinear :: Morph+rawLinear = Morph+  { morphTolerance            = 0.001+  , morphColorComponents      = labComponents+  , morphPointCorrespondence  = linearCorrespondence+  , morphTrajectory           = linearTrajectory+  , morphObjectCorrespondence = splitObjectCorrespondence }++linearCorrespondence :: PointCorrespondence+linearCorrespondence = normalizePolygons++closestLinearCorrespondence :: PointCorrespondence+closestLinearCorrespondence src' dst' =+    (src, worker dst (score dst) options)+  where+    (src, dst) = normalizePolygons src' dst'+    worker bestP _bestPScore [] = bestP+    worker bestP bestPScore (x:xs) =+      let newScore = score x in+      if newScore < bestPScore+        then worker x newScore xs+        else worker bestP bestPScore xs+    options = pCycles dst+    score = V.sum . V.zipWith approxDist (polygonPoints src) . polygonPoints++linearTrajectory :: Trajectory+linearTrajectory (src,dst)+  | pSize src == pSize dst = \t -> mkPolygon $+    V.zipWith (lerp $ realToFrac t) (polygonPoints dst) (polygonPoints src)+  | otherwise = error $ "Invalid lengths: " ++ show (pSize src, pSize dst)
+ src/Reanimate/Morph/Rigid.hs view
@@ -0,0 +1,265 @@+{-# LANGUAGE RecordWildCards #-}+{-+The shape of a triangle can be represented by two explicit points (ie vectors)+and a third implicit point at (0,0). A triangle defined by three points can be+converted by subtracting one of the points from the others:+  shape (p1,p2,p3) = (p2-p1, p3-p1)+This keeps the shape intact but drops the position of the triangle.++If P and Q are two such triangles, there exists a matrix A that transforms+P into Q: AP = Q+The 'A' matrix can be calculated by multiplying Q and the inverse of P:+  A = QP_inv++So, if we have a set of triangles, we can drop their positional information+and compute their shape transformation matrices. But can we do it in reverse?+Can we start with a set of transformation matrices (which don't give us the+positions of the triangles) and compute a set of points that represent triangles+with the right transformation?+In other words, if we have a set of triangles (with absolute position) and+a transformation matrix for each triangle, can we compute new absolute positions+such that AP=Q?++Solving this is not straightforward as moving a single point will change the+transformation of multiple triangles. Fortunately, though, this problem can be+expression as linear equations and solved quickly with LAPACK.++To express the problem as a linear system, we need 4 equations for each+triangle and 2 unknowns for each point.++The system has this shape: Mx=B+We're trying to find 'x' which are the positions of the new points.+'M' is a matrix that transforms points into transformation matrices.+'B' is the target transformation matrices.++With a bit of rewriting, we can reduce 'A = QP_inv' to 4 linear equations+with 6 unknowns. The 6 unknowns are the x and y positions for the three corners+in a triangle.+This is just another way of calculating the transformation matrix 'A' and we+can verify it by looking at the output of:+  * computeA src dst+  * applyCoeff (coeffOfB src) dst+The output should be the same because they're both computing 'A'.++'applyCoeff' simply multiplies the coefficients by a 6x1 matrix containing+the x and y positions for 'dst'.++So, this means we have roughly the right shape: Mx=B. M is the coefficients+we found for 'src', 'x' is dst, and 'B' is the transformation matrix that+turns 'src' into 'dst'.+We can get the coefficients for each triangle and place them together in a+single large matrix. Then we can put the desired transformation matrices in 'B'+and ask a linear solver to find 'x' which satisfies the equations.++Phew, step one is done. We now have the machinery for turning arbitrary+transformation matrices into proper, connected triangles. Next step is figuring+out which rotational matrices to use. At the two extremes, we have the identity+matrices (representing our starting shape) and the matrices computed from the+target triangles (represetning out target shape). How can these two matrices be+interpolated for a smooth morph?++There are several ways of interpolating matrices. Linear interpolation is+possible. But, it looks prettier if we separate rotation from shear. Then we+can use spherical linear interpolation on the rotation and linear interpolation+on the shear.++-}+module Reanimate.Morph.Rigid where++import           Data.Foldable (toList)+import           Data.Vector                   (Vector)+import qualified Data.Vector                   as V+import           Linear.Quaternion+import           Linear.Vector+import           Linear.V2+import           Linear.V3+import qualified Numeric.LinearAlgebra         as Matrix+import           Numeric.LinearAlgebra.HMatrix (GMatrix, Matrix,+                                                toLists, (!), (><))++type P = V2 Double+type Trig = (P,P,P)+type RelTrig = (Int,Int,Int)++data Mesh = Mesh+  { meshPointsA :: Vector P+  , meshPointsB :: Vector P+  , meshOutline :: Vector Int+  -- , meshSteiner :: Vector Int+  , meshTriangles :: Vector RelTrig }++-- applyA (computeA a b) a = b + some_constant_translation+-- A = Q P_inv+computeA :: Trig -> Trig -> Matrix Double+computeA p q = matQ <> Matrix.inv matP+  where+    matP = trigToMatrix p+    matQ = trigToMatrix q++-- A = UDV = U(VV_t)DV = (UV)(V_tDV) = RS+-- R = UV+-- S = V_tDV+computeRS :: Matrix Double -> (Matrix Double, Matrix Double)+computeRS a = (r, s)+  where+    (u,d,vt) = Matrix.svd a+    v = Matrix.tr vt+    r = u <> v+    s = vt <> Matrix.diag d <> v++matrixToQuaternion :: Matrix Double -> Quaternion Double+matrixToQuaternion r =  q+  where+    w = 0.5 * sqrt (1 + r!0!0 + r!1!1 + 1)+    z = 1/(4*w) * (r!0!1 - r!1!0)+    q = Quaternion w (V3 0 0 z)++quaternionToMatrix :: Quaternion Double -> Matrix Double+quaternionToMatrix q = (2><2)+    [ 1 - 2*(qj*qj + qk*qk), 2*(qi*qj+qk*qr)+    , 2*(qi*qj - qk*qr), 1 - 2*(qi*qi + qk*qk) ]+  where+    [qr,qi,qj,qk] = toList q++-- A = R((1-t)I + tS)+computeA_RSt :: Matrix Double -> Matrix Double -> Double -> Matrix Double+computeA_RSt r s t = r_t <> (realToFrac (1-t) * Matrix.ident 2 + realToFrac t * s)+  where+    i = Quaternion 1 0+    q = slerp i (matrixToQuaternion r) t+    r_t = quaternionToMatrix q++applyA :: Matrix Double -> Trig -> Trig+applyA a p =+    case toLists (a <> matP) of+      [ [x1, x2], [y1, y2] ] -> (V2 0 0, V2 x1 y1, V2 x2 y2)+      _ -> error "invalid matrix"+  where+    matP = trigToMatrix p++coeffOfB :: Trig -> Matrix Double+coeffOfB p = (4><6)+    [ -a0-a2,      0, a0,   0, a2,  0+    , -a1-a3,      0, a1,   0, a3,  0+    ,      0, -a0-a2,  0,  a0,  0, a2+    ,      0, -a1-a3,  0,  a1,  0, a3 ]+  where+    [[a0,a1],[a2,a3]] = toLists (Matrix.inv (trigToMatrix p))++applyCoeff :: Matrix Double -> Trig -> Matrix Double+applyCoeff b (V2 x1 y1, V2 x2 y2, V2 x3 y3) = b <> matQ+  where+    matQ = (6><1) [ x1, y1, x2, y2, x3, y3]++trigToMatrix :: Trig -> Matrix Double+trigToMatrix (p1,p2,p3) = matP+  where+    V2 p12x p12y = p2-p1+    V2 p13x p13y = p3-p1+    matP = (2><2)+      [p12x, p13x+      ,p12y, p13y]++++data Prep = Prep+  { prepPivot    :: (P, P)+  , prepPointsA  :: Vector P+  , prepPointsB  :: Vector P+  , prepRS       :: Vector (Matrix Double, Matrix Double)+  , prepRSRev    :: Vector (Matrix Double, Matrix Double)+  , prepUToB     :: GMatrix+  }++symmetric :: Bool+symmetric = True++prepare :: Mesh -> Prep+prepare Mesh{..} = Prep+    { prepPivot = (aOrigin, bOrigin)+    , prepPointsA =+        V.map (subtract aOrigin) $+        V.take pivotIdx meshPointsA <> V.drop (pivotIdx+1) meshPointsA+    , prepPointsB =+        V.map (subtract bOrigin) $+        V.take pivotIdx meshPointsB <> V.drop (pivotIdx+1) meshPointsB+    , prepRS = rsList+    , prepRSRev = rsRevList+    , prepUToB = Matrix.mkSparse uToB }+  where+    aOrigin = meshPointsA V.! pivotIdx+    bOrigin = meshPointsB V.! pivotIdx+    pivotIdx = case V.head meshTriangles of+        (a,_,_) -> a+    mkAbs p (a,b,c) = (p V.! a,p V.! b,p V.! c)+    absATrigs = V.map (mkAbs meshPointsA) meshTriangles+    absBTrigs = V.map (mkAbs meshPointsB) meshTriangles+    aList = V.zipWith computeA absATrigs absBTrigs+    rsList = V.map computeRS aList+    revList = V.zipWith computeA absBTrigs absATrigs+    rsRevList = V.map computeRS revList+    n = length meshTriangles+    -- nT = if symmetric then n*2 else n+    -- pivotToB = ((nT*4)><2) $ concat+    --   [ [ fromMaybe 0 (lookup (x,pivotIdx*2) bigM)+    --     , fromMaybe 0 (lookup (x,pivotIdx*2+1) bigM)]+    --   | x <- [0..(nT*4)-1] ]+    uToB =+      [ ((x,y-2),key) | ((x,y),key) <- bigM, y /= pivotIdx*2 && y /= pivotIdx*2+1 ]+    bigM =+      concat (zipWith worker [0..] (V.toList meshTriangles)) +++      if symmetric+        then concat $ zipWith workerRev [n..] (V.toList meshTriangles)+        else []+    worker i src@(a,b,c) = concat $+      let effs = coeffOfB (mkAbs meshPointsA src) in+      [ [((i*4+h, e*2), effs!h!(j*2))+        ,((i*4+h, e*2+1), effs!h!(j*2+1))]+      | h <- [0..3]+      , (e,j) <- zip [a,b,c] [0..]+      ]+    workerRev i dst@(a,b,c) = concat $+      let effs = coeffOfB (mkAbs meshPointsB dst) in+      [ [((i*4+h, e*2), effs!h!(j*2))+        ,((i*4+h, e*2+1), effs!h!(j*2+1))]+      | h <- [0..3]+      , (e,j) <- zip [a,b,c] [0..]+      ]++interpolate :: Prep -> Double -> Vector P+interpolate Prep{..} t = V.fromList $+    pivot : worker (Matrix.toList solution)+  where+    -- solution = Matrix.cgSolve False prepUToB b+    solution = Matrix.cgx $ last solutions+    solutions = Matrix.cgSolve'+      False+      1e-9+      1e-9+      1000+      prepUToB+      b+      (Matrix.fromList $ concat [ [x,y] | V2 x y <- V.toList target ])+      -- 0+    target = if t < 0.5+      then prepPointsA+      else prepPointsB+    worker (x:y:xs) = V2 x y ^+^ pivot : worker xs+    worker _ = []+    pivot = case prepPivot of+      (src, dst) -> lerp t dst src+    n = V.length prepRS+    b = Matrix.vector $+      [ concat (toLists a)!!j+      | i <- [0..n-1]+      , let (r,s) = prepRS V.! i+      , let a = computeA_RSt r s t+      , j <- [0..3]+      ] +++      [ concat (toLists a)!!j+      | symmetric+      , i <- [0..n-1]+      , let (r,s) = prepRSRev V.! i+      , let a = computeA_RSt r s (1-t)+      , j <- [0..3]+      ]
+ src/Reanimate/Morph/Rotational.hs view
@@ -0,0 +1,56 @@+module Reanimate.Morph.Rotational+  ( rotationalTrajectory+  , polygonOrigin+  ) where++import qualified Data.Vector            as V+import           Linear.Vector+import           Linear.V2+import           Linear.Metric++import           Reanimate.Signal+import           Reanimate.Morph.Common+import           Reanimate.Math.Polygon++type Origin = (Double, Double)++rotationalTrajectory :: Origin -> Trajectory+rotationalTrajectory origin (src,dst) =+    \t ->+      let thisOrigin = lerp t dstOrigin srcOrigin in+      mkPolygon $+      V.generate (pSize src) $ \i ->+        let len = fromToS (srcLengths V.! i) (dstLengths V.! i) t+            ang = lerpAngle (srcAngles V.! i) (dstAngles V.! i) t+        in realToFrac <$> (thisOrigin + V2 (cos ang * len) (sin ang * len))+  where+    srcOrigin = polygonOrigin src origin+    dstOrigin = polygonOrigin dst origin+    srcLengths :: V.Vector Double+    srcLengths = V.map (distance srcOrigin . fmap realToFrac) $ polygonPoints src+    dstLengths = V.map (distance dstOrigin . fmap realToFrac) $ polygonPoints dst+    srcAngles = V.map (originAngle srcOrigin . fmap realToFrac) $ polygonPoints src+    dstAngles = V.map (originAngle dstOrigin . fmap realToFrac) $ polygonPoints dst++    originAngle o = lineAngle (o + V2 1 0) o++polygonOrigin :: Polygon -> Origin -> V2 Double+polygonOrigin poly (originX, originY) =+  case pBoundingBox poly of+    (polyX, polyY, polyWidth, polyHeight) ->+      V2 (realToFrac polyX + realToFrac polyWidth * originX)+         (realToFrac polyY + realToFrac polyHeight * originY)+++lerpAngle :: Double -> Double -> Double -> Double+lerpAngle fromAng toAng t+  | abs (fromAng - (toAng+2*pi)) < abs (fromAng - toAng) = (1-t)*fromAng + t*(toAng+2*pi)+  | abs (fromAng - (toAng-2*pi)) < abs (fromAng - toAng) = (1-t)*fromAng + t*(toAng-2*pi)+  | otherwise = (1-t)*fromAng + t*toAng++-- Angle from a through b to c.+lineAngle :: V2 Double -> V2 Double -> V2 Double -> Double+lineAngle a b c = angle' (a-b) (c-b)++angle' :: V2 Double -> V2 Double -> Double+angle' a b = atan2 (crossZ a b) (dot a b)
src/Reanimate/PolyShape.hs view
@@ -2,6 +2,7 @@   ( PolyShape(..)   , PolyShapeWithHoles(..)   , svgToPolyShapes     -- :: Tree -> [PolyShape]+  , svgToPolygons       -- :: Double -> Svg -> [Polygon]    , renderPolyShape     -- :: PolyShape -> Tree   , renderPolyShapes    -- :: [PolyShape] -> Tree@@ -16,6 +17,7 @@   , isInsideOf          -- :: PolyShape -> PolyShape -> Bool    , plFromPolygon       -- :: [RPoint] -> PolyShape+  , plToPolygon         -- :: Double -> PolyShape -> Polygon   , plPolygonify        -- :: Double -> PolyShape -> [Point Double]   , plDecompose         -- :: [PolyShape] -> [[RPoint]]   , unionPolyShapes     -- :: [PolyShape] -> [PolyShape]@@ -26,26 +28,35 @@   , mergePolyShapeHoles -- :: PolyShapeWithHoles -> PolyShape   , polyShapeTolerance   , plPartial, plPartialGroup, plPartial'+  , splitPolyShape      -- :: Double -> Int -> PolyShape -> [PolyShape]   , plGroupTouching   ) where  import           Chiphunk.Low-import           Control.Lens        ((&), (.~))-import           Data.List           (minimumBy, nub, partition, sortOn)+import           Control.Lens           ((&), (.~))+import           Data.AdditiveGroup+import           Data.List              (minimumBy, nub, partition, sortOn) import           Data.Ord+import qualified Data.Vector            as V import           Debug.Trace-import           Geom2D.CubicBezier  (ClosedPath (..), CubicBezier (..), DPoint,-                                      FillRule (..), PathJoin (..), Point (..),-                                      arcLength, arcLengthParam,-                                      bezierIntersection, bezierSubsegment,-                                      closedPathCurves, closest, colinear,-                                      curvesToClosed, evalBezier,-                                      interpolateVector, reorient, splitBezier,-                                      union, vectorDistance)-import           Graphics.SvgTree    (PathCommand (..), RPoint, Tree (..),-                                      defaultSvg, pathDefinition)+import           Geom2D                 (rotate90L, rotate90R, ($*), (^*))+import           Geom2D.CubicBezier     (ClosedPath (..), CubicBezier (..),+                                         DPoint, FillRule (..), PathJoin (..),+                                         Point (..), arcLength, arcLengthParam,+                                         bezierIntersection, bezierSubsegment,+                                         closedPathCurves, closest, colinear,+                                         curvesToClosed, evalBezier,+                                         interpolateVector, reorient,+                                         splitBezier, union, vectorDistance)+import           Graphics.SvgTree       (PathCommand (..), RPoint, Tree (..),+                                         defaultSvg, pathDefinition) import           Linear.V2+import           Reanimate.Animation import           Reanimate.Constants+import           Reanimate.Math.EarClip+import           Reanimate.Math.Polygon (Polygon, mkPolygon, pIsCCW, pRing,+                                         pdualPolygons, polygonPoints)+import           Reanimate.Math.SSSP import           Reanimate.Svg  -- | Shape drawn by continuous line. May have overlap, may be convex.@@ -91,6 +102,13 @@   where     worker (V2 x y) = (Point x y, JoinLine) +plToPolygon :: Double -> PolyShape -> Polygon+plToPolygon tol pl =+  let p = V.init . V.fromList . map (\(Point x y) -> realToFrac <$> V2 x y) .+          plPolygonify tol $ pl+  in if pIsCCW (mkPolygon p) then mkPolygon p else mkPolygon (V.reverse p)++ plPartial :: Double -> PolyShape -> PolyShape plPartial delta pl | delta >= 1 = pl plPartial delta pl = PolyShape $ curvesToClosed (lineOut ++ [joinB] ++ lineIn)@@ -110,6 +128,26 @@         then [bezierSubsegment c 0 (arcLengthParam c l polyShapeTolerance)]         else c : takeLen (l-cLen) cs +-- earClip :: Polygon -> Triangulation+-- dual :: Triangulation -> Dual+-- toPDual :: Polygon -> Dual -> PDual+-- pdualReduce :: Polygon -> PDual -> Int -> PDual+-- pdualPolygons :: Polygon -> PDual -> [Polygon]+splitPolyShape :: Double -> Int -> PolyShape -> [PolyShape]+splitPolyShape tol n poly =+    let polygon = toPolygon (plPolygonify tol poly)+        trig = earClip $ pRing polygon+        d = dual 0 trig+        pd = toPDual (pRing polygon) d+        reduced = pdualReduce (pRing polygon) pd n+        polygons = pdualPolygons polygon reduced+    in map toPolyShape polygons+  where+    toPolygon :: [Point Double] -> Polygon+    toPolygon = mkPolygon . V.fromList . nub . map (\(Point x y) -> V2 (realToFrac x) (realToFrac y))+    toPolyShape :: Polygon -> PolyShape+    toPolyShape = plFromPolygon . map (fmap realToFrac) . V.toList . polygonPoints+ plPartialGroup :: Double -> [PolyShape] -> [PolyShape] plPartialGroup _delta [] = [] plPartialGroup delta pls =@@ -186,7 +224,7 @@     worker c | endPoint c == startPoint c =       [] -- error $ "Bad bezier: " ++ show c     worker c =-      if colinear c tol+      if colinear c tol -- && arcLength c 1 tol < 1         then [endPoint c]         else           let (lhs,rhs) = splitBezier c 0.5@@ -220,6 +258,13 @@ svgToPolyShapes :: Tree -> [PolyShape] svgToPolyShapes = cmdsToPolyShapes . toLineCommands . extractPath +svgToPolygons :: Double -> SVG -> [Polygon]+svgToPolygons tol = map (toPolygon . plPolygonify tol) . svgToPolyShapes+  where+    toPolygon :: [Point Double] -> Polygon+    toPolygon = mkPolygon .+      V.fromList . nub . map (\(Point x y) -> V2 (realToFrac x) (realToFrac y))+ cmdsToPolyShapes :: [LineCommand] -> [PolyShape] cmdsToPolyShapes [] = [] cmdsToPolyShapes cmds =@@ -362,20 +407,26 @@       [x2p]     )   where+    vect = (childOrigin ^-^ p) ^* 0.0001+    vectL = rotate90L $* vect+    vectR = rotate90R $* vect     score = vectorDistance childOrigin p     childOrigin = polyShapeOrigin child+    childOrigin' = childOrigin ^-^ vectL     (pHead:pTail) = plCurves parent     childCurves = plCurves child      pParam = closest pHead childOrigin polyShapeTolerance -    (a2p, p2b) = splitBezier pHead pParam+    (a2p, p2b') = splitBezier pHead pParam+    p2b = case p2b' of+      CubicBezier a b c d -> CubicBezier (a ^-^ vectL) b c d      p = evalBezier pHead pParam     -- straight line to child origin-    p2x = lineBetween p childOrigin+    p2x = lineBetween (p ^-^ vectR) childOrigin     -- straight line from child origin-    x2p = lineBetween childOrigin p+    x2p = lineBetween childOrigin' p      lineBetween a = CubicBezier a a a 
src/Reanimate/Raster.hs view
@@ -13,7 +13,6 @@   ) where  import           Codec.Picture-import           Codec.Picture.Types         (dynamicMap) import           Control.Lens                ((&), (.~)) import           Control.Monad import qualified Data.ByteString             as B
src/Reanimate/Render.hs view
@@ -105,14 +105,18 @@                       , "-pix_fmt", "yuv420p", target]       RenderGif -> withTempFile "png" $ \palette -> do         runCmd ffmpeg ["-i", template, "-y"-                      ,"-vf", "fps="++show fps++",scale=320:-1:flags=lanczos,palettegen"+                      ,"-vf", "fps="++show fps+++                        ",scale="++show width++":"++show height +++                        ":flags=lanczos,palettegen"                       ,"-t", showFFloat Nothing (duration ani) ""                       , palette ]         runCmd ffmpeg ["-framerate", show fps,"-i", template, "-y"                       ,"-i", palette                       ,"-progress", progress                       ,"-filter_complex"-                      ,"fps="++show fps++",scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse"+                      ,"fps="++show fps+++                        ",scale="++show width++":"++show height +++                        ":flags=lanczos[x];[x][1:v]paletteuse"                       ,"-t", showFFloat Nothing (duration ani) ""                       , target]       RenderWebm ->
src/Reanimate/Scene.hs view
@@ -42,9 +42,11 @@   , spriteT           -- :: Frame s Time   , spriteDuration    -- :: Frame s Duration   , newSprite         -- :: Frame s SVG -> Scene s (Sprite s)+  , newSprite_        -- :: Frame s SVG -> Scene s ()   , newSpriteA        -- :: Animation -> Scene s (Sprite s)   , newSpriteA'       -- :: Sync -> Animation -> Scene s (Sprite s)   , newSpriteSVG      -- :: SVG -> Scene s (Sprite s)+  , newSpriteSVG_     -- :: SVG -> Scene s ()   , destroySprite     -- :: Sprite s -> Scene s ()   , applyVar          -- :: Var s a -> Sprite s -> (a -> SVG -> SVG) -> Scene s ()   , spriteModify      -- :: Sprite s -> Frame s ((SVG,ZIndex) -> (SVG, ZIndex)) -> Scene s ()@@ -57,13 +59,14 @@   -- * ST internals   , liftST   )-  where+where +import           Control.Monad                            ( void ) import           Control.Monad.Fix import           Control.Monad.ST import           Data.List import           Data.STRef-import           Graphics.SvgTree           (Tree (None))+import           Graphics.SvgTree                         ( Tree(None) ) import           Reanimate.Animation import           Reanimate.Effect import           Reanimate.Svg.Constructors@@ -88,34 +91,34 @@   pure a = M $ \_ -> return (a, 0, 0, [])   f <*> g = M $ \t -> do     (f', s1, p1, gen1) <- unM f t-    (g', s2, p2, gen2) <- unM g (t+s1)-    return (f' g', s1+s2, max p1 (s1+p2), gen1++gen2)+    (g', s2, p2, gen2) <- unM g (t + s1)+    return (f' g', s1 + s2, max p1 (s1 + p2), gen1 ++ gen2)  instance Monad (Scene s) where   return = pure   f >>= g = M $ \t -> do     (a, s1, p1, gen1) <- unM f t-    (b, s2, p2, gen2) <- unM (g a) (t+s1)-    return (b, s1+s2, max p1 (s1+p2), gen1++gen2)+    (b, s2, p2, gen2) <- unM (g a) (t + s1)+    return (b, s1 + s2, max p1 (s1 + p2), gen1 ++ gen2)  instance MonadFix (Scene s) where-  mfix fn = M $ \t -> mfix (\v -> let (a,_s,_p,_gens) = v in unM (fn a) t)+  mfix fn = M $ \t -> mfix (\v -> let (a, _s, _p, _gens) = v in unM (fn a) t)  liftST :: ST s a -> Scene s a liftST action = M $ \_ -> action >>= \a -> return (a, 0, 0, []) -sceneAnimation :: (forall s. Scene s a) -> Animation-sceneAnimation action =-  runST (do+sceneAnimation :: (forall s . Scene s a) -> Animation+sceneAnimation action = runST+  (do     (_, s, p, gens) <- unM action 0     let dur = max s p     genFns <- sequence gens-    return $ mkAnimation dur (\t ->-      mkGroup $-      map fst $-      sortOn snd-      [ spriteRender dur (t*dur)-      | spriteRender <- genFns ])+    return $ mkAnimation+      dur+      (\t -> mkGroup $ map fst $ sortOn+        snd+        [ spriteRender dur (t * dur) | spriteRender <- genFns ]+      )   )  -- | Execute actions in a scene without advancing the clock. Note that scenes do not end before@@ -166,8 +169,7 @@ -- --   <<docs/gifs/doc_wait.gif>> wait :: Duration -> Scene s ()-wait d = M $ \_ ->-  return ((), d, 0, [])+wait d = M $ \_ -> return ((), d, 0, [])  -- | Wait until the clock is equal to the given timestamp. waitUntil :: Time -> Scene s ()@@ -191,14 +193,12 @@ -- | Change the ZIndex of a scene. adjustZ :: (ZIndex -> ZIndex) -> Scene s a -> Scene s a adjustZ fn (M action) = M $ \t -> do-    (a, s, p, gens) <- action t-    return (a, s, p, map genFn gens)-  where-    genFn gen = do-      frameGen <- gen-      return $ \d t ->-        let (svg, z) = frameGen d t-        in (svg, fn z)+  (a, s, p, gens) <- action t+  return (a, s, p, map genFn gens)+ where+  genFn gen = do+    frameGen <- gen+    return $ \d t -> let (svg, z) = frameGen d t in (svg, fn z)  -- | Query the duration of a scene. withSceneDuration :: Scene s () -> Scene s Duration@@ -206,7 +206,7 @@   t1 <- queryNow   s   t2 <- queryNow-  return (t2-t1)+  return (t2 - t1)  addGen :: Gen s -> Scene s () addGen gen = M $ \_ -> return ((), 0, 0, [gen])@@ -246,10 +246,7 @@ modifyVar :: Var s a -> (a -> a) -> Scene s () modifyVar (Var ref) fn = do   now <- queryNow-  liftST $ modifySTRef ref $ \prev t ->-    if t < now-      then prev t-      else fn (prev t)+  liftST $ modifySTRef ref $ \prev t -> if t < now then prev t else fn (prev t)  -- | Modify a variable between @now@ and @now+duration@. --   Note: The modification function is invoked for past timestamps (with a time value of 0) and@@ -257,8 +254,7 @@ tweenVar :: Var s a -> Duration -> (a -> Time -> a) -> Scene s () tweenVar (Var ref) dur fn = do   now <- queryNow-  liftST $ modifySTRef ref $ \prev t ->-    fn (prev t) (max 0 (min dur $ t-now)/dur)+  liftST $ modifySTRef ref $ \prev t -> fn (prev t) (max 0 (min dur $ t - now) / dur)   wait dur  -- | Modify a variable between @now@ and @now+duration@.@@ -267,8 +263,7 @@ tweenVarUnclamped :: Var s a -> Duration -> (a -> Time -> a) -> Scene s () tweenVarUnclamped (Var ref) dur fn = do   now <- queryNow-  liftST $ modifySTRef ref $ \prev t ->-    fn (prev t) ((t-now)/dur)+  liftST $ modifySTRef ref $ \prev t -> fn (prev t) ((t - now) / dur)   wait dur  -- | Create and render a variable. The rendering will be born at the current timestamp@@ -288,8 +283,8 @@  -- | Helper function for filtering variables. findVar :: (a -> Bool) -> [Var s a] -> Scene s (Var s a)-findVar _cond [] = error "Variable not found."-findVar cond (v:vs) = do+findVar _cond []       = error "Variable not found."+findVar cond  (v : vs) = do   val <- readVar v   if cond val then return v else findVar cond vs @@ -310,8 +305,7 @@   Frame f <*> Frame g = Frame $ do     m1 <- f     m2 <- g-    return $ \real_t d t ->-      m1 real_t d t (m2 real_t d t)+    return $ \real_t d t -> m1 real_t d t (m2 real_t d t)  -- | Dereference a variable as a Sprite frame. --@@ -351,17 +345,22 @@   now <- queryNow   ref <- liftST $ newSTRef (-1, return $ \_d _t svg -> (svg, 0))   addGen $ do-    fn <- unFrame render+    fn                           <- unFrame render     (spriteDur, spriteEffectGen) <- readSTRef ref-    spriteEffect <- spriteEffectGen+    spriteEffect                 <- spriteEffectGen     return $ \d absT ->-      let relD = (if spriteDur < 0 then d else spriteDur)-now-          relT = absT-now in-      if relT < 0 || (relD+now/=d && relD <= relT)-        then (None, 0)-        else spriteEffect relD relT (fn absT relD relT)+      let relD = (if spriteDur < 0 then d else spriteDur) - now+          relT = absT - now+      in  if relT < 0 || (relD + now /= d && relD <= relT)+            then (None, 0)+            else spriteEffect relD relT (fn absT relD relT)   return $ Sprite now ref +-- | Create new sprite defined by a frame generator. The sprite will die at+--   the end of the scene.+newSprite_ :: Frame s SVG -> Scene s ()+newSprite_ = void . newSprite+ -- | Create a new sprite from an animation. This advances the clock by the --   duration of the animation. Unless otherwise specified using --   'destroySprite', the sprite will die at the end of the scene.@@ -406,6 +405,11 @@ newSpriteSVG :: SVG -> Scene s (Sprite s) newSpriteSVG = newSprite . pure +-- | Create a permanent sprite from a static SVG image. Same as `newSpriteSVG`+--   but the sprite isn't returned and thus cannot be destroyed.+newSpriteSVG_ :: SVG -> Scene s ()+newSpriteSVG_ = void . newSpriteSVG+ -- | Change the rendering of a sprite using data from a variable. If data from several variables --   is needed, use a frame generator instead. --@@ -418,11 +422,9 @@ -- --   <<docs/gifs/doc_applyVar.gif>> applyVar :: Var s a -> Sprite s -> (a -> SVG -> SVG) -> Scene s ()-applyVar var sprite fn =-  spriteModify sprite $ do-    varFn <- unVar var-    return $ \(svg, zindex) ->-      (fn varFn svg, zindex)+applyVar var sprite fn = spriteModify sprite $ do+  varFn <- unVar var+  return $ \(svg, zindex) -> (fn varFn svg, zindex)  -- | Destroy a sprite, preventing it from being rendered in the future of the scene. --   If 'destroySprite' is invoked multiple times, the earliest time-of-death is used.@@ -441,15 +443,15 @@     (if ttl < 0 then now else min ttl now, render)  -- | Low-level frame modifier.-spriteModify :: Sprite s -> Frame s ((SVG,ZIndex) -> (SVG, ZIndex)) -> Scene s ()-spriteModify (Sprite born ref) modFn =-  liftST $ modifySTRef ref $ \(ttl, renderGen) ->-    (ttl, do-      render <- renderGen-      modRender <- unFrame modFn-      return $ \relD relT ->-        let absT = relT + born-        in modRender absT relD relT . render relD relT)+spriteModify :: Sprite s -> Frame s ((SVG, ZIndex) -> (SVG, ZIndex)) -> Scene s ()+spriteModify (Sprite born ref) modFn = liftST $ modifySTRef ref $ \(ttl, renderGen) ->+  ( ttl+  , do+    render    <- renderGen+    modRender <- unFrame modFn+    return $ \relD relT ->+      let absT = relT + born in modRender absT relD relT . render relD relT+  )  -- | Map the SVG output of a sprite. --@@ -462,11 +464,11 @@ --   <<docs/gifs/doc_spriteMap.gif>> spriteMap :: Sprite s -> (SVG -> SVG) -> Scene s () spriteMap sprite@(Sprite born _) fn = do-    now <- queryNow-    let tDelta = now - born-    spriteModify sprite $ do-      t <- spriteT-      return $ \(svg, zindex) -> (if (t-tDelta) < 0 then svg else fn svg, zindex)+  now <- queryNow+  let tDelta = now - born+  spriteModify sprite $ do+    t <- spriteT+    return $ \(svg, zindex) -> (if (t - tDelta) < 0 then svg else fn svg, zindex)  -- | Modify the output of a sprite between @now@ and @now+duration@. --@@ -478,18 +480,16 @@ --   <<docs/gifs/doc_spriteTween.gif>> spriteTween :: Sprite s -> Duration -> (Double -> SVG -> SVG) -> Scene s () spriteTween sprite@(Sprite born _) dur fn = do-    now <- queryNow-    let tDelta = now - born-    spriteModify sprite $ do-      t <- spriteT-      return $ \(svg, zindex) ->-        (fn (clamp 0 1 $ (t-tDelta)/dur) svg, zindex)-    wait dur-  where-    clamp a b v-      | v < a     = a-      | v > b     = b-      | otherwise = v+  now <- queryNow+  let tDelta = now - born+  spriteModify sprite $ do+    t <- spriteT+    return $ \(svg, zindex) -> (fn (clamp 0 1 $ (t - tDelta) / dur) svg, zindex)+  wait dur+ where+  clamp a b v | v < a     = a+              | v > b     = b+              | otherwise = v  -- | Create a new variable and apply it to a sprite. --@@ -519,11 +519,13 @@ spriteE (Sprite born ref) effect = do   now <- queryNow   liftST $ modifySTRef ref $ \(ttl, renderGen) ->-    (ttl, do+    ( ttl+    , do       render <- renderGen       return $ \d t svg ->         let (svg', z) = render d t svg-        in (delayE (max 0 $ now-born) effect d t svg', z))+        in  (delayE (max 0 $ now - born) effect d t svg', z)+    )  -- | Set new ZIndex of a sprite. --@@ -540,8 +542,9 @@ spriteZ (Sprite born ref) zindex = do   now <- queryNow   liftST $ modifySTRef ref $ \(ttl, renderGen) ->-    (ttl, do+    ( ttl+    , do       render <- renderGen       return $ \d t svg ->-        let (svg', z) = render d t svg-        in (svg', if t < now-born then z else zindex))+        let (svg', z) = render d t svg in (svg', if t < now - born then z else zindex)+    )
src/Reanimate/Svg.hs view
@@ -12,7 +12,6 @@ import           Graphics.SvgTree             hiding (height, line, path, use,                                                width) import           Linear.V2                    hiding (angle)-import           Data.Monoid ((<>)) import           Reanimate.Constants import           Reanimate.Animation (SVG) import           Reanimate.Svg.Constructors@@ -179,7 +178,7 @@           let acc' sub = acc (GroupTree $ g & groupChildren .~ [sub])               attr' = (g^.drawAttributes) `mappend` attr           in concatMap (worker acc' attr') (g ^. groupChildren)-        t -> [(acc, attr, t)]+        t -> [(acc, (t^.drawAttributes) `mappend` attr, t)]  {-| Convert primitive SVG shapes (like those created by 'mkCircle', 'mkRect', 'mkLine' or     'mkEllipse') into SVG path. This can be useful for creating animations of these shapes being
src/Reanimate/Svg/Constructors.hs view
@@ -9,6 +9,7 @@   , mkPathString   , mkPathText   , mkLinePath+  , mkLinePathClosed   , mkClipPath   , mkText   -- * Grouping shapes and definitions@@ -19,6 +20,7 @@   , withId   , withStrokeColor   , withStrokeColorPixel+  , withStrokeDashArray   , withStrokeLineJoin   , withFillColor   , withFillColorPixel@@ -30,6 +32,7 @@   , center   , centerX   , centerY+  , centerUsing   , translate   , rotate   , rotateAroundCenter@@ -45,6 +48,7 @@   , aroundCenterX   , aroundCenterY   , withTransformations+  , withViewBox   -- * Other   , mkColor   , mkBackground@@ -167,9 +171,7 @@ -- | Translate given image so that the center of its bouding box coincides with coordinates --   @(0, 0)@. center :: Tree -> Tree-center t = translate (-x-w/2) (-y-h/2) t-  where-    (x, y, w, h) = boundingBox t+center t = centerUsing t t  -- | Translate given image so that the X-coordinate of the center of its bouding box is 0. centerX :: Tree -> Tree@@ -183,6 +185,11 @@   where     (_x, y, _w, h) = boundingBox t +centerUsing :: Tree -> Tree -> Tree+centerUsing a = translate (-x-w/2) (-y-h/2)+  where+    (x, y, w, h) = boundingBox a+ -- | Create 'Texture' based on SVG color name. --   See <https://en.wikipedia.org/wiki/Web_colors#X11_color_names> for the list of available names. --   If the provided name doesn't correspond to valid SVG color name, white-ish color is used.@@ -199,6 +206,9 @@ withStrokeColorPixel :: PixelRGBA8 -> Tree -> Tree withStrokeColorPixel color = strokeColor .~ pure (ColorRef color) +withStrokeDashArray :: [Double] -> Tree -> Tree+withStrokeDashArray arr = strokeDashArray .~ pure (map Num arr)+ -- | See <https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin> withStrokeLineJoin :: LineJoin -> Tree -> Tree withStrokeLineJoin ljoin = strokeLineJoin .~ pure ljoin@@ -316,6 +326,16 @@     cmds = [ MoveTo OriginAbsolute [V2 startX startY]            , LineTo OriginAbsolute [ V2 x y | (x, y) <- rest ] ] +-- | Create a path from a list of @(x, y)@ coordinates of points along the path.+mkLinePathClosed :: [(Double, Double)] -> Tree+mkLinePathClosed [] = mkGroup []+mkLinePathClosed ((startX, startY):rest) =+    PathTree $ defaultSvg & pathDefinition .~ cmds+  where+    cmds = [ MoveTo OriginAbsolute [V2 startX startY]+           , LineTo OriginAbsolute [ V2 x y | (x, y) <- rest ]+           , EndPath ]+ -- | Rectangle with a uniform color and the same size as the screen. -- --   Example:@@ -339,15 +359,15 @@ --   rows. Each row can contain different number of cells. gridLayout :: [[Tree]] -> Tree gridLayout rows = mkGroup-    [ translate (-screenWidth/2+colSep*nCol)-                (screenHeight/2-rowSep*nRow)+    [ translate (-screenWidth/2+colSep*nCol + colSep*0.5)+                (screenHeight/2-rowSep*nRow - rowSep*0.5)       elt-    | (nRow, row) <- zip [1..] rows+    | (nRow, row) <- zip [0..] rows     , let nCols = length row-          colSep = screenWidth / fromIntegral (nCols+1)-    , (nCol, elt) <- zip [1..] row ]+          colSep = screenWidth / fromIntegral nCols+    , (nCol, elt) <- zip [0..] row ]   where-    rowSep = screenHeight / fromIntegral (nRows+1)+    rowSep = screenHeight / fromIntegral nRows     nRows = length rows  -- | Insert a native text object anchored at the middle.@@ -368,3 +388,26 @@     -- be overwritten by the user.   where     span_ = defaultSvg & spanContent .~ [SpanText str]++-- | Switch from the default viewbox to a custom viewbox. Nesting custom viewboxes is+--   unlikely to give good results. If you need nested custom viewboxes, you will have+--   to configure them by hand.+--+--   The viewbox argument is (min-x, min-y, width, height).+--+--   Example:+--+--   > withViewBox (0,0,1,1) $ mkBackground "yellow"+--+--   <<docs/gifs/doc_withViewBox.gif>>+withViewBox :: (Double, Double, Double, Double) -> Tree -> Tree+withViewBox vbox child = translate (-screenWidth/2) (-screenHeight/2) $+  SvgTree $ Document+  { _viewBox = Just vbox+  , _width = Just (Num screenWidth)+  , _height = Just (Num screenHeight)+  , _elements = [child]+  , _description = ""+  , _documentLocation = ""+  , _documentAspectRatio = PreserveAspectRatio False AlignNone Nothing+  }
+ test/Helpers.hs view
@@ -0,0 +1,97 @@+{-# LANGUAGE FlexibleInstances    #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# OPTIONS_GHC -w      #-}+-- {-# LANGUAGE TemplateHaskell      #-}+module Helpers where++import qualified Data.Vector            as V+import           Linear.V2+import           Linear.Vector+import           Numeric+import           Data.List+import           Test.QuickCheck+import           Test.Tasty+import           Test.Tasty.QuickCheck++import           Reanimate.Math.Common+import           Reanimate.Math.Polygon+import           Reanimate.Math.EarClip+import           Reanimate.Math.SSSP++-- [(0.8,1),(0.04,0.1),(0.05,1)]++newtype PolyParam = PolyParam { unParam :: (Double, Double) }+  deriving (Show)+instance Arbitrary PolyParam where+  arbitrary = fmap PolyParam $+    (,) <$> choose (0.01,0.99)+              <*> choose (0.01,1)+  shrink (PolyParam (a,b)) =+    [ PolyParam (a', b')+    | a' <- a : shrinkDouble a+    , b' <- if a==a' then b : shrinkDouble b else b : shrinkDouble b+    , a' >= 0.01, b' >= 0.01+    ]++data Parameters = Parameters [(Double, Double)]+  deriving (Show)+instance Arbitrary Parameters where+  arbitrary = do+    PolyParam e1 <- arbitrary+    PolyParam e2 <- arbitrary+    PolyParam e3 <- arbitrary+    PolyParam e4 <- arbitrary+    rest <- arbitrary+    return $ Parameters $ e1:e2:e3:e4:map unParam rest+  shrink (Parameters xs) =+    map Parameters (delete xs $ shrinkListByOne xs) +++    map Parameters (delete xs $+    sequence $ map (map unParam . shrink . PolyParam) xs)++shrinkListByOne :: [a] -> [[a]]+shrinkListByOne x | length x <= 4 = [x]+shrinkListByOne x = x : zipWith (++) (inits x) (tails $ drop 1 x)++shrinkDouble :: Double -> [Double]+shrinkDouble x =+  let s = showFFloat Nothing x "" in+  if length s < 4+    then []+    else [read (take (length s-1) s)]++instance Arbitrary Polygon where+  arbitrary =+    frequency+      [ (1, elements premade)+      , (2, pMkWinding <$> choose (1,100))+      , (99, randomPoly)+      ]+    where+      premade = [shape1, shape2, shape3, shape4, shape5, shape6+                ,shape7, shape8, shape9, shape11 ]+      randomPoly = do+        let genParameters = do+              angMod <- choose (0.01, 0.99)+              rMod   <- choose (0.01, 0.99)+              return (angMod, rMod)+        PolyParam e1 <- arbitrary+        PolyParam e2 <- arbitrary+        PolyParam e3 <- arbitrary+        PolyParam e4 <- arbitrary+        es <- listOf genParameters+        pure $ pGenerate (e1:e2:e3:e4:es)+  -- shrink p = filter isSimple $+  --   map V.fromList (sequence (map shrinkV2 (V.toList p)))++shrinkV2 (V2 a b) = V2 <$> take 1 (shrinkRealFrac a) <*> take 1 (shrinkRealFrac b)++instance (RealFrac a, Arbitrary a) => Arbitrary (V2 a) where+  arbitrary = do+    (a,b) <- arbitrary+    pure $ V2 a b+  shrink = shrinkV2+  -- shrink (V2 a b) =+  --   [ V2 a b | (a',b') <- shrink (a,b) ]++percent :: (Testable prop) => (Rational -> prop) -> Property+percent gen = forAll (choose (0,1::Double)) $ gen . realToFrac
+ test/Properties.hs view
@@ -0,0 +1,72 @@+{-# LANGUAGE FlexibleInstances    #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# OPTIONS_GHC -w      #-}+{-# LANGUAGE TemplateHaskell      #-}+module Properties where++import qualified Data.Vector            as V+import           Linear.V2+import           Linear.Vector+import           Test.QuickCheck+import           Test.Tasty+import           Test.Tasty.QuickCheck++import           Reanimate.Math.Common+import           Reanimate.Math.Polygon+import           Reanimate.Math.EarClip+import           Reanimate.Math.SSSP+import           Helpers++import Debug.Trace++prop_pGenerate (PolyParam a) (PolyParam b) (PolyParam c) (PolyParam d) =+  pIsSimple $ pGenerate [a,b,c,d]++prop_pIsSimple p = pIsSimple p++prop_isBetween a b = percent $ \t ->+    a /= b ==>+    isBetween (lerp t a b) (a,b) &&+    isBetween a (a,b) &&+    isBetween b (a,b)++prop_isBetweenAxis a = percent $ \t ->+    let b = a + V2 0 1+        c = a + V2 1 0 in+    isBetween (lerp t a b) (a,b) &&+    isBetween (lerp t a c) (a,c)++prop_isNotBetween a b = forAll (choose (1.1,100)) $ \t ->+    a /= 0 && b /= 0 ==>+    not (isBetween (lerp (realToFrac (t::Double)) a b :: V2 Rational) (a,b))++prop_winding = forAll (choose (1,100)) $ \n -> pIsSimple (pMkWinding n)++prop_ccw p = label (if pIsConvex p then "convex" else "concave") $ pIsCCW p+prop_rev_ccw p = not $ pIsCCW (mkPolygon $ V.reverse $ polygonPoints p)+prop_pCycle p = forAll (choose (0,1)) $ \t ->+  pIsSimple (pCycle p t)++prop_validEarClip p = isValidTriangulation p (earClip $ pRing p)++-- dualToTrangulation . dual = id+prop_dualInv p =+  let t = polygonTriangulation p in+  dualToTriangulation (pRing p) (dual (polygonOffset p) t) == t++prop_ssspEq p =+  pSize p < 20 ==>+  naive (pRing p) == polygonSSSP p V.! 0++prop_ssspVisibilityLength (Parameters xs) =+  let p = pGenerate xs in+  pSize (ssspVisibility p) <= pSize p++prop_dualCycle p = forAll (choose (0,pSize p-1)) $ \n ->+  let p1 = pSetOffset p n+      p2 = pCopy p1+  in and [ pParent p1 0 i == pParent p2 0 i | i <- [0.. pSize p-1] ]++return []+all_props :: TestTree+all_props = testProperties "properties" $allProperties
test/Spec.hs view
@@ -3,10 +3,11 @@ import           Test.Tasty  import           UnitTests+import           Properties  main :: IO () main = do   tests1 <- unitTestFolder "examples/"   tests2 <- compileTestFolder "examples/"   tests3 <- compileVideoFolder "videos/"-  defaultMain $ testGroup "tests" [tests1, tests2, tests3]+  defaultMain $ testGroup "tests" [tests1, tests2, tests3, all_props]
test/UnitTests.hs view
@@ -5,9 +5,12 @@   ) where  import           Control.Exception+import qualified Data.ByteString      as BS import qualified Data.ByteString.Lazy as LBS import           Data.List            (sort)-import           Reanimate.Misc       (withTempDir, withTempFile)+import qualified Data.Text            as T+import qualified Data.Text.IO         as T+import           Reanimate.Misc       (runCmd, withTempDir, withTempFile) import           System.Directory import           System.Exit import           System.FilePath@@ -22,7 +25,7 @@   files <- sort <$> getDirectoryContents path   mbWDiff <- findExecutable "wdiff"   let diff = case mbWDiff of-        Nothing -> ["diff", "--strip-trailing-cr"]+        Nothing    -> ["diff", "--strip-trailing-cr"]         Just wdiff -> [wdiff, "--no-common"]   return $ testGroup "animate"     [ goldenVsStringDiff file (\ref new -> diff ++ [ref, new]) fullPath (genGolden hsPath)@@ -34,21 +37,23 @@  genGolden :: FilePath -> IO LBS.ByteString genGolden path = withTempDir $ \tmpDir -> withTempFile ".exe" $ \tmpExecutable -> do-  let ghcOpts = ["-rtsopts", "--make", "-O2"] +++  let ghcOpts = ["-rtsopts", "--make", "-O0", "-Werror", "-Wall"] ++                 ["-odir", tmpDir, "-hidir", tmpDir, "-o", tmpExecutable]       runOpts = ["+RTS", "-M1G"]   -- XXX: Check for errors.-  _ <- readProcessWithExitCode "stack" (["ghc","--", path] ++ ghcOpts) ""-  -- ret <- runCmd_ "stack" $ ["ghc", "--"] ++ ghcOptions tmpDir ++ [self, "-o", tmpExecutable]-  -- ["-rtsopts", "--make", "-threaded", "-O2"] ++-  -- ["-odir", tmpDir, "-hidir", tmpDir]-  (inh, outh, errh, _pid) <- runInteractiveProcess tmpExecutable (["test"] ++ runOpts)+  runCmd "stack" $ ["ghc","--", path] ++ ghcOpts++  (inh, outh, errh, pid) <- runInteractiveProcess tmpExecutable (["test"] ++ runOpts)     Nothing Nothing   -- hSetBinaryMode outh True   -- hSetNewlineMode outh universalNewlineMode   hClose inh-  hClose errh-  LBS.hGetContents outh+  out <- BS.hGetContents outh+  err <- T.hGetContents errh+  code <- waitForProcess pid+  case code of+    ExitSuccess   -> return $ LBS.fromChunks [out]+    ExitFailure{} -> error $ "Failed to run: " ++ T.unpack err  compileTestFolder :: FilePath -> IO TestTree compileTestFolder path = do