]> git.cworth.org Git - zombocom-ai/commitdiff
Add some convenience functions with implicit cairo context
authorCarl Worth <cworth@cworth.org>
Fri, 23 Dec 2022 04:09:51 +0000 (20:09 -0800)
committerCarl Worth <cworth@cworth.org>
Fri, 23 Dec 2022 19:51:10 +0000 (11:51 -0800)
Just to make the code easier to use. So it can look like:

circle(x, y, radius);
fill();

rather than:

cr.arc(x, y, radius, 0, 2 * math.pi);
cr.fill();

Also, provide a set_color() function that accepts a color name as a
string, (using that classic list of color names from X11 I believe).

bus.html
interpret-cairo-to-svg.py

index 214174cca0d57069b2991fde27ec3425d795682c..df6f572ed27ca18708d1aea16b2a3d89819601b9 100644 (file)
--- a/bus.html
+++ b/bus.html
        Magic School Bus Central Processor
       </h1>
       <form id="form">
-       <textarea id="code" rows="10" width="100%">cr.move_to(10,10);
-cr.line_to(100, 100);
-cr.set_line_width(6);
-cr.stroke();</textarea>
+       <textarea id="code" rows="10" width="100%">def random_dot():
+  x = 512 * random()
+  y = 512 * random()
+  radius = 4 + 6 * random()
+  circle(x, y, radius);
+  fill();
+
+for i in range(1000):
+  if i %2 == 0:
+    set_color('red')
+  else:
+    set_color('blue')
+  random_dot();</textarea>
        <button type="submit">Run code</button>
       </form>
       <img id="output"></img>
@@ -169,7 +178,6 @@ cr.stroke();</textarea>
 
     form.addEventListener('submit', event => {
        event.preventDefault();
-       console.log("Submitted form with code: " + code.value);
        socket.emit('run', code.value);
     });
 
index bc3ad355460f8c4e824734d6e3d1ba5fbffda6eb..de296f5288d02a3d538a63fd06235ff772fc6538 100755 (executable)
@@ -5,6 +5,13 @@ import tempfile
 import os
 import sys
 
+import math
+import random as rand
+
+# Some convenience things for the program to use
+pi = math.pi
+random = rand.random
+
 OUTPUT_DIR_PREFIX='/srv/cworth.org/zombocom'
 OUTPUT_DIR="{}/busart".format(OUTPUT_DIR_PREFIX)
 
@@ -24,9 +31,786 @@ del tempfile
 del os
 del sys
 
+# Note: We'll let the following "safe" imports remain:
+#
+# math
+# random
+
+COLORS = {
+    'alice blue': (0xf0/0xff, 0xf8/0xff, 0xff/0xff),
+    'aliceblue': (0xf0/0xff, 0xf8/0xff, 0xff/0xff),
+    'antique white': (0xfa/0xff, 0xeb/0xff, 0xd7/0xff),
+    'antiquewhite': (0xfa/0xff, 0xeb/0xff, 0xd7/0xff),
+    'antiquewhite1': (0xff/0xff, 0xef/0xff, 0xdb/0xff),
+    'antiquewhite2': (0xee/0xff, 0xdf/0xff, 0xcc/0xff),
+    'antiquewhite3': (0xcd/0xff, 0xc0/0xff, 0xb0/0xff),
+    'antiquewhite4': (0x8b/0xff, 0x83/0xff, 0x78/0xff),
+    'aquamarine': (0x7f/0xff, 0xff/0xff, 0xd4/0xff),
+    'aquamarine1': (0x7f/0xff, 0xff/0xff, 0xd4/0xff),
+    'aquamarine2': (0x76/0xff, 0xee/0xff, 0xc6/0xff),
+    'aquamarine3': (0x66/0xff, 0xcd/0xff, 0xaa/0xff),
+    'aquamarine4': (0x45/0xff, 0x8b/0xff, 0x74/0xff),
+    'azure': (0xf0/0xff, 0xff/0xff, 0xff/0xff),
+    'azure1': (0xf0/0xff, 0xff/0xff, 0xff/0xff),
+    'azure2': (0xe0/0xff, 0xee/0xff, 0xee/0xff),
+    'azure3': (0xc1/0xff, 0xcd/0xff, 0xcd/0xff),
+    'azure4': (0x83/0xff, 0x8b/0xff, 0x8b/0xff),
+    'beige': (0xf5/0xff, 0xf5/0xff, 0xdc/0xff),
+    'bisque': (0xff/0xff, 0xe4/0xff, 0xc4/0xff),
+    'bisque1': (0xff/0xff, 0xe4/0xff, 0xc4/0xff),
+    'bisque2': (0xee/0xff, 0xd5/0xff, 0xb7/0xff),
+    'bisque3': (0xcd/0xff, 0xb7/0xff, 0x9e/0xff),
+    'bisque4': (0x8b/0xff, 0x7d/0xff, 0x6b/0xff),
+    'black': (0x00/0xff, 0x00/0xff, 0x00/0xff),
+    'blanched almond': (0xff/0xff, 0xeb/0xff, 0xcd/0xff),
+    'blanchedalmond': (0xff/0xff, 0xeb/0xff, 0xcd/0xff),
+    'blue': (0x00/0xff, 0x00/0xff, 0xff/0xff),
+    'blue violet': (0x8a/0xff, 0x2b/0xff, 0xe2/0xff),
+    'blue1': (0x00/0xff, 0x00/0xff, 0xff/0xff),
+    'blue2': (0x00/0xff, 0x00/0xff, 0xee/0xff),
+    'blue3': (0x00/0xff, 0x00/0xff, 0xcd/0xff),
+    'blue4': (0x00/0xff, 0x00/0xff, 0x8b/0xff),
+    'blueviolet': (0x8a/0xff, 0x2b/0xff, 0xe2/0xff),
+    'brown': (0xa5/0xff, 0x2a/0xff, 0x2a/0xff),
+    'brown1': (0xff/0xff, 0x40/0xff, 0x40/0xff),
+    'brown2': (0xee/0xff, 0x3b/0xff, 0x3b/0xff),
+    'brown3': (0xcd/0xff, 0x33/0xff, 0x33/0xff),
+    'brown4': (0x8b/0xff, 0x23/0xff, 0x23/0xff),
+    'burlywood': (0xde/0xff, 0xb8/0xff, 0x87/0xff),
+    'burlywood1': (0xff/0xff, 0xd3/0xff, 0x9b/0xff),
+    'burlywood2': (0xee/0xff, 0xc5/0xff, 0x91/0xff),
+    'burlywood3': (0xcd/0xff, 0xaa/0xff, 0x7d/0xff),
+    'burlywood4': (0x8b/0xff, 0x73/0xff, 0x55/0xff),
+    'cadet blue': (0x5f/0xff, 0x9e/0xff, 0xa0/0xff),
+    'cadetblue': (0x5f/0xff, 0x9e/0xff, 0xa0/0xff),
+    'cadetblue1': (0x98/0xff, 0xf5/0xff, 0xff/0xff),
+    'cadetblue2': (0x8e/0xff, 0xe5/0xff, 0xee/0xff),
+    'cadetblue3': (0x7a/0xff, 0xc5/0xff, 0xcd/0xff),
+    'cadetblue4': (0x53/0xff, 0x86/0xff, 0x8b/0xff),
+    'chartreuse': (0x7f/0xff, 0xff/0xff, 0x00/0xff),
+    'chartreuse1': (0x7f/0xff, 0xff/0xff, 0x00/0xff),
+    'chartreuse2': (0x76/0xff, 0xee/0xff, 0x00/0xff),
+    'chartreuse3': (0x66/0xff, 0xcd/0xff, 0x00/0xff),
+    'chartreuse4': (0x45/0xff, 0x8b/0xff, 0x00/0xff),
+    'chocolate': (0xd2/0xff, 0x69/0xff, 0x1e/0xff),
+    'chocolate1': (0xff/0xff, 0x7f/0xff, 0x24/0xff),
+    'chocolate2': (0xee/0xff, 0x76/0xff, 0x21/0xff),
+    'chocolate3': (0xcd/0xff, 0x66/0xff, 0x1d/0xff),
+    'chocolate4': (0x8b/0xff, 0x45/0xff, 0x13/0xff),
+    'coral': (0xff/0xff, 0x7f/0xff, 0x50/0xff),
+    'coral1': (0xff/0xff, 0x72/0xff, 0x56/0xff),
+    'coral2': (0xee/0xff, 0x6a/0xff, 0x50/0xff),
+    'coral3': (0xcd/0xff, 0x5b/0xff, 0x45/0xff),
+    'coral4': (0x8b/0xff, 0x3e/0xff, 0x2f/0xff),
+    'cornflower blue': (0x64/0xff, 0x95/0xff, 0xed/0xff),
+    'cornflowerblue': (0x64/0xff, 0x95/0xff, 0xed/0xff),
+    'cornsilk': (0xff/0xff, 0xf8/0xff, 0xdc/0xff),
+    'cornsilk1': (0xff/0xff, 0xf8/0xff, 0xdc/0xff),
+    'cornsilk2': (0xee/0xff, 0xe8/0xff, 0xcd/0xff),
+    'cornsilk3': (0xcd/0xff, 0xc8/0xff, 0xb1/0xff),
+    'cornsilk4': (0x8b/0xff, 0x88/0xff, 0x78/0xff),
+    'cyan': (0x00/0xff, 0xff/0xff, 0xff/0xff),
+    'cyan1': (0x00/0xff, 0xff/0xff, 0xff/0xff),
+    'cyan2': (0x00/0xff, 0xee/0xff, 0xee/0xff),
+    'cyan3': (0x00/0xff, 0xcd/0xff, 0xcd/0xff),
+    'cyan4': (0x00/0xff, 0x8b/0xff, 0x8b/0xff),
+    'dark blue': (0x00/0xff, 0x00/0xff, 0x8b/0xff),
+    'dark cyan': (0x00/0xff, 0x8b/0xff, 0x8b/0xff),
+    'dark goldenrod': (0xb8/0xff, 0x86/0xff, 0x0b/0xff),
+    'dark gray': (0xa9/0xff, 0xa9/0xff, 0xa9/0xff),
+    'dark green': (0x00/0xff, 0x64/0xff, 0x00/0xff),
+    'dark grey': (0xa9/0xff, 0xa9/0xff, 0xa9/0xff),
+    'dark khaki': (0xbd/0xff, 0xb7/0xff, 0x6b/0xff),
+    'dark magenta': (0x8b/0xff, 0x00/0xff, 0x8b/0xff),
+    'dark olive green': (0x55/0xff, 0x6b/0xff, 0x2f/0xff),
+    'dark orange': (0xff/0xff, 0x8c/0xff, 0x00/0xff),
+    'dark orchid': (0x99/0xff, 0x32/0xff, 0xcc/0xff),
+    'dark red': (0x8b/0xff, 0x00/0xff, 0x00/0xff),
+    'dark salmon': (0xe9/0xff, 0x96/0xff, 0x7a/0xff),
+    'dark sea green': (0x8f/0xff, 0xbc/0xff, 0x8f/0xff),
+    'dark slate blue': (0x48/0xff, 0x3d/0xff, 0x8b/0xff),
+    'dark slate gray': (0x2f/0xff, 0x4f/0xff, 0x4f/0xff),
+    'dark slate grey': (0x2f/0xff, 0x4f/0xff, 0x4f/0xff),
+    'dark turquoise': (0x00/0xff, 0xce/0xff, 0xd1/0xff),
+    'dark violet': (0x94/0xff, 0x00/0xff, 0xd3/0xff),
+    'darkblue': (0x00/0xff, 0x00/0xff, 0x8b/0xff),
+    'darkcyan': (0x00/0xff, 0x8b/0xff, 0x8b/0xff),
+    'darkgoldenrod': (0xb8/0xff, 0x86/0xff, 0x0b/0xff),
+    'darkgoldenrod1': (0xff/0xff, 0xb9/0xff, 0x0f/0xff),
+    'darkgoldenrod2': (0xee/0xff, 0xad/0xff, 0x0e/0xff),
+    'darkgoldenrod3': (0xcd/0xff, 0x95/0xff, 0x0c/0xff),
+    'darkgoldenrod4': (0x8b/0xff, 0x65/0xff, 0x08/0xff),
+    'darkgray': (0xa9/0xff, 0xa9/0xff, 0xa9/0xff),
+    'darkgreen': (0x00/0xff, 0x64/0xff, 0x00/0xff),
+    'darkgrey': (0xa9/0xff, 0xa9/0xff, 0xa9/0xff),
+    'darkkhaki': (0xbd/0xff, 0xb7/0xff, 0x6b/0xff),
+    'darkmagenta': (0x8b/0xff, 0x00/0xff, 0x8b/0xff),
+    'darkolivegreen': (0x55/0xff, 0x6b/0xff, 0x2f/0xff),
+    'darkolivegreen1': (0xca/0xff, 0xff/0xff, 0x70/0xff),
+    'darkolivegreen2': (0xbc/0xff, 0xee/0xff, 0x68/0xff),
+    'darkolivegreen3': (0xa2/0xff, 0xcd/0xff, 0x5a/0xff),
+    'darkolivegreen4': (0x6e/0xff, 0x8b/0xff, 0x3d/0xff),
+    'darkorange': (0xff/0xff, 0x8c/0xff, 0x00/0xff),
+    'darkorange1': (0xff/0xff, 0x7f/0xff, 0x00/0xff),
+    'darkorange2': (0xee/0xff, 0x76/0xff, 0x00/0xff),
+    'darkorange3': (0xcd/0xff, 0x66/0xff, 0x00/0xff),
+    'darkorange4': (0x8b/0xff, 0x45/0xff, 0x00/0xff),
+    'darkorchid': (0x99/0xff, 0x32/0xff, 0xcc/0xff),
+    'darkorchid1': (0xbf/0xff, 0x3e/0xff, 0xff/0xff),
+    'darkorchid2': (0xb2/0xff, 0x3a/0xff, 0xee/0xff),
+    'darkorchid3': (0x9a/0xff, 0x32/0xff, 0xcd/0xff),
+    'darkorchid4': (0x68/0xff, 0x22/0xff, 0x8b/0xff),
+    'darkred': (0x8b/0xff, 0x00/0xff, 0x00/0xff),
+    'darksalmon': (0xe9/0xff, 0x96/0xff, 0x7a/0xff),
+    'darkseagreen': (0x8f/0xff, 0xbc/0xff, 0x8f/0xff),
+    'darkseagreen1': (0xc1/0xff, 0xff/0xff, 0xc1/0xff),
+    'darkseagreen2': (0xb4/0xff, 0xee/0xff, 0xb4/0xff),
+    'darkseagreen3': (0x9b/0xff, 0xcd/0xff, 0x9b/0xff),
+    'darkseagreen4': (0x69/0xff, 0x8b/0xff, 0x69/0xff),
+    'darkslateblue': (0x48/0xff, 0x3d/0xff, 0x8b/0xff),
+    'darkslategray': (0x2f/0xff, 0x4f/0xff, 0x4f/0xff),
+    'darkslategray1': (0x97/0xff, 0xff/0xff, 0xff/0xff),
+    'darkslategray2': (0x8d/0xff, 0xee/0xff, 0xee/0xff),
+    'darkslategray3': (0x79/0xff, 0xcd/0xff, 0xcd/0xff),
+    'darkslategray4': (0x52/0xff, 0x8b/0xff, 0x8b/0xff),
+    'darkslategrey': (0x2f/0xff, 0x4f/0xff, 0x4f/0xff),
+    'darkturquoise': (0x00/0xff, 0xce/0xff, 0xd1/0xff),
+    'darkviolet': (0x94/0xff, 0x00/0xff, 0xd3/0xff),
+    'deep pink': (0xff/0xff, 0x14/0xff, 0x93/0xff),
+    'deep sky blue': (0x00/0xff, 0xbf/0xff, 0xff/0xff),
+    'deeppink': (0xff/0xff, 0x14/0xff, 0x93/0xff),
+    'deeppink1': (0xff/0xff, 0x14/0xff, 0x93/0xff),
+    'deeppink2': (0xee/0xff, 0x12/0xff, 0x89/0xff),
+    'deeppink3': (0xcd/0xff, 0x10/0xff, 0x76/0xff),
+    'deeppink4': (0x8b/0xff, 0x0a/0xff, 0x50/0xff),
+    'deepskyblue': (0x00/0xff, 0xbf/0xff, 0xff/0xff),
+    'deepskyblue1': (0x00/0xff, 0xbf/0xff, 0xff/0xff),
+    'deepskyblue2': (0x00/0xff, 0xb2/0xff, 0xee/0xff),
+    'deepskyblue3': (0x00/0xff, 0x9a/0xff, 0xcd/0xff),
+    'deepskyblue4': (0x00/0xff, 0x68/0xff, 0x8b/0xff),
+    'dim gray': (0x69/0xff, 0x69/0xff, 0x69/0xff),
+    'dim grey': (0x69/0xff, 0x69/0xff, 0x69/0xff),
+    'dimgray': (0x69/0xff, 0x69/0xff, 0x69/0xff),
+    'dimgrey': (0x69/0xff, 0x69/0xff, 0x69/0xff),
+    'dodger blue': (0x1e/0xff, 0x90/0xff, 0xff/0xff),
+    'dodgerblue': (0x1e/0xff, 0x90/0xff, 0xff/0xff),
+    'dodgerblue1': (0x1e/0xff, 0x90/0xff, 0xff/0xff),
+    'dodgerblue2': (0x1c/0xff, 0x86/0xff, 0xee/0xff),
+    'dodgerblue3': (0x18/0xff, 0x74/0xff, 0xcd/0xff),
+    'dodgerblue4': (0x10/0xff, 0x4e/0xff, 0x8b/0xff),
+    'firebrick': (0xb2/0xff, 0x22/0xff, 0x22/0xff),
+    'firebrick1': (0xff/0xff, 0x30/0xff, 0x30/0xff),
+    'firebrick2': (0xee/0xff, 0x2c/0xff, 0x2c/0xff),
+    'firebrick3': (0xcd/0xff, 0x26/0xff, 0x26/0xff),
+    'firebrick4': (0x8b/0xff, 0x1a/0xff, 0x1a/0xff),
+    'floral white': (0xff/0xff, 0xfa/0xff, 0xf0/0xff),
+    'floralwhite': (0xff/0xff, 0xfa/0xff, 0xf0/0xff),
+    'forest green': (0x22/0xff, 0x8b/0xff, 0x22/0xff),
+    'forestgreen': (0x22/0xff, 0x8b/0xff, 0x22/0xff),
+    'gainsboro': (0xdc/0xff, 0xdc/0xff, 0xdc/0xff),
+    'ghost white': (0xf8/0xff, 0xf8/0xff, 0xff/0xff),
+    'ghostwhite': (0xf8/0xff, 0xf8/0xff, 0xff/0xff),
+    'gold': (0xff/0xff, 0xd7/0xff, 0x00/0xff),
+    'gold1': (0xff/0xff, 0xd7/0xff, 0x00/0xff),
+    'gold2': (0xee/0xff, 0xc9/0xff, 0x00/0xff),
+    'gold3': (0xcd/0xff, 0xad/0xff, 0x00/0xff),
+    'gold4': (0x8b/0xff, 0x75/0xff, 0x00/0xff),
+    'goldenrod': (0xda/0xff, 0xa5/0xff, 0x20/0xff),
+    'goldenrod1': (0xff/0xff, 0xc1/0xff, 0x25/0xff),
+    'goldenrod2': (0xee/0xff, 0xb4/0xff, 0x22/0xff),
+    'goldenrod3': (0xcd/0xff, 0x9b/0xff, 0x1d/0xff),
+    'goldenrod4': (0x8b/0xff, 0x69/0xff, 0x14/0xff),
+    'gray': (0x80/0xff, 0x80/0xff, 0x80/0xff),
+    'gray0': (0x00/0xff, 0x00/0xff, 0x00/0xff),
+    'gray1': (0x03/0xff, 0x03/0xff, 0x03/0xff),
+    'gray2': (0x05/0xff, 0x05/0xff, 0x05/0xff),
+    'gray3': (0x08/0xff, 0x08/0xff, 0x08/0xff),
+    'gray4': (0x0a/0xff, 0x0a/0xff, 0x0a/0xff),
+    'gray5': (0x0d/0xff, 0x0d/0xff, 0x0d/0xff),
+    'gray6': (0x0f/0xff, 0x0f/0xff, 0x0f/0xff),
+    'gray7': (0x12/0xff, 0x12/0xff, 0x12/0xff),
+    'gray8': (0x14/0xff, 0x14/0xff, 0x14/0xff),
+    'gray9': (0x17/0xff, 0x17/0xff, 0x17/0xff),
+    'gray10': (0x1a/0xff, 0x1a/0xff, 0x1a/0xff),
+    'gray11': (0x1c/0xff, 0x1c/0xff, 0x1c/0xff),
+    'gray12': (0x1f/0xff, 0x1f/0xff, 0x1f/0xff),
+    'gray13': (0x21/0xff, 0x21/0xff, 0x21/0xff),
+    'gray14': (0x24/0xff, 0x24/0xff, 0x24/0xff),
+    'gray15': (0x26/0xff, 0x26/0xff, 0x26/0xff),
+    'gray16': (0x29/0xff, 0x29/0xff, 0x29/0xff),
+    'gray17': (0x2b/0xff, 0x2b/0xff, 0x2b/0xff),
+    'gray18': (0x2e/0xff, 0x2e/0xff, 0x2e/0xff),
+    'gray19': (0x30/0xff, 0x30/0xff, 0x30/0xff),
+    'gray20': (0x33/0xff, 0x33/0xff, 0x33/0xff),
+    'gray21': (0x36/0xff, 0x36/0xff, 0x36/0xff),
+    'gray22': (0x38/0xff, 0x38/0xff, 0x38/0xff),
+    'gray23': (0x3b/0xff, 0x3b/0xff, 0x3b/0xff),
+    'gray24': (0x3d/0xff, 0x3d/0xff, 0x3d/0xff),
+    'gray25': (0x40/0xff, 0x40/0xff, 0x40/0xff),
+    'gray26': (0x42/0xff, 0x42/0xff, 0x42/0xff),
+    'gray27': (0x45/0xff, 0x45/0xff, 0x45/0xff),
+    'gray28': (0x47/0xff, 0x47/0xff, 0x47/0xff),
+    'gray29': (0x4a/0xff, 0x4a/0xff, 0x4a/0xff),
+    'gray30': (0x4d/0xff, 0x4d/0xff, 0x4d/0xff),
+    'gray31': (0x4f/0xff, 0x4f/0xff, 0x4f/0xff),
+    'gray32': (0x52/0xff, 0x52/0xff, 0x52/0xff),
+    'gray33': (0x54/0xff, 0x54/0xff, 0x54/0xff),
+    'gray34': (0x57/0xff, 0x57/0xff, 0x57/0xff),
+    'gray35': (0x59/0xff, 0x59/0xff, 0x59/0xff),
+    'gray36': (0x5c/0xff, 0x5c/0xff, 0x5c/0xff),
+    'gray37': (0x5e/0xff, 0x5e/0xff, 0x5e/0xff),
+    'gray38': (0x61/0xff, 0x61/0xff, 0x61/0xff),
+    'gray39': (0x63/0xff, 0x63/0xff, 0x63/0xff),
+    'gray40': (0x66/0xff, 0x66/0xff, 0x66/0xff),
+    'gray41': (0x69/0xff, 0x69/0xff, 0x69/0xff),
+    'gray42': (0x6b/0xff, 0x6b/0xff, 0x6b/0xff),
+    'gray43': (0x6e/0xff, 0x6e/0xff, 0x6e/0xff),
+    'gray44': (0x70/0xff, 0x70/0xff, 0x70/0xff),
+    'gray45': (0x73/0xff, 0x73/0xff, 0x73/0xff),
+    'gray46': (0x75/0xff, 0x75/0xff, 0x75/0xff),
+    'gray47': (0x78/0xff, 0x78/0xff, 0x78/0xff),
+    'gray48': (0x7a/0xff, 0x7a/0xff, 0x7a/0xff),
+    'gray49': (0x7d/0xff, 0x7d/0xff, 0x7d/0xff),
+    'gray50': (0x7f/0xff, 0x7f/0xff, 0x7f/0xff),
+    'gray51': (0x82/0xff, 0x82/0xff, 0x82/0xff),
+    'gray52': (0x85/0xff, 0x85/0xff, 0x85/0xff),
+    'gray53': (0x87/0xff, 0x87/0xff, 0x87/0xff),
+    'gray54': (0x8a/0xff, 0x8a/0xff, 0x8a/0xff),
+    'gray55': (0x8c/0xff, 0x8c/0xff, 0x8c/0xff),
+    'gray56': (0x8f/0xff, 0x8f/0xff, 0x8f/0xff),
+    'gray57': (0x91/0xff, 0x91/0xff, 0x91/0xff),
+    'gray58': (0x94/0xff, 0x94/0xff, 0x94/0xff),
+    'gray59': (0x96/0xff, 0x96/0xff, 0x96/0xff),
+    'gray60': (0x99/0xff, 0x99/0xff, 0x99/0xff),
+    'gray61': (0x9c/0xff, 0x9c/0xff, 0x9c/0xff),
+    'gray62': (0x9e/0xff, 0x9e/0xff, 0x9e/0xff),
+    'gray63': (0xa1/0xff, 0xa1/0xff, 0xa1/0xff),
+    'gray64': (0xa3/0xff, 0xa3/0xff, 0xa3/0xff),
+    'gray65': (0xa6/0xff, 0xa6/0xff, 0xa6/0xff),
+    'gray66': (0xa8/0xff, 0xa8/0xff, 0xa8/0xff),
+    'gray67': (0xab/0xff, 0xab/0xff, 0xab/0xff),
+    'gray68': (0xad/0xff, 0xad/0xff, 0xad/0xff),
+    'gray69': (0xb0/0xff, 0xb0/0xff, 0xb0/0xff),
+    'gray70': (0xb3/0xff, 0xb3/0xff, 0xb3/0xff),
+    'gray71': (0xb5/0xff, 0xb5/0xff, 0xb5/0xff),
+    'gray72': (0xb8/0xff, 0xb8/0xff, 0xb8/0xff),
+    'gray73': (0xba/0xff, 0xba/0xff, 0xba/0xff),
+    'gray74': (0xbd/0xff, 0xbd/0xff, 0xbd/0xff),
+    'gray75': (0xbf/0xff, 0xbf/0xff, 0xbf/0xff),
+    'gray76': (0xc2/0xff, 0xc2/0xff, 0xc2/0xff),
+    'gray77': (0xc4/0xff, 0xc4/0xff, 0xc4/0xff),
+    'gray78': (0xc7/0xff, 0xc7/0xff, 0xc7/0xff),
+    'gray79': (0xc9/0xff, 0xc9/0xff, 0xc9/0xff),
+    'gray80': (0xcc/0xff, 0xcc/0xff, 0xcc/0xff),
+    'gray81': (0xcf/0xff, 0xcf/0xff, 0xcf/0xff),
+    'gray82': (0xd1/0xff, 0xd1/0xff, 0xd1/0xff),
+    'gray83': (0xd4/0xff, 0xd4/0xff, 0xd4/0xff),
+    'gray84': (0xd6/0xff, 0xd6/0xff, 0xd6/0xff),
+    'gray85': (0xd9/0xff, 0xd9/0xff, 0xd9/0xff),
+    'gray86': (0xdb/0xff, 0xdb/0xff, 0xdb/0xff),
+    'gray87': (0xde/0xff, 0xde/0xff, 0xde/0xff),
+    'gray88': (0xe0/0xff, 0xe0/0xff, 0xe0/0xff),
+    'gray89': (0xe3/0xff, 0xe3/0xff, 0xe3/0xff),
+    'gray90': (0xe5/0xff, 0xe5/0xff, 0xe5/0xff),
+    'gray91': (0xe8/0xff, 0xe8/0xff, 0xe8/0xff),
+    'gray92': (0xeb/0xff, 0xeb/0xff, 0xeb/0xff),
+    'gray93': (0xed/0xff, 0xed/0xff, 0xed/0xff),
+    'gray94': (0xf0/0xff, 0xf0/0xff, 0xf0/0xff),
+    'gray95': (0xf2/0xff, 0xf2/0xff, 0xf2/0xff),
+    'gray96': (0xf5/0xff, 0xf5/0xff, 0xf5/0xff),
+    'gray97': (0xf7/0xff, 0xf7/0xff, 0xf7/0xff),
+    'gray98': (0xfa/0xff, 0xfa/0xff, 0xfa/0xff),
+    'gray99': (0xfc/0xff, 0xfc/0xff, 0xfc/0xff),
+    'gray100': (0xff/0xff, 0xff/0xff, 0xff/0xff),
+    'green': (0x00/0xff, 0x80/0xff, 0x00/0xff),
+    'green yellow': (0xad/0xff, 0xff/0xff, 0x2f/0xff),
+    'green1': (0x00/0xff, 0xff/0xff, 0x00/0xff),
+    'green2': (0x00/0xff, 0xee/0xff, 0x00/0xff),
+    'green3': (0x00/0xff, 0xcd/0xff, 0x00/0xff),
+    'green4': (0x00/0xff, 0x8b/0xff, 0x00/0xff),
+    'greenyellow': (0xad/0xff, 0xff/0xff, 0x2f/0xff),
+    'grey': (0x80/0xff, 0x80/0xff, 0x80/0xff),
+    'grey0': (0x00/0xff, 0x00/0xff, 0x00/0xff),
+    'grey1': (0x03/0xff, 0x03/0xff, 0x03/0xff),
+    'grey2': (0x05/0xff, 0x05/0xff, 0x05/0xff),
+    'grey3': (0x08/0xff, 0x08/0xff, 0x08/0xff),
+    'grey4': (0x0a/0xff, 0x0a/0xff, 0x0a/0xff),
+    'grey5': (0x0d/0xff, 0x0d/0xff, 0x0d/0xff),
+    'grey6': (0x0f/0xff, 0x0f/0xff, 0x0f/0xff),
+    'grey7': (0x12/0xff, 0x12/0xff, 0x12/0xff),
+    'grey8': (0x14/0xff, 0x14/0xff, 0x14/0xff),
+    'grey9': (0x17/0xff, 0x17/0xff, 0x17/0xff),
+    'grey10': (0x1a/0xff, 0x1a/0xff, 0x1a/0xff),
+    'grey11': (0x1c/0xff, 0x1c/0xff, 0x1c/0xff),
+    'grey12': (0x1f/0xff, 0x1f/0xff, 0x1f/0xff),
+    'grey13': (0x21/0xff, 0x21/0xff, 0x21/0xff),
+    'grey14': (0x24/0xff, 0x24/0xff, 0x24/0xff),
+    'grey15': (0x26/0xff, 0x26/0xff, 0x26/0xff),
+    'grey16': (0x29/0xff, 0x29/0xff, 0x29/0xff),
+    'grey17': (0x2b/0xff, 0x2b/0xff, 0x2b/0xff),
+    'grey18': (0x2e/0xff, 0x2e/0xff, 0x2e/0xff),
+    'grey19': (0x30/0xff, 0x30/0xff, 0x30/0xff),
+    'grey20': (0x33/0xff, 0x33/0xff, 0x33/0xff),
+    'grey21': (0x36/0xff, 0x36/0xff, 0x36/0xff),
+    'grey22': (0x38/0xff, 0x38/0xff, 0x38/0xff),
+    'grey23': (0x3b/0xff, 0x3b/0xff, 0x3b/0xff),
+    'grey24': (0x3d/0xff, 0x3d/0xff, 0x3d/0xff),
+    'grey25': (0x40/0xff, 0x40/0xff, 0x40/0xff),
+    'grey26': (0x42/0xff, 0x42/0xff, 0x42/0xff),
+    'grey27': (0x45/0xff, 0x45/0xff, 0x45/0xff),
+    'grey28': (0x47/0xff, 0x47/0xff, 0x47/0xff),
+    'grey29': (0x4a/0xff, 0x4a/0xff, 0x4a/0xff),
+    'grey30': (0x4d/0xff, 0x4d/0xff, 0x4d/0xff),
+    'grey31': (0x4f/0xff, 0x4f/0xff, 0x4f/0xff),
+    'grey32': (0x52/0xff, 0x52/0xff, 0x52/0xff),
+    'grey33': (0x54/0xff, 0x54/0xff, 0x54/0xff),
+    'grey34': (0x57/0xff, 0x57/0xff, 0x57/0xff),
+    'grey35': (0x59/0xff, 0x59/0xff, 0x59/0xff),
+    'grey36': (0x5c/0xff, 0x5c/0xff, 0x5c/0xff),
+    'grey37': (0x5e/0xff, 0x5e/0xff, 0x5e/0xff),
+    'grey38': (0x61/0xff, 0x61/0xff, 0x61/0xff),
+    'grey39': (0x63/0xff, 0x63/0xff, 0x63/0xff),
+    'grey40': (0x66/0xff, 0x66/0xff, 0x66/0xff),
+    'grey41': (0x69/0xff, 0x69/0xff, 0x69/0xff),
+    'grey42': (0x6b/0xff, 0x6b/0xff, 0x6b/0xff),
+    'grey43': (0x6e/0xff, 0x6e/0xff, 0x6e/0xff),
+    'grey44': (0x70/0xff, 0x70/0xff, 0x70/0xff),
+    'grey45': (0x73/0xff, 0x73/0xff, 0x73/0xff),
+    'grey46': (0x75/0xff, 0x75/0xff, 0x75/0xff),
+    'grey47': (0x78/0xff, 0x78/0xff, 0x78/0xff),
+    'grey48': (0x7a/0xff, 0x7a/0xff, 0x7a/0xff),
+    'grey49': (0x7d/0xff, 0x7d/0xff, 0x7d/0xff),
+    'grey50': (0x7f/0xff, 0x7f/0xff, 0x7f/0xff),
+    'grey51': (0x82/0xff, 0x82/0xff, 0x82/0xff),
+    'grey52': (0x85/0xff, 0x85/0xff, 0x85/0xff),
+    'grey53': (0x87/0xff, 0x87/0xff, 0x87/0xff),
+    'grey54': (0x8a/0xff, 0x8a/0xff, 0x8a/0xff),
+    'grey55': (0x8c/0xff, 0x8c/0xff, 0x8c/0xff),
+    'grey56': (0x8f/0xff, 0x8f/0xff, 0x8f/0xff),
+    'grey57': (0x91/0xff, 0x91/0xff, 0x91/0xff),
+    'grey58': (0x94/0xff, 0x94/0xff, 0x94/0xff),
+    'grey59': (0x96/0xff, 0x96/0xff, 0x96/0xff),
+    'grey60': (0x99/0xff, 0x99/0xff, 0x99/0xff),
+    'grey61': (0x9c/0xff, 0x9c/0xff, 0x9c/0xff),
+    'grey62': (0x9e/0xff, 0x9e/0xff, 0x9e/0xff),
+    'grey63': (0xa1/0xff, 0xa1/0xff, 0xa1/0xff),
+    'grey64': (0xa3/0xff, 0xa3/0xff, 0xa3/0xff),
+    'grey65': (0xa6/0xff, 0xa6/0xff, 0xa6/0xff),
+    'grey66': (0xa8/0xff, 0xa8/0xff, 0xa8/0xff),
+    'grey67': (0xab/0xff, 0xab/0xff, 0xab/0xff),
+    'grey68': (0xad/0xff, 0xad/0xff, 0xad/0xff),
+    'grey69': (0xb0/0xff, 0xb0/0xff, 0xb0/0xff),
+    'grey70': (0xb3/0xff, 0xb3/0xff, 0xb3/0xff),
+    'grey71': (0xb5/0xff, 0xb5/0xff, 0xb5/0xff),
+    'grey72': (0xb8/0xff, 0xb8/0xff, 0xb8/0xff),
+    'grey73': (0xba/0xff, 0xba/0xff, 0xba/0xff),
+    'grey74': (0xbd/0xff, 0xbd/0xff, 0xbd/0xff),
+    'grey75': (0xbf/0xff, 0xbf/0xff, 0xbf/0xff),
+    'grey76': (0xc2/0xff, 0xc2/0xff, 0xc2/0xff),
+    'grey77': (0xc4/0xff, 0xc4/0xff, 0xc4/0xff),
+    'grey78': (0xc7/0xff, 0xc7/0xff, 0xc7/0xff),
+    'grey79': (0xc9/0xff, 0xc9/0xff, 0xc9/0xff),
+    'grey80': (0xcc/0xff, 0xcc/0xff, 0xcc/0xff),
+    'grey81': (0xcf/0xff, 0xcf/0xff, 0xcf/0xff),
+    'grey82': (0xd1/0xff, 0xd1/0xff, 0xd1/0xff),
+    'grey83': (0xd4/0xff, 0xd4/0xff, 0xd4/0xff),
+    'grey84': (0xd6/0xff, 0xd6/0xff, 0xd6/0xff),
+    'grey85': (0xd9/0xff, 0xd9/0xff, 0xd9/0xff),
+    'grey86': (0xdb/0xff, 0xdb/0xff, 0xdb/0xff),
+    'grey87': (0xde/0xff, 0xde/0xff, 0xde/0xff),
+    'grey88': (0xe0/0xff, 0xe0/0xff, 0xe0/0xff),
+    'grey89': (0xe3/0xff, 0xe3/0xff, 0xe3/0xff),
+    'grey90': (0xe5/0xff, 0xe5/0xff, 0xe5/0xff),
+    'grey91': (0xe8/0xff, 0xe8/0xff, 0xe8/0xff),
+    'grey92': (0xeb/0xff, 0xeb/0xff, 0xeb/0xff),
+    'grey93': (0xed/0xff, 0xed/0xff, 0xed/0xff),
+    'grey94': (0xf0/0xff, 0xf0/0xff, 0xf0/0xff),
+    'grey95': (0xf2/0xff, 0xf2/0xff, 0xf2/0xff),
+    'grey96': (0xf5/0xff, 0xf5/0xff, 0xf5/0xff),
+    'grey97': (0xf7/0xff, 0xf7/0xff, 0xf7/0xff),
+    'grey98': (0xfa/0xff, 0xfa/0xff, 0xfa/0xff),
+    'grey99': (0xfc/0xff, 0xfc/0xff, 0xfc/0xff),
+    'grey100': (0xff/0xff, 0xff/0xff, 0xff/0xff),
+    'honeydew': (0xf0/0xff, 0xff/0xff, 0xf0/0xff),
+    'honeydew1': (0xf0/0xff, 0xff/0xff, 0xf0/0xff),
+    'honeydew2': (0xe0/0xff, 0xee/0xff, 0xe0/0xff),
+    'honeydew3': (0xc1/0xff, 0xcd/0xff, 0xc1/0xff),
+    'honeydew4': (0x83/0xff, 0x8b/0xff, 0x83/0xff),
+    'hot pink': (0xff/0xff, 0x69/0xff, 0xb4/0xff),
+    'hotpink': (0xff/0xff, 0x69/0xff, 0xb4/0xff),
+    'hotpink1': (0xff/0xff, 0x6e/0xff, 0xb4/0xff),
+    'hotpink2': (0xee/0xff, 0x6a/0xff, 0xa7/0xff),
+    'hotpink3': (0xcd/0xff, 0x60/0xff, 0x90/0xff),
+    'hotpink4': (0x8b/0xff, 0x3a/0xff, 0x62/0xff),
+    'indian red': (0xcd/0xff, 0x5c/0xff, 0x5c/0xff),
+    'indianred': (0xcd/0xff, 0x5c/0xff, 0x5c/0xff),
+    'indianred1': (0xff/0xff, 0x6a/0xff, 0x6a/0xff),
+    'indianred2': (0xee/0xff, 0x63/0xff, 0x63/0xff),
+    'indianred3': (0xcd/0xff, 0x55/0xff, 0x55/0xff),
+    'indianred4': (0x8b/0xff, 0x3a/0xff, 0x3a/0xff),
+    'ivory': (0xff/0xff, 0xff/0xff, 0xf0/0xff),
+    'ivory1': (0xff/0xff, 0xff/0xff, 0xf0/0xff),
+    'ivory2': (0xee/0xff, 0xee/0xff, 0xe0/0xff),
+    'ivory3': (0xcd/0xff, 0xcd/0xff, 0xc1/0xff),
+    'ivory4': (0x8b/0xff, 0x8b/0xff, 0x83/0xff),
+    'khaki': (0xf0/0xff, 0xe6/0xff, 0x8c/0xff),
+    'khaki1': (0xff/0xff, 0xf6/0xff, 0x8f/0xff),
+    'khaki2': (0xee/0xff, 0xe6/0xff, 0x85/0xff),
+    'khaki3': (0xcd/0xff, 0xc6/0xff, 0x73/0xff),
+    'khaki4': (0x8b/0xff, 0x86/0xff, 0x4e/0xff),
+    'lavender': (0xe6/0xff, 0xe6/0xff, 0xfa/0xff),
+    'lavender blush': (0xff/0xff, 0xf0/0xff, 0xf5/0xff),
+    'lavenderblush': (0xff/0xff, 0xf0/0xff, 0xf5/0xff),
+    'lavenderblush1': (0xff/0xff, 0xf0/0xff, 0xf5/0xff),
+    'lavenderblush2': (0xee/0xff, 0xe0/0xff, 0xe5/0xff),
+    'lavenderblush3': (0xcd/0xff, 0xc1/0xff, 0xc5/0xff),
+    'lavenderblush4': (0x8b/0xff, 0x83/0xff, 0x86/0xff),
+    'lawn green': (0x7c/0xff, 0xfc/0xff, 0x00/0xff),
+    'lawngreen': (0x7c/0xff, 0xfc/0xff, 0x00/0xff),
+    'lemon chiffon': (0xff/0xff, 0xfa/0xff, 0xcd/0xff),
+    'lemonchiffon': (0xff/0xff, 0xfa/0xff, 0xcd/0xff),
+    'lemonchiffon1': (0xff/0xff, 0xfa/0xff, 0xcd/0xff),
+    'lemonchiffon2': (0xee/0xff, 0xe9/0xff, 0xbf/0xff),
+    'lemonchiffon3': (0xcd/0xff, 0xc9/0xff, 0xa5/0xff),
+    'lemonchiffon4': (0x8b/0xff, 0x89/0xff, 0x70/0xff),
+    'light blue': (0xad/0xff, 0xd8/0xff, 0xe6/0xff),
+    'light coral': (0xf0/0xff, 0x80/0xff, 0x80/0xff),
+    'light cyan': (0xe0/0xff, 0xff/0xff, 0xff/0xff),
+    'light goldenrod': (0xee/0xff, 0xdd/0xff, 0x82/0xff),
+    'light goldenrod yellow': (0xfa/0xff, 0xfa/0xff, 0xd2/0xff),
+    'light gray': (0xd3/0xff, 0xd3/0xff, 0xd3/0xff),
+    'light green': (0x90/0xff, 0xee/0xff, 0x90/0xff),
+    'light grey': (0xd3/0xff, 0xd3/0xff, 0xd3/0xff),
+    'light pink': (0xff/0xff, 0xb6/0xff, 0xc1/0xff),
+    'light salmon': (0xff/0xff, 0xa0/0xff, 0x7a/0xff),
+    'light sea green': (0x20/0xff, 0xb2/0xff, 0xaa/0xff),
+    'light sky blue': (0x87/0xff, 0xce/0xff, 0xfa/0xff),
+    'light slate blue': (0x84/0xff, 0x70/0xff, 0xff/0xff),
+    'light slate gray': (0x77/0xff, 0x88/0xff, 0x99/0xff),
+    'light slate grey': (0x77/0xff, 0x88/0xff, 0x99/0xff),
+    'light steel blue': (0xb0/0xff, 0xc4/0xff, 0xde/0xff),
+    'light yellow': (0xff/0xff, 0xff/0xff, 0xe0/0xff),
+    'lightblue': (0xad/0xff, 0xd8/0xff, 0xe6/0xff),
+    'lightblue1': (0xbf/0xff, 0xef/0xff, 0xff/0xff),
+    'lightblue2': (0xb2/0xff, 0xdf/0xff, 0xee/0xff),
+    'lightblue3': (0x9a/0xff, 0xc0/0xff, 0xcd/0xff),
+    'lightblue4': (0x68/0xff, 0x83/0xff, 0x8b/0xff),
+    'lightcoral': (0xf0/0xff, 0x80/0xff, 0x80/0xff),
+    'lightcyan': (0xe0/0xff, 0xff/0xff, 0xff/0xff),
+    'lightcyan1': (0xe0/0xff, 0xff/0xff, 0xff/0xff),
+    'lightcyan2': (0xd1/0xff, 0xee/0xff, 0xee/0xff),
+    'lightcyan3': (0xb4/0xff, 0xcd/0xff, 0xcd/0xff),
+    'lightcyan4': (0x7a/0xff, 0x8b/0xff, 0x8b/0xff),
+    'lightgoldenrod': (0xee/0xff, 0xdd/0xff, 0x82/0xff),
+    'lightgoldenrod1': (0xff/0xff, 0xec/0xff, 0x8b/0xff),
+    'lightgoldenrod2': (0xee/0xff, 0xdc/0xff, 0x82/0xff),
+    'lightgoldenrod3': (0xcd/0xff, 0xbe/0xff, 0x70/0xff),
+    'lightgoldenrod4': (0x8b/0xff, 0x81/0xff, 0x4c/0xff),
+    'lightgoldenrodyellow': (0xfa/0xff, 0xfa/0xff, 0xd2/0xff),
+    'lightgray': (0xd3/0xff, 0xd3/0xff, 0xd3/0xff),
+    'lightgreen': (0x90/0xff, 0xee/0xff, 0x90/0xff),
+    'lightgrey': (0xd3/0xff, 0xd3/0xff, 0xd3/0xff),
+    'lightpink': (0xff/0xff, 0xb6/0xff, 0xc1/0xff),
+    'lightpink1': (0xff/0xff, 0xae/0xff, 0xb9/0xff),
+    'lightpink2': (0xee/0xff, 0xa2/0xff, 0xad/0xff),
+    'lightpink3': (0xcd/0xff, 0x8c/0xff, 0x95/0xff),
+    'lightpink4': (0x8b/0xff, 0x5f/0xff, 0x65/0xff),
+    'lightsalmon': (0xff/0xff, 0xa0/0xff, 0x7a/0xff),
+    'lightsalmon1': (0xff/0xff, 0xa0/0xff, 0x7a/0xff),
+    'lightsalmon2': (0xee/0xff, 0x95/0xff, 0x72/0xff),
+    'lightsalmon3': (0xcd/0xff, 0x81/0xff, 0x62/0xff),
+    'lightsalmon4': (0x8b/0xff, 0x57/0xff, 0x42/0xff),
+    'lightseagreen': (0x20/0xff, 0xb2/0xff, 0xaa/0xff),
+    'lightskyblue': (0x87/0xff, 0xce/0xff, 0xfa/0xff),
+    'lightskyblue1': (0xb0/0xff, 0xe2/0xff, 0xff/0xff),
+    'lightskyblue2': (0xa4/0xff, 0xd3/0xff, 0xee/0xff),
+    'lightskyblue3': (0x8d/0xff, 0xb6/0xff, 0xcd/0xff),
+    'lightskyblue4': (0x60/0xff, 0x7b/0xff, 0x8b/0xff),
+    'lightslateblue': (0x84/0xff, 0x70/0xff, 0xff/0xff),
+    'lightslategray': (0x77/0xff, 0x88/0xff, 0x99/0xff),
+    'lightslategrey': (0x77/0xff, 0x88/0xff, 0x99/0xff),
+    'lightsteelblue': (0xb0/0xff, 0xc4/0xff, 0xde/0xff),
+    'lightsteelblue1': (0xca/0xff, 0xe1/0xff, 0xff/0xff),
+    'lightsteelblue2': (0xbc/0xff, 0xd2/0xff, 0xee/0xff),
+    'lightsteelblue3': (0xa2/0xff, 0xb5/0xff, 0xcd/0xff),
+    'lightsteelblue4': (0x6e/0xff, 0x7b/0xff, 0x8b/0xff),
+    'lightyellow': (0xff/0xff, 0xff/0xff, 0xe0/0xff),
+    'lightyellow1': (0xff/0xff, 0xff/0xff, 0xe0/0xff),
+    'lightyellow2': (0xee/0xff, 0xee/0xff, 0xd1/0xff),
+    'lightyellow3': (0xcd/0xff, 0xcd/0xff, 0xb4/0xff),
+    'lightyellow4': (0x8b/0xff, 0x8b/0xff, 0x7a/0xff),
+    'lime green': (0x32/0xff, 0xcd/0xff, 0x32/0xff),
+    'limegreen': (0x32/0xff, 0xcd/0xff, 0x32/0xff),
+    'linen': (0xfa/0xff, 0xf0/0xff, 0xe6/0xff),
+    'magenta': (0xff/0xff, 0x00/0xff, 0xff/0xff),
+    'magenta1': (0xff/0xff, 0x00/0xff, 0xff/0xff),
+    'magenta2': (0xee/0xff, 0x00/0xff, 0xee/0xff),
+    'magenta3': (0xcd/0xff, 0x00/0xff, 0xcd/0xff),
+    'magenta4': (0x8b/0xff, 0x00/0xff, 0x8b/0xff),
+    'maroon': (0x80/0xff, 0x00/0xff, 0x00/0xff),
+    'maroon1': (0xff/0xff, 0x34/0xff, 0xb3/0xff),
+    'maroon2': (0xee/0xff, 0x30/0xff, 0xa7/0xff),
+    'maroon3': (0xcd/0xff, 0x29/0xff, 0x90/0xff),
+    'maroon4': (0x8b/0xff, 0x1c/0xff, 0x62/0xff),
+    'medium aquamarine': (0x66/0xff, 0xcd/0xff, 0xaa/0xff),
+    'medium blue': (0x00/0xff, 0x00/0xff, 0xcd/0xff),
+    'medium orchid': (0xba/0xff, 0x55/0xff, 0xd3/0xff),
+    'medium purple': (0x93/0xff, 0x70/0xff, 0xdb/0xff),
+    'medium sea green': (0x3c/0xff, 0xb3/0xff, 0x71/0xff),
+    'medium slate blue': (0x7b/0xff, 0x68/0xff, 0xee/0xff),
+    'medium spring green': (0x00/0xff, 0xfa/0xff, 0x9a/0xff),
+    'medium turquoise': (0x48/0xff, 0xd1/0xff, 0xcc/0xff),
+    'medium violet red': (0xc7/0xff, 0x15/0xff, 0x85/0xff),
+    'mediumaquamarine': (0x66/0xff, 0xcd/0xff, 0xaa/0xff),
+    'mediumblue': (0x00/0xff, 0x00/0xff, 0xcd/0xff),
+    'mediumorchid': (0xba/0xff, 0x55/0xff, 0xd3/0xff),
+    'mediumorchid1': (0xe0/0xff, 0x66/0xff, 0xff/0xff),
+    'mediumorchid2': (0xd1/0xff, 0x5f/0xff, 0xee/0xff),
+    'mediumorchid3': (0xb4/0xff, 0x52/0xff, 0xcd/0xff),
+    'mediumorchid4': (0x7a/0xff, 0x37/0xff, 0x8b/0xff),
+    'mediumpurple': (0x93/0xff, 0x70/0xff, 0xdb/0xff),
+    'mediumpurple1': (0xab/0xff, 0x82/0xff, 0xff/0xff),
+    'mediumpurple2': (0x9f/0xff, 0x79/0xff, 0xee/0xff),
+    'mediumpurple3': (0x89/0xff, 0x68/0xff, 0xcd/0xff),
+    'mediumpurple4': (0x5d/0xff, 0x47/0xff, 0x8b/0xff),
+    'mediumseagreen': (0x3c/0xff, 0xb3/0xff, 0x71/0xff),
+    'mediumslateblue': (0x7b/0xff, 0x68/0xff, 0xee/0xff),
+    'mediumspringgreen': (0x00/0xff, 0xfa/0xff, 0x9a/0xff),
+    'mediumturquoise': (0x48/0xff, 0xd1/0xff, 0xcc/0xff),
+    'mediumvioletred': (0xc7/0xff, 0x15/0xff, 0x85/0xff),
+    'midnight blue': (0x19/0xff, 0x19/0xff, 0x70/0xff),
+    'midnightblue': (0x19/0xff, 0x19/0xff, 0x70/0xff),
+    'mint cream': (0xf5/0xff, 0xff/0xff, 0xfa/0xff),
+    'mintcream': (0xf5/0xff, 0xff/0xff, 0xfa/0xff),
+    'misty rose': (0xff/0xff, 0xe4/0xff, 0xe1/0xff),
+    'mistyrose': (0xff/0xff, 0xe4/0xff, 0xe1/0xff),
+    'mistyrose1': (0xff/0xff, 0xe4/0xff, 0xe1/0xff),
+    'mistyrose2': (0xee/0xff, 0xd5/0xff, 0xd2/0xff),
+    'mistyrose3': (0xcd/0xff, 0xb7/0xff, 0xb5/0xff),
+    'mistyrose4': (0x8b/0xff, 0x7d/0xff, 0x7b/0xff),
+    'moccasin': (0xff/0xff, 0xe4/0xff, 0xb5/0xff),
+    'navajo white': (0xff/0xff, 0xde/0xff, 0xad/0xff),
+    'navajowhite': (0xff/0xff, 0xde/0xff, 0xad/0xff),
+    'navajowhite1': (0xff/0xff, 0xde/0xff, 0xad/0xff),
+    'navajowhite2': (0xee/0xff, 0xcf/0xff, 0xa1/0xff),
+    'navajowhite3': (0xcd/0xff, 0xb3/0xff, 0x8b/0xff),
+    'navajowhite4': (0x8b/0xff, 0x79/0xff, 0x5e/0xff),
+    'navy': (0x00/0xff, 0x00/0xff, 0x80/0xff),
+    'navy blue': (0x00/0xff, 0x00/0xff, 0x80/0xff),
+    'navyblue': (0x00/0xff, 0x00/0xff, 0x80/0xff),
+    'old lace': (0xfd/0xff, 0xf5/0xff, 0xe6/0xff),
+    'oldlace': (0xfd/0xff, 0xf5/0xff, 0xe6/0xff),
+    'olive drab': (0x6b/0xff, 0x8e/0xff, 0x23/0xff),
+    'olivedrab': (0x6b/0xff, 0x8e/0xff, 0x23/0xff),
+    'olivedrab1': (0xc0/0xff, 0xff/0xff, 0x3e/0xff),
+    'olivedrab2': (0xb3/0xff, 0xee/0xff, 0x3a/0xff),
+    'olivedrab3': (0x9a/0xff, 0xcd/0xff, 0x32/0xff),
+    'olivedrab4': (0x69/0xff, 0x8b/0xff, 0x22/0xff),
+    'orange': (0xff/0xff, 0xa5/0xff, 0x00/0xff),
+    'orange red': (0xff/0xff, 0x45/0xff, 0x00/0xff),
+    'orange1': (0xff/0xff, 0xa5/0xff, 0x00/0xff),
+    'orange2': (0xee/0xff, 0x9a/0xff, 0x00/0xff),
+    'orange3': (0xcd/0xff, 0x85/0xff, 0x00/0xff),
+    'orange4': (0x8b/0xff, 0x5a/0xff, 0x00/0xff),
+    'orangered': (0xff/0xff, 0x45/0xff, 0x00/0xff),
+    'orangered1': (0xff/0xff, 0x45/0xff, 0x00/0xff),
+    'orangered2': (0xee/0xff, 0x40/0xff, 0x00/0xff),
+    'orangered3': (0xcd/0xff, 0x37/0xff, 0x00/0xff),
+    'orangered4': (0x8b/0xff, 0x25/0xff, 0x00/0xff),
+    'orchid': (0xda/0xff, 0x70/0xff, 0xd6/0xff),
+    'orchid1': (0xff/0xff, 0x83/0xff, 0xfa/0xff),
+    'orchid2': (0xee/0xff, 0x7a/0xff, 0xe9/0xff),
+    'orchid3': (0xcd/0xff, 0x69/0xff, 0xc9/0xff),
+    'orchid4': (0x8b/0xff, 0x47/0xff, 0x89/0xff),
+    'pale goldenrod': (0xee/0xff, 0xe8/0xff, 0xaa/0xff),
+    'pale green': (0x98/0xff, 0xfb/0xff, 0x98/0xff),
+    'pale turquoise': (0xaf/0xff, 0xee/0xff, 0xee/0xff),
+    'pale violet red': (0xdb/0xff, 0x70/0xff, 0x93/0xff),
+    'palegoldenrod': (0xee/0xff, 0xe8/0xff, 0xaa/0xff),
+    'palegreen': (0x98/0xff, 0xfb/0xff, 0x98/0xff),
+    'palegreen1': (0x9a/0xff, 0xff/0xff, 0x9a/0xff),
+    'palegreen2': (0x90/0xff, 0xee/0xff, 0x90/0xff),
+    'palegreen3': (0x7c/0xff, 0xcd/0xff, 0x7c/0xff),
+    'palegreen4': (0x54/0xff, 0x8b/0xff, 0x54/0xff),
+    'paleturquoise': (0xaf/0xff, 0xee/0xff, 0xee/0xff),
+    'paleturquoise1': (0xbb/0xff, 0xff/0xff, 0xff/0xff),
+    'paleturquoise2': (0xae/0xff, 0xee/0xff, 0xee/0xff),
+    'paleturquoise3': (0x96/0xff, 0xcd/0xff, 0xcd/0xff),
+    'paleturquoise4': (0x66/0xff, 0x8b/0xff, 0x8b/0xff),
+    'palevioletred': (0xdb/0xff, 0x70/0xff, 0x93/0xff),
+    'palevioletred1': (0xff/0xff, 0x82/0xff, 0xab/0xff),
+    'palevioletred2': (0xee/0xff, 0x79/0xff, 0x9f/0xff),
+    'palevioletred3': (0xcd/0xff, 0x68/0xff, 0x7f/0xff),
+    'palevioletred4': (0x8b/0xff, 0x47/0xff, 0x5d/0xff),
+    'papaya whip': (0xff/0xff, 0xef/0xff, 0xd5/0xff),
+    'papayawhip': (0xff/0xff, 0xef/0xff, 0xd5/0xff),
+    'peach puff': (0xff/0xff, 0xda/0xff, 0xb9/0xff),
+    'peachpuff': (0xff/0xff, 0xda/0xff, 0xb9/0xff),
+    'peachpuff1': (0xff/0xff, 0xda/0xff, 0xb9/0xff),
+    'peachpuff2': (0xee/0xff, 0xcb/0xff, 0xad/0xff),
+    'peachpuff3': (0xcd/0xff, 0xaf/0xff, 0x95/0xff),
+    'peachpuff4': (0x8b/0xff, 0x77/0xff, 0x65/0xff),
+    'peru': (0xcd/0xff, 0x85/0xff, 0x3f/0xff),
+    'pink': (0xff/0xff, 0xc0/0xff, 0xcb/0xff),
+    'pink1': (0xff/0xff, 0xb5/0xff, 0xc5/0xff),
+    'pink2': (0xee/0xff, 0xa9/0xff, 0xb8/0xff),
+    'pink3': (0xcd/0xff, 0x91/0xff, 0x9e/0xff),
+    'pink4': (0x8b/0xff, 0x63/0xff, 0x6c/0xff),
+    'plum': (0xdd/0xff, 0xa0/0xff, 0xdd/0xff),
+    'plum1': (0xff/0xff, 0xbb/0xff, 0xff/0xff),
+    'plum2': (0xee/0xff, 0xae/0xff, 0xee/0xff),
+    'plum3': (0xcd/0xff, 0x96/0xff, 0xcd/0xff),
+    'plum4': (0x8b/0xff, 0x66/0xff, 0x8b/0xff),
+    'powder blue': (0xb0/0xff, 0xe0/0xff, 0xe6/0xff),
+    'powderblue': (0xb0/0xff, 0xe0/0xff, 0xe6/0xff),
+    'purple': (0x80/0xff, 0x00/0xff, 0x80/0xff),
+    'purple1': (0x9b/0xff, 0x30/0xff, 0xff/0xff),
+    'purple2': (0x91/0xff, 0x2c/0xff, 0xee/0xff),
+    'purple3': (0x7d/0xff, 0x26/0xff, 0xcd/0xff),
+    'purple4': (0x55/0xff, 0x1a/0xff, 0x8b/0xff),
+    'red': (0xff/0xff, 0x00/0xff, 0x00/0xff),
+    'red1': (0xff/0xff, 0x00/0xff, 0x00/0xff),
+    'red2': (0xee/0xff, 0x00/0xff, 0x00/0xff),
+    'red3': (0xcd/0xff, 0x00/0xff, 0x00/0xff),
+    'red4': (0x8b/0xff, 0x00/0xff, 0x00/0xff),
+    'rosy brown': (0xbc/0xff, 0x8f/0xff, 0x8f/0xff),
+    'rosybrown': (0xbc/0xff, 0x8f/0xff, 0x8f/0xff),
+    'rosybrown1': (0xff/0xff, 0xc1/0xff, 0xc1/0xff),
+    'rosybrown2': (0xee/0xff, 0xb4/0xff, 0xb4/0xff),
+    'rosybrown3': (0xcd/0xff, 0x9b/0xff, 0x9b/0xff),
+    'rosybrown4': (0x8b/0xff, 0x69/0xff, 0x69/0xff),
+    'royal blue': (0x41/0xff, 0x69/0xff, 0xe1/0xff),
+    'royalblue': (0x41/0xff, 0x69/0xff, 0xe1/0xff),
+    'royalblue1': (0x48/0xff, 0x76/0xff, 0xff/0xff),
+    'royalblue2': (0x43/0xff, 0x6e/0xff, 0xee/0xff),
+    'royalblue3': (0x3a/0xff, 0x5f/0xff, 0xcd/0xff),
+    'royalblue4': (0x27/0xff, 0x40/0xff, 0x8b/0xff),
+    'saddle brown': (0x8b/0xff, 0x45/0xff, 0x13/0xff),
+    'saddlebrown': (0x8b/0xff, 0x45/0xff, 0x13/0xff),
+    'salmon': (0xfa/0xff, 0x80/0xff, 0x72/0xff),
+    'salmon1': (0xff/0xff, 0x8c/0xff, 0x69/0xff),
+    'salmon2': (0xee/0xff, 0x82/0xff, 0x62/0xff),
+    'salmon3': (0xcd/0xff, 0x70/0xff, 0x54/0xff),
+    'salmon4': (0x8b/0xff, 0x4c/0xff, 0x39/0xff),
+    'sandy brown': (0xf4/0xff, 0xa4/0xff, 0x60/0xff),
+    'sandybrown': (0xf4/0xff, 0xa4/0xff, 0x60/0xff),
+    'sea green': (0x2e/0xff, 0x8b/0xff, 0x57/0xff),
+    'seagreen': (0x2e/0xff, 0x8b/0xff, 0x57/0xff),
+    'seagreen1': (0x54/0xff, 0xff/0xff, 0x9f/0xff),
+    'seagreen2': (0x4e/0xff, 0xee/0xff, 0x94/0xff),
+    'seagreen3': (0x43/0xff, 0xcd/0xff, 0x80/0xff),
+    'seagreen4': (0x2e/0xff, 0x8b/0xff, 0x57/0xff),
+    'seashell': (0xff/0xff, 0xf5/0xff, 0xee/0xff),
+    'seashell1': (0xff/0xff, 0xf5/0xff, 0xee/0xff),
+    'seashell2': (0xee/0xff, 0xe5/0xff, 0xde/0xff),
+    'seashell3': (0xcd/0xff, 0xc5/0xff, 0xbf/0xff),
+    'seashell4': (0x8b/0xff, 0x86/0xff, 0x82/0xff),
+    'sienna': (0xa0/0xff, 0x52/0xff, 0x2d/0xff),
+    'sienna1': (0xff/0xff, 0x82/0xff, 0x47/0xff),
+    'sienna2': (0xee/0xff, 0x79/0xff, 0x42/0xff),
+    'sienna3': (0xcd/0xff, 0x68/0xff, 0x39/0xff),
+    'sienna4': (0x8b/0xff, 0x47/0xff, 0x26/0xff),
+    'sky blue': (0x87/0xff, 0xce/0xff, 0xeb/0xff),
+    'skyblue': (0x87/0xff, 0xce/0xff, 0xeb/0xff),
+    'skyblue1': (0x87/0xff, 0xce/0xff, 0xff/0xff),
+    'skyblue2': (0x7e/0xff, 0xc0/0xff, 0xee/0xff),
+    'skyblue3': (0x6c/0xff, 0xa6/0xff, 0xcd/0xff),
+    'skyblue4': (0x4a/0xff, 0x70/0xff, 0x8b/0xff),
+    'slate blue': (0x6a/0xff, 0x5a/0xff, 0xcd/0xff),
+    'slate gray': (0x70/0xff, 0x80/0xff, 0x90/0xff),
+    'slate grey': (0x70/0xff, 0x80/0xff, 0x90/0xff),
+    'slateblue': (0x6a/0xff, 0x5a/0xff, 0xcd/0xff),
+    'slateblue1': (0x83/0xff, 0x6f/0xff, 0xff/0xff),
+    'slateblue2': (0x7a/0xff, 0x67/0xff, 0xee/0xff),
+    'slateblue3': (0x69/0xff, 0x59/0xff, 0xcd/0xff),
+    'slateblue4': (0x47/0xff, 0x3c/0xff, 0x8b/0xff),
+    'slategray': (0x70/0xff, 0x80/0xff, 0x90/0xff),
+    'slategray1': (0xc6/0xff, 0xe2/0xff, 0xff/0xff),
+    'slategray2': (0xb9/0xff, 0xd3/0xff, 0xee/0xff),
+    'slategray3': (0x9f/0xff, 0xb6/0xff, 0xcd/0xff),
+    'slategray4': (0x6c/0xff, 0x7b/0xff, 0x8b/0xff),
+    'slategrey': (0x70/0xff, 0x80/0xff, 0x90/0xff),
+    'snow': (0xff/0xff, 0xfa/0xff, 0xfa/0xff),
+    'snow1': (0xff/0xff, 0xfa/0xff, 0xfa/0xff),
+    'snow2': (0xee/0xff, 0xe9/0xff, 0xe9/0xff),
+    'snow3': (0xcd/0xff, 0xc9/0xff, 0xc9/0xff),
+    'snow4': (0x8b/0xff, 0x89/0xff, 0x89/0xff),
+    'spring green': (0x00/0xff, 0xff/0xff, 0x7f/0xff),
+    'springgreen': (0x00/0xff, 0xff/0xff, 0x7f/0xff),
+    'springgreen1': (0x00/0xff, 0xff/0xff, 0x7f/0xff),
+    'springgreen2': (0x00/0xff, 0xee/0xff, 0x76/0xff),
+    'springgreen3': (0x00/0xff, 0xcd/0xff, 0x66/0xff),
+    'springgreen4': (0x00/0xff, 0x8b/0xff, 0x45/0xff),
+    'steel blue': (0x46/0xff, 0x82/0xff, 0xb4/0xff),
+    'steelblue': (0x46/0xff, 0x82/0xff, 0xb4/0xff),
+    'steelblue1': (0x63/0xff, 0xb8/0xff, 0xff/0xff),
+    'steelblue2': (0x5c/0xff, 0xac/0xff, 0xee/0xff),
+    'steelblue3': (0x4f/0xff, 0x94/0xff, 0xcd/0xff),
+    'steelblue4': (0x36/0xff, 0x64/0xff, 0x8b/0xff),
+    'tan': (0xd2/0xff, 0xb4/0xff, 0x8c/0xff),
+    'tan1': (0xff/0xff, 0xa5/0xff, 0x4f/0xff),
+    'tan2': (0xee/0xff, 0x9a/0xff, 0x49/0xff),
+    'tan3': (0xcd/0xff, 0x85/0xff, 0x3f/0xff),
+    'tan4': (0x8b/0xff, 0x5a/0xff, 0x2b/0xff),
+    'thistle': (0xd8/0xff, 0xbf/0xff, 0xd8/0xff),
+    'thistle1': (0xff/0xff, 0xe1/0xff, 0xff/0xff),
+    'thistle2': (0xee/0xff, 0xd2/0xff, 0xee/0xff),
+    'thistle3': (0xcd/0xff, 0xb5/0xff, 0xcd/0xff),
+    'thistle4': (0x8b/0xff, 0x7b/0xff, 0x8b/0xff),
+    'tomato': (0xff/0xff, 0x63/0xff, 0x47/0xff),
+    'tomato1': (0xff/0xff, 0x63/0xff, 0x47/0xff),
+    'tomato2': (0xee/0xff, 0x5c/0xff, 0x42/0xff),
+    'tomato3': (0xcd/0xff, 0x4f/0xff, 0x39/0xff),
+    'tomato4': (0x8b/0xff, 0x36/0xff, 0x26/0xff),
+    'turquoise': (0x40/0xff, 0xe0/0xff, 0xd0/0xff),
+    'turquoise1': (0x00/0xff, 0xf5/0xff, 0xff/0xff),
+    'turquoise2': (0x00/0xff, 0xe5/0xff, 0xee/0xff),
+    'turquoise3': (0x00/0xff, 0xc5/0xff, 0xcd/0xff),
+    'turquoise4': (0x00/0xff, 0x86/0xff, 0x8b/0xff),
+    'violet': (0xee/0xff, 0x82/0xff, 0xee/0xff),
+    'violet red': (0xd0/0xff, 0x20/0xff, 0x90/0xff),
+    'violetred': (0xd0/0xff, 0x20/0xff, 0x90/0xff),
+    'violetred1': (0xff/0xff, 0x3e/0xff, 0x96/0xff),
+    'violetred2': (0xee/0xff, 0x3a/0xff, 0x8c/0xff),
+    'violetred3': (0xcd/0xff, 0x32/0xff, 0x78/0xff),
+    'violetred4': (0x8b/0xff, 0x22/0xff, 0x52/0xff),
+    'wheat': (0xf5/0xff, 0xde/0xff, 0xb3/0xff),
+    'wheat1': (0xff/0xff, 0xe7/0xff, 0xba/0xff),
+    'wheat2': (0xee/0xff, 0xd8/0xff, 0xae/0xff),
+    'wheat3': (0xcd/0xff, 0xba/0xff, 0x96/0xff),
+    'wheat4': (0x8b/0xff, 0x7e/0xff, 0x66/0xff),
+    'white': (0xff/0xff, 0xff/0xff, 0xff/0xff),
+    'white smoke': (0xf5/0xff, 0xf5/0xff, 0xf5/0xff),
+    'whitesmoke': (0xf5/0xff, 0xf5/0xff, 0xf5/0xff),
+    'yellow': (0xff/0xff, 0xff/0xff, 0x00/0xff),
+    'yellow green': (0x9a/0xff, 0xcd/0xff, 0x32/0xff),
+    'yellow1': (0xff/0xff, 0xff/0xff, 0x00/0xff),
+    'yellow2': (0xee/0xff, 0xee/0xff, 0x00/0xff),
+    'yellow3': (0xcd/0xff, 0xcd/0xff, 0x00/0xff),
+    'yellow4': (0x8b/0xff, 0x8b/0xff, 0x00/0xff),
+    'yellowgreen': (0x9a/0xff, 0xcd/0xff, 0x32/0xff)
+};
+
 with cairo.SVGSurface(filename, 512, 512) as surface:
     cr = cairo.Context(surface);
     del cairo
+
+    def arc(x, y, r, a1, a2):
+        cr.arc(x, y, r, a1, a2);
+
+    def circle(x, y, r):
+        cr.arc(x, y, r, 0, 2 * math.pi);
+
+    def fill():
+        cr.fill();
+
+    def set_color(color):
+        if color in COLORS:
+            (r,g,b) = COLORS[color];
+        else:
+            (r,g,b) = (0,0,0)
+        cr.set_source_rgb(r, g, b)
+
     cr.set_line_width(6);
     exec(input)