diff options
author | John R. Lenton <jlenton@gmail.com> | 2014-01-07 23:06:46 +0000 |
---|---|---|
committer | John R. Lenton <jlenton@gmail.com> | 2014-01-07 23:06:46 +0000 |
commit | 9c83ec0edac2394431a5d1aecba1d666ffdea0a3 (patch) | |
tree | ccf18860da373cf13194788b793a962335d69fef | |
parent | 27d4ca7693c276d09a911c00c3442729c516dc23 (diff) | |
download | micropython-9c83ec0edac2394431a5d1aecba1d666ffdea0a3.tar.gz micropython-9c83ec0edac2394431a5d1aecba1d666ffdea0a3.zip |
Merge remote-tracking branch 'upstream/master' into dict_feats
55 files changed, 2760 insertions, 627 deletions
diff --git a/examples/accellog.py b/examples/accellog.py new file mode 100644 index 0000000000..81f44f19a8 --- /dev/null +++ b/examples/accellog.py @@ -0,0 +1,14 @@ +# log the accelerometer values to a file, 1 per second + +f = open('motion.dat', 'w') # open the file for writing + +for i in range(60): # loop 60 times + time = pyb.time() # get the current time + accel = pyb.accel() # get the accelerometer data + + # write time and x,y,z values to the file + f.write('{} {} {} {}\n'.format(time, accel[0], accel[1], accel[2])) + + pyb.delay(1000) # wait 1000 ms = 1 second + +f.close() # close the file diff --git a/examples/conwaylife.py b/examples/conwaylife.py new file mode 100644 index 0000000000..fb62ce69e8 --- /dev/null +++ b/examples/conwaylife.py @@ -0,0 +1,43 @@ +# do 1 iteration of Conway's Game of Life +def conway_step(): + for x in range(128): # loop over x coordinates + for y in range(32): # loop over y coordinates + # count number of neigbours + num_neighbours = (lcd.get(x - 1, y - 1) + + lcd.get(x, y - 1) + + lcd.get(x + 1, y - 1) + + lcd.get(x - 1, y) + + lcd.get(x + 1, y) + + lcd.get(x + 1, y + 1) + + lcd.get(x, y + 1) + + lcd.get(x - 1, y + 1)) + + # check if the centre cell is alive or not + self = lcd.get(x, y) + + # apply the rules of life + if self and not (2 <= num_neighbours <= 3): + lcd.reset(x, y) # not enough, or too many neighbours: cell dies + elif not self and num_neighbours == 3: + lcd.set(x, y) # exactly 3 neigbours around an empty cell: cell is born + +# randomise the start +def conway_rand(): + lcd.clear() # clear the LCD + for x in range(128): # loop over x coordinates + for y in range(32): # loop over y coordinates + if pyb.rand() & 1: # get a 1-bit random number + lcd.set(x, y) # set the pixel randomly + +# loop for a certain number of frames, doing iterations of Conway's Game of Life +def conway_go(num_frames): + for i in range(num_frames): + conway_step() # do 1 iteration + lcd.show() # update the LCD + +# PC testing +import lcd +import pyb +lcd = lcd.LCD(128, 32) +conway_rand() +conway_go(100) diff --git a/examples/lcd.py b/examples/lcd.py new file mode 100644 index 0000000000..3303337bfb --- /dev/null +++ b/examples/lcd.py @@ -0,0 +1,36 @@ +# LCD testing object for PC +# uses double buffering +class LCD: + def __init__(self, width, height): + self.width = width + self.height = height + self.buf1 = [[0 for x in range(self.width)] for y in range(self.height)] + self.buf2 = [[0 for x in range(self.width)] for y in range(self.height)] + + def clear(self): + for y in range(self.height): + for x in range(self.width): + self.buf1[y][x] = self.buf2[y][x] = 0 + + def show(self): + print('') # blank line to separate frames + for y in range(self.height): + for x in range(self.width): + self.buf1[y][x] = self.buf2[y][x] + for y in range(self.height): + row = ''.join(['*' if self.buf1[y][x] else ' ' for x in range(self.width)]) + print(row) + + def get(self, x, y): + if 0 <= x < self.width and 0 <= y < self.height: + return self.buf1[y][x] + else: + return 0 + + def reset(self, x, y): + if 0 <= x < self.width and 0 <= y < self.height: + self.buf2[y][x] = 0 + + def set(self, x, y): + if 0 <= x < self.width and 0 <= y < self.height: + self.buf2[y][x] = 1 diff --git a/examples/ledangle.py b/examples/ledangle.py new file mode 100644 index 0000000000..35c9148a49 --- /dev/null +++ b/examples/ledangle.py @@ -0,0 +1,22 @@ +def led_angle(seconds_to_run_for): + # make LED objects + l1 = pyb.Led(1) + l2 = pyb.Led(2) + + for i in range(20 * seconds_to_run_for): + # get x-axis + accel = pyb.accel()[0] + + # turn on LEDs depending on angle + if accel < -10: + l1.on() + l2.off() + elif accel > 10: + l1.off() + l2.on() + else: + l1.off() + l2.off() + + # delay so that loop runs at at 1/50ms = 20Hz + pyb.delay(50) diff --git a/examples/mandel.py b/examples/mandel.py index b13b7d87f8..996132a915 100644 --- a/examples/mandel.py +++ b/examples/mandel.py @@ -1,14 +1,22 @@ -@micropython.native -def in_set(c): - z = 0 - for i in range(40): - z = z*z + c - if abs(z) > 60: - return False - return True +def mandelbrot(): + # returns True if c, complex, is in the Mandelbrot set + @micropython.native + def in_set(c): + z = 0 + for i in range(40): + z = z*z + c + if abs(z) > 60: + return False + return True -for v in range(31): - line = [] + lcd.clear() for u in range(91): - line.append('*' if in_set((u / 30 - 2) + (v / 15 - 1) * 1j) else ' ') - print(''.join(line)) + for v in range(31): + if in_set((u / 30 - 2) + (v / 15 - 1) * 1j): + lcd.set(u, v) + lcd.show() + +# PC testing +import lcd +lcd = lcd.LCD(128, 32) +mandelbrot() diff --git a/examples/pyb.py b/examples/pyb.py new file mode 100644 index 0000000000..5e24f40e4a --- /dev/null +++ b/examples/pyb.py @@ -0,0 +1,11 @@ +# pyboard testing functions for PC + +def delay(n): + pass + +rand_seed = 1 +def rand(): + global rand_seed + # for these choice of numbers, see P L'Ecuyer, "Tables of linear congruential generators of different sizes and good lattice structure" + rand_seed = (rand_seed * 653276) % 8388593 + return rand_seed diff --git a/logo/vector-logo-2-BW.svg b/logo/vector-logo-2-BW.svg new file mode 100644 index 0000000000..d7ff920f98 --- /dev/null +++ b/logo/vector-logo-2-BW.svg @@ -0,0 +1,587 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + width="765.09448" + height="779.328" + id="svg2" + inkscape:version="0.48.4 r9939" + sodipodi:docname="vector-logo-BW-1.svg"> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1316" + inkscape:window-height="1086" + id="namedview127" + showgrid="false" + inkscape:zoom="1.1875869" + inkscape:cx="382.63129" + inkscape:cy="304.25291" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="layer3" /> + <defs + id="defs4"> + <linearGradient + id="linearGradient4981"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4983" /> + <stop + style="stop-color:#616200;stop-opacity:1;" + offset="1" + id="stop4985" /> + </linearGradient> + <linearGradient + id="linearGradient4903"> + <stop + style="stop-color:#c60000;stop-opacity:1;" + offset="0" + id="stop4905" /> + <stop + id="stop4907" + offset="0.04422363" + style="stop-color:#ff0000;stop-opacity:1;" /> + <stop + id="stop4909" + offset="0.36034104" + style="stop-color:#ff8b00;stop-opacity:1;" /> + <stop + style="stop-color:#ffff00;stop-opacity:1;" + offset="1" + id="stop4911" /> + </linearGradient> + <linearGradient + id="linearGradient4873"> + <stop + id="stop4875" + offset="0" + style="stop-color:#c60000;stop-opacity:1;" /> + <stop + style="stop-color:#ff0000;stop-opacity:1;" + offset="0.38491711" + id="stop4877" /> + <stop + style="stop-color:#ff8b00;stop-opacity:1;" + offset="0.77155995" + id="stop4879" /> + <stop + id="stop4881" + offset="1" + style="stop-color:#ffff00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4821"> + <stop + style="stop-color:#c60000;stop-opacity:1;" + offset="0" + id="stop4823" /> + <stop + id="stop4861" + offset="0.38577998" + style="stop-color:#ff0000;stop-opacity:1;" /> + <stop + id="stop4829" + offset="0.77155995" + style="stop-color:#ff8b00;stop-opacity:1;" /> + <stop + style="stop-color:#ffff00;stop-opacity:1;" + offset="1" + id="stop4825" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#fa8400;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4817" + offset="0.25452197" + style="stop-color:#fcc100;stop-opacity:1;" /> + <stop + style="stop-color:#ffff00;stop-opacity:1;" + offset="1" + id="stop4813" /> + </linearGradient> + <linearGradient + id="linearGradient4344"> + <stop + style="stop-color:#ef0000;stop-opacity:1;" + offset="0" + id="stop4346" /> + <stop + id="stop4805" + offset="0.45368573" + style="stop-color:#f75401;stop-opacity:1;" /> + <stop + style="stop-color:#fff802;stop-opacity:1;" + offset="1" + id="stop4348" /> + </linearGradient> + <symbol + id="*Paper_Space0" /> + <symbol + id="*Paper_Space" /> + <symbol + id="*Model_Space" /> + <pattern + height="8" + id="Hatch" + patternUnits="userSpaceOnUse" + width="8" + x="0" + y="0"> + <path + d="M8 4 l-4,4" + linecap="square" + stroke="#000000" + stroke-width="0.25" + id="path3049" /> + <path + d="M6 2 l-4,4" + linecap="square" + stroke="#000000" + stroke-width="0.25" + id="path3051" /> + <path + d="M4 0 l-4,4" + linecap="square" + stroke="#000000" + stroke-width="0.25" + id="path3053" /> + </pattern> + <marker + refX="0" + refY="0" + orient="auto" + id="DistanceX" + style="overflow:visible"> + <path + d="M 3,-3 -3,3 M 0,-5 0,5" + id="path3046" + style="stroke:#000000;stroke-width:0.5" /> + </marker> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4873" + id="linearGradient4803" + x1="387.54962" + y1="113.39538" + x2="363.88544" + y2="299.19879" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4809" + id="linearGradient4815" + x1="269.98376" + y1="444.30634" + x2="414.03595" + y2="496.92322" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4821" + id="linearGradient4839" + x1="279.8494" + y1="358.39282" + x2="244.67528" + y2="428.27463" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4821" + id="linearGradient4849" + x1="253.54097" + y1="412.24292" + x2="231.52107" + y2="464.03766" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4821" + id="linearGradient4859" + x1="452.4986" + y1="352.22678" + x2="493.78342" + y2="414.70935" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4873" + id="linearGradient4871" + x1="474.69635" + y1="404.02155" + x2="514.33685" + y2="463.21555" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4873" + id="linearGradient4891" + x1="417.96875" + y1="360.03708" + x2="341.68771" + y2="375.65771" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4903" + id="radialGradient4901" + cx="434.08942" + cy="495.59387" + fx="434.08942" + fy="495.59387" + r="50.650486" + gradientTransform="matrix(1.2124098,-0.04331903,0.00527986,0.14777225,-94.821533,430.98259)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4809" + id="linearGradient4921" + x1="588.93628" + y1="413.79886" + x2="502.7338" + y2="489.19949" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4903" + id="linearGradient4931" + x1="166.69272" + y1="412.81537" + x2="220.14532" + y2="492.14993" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4809" + id="linearGradient4941" + x1="221.63501" + y1="537.67871" + x2="212.0386" + y2="581.11884" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4809" + id="linearGradient4951" + x1="525.33746" + y1="548.20868" + x2="535.51666" + y2="594.10468" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4873" + id="linearGradient4961" + x1="206.68782" + y1="476.74197" + x2="188.67377" + y2="567.22272" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4873" + id="linearGradient4977" + x1="515.50256" + y1="496.73953" + x2="534.86096" + y2="564.27228" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4873" + id="linearGradient4997" + x1="162.10312" + y1="552.79834" + x2="165.07007" + y2="570.50104" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4981" + id="linearGradient5007" + x1="194.88599" + y1="636.06677" + x2="188.0181" + y2="617.05273" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4981" + id="linearGradient5017" + x1="271.59793" + y1="628.52673" + x2="300.13556" + y2="626.55975" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4981" + id="linearGradient5027" + x1="469.60657" + y1="643.60687" + x2="469.95093" + y2="601.64478" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4981" + id="linearGradient5037" + x1="517.4696" + y1="651.47473" + x2="515.84698" + y2="600.98907" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4981" + id="linearGradient5047" + x1="270.94226" + y1="667.21051" + x2="273.90927" + y2="601.64478" + gradientUnits="userSpaceOnUse" /> + </defs> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + id="g3058" + transform="translate(10.5,-283.5375)" /> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="work" + style="display:inline"> + <path + d="m 454.71085,42.269961 c -1.84306,-4.16383 -8.01725,-8.0321 -10.56009,-8.00789 -2.54283,0.0242 -6.85424,-1.17464 -5.27554,-5.5465 1.5787,-4.37185 7.70455,-4.42682 10.36862,-3.40045 2.66408,1.02637 8.60663,3.31382 10.67443,17.60551 2.0678,14.29168 -3.36437,3.51316 -5.20742,-0.65067 z" + id="path3072-7" + style="fill:#000000;fill-opacity:1;stroke:none;display:inline" + inkscape:connector-curvature="0" + sodipodi:nodetypes="zzzzzz" /> + <path + d="m 376.90653,28.503352 c -4.55875,2.209186 -5.68635,-4.51432 -3.82908,-7.783822 1.85727,-3.269502 7.61779,-7.338561 11.18656,-8.748148 3.56877,-1.409587 7.0703,-1.282096 7.84101,0.66902 -0.69594,7.238184 -10.63974,13.653764 -15.19849,15.86295 z" + id="path3070-4" + style="fill:#000000;fill-opacity:1;stroke:none;display:inline" + inkscape:connector-curvature="0" + sodipodi:nodetypes="zzzcz" /> + <path + style="fill:#000000;fill-opacity:1;stroke:none;display:inline" + d="m 403.00043,144.27939 c 4.82135,0.33482 12.51176,-7.97481 11.47067,-15.50764 -1.04109,-7.53282 -5.44177,-13.47845 -11.01274,-13.50791 -5.57097,-0.0295 -13.08577,7.35435 -11.63515,14.13061 0.51844,2.59416 1.94883,8.72762 4.71599,5.74451 3.28523,-0.66156 0.59669,-2.45848 2.46895,-6.60993 0.84584,-1.49606 3.82062,-1.93456 5.14537,-0.32025 1.32475,1.61431 1.77634,5.60243 -1.5359,7.25691 -2.05971,0.74048 -3.01527,-1.474 -5.65724,0.71791 -2.64197,2.19191 3.30447,8.07516 6.04005,8.09579 z" + id="path3066-0" + inkscape:connector-curvature="0" + sodipodi:nodetypes="czzccczczc" /> + <path + style="fill:#000000;fill-opacity:1;stroke:none;display:inline" + d="m 376.55272,127.26886 c -1.7364,0.68278 -2.36572,4.04539 -0.81525,5.89961 1.43203,1.71258 4.93182,0.31723 5.56335,2.97696 2.88715,2.89045 -3.88391,5.71124 -6.32342,4.6879 -7.56769,-1.97924 -11.14524,-14.48231 -6.5713,-23.62082 6.45515,-8.40383 14.45784,-6.27094 18.5915,0.0414 2.09136,3.25743 3.09899,7.58994 2.16742,11.37571 -0.95226,2.46814 -1.37316,6.89393 -5.31942,7.45248 -0.4445,-1.6504 -3.25454,-1.51236 -1.81483,-3.27307 1.63819,-2.00345 0.66929,-3.60155 -0.11497,-4.90747 -0.99007,-1.64863 -3.62668,-1.31548 -5.36308,-0.6327 z" + id="path3068-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="zsccccccssz" /> + <path + id="path4649" + style="fill:#000000;display:inline" + d="m 14.658212,571.87891 132.584628,-61.6619 -6.07018,-18.06946 c -2.88978,-8.60218 -1.76874,-23.61644 7.17673,-32.71776 8.94548,-9.10131 11.5393,-10.67252 11.5393,-10.67252 0,0 0.54727,-10.45307 0.54727,-17.46859 0,-17.1284 3.33975,-27.5856 11.93957,-37.38339 5.5019,-6.26838 21.51726,-12.9533 28.20968,-13.83449 4.85197,-0.63886 8.61903,-0.34111 15.53938,1.66667 -0.12917,-4.16054 0.587,-8.90949 2.98755,-13.61296 6.539,-12.81204 13.21525,-17.88639 25.329,-19.25177 8.84468,-0.99693 13.77411,0.35925 28.90302,7.95165 10.03175,5.03446 21.3543,11.19832 24.99504,13.92565 4.01538,3.00798 6.20949,5.2793 10.2812,7.07677 2.41013,-3.60268 6.94338,-10.5171 10.95422,-17.57461 2.33429,-4.10744 10.37611,-17.13568 13.53048,-21.85455 1.57719,-2.35944 6.41985,-8.37195 6.41985,-8.37195 0,0 -1.31142,-8.12758 -0.88067,-12.36731 0.58935,-5.80072 0.97428,-7.57349 4.83184,-12.3627 -3.77939,-2.14565 -3.08319,-1.41947 -7.08681,-3.94365 -20.25239,-12.76862 -34.16873,-27.84627 -40.15509,-56.30446 -5.10584,-24.27216 -4.4007,-41.40703 2.45205,-67.21417 7.7036,-29.01143 15.18952,-45.36816 29.55351,-59.03876 14.92537,-11.0627 12.43198,-2.04001 13.59689,-19.366352 0.91324,-13.583101 11.8782,-40.347468 29.45422,-53.60083 9.58947,-7.231026 21.97858,-3.80485 29.59099,6.499002 10.53054,14.253709 0.17853,14.404082 17.63051,6.752714 20.86592,-9.148123 32.54883,23.523546 33.42248,37.14046 1.05673,16.470376 -1.16843,26.010386 -2.86333,33.904326 4.07154,3.62047 2.58248,1.74759 10.76968,11.51853 8.3892,10.012 12.1486,33.75453 11.34494,62.78361 -0.94573,34.16092 -9.95422,79.26151 -18.82188,96.91198 -7.28684,14.50413 -24.53772,51.74222 -33.64333,81.36391 7.04951,-6.89289 20.03619,-17.09193 31.68777,-23.60977 19.57067,-10.94775 35.86826,-17.6548 52.92838,-23.0765 14.60926,-4.27271 23.92007,0.94007 28.81773,14.86833 l 2.78896,8.35016 14.37056,-0.70574 c 12.36244,-0.6071 16.19906,0.35898 27.45466,6.91325 10.81349,6.29685 14.16725,9.98514 19.32611,21.25359 5.56944,12.16516 6.09614,15.76469 4.8874,33.4003 l -1.35481,19.76574 10.91438,9.60721 c 16.75872,14.75164 25.36378,34.92912 25.42245,59.61145 -0.50196,4.11911 -0.21508,4.42147 -0.93671,9.20235 38.87789,17.76784 115.57654,54.01999 115.57654,54.01999 L 382.42702,706.07474 z m 370.564338,17.77562 c 9.05475,-2.46466 13.58602,-7.58834 18.33472,-10.80361 -10.97449,-12.30208 -18.65245,-25.92708 -26.74569,-45.63149 -4.82799,4.2971 -6.82318,5.90884 -14.22414,10.22159 -13.42149,7.82108 -23.29409,12.77694 -57.4254,4.90126 -6.20655,-1.43214 -10.39595,-5.23376 -17.19163,-10.18726 3.19112,8.85178 13.86295,22.82829 20.52994,29.96884 9.60429,2.44089 16.74117,5.22791 37.62625,4.98794 20.88508,-0.23997 27.9957,-7.12402 28.16531,-6.11681 1.46865,8.72131 -10.15732,15.08153 -17.76404,15.8875 -28.685,3.03932 -35.00933,-2.21337 -14.62245,8.09979 5.86099,2.96492 34.26238,1.13691 43.31713,-1.32775 z m -80.78275,-2.78657 c -0.89959,-3.50631 -9.45553,-13.31314 -16.50253,-22.41247 -12.72217,0.86257 -31.67329,-0.15844 -50.36917,-1.39061 1.28995,5.05783 2.66671,9.35459 8.01513,16.24454 21.31675,7.41613 29.38807,8.69456 58.85657,7.55854 z m 196.55253,-1.05658 c 7.48368,-7.7352 12.59399,-14.06394 14.48282,-24.0163 -9.86035,0.32816 -31.29112,-0.21889 -43.67612,-1.59123 -2.69192,9.78937 -7.53001,16.5494 -12.60926,27.22235 15.18807,0.0987 34.6126,-0.34167 41.80256,-1.61482 z m -39.5462,-25.77116 c -14.22026,-1.04341 -24.64197,-1.70322 -34.91073,-5.06032 1.48042,5.45477 11.46978,23.84715 21.5113,29.43516 8.27915,-6.74863 11.17085,-18.04429 13.39943,-24.37484 z m 89.8385,17.75618 c 11.06658,-12.35693 10.92734,-17.54469 12.64857,-22.88767 -11.30062,3.12506 -19.72285,3.93232 -32.57321,6.37359 -1.89748,6.90764 -8.91109,16.08982 -13.29931,23.08728 10.8857,-1.22697 19.80754,-2.14697 33.22395,-6.5732 z m -317.64736,-1.93287 c -3.6673,-5.08173 -5.86306,-11.13515 -7.03993,-15.06225 -9.55859,-2.04306 -25.015,-11.46938 -36.15974,-15.65039 -0.84013,3.61202 0.47555,6.43514 1.89431,9.82309 3.08034,2.34947 5.43298,4.84837 12.48233,8.01965 11.52918,5.18662 18.20624,9.12314 28.82303,12.8699 z m 186.64301,-6.91909 c 0,-1.28295 -3.83994,-11.06621 -8.53319,-21.74059 -12.64973,-28.77081 -15.90521,-45.89651 -15.92698,-83.78673 -0.0252,-43.63944 7.06295,-74.30199 28.38761,-122.803 12.2828,-27.93634 24.14205,-48.33846 31.75211,-88.421 -6.5755,13.7585 -12.42832,19.89196 -19.64511,27.05989 -21.77232,21.62492 -35.43644,26.31219 -52.19205,28.77556 -10.17306,1.49562 -14.72264,2.13603 -24.70943,1.96892 -2.20297,3.58807 -4.85267,2.59811 -6.46175,8.54423 7.20281,-3.74693 18.38353,-7.60728 30.32987,-0.36061 13.17431,13.17431 13.24085,43.09586 0.21129,95.05167 -9.8248,39.17692 -10.19364,71.64538 -1.16772,102.79178 6.95963,24.01643 12.71354,36.38943 22.12232,47.57108 6.06993,7.21372 15.83313,10.51196 15.83313,5.3488 z m 171.97615,-4.87721 c 13.62786,-7.80295 31.09463,-25.81562 31.4869,-37.0782 l 0.58746,-16.86667 c 0,0 -3.33814,8.50328 -11.45734,16.98325 -8.1192,8.47997 -26.38286,19.25438 -30.88292,21.72921 -0.59939,9.46563 -4.06332,14.42941 -11.30069,24.85736 9.79893,-3.37732 9.75496,-2.86192 21.56659,-9.62495 z m -399.08628,2.32889 c -9.51845,-4.1386 -13.88481,-11.58962 -21.31996,-16.28929 -24.47145,0 -34.7761,15.07859 -41.53164,27.12964 17.4467,-7.24642 26.52906,-13.51756 62.8516,-10.84035 z m 89.61415,-12.03996 c -2.96659,-6.9594 -8.5975,-16.20369 -10.65302,-24.42661 -3.32741,-13.53845 -4.3118,-22.83307 -5.06108,-33.41904 l -18.6361,-1.69054 c -31.57594,-2.86434 -59.06629,-14.64122 -75.55586,-32.36812 -3.26858,-3.51386 -5.96093,-5.2139 -9.24658,-6.38882 -8.83027,1.85899 -18.19769,18.97121 -17.02277,27.01586 1.72967,11.84307 9.77201,29.61721 24.56626,41.34153 29.28013,23.2043 51.68723,28.03568 82.41647,30.05478 2.27989,0.18213 20.99745,0.37832 29.19268,-0.11904 z m 264.96688,-7.59969 c 33.17591,-8.05353 46.3337,-14.29038 61.72491,-29.25789 11.72243,-11.39971 11.62368,-12.00816 13.38605,-19.93479 -1.76237,-24.37548 -10.99587,-32.58734 -21.33375,-43.1616 -7.10687,5.87459 -13.24631,10.18619 -26.84018,17.60995 -31.82211,17.37834 -38.09788,19.98117 -66.15889,27.43875 -24.8411,6.60186 -60.30618,8.65945 -85.18479,4.94212 -7.56759,-1.13074 -9.34913,-1.85205 -13.95251,-3.79109 0.68374,8.63522 7.02657,30.89277 10.82601,41.77378 5.85555,2.06914 18.69644,5.78501 34.4079,7.46 28.99254,3.09087 68.65671,2.86054 93.12525,-3.07923 z m -365.96517,-6.98934 c -5.0073,-3.79319 -15.04979,-12.14598 -26.38792,-21.11757 6.87309,9.82709 12.8483,20.9029 25.99019,29.94259 -0.31926,-1.74227 -1.30034,-6.15635 0.39773,-8.82502 z m 174.38151,-1.39223 c 8.72133,-4.41943 14.88236,-9.7945 17.9439,-12.18733 -0.16949,-5.33012 -1.96982,-10.02782 -3.00289,-16.61725 -5.90678,-37.67641 -6.18805,-69.1294 7.50831,-116.04264 2.5688,-8.79876 5.75412,-45.31512 1.84029,-56.21297 -4.15354,-11.56552 -8.69358,-14.90016 -17.33371,-12.7316 -5.78093,1.45094 -5.51517,0.17011 -11.73672,5.14607 1.0504,7.27539 1.10708,15.71047 6.08564,25.05696 12.61234,23.67774 10.04037,24.96125 6.07567,37.49464 -0.80298,2.53841 -1.39124,6.08864 -4.82329,7.33709 -3.15456,1.14751 -1.8964,-5.88138 0.0582,-12.92767 0.60282,-2.17313 2.32281,-7.87334 1.10528,-10.03655 -5.37151,6.5601 -6.42148,9.38748 -15.06036,13.65848 -5.32605,2.63316 -11.99257,1.71174 -0.30128,-5.9013 7.61084,-4.95596 10.77639,-10.24385 10.46707,-14.34625 -0.19426,-2.57633 -3.44437,-6.27437 -5.1785,-10.15885 -2.95007,-6.60823 -5.00615,-11.70751 -6.65592,-18.64964 -3.20086,3.77493 -5.80141,7.7042 -9.13729,13.97818 6.84133,7.31246 20.83987,10.94638 11.58225,12.67671 -3.45945,0.64661 -9.07768,-1.13387 -16.27078,-5.30088 -2.41603,3.72551 -4.24198,6.80353 -6.5319,10.81176 -2.28992,4.00822 -4.12029,6.94889 -5.67048,10.8996 6.96825,5.81107 15.45195,13.68903 26.17377,16.60289 10.72182,2.91386 11.93048,1.81646 22.97428,2.92452 8.08128,5.08204 -1.31616,6.05381 -11.71739,5.63634 -7.72997,-10e-4 -16.68583,-2.45555 -27.3221,-7.48731 l -15.82285,-7.48536 c 0,0 -3.06581,4.00289 -5.03127,7.72575 -1.96547,3.72286 -3.65744,5.08829 -8.51011,14.63572 5.39938,8.24057 21.38867,17.40027 34.0222,21.44203 15.60992,4.99399 29.77899,-0.61753 20.03332,8.24165 -4.77168,3.11205 -23.06532,0.34123 -36.22874,-4.79739 -8.4245,-3.28868 -19.18735,-8.49378 -24.61997,-12.59132 -5.53498,12.6329 -11.68573,26.99993 -12.28004,37.31432 6.18795,5.30367 11.08101,8.82246 19.05566,13.46691 7.97464,4.64445 21.23563,8.43556 38.12535,9.28723 8.06886,0.40688 26.8554,-2.79414 19.3361,6.04739 -2.78905,4.51264 -40.55852,2.69964 -55.15569,-2.64757 -12.63477,-4.62834 -18.39389,-7.79019 -22.54456,-9.32048 0.87979,14.6001 0.83026,23.60031 4.89448,36.52707 6.47504,8.03684 11.89338,12.51719 20.9989,18.3279 9.36449,5.97597 36.47534,8.40209 52.65514,0.20322 z m 71.04877,-46.86676 c 2.01191,-4.81899 3.55163,-8.01603 2.84173,-13.05158 -8.64059,-0.0422 -14.24253,-0.23689 -22.38977,-0.63094 0.0772,2.83697 -1.21774,5.73561 0.71057,12.63131 6.62798,0.13993 10.95098,0.8768 18.83747,1.05121 z m 60.69911,-17.42006 c -16.72593,3.26065 -31.86913,4.08213 -47.43678,5.19683 0,6.69555 0.89777,8.55515 -2.39691,14.13601 15.50399,-0.88119 27.14231,-0.37451 43.43305,-3.92524 4.34288,-2.54075 4.81198,-9.06671 6.40064,-15.4076 z m -222.03564,12.70347 c -0.97306,-3.81428 -0.25243,-6.58413 -1.12863,-9.70076 -8.25005,-1.12617 -21.49922,-3.43658 -33.54337,-8.6327 -0.88242,5.9656 -1.14728,11.10158 -0.75873,13.11902 9.66693,2.79108 23.72921,6.39833 35.43073,5.21444 z m 278.8326,-17.63462 c 0,-7.11998 -0.59369,-10.11696 -1.21216,-16.9789 -16.77359,7.82453 -31.16323,15.51069 -41.44376,18.24206 0,5.08121 1.52729,9.81275 -1.36723,16.17841 15.99663,-4.76599 30.24741,-9.57801 44.02315,-17.44157 z m -320.05512,-3.74728 c -11.74917,-6.64801 -19.20995,-8.74125 -29.3989,-17.90926 -0.896,4.75835 -2.84738,10.8932 -2.41728,16.52949 6.3047,5.34257 17.04699,11.94895 30.08288,14.71307 -0.70178,-6.82655 1.7333,-7.60222 1.7333,-13.3333 z m 231.16785,3.04374 c 32.71147,-1.72578 82.63308,-20.13988 112.14976,-46.77174 13.17222,-11.88483 14.16734,-16.48227 19.19028,-22.58022 -6.72623,-21.95934 -23.10937,-30.88619 -52.47628,-27.09337 -9.09958,10.84233 -11.42188,13.14169 -16.90851,17.78987 -20.06442,16.99825 -48.82085,30.62251 -68.78212,33.08945 -22.75093,2.81168 -32.65783,5.24837 -42.09969,3.98007 -1.17151,4.45359 -1.48486,28.22713 -1.26376,44.07058 10.50162,0.56952 12.36516,-0.48907 50.19032,-2.48464 z M 276.78384,433.68138 c -5.90367,-1.70236 -10.37843,-3.21456 -16.13577,-5.74862 -15.74008,-6.92788 -28.01105,-15.33626 -33.173,-22.50945 -3.16903,-4.40378 -8.3879,-10.85021 -11.14489,-16.58687 -3.93192,0.43165 -10.05094,-1.75702 -17.22847,0.008 -6.31534,1.55334 -16.02671,5.22627 -20.65262,12.28631 -5.25291,8.01696 -2.99984,14.67589 9.95705,29.42833 12.17383,13.86092 39.39341,27.4351 59.05309,34.39284 6.52626,2.3097 9.85362,2.60604 18.12668,4.80988 3.41262,-16.06779 7.58035,-27.1149 11.19793,-36.08081 z m 283.10033,27.17019 c 5.65583,-4.52247 19.05654,-17.6262 23.46248,-26.93841 1.46865,-4.61255 2.31492,-7.43835 2.46148,-13.53036 -8.07785,7.41954 -20.69954,19.4848 -28.24204,23.45757 1.26938,4.85395 2.24311,9.49077 2.31808,17.0112 z M 184.06726,436.45411 c -5.42113,-2.75384 -11.20479,-11.96506 -13.69948,-17.54592 -1.6802,10.28053 -2.84362,14.68142 -1.40535,25.23377 7.60658,5.55895 8.95679,8.0796 13.34246,9.936 z m 111.11253,-33.62532 c 3.68104,-5.90159 6.65065,-12.22571 9.51435,-18.0567 -5.74197,-4.83069 -18.72997,-12.23804 -28.86211,-17.79891 -16.4056,-9.0039 -20.24108,-11.70929 -30.26022,-10.37712 -13.02685,1.73206 -18.94914,10.62343 -18.94914,21.41668 0,16.10626 13.17906,29.86637 38.4375,40.13216 9.06503,3.68432 10.64355,4.38638 16.35224,5.95632 6.22307,-8.82933 9.1123,-13.80922 13.76738,-21.27243 z m 161.6848,5.12952 c 22.63107,-8.51735 49.20882,-22.61083 57.1498,-29.78111 12.96065,-11.70277 10.3598,-33.89411 -1.2579,-33.89411 -6.87273,0 -35.40483,13.00679 -52.90578,22.56803 -26.8587,14.67371 -44.8684,28.7812 -50.74299,49.79679 7.93069,-0.13292 5.46088,0.55312 17.91385,-1.00227 7.75246,-0.96829 21.18181,-4.42758 29.84302,-7.68733 z M 403.62471,290.55367 c 15.61963,-7.12645 32.55171,-23.65944 39.6446,-37.37571 12.67211,-24.50505 17.08482,-40.94985 16.96043,-63.20656 -0.0988,-17.66936 -2.22983,-25.37692 -5.96578,-33.79573 -9.34193,-21.0517 -8.93615,-12.72592 -15.57631,-3.23371 -14.59385,20.86213 -25.17757,13.93615 -36.67009,5.72186 -12.40144,-8.86396 -6.23357,-6.35803 -19.06466,0.05 -10.03859,5.01338 -13.74028,3.70353 -21.34972,-1.0759 -7.60944,-4.77943 -13.66344,-10.00271 -17.2088,-22.09047 -3.85578,-13.14613 -1.7647,-12.74535 -13.09418,-4.84192 -22.98228,27.70184 -38.47232,103.39088 -11.78054,141.46771 17.53828,25.01903 50.94648,33.50906 84.10505,18.38046 z m -22.89229,-9.68061 c -0.21982,-1.04433 1.6154,-9.17646 0.20423,-15.5132 -2.91746,-13.10058 8.70009,-13.55304 9.43196,-2.81046 1.2534,10.76354 -4.37091,22.85472 -9.04883,21.11409 z m -59.56637,-9.07044 c -2.51607,-2.51606 -0.85951,-14.85117 2.02722,-20.245 4.60766,-6.8664 8.89219,-5.26144 5.61435,6.27018 1.88143,9.69023 -0.006,17.33132 -7.64157,13.97482 z M 431.99283,146.54508 c 2.86718,-3.05194 6.92032,-9.6352 9.00707,-14.62943 4.82046,-11.53709 4.95806,-40.928499 0.24435,-52.209975 -6.78957,-16.249808 -23.78528,-17.542624 -33.31908,-5.504293 -5.48703,6.928474 -9.40835,16.546333 -12.07927,10.371084 -1.06188,-2.4551 0.23568,-4.730687 1.46773,-7.857746 6.92011,-17.56393 -1.81554,-22.981026 -11.86101,-23.661753 -6.53281,-0.442693 -12.25518,2.972328 -20.24769,11.040967 -9.70032,9.792702 -17.78524,27.905126 -17.78524,49.330526 0,14.08222 3.45321,21.10568 9.27614,26.51831 5.82293,5.41263 11.49057,9.62395 19.23768,9.61982 7.74711,-0.004 9.08725,-5.01839 17.23334,-6.36358 6.95308,3.23098 9.89267,10.46839 22.51112,11.10913 8.72012,0.44279 12.75849,-3.97736 16.31486,-7.76298 z" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccsscssscsssscsscscssscssssscssscscccsssscscccccsccssccssssscccccccccccccccccccccccsccssscsscccsssccsscsccscccccccsscssccssccsssccssccccccsssscsssscssssccscscsccscscscsccsscsccscccccccccccccccccccccccccccssccssccscssccssscccccccccccccscsssscssssscsscsssssssscsccssccscccccsssssssssccscc" /> + <path + d="m 750.58773,574.76657 0,56.09559 L 382.54724,764.8179 14.50676,630.86216 l 0,-56.61975 368.34752,133.55687 z" + id="path3354-2" + style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <g + transform="translate(0,2.9296876e-6)" + id="g5049-8" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3290-6" + d="m 321.48422,721.5392 -22.36609,12.913 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3292-0" + d="m 75.569784,632.03363 -22.366085,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3294-1" + d="m 305.08992,715.57213 -22.36608,12.91307 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3296-2" + d="m 288.69563,709.6051 -22.36609,12.9131 0,30.0332" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3298-6" + d="m 272.30133,703.63806 -22.36608,12.91304 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3300-0" + d="m 255.90704,697.67102 -22.36609,12.91307 0,30.03331" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3302-5" + d="m 239.51274,691.70399 -22.36608,12.91306 0,30.03325" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3304-4" + d="m 223.11845,685.73695 -22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3306-6" + d="m 206.72415,679.76992 -22.36609,12.91306 0,30.03332" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3308-7" + d="m 190.32985,673.80288 -22.36608,12.91307 0,30.03325" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3310-9" + d="m 173.93556,667.83585 -22.36609,12.91306 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3312-3" + d="m 157.54126,661.86881 -22.36608,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3314-4" + d="m 141.14697,655.90177 -22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3316-7" + d="m 124.75267,649.93474 -22.36608,12.91306 0,30.03329" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3318-8" + d="m 108.35837,643.9677 -22.36608,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3320-8" + d="m 91.96408,638.00067 -22.366085,12.91306 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3322-1" + d="m 443.61027,721.5392 22.36608,12.913 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3324-6" + d="m 476.39886,709.6051 22.36608,12.9131 0,30.0332" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3326-3" + d="m 460.00456,715.57213 22.36609,12.91307 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3328-8" + d="m 525.58175,691.70399 22.36608,12.91306 0,30.03325" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3330-7" + d="m 509.18745,697.67102 22.36609,12.91307 0,30.03331" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3332-6" + d="m 492.79316,703.63806 22.36608,12.91304 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3334-1" + d="m 558.37034,679.76992 22.36608,12.91306 0,30.03332" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3336-7" + d="m 541.97604,685.73695 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3338-2" + d="m 607.55322,661.86881 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3340-3" + d="m 574.76463,673.80288 22.36609,12.91307 0,30.03325" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3342-7" + d="m 591.15893,667.83585 22.36609,12.91306 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3344-8" + d="m 689.5247,632.03363 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3346-5" + d="m 623.94752,655.90177 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3348-8" + d="m 640.34182,649.93474 22.36608,12.91306 0,30.03329" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3350-5" + d="m 656.73611,643.9677 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3352-8" + d="m 673.13041,638.00067 22.36608,12.91306 0,30.03328" /> + </g> + </g> +</svg> diff --git a/logo/vector-logo-2.png b/logo/vector-logo-2.png Binary files differnew file mode 100644 index 0000000000..3ad2383ff5 --- /dev/null +++ b/logo/vector-logo-2.png diff --git a/logo/vector-logo-inkscape_master.svg b/logo/vector-logo-inkscape_master.svg new file mode 100644 index 0000000000..19415d41b7 --- /dev/null +++ b/logo/vector-logo-inkscape_master.svg @@ -0,0 +1,1471 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + width="765.09448" + height="779.328" + id="svg2" + inkscape:version="0.48.4 r9939" + sodipodi:docname="vector-logo-inkscape_master.svg" + inkscape:export-filename="R:\Mark_Sector\!!Projects-2\microPython\Logo\vector-logo-4.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1609" + inkscape:window-height="1086" + id="namedview127" + showgrid="false" + inkscape:zoom="1.1668212" + inkscape:cx="347.36024" + inkscape:cy="357.11268" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="layer6" /> + <defs + id="defs4"> + <linearGradient + id="linearGradient4981"> + <stop + style="stop-color:#370000;stop-opacity:1;" + offset="0" + id="stop4983" /> + <stop + style="stop-color:#616200;stop-opacity:1;" + offset="1" + id="stop4985" /> + </linearGradient> + <linearGradient + id="linearGradient4903"> + <stop + style="stop-color:#c60000;stop-opacity:1;" + offset="0" + id="stop4905" /> + <stop + id="stop4907" + offset="0.04422363" + style="stop-color:#ff0000;stop-opacity:1;" /> + <stop + id="stop4909" + offset="0.36034104" + style="stop-color:#ff8b00;stop-opacity:1;" /> + <stop + style="stop-color:#ffff00;stop-opacity:1;" + offset="1" + id="stop4911" /> + </linearGradient> + <linearGradient + id="linearGradient4873"> + <stop + id="stop4875" + offset="0" + style="stop-color:#c60000;stop-opacity:1;" /> + <stop + style="stop-color:#ff0000;stop-opacity:1;" + offset="0.38491711" + id="stop4877" /> + <stop + style="stop-color:#ff8b00;stop-opacity:1;" + offset="0.77155995" + id="stop4879" /> + <stop + id="stop4881" + offset="1" + style="stop-color:#ffff00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4821"> + <stop + style="stop-color:#c60000;stop-opacity:1;" + offset="0" + id="stop4823" /> + <stop + id="stop4861" + offset="0.38577998" + style="stop-color:#ff0000;stop-opacity:1;" /> + <stop + id="stop4829" + offset="0.77155995" + style="stop-color:#ff8b00;stop-opacity:1;" /> + <stop + style="stop-color:#ffff00;stop-opacity:1;" + offset="1" + id="stop4825" /> + </linearGradient> + <linearGradient + id="linearGradient4809"> + <stop + style="stop-color:#fa8400;stop-opacity:1;" + offset="0" + id="stop4811" /> + <stop + id="stop4817" + offset="0.25452197" + style="stop-color:#fcc100;stop-opacity:1;" /> + <stop + style="stop-color:#ffff00;stop-opacity:1;" + offset="1" + id="stop4813" /> + </linearGradient> + <linearGradient + id="linearGradient4344"> + <stop + style="stop-color:#ef0000;stop-opacity:1;" + offset="0" + id="stop4346" /> + <stop + id="stop4805" + offset="0.45368573" + style="stop-color:#f75401;stop-opacity:1;" /> + <stop + style="stop-color:#fff802;stop-opacity:1;" + offset="1" + id="stop4348" /> + </linearGradient> + <symbol + id="*Paper_Space0" /> + <symbol + id="*Paper_Space" /> + <symbol + id="*Model_Space" /> + <pattern + height="8" + id="Hatch" + patternUnits="userSpaceOnUse" + width="8" + x="0" + y="0"> + <path + d="M8 4 l-4,4" + linecap="square" + stroke="#000000" + stroke-width="0.25" + id="path3049" /> + <path + d="M6 2 l-4,4" + linecap="square" + stroke="#000000" + stroke-width="0.25" + id="path3051" /> + <path + d="M4 0 l-4,4" + linecap="square" + stroke="#000000" + stroke-width="0.25" + id="path3053" /> + </pattern> + <marker + refX="0" + refY="0" + orient="auto" + id="DistanceX" + style="overflow:visible"> + <path + d="M 3,-3 -3,3 M 0,-5 0,5" + id="path3046" + style="stroke:#000000;stroke-width:0.5" /> + </marker> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4873" + id="linearGradient4803" + x1="387.54962" + y1="113.39538" + x2="363.88544" + y2="299.19879" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4809" + id="linearGradient4815" + x1="269.98376" + y1="444.30634" + x2="414.03595" + y2="496.92322" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4821" + id="linearGradient4839" + x1="279.8494" + y1="358.39282" + x2="244.67528" + y2="428.27463" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4821" + id="linearGradient4849" + x1="253.54097" + y1="412.24292" + x2="231.52107" + y2="464.03766" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4821" + id="linearGradient4859" + x1="452.4986" + y1="352.22678" + x2="493.78342" + y2="414.70935" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4873" + id="linearGradient4871" + x1="474.69635" + y1="404.02155" + x2="514.33685" + y2="463.21555" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4873" + id="linearGradient4891" + x1="417.96875" + y1="360.03708" + x2="341.68771" + y2="375.65771" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4903" + id="radialGradient4901" + cx="434.08942" + cy="495.59387" + fx="434.08942" + fy="495.59387" + r="50.650486" + gradientTransform="matrix(1.2124098,-0.04331903,0.00527986,0.14777225,-94.821533,430.98259)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4809" + id="linearGradient4921" + x1="588.93628" + y1="413.79886" + x2="502.7338" + y2="489.19949" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4903" + id="linearGradient4931" + x1="166.69272" + y1="412.81537" + x2="220.14532" + y2="492.14993" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4809" + id="linearGradient4941" + x1="221.63501" + y1="537.67871" + x2="212.0386" + y2="581.11884" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4809" + id="linearGradient4951" + x1="525.33746" + y1="548.20868" + x2="535.51666" + y2="594.10468" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4873" + id="linearGradient4961" + x1="206.68782" + y1="476.74197" + x2="188.67377" + y2="567.22272" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4873" + id="linearGradient4977" + x1="515.50256" + y1="496.73953" + x2="534.86096" + y2="564.27228" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4873" + id="linearGradient4997" + x1="162.10312" + y1="552.79834" + x2="165.07007" + y2="570.50104" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4981" + id="linearGradient5007" + x1="194.88599" + y1="636.06677" + x2="188.0181" + y2="617.05273" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4981" + id="linearGradient5017" + x1="271.59793" + y1="628.52673" + x2="300.13556" + y2="626.55975" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4981" + id="linearGradient5027" + x1="469.60657" + y1="643.60687" + x2="469.95093" + y2="601.64478" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4981" + id="linearGradient5037" + x1="517.4696" + y1="651.47473" + x2="515.84698" + y2="600.98907" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4981" + id="linearGradient5047" + x1="270.94226" + y1="667.21051" + x2="273.90927" + y2="601.64478" + gradientUnits="userSpaceOnUse" /> + </defs> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + id="g3058" + transform="translate(10.5,-283.5375)" /> + <g + inkscape:groupmode="layer" + id="layer6" + inkscape:label="BW art" + style="display:none"> + <path + d="m 454.71085,42.269964 c -1.84306,-4.16383 -8.01725,-8.0321 -10.56009,-8.00789 -2.54283,0.0242 -6.85424,-1.17464 -5.27554,-5.5465 1.5787,-4.37185 7.70455,-4.42682 10.36862,-3.40045 2.66408,1.02637 8.60663,3.31382 10.67443,17.60551 2.0678,14.29168 -3.36437,3.51316 -5.20742,-0.65067 z" + id="path3072-7-6" + style="fill:#000000;fill-opacity:1;stroke:none;display:inline" + inkscape:connector-curvature="0" + sodipodi:nodetypes="zzzzzz" /> + <path + d="m 376.90653,28.503355 c -4.55875,2.209186 -5.68635,-4.51432 -3.82908,-7.783822 1.85727,-3.269502 7.61779,-7.338561 11.18656,-8.748148 3.56877,-1.409587 7.0703,-1.282096 7.84101,0.66902 -0.69594,7.238184 -10.63974,13.653764 -15.19849,15.86295 z" + id="path3070-4-5" + style="fill:#000000;fill-opacity:1;stroke:none;display:inline" + inkscape:connector-curvature="0" + sodipodi:nodetypes="zzzcz" /> + <path + style="fill:#000000;fill-opacity:1;stroke:none;display:inline" + d="m 403.00043,144.27939 c 4.82135,0.33482 12.51176,-7.97481 11.47067,-15.50764 -1.04109,-7.53282 -5.44177,-13.47845 -11.01274,-13.50791 -5.57097,-0.0295 -13.08577,7.35435 -11.63515,14.13061 0.51844,2.59416 1.94883,8.72762 4.71599,5.74451 3.28523,-0.66156 0.59669,-2.45848 2.46895,-6.60993 0.84584,-1.49606 3.82062,-1.93456 5.14537,-0.32025 1.32475,1.61431 1.77634,5.60243 -1.5359,7.25691 -2.05971,0.74048 -3.01527,-1.474 -5.65724,0.71791 -2.64197,2.19191 3.30447,8.07516 6.04005,8.09579 z" + id="path3066-0-0" + inkscape:connector-curvature="0" + sodipodi:nodetypes="czzccczczc" /> + <path + style="fill:#000000;fill-opacity:1;stroke:none;display:inline" + d="m 376.55272,127.26886 c -1.7364,0.68278 -2.36572,4.04539 -0.81525,5.89961 1.43203,1.71258 4.93182,0.31723 5.56335,2.97696 2.88715,2.89045 -3.88391,5.71124 -6.32342,4.6879 -7.56769,-1.97924 -11.14524,-14.48231 -6.5713,-23.62082 6.45515,-8.40383 14.45784,-6.27094 18.5915,0.0414 2.09136,3.25743 3.09899,7.58994 2.16742,11.37571 -0.95226,2.46814 -1.37316,6.89393 -5.31942,7.45248 -0.4445,-1.6504 -3.25454,-1.51236 -1.81483,-3.27307 1.63819,-2.00345 0.66929,-3.60155 -0.11497,-4.90747 -0.99007,-1.64863 -3.62668,-1.31548 -5.36308,-0.6327 z" + id="path3068-9-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="zsccccccssz" /> + <path + id="path4649-0" + style="fill:#000000;display:inline" + d="m 14.658212,571.87891 132.584628,-61.6619 -6.07018,-18.06946 c -2.88978,-8.60218 -1.76874,-23.61644 7.17673,-32.71776 8.94548,-9.10131 11.5393,-10.67252 11.5393,-10.67252 0,0 0.54727,-10.45307 0.54727,-17.46859 0,-17.1284 3.33975,-27.5856 11.93957,-37.38339 5.5019,-6.26838 21.51726,-12.9533 28.20968,-13.83449 4.85197,-0.63886 8.61903,-0.34111 15.53938,1.66667 -0.12917,-4.16054 0.587,-8.90949 2.98755,-13.61296 6.539,-12.81204 13.21525,-17.88639 25.329,-19.25177 8.84468,-0.99693 13.77411,0.35925 28.90302,7.95165 10.03175,5.03446 21.3543,11.19832 24.99504,13.92565 4.01538,3.00798 6.20949,5.2793 10.2812,7.07677 2.41013,-3.60268 6.94338,-10.5171 10.95422,-17.57461 2.33429,-4.10744 10.37611,-17.13568 13.53048,-21.85455 1.57719,-2.35944 6.41985,-8.37195 6.41985,-8.37195 0,0 -1.31142,-8.12758 -0.88067,-12.36731 0.58935,-5.80072 0.97428,-7.57349 4.83184,-12.3627 -3.77939,-2.14565 -3.08319,-1.41947 -7.08681,-3.94365 -20.25239,-12.76862 -34.16873,-27.84627 -40.15509,-56.30446 -5.10584,-24.27216 -4.4007,-41.40703 2.45205,-67.21417 7.7036,-29.01143 15.18952,-45.36816 29.55351,-59.03876 14.92537,-11.0627 12.43198,-2.04001 13.59689,-19.366349 0.91324,-13.583101 11.8782,-40.347468 29.45422,-53.60083 9.58947,-7.231026 21.97858,-3.80485 29.59099,6.499002 10.53054,14.253709 0.17853,14.404082 17.63051,6.752714 20.86592,-9.148123 32.54883,23.523546 33.42248,37.14046 1.05673,16.470373 -1.16843,26.010383 -2.86333,33.904323 4.07154,3.62047 2.58248,1.74759 10.76968,11.51853 8.3892,10.012 12.1486,33.75453 11.34494,62.78361 -0.94573,34.16092 -9.95422,79.26151 -18.82188,96.91198 -7.28684,14.50413 -24.53772,51.74222 -33.64333,81.36391 7.04951,-6.89289 20.03619,-17.09193 31.68777,-23.60977 19.57067,-10.94775 35.86826,-17.6548 52.92838,-23.0765 14.60926,-4.27271 23.92007,0.94007 28.81773,14.86833 l 2.78896,8.35016 14.37056,-0.70574 c 12.36244,-0.6071 16.19906,0.35898 27.45466,6.91325 10.81349,6.29685 14.16725,9.98514 19.32611,21.25359 5.56944,12.16516 6.09614,15.76469 4.8874,33.4003 l -1.35481,19.76574 10.91438,9.60721 c 16.75872,14.75164 25.36378,34.92912 25.42245,59.61145 -0.50196,4.11911 -0.21508,4.42147 -0.93671,9.20235 38.87789,17.76784 115.57654,54.01999 115.57654,54.01999 L 382.42702,706.07474 z m 370.564338,17.77562 c 9.05475,-2.46466 13.58602,-7.58834 18.33472,-10.80361 -10.97449,-12.30208 -18.65245,-25.92708 -26.74569,-45.63149 -4.82799,4.2971 -6.82318,5.90884 -14.22414,10.22159 -13.42149,7.82108 -23.29409,12.77694 -57.4254,4.90126 -6.20655,-1.43214 -10.39595,-5.23376 -17.19163,-10.18726 3.19112,8.85178 13.86295,22.82829 20.52994,29.96884 9.60429,2.44089 16.74117,5.22791 37.62625,4.98794 20.88508,-0.23997 27.9957,-7.12402 28.16531,-6.11681 1.46865,8.72131 -10.15732,15.08153 -17.76404,15.8875 -28.685,3.03932 -35.00933,-2.21337 -14.62245,8.09979 5.86099,2.96492 34.26238,1.13691 43.31713,-1.32775 z m -80.78275,-2.78657 c -0.89959,-3.50631 -9.45553,-13.31314 -16.50253,-22.41247 -12.72217,0.86257 -31.67329,-0.15844 -50.36917,-1.39061 1.28995,5.05783 2.66671,9.35459 8.01513,16.24454 21.31675,7.41613 29.38807,8.69456 58.85657,7.55854 z m 196.55253,-1.05658 c 7.48368,-7.7352 12.59399,-14.06394 14.48282,-24.0163 -9.86035,0.32816 -31.29112,-0.21889 -43.67612,-1.59123 -2.69192,9.78937 -7.53001,16.5494 -12.60926,27.22235 15.18807,0.0987 34.6126,-0.34167 41.80256,-1.61482 z m -39.5462,-25.77116 c -14.22026,-1.04341 -24.64197,-1.70322 -34.91073,-5.06032 1.48042,5.45477 11.46978,23.84715 21.5113,29.43516 8.27915,-6.74863 11.17085,-18.04429 13.39943,-24.37484 z m 89.8385,17.75618 c 11.06658,-12.35693 10.92734,-17.54469 12.64857,-22.88767 -11.30062,3.12506 -19.72285,3.93232 -32.57321,6.37359 -1.89748,6.90764 -8.91109,16.08982 -13.29931,23.08728 10.8857,-1.22697 19.80754,-2.14697 33.22395,-6.5732 z m -317.64736,-1.93287 c -3.6673,-5.08173 -5.86306,-11.13515 -7.03993,-15.06225 -9.55859,-2.04306 -25.015,-11.46938 -36.15974,-15.65039 -0.84013,3.61202 0.47555,6.43514 1.89431,9.82309 3.08034,2.34947 5.43298,4.84837 12.48233,8.01965 11.52918,5.18662 18.20624,9.12314 28.82303,12.8699 z m 186.64301,-6.91909 c 0,-1.28295 -3.83994,-11.06621 -8.53319,-21.74059 -12.64973,-28.77081 -15.90521,-45.89651 -15.92698,-83.78673 -0.0252,-43.63944 7.06295,-74.30199 28.38761,-122.803 12.2828,-27.93634 24.14205,-48.33846 31.75211,-88.421 -6.5755,13.7585 -12.42832,19.89196 -19.64511,27.05989 -21.77232,21.62492 -35.43644,26.31219 -52.19205,28.77556 -10.17306,1.49562 -14.72264,2.13603 -24.70943,1.96892 -2.20297,3.58807 -4.85267,2.59811 -6.46175,8.54423 7.20281,-3.74693 18.38353,-7.60728 30.32987,-0.36061 13.17431,13.17431 13.24085,43.09586 0.21129,95.05167 -9.8248,39.17692 -10.19364,71.64538 -1.16772,102.79178 6.95963,24.01643 12.71354,36.38943 22.12232,47.57108 6.06993,7.21372 15.83313,10.51196 15.83313,5.3488 z m 171.97615,-4.87721 c 13.62786,-7.80295 31.09463,-25.81562 31.4869,-37.0782 l 0.58746,-16.86667 c 0,0 -3.33814,8.50328 -11.45734,16.98325 -8.1192,8.47997 -26.38286,19.25438 -30.88292,21.72921 -0.59939,9.46563 -4.06332,14.42941 -11.30069,24.85736 9.79893,-3.37732 9.75496,-2.86192 21.56659,-9.62495 z m -399.08628,2.32889 c -9.51845,-4.1386 -13.88481,-11.58962 -21.31996,-16.28929 -24.47145,0 -34.7761,15.07859 -41.53164,27.12964 17.4467,-7.24642 26.52906,-13.51756 62.8516,-10.84035 z m 89.61415,-12.03996 c -2.96659,-6.9594 -8.5975,-16.20369 -10.65302,-24.42661 -3.32741,-13.53845 -4.3118,-22.83307 -5.06108,-33.41904 l -18.6361,-1.69054 c -31.57594,-2.86434 -59.06629,-14.64122 -75.55586,-32.36812 -3.26858,-3.51386 -5.96093,-5.2139 -9.24658,-6.38882 -8.83027,1.85899 -18.19769,18.97121 -17.02277,27.01586 1.72967,11.84307 9.77201,29.61721 24.56626,41.34153 29.28013,23.2043 51.68723,28.03568 82.41647,30.05478 2.27989,0.18213 20.99745,0.37832 29.19268,-0.11904 z m 264.96688,-7.59969 c 33.17591,-8.05353 46.3337,-14.29038 61.72491,-29.25789 11.72243,-11.39971 11.62368,-12.00816 13.38605,-19.93479 -1.76237,-24.37548 -10.99587,-32.58734 -21.33375,-43.1616 -7.10687,5.87459 -13.24631,10.18619 -26.84018,17.60995 -31.82211,17.37834 -38.09788,19.98117 -66.15889,27.43875 -24.8411,6.60186 -60.30618,8.65945 -85.18479,4.94212 -7.56759,-1.13074 -9.34913,-1.85205 -13.95251,-3.79109 0.68374,8.63522 7.02657,30.89277 10.82601,41.77378 5.85555,2.06914 18.69644,5.78501 34.4079,7.46 28.99254,3.09087 68.65671,2.86054 93.12525,-3.07923 z m -365.96517,-6.98934 c -5.0073,-3.79319 -15.04979,-12.14598 -26.38792,-21.11757 6.87309,9.82709 12.8483,20.9029 25.99019,29.94259 -0.31926,-1.74227 -1.30034,-6.15635 0.39773,-8.82502 z m 174.38151,-1.39223 c 8.72133,-4.41943 14.88236,-9.7945 17.9439,-12.18733 -0.16949,-5.33012 -1.96982,-10.02782 -3.00289,-16.61725 -5.90678,-37.67641 -6.18805,-69.1294 7.50831,-116.04264 2.5688,-8.79876 5.75412,-45.31512 1.84029,-56.21297 -4.15354,-11.56552 -8.69358,-14.90016 -17.33371,-12.7316 -5.78093,1.45094 -5.51517,0.17011 -11.73672,5.14607 1.0504,7.27539 1.10708,15.71047 6.08564,25.05696 12.61234,23.67774 10.04037,24.96125 6.07567,37.49464 -0.80298,2.53841 -1.39124,6.08864 -4.82329,7.33709 -3.15456,1.14751 -1.8964,-5.88138 0.0582,-12.92767 0.60282,-2.17313 2.32281,-7.87334 1.10528,-10.03655 -5.37151,6.5601 -6.42148,9.38748 -15.06036,13.65848 -5.32605,2.63316 -11.99257,1.71174 -0.30128,-5.9013 7.61084,-4.95596 10.77639,-10.24385 10.46707,-14.34625 -0.19426,-2.57633 -3.44437,-6.27437 -5.1785,-10.15885 -2.95007,-6.60823 -5.00615,-11.70751 -6.65592,-18.64964 -3.20086,3.77493 -5.80141,7.7042 -9.13729,13.97818 6.84133,7.31246 20.83987,10.94638 11.58225,12.67671 -3.45945,0.64661 -9.07768,-1.13387 -16.27078,-5.30088 -2.41603,3.72551 -4.24198,6.80353 -6.5319,10.81176 -2.28992,4.00822 -4.12029,6.94889 -5.67048,10.8996 6.96825,5.81107 15.45195,13.68903 26.17377,16.60289 10.72182,2.91386 11.93048,1.81646 22.97428,2.92452 8.08128,5.08204 -1.31616,6.05381 -11.71739,5.63634 -7.72997,-10e-4 -16.68583,-2.45555 -27.3221,-7.48731 l -15.82285,-7.48536 c 0,0 -3.06581,4.00289 -5.03127,7.72575 -1.96547,3.72286 -3.65744,5.08829 -8.51011,14.63572 5.39938,8.24057 21.38867,17.40027 34.0222,21.44203 15.60992,4.99399 29.77899,-0.61753 20.03332,8.24165 -4.77168,3.11205 -23.06532,0.34123 -36.22874,-4.79739 -8.4245,-3.28868 -19.18735,-8.49378 -24.61997,-12.59132 -5.53498,12.6329 -11.68573,26.99993 -12.28004,37.31432 6.18795,5.30367 11.08101,8.82246 19.05566,13.46691 7.97464,4.64445 21.23563,8.43556 38.12535,9.28723 8.06886,0.40688 26.8554,-2.79414 19.3361,6.04739 -2.78905,4.51264 -40.55852,2.69964 -55.15569,-2.64757 -12.63477,-4.62834 -18.39389,-7.79019 -22.54456,-9.32048 0.87979,14.6001 0.83026,23.60031 4.89448,36.52707 6.47504,8.03684 11.89338,12.51719 20.9989,18.3279 9.36449,5.97597 36.47534,8.40209 52.65514,0.20322 z m 71.04877,-46.86676 c 2.01191,-4.81899 3.55163,-8.01603 2.84173,-13.05158 -8.64059,-0.0422 -14.24253,-0.23689 -22.38977,-0.63094 0.0772,2.83697 -1.21774,5.73561 0.71057,12.63131 6.62798,0.13993 10.95098,0.8768 18.83747,1.05121 z m 60.69911,-17.42006 c -16.72593,3.26065 -31.86913,4.08213 -47.43678,5.19683 0,6.69555 0.89777,8.55515 -2.39691,14.13601 15.50399,-0.88119 27.14231,-0.37451 43.43305,-3.92524 4.34288,-2.54075 4.81198,-9.06671 6.40064,-15.4076 z m -222.03564,12.70347 c -0.97306,-3.81428 -0.25243,-6.58413 -1.12863,-9.70076 -8.25005,-1.12617 -21.49922,-3.43658 -33.54337,-8.6327 -0.88242,5.9656 -1.14728,11.10158 -0.75873,13.11902 9.66693,2.79108 23.72921,6.39833 35.43073,5.21444 z m 278.8326,-17.63462 c 0,-7.11998 -0.59369,-10.11696 -1.21216,-16.9789 -16.77359,7.82453 -31.16323,15.51069 -41.44376,18.24206 0,5.08121 1.52729,9.81275 -1.36723,16.17841 15.99663,-4.76599 30.24741,-9.57801 44.02315,-17.44157 z m -320.05512,-3.74728 c -11.74917,-6.64801 -19.20995,-8.74125 -29.3989,-17.90926 -0.896,4.75835 -2.84738,10.8932 -2.41728,16.52949 6.3047,5.34257 17.04699,11.94895 30.08288,14.71307 -0.70178,-6.82655 1.7333,-7.60222 1.7333,-13.3333 z m 231.16785,3.04374 c 32.71147,-1.72578 82.63308,-20.13988 112.14976,-46.77174 13.17222,-11.88483 14.16734,-16.48227 19.19028,-22.58022 -6.72623,-21.95934 -23.10937,-30.88619 -52.47628,-27.09337 -9.09958,10.84233 -11.42188,13.14169 -16.90851,17.78987 -20.06442,16.99825 -48.82085,30.62251 -68.78212,33.08945 -22.75093,2.81168 -32.65783,5.24837 -42.09969,3.98007 -1.17151,4.45359 -1.48486,28.22713 -1.26376,44.07058 10.50162,0.56952 12.36516,-0.48907 50.19032,-2.48464 z M 276.78384,433.68138 c -5.90367,-1.70236 -10.37843,-3.21456 -16.13577,-5.74862 -15.74008,-6.92788 -28.01105,-15.33626 -33.173,-22.50945 -3.16903,-4.40378 -8.3879,-10.85021 -11.14489,-16.58687 -3.93192,0.43165 -10.05094,-1.75702 -17.22847,0.008 -6.31534,1.55334 -16.02671,5.22627 -20.65262,12.28631 -5.25291,8.01696 -2.99984,14.67589 9.95705,29.42833 12.17383,13.86092 39.39341,27.4351 59.05309,34.39284 6.52626,2.3097 9.85362,2.60604 18.12668,4.80988 3.41262,-16.06779 7.58035,-27.1149 11.19793,-36.08081 z m 283.10033,27.17019 c 5.65583,-4.52247 19.05654,-17.6262 23.46248,-26.93841 1.46865,-4.61255 2.31492,-7.43835 2.46148,-13.53036 -8.07785,7.41954 -20.69954,19.4848 -28.24204,23.45757 1.26938,4.85395 2.24311,9.49077 2.31808,17.0112 z M 184.06726,436.45411 c -5.42113,-2.75384 -11.20479,-11.96506 -13.69948,-17.54592 -1.6802,10.28053 -2.84362,14.68142 -1.40535,25.23377 7.60658,5.55895 8.95679,8.0796 13.34246,9.936 z m 111.11253,-33.62532 c 3.68104,-5.90159 6.65065,-12.22571 9.51435,-18.0567 -5.74197,-4.83069 -18.72997,-12.23804 -28.86211,-17.79891 -16.4056,-9.0039 -20.24108,-11.70929 -30.26022,-10.37712 -13.02685,1.73206 -18.94914,10.62343 -18.94914,21.41668 0,16.10626 13.17906,29.86637 38.4375,40.13216 9.06503,3.68432 10.64355,4.38638 16.35224,5.95632 6.22307,-8.82933 9.1123,-13.80922 13.76738,-21.27243 z m 161.6848,5.12952 c 22.63107,-8.51735 49.20882,-22.61083 57.1498,-29.78111 12.96065,-11.70277 10.3598,-33.89411 -1.2579,-33.89411 -6.87273,0 -35.40483,13.00679 -52.90578,22.56803 -26.8587,14.67371 -44.8684,28.7812 -50.74299,49.79679 7.93069,-0.13292 5.46088,0.55312 17.91385,-1.00227 7.75246,-0.96829 21.18181,-4.42758 29.84302,-7.68733 z M 403.62471,290.55367 c 15.61963,-7.12645 32.55171,-23.65944 39.6446,-37.37571 12.67211,-24.50505 17.08482,-40.94985 16.96043,-63.20656 -0.0988,-17.66936 -2.22983,-25.37692 -5.96578,-33.79573 -9.34193,-21.0517 -8.93615,-12.72592 -15.57631,-3.23371 -14.59385,20.86213 -25.17757,13.93615 -36.67009,5.72186 -12.40144,-8.86396 -6.23357,-6.35803 -19.06466,0.05 -10.03859,5.01338 -13.74028,3.70353 -21.34972,-1.0759 -7.60944,-4.77943 -13.66344,-10.00271 -17.2088,-22.09047 -3.85578,-13.14613 -1.7647,-12.74535 -13.09418,-4.84192 -22.98228,27.70184 -38.47232,103.39088 -11.78054,141.46771 17.53828,25.01903 50.94648,33.50906 84.10505,18.38046 z m -22.89229,-9.68061 c -0.21982,-1.04433 1.6154,-9.17646 0.20423,-15.5132 -2.91746,-13.10058 8.70009,-13.55304 9.43196,-2.81046 1.2534,10.76354 -4.37091,22.85472 -9.04883,21.11409 z m -59.56637,-9.07044 c -2.51607,-2.51606 -0.85951,-14.85117 2.02722,-20.245 4.60766,-6.8664 8.89219,-5.26144 5.61435,6.27018 1.88143,9.69023 -0.006,17.33132 -7.64157,13.97482 z M 431.99283,146.54508 c 2.86718,-3.05194 6.92032,-9.6352 9.00707,-14.62943 4.82046,-11.53709 4.95806,-40.928496 0.24435,-52.209972 -6.78957,-16.249808 -23.78528,-17.542624 -33.31908,-5.504293 -5.48703,6.928474 -9.40835,16.546333 -12.07927,10.371084 -1.06188,-2.4551 0.23568,-4.730687 1.46773,-7.857746 6.92011,-17.56393 -1.81554,-22.981026 -11.86101,-23.661753 -6.53281,-0.442693 -12.25518,2.972328 -20.24769,11.040967 -9.70032,9.792702 -17.78524,27.905126 -17.78524,49.330523 0,14.08222 3.45321,21.10568 9.27614,26.51831 5.82293,5.41263 11.49057,9.62395 19.23768,9.61982 7.74711,-0.004 9.08725,-5.01839 17.23334,-6.36358 6.95308,3.23098 9.89267,10.46839 22.51112,11.10913 8.72012,0.44279 12.75849,-3.97736 16.31486,-7.76298 z" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccsscssscsssscsscscssscssssscssscscccsssscscccccsccssccssssscccccccccccccccccccccccsccssscsscccsssccsscsccscccccccsscssccssccsssccssccccccsssscsssscssssccscscsccscscscsccsscsccscccccccccccccccccccccccccccssccssccscssccssscccccccccccccscsssscssssscsscsssssssscsccssccscccccsssssssssccscc" /> + <path + d="m 750.58773,574.76657 0,56.09559 L 382.54724,764.8179 14.50676,630.86216 l 0,-56.61975 368.34752,133.55687 z" + id="path3354-2" + style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <g + transform="translate(0,5.93005e-6)" + id="g5049-8" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3290-6" + d="m 321.48422,721.5392 -22.36609,12.913 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3292-0" + d="m 75.569784,632.03363 -22.366085,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3294-1-0" + d="m 305.08992,715.57213 -22.36608,12.91307 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3296-2" + d="m 288.69563,709.6051 -22.36609,12.9131 0,30.0332" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3298-6-6" + d="m 272.30133,703.63806 -22.36608,12.91304 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3300-0-1" + d="m 255.90704,697.67102 -22.36609,12.91307 0,30.03331" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3302-5" + d="m 239.51274,691.70399 -22.36608,12.91306 0,30.03325" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3304-4-3" + d="m 223.11845,685.73695 -22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3306-6" + d="m 206.72415,679.76992 -22.36609,12.91306 0,30.03332" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3308-7" + d="m 190.32985,673.80288 -22.36608,12.91307 0,30.03325" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3310-9" + d="m 173.93556,667.83585 -22.36609,12.91306 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3312-3" + d="m 157.54126,661.86881 -22.36608,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3314-4" + d="m 141.14697,655.90177 -22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3316-7" + d="m 124.75267,649.93474 -22.36608,12.91306 0,30.03329" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3318-8" + d="m 108.35837,643.9677 -22.36608,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3320-8" + d="m 91.96408,638.00067 -22.366085,12.91306 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3322-1" + d="m 443.61027,721.5392 22.36608,12.913 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3324-6" + d="m 476.39886,709.6051 22.36608,12.9131 0,30.0332" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3326-3" + d="m 460.00456,715.57213 22.36609,12.91307 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3328-8" + d="m 525.58175,691.70399 22.36608,12.91306 0,30.03325" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3330-7" + d="m 509.18745,697.67102 22.36609,12.91307 0,30.03331" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3332-6" + d="m 492.79316,703.63806 22.36608,12.91304 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3334-1-8" + d="m 558.37034,679.76992 22.36608,12.91306 0,30.03332" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3336-7" + d="m 541.97604,685.73695 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3338-2" + d="m 607.55322,661.86881 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3340-3" + d="m 574.76463,673.80288 22.36609,12.91307 0,30.03325" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3342-7" + d="m 591.15893,667.83585 22.36609,12.91306 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3344-8" + d="m 689.5247,632.03363 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3346-5-9" + d="m 623.94752,655.90177 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3348-8" + d="m 640.34182,649.93474 22.36608,12.91306 0,30.03329" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3350-5" + d="m 656.73611,643.9677 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3352-8" + d="m 673.13041,638.00067 22.36608,12.91306 0,30.03328" /> + </g> + </g> + <g + inkscape:groupmode="layer" + id="layer4" + inkscape:label="color fill" + style="display:inline"> + <path + style="fill:url(#linearGradient4839);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 222.79968,387.16768 0.82214,-22.19775 15.62064,-11.50995 23.01989,0.82214 46.86193,27.95273 -27.13059,48.5062 -38.64053,-19.73134 z" + id="path4831" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient4803);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 305.01358,171.76725 18.9092,-41.92909 18.9092,-13.15423 4.1107,18.08706 22.19775,20.55348 11.50995,-3.28856 12.33208,-5.75497 24.66417,13.97636 18.08706,-11.50994 11.50995,-12.33209 17.26492,26.30845 -0.82214,72.34824 -42.75123,51.79476 -30.41914,13.97636 -36.99626,1.64428 -38.64054,-26.30845 -16.44278,-54.26118 z" + id="path4795" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient4815);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 277.06086,443.07313 62.48256,-106.87807 14.79851,-17.26492 26.30845,1.64428 9.86567,28.77486 -19.73134,129.89797 10.68781,54.26118 31.24128,47.68406 -36.99626,18.08706 -54.26117,-0.82214 -38.64054,-52.61689 -12.33208,-50.15049 z" + id="path4807" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccc" /> + <path + style="fill:url(#linearGradient4849);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 269.66161,473.49228 -54.26118,-15.62064 -39.46267,-34.52984 -5.75498,-21.37562 29.59701,-19.73133 23.01989,4.11069 18.9092,25.48631 41.10695,19.73134 z" + id="path4841" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient4859);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 403.67027,419.2311 8.22139,-28.77486 86.3246,-46.86193 23.84203,-2.46642 8.22139,26.30845 -40.28481,36.99626 -36.99626,13.15422 z" + id="path4851" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient4871);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 399.55957,475.13656 2.46642,-54.26118 62.48257,-4.93283 60.01615,-39.46268 8.22139,-12.33208 46.03979,7.39925 17.26492,35.35198 -53.43904,41.92909 -73.99252,23.84203 z" + id="path4863" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient4891);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 342.83198,320.57442 12.33209,-18.08706 52.6169,-7.39925 35.35197,-32.06343 20.55348,-27.13058 -26.30845,90.43529 -32.88556,77.28107 -2.46642,94.54599 27.95273,86.3246 -33.7077,-22.19775 -24.66417,-61.66043 3.28855,-73.99252 15.62065,-69.88182 -10.68781,-37.81839 z" + id="path4883" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#radialGradient4901);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 399.55957,475.9587 73.17038,-4.93284 27.13059,-6.57711 -9.86567,30.41914 -89.61316,1.64428 z" + id="path4893" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient4921);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 492.39893,467.8906 60.97616,-26.22631 36.71683,-32.78288 -3.27829,37.37249 -40.65077,32.12722 -54.41959,19.01408 z" + id="path4913" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient4931);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 165.8814,410.84838 40.65077,39.33946 39.33946,18.35842 26.88197,6.55657 -0.65566,19.66974 -77.36761,-20.98105 -30.16025,-26.22631 z" + id="path4923" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient4941);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 289.8007,558.37136 24.25933,31.47157 -70.15537,2.62263 -95.72602,-62.94314 3.93394,-19.66973 39.33947,31.47157 43.2734,17.70276 z" + id="path4933" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient4951);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 418.30961,549.19215 106.21654,8.52355 68.84406,-19.01407 35.40552,-36.06117 1.31131,43.92906 -67.53274,41.96209 -118.67404,6.55658 z" + id="path4943" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient4961);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 271.44228,491.49428 17.70276,66.22142 -69.49971,-3.27829 -41.30644,-20.32538 -29.50459,-30.16026 -7.21224,-26.2263 22.94802,-30.81592 30.81591,28.19328 49.17433,13.76882 z" + id="path4953" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient4977);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 401.91816,495.42822 97.03734,2.62263 101.62694,-51.1413 27.53763,32.12723 0,26.22631 -47.86301,41.30643 -95.72603,10.49053 -67.53274,-9.17921 z" + id="path4969" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient4997);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 117.36273,585.90898 30.16025,-39.99512 24.25934,0.65566 31.47156,24.25934 z" + id="path4989" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient5007);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 172.43797,625.9041 39.99512,-6.55657 -19.01407,17.70275 z" + id="path4999" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient5017);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 261.60742,627.21542 34.74986,-5.24526 -5.24527,14.42447 z" + id="path5009" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient5027);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 385.52672,650.16344 17.0471,-31.47157 24.25934,-11.80184 1.96697,27.53762 39.33946,-9.1792 72.12235,9.1792 -17.0471,9.17921 z" + id="path5019" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient5037);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 424.21053,631.80502 66.87708,-6.55657 96.38168,4.5896 24.25934,-19.66973 -116.05142,-15.08013 -58.35353,6.55658 z" + id="path5029" + inkscape:connector-curvature="0" /> + <path + style="fill:url(#linearGradient5047);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 197.35296,637.05028 26.22631,-36.06117 193.41902,1.96697 -36.06117,45.24038 -89.82511,-9.83486 7.21224,-15.08013 -43.27341,3.93395 z" + id="path5039" + inkscape:connector-curvature="0" /> + </g> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="snake and chip" + style="display:inline"> + <path + d="m 454.71085,42.269961 c -1.84306,-4.16383 -8.01725,-8.0321 -10.56009,-8.00789 -2.54283,0.0242 -6.85424,-1.17464 -5.27554,-5.5465 1.5787,-4.37185 7.70455,-4.42682 10.36862,-3.40045 2.66408,1.02637 8.60663,3.31382 10.67443,17.60551 2.0678,14.29168 -3.36437,3.51316 -5.20742,-0.65067 z" + id="path3072-7" + style="fill:#000000;fill-opacity:1;stroke:none;display:inline" + inkscape:connector-curvature="0" + sodipodi:nodetypes="zzzzzz" /> + <path + d="m 376.90653,28.503352 c -4.55875,2.209186 -5.68635,-4.51432 -3.82908,-7.783822 1.85727,-3.269502 7.61779,-7.338561 11.18656,-8.748148 3.56877,-1.409587 7.0703,-1.282096 7.84101,0.66902 -0.69594,7.238184 -10.63974,13.653764 -15.19849,15.86295 z" + id="path3070-4" + style="fill:#000000;fill-opacity:1;stroke:none;display:inline" + inkscape:connector-curvature="0" + sodipodi:nodetypes="zzzcz" /> + <path + style="fill:#000000;fill-opacity:1;stroke:none;display:inline" + d="m 403.00043,144.27939 c 4.82135,0.33482 12.51176,-7.97481 11.47067,-15.50764 -1.04109,-7.53282 -5.44177,-13.47845 -11.01274,-13.50791 -5.57097,-0.0295 -13.08577,7.35435 -11.63515,14.13061 0.51844,2.59416 1.94883,8.72762 4.71599,5.74451 3.28523,-0.66156 0.59669,-2.45848 2.46895,-6.60993 0.84584,-1.49606 3.82062,-1.93456 5.14537,-0.32025 1.32475,1.61431 1.77634,5.60243 -1.5359,7.25691 -2.05971,0.74048 -3.01527,-1.474 -5.65724,0.71791 -2.64197,2.19191 3.30447,8.07516 6.04005,8.09579 z" + id="path3066-0" + inkscape:connector-curvature="0" + sodipodi:nodetypes="czzccczczc" /> + <path + style="fill:#000000;fill-opacity:1;stroke:none;display:inline" + d="m 376.55272,127.26886 c -1.7364,0.68278 -2.36572,4.04539 -0.81525,5.89961 1.43203,1.71258 4.93182,0.31723 5.56335,2.97696 2.88715,2.89045 -3.88391,5.71124 -6.32342,4.6879 -7.56769,-1.97924 -11.14524,-14.48231 -6.5713,-23.62082 6.45515,-8.40383 14.45784,-6.27094 18.5915,0.0414 2.09136,3.25743 3.09899,7.58994 2.16742,11.37571 -0.95226,2.46814 -1.37316,6.89393 -5.31942,7.45248 -0.4445,-1.6504 -3.25454,-1.51236 -1.81483,-3.27307 1.63819,-2.00345 0.66929,-3.60155 -0.11497,-4.90747 -0.99007,-1.64863 -3.62668,-1.31548 -5.36308,-0.6327 z" + id="path3068-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="zsccccccssz" /> + <path + id="path4649" + style="fill:#000000;display:inline" + d="m 194.01136,631.57786 c 0,0 6.14317,-2.85153 10.0835,-8.26108 -6.37148,3.00141 -11.34115,5.4807 -23.17647,5.11326 8.42472,2.40125 13.09297,3.14782 13.09297,3.14782 z m 405.59181,-15.63369 -30.84807,-3.42261 8.24142,11.85178 z m -88.65927,4.80256 c -1.61076,-8.86957 -3.36449,-11.9843 -5.71636,-16.0913 -8.31238,-0.40738 -31.3356,-0.96193 -42.25313,0.57072 4.49758,4.41013 5.55193,10.56268 10.74722,16.77444 10.12811,-1.1875 28.96735,-1.83889 37.22227,-1.25386 z m -212.77128,-0.54172 c 2.58463,-3.22962 2.71765,-5.62041 9.38149,-11.09101 -14.9173,-5.88167 -38.94241,-3.29507 -51.90193,-2.16322 -4.94367,6.06469 -9.79427,14.48095 -13.53016,19.90496 14.14563,-4.23611 47.50546,-7.94287 56.0506,-6.65073 z m 263.54725,4.74708 c -2.50343,-4.93841 -8.9331,-12.76544 -15.75938,-16.17998 -6.82629,-3.41454 -17.36789,-3.7813 -28.48361,-4.12615 4.29939,4.79352 6.60458,9.46544 7.45227,17.42873 9.06908,0.56403 26.51398,0.0318 36.79072,2.8774 z m -104.04426,-4.01256 c 1.22419,-6.42487 -3.26083,-14.48017 -10.23446,-16.32998 -7.59023,5.13837 -12.15387,14.5548 -17.48427,21.58721 6.59062,-1.8056 17.86208,-3.76519 27.71873,-5.25723 z m -225.80894,5.2974 c 1.01602,-4.74132 6.96531,-11.07292 11.31671,-18.12675 -13.77073,3.82355 -28.195,13.29102 -35.91963,21.14497 8.42472,-1.70944 24.60292,-1.424 24.60292,-3.01822 z m 58.86081,-0.5186 c -3.08302,-0.75612 -15.68236,0.98297 -18.79524,2.21618 9.45431,-0.0296 13.68842,0.45636 17.05647,4.11575 1.52517,-1.69146 1.9443,-3.72599 1.73877,-6.33193 z m 207.93641,11.42226 31.39282,-0.70758 -35.4871,-4.7828 c -12.68914,-1.71019 -27.39053,-1.48732 -37.89843,0.34168 l -32.62505,8.82412 34.04737,-3.33375 c 10.64901,-1.0427 30.50662,-0.11483 40.57039,-0.34167 z m -89.94855,4.39167 c 2.71291,-5.69933 6.39798,-12.93476 10.20267,-19.94891 2.556,-3.08493 2.8267,-5.06 0.9506,-6.93603 -4.60074,-1.10669 -7.09894,0.57308 -15.62312,10.55326 -6.34523,7.42905 -8.02332,12.52196 -10.59246,17.95542 4.41904,-1.76025 9.26638,-1.47385 15.06231,-1.62374 z m -15.88883,-16.85169 14.74639,-16.40602 -24.26522,0.20554 c -13.91391,0.11785 -6.09345,3.51192 -1.66333,8.84485 -4.40787,-0.62759 -5.01081,0.89015 -11.12131,-2.38009 -6.2287,-3.33346 -35.91772,-2.5726 -49.67832,-0.92014 -8.00562,5.14654 -16.84561,11.90818 -20.80111,18.56469 6.1157,0.90153 10.6696,0.62198 23.7101,0.0642 19.159,-0.81961 26.2774,-0.10457 37.085,3.72586 7.3562,2.60709 20.16937,4.46047 22.19357,4.62099 4.90705,-9.47753 5.16451,-9.19423 9.79423,-16.31988 z M 14.658212,571.87891 147.24284,510.21701 141.17266,492.14755 c -2.88978,-8.60218 -1.76874,-23.61644 7.17673,-32.71776 8.94548,-9.10131 11.5393,-10.67252 11.5393,-10.67252 0,0 0.54727,-10.45307 0.54727,-17.46859 0,-17.1284 3.33975,-27.5856 11.93957,-37.38339 5.5019,-6.26838 21.51726,-12.9533 28.20968,-13.83449 4.85197,-0.63886 8.61903,-0.34111 15.53938,1.66667 -0.12917,-4.16054 0.587,-8.90949 2.98755,-13.61296 6.539,-12.81204 13.21525,-17.88639 25.329,-19.25177 8.84468,-0.99693 13.77411,0.35925 28.90302,7.95165 10.03175,5.03446 21.3543,11.19832 24.99504,13.92565 4.01538,3.00798 6.20949,5.2793 10.2812,7.07677 2.41013,-3.60268 6.94338,-10.5171 10.95422,-17.57461 2.33429,-4.10744 10.37611,-17.13568 13.53048,-21.85455 1.57719,-2.35944 6.41985,-8.37195 6.41985,-8.37195 0,0 -1.31142,-8.12758 -0.88067,-12.36731 0.58935,-5.80072 0.97428,-7.57349 4.83184,-12.3627 -3.77939,-2.14565 -3.08319,-1.41947 -7.08681,-3.94365 -20.25239,-12.76862 -34.16873,-27.84627 -40.15509,-56.30446 -5.10584,-24.27216 -4.4007,-41.40703 2.45205,-67.21417 7.7036,-29.01143 15.18952,-45.36816 29.55351,-59.03876 14.92537,-11.0627 12.43198,-2.04001 13.59689,-19.366352 0.91324,-13.583101 11.8782,-40.347468 29.45422,-53.60083 9.58947,-7.231026 21.97858,-3.80485 29.59099,6.499002 10.53054,14.253709 0.17853,14.404082 17.63051,6.752714 20.86592,-9.148123 32.54883,23.523546 33.42248,37.14046 1.05673,16.470376 -1.16843,26.010386 -2.86333,33.904326 4.07154,3.62047 2.58248,1.74759 10.76968,11.51853 8.3892,10.012 12.1486,33.75453 11.34494,62.78361 -0.94573,34.16092 -9.95422,79.26151 -18.82188,96.91198 -7.28684,14.50413 -24.53772,51.74222 -33.64333,81.36391 7.04951,-6.89289 20.03619,-17.09193 31.68777,-23.60977 19.57067,-10.94775 35.86826,-17.6548 52.92838,-23.0765 14.60926,-4.27271 23.92007,0.94007 28.81773,14.86833 l 2.78896,8.35016 14.37056,-0.70574 c 12.36244,-0.6071 16.19906,0.35898 27.45466,6.91325 10.81349,6.29685 14.16725,9.98514 19.32611,21.25359 5.56944,12.16516 6.09614,15.76469 4.8874,33.4003 l -1.35481,19.76574 10.91438,9.60721 c 16.75872,14.75164 25.36378,34.92912 25.42245,59.61145 -0.50196,4.11911 -0.21508,4.42147 -0.93671,9.20235 38.87789,17.76784 115.57654,54.01999 115.57654,54.01999 L 382.42702,706.07474 z m 370.564338,17.77562 c 9.05475,-2.46466 13.58602,-7.58834 18.33472,-10.80361 -10.97449,-12.30208 -18.65245,-25.92708 -26.74569,-45.63149 -4.82799,4.2971 -6.82318,5.90884 -14.22414,10.22159 -13.42149,7.82108 -23.29409,12.77694 -57.4254,4.90126 -6.20655,-1.43214 -10.39595,-5.23376 -17.19163,-10.18726 3.19112,8.85178 13.86295,22.82829 20.52994,29.96884 9.60429,2.44089 16.74117,5.22791 37.62625,4.98794 20.88508,-0.23997 27.9957,-7.12402 28.16531,-6.11681 1.46865,8.72131 -10.15732,15.08153 -17.76404,15.8875 -28.685,3.03932 -35.00933,-2.21337 -14.62245,8.09979 5.86099,2.96492 34.26238,1.13691 43.31713,-1.32775 z m -80.78275,-2.78657 c -0.89959,-3.50631 -9.45553,-13.31314 -16.50253,-22.41247 -12.72217,0.86257 -31.67329,-0.15844 -50.36917,-1.39061 1.28995,5.05783 2.66671,9.35459 8.01513,16.24454 21.31675,7.41613 29.38807,8.69456 58.85657,7.55854 z m 196.55253,-1.05658 c 7.48368,-7.7352 12.59399,-14.06394 14.48282,-24.0163 -9.86035,0.32816 -31.29112,-0.21889 -43.67612,-1.59123 -2.69192,9.78937 -7.53001,16.5494 -12.60926,27.22235 15.18807,0.0987 34.6126,-0.34167 41.80256,-1.61482 z m -39.5462,-25.77116 c -14.22026,-1.04341 -24.64197,-1.70322 -34.91073,-5.06032 1.48042,5.45477 11.46978,23.84715 21.5113,29.43516 8.27915,-6.74863 11.17085,-18.04429 13.39943,-24.37484 z m 89.8385,17.75618 c 11.06658,-12.35693 10.92734,-17.54469 12.64857,-22.88767 -11.30062,3.12506 -19.72285,3.93232 -32.57321,6.37359 -1.89748,6.90764 -8.91109,16.08982 -13.29931,23.08728 10.8857,-1.22697 19.80754,-2.14697 33.22395,-6.5732 z m -317.64736,-1.93287 c -3.6673,-5.08173 -5.86306,-11.13515 -7.03993,-15.06225 -9.55859,-2.04306 -25.015,-11.46938 -36.15974,-15.65039 -0.84013,3.61202 0.47555,6.43514 1.89431,9.82309 3.08034,2.34947 5.43298,4.84837 12.48233,8.01965 11.52918,5.18662 18.20624,9.12314 28.82303,12.8699 z m 186.64301,-6.91909 c 0,-1.28295 -3.83994,-11.06621 -8.53319,-21.74059 -12.64973,-28.77081 -15.90521,-45.89651 -15.92698,-83.78673 -0.0252,-43.63944 7.06295,-74.30199 28.38761,-122.803 12.2828,-27.93634 24.14205,-48.33846 31.75211,-88.421 -6.5755,13.7585 -12.42832,19.89196 -19.64511,27.05989 -21.77232,21.62492 -35.43644,26.31219 -52.19205,28.77556 -10.17306,1.49562 -14.72264,2.13603 -24.70943,1.96892 -2.20297,3.58807 -4.85267,2.59811 -6.46175,8.54423 7.20281,-3.74693 18.38353,-7.60728 30.32987,-0.36061 13.17431,13.17431 13.24085,43.09586 0.21129,95.05167 -9.8248,39.17692 -10.19364,71.64538 -1.16772,102.79178 6.95963,24.01643 12.71354,36.38943 22.12232,47.57108 6.06993,7.21372 15.83313,10.51196 15.83313,5.3488 z m 171.97615,-4.87721 c 13.62786,-7.80295 31.09463,-25.81562 31.4869,-37.0782 l 0.58746,-16.86667 c 0,0 -3.33814,8.50328 -11.45734,16.98325 -8.1192,8.47997 -26.38286,19.25438 -30.88292,21.72921 -0.59939,9.46563 -4.06332,14.42941 -11.30069,24.85736 9.79893,-3.37732 9.75496,-2.86192 21.56659,-9.62495 z m -399.08628,2.32889 c -9.51845,-4.1386 -13.88481,-11.58962 -21.31996,-16.28929 -24.47145,0 -34.7761,15.07859 -41.53164,27.12964 17.4467,-7.24642 26.52906,-13.51756 62.8516,-10.84035 z m 89.61415,-12.03996 c -2.96659,-6.9594 -8.5975,-16.20369 -10.65302,-24.42661 -3.32741,-13.53845 -4.3118,-22.83307 -5.06108,-33.41904 l -18.6361,-1.69054 c -31.57594,-2.86434 -59.06629,-14.64122 -75.55586,-32.36812 -3.26858,-3.51386 -5.96093,-5.2139 -9.24658,-6.38882 -8.83027,1.85899 -18.19769,18.97121 -17.02277,27.01586 1.72967,11.84307 9.77201,29.61721 24.56626,41.34153 29.28013,23.2043 51.68723,28.03568 82.41647,30.05478 2.27989,0.18213 20.99745,0.37832 29.19268,-0.11904 z m 264.96688,-7.59969 c 33.17591,-8.05353 46.3337,-14.29038 61.72491,-29.25789 11.72243,-11.39971 11.62368,-12.00816 13.38605,-19.93479 -1.76237,-24.37548 -10.99587,-32.58734 -21.33375,-43.1616 -7.10687,5.87459 -13.24631,10.18619 -26.84018,17.60995 -31.82211,17.37834 -38.09788,19.98117 -66.15889,27.43875 -24.8411,6.60186 -60.30618,8.65945 -85.18479,4.94212 -7.56759,-1.13074 -9.34913,-1.85205 -13.95251,-3.79109 0.68374,8.63522 7.02657,30.89277 10.82601,41.77378 5.85555,2.06914 18.69644,5.78501 34.4079,7.46 28.99254,3.09087 68.65671,2.86054 93.12525,-3.07923 z m -365.96517,-6.98934 c -5.0073,-3.79319 -15.04979,-12.14598 -26.38792,-21.11757 6.87309,9.82709 12.8483,20.9029 25.99019,29.94259 -0.31926,-1.74227 -1.30034,-6.15635 0.39773,-8.82502 z m 174.38151,-1.39223 c 8.72133,-4.41943 14.88236,-9.7945 17.9439,-12.18733 -0.16949,-5.33012 -1.96982,-10.02782 -3.00289,-16.61725 -5.90678,-37.67641 -6.18805,-69.1294 7.50831,-116.04264 2.5688,-8.79876 5.75412,-45.31512 1.84029,-56.21297 -4.15354,-11.56552 -8.69358,-14.90016 -17.33371,-12.7316 -5.78093,1.45094 -5.51517,0.17011 -11.73672,5.14607 1.0504,7.27539 1.10708,15.71047 6.08564,25.05696 12.61234,23.67774 10.04037,24.96125 6.07567,37.49464 -0.80298,2.53841 -1.39124,6.08864 -4.82329,7.33709 -3.15456,1.14751 -1.8964,-5.88138 0.0582,-12.92767 0.60282,-2.17313 2.32281,-7.87334 1.10528,-10.03655 -5.37151,6.5601 -6.42148,9.38748 -15.06036,13.65848 -5.32605,2.63316 -11.99257,1.71174 -0.30128,-5.9013 7.61084,-4.95596 10.77639,-10.24385 10.46707,-14.34625 -0.19426,-2.57633 -3.44437,-6.27437 -5.1785,-10.15885 -2.95007,-6.60823 -5.00615,-11.70751 -6.65592,-18.64964 -3.20086,3.77493 -5.80141,7.7042 -9.13729,13.97818 6.84133,7.31246 20.83987,10.94638 11.58225,12.67671 -3.45945,0.64661 -9.07768,-1.13387 -16.27078,-5.30088 -2.41603,3.72551 -4.24198,6.80353 -6.5319,10.81176 -2.28992,4.00822 -4.12029,6.94889 -5.67048,10.8996 6.96825,5.81107 15.45195,13.68903 26.17377,16.60289 10.72182,2.91386 11.93048,1.81646 22.97428,2.92452 8.08128,5.08204 -1.31616,6.05381 -11.71739,5.63634 -7.72997,-10e-4 -16.68583,-2.45555 -27.3221,-7.48731 l -15.82285,-7.48536 c 0,0 -3.06581,4.00289 -5.03127,7.72575 -1.96547,3.72286 -3.65744,5.08829 -8.51011,14.63572 5.39938,8.24057 21.38867,17.40027 34.0222,21.44203 15.60992,4.99399 29.77899,-0.61753 20.03332,8.24165 -4.77168,3.11205 -23.06532,0.34123 -36.22874,-4.79739 -8.4245,-3.28868 -19.18735,-8.49378 -24.61997,-12.59132 -5.53498,12.6329 -11.68573,26.99993 -12.28004,37.31432 6.18795,5.30367 11.08101,8.82246 19.05566,13.46691 7.97464,4.64445 21.23563,8.43556 38.12535,9.28723 8.06886,0.40688 26.8554,-2.79414 19.3361,6.04739 -2.78905,4.51264 -40.55852,2.69964 -55.15569,-2.64757 -12.63477,-4.62834 -18.39389,-7.79019 -22.54456,-9.32048 0.87979,14.6001 0.83026,23.60031 4.89448,36.52707 6.47504,8.03684 11.89338,12.51719 20.9989,18.3279 9.36449,5.97597 36.47534,8.40209 52.65514,0.20322 z m 71.04877,-46.86676 c 2.01191,-4.81899 3.55163,-8.01603 2.84173,-13.05158 -8.64059,-0.0422 -14.24253,-0.23689 -22.38977,-0.63094 0.0772,2.83697 -1.21774,5.73561 0.71057,12.63131 6.62798,0.13993 10.95098,0.8768 18.83747,1.05121 z m 60.69911,-17.42006 c -16.72593,3.26065 -31.86913,4.08213 -47.43678,5.19683 0,6.69555 0.89777,8.55515 -2.39691,14.13601 15.50399,-0.88119 27.14231,-0.37451 43.43305,-3.92524 4.34288,-2.54075 4.81198,-9.06671 6.40064,-15.4076 z m -222.03564,12.70347 c -0.97306,-3.81428 -0.25243,-6.58413 -1.12863,-9.70076 -8.25005,-1.12617 -21.49922,-3.43658 -33.54337,-8.6327 -0.88242,5.9656 -1.14728,11.10158 -0.75873,13.11902 9.66693,2.79108 23.72921,6.39833 35.43073,5.21444 z m 278.8326,-17.63462 c 0,-7.11998 -0.59369,-10.11696 -1.21216,-16.9789 -16.77359,7.82453 -31.16323,15.51069 -41.44376,18.24206 0,5.08121 1.52729,9.81275 -1.36723,16.17841 15.99663,-4.76599 30.24741,-9.57801 44.02315,-17.44157 z m -320.05512,-3.74728 c -11.74917,-6.64801 -19.20995,-8.74125 -29.3989,-17.90926 -0.896,4.75835 -2.84738,10.8932 -2.41728,16.52949 6.3047,5.34257 17.04699,11.94895 30.08288,14.71307 -0.70178,-6.82655 1.7333,-7.60222 1.7333,-13.3333 z m 231.16785,3.04374 c 32.71147,-1.72578 82.63308,-20.13988 112.14976,-46.77174 13.17222,-11.88483 14.16734,-16.48227 19.19028,-22.58022 -6.72623,-21.95934 -23.10937,-30.88619 -52.47628,-27.09337 -9.09958,10.84233 -11.42188,13.14169 -16.90851,17.78987 -20.06442,16.99825 -48.82085,30.62251 -68.78212,33.08945 -22.75093,2.81168 -32.65783,5.24837 -42.09969,3.98007 -1.17151,4.45359 -1.48486,28.22713 -1.26376,44.07058 10.50162,0.56952 12.36516,-0.48907 50.19032,-2.48464 z M 276.78384,433.68138 c -5.90367,-1.70236 -10.37843,-3.21456 -16.13577,-5.74862 -15.74008,-6.92788 -28.01105,-15.33626 -33.173,-22.50945 -3.16903,-4.40378 -8.3879,-10.85021 -11.14489,-16.58687 -3.93192,0.43165 -10.05094,-1.75702 -17.22847,0.008 -6.31534,1.55334 -16.02671,5.22627 -20.65262,12.28631 -5.25291,8.01696 -2.99984,14.67589 9.95705,29.42833 12.17383,13.86092 39.39341,27.4351 59.05309,34.39284 6.52626,2.3097 9.85362,2.60604 18.12668,4.80988 3.41262,-16.06779 7.58035,-27.1149 11.19793,-36.08081 z m 283.10033,27.17019 c 5.65583,-4.52247 19.05654,-17.6262 23.46248,-26.93841 1.46865,-4.61255 2.31492,-7.43835 2.46148,-13.53036 -8.07785,7.41954 -20.69954,19.4848 -28.24204,23.45757 1.26938,4.85395 2.24311,9.49077 2.31808,17.0112 z M 184.06726,436.45411 c -5.42113,-2.75384 -11.20479,-11.96506 -13.69948,-17.54592 -1.6802,10.28053 -2.84362,14.68142 -1.40535,25.23377 7.60658,5.55895 8.95679,8.0796 13.34246,9.936 z m 111.11253,-33.62532 c 3.68104,-5.90159 6.65065,-12.22571 9.51435,-18.0567 -5.74197,-4.83069 -18.72997,-12.23804 -28.86211,-17.79891 -16.4056,-9.0039 -20.24108,-11.70929 -30.26022,-10.37712 -13.02685,1.73206 -18.94914,10.62343 -18.94914,21.41668 0,16.10626 13.17906,29.86637 38.4375,40.13216 9.06503,3.68432 10.64355,4.38638 16.35224,5.95632 6.22307,-8.82933 9.1123,-13.80922 13.76738,-21.27243 z m 161.6848,5.12952 c 22.63107,-8.51735 49.20882,-22.61083 57.1498,-29.78111 12.96065,-11.70277 10.3598,-33.89411 -1.2579,-33.89411 -6.87273,0 -35.40483,13.00679 -52.90578,22.56803 -26.8587,14.67371 -44.8684,28.7812 -50.74299,49.79679 7.93069,-0.13292 5.46088,0.55312 17.91385,-1.00227 7.75246,-0.96829 21.18181,-4.42758 29.84302,-7.68733 z M 403.62471,290.55367 c 15.61963,-7.12645 32.55171,-23.65944 39.6446,-37.37571 12.67211,-24.50505 17.08482,-40.94985 16.96043,-63.20656 -0.0988,-17.66936 -2.22983,-25.37692 -5.96578,-33.79573 -9.34193,-21.0517 -8.93615,-12.72592 -15.57631,-3.23371 -14.59385,20.86213 -25.17757,13.93615 -36.67009,5.72186 -12.40144,-8.86396 -6.23357,-6.35803 -19.06466,0.05 -10.03859,5.01338 -13.74028,3.70353 -21.34972,-1.0759 -7.60944,-4.77943 -13.66344,-10.00271 -17.2088,-22.09047 -3.85578,-13.14613 -1.7647,-12.74535 -13.09418,-4.84192 -22.98228,27.70184 -38.47232,103.39088 -11.78054,141.46771 17.53828,25.01903 50.94648,33.50906 84.10505,18.38046 z m -22.89229,-9.68061 c -0.21982,-1.04433 1.6154,-9.17646 0.20423,-15.5132 -2.91746,-13.10058 8.70009,-13.55304 9.43196,-2.81046 1.2534,10.76354 -4.37091,22.85472 -9.04883,21.11409 z m -59.56637,-9.07044 c -2.51607,-2.51606 -0.85951,-14.85117 2.02722,-20.245 4.60766,-6.8664 8.89219,-5.26144 5.61435,6.27018 1.88143,9.69023 -0.006,17.33132 -7.64157,13.97482 z M 431.99283,146.54508 c 2.86718,-3.05194 6.92032,-9.6352 9.00707,-14.62943 4.82046,-11.53709 4.95806,-40.928499 0.24435,-52.209975 -6.78957,-16.249808 -23.78528,-17.542624 -33.31908,-5.504293 -5.48703,6.928474 -9.40835,16.546333 -12.07927,10.371084 -1.06188,-2.4551 0.23568,-4.730687 1.46773,-7.857746 6.92011,-17.56393 -1.81554,-22.981026 -11.86101,-23.661753 -6.53281,-0.442693 -12.25518,2.972328 -20.24769,11.040967 -9.70032,9.792702 -17.78524,27.905126 -17.78524,49.330526 0,14.08222 3.45321,21.10568 9.27614,26.51831 5.82293,5.41263 11.49057,9.62395 19.23768,9.61982 7.74711,-0.004 9.08725,-5.01839 17.23334,-6.36358 6.95308,3.23098 9.89267,10.46839 22.51112,11.10913 8.72012,0.44279 12.75849,-3.97736 16.31486,-7.76298 z" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccccccccscccccccccccccccscsccsscccsccccscsccscccccsscssscsssscsscscssscssssscssscscccsssscscccccsccssccssssscccccccccccccccccccccccsccssscsscccsssccsscsccscccccccsscssccssccsssccssccccccsssscsssscssssccscscsccscscscsccsscsccscccccccccccccccccccccccccccssccssccscssccssscccccccccccccscsssscssssscsscsssssssscsccssccscccccsssssssssccscc" /> + <path + d="m 751.29906,574.49054 0,56.09559 -368.04049,133.95574 -368.040477,-133.95574 0,-56.61975 368.347517,133.55687 z" + id="path3354-4" + style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <g + transform="translate(0.11034178,-0.45120379)" + id="g5049-2" + style="stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3290-8" + d="m 321.48422,721.5392 -22.36609,12.913 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3292-8" + d="m 75.569784,632.03363 -22.366085,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3294-1" + d="m 305.08992,715.57213 -22.36608,12.91307 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3296-8" + d="m 288.69563,709.6051 -22.36609,12.9131 0,30.0332" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3298-6" + d="m 272.30133,703.63806 -22.36608,12.91304 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3300-0" + d="m 255.90704,697.67102 -22.36609,12.91307 0,30.03331" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3302-2" + d="m 239.51274,691.70399 -22.36608,12.91306 0,30.03325" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3304-4" + d="m 223.11845,685.73695 -22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3306-9" + d="m 206.72415,679.76992 -22.36609,12.91306 0,30.03332" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3308-0" + d="m 190.32985,673.80288 -22.36608,12.91307 0,30.03325" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3310-2" + d="m 173.93556,667.83585 -22.36609,12.91306 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3312-2" + d="m 157.54126,661.86881 -22.36608,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3314-1" + d="m 141.14697,655.90177 -22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3316-5" + d="m 124.75267,649.93474 -22.36608,12.91306 0,30.03329" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3318-4" + d="m 108.35837,643.9677 -22.36608,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3320-4" + d="m 91.96408,638.00067 -22.366085,12.91306 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3322-4" + d="m 443.61027,721.5392 22.36608,12.913 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3324-2" + d="m 476.39886,709.6051 22.36608,12.9131 0,30.0332" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3326-5" + d="m 460.00456,715.57213 22.36609,12.91307 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3328-0" + d="m 525.58175,691.70399 22.36608,12.91306 0,30.03325" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3330-4" + d="m 509.18745,697.67102 22.36609,12.91307 0,30.03331" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3332-2" + d="m 492.79316,703.63806 22.36608,12.91304 0,30.0333" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3334-1" + d="m 558.37034,679.76992 22.36608,12.91306 0,30.03332" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3336-2" + d="m 541.97604,685.73695 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3338-7" + d="m 607.55322,661.86881 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3340-7" + d="m 574.76463,673.80288 22.36609,12.91307 0,30.03325" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3342-9" + d="m 591.15893,667.83585 22.36609,12.91306 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3344-5" + d="m 689.5247,632.03363 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3346-5" + d="m 623.94752,655.90177 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3348-4" + d="m 640.34182,649.93474 22.36608,12.91306 0,30.03329" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3350-0" + d="m 656.73611,643.9677 22.36609,12.91307 0,30.03328" /> + <path + inkscape:connector-curvature="0" + style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path3352-3" + d="m 673.13041,638.00067 22.36608,12.91306 0,30.03328" /> + </g> + </g> + <g + inkscape:groupmode="layer" + id="layer5" + inkscape:label="dxf lineart" + style="display:none"> + <g + style="display:inline" + transform="translate(-1595.256,-3899.9)" + id="layer1"> + <g + transform="translate(1605.7072,3616.6359)" + id="g3058-1" /> + <g + transform="translate(1605.7072,3616.6359)" + id="g3060"> + <path + inkscape:connector-curvature="0" + d="m 376.28676,565.33282 a 50.505437,50.505437 0 0 0 2.94079,-22.54604 4.006761,4.006761 0 1 0 -7.97559,0.77878 42.491917,42.491917 0 0 1 -2.47419,18.96875 4.0067627,4.0067627 0 0 0 7.50899,2.79851 z" + id="path3062-7" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 310.44438,550.74978 a 59.389614,59.389614 0 0 1 1.23877,-16.00076 4.0067628,4.0067628 0 0 1 7.83278,1.69238 51.376093,51.376093 0 0 0 -1.07162,13.84176 4.0067635,4.0067635 0 0 1 -7.99993,0.46662 z" + id="path3064-4" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 392.10618,427.13329 a 12.200345,12.200345 0 0 0 12.0626,-15.93766 22.471543,22.471543 0 0 0 -5.15835,-8.6452 11.14774,11.14774 0 0 0 -16.96297,10.95558 4.0067603,4.0067603 0 0 0 7.93984,-1.08418 3.13422,3.13422 0 0 1 4.03924,-3.41591 14.458023,14.458023 0 0 1 2.51573,4.64997 4.186825,4.186825 0 0 1 -4.13955,5.46937 4.0067602,4.0067602 0 0 0 -0.29654,8.00803 z" + id="path3066-09" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 371.77724,411.5205 a 15.711594,15.711594 0 0 0 -0.4822,-3.9744 3.414554,3.414554 0 0 0 -6.42324,-0.56196 8.601878,8.601878 0 0 0 3.73033,11.08591 4.00676,4.00676 0 0 1 -3.83196,7.03793 16.615399,16.615399 0 0 1 -7.20551,-21.41355 11.428075,11.428075 0 0 1 21.49777,1.88081 23.725114,23.725114 0 0 1 0.72814,6.0015 4.0067635,4.0067635 0 0 1 -8.01333,-0.0562 z" + id="path3068-4" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 379.3526,301.76746 a 23.936355,23.936355 0 0 0 -9.95309,7.37952 4.0067642,4.0067642 0 1 1 -6.27618,-4.98259 31.949875,31.949875 0 0 1 13.28523,-9.85006 4.0067605,4.0067605 0 0 1 2.94404,7.45313 z" + id="path3070-8" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 445.68236,329.11654 a 17.364203,17.364203 0 0 0 -11.77173,-12.76486 4.0067634,4.0067634 0 1 1 2.3854,-7.65026 25.377723,25.377723 0 0 1 17.20435,18.65581 4.0067633,4.0067633 0 0 1 -7.81802,1.75931 z" + id="path3072-8" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 573.77832,824.21829 a 231.49358,231.49358 0 0 0 42.29005,-25.76377 97.552014,97.552014 0 0 1 -10.48364,37.94069 29.283353,29.283353 0 0 1 -12.73834,12.73834 208.98141,208.98141 0 0 1 -37.85329,14.91063 102.01883,102.01883 0 0 0 18.78522,-39.82589 z" + id="path3074-2" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 409.47237,828.37833 a 223.48006,223.48006 0 0 0 206.73547,-40.24557 97.552014,97.552014 0 0 0 -0.19497,-3.41849 80.161845,80.161845 0 0 0 -11.72761,-36.13952 26.25055,26.25055 0 0 0 -21.76496,-12.45524 215.19714,215.19714 0 0 1 -186.57181,44.02404 217.80817,217.80817 0 0 0 13.52388,48.23478 z" + id="path3076-4" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 517.45426,842.3746 a 107.84051,107.84051 0 0 1 -13.06728,29.83277 381.1671,381.1671 0 0 0 15.49202,-1.3351 208.98141,208.98141 0 0 0 21.55961,-3.44895 94.005315,94.005315 0 0 0 22.97314,-39.0461 231.49358,231.49358 0 0 1 -46.95749,13.99738 z" + id="path3078-5" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 450.45349,871.92484 a 82.150232,82.150232 0 0 0 12.01617,-26.0055 231.49358,231.49358 0 0 0 46.23144,-2.09169 99.826988,99.826988 0 0 1 -14.33124,28.90521 381.1671,381.1671 0 0 1 -43.91637,-0.80802 z" + id="path3080-5" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 413.65999,837.94547 a 231.49358,231.49358 0 0 0 40.66298,7.38175 74.136712,74.136712 0 0 1 -12.82798,25.25052 39.270306,39.270306 0 0 1 -20.00183,-17.43165 217.80817,217.80817 0 0 1 -7.83317,-15.20062 z" + id="path3082-1" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 394.76071,771.6117 a 207.18362,207.18362 0 0 0 23.71188,4.47646 73.871194,73.871194 0 0 0 1.94716,-13.81518 232.6189,232.6189 0 0 1 -26.66931,-1.40174 217.80817,217.80817 0 0 0 1.01027,10.74046 z" + id="path3084-7" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 426.49583,776.96489 a 207.18362,207.18362 0 0 0 44.08456,-0.76029 79.152083,79.152083 0 0 0 9.83174,-22.10671 232.6189,232.6189 0 0 1 -51.96427,7.99697 81.884715,81.884715 0 0 1 -1.95203,14.87003 z" + id="path3086-1" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 489.28386,751.49075 a 87.165603,87.165603 0 0 1 -8.50621,23.18584 207.18362,207.18362 0 0 0 55.05061,-17.86255 77.758554,77.758554 0 0 0 2.10781,-27.07964 232.6189,232.6189 0 0 1 -48.65221,21.75635 z" + id="path3088-1" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 393.3415,752.76013 a 217.80817,217.80817 0 0 1 1.1775,-30.55375 283.78976,283.78976 0 0 1 1.37461,-10.69942 202.37681,202.37681 0 0 0 114.74785,-44.62022 l 13.46305,-9.42693 a 30.662014,30.662014 0 0 1 30.54534,-2.67237 43.31958,43.31958 0 0 1 24.50085,32.62626 224.60538,224.60538 0 0 1 -185.8092,65.34643 z" + id="path3090-5" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 397.2145,703.38787 a 194.36329,194.36329 0 0 0 108.49341,-42.81743 23.586902,23.586902 0 0 0 7.177,-26.78491 9.918601,9.918601 0 0 0 -9.0861,-6.36216 46.235274,46.235274 0 0 0 -20.07565,4.19848 368.58869,368.58869 0 0 0 -82.20858,51.76929 283.78976,283.78976 0 0 0 -4.30008,19.99673 z" + id="path3092-2" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 330.50955,405.93841 a 43.354257,43.354257 0 0 0 -21.50063,22.02808 209.96578,209.96578 0 0 0 -17.42053,85.99371 70.711924,70.711924 0 0 0 11.83735,38.4211 73.780204,73.780204 0 0 0 36.19311,28.46005 56.856184,56.856184 0 0 0 26.52196,2.98592 76.570466,76.570466 0 0 0 22.51248,-6.43214 134.78926,134.78926 0 0 0 31.95362,-20.63291 86.740478,86.740478 0 0 0 29.81077,-62.11513 288.53091,288.53091 0 0 0 -2.17155,-48.33622 33.216431,33.216431 0 0 0 -13.19493,-22.44209 85.769489,85.769489 0 0 1 -11.32318,18.65937 20.678757,20.678757 0 0 1 -29.15081,3.20659 l -12.48299,-10.06693 -5.83399,3.19814 a 20.393506,20.393506 0 0 1 -20.81496,1.9248 43.705101,43.705101 0 0 1 -23.03486,-26.94516 75.590657,75.590657 0 0 1 -1.90086,-7.90718 z" + id="path3094-7" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 382.94763,426.06136 16.66009,13.43555 a 12.665237,12.665237 0 0 0 17.85416,-1.96395 77.755969,77.755969 0 0 0 11.39889,-77.33361 16.166727,16.166727 0 0 0 -27.11236,-4.71923 57.567866,57.567866 0 0 0 -9.01787,14.03492 4.00676,4.00676 0 0 1 -7.47927,-2.8312 l 3.66419,-11.92814 a 20.187638,20.187638 0 0 0 -4.10085,-15.3254 13.55444,13.55444 0 0 0 -18.36656,-2.78633 67.577137,67.577137 0 0 0 -26.35813,74.91214 35.691581,35.691581 0 0 0 18.81131,22.00464 12.379986,12.379986 0 0 0 12.99693,-1.44218 l 11.04947,-6.05721 z" + id="path3096-6" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 179.88519,850.89001 a 143.93977,143.93977 0 0 0 -60.7871,11.41043 39.086677,39.086677 0 0 1 31.634,-33.28021 75.323314,75.323314 0 0 0 2.87715,2.61567 204.7432,204.7432 0 0 0 26.27595,19.25411 z" + id="path3098-1" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 180.7201,841.94194 a 63.377551,63.377551 0 0 1 -1.06614,-14.26533 168.39098,168.39098 0 0 0 36.56014,14.90295 79.890316,79.890316 0 0 0 10.90348,21.32858 196.72968,196.72968 0 0 1 -46.39748,-21.9662 z" + id="path3100-4" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 155.0269,736.60456 a 82.876006,82.876006 0 0 0 27.62666,25.09115 130.32087,130.32087 0 0 0 74.55456,16.14168 164.72099,164.72099 0 0 0 15.34776,62.39714 160.37746,160.37746 0 0 1 -136.796,-59.85916 67.309794,67.309794 0 0 1 -0.20129,-8.24674 45.220678,45.220678 0 0 1 19.46831,-35.52407 z" + id="path3102-2" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 139.14621,796.42854 a 168.39098,168.39098 0 0 0 32.78872,26.71342 71.391072,71.391072 0 0 0 -0.11078,12.70846 196.72968,196.72968 0 0 1 -12.97919,-10.28113 67.309794,67.309794 0 0 1 -19.69875,-29.14075 z" + id="path3104-3" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 341.4891,589.85722 a 55.435829,55.435829 0 0 0 -3.2324,14.50355 71.84369,71.84369 0 0 1 11.19892,-6.75508 18.566982,18.566982 0 0 1 23.47316,6.28961 55.133466,55.133466 0 0 1 9.2031,25.28531 115.24382,115.24382 0 0 1 -6.52826,51.71425 126.76861,126.76861 0 0 0 -6.84034,27.96367 258.78206,258.78206 0 0 0 9.55239,109.18435 88.989436,88.989436 0 0 0 27.4297,41.50727 115.2534,115.2534 0 0 0 7.14653,-5.382 225.82169,225.82169 0 0 1 -26.33907,-132.83166 291.80328,291.80328 0 0 1 25.82839,-92.10092 8852.0265,8852.0265 0 0 0 12.90415,-27.67305 271.41458,271.41458 0 0 0 20.23505,-62.43919 94.753998,94.753998 0 0 1 -19.66016,23.69024 142.80278,142.80278 0 0 1 -33.85334,21.85959 84.583986,84.583986 0 0 1 -24.86854,7.10529 64.869704,64.869704 0 0 1 -25.64928,-1.92123 z" + id="path3106-2" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 369.13833,815.32419 a 74.028904,74.028904 0 0 1 -95.89339,5.11915 156.70747,156.70747 0 0 0 7.87587,19.12 72.321745,72.321745 0 0 0 10.15696,15.35524 101.22787,101.22787 0 0 0 67.15775,-1.90467 4.00676,4.00676 0 1 1 2.87252,7.48098 109.24139,109.24139 0 0 1 -57.82815,5.65243 72.321745,72.321745 0 0 0 22.40696,10.97918 68.754331,68.754331 0 0 0 26.53851,2.32182 115.2534,115.2534 0 0 0 46.29388,-15.39035 97.002956,97.002956 0 0 1 -28.05765,-43.64199 266.79558,266.79558 0 0 1 -1.52326,-5.09179 z" + id="path3108-2" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 331.35491,621.89163 a 63.83017,63.83017 0 0 0 -6.26256,9.21212 593.88382,593.88382 0 0 0 -3.81437,6.93228 23.165032,23.165032 0 0 0 9.50587,5.45484 4.00676,4.00676 0 0 1 -2.23105,7.69668 31.178552,31.178552 0 0 1 -11.14625,-5.8833 593.88382,593.88382 0 0 0 -6.91493,13.6255 407.95821,407.95821 0 0 1 -4.08498,8.0845 48.659079,48.659079 0 0 0 46.84863,19.18747 4.0067617,4.0067617 0 1 1 1.2638,7.91324 56.672599,56.672599 0 0 1 -52.22496,-19.38464 407.95821,407.95821 0 0 1 -16.52659,27.58179 65.112051,65.112051 0 0 0 52.57372,21.39817 4.0067601,4.0067601 0 1 1 0.51631,7.99687 73.125571,73.125571 0 0 1 -57.61157,-22.48672 105.69968,105.69968 0 0 0 -14.77227,40.38221 82.248315,82.248315 0 0 0 75.51268,24.07677 4.00676,4.00676 0 0 1 1.54551,7.86307 90.261836,90.261836 0 0 1 -78.11221,-21.76739 156.70747,156.70747 0 0 0 3.66136,45.9627 66.015383,66.015383 0 0 0 97.64216,0.62811 266.79558,266.79558 0 0 1 -5.90981,-98.5153 134.78213,134.78213 0 0 1 7.27275,-29.73136 107.2303,107.2303 0 0 0 6.07431,-48.11829 47.119946,47.119946 0 0 0 -7.86545,-21.61014 10.553462,10.553462 0 0 0 -13.34213,-3.57501 63.83017,63.83017 0 0 0 -14.61804,9.78433 55.435829,55.435829 0 0 0 2.04764,10.34614 80.71878,80.71878 0 0 0 10.60797,22.29072 29.900833,29.900833 0 0 1 0,33.65259 4.0067602,4.0067602 0 0 1 -6.62426,-4.50951 21.887312,21.887312 0 0 0 1.95062,-21.10962 31.201566,31.201566 0 0 1 -14.27347,19.66503 4.0067611,4.0067611 0 0 1 -4.14047,-6.86098 23.188046,23.188046 0 0 0 9.62936,-28.26012 88.732301,88.732301 0 0 1 -4.82714,-12.57156 63.449349,63.449349 0 0 1 -1.35018,-5.35119 z" + id="path3110-1" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 269.57245,713.65446 a 113.7132,113.7132 0 0 0 -11.4262,37.77549 110.10404,110.10404 0 0 1 -96.97148,-61.264 49.107667,49.107667 0 0 1 17.58582,-15.78918 36.418066,36.418066 0 0 1 25.93358,-3.17223 30.817043,30.817043 0 0 0 2.53011,4.95806 72.633968,72.633968 0 0 0 22.72798,22.72798 103.55567,103.55567 0 0 0 39.62019,14.76388 z" + id="path3112-6" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 215.86437,750.95726 a 106.24555,106.24555 0 0 0 1.67841,15.89514 122.30735,122.30735 0 0 1 -30.97555,-12.14953 74.862486,74.862486 0 0 1 -7.75035,-4.98777 64.183337,64.183337 0 0 1 2.26887,-20.3627 118.11756,118.11756 0 0 0 34.77862,21.60486 z" + id="path3114-8" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 174.63302,723.11977 a 72.196858,72.196858 0 0 0 -3.81679,19.80765 74.862486,74.862486 0 0 1 -13.79039,-18.41208 28.198881,28.198881 0 0 1 -1.92017,-21.94772 49.107667,49.107667 0 0 1 1.46515,-3.93072 118.11756,118.11756 0 0 0 18.0622,24.48287 z" + id="path3116-5" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 273.73824,706.13565 a 95.542154,95.542154 0 0 1 -39.51377,-14.0248 64.620448,64.620448 0 0 1 -20.22046,-20.22046 22.803523,22.803523 0 0 1 26.02263,-33.94491 149.61449,149.61449 0 0 1 55.90254,31.71704 399.94469,399.94469 0 0 1 -19.33967,31.99615 113.7132,113.7132 0 0 0 -2.85127,4.47698 z" + id="path3118-7" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 545.05438,752.02278 a 85.772074,85.772074 0 0 0 0.38873,-26.93543 232.6189,232.6189 0 0 0 34.00718,-26.74347 119.25749,119.25749 0 0 1 -9.91732,37.83297 207.18362,207.18362 0 0 1 -24.47859,15.84593 z" + id="path3120-6" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 240.84019,867.78115 a 71.876795,71.876795 0 0 1 -15.21004,-22.88963 168.39098,168.39098 0 0 0 50.89266,3.05759 80.335265,80.335265 0 0 0 20.63345,23.4764 154.30544,154.30544 0 0 1 -49.09939,-2.03029 196.72968,196.72968 0 0 1 -7.21668,-1.61407 z" + id="path3122-1" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 224.02047,753.88817 a 118.11756,118.11756 0 0 0 33.39064,5.54325 164.72099,164.72099 0 0 0 -0.36757,10.377 122.30735,122.30735 0 0 1 -30.98247,-1.21337 98.23203,98.23203 0 0 1 -2.0406,-14.70688 z" + id="path3124-8" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 581.2891,728.10608 a 34.26407,34.26407 0 0 1 29.81506,16.25927 88.175365,88.175365 0 0 1 12.89998,39.75227 105.56553,105.56553 0 0 1 -11.28476,55.92633 37.296873,37.296873 0 0 1 -16.22425,16.22424 216.99493,216.99493 0 0 1 -75.76537,22.57231 389.18062,389.18062 0 0 1 -78.68798,0.40113 47.283826,47.283826 0 0 1 -24.9978,-18.12609 123.26692,123.26692 0 0 1 -63.75725,26.29987 76.767852,76.767852 0 0 1 -29.63164,-2.59243 80.335265,80.335265 0 0 1 -16.39729,-6.79646 162.31896,162.31896 0 0 1 -60.80272,-0.7795 204.7432,204.7432 0 0 1 -48.82219,-16.5864 135.92625,135.92625 0 0 0 -81.12913,11.60923 4.00676,4.00676 0 0 1 -5.7421,-3.49872 47.100197,47.100197 0 0 1 33.74161,-46.48812 75.323314,75.323314 0 0 1 -16.95274,-50.45011 53.234199,53.234199 0 0 1 23.22968,-42.03299 82.876006,82.876006 0 0 1 -0.83023,-1.5231 36.212402,36.212402 0 0 1 -2.46585,-28.18481 57.121187,57.121187 0 0 1 27.515,-32.79109 44.431586,44.431586 0 0 1 27.61588,-4.68162 30.817043,30.817043 0 0 1 39.77667,-32.33039 157.62801,157.62801 0 0 1 57.39495,32.08215 399.94469,399.94469 0 0 0 3.51298,-6.97563 601.89734,601.89734 0 0 1 14.79775,-28.20148 71.84369,71.84369 0 0 1 11.98838,-15.82569 63.449349,63.449349 0 0 1 3.83179,-24.13961 81.793724,81.793724 0 0 1 -37.16337,-30.40815 78.725445,78.725445 0 0 1 -13.17884,-42.77522 217.9793,217.9793 0 0 1 18.0854,-89.27573 51.367777,51.367777 0 0 1 27.79302,-27.10727 75.590657,75.590657 0 0 1 32.44045,-67.61214 21.56796,21.56796 0 0 1 29.22504,4.43363 28.201159,28.201159 0 0 1 5.85316,14.40068 24.180247,24.180247 0 0 1 39.32928,8.34011 85.769489,85.769489 0 0 1 1.73021,58.95357 41.229951,41.229951 0 0 1 18.16135,29.10313 296.54442,296.54442 0 0 1 2.23278,49.6552 279.4281,279.4281 0 0 1 -25.87209,110.0002 8860.04,8860.04 0 0 1 -12.91584,27.69811 283.78976,283.78976 0 0 0 -14.4139,37.46509 376.60221,376.60221 0 0 1 75.15967,-45.76261 54.248794,54.248794 0 0 1 23.55518,-4.92616 17.932121,17.932121 0 0 1 16.42701,11.50232 31.600422,31.600422 0 0 1 1.24923,18.60663 38.675535,38.675535 0 0 1 36.42124,-1.99531 51.333101,51.333101 0 0 1 29.44345,50.99757 127.27101,127.27101 0 0 1 -6.19086,29.58379 z" + id="path3126-9" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 8.01352,861.4055 0,50.1886 34.304866,12.48595 20.748018,-11.97887 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92474,8.6168 6.564258,2.3892 20.748018,-11.97888 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.924741,8.61681 6.564258,2.38919 20.748018,-11.97887 a 4.0067603,4.0067603 0 0 1 4.006761,6.93991 l -14.924741,8.6168 6.564258,2.3892 20.748017,-11.97888 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92474,8.61681 6.56426,2.38919 20.74802,-11.97887 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92474,8.6168 6.56426,2.3892 20.74801,-11.97888 a 4.0067635,4.0067635 0 0 1 4.00676,6.93992 l -14.92474,8.6168 6.56426,2.38919 20.74802,-11.97887 a 4.0067603,4.0067603 0 0 1 4.00676,6.93991 l -14.92474,8.6168 6.56426,2.3892 20.74801,-11.97887 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92474,8.6168 6.56426,2.38919 20.74802,-11.97887 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92474,8.61681 6.56426,2.38919 20.74802,-11.97887 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92475,8.6168 6.56426,2.3892 20.74802,-11.97888 a 4.0067635,4.0067635 0 0 1 4.00676,6.93992 l -14.92474,8.6168 6.56426,2.38919 20.74802,-11.97887 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92474,8.6168 6.56425,2.3892 20.74802,-11.97888 a 4.0067635,4.0067635 0 0 1 4.00676,6.93992 l -14.92474,8.6168 6.56426,2.38918 20.74802,-11.97886 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92474,8.61685 6.56426,2.3891 20.74801,-11.97883 a 4.0067678,4.0067678 0 0 1 4.00676,6.93993 l -14.92474,8.6168 6.56426,2.3892 20.74802,-11.9789 a 4.00676,4.00676 0 0 1 4.00676,6.9399 l -14.92474,8.6168 69.97762,25.4698 0,-50.1886 L 8.01352,861.4055 z" + id="path3128" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 736.08097,861.4055 0,50.1886 -34.30487,12.48595 -20.74802,-11.97887 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.6168 -6.56425,2.3892 -20.74802,-11.97888 a 4.0067603,4.0067603 0 0 0 -4.00676,6.93991 l 14.92474,8.61681 -6.56426,2.38919 -20.74802,-11.97887 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.6168 -6.56426,2.3892 -20.74801,-11.97888 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.61681 -6.56426,2.38919 -20.74802,-11.97887 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.6168 -6.56426,2.3892 -20.74801,-11.97888 a 4.006766,4.006766 0 0 0 -4.00677,6.93992 l 14.92475,8.6168 -6.56426,2.38919 -20.74802,-11.97887 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.6168 -6.56426,2.3892 -20.74802,-11.97887 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.6168 -6.56425,2.38919 -20.74802,-11.97887 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.61681 -6.56426,2.38919 -20.74802,-11.97887 a 4.0067603,4.0067603 0 0 0 -4.00676,6.93991 l 14.92474,8.6168 -6.56426,2.3892 -20.74801,-11.97888 a 4.0067635,4.0067635 0 0 0 -4.00676,6.93992 l 14.92474,8.6168 -6.56426,2.38919 -20.74802,-11.97887 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.6168 -6.56426,2.3892 -20.74802,-11.97888 a 4.006761,4.006761 0 0 0 -4.00675,6.93992 l 14.92474,8.6168 -6.56426,2.38918 -20.74802,-11.97886 a 4.0067603,4.0067603 0 0 0 -4.00676,6.93991 l 14.92474,8.61685 -6.56426,2.3891 -20.74802,-11.97883 a 4.0067678,4.0067678 0 0 0 -4.00676,6.93993 l 14.92474,8.6168 -6.56425,2.3892 -20.74802,-11.9789 a 4.00676,4.00676 0 0 0 -4.00676,6.9399 l 14.92474,8.6168 -69.97763,25.4698 0,-50.1886 360.02697,-131.0391 z" + id="path3130" + style="fill:none;stroke:#00ff00" /> + <path + inkscape:connector-curvature="0" + d="m 0,914.39966 a 4.00676,4.00676 0 0 0 2.636367,3.76513 l 36.060572,13.12497 0,27.22772 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31104 8.380775,3.05036 0,27.22771 a 4.0067605,4.0067605 0 0 0 8.013521,0 l 0,-24.31103 8.380775,3.05035 0,27.22772 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31103 8.380776,3.05035 0,27.22772 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31104 8.380774,3.05035 0,27.22772 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31103 8.38078,3.05035 0,27.22772 a 4.0067605,4.0067605 0 0 0 8.01352,0 l 0,-24.31104 8.38077,3.05036 0,27.22771 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31103 8.38078,3.05035 0,27.22769 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31101 8.38077,3.05036 0,27.22775 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31107 8.38078,3.05035 0,27.22772 a 4.0067605,4.0067605 0 0 0 8.01352,0 l 0,-24.31104 8.38078,3.05036 0,27.22768 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.311 8.38077,3.05035 0,27.22775 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31106 8.38078,3.05036 0,27.2277 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.311 8.38077,3.0503 0,27.2277 a 4.0067605,4.0067605 0 0 0 8.01352,0 l 0,-24.311 8.38078,3.0504 0,27.2277 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.3111 8.38077,3.0504 0,27.2277 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.311 78.05196,28.4086 a 4.00676,4.00676 0 0 0 2.74079,0 l 78.05195,-28.4086 0,24.311 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.2277 8.38078,-3.0504 0,24.3111 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.2277 8.38078,-3.0504 0,24.311 a 4.00676,4.00676 0 0 0 8.01351,0 l 0,-27.2277 8.38078,-3.0503 0,24.311 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.2277 8.38078,-3.05036 0,24.31106 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22775 8.38077,-3.05035 0,24.311 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22768 8.38078,-3.05036 0,24.31104 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22772 8.38077,-3.05035 0,24.31107 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22775 8.38078,-3.05036 0,24.31101 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22769 8.38077,-3.05035 0,24.31103 a 4.006765,4.006765 0 0 0 8.01353,0 l 0,-27.22771 8.38077,-3.05036 0,24.31104 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22772 8.38078,-3.05035 0,24.31103 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22772 8.38077,-3.05035 0,24.31104 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22772 8.38078,-3.05035 0,24.31103 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22772 8.38077,-3.05035 0,24.31103 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22771 8.38078,-3.05036 0,24.31104 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22772 36.06057,-13.12497 a 4.00676,4.00676 0 0 0 2.63637,-3.76513 l 0,-58.7164 a 4.00676,4.00676 0 0 0 -2.31343,-3.63136 L 637.06594,803.22244 a 4.0067602,4.0067602 0 0 0 -3.38666,7.26271 l 95.94824,44.7414 L 372.04724,985.37513 14.466964,855.22655 121.47719,805.32686 a 4.0067602,4.0067602 0 1 0 -3.38666,-7.26271 L 2.31343,852.0519 A 4.00676,4.00676 0 0 0 0,855.68326 l 0,58.7164 z" + id="path3132" + style="fill:none;stroke:#00ff00" /> + </g> + <g + transform="translate(1605.7072,3616.6359)" + id="g3210"> + <path + inkscape:connector-curvature="0" + d="m 382.52092,430.86458 14.57154,11.75125 a 16.671997,16.671997 0 0 0 23.50249,-2.58528 81.762729,81.762729 0 0 0 11.98627,-81.3186 20.173487,20.173487 0 0 0 -33.84358,-5.87562 61.574626,61.574626 0 0 0 -9.65625,15.02408 l 3.75178,-12.2133 a 24.194398,24.194398 0 0 0 -4.86625,-18.69008 17.5612,17.5612 0 0 0 -23.7958,-3.60998 71.583897,71.583897 0 0 0 -27.92096,79.3538 39.698341,39.698341 0 0 0 20.92309,24.4749 16.386746,16.386746 0 0 0 16.9218,-1.69218 l 8.42587,-4.61899 z" + id="path3212" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 372.53226,563.93357 a 46.498677,46.498677 0 0 0 2.70749,-20.7574" + id="path3214-2" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 315.59954,535.59521 a 55.382854,55.382854 0 0 0 -1.1552,14.92126" + id="path3216-7" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 333.7265,400.35197 a 47.361017,47.361017 0 0 0 -28.39168,26.01605 213.97254,213.97254 0 0 0 -17.75297,87.63472 74.718685,74.718685 0 0 0 12.5081,40.59816 77.786964,77.786964 0 0 0 38.15864,30.00562 60.862944,60.862944 0 0 0 28.391,3.19634 80.577226,80.577226 0 0 0 23.69051,-6.76872 138.79602,138.79602 0 0 0 32.90348,-21.24625 90.747238,90.747238 0 0 0 31.18781,-64.98437 292.53766,292.53766 0 0 0 -2.20171,-49.00746 37.223191,37.223191 0 0 0 -19.05684,-27.8772" + id="path3218-9" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="M 341.21132,638.22132 A 27.194806,27.194806 0 0 1 329.9731,671.50499" + id="path3220-5" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 339.16702,584.93246 a 59.442589,59.442589 0 0 0 -2.62324,41.16208 84.725541,84.725541 0 0 0 11.13454,23.3972 25.894073,25.894073 0 0 1 0,29.14308" + id="path3222-4" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="M 543.44764,871.08733 A 98.012075,98.012075 0 0 0 570.2837,821.42548" + id="path3224-3" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 514.2071,838.88789 a 103.83375,103.83375 0 0 1 -17.74383,37.76773" + id="path3226-1" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 421.457,780.4836 a 77.877955,77.877955 0 0 0 3.04257,-22.27427" + id="path3228-2" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 472.9134,779.94366 a 83.158843,83.158843 0 0 0 12.90414,-31.57337" + id="path3230-3" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 539.22236,759.60757 a 81.765314,81.765314 0 0 0 1.84844,-36.48441" + id="path3232-3" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 391.12429,774.81454 a 211.19038,211.19038 0 0 0 189.93266,-42.69491 30.25731,30.25731 0 0 1 26.63776,14.35042 84.168605,84.168605 0 0 1 12.3138,37.94589 101.55877,101.55877 0 0 1 -10.85646,53.80364 33.290113,33.290113 0 0 1 -14.48129,14.48129 212.98817,212.98817 0 0 1 -74.36638,22.15551 385.17386,385.17386 0 0 1 -77.47265,0.43588 43.277066,43.277066 0 0 1 -24.83099,-20.18217 221.81493,221.81493 0 0 1 -27.46482,-133.33866 287.79652,287.79652 0 0 1 25.47373,-90.83627 8856.0333,8856.0333 0 0 0 12.91,-27.68558 275.42134,275.42134 0 0 0 25.50174,-108.44606" + id="path3234-4" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 392.25445,423.12927 a 8.193585,8.193585 0 0 0 8.10107,-10.70351 18.464783,18.464783 0 0 0 -3.87707,-6.71529 7.14098,7.14098 0 0 0 -10.46107,7.25345" + id="path3236" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 366.68615,421.58902 a 12.608639,12.608639 0 0 1 -5.46792,-16.24974 7.421314,7.421314 0 0 1 13.9605,1.22139 19.718354,19.718354 0 0 1 0.60517,4.98795" + id="path3238" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="M 389.47225,756.31817 A 228.61214,228.61214 0 0 0 583.37899,688.82115" + id="path3240-1" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 459.3636,841.71136 a 78.143472,78.143472 0 0 1 -16.53187,33.5809" + id="path3242-1" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 392.42787,707.68071 a 198.37005,198.37005 0 0 0 115.80144,-43.99632 27.593662,27.593662 0 0 0 8.39617,-31.33493 13.925361,13.925361 0 0 0 -12.75656,-8.93223 50.242034,50.242034 0 0 0 -21.81541,4.56232 372.59545,372.59545 0 0 0 -84.1007,53.16609" + id="path3244-3" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 508.22931,663.68439 13.57702,-9.50673 a 34.668775,34.668775 0 0 1 34.53685,-3.02158 47.326341,47.326341 0 0 1 27.14527,47.017 123.26425,123.26425 0 0 1 -10.72617,40.58526" + id="path3246-8" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="M 406.48872,831.64439 A 227.48682,227.48682 0 0 0 620.27078,789.98146" + id="path3248-7" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="M 449.59137,328.23689 A 21.370963,21.370963 0 0 0 435.10333,312.52655" + id="path3250" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 377.88058,298.04089 a 27.943115,27.943115 0 0 0 -11.61916,8.61479" + id="path3252" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 405.51281,864.5415 a 92.996196,92.996196 0 0 1 -31.02418,-45.31207 262.78882,262.78882 0 0 1 -9.70029,-110.87486 130.77537,130.77537 0 0 1 7.05655,-28.84752 111.23706,111.23706 0 0 0 6.30128,-49.91627 51.126706,51.126706 0 0 0 -8.53427,-23.44772 14.560222,14.560222 0 0 0 -18.40765,-4.93232 67.83693,67.83693 0 0 0 -29.60939,27.93811 597.89058,597.89058 0 0 0 -14.69925,28.01374 403.95145,403.95145 0 0 1 -26.97769,46.72672 109.70644,109.70644 0 0 0 -17.9377,49.28344 160.71423,160.71423 0 0 0 15.54459,88.15775 76.328505,76.328505 0 0 0 47.24616,39.64424 72.761092,72.761092 0 0 0 28.08507,2.45713 119.26016,119.26016 0 0 0 65.1447,-28.32178" + id="path3254-4" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 316.38638,638.66914 a 27.171792,27.171792 0 0 0 13.28194,8.67007" + id="path3256-2" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 301.72732,667.31527 a 52.665839,52.665839 0 0 0 52.15985,22.84307" + id="path3258-7" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 280.75734,702.63171 a 69.118811,69.118811 0 0 0 57.84206,25.07701" + id="path3260-7" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 262.24527,750.93628 a 86.255075,86.255075 0 0 0 80.51388,26.67467" + id="path3262-9" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 265.41082,807.63634 a 70.022143,70.022143 0 0 0 105.72256,-0.1937" + id="path3264-3" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 359.87178,856.7544 a 105.23463,105.23463 0 0 1 -70.88249,1.63225" + id="path3266-1" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 307.96308,873.8255 a 158.3122,158.3122 0 0 1 -60.70711,-0.50438 200.73644,200.73644 0 0 1 -91.02887,-44.71853 71.316554,71.316554 0 0 1 -24.67254,-56.62182 49.227439,49.227439 0 0 1 24.65824,-40.8605" + id="path3268-9" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 261.07655,773.42067 a 126.31411,126.31411 0 0 1 -76.46616,-15.22138 78.869246,78.869246 0 0 1 -31.12248,-31.80322 32.205641,32.205641 0 0 1 -2.19301,-25.06626 53.114427,53.114427 0 0 1 25.58496,-30.49097 40.424826,40.424826 0 0 1 30.8812,-2.93695" + id="path3270-8" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 275.88011,710.39411 a 99.548914,99.548914 0 0 1 -43.79174,-14.89339 68.627208,68.627208 0 0 1 -21.47423,-21.47423 26.810283,26.810283 0 0 1 30.59503,-39.9093 153.62125,153.62125 0 0 1 59.7228,34.69979" + id="path3272-6" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="M 278.74109,843.70013 A 164.38422,164.38422 0 0 1 131.88286,781.93476" + id="path3274-5" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="M 261.75187,755.43438 A 114.1108,114.1108 0 0 1 156.58875,689.88039" + id="path3276-0" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 198.87079,856.80555 a 139.93301,139.93301 0 0 0 -84.10393,11.85358 43.093437,43.093437 0 0 1 37.33346,-43.91361" + id="path3278-2" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 219.36836,839.27942 a 75.883556,75.883556 0 0 0 19.43078,32.12534" + id="path3280-8" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 176.21099,821.06404 a 67.384312,67.384312 0 0 0 0.91717,23.32019" + id="path3282-6" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 219.82446,748.19616 a 102.23879,102.23879 0 0 0 2.92741,23.87741" + id="path3284-0" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="M 179.26009,722.11589 A 68.190098,68.190098 0 0 0 174.935,751.80737" + id="path3286-2" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 372.04724,989.63904 0,58.71636" + id="path3288-4" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 310.98422,1005.0767 -22.36609,12.913 0,30.0333" + id="path3290" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 65.069784,915.57113 -22.366085,12.91307 0,30.03328" + id="path3292" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 294.58992,999.10963 -22.36608,12.91307 0,30.0333" + id="path3294" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 278.19563,993.1426 -22.36609,12.9131 0,30.0332" + id="path3296" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 261.80133,987.17556 -22.36608,12.91304 0,30.0333" + id="path3298" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 245.40704,981.20852 -22.36609,12.91307 0,30.03331" + id="path3300" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 229.01274,975.24149 -22.36608,12.91306 0,30.03325" + id="path3302" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 212.61845,969.27445 -22.36609,12.91307 0,30.03328" + id="path3304" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 196.22415,963.30742 -22.36609,12.91306 0,30.03332" + id="path3306" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 179.82985,957.34038 -22.36608,12.91307 0,30.03325" + id="path3308" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 163.43556,951.37335 -22.36609,12.91306 0,30.03328" + id="path3310" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 147.04126,945.40631 -22.36608,12.91307 0,30.03328" + id="path3312" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 130.64697,939.43927 -22.36609,12.91307 0,30.03328" + id="path3314" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 114.25267,933.47224 -22.366084,12.91306 0,30.03329" + id="path3316" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 97.858375,927.5052 -22.366085,12.91307 0,30.03328" + id="path3318" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 81.46408,921.53817 -22.366085,12.91306 0,30.03328" + id="path3320" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 433.11027,1005.0767 22.36608,12.913 0,30.0333" + id="path3322" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 465.89886,993.1426 22.36608,12.9131 0,30.0332" + id="path3324" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 449.50456,999.10963 22.36609,12.91307 0,30.0333" + id="path3326" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 515.08175,975.24149 22.36608,12.91306 0,30.03325" + id="path3328" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 498.68745,981.20852 22.36609,12.91307 0,30.03331" + id="path3330" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 482.29316,987.17556 22.36608,12.91304 0,30.0333" + id="path3332" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 547.87034,963.30742 22.36608,12.91306 0,30.03332" + id="path3334" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 531.47604,969.27445 22.36609,12.91307 0,30.03328" + id="path3336" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 597.05322,945.40631 22.36609,12.91307 0,30.03328" + id="path3338" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 564.26463,957.34038 22.36609,12.91307 0,30.03325" + id="path3340" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 580.65893,951.37335 22.36609,12.91306 0,30.03328" + id="path3342" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 679.0247,915.57113 22.36609,12.91307 0,30.03328" + id="path3344" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 613.44752,939.43927 22.36609,12.91307 0,30.03328" + id="path3346" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 629.84182,933.47224 22.36608,12.91306 0,30.03329" + id="path3348" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 646.23611,927.5052 22.36609,12.91307 0,30.03328" + id="path3350" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 662.63041,921.53817 22.36608,12.91306 0,30.03328" + id="path3352" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="m 740.08773,855.68326 0,58.7164 L 372.04724,1048.3554 4.00676,914.39966 l 0,-58.7164" + id="path3354-8" + style="fill:none;stroke:#0000ff" /> + <path + inkscape:connector-curvature="0" + d="M 119.78386,801.69551 4.00676,855.68326 372.04724,989.63904 740.08773,855.68326 635.37261,806.85379" + id="path3356" + style="fill:none;stroke:#0000ff" /> + </g> + </g> + </g> +</svg> diff --git a/py/asmx64.c b/py/asmx64.c index 226d4efee8..d3158170fb 100644 --- a/py/asmx64.c +++ b/py/asmx64.c @@ -1,16 +1,18 @@ #include <stdio.h> #include <assert.h> -#include <sys/types.h> -#include <sys/mman.h> #include <string.h> #include "misc.h" -#include "asmx64.h" #include "mpconfig.h" // wrapper around everything in this file #if MICROPY_EMIT_X64 +#include <sys/types.h> +#include <sys/mman.h> + +#include "asmx64.h" + #if defined(__OpenBSD__) || defined(__MACH__) #define MAP_ANONYMOUS MAP_ANON #endif @@ -6,6 +6,8 @@ #include "mpconfig.h" #include "gc.h" +#if MICROPY_ENABLE_GC + // a machine word is big enough to hold a pointer /* #define BYTES_PER_WORD (8) @@ -380,3 +382,5 @@ int main(void) { gc_dump_at(); } */ + +#endif // MICROPY_ENABLE_GC diff --git a/py/lexerunix.c b/py/lexerunix.c index 14c28c16d9..5336610bae 100644 --- a/py/lexerunix.c +++ b/py/lexerunix.c @@ -4,8 +4,11 @@ #include <fcntl.h> #include "misc.h" +#include "mpconfig.h" #include "lexer.h" +#if MICROPY_ENABLE_LEXER_UNIX + typedef struct _str_buf_t { bool free; // free src_beg when done const char *src_beg; // beginning of source @@ -78,3 +81,5 @@ mp_lexer_t *mp_import_open_file(qstr mod_name) { vstr_printf(vstr, "%s.py", qstr_str(mod_name)); return mp_lexer_new_from_file(vstr_str(vstr)); // TODO does lexer need to copy the string? can we free it here? } + +#endif // MICROPY_ENABLE_LEXER_UNIX @@ -5,11 +5,7 @@ /** types *******************************************************/ -typedef int bool; -enum { - false = 0, - true = 1 -}; +#include <stdbool.h> typedef unsigned char byte; typedef unsigned int uint; diff --git a/py/mpconfig.h b/py/mpconfig.h index 56495d9156..2017ba366a 100644 --- a/py/mpconfig.h +++ b/py/mpconfig.h @@ -4,26 +4,67 @@ #include <mpconfigport.h> -#ifndef INT_FMT -// printf format spec to use for machine_int_t and friends -#ifdef __LP64__ -// Archs where machine_int_t == long, long != int -#define UINT_FMT "%lu" -#define INT_FMT "%ld" -#else -// Archs where machine_int_t == int -#define UINT_FMT "%u" -#define INT_FMT "%d" +// Any options not explicitly set in mpconfigport.h will get default +// values below. + +/*****************************************************************************/ +/* Micro Python emitters */ + +// Whether to emit CPython byte codes (for debugging/testing) +// Enabling this overrides all other emitters +#ifndef MICROPY_EMIT_CPYTHON +#define MICROPY_EMIT_CPYTHON (0) #endif -#endif //INT_FMT +// Whether to emit x64 native code +#ifndef MICROPY_EMIT_X64 +#define MICROPY_EMIT_X64 (0) +#endif -// Any options not explicitly set in mpconfigport.h will get default -// values below. +// Whether to emit thumb native code +#ifndef MICROPY_EMIT_THUMB +#define MICROPY_EMIT_THUMB (0) +#endif + +// Whether to enable the thumb inline assembler +#ifndef MICROPY_EMIT_INLINE_THUMB +#define MICROPY_EMIT_INLINE_THUMB (0) +#endif + +/*****************************************************************************/ +/* Internal debugging stuff */ // Whether to collect memory allocation stats #ifndef MICROPY_MEM_STATS -#define MICROPY_MEM_STATS (1) +#define MICROPY_MEM_STATS (0) +#endif + +// Whether to build code to show byte code +#ifndef MICROPY_SHOW_BC +#define MICROPY_SHOW_BC (0) +#endif + +/*****************************************************************************/ +/* Fine control over Python features */ + +// Whether to include the garbage collector +#ifndef MICROPY_ENABLE_GC +#define MICROPY_ENABLE_GC (0) +#endif + +// Whether to include REPL helper function +#ifndef MICROPY_ENABLE_REPL_HELPERS +#define MICROPY_ENABLE_REPL_HELPERS (0) +#endif + +// Whether to include lexer helper function for unix +#ifndef MICROPY_ENABLE_LEXER_UNIX +#define MICROPY_ENABLE_LEXER_UNIX (0) +#endif + +// Whether to support float and complex types +#ifndef MICROPY_ENABLE_FLOAT +#define MICROPY_ENABLE_FLOAT (0) #endif // Whether to support slice object and correspondingly @@ -31,3 +72,19 @@ #ifndef MICROPY_ENABLE_SLICE #define MICROPY_ENABLE_SLICE (1) #endif + +/*****************************************************************************/ +/* Miscellaneous settings */ + +// printf format spec to use for machine_int_t and friends +#ifndef INT_FMT +#ifdef __LP64__ +// Archs where machine_int_t == long, long != int +#define UINT_FMT "%lu" +#define INT_FMT "%ld" +#else +// Archs where machine_int_t == int +#define UINT_FMT "%u" +#define INT_FMT "%d" +#endif +#endif //INT_FMT diff --git a/py/mpqstrraw.h b/py/mpqstrraw.h index fe74c3e927..eeed6f3a0a 100644 --- a/py/mpqstrraw.h +++ b/py/mpqstrraw.h @@ -30,6 +30,7 @@ Q(NameError) Q(SyntaxError) Q(TypeError) Q(ValueError) +Q(OSError) Q(abs) Q(all) @@ -15,15 +15,14 @@ typedef machine_int_t mp_small_int_t; typedef machine_float_t mp_float_t; #endif -// Anything that wants to be a Micro Python object must -// have mp_obj_base_t as its first member (except NULL and small ints) - -typedef struct _mp_obj_base_t mp_obj_base_t; -typedef struct _mp_obj_type_t mp_obj_type_t; +// Anything that wants to be a Micro Python object must have +// mp_obj_base_t as its first member (except NULL and small ints) +struct _mp_obj_type_t; struct _mp_obj_base_t { - const mp_obj_type_t *type; + const struct _mp_obj_type_t *type; }; +typedef struct _mp_obj_base_t mp_obj_base_t; // The NULL object is used to indicate the absence of an object // It *cannot* be used when an mp_obj_t is expected, except where explicitly allowed @@ -43,12 +42,17 @@ struct _mp_obj_base_t { #define MP_DECLARE_CONST_FUN_OBJ(obj_name) extern const mp_obj_fun_native_t obj_name -#define MP_DEFINE_CONST_FUN_OBJ_0(obj_name, fun_name) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, 0, 0, fun_name} -#define MP_DEFINE_CONST_FUN_OBJ_1(obj_name, fun_name) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, 1, 1, fun_name} -#define MP_DEFINE_CONST_FUN_OBJ_2(obj_name, fun_name) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, 2, 2, fun_name} -#define MP_DEFINE_CONST_FUN_OBJ_3(obj_name, fun_name) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, 3, 3, fun_name} -#define MP_DEFINE_CONST_FUN_OBJ_VAR(obj_name, n_args_min, fun_name) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, n_args_min, (~((machine_uint_t)0)), fun_name} -#define MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(obj_name, n_args_min, n_args_max, fun_name) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, n_args_min, n_args_max, fun_name} +#define MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, is_kw, n_args_min, n_args_max, fun_name) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, is_kw, n_args_min, n_args_max, (void *)fun_name} +#define MP_DEFINE_CONST_FUN_OBJ_0(obj_name, fun_name) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, false, 0, 0, (mp_fun_0_t)fun_name) +#define MP_DEFINE_CONST_FUN_OBJ_1(obj_name, fun_name) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, false, 1, 1, (mp_fun_1_t)fun_name) +#define MP_DEFINE_CONST_FUN_OBJ_2(obj_name, fun_name) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, false, 2, 2, (mp_fun_2_t)fun_name) +#define MP_DEFINE_CONST_FUN_OBJ_3(obj_name, fun_name) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, false, 3, 3, (mp_fun_3_t)fun_name) +#define MP_DEFINE_CONST_FUN_OBJ_VAR(obj_name, n_args_min, fun_name) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, false, n_args_min, (~((machine_uint_t)0)), (mp_fun_var_t)fun_name) +#define MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(obj_name, n_args_min, n_args_max, fun_name) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, false, n_args_min, n_args_max, (mp_fun_var_t)fun_name) +#define MP_DEFINE_CONST_FUN_OBJ_KW(obj_name, fun_name) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, true, 0, (~((machine_uint_t)0)), (mp_fun_var_t)fun_name) + +// Need to declare this here so we are not dependent on map.h +struct _mp_map_t; // Type definitions for methods @@ -58,10 +62,12 @@ typedef mp_obj_t (*mp_fun_2_t)(mp_obj_t, mp_obj_t); typedef mp_obj_t (*mp_fun_3_t)(mp_obj_t, mp_obj_t, mp_obj_t); typedef mp_obj_t (*mp_fun_t)(void); typedef mp_obj_t (*mp_fun_var_t)(int n, const mp_obj_t *); +typedef mp_obj_t (*mp_fun_kw_t)(mp_obj_t*, struct _mp_map_t*); typedef void (*mp_print_fun_t)(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o); typedef mp_obj_t (*mp_make_new_fun_t)(mp_obj_t type_in, int n_args, const mp_obj_t *args); // args are in reverse order in the array typedef mp_obj_t (*mp_call_n_fun_t)(mp_obj_t fun, int n_args, const mp_obj_t *args); // args are in reverse order in the array +typedef mp_obj_t (*mp_call_n_kw_fun_t)(mp_obj_t fun, int n_args, int n_kw, const mp_obj_t *args); // args are in reverse order in the array typedef mp_obj_t (*mp_unary_op_fun_t)(int op, mp_obj_t); typedef mp_obj_t (*mp_binary_op_fun_t)(int op, mp_obj_t, mp_obj_t); @@ -77,13 +83,14 @@ struct _mp_obj_type_t { mp_make_new_fun_t make_new; // to make an instance of the type mp_call_n_fun_t call_n; + mp_call_n_kw_fun_t call_n_kw; mp_unary_op_fun_t unary_op; // can return NULL if op not supported mp_binary_op_fun_t binary_op; // can return NULL if op not supported mp_fun_1_t getiter; mp_fun_1_t iternext; - const mp_method_t methods[]; + const mp_method_t *methods; /* What we might need to add here: @@ -108,6 +115,8 @@ struct _mp_obj_type_t { */ }; +typedef struct _mp_obj_type_t mp_obj_type_t; + // Constant objects, globally accessible extern const mp_obj_type_t mp_const_type; @@ -118,10 +127,6 @@ extern const mp_obj_t mp_const_empty_tuple; extern const mp_obj_t mp_const_ellipsis; extern const mp_obj_t mp_const_stop_iteration; // special object indicating end of iteration (not StopIteration exception!) -// Need to declare this here so we are not dependent on map.h - -struct _mp_map_t; - // General API for objects mp_obj_t mp_obj_new_none(void); @@ -144,8 +149,8 @@ mp_obj_t mp_obj_new_fun_asm(uint n_args, void *fun); mp_obj_t mp_obj_new_gen_wrap(uint n_locals, uint n_stack, mp_obj_t fun); mp_obj_t mp_obj_new_gen_instance(const byte *bytecode, uint n_state, int n_args, const mp_obj_t *args); mp_obj_t mp_obj_new_closure(mp_obj_t fun, mp_obj_t closure_tuple); -mp_obj_t mp_obj_new_tuple(uint n, mp_obj_t *items); -mp_obj_t mp_obj_new_tuple_reverse(uint n, mp_obj_t *items); +mp_obj_t mp_obj_new_tuple(uint n, const mp_obj_t *items); +mp_obj_t mp_obj_new_tuple_reverse(uint n, const mp_obj_t *items); mp_obj_t mp_obj_new_list(uint n, mp_obj_t *items); mp_obj_t mp_obj_new_list_reverse(uint n, mp_obj_t *items); mp_obj_t mp_obj_new_dict(int n_args); @@ -234,13 +239,15 @@ void mp_obj_slice_get(mp_obj_t self_in, machine_int_t *start, machine_int_t *sto // functions typedef struct _mp_obj_fun_native_t { // need this so we can define const objects (to go in ROM) mp_obj_base_t base; - machine_uint_t n_args_min; // inclusive + bool is_kw : 1; + machine_uint_t n_args_min : (sizeof(machine_uint_t) - 1); // inclusive machine_uint_t n_args_max; // inclusive void *fun; // TODO add mp_map_t *globals // for const function objects, make an empty, const map // such functions won't be able to access the global scope, but that's probably okay } mp_obj_fun_native_t; + extern const mp_obj_type_t fun_native_type; extern const mp_obj_type_t fun_bc_type; void mp_obj_fun_bc_get(mp_obj_t self_in, int *n_args, uint *n_state, const byte **code); diff --git a/py/objbool.c b/py/objbool.c index 77394dab99..cfab7db068 100644 --- a/py/objbool.c +++ b/py/objbool.c @@ -34,14 +34,8 @@ static mp_obj_t bool_make_new(mp_obj_t type_in, int n_args, const mp_obj_t *args const mp_obj_type_t bool_type = { { &mp_const_type }, "bool", - bool_print, // print - bool_make_new, // make_new - NULL, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = {{NULL, NULL},}, + .print = bool_print, + .make_new = bool_make_new, }; static const mp_obj_bool_t false_obj = {{&bool_type}, false}; diff --git a/py/objboundmeth.c b/py/objboundmeth.c index 4e6d2e0103..78e5c62494 100644 --- a/py/objboundmeth.c +++ b/py/objboundmeth.c @@ -36,14 +36,7 @@ mp_obj_t bound_meth_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) { const mp_obj_type_t bound_meth_type = { { &mp_const_type }, "bound_method", - NULL, // print - NULL, // make_new - bound_meth_call_n, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = {{NULL, NULL},}, + .call_n = bound_meth_call_n, }; mp_obj_t mp_obj_new_bound_meth(mp_obj_t self, mp_obj_t meth) { diff --git a/py/objcell.c b/py/objcell.c index 3465f99198..264125bf3a 100644 --- a/py/objcell.c +++ b/py/objcell.c @@ -26,14 +26,6 @@ void mp_obj_cell_set(mp_obj_t self_in, mp_obj_t obj) { const mp_obj_type_t cell_type = { { &mp_const_type }, "cell", - NULL, // print - NULL, // make_new - NULL, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = {{NULL, NULL},}, }; mp_obj_t mp_obj_new_cell(mp_obj_t obj) { diff --git a/py/objclass.c b/py/objclass.c index 536abdf7e3..d13d1775a4 100644 --- a/py/objclass.c +++ b/py/objclass.c @@ -63,14 +63,7 @@ mp_map_t *mp_obj_class_get_locals(mp_obj_t self_in) { const mp_obj_type_t class_type = { { &mp_const_type }, "class", - NULL, // print - NULL, // make_new - class_call_n, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = {{NULL, NULL},}, + .call_n = class_call_n, }; mp_obj_t mp_obj_new_class(mp_map_t *class_locals) { diff --git a/py/objclosure.c b/py/objclosure.c index 3317eb86f4..b372ee6fe7 100644 --- a/py/objclosure.c +++ b/py/objclosure.c @@ -35,14 +35,7 @@ mp_obj_t closure_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) { const mp_obj_type_t closure_type = { { &mp_const_type }, "closure", - NULL, // print - NULL, // make_new - closure_call_n, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = {{NULL, NULL},}, + .call_n = closure_call_n, }; mp_obj_t mp_obj_new_closure(mp_obj_t fun, mp_obj_t closure_tuple) { diff --git a/py/objcomplex.c b/py/objcomplex.c index 46f43b54b5..1036bae420 100644 --- a/py/objcomplex.c +++ b/py/objcomplex.c @@ -87,14 +87,10 @@ static mp_obj_t complex_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) { const mp_obj_type_t complex_type = { { &mp_const_type }, "complex", - complex_print, // print - complex_make_new, // make_new - NULL, // call_n - complex_unary_op, // unary_op - complex_binary_op, // binary_op - NULL, // getiter - NULL, // iternext - .methods = { { NULL, NULL }, }, + .print = complex_print, + .make_new = complex_make_new, + .unary_op = complex_unary_op, + .binary_op = complex_binary_op, }; mp_obj_t mp_obj_new_complex(mp_float_t real, mp_float_t imag) { diff --git a/py/objexcept.c b/py/objexcept.c index 22b8c58126..829b147853 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -38,14 +38,7 @@ void exception_print(void (*print)(void *env, const char *fmt, ...), void *env, const mp_obj_type_t exception_type = { { &mp_const_type }, "exception", - exception_print, // print - NULL, // make_new - NULL, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = {{NULL, NULL},}, + .print = exception_print, }; mp_obj_t mp_obj_new_exception(qstr id) { diff --git a/py/objfloat.c b/py/objfloat.c index 336ae597fc..d21472d5d6 100644 --- a/py/objfloat.c +++ b/py/objfloat.c @@ -68,7 +68,6 @@ const mp_obj_type_t float_type = { .make_new = float_make_new, .unary_op = float_unary_op, .binary_op = float_binary_op, - .methods = { { NULL, NULL }, }, }; mp_obj_t mp_obj_new_float(mp_float_t value) { diff --git a/py/objfun.c b/py/objfun.c index 0db6459a39..395824b046 100644 --- a/py/objfun.c +++ b/py/objfun.c @@ -17,9 +17,13 @@ // mp_obj_fun_native_t defined in obj.h +mp_obj_t fun_native_call_n_kw(mp_obj_t self_in, int n_args, int n_kw, const mp_obj_t *args); // args are in reverse order in the array mp_obj_t fun_native_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) { mp_obj_fun_native_t *self = self_in; + if (self->is_kw) { + return fun_native_call_n_kw(self_in, n_args, 0, args); + } if (self->n_args_min == self->n_args_max) { // function requires a fixed number of arguments @@ -69,19 +73,29 @@ mp_obj_t fun_native_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) { } } +mp_obj_t fun_native_call_n_kw(mp_obj_t self_in, int n_args, int n_kw, const mp_obj_t *args) { + mp_obj_fun_native_t *self = self_in; + + if (!self->is_kw) { + nlr_jump(mp_obj_new_exception_msg(MP_QSTR_TypeError, "function does not take keyword arguments")); + } + + mp_obj_t *vargs = mp_obj_new_tuple_reverse(n_args, args + 2*n_kw); + mp_map_t *kw_args = mp_map_new(MP_MAP_QSTR, n_kw); + for (int i = 0; i < 2*n_kw; i+=2) { + qstr name = mp_obj_str_get(args[i+1]); + mp_qstr_map_lookup(kw_args, name, true)->value = args[i]; + } + mp_obj_t res = ((mp_fun_kw_t)self->fun)(vargs, kw_args); + /* TODO clean up vargs and kw_args */ + return res; +} + const mp_obj_type_t fun_native_type = { { &mp_const_type }, "function", - NULL, // print - NULL, // make_new - fun_native_call_n, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = { - {NULL, NULL}, // end-of-list sentinel - }, + .call_n = fun_native_call_n, + .call_n_kw = fun_native_call_n_kw, }; mp_obj_t rt_make_function_0(mp_fun_0_t fun) { @@ -174,16 +188,7 @@ mp_obj_t fun_bc_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) { const mp_obj_type_t fun_bc_type = { { &mp_const_type }, "function", - NULL, // print - NULL, // make_new - fun_bc_call_n, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = { - {NULL, NULL}, // end-of-list sentinel - }, + .call_n = fun_bc_call_n, }; mp_obj_t mp_obj_new_fun_bc(int n_args, uint n_state, const byte *code) { @@ -288,16 +293,7 @@ mp_obj_t fun_asm_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) { static const mp_obj_type_t fun_asm_type = { { &mp_const_type }, "function", - NULL, // print - NULL, // make_new - fun_asm_call_n, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = { - {NULL, NULL}, // end-of-list sentinel - }, + .call_n = fun_asm_call_n, }; mp_obj_t mp_obj_new_fun_asm(uint n_args, void *fun) { diff --git a/py/objgenerator.c b/py/objgenerator.c index a91b0d6fc6..7eeb4ef80b 100644 --- a/py/objgenerator.c +++ b/py/objgenerator.c @@ -39,14 +39,7 @@ mp_obj_t gen_wrap_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) { const mp_obj_type_t gen_wrap_type = { { &mp_const_type }, "generator", - NULL, // print - NULL, // make_new - gen_wrap_call_n, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = {{NULL, NULL},}, + .call_n = gen_wrap_call_n, }; mp_obj_t mp_obj_new_gen_wrap(uint n_locals, uint n_stack, mp_obj_t fun) { @@ -94,14 +87,9 @@ mp_obj_t gen_instance_iternext(mp_obj_t self_in) { const mp_obj_type_t gen_instance_type = { { &mp_const_type }, "generator", - gen_instance_print, // print - NULL, // make_new - NULL, // call_n - NULL, // unary_op - NULL, // binary_op - gen_instance_getiter, // getiter - gen_instance_iternext, // iternext - .methods = {{NULL, NULL},}, + .print = gen_instance_print, + .getiter = gen_instance_getiter, + .iternext = gen_instance_iternext, }; // args are in reverse order in the array diff --git a/py/objinstance.c b/py/objinstance.c index 8ef2773fd9..209643e2bf 100644 --- a/py/objinstance.c +++ b/py/objinstance.c @@ -92,14 +92,6 @@ void mp_obj_instance_store_attr(mp_obj_t self_in, qstr attr, mp_obj_t value) { const mp_obj_type_t instance_type = { { &mp_const_type }, "instance", - NULL, // print - NULL, // make_new - NULL, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = {{NULL, NULL},}, }; mp_obj_t mp_obj_new_instance(mp_obj_t class) { diff --git a/py/objint.c b/py/objint.c index 8d69c4e7a7..9cd5ebae29 100644 --- a/py/objint.c +++ b/py/objint.c @@ -34,7 +34,6 @@ const mp_obj_type_t int_type = { { &mp_const_type }, "int", .make_new = int_make_new, - .methods = { { NULL, NULL }, }, }; mp_obj_t mp_obj_new_int(machine_int_t value) { diff --git a/py/objlist.c b/py/objlist.c index 02a6b1525b..5162fa09ff 100644 --- a/py/objlist.c +++ b/py/objlist.c @@ -8,6 +8,7 @@ #include "mpconfig.h" #include "mpqstr.h" #include "obj.h" +#include "map.h" #include "runtime0.h" #include "runtime.h" @@ -57,6 +58,7 @@ static mp_obj_t list_make_new(mp_obj_t type_in, int n_args, const mp_obj_t *args default: nlr_jump(mp_obj_new_exception_msg_1_arg(MP_QSTR_TypeError, "list takes at most 1 argument, %d given", (void*)(machine_int_t)n_args)); } + return NULL; } static mp_obj_t list_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) { @@ -119,14 +121,15 @@ static mp_obj_t list_pop(int n_args, const mp_obj_t *args) { } // TODO make this conform to CPython's definition of sort -static void mp_quicksort(mp_obj_t *head, mp_obj_t *tail, mp_obj_t key_fn) { +static void mp_quicksort(mp_obj_t *head, mp_obj_t *tail, mp_obj_t key_fn, bool reversed) { + int op = reversed ? RT_COMPARE_OP_MORE : RT_COMPARE_OP_LESS; while (head < tail) { mp_obj_t *h = head - 1; mp_obj_t *t = tail; - mp_obj_t v = rt_call_function_1(key_fn, tail[0]); // get pivot using key_fn + mp_obj_t v = key_fn == NULL ? tail[0] : rt_call_function_1(key_fn, tail[0]); // get pivot using key_fn for (;;) { - do ++h; while (rt_compare_op(RT_COMPARE_OP_LESS, rt_call_function_1(key_fn, h[0]), v) == mp_const_true); - do --t; while (h < t && rt_compare_op(RT_COMPARE_OP_LESS, v, rt_call_function_1(key_fn, t[0])) == mp_const_true); + do ++h; while (rt_compare_op(op, key_fn == NULL ? h[0] : rt_call_function_1(key_fn, h[0]), v) == mp_const_true); + do --t; while (h < t && rt_compare_op(op, v, key_fn == NULL ? t[0] : rt_call_function_1(key_fn, t[0])) == mp_const_true); if (h >= t) break; mp_obj_t x = h[0]; h[0] = t[0]; @@ -135,16 +138,31 @@ static void mp_quicksort(mp_obj_t *head, mp_obj_t *tail, mp_obj_t key_fn) { mp_obj_t x = h[0]; h[0] = tail[0]; tail[0] = x; - mp_quicksort(head, t, key_fn); + mp_quicksort(head, t, key_fn, reversed); head = h + 1; } } -static mp_obj_t list_sort(mp_obj_t self_in, mp_obj_t key_fn) { - assert(MP_OBJ_IS_TYPE(self_in, &list_type)); - mp_obj_list_t *self = self_in; +static mp_obj_t list_sort(mp_obj_t *args, mp_map_t *kwargs) { + mp_obj_t *args_items = NULL; + machine_uint_t args_len = 0; + qstr key_idx = qstr_from_str_static("key"); + qstr reverse_idx = qstr_from_str_static("reverse"); + + assert(MP_OBJ_IS_TYPE(args, &tuple_type)); + mp_obj_tuple_get(args, &args_len, &args_items); + assert(args_len >= 1); + if (args_len > 1) { + nlr_jump(mp_obj_new_exception_msg(MP_QSTR_TypeError, + "list.sort takes no positional arguments")); + } + mp_obj_list_t *self = args_items[0]; if (self->len > 1) { - mp_quicksort(self->items, self->items + self->len - 1, key_fn); + mp_map_elem_t *keyfun = mp_qstr_map_lookup(kwargs, key_idx, false); + mp_map_elem_t *reverse = mp_qstr_map_lookup(kwargs, reverse_idx, false); + mp_quicksort(self->items, self->items + self->len - 1, + keyfun ? keyfun->value : NULL, + reverse && reverse->value ? rt_is_true(reverse->value) : false); } return mp_const_none; // return None, as per CPython } @@ -258,29 +276,30 @@ static MP_DEFINE_CONST_FUN_OBJ_3(list_insert_obj, list_insert); static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(list_pop_obj, 1, 2, list_pop); static MP_DEFINE_CONST_FUN_OBJ_2(list_remove_obj, list_remove); static MP_DEFINE_CONST_FUN_OBJ_1(list_reverse_obj, list_reverse); -static MP_DEFINE_CONST_FUN_OBJ_2(list_sort_obj, list_sort); +static MP_DEFINE_CONST_FUN_OBJ_KW(list_sort_obj, list_sort); + +static const mp_method_t list_type_methods[] = { + { "append", &list_append_obj }, + { "clear", &list_clear_obj }, + { "copy", &list_copy_obj }, + { "count", &list_count_obj }, + { "index", &list_index_obj }, + { "insert", &list_insert_obj }, + { "pop", &list_pop_obj }, + { "remove", &list_remove_obj }, + { "reverse", &list_reverse_obj }, + { "sort", &list_sort_obj }, + { NULL, NULL }, // end-of-list sentinel +}; const mp_obj_type_t list_type = { { &mp_const_type }, "list", .print = list_print, .make_new = list_make_new, - .unary_op = NULL, .binary_op = list_binary_op, .getiter = list_getiter, - .methods = { - { "append", &list_append_obj }, - { "clear", &list_clear_obj }, - { "copy", &list_copy_obj }, - { "count", &list_count_obj }, - { "index", &list_index_obj }, - { "insert", &list_insert_obj }, - { "pop", &list_pop_obj }, - { "remove", &list_remove_obj }, - { "reverse", &list_reverse_obj }, - { "sort", &list_sort_obj }, - { NULL, NULL }, // end-of-list sentinel - }, + .methods = list_type_methods, }; static mp_obj_list_t *list_new(uint n) { @@ -344,7 +363,6 @@ static const mp_obj_type_t list_it_type = { { &mp_const_type }, "list_iterator", .iternext = list_it_iternext, - .methods = { { NULL, NULL }, }, }; mp_obj_t mp_obj_new_list_iterator(mp_obj_list_t *list, int cur) { diff --git a/py/objmodule.c b/py/objmodule.c index 2d6f9555e8..7b92b76f42 100644 --- a/py/objmodule.c +++ b/py/objmodule.c @@ -6,6 +6,7 @@ #include "nlr.h" #include "misc.h" #include "mpconfig.h" +#include "mpqstr.h" #include "obj.h" #include "runtime.h" #include "map.h" @@ -24,21 +25,15 @@ void module_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_ const mp_obj_type_t module_type = { { &mp_const_type }, "module", - module_print, // print - NULL, // make_new - NULL, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = {{NULL, NULL},}, + .print = module_print, }; mp_obj_t mp_obj_new_module(qstr module_name) { mp_obj_module_t *o = m_new_obj(mp_obj_module_t); o->base.type = &module_type; o->name = module_name; - o->globals = mp_map_new(MP_MAP_QSTR, 0); + o->globals = mp_map_new(MP_MAP_QSTR, 1); + mp_qstr_map_lookup(o->globals, MP_QSTR___name__, true)->value = mp_obj_new_str(module_name); return o; } diff --git a/py/objnone.c b/py/objnone.c index 877e61fe5c..c0efe6c0f5 100644 --- a/py/objnone.c +++ b/py/objnone.c @@ -18,7 +18,6 @@ const mp_obj_type_t none_type = { { &mp_const_type }, "NoneType", .print = none_print, - .methods = {{NULL, NULL},}, }; static const mp_obj_none_t none_obj = {{&none_type}}; diff --git a/py/objrange.c b/py/objrange.c index 1ef42673f4..a2a0e67b00 100644 --- a/py/objrange.c +++ b/py/objrange.c @@ -25,14 +25,7 @@ mp_obj_t range_getiter(mp_obj_t o_in) { static const mp_obj_type_t range_type = { { &mp_const_type} , "range", - NULL, // print - NULL, // make_new - NULL, // call_n - NULL, // unary_op - NULL, // binary_op - range_getiter, - NULL, // iternext - .methods = {{NULL, NULL},}, + .getiter = range_getiter, }; // range is a class and instances are immutable sequence objects @@ -70,14 +63,7 @@ mp_obj_t range_it_iternext(mp_obj_t o_in) { static const mp_obj_type_t range_it_type = { { &mp_const_type }, "range_iterator", - NULL, // print - NULL, // make_new - NULL, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - range_it_iternext, - .methods = {{NULL, NULL},}, + .iternext = range_it_iternext, }; mp_obj_t mp_obj_new_range_iterator(int cur, int stop, int step) { diff --git a/py/objset.c b/py/objset.c index dd9a4d1e1d..67dab11dfb 100644 --- a/py/objset.c +++ b/py/objset.c @@ -57,14 +57,8 @@ static mp_obj_t set_make_new(mp_obj_t type_in, int n_args, const mp_obj_t *args) const mp_obj_type_t set_type = { { &mp_const_type }, "set", - set_print, // print - set_make_new, // make_new - NULL, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = { { NULL, NULL }, }, + .print = set_print, + .make_new = set_make_new, }; mp_obj_t mp_obj_new_set(int n_args, mp_obj_t *items) { diff --git a/py/objslice.c b/py/objslice.c index da69b92af2..d95ccef06f 100644 --- a/py/objslice.c +++ b/py/objslice.c @@ -23,14 +23,7 @@ void ellipsis_print(void (*print)(void *env, const char *fmt, ...), void *env, m const mp_obj_type_t ellipsis_type = { { &mp_const_type }, "ellipsis", - ellipsis_print, // print - NULL, // make_new - NULL, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = {{NULL, NULL},}, + .print = ellipsis_print, }; static const mp_obj_ellipsis_t ellipsis_obj = {{&ellipsis_type}}; @@ -58,7 +51,6 @@ const mp_obj_type_t slice_type = { { &mp_const_type }, "slice", .print = slice_print, - .methods = { { NULL, NULL }, }, }; // TODO: Make sure to handle "empty" values, which are signified by None in CPython diff --git a/py/objstr.c b/py/objstr.c index db3e0beca0..cc9f7f85b4 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -184,17 +184,19 @@ mp_obj_t str_format(int n_args, const mp_obj_t *args) { static MP_DEFINE_CONST_FUN_OBJ_2(str_join_obj, str_join); static MP_DEFINE_CONST_FUN_OBJ_VAR(str_format_obj, 1, str_format); +static const mp_method_t str_type_methods[] = { + { "join", &str_join_obj }, + { "format", &str_format_obj }, + { NULL, NULL }, // end-of-list sentinel +}; + const mp_obj_type_t str_type = { { &mp_const_type }, "str", .print = str_print, .binary_op = str_binary_op, .getiter = str_getiter, - .methods = { - { "join", &str_join_obj }, - { "format", &str_format_obj }, - { NULL, NULL }, // end-of-list sentinel - }, + .methods = str_type_methods, }; mp_obj_t mp_obj_new_str(qstr qstr) { @@ -235,7 +237,6 @@ static const mp_obj_type_t str_it_type = { { &mp_const_type }, "str_iterator", .iternext = str_it_iternext, - .methods = { { NULL, NULL }, }, }; mp_obj_t mp_obj_new_str_iterator(mp_obj_str_t *str, int cur) { diff --git a/py/objtuple.c b/py/objtuple.c index ceca4200e4..0050fc5ea0 100644 --- a/py/objtuple.c +++ b/py/objtuple.c @@ -103,14 +103,13 @@ const mp_obj_type_t tuple_type = { .make_new = tuple_make_new, .binary_op = tuple_binary_op, .getiter = tuple_getiter, - .methods = {{NULL, NULL},}, }; // the zero-length tuple static const mp_obj_tuple_t empty_tuple_obj = {{&tuple_type}, 0}; const mp_obj_t mp_const_empty_tuple = (mp_obj_t)&empty_tuple_obj; -mp_obj_t mp_obj_new_tuple(uint n, mp_obj_t *items) { +mp_obj_t mp_obj_new_tuple(uint n, const mp_obj_t *items) { if (n == 0) { return mp_const_empty_tuple; } @@ -123,7 +122,7 @@ mp_obj_t mp_obj_new_tuple(uint n, mp_obj_t *items) { return o; } -mp_obj_t mp_obj_new_tuple_reverse(uint n, mp_obj_t *items) { +mp_obj_t mp_obj_new_tuple_reverse(uint n, const mp_obj_t *items) { if (n == 0) { return mp_const_empty_tuple; } @@ -166,7 +165,6 @@ static const mp_obj_type_t tuple_it_type = { { &mp_const_type }, "tuple_iterator", .iternext = tuple_it_iternext, - .methods = {{NULL, NULL},}, }; static mp_obj_t mp_obj_new_tuple_iterator(mp_obj_tuple_t *tuple, int cur) { diff --git a/py/objtype.c b/py/objtype.c index 37d40b38f4..8778c180ca 100644 --- a/py/objtype.c +++ b/py/objtype.c @@ -27,5 +27,4 @@ const mp_obj_type_t mp_const_type = { "type", .print = type_print, .call_n = type_call_n, - .methods = {{NULL, NULL},}, }; diff --git a/py/py.mk b/py/py.mk new file mode 100644 index 0000000000..3ed8a3e3d7 --- /dev/null +++ b/py/py.mk @@ -0,0 +1,105 @@ +# default settings; can be overriden in main Makefile + +ifndef PY_SRC +PY_SRC = ../py +endif + +ifndef BUILD +BUILD = build +endif + +# to create the build directory + +$(BUILD): + mkdir -p $@ + +# where py object files go (they have a name prefix to prevent filename clashes) + +PY_BUILD = $(BUILD)/py. + +# py object files + +PY_O_BASENAME = \ + nlrx86.o \ + nlrx64.o \ + nlrthumb.o \ + malloc.o \ + gc.o \ + qstr.o \ + vstr.o \ + unicode.o \ + lexer.o \ + lexerunix.o \ + parse.o \ + scope.o \ + compile.o \ + emitcommon.o \ + emitpass1.o \ + emitcpy.o \ + emitbc.o \ + asmx64.o \ + emitnx64.o \ + asmthumb.o \ + emitnthumb.o \ + emitinlinethumb.o \ + runtime.o \ + map.o \ + obj.o \ + objbool.o \ + objboundmeth.o \ + objcell.o \ + objclass.o \ + objclosure.o \ + objcomplex.o \ + objdict.o \ + objexcept.o \ + objfloat.o \ + objfun.o \ + objgenerator.o \ + objinstance.o \ + objint.o \ + objlist.o \ + objmodule.o \ + objnone.o \ + objrange.o \ + objset.o \ + objslice.o \ + objstr.o \ + objtuple.o \ + objtype.o \ + builtin.o \ + builtinimport.o \ + vm.o \ + showbc.o \ + repl.o \ + +# prepend the build destination prefix to the py object files + +PY_O = $(addprefix $(PY_BUILD), $(PY_O_BASENAME)) + +$(PY_BUILD)emitnx64.o: $(PY_SRC)/emitnative.c $(PY_SRC)/emit.h mpconfigport.h + $(CC) $(CFLAGS) -DN_X64 -c -o $@ $< + +$(PY_BUILD)emitnthumb.o: $(PY_SRC)/emitnative.c $(PY_SRC)/emit.h mpconfigport.h + $(CC) $(CFLAGS) -DN_THUMB -c -o $@ $< + +$(PY_BUILD)%.o: $(PY_SRC)/%.S + $(CC) $(CFLAGS) -c -o $@ $< + +$(PY_BUILD)%.o: $(PY_SRC)/%.c mpconfigport.h + $(CC) $(CFLAGS) -c -o $@ $< + +# optimising gc for speed; 5ms down to 4ms on pybv2 +$(PY_BUILD)gc.o: $(PY_SRC)/gc.c + $(CC) $(CFLAGS) -O3 -c -o $@ $< + +# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster) +$(PY_BUILD)vm.o: $(PY_SRC)/vm.c + $(CC) $(CFLAGS) -O3 -c -o $@ $< + +# header dependencies + +$(PY_BUILD)parse.o: $(PY_SRC)/grammar.h +$(PY_BUILD)compile.o: $(PY_SRC)/grammar.h +$(PY_BUILD)/emitcpy.o: $(PY_SRC)/emit.h +$(PY_BUILD)emitbc.o: $(PY_SRC)/emit.h @@ -1,6 +1,9 @@ #include "misc.h" +#include "mpconfig.h" #include "repl.h" +#if MICROPY_ENABLE_REPL_HELPERS + bool str_startswith_word(const char *str, const char *head) { int i; for (i = 0; str[i] && head[i]; i++) { @@ -42,3 +45,5 @@ bool mp_repl_is_compound_stmt(const char *line) { } return n_paren > 0 || n_brack > 0 || n_brace > 0; } + +#endif // MICROPY_ENABLE_REPL_HELPERS @@ -1 +1,3 @@ +#if MICROPY_ENABLE_REPL_HELPERS bool mp_repl_is_compound_stmt(const char *line); +#endif diff --git a/py/runtime.c b/py/runtime.c index f3fabc39c9..5c476d9ecf 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -61,7 +61,8 @@ typedef struct _mp_code_t { } mp_code_t; static int next_unique_code_id; -static mp_code_t *unique_codes; +static machine_uint_t unique_codes_alloc = 0; +static mp_code_t *unique_codes = NULL; #ifdef WRITE_CODE FILE *fp_write_code = NULL; @@ -83,6 +84,7 @@ void rt_init(void) { mp_qstr_map_lookup(&map_builtins, MP_QSTR_TypeError, true)->value = mp_obj_new_exception(MP_QSTR_TypeError); mp_qstr_map_lookup(&map_builtins, MP_QSTR_SyntaxError, true)->value = mp_obj_new_exception(MP_QSTR_SyntaxError); mp_qstr_map_lookup(&map_builtins, MP_QSTR_ValueError, true)->value = mp_obj_new_exception(MP_QSTR_ValueError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_OSError, true)->value = mp_obj_new_exception(MP_QSTR_OSError); // built-in objects mp_qstr_map_lookup(&map_builtins, MP_QSTR_Ellipsis, true)->value = mp_const_ellipsis; @@ -126,6 +128,7 @@ void rt_init(void) { mp_qstr_map_lookup(&map_builtins, MP_QSTR_sum, true)->value = rt_make_function_var(1, mp_builtin_sum); next_unique_code_id = 1; // 0 indicates "no code" + unique_codes_alloc = 0; unique_codes = NULL; #ifdef WRITE_CODE @@ -134,6 +137,7 @@ void rt_init(void) { } void rt_deinit(void) { + m_del(mp_code_t, unique_codes, unique_codes_alloc); #ifdef WRITE_CODE if (fp_write_code != NULL) { fclose(fp_write_code); @@ -146,18 +150,20 @@ int rt_get_unique_code_id(void) { } static void alloc_unique_codes(void) { - if (unique_codes == NULL) { - unique_codes = m_new(mp_code_t, next_unique_code_id + 10); // XXX hack until we fix the REPL allocation problem - for (int i = 0; i < next_unique_code_id; i++) { + if (next_unique_code_id > unique_codes_alloc) { + // increase size of unique_codes table + unique_codes = m_renew(mp_code_t, unique_codes, unique_codes_alloc, next_unique_code_id); + for (int i = unique_codes_alloc; i < next_unique_code_id; i++) { unique_codes[i].kind = MP_CODE_NONE; } + unique_codes_alloc = next_unique_code_id; } } void rt_assign_byte_code(int unique_code_id, byte *code, uint len, int n_args, int n_locals, int n_stack, bool is_generator) { alloc_unique_codes(); - assert(1 <= unique_code_id && unique_code_id < next_unique_code_id); + assert(1 <= unique_code_id && unique_code_id < next_unique_code_id && unique_codes[unique_code_id].kind == MP_CODE_NONE); unique_codes[unique_code_id].kind = MP_CODE_BYTE; unique_codes[unique_code_id].n_args = n_args; unique_codes[unique_code_id].n_locals = n_locals; @@ -192,7 +198,7 @@ void rt_assign_byte_code(int unique_code_id, byte *code, uint len, int n_args, i void rt_assign_native_code(int unique_code_id, void *fun, uint len, int n_args) { alloc_unique_codes(); - assert(1 <= unique_code_id && unique_code_id < next_unique_code_id); + assert(1 <= unique_code_id && unique_code_id < next_unique_code_id && unique_codes[unique_code_id].kind == MP_CODE_NONE); unique_codes[unique_code_id].kind = MP_CODE_NATIVE; unique_codes[unique_code_id].n_args = n_args; unique_codes[unique_code_id].n_locals = 0; @@ -225,7 +231,7 @@ void rt_assign_native_code(int unique_code_id, void *fun, uint len, int n_args) void rt_assign_inline_asm_code(int unique_code_id, void *fun, uint len, int n_args) { alloc_unique_codes(); - assert(1 <= unique_code_id && unique_code_id < next_unique_code_id); + assert(1 <= unique_code_id && unique_code_id < next_unique_code_id && unique_codes[unique_code_id].kind == MP_CODE_NONE); unique_codes[unique_code_id].kind = MP_CODE_INLINE_ASM; unique_codes[unique_code_id].n_args = n_args; unique_codes[unique_code_id].n_locals = 0; @@ -683,10 +689,20 @@ mp_obj_t rt_call_function_n(mp_obj_t fun_in, int n_args, const mp_obj_t *args) { // args are in reverse order in the array; keyword arguments come first, value then key // eg: (value1, key1, value0, key0, arg1, arg0) -mp_obj_t rt_call_function_n_kw(mp_obj_t fun, uint n_args, uint n_kw, const mp_obj_t *args) { - // TODO - assert(0); - return mp_const_none; +mp_obj_t rt_call_function_n_kw(mp_obj_t fun_in, uint n_args, uint n_kw, const mp_obj_t *args) { + // TODO merge this and _n into a single, smarter thing + DEBUG_OP_printf("calling function %p(n_args=%d, n_kw=%d, args=%p)\n", fun_in, n_args, n_kw, args); + + if (MP_OBJ_IS_SMALL_INT(fun_in)) { + nlr_jump(mp_obj_new_exception_msg(MP_QSTR_TypeError, "'int' object is not callable")); + } else { + mp_obj_base_t *fun = fun_in; + if (fun->type->call_n_kw != NULL) { + return fun->type->call_n_kw(fun_in, n_args, n_kw, args); + } else { + nlr_jump(mp_obj_new_exception_msg_1_arg(MP_QSTR_TypeError, "'%s' object is not callable", fun->type->name)); + } + } } // args contains: arg(n_args-1) arg(n_args-2) ... arg(0) self/NULL fun @@ -775,10 +791,12 @@ mp_obj_t rt_load_attr(mp_obj_t base, qstr attr) { } else if (MP_OBJ_IS_OBJ(base)) { // generic method lookup mp_obj_base_t *o = base; - const mp_method_t *meth = &o->type->methods[0]; - for (; meth->name != NULL; meth++) { - if (strcmp(meth->name, qstr_str(attr)) == 0) { - return mp_obj_new_bound_meth(base, (mp_obj_t)meth->fun); + const mp_method_t *meth = o->type->methods; + if (meth != NULL) { + for (; meth->name != NULL; meth++) { + if (strcmp(meth->name, qstr_str(attr)) == 0) { + return mp_obj_new_bound_meth(base, (mp_obj_t)meth->fun); + } } } } @@ -799,12 +817,14 @@ void rt_load_method(mp_obj_t base, qstr attr, mp_obj_t *dest) { } else if (MP_OBJ_IS_OBJ(base)) { // generic method lookup mp_obj_base_t *o = base; - const mp_method_t *meth = &o->type->methods[0]; - for (; meth->name != NULL; meth++) { - if (strcmp(meth->name, qstr_str(attr)) == 0) { - dest[1] = (mp_obj_t)meth->fun; - dest[0] = base; - return; + const mp_method_t *meth = o->type->methods; + if (meth != NULL) { + for (; meth->name != NULL; meth++) { + if (strcmp(meth->name, qstr_str(attr)) == 0) { + dest[1] = (mp_obj_t)meth->fun; + dest[0] = base; + return; + } } } } diff --git a/py/showbc.c b/py/showbc.c index eb7d41b24d..aea0aff67a 100644 --- a/py/showbc.c +++ b/py/showbc.c @@ -8,6 +8,8 @@ #include "mpconfig.h" #include "bc0.h" +#if MICROPY_SHOW_BC + #define DECODE_UINT do { unum = *ip++; if (unum > 127) { unum = ((unum & 0x3f) << 8) | (*ip++); } } while (0) #define DECODE_ULABEL do { unum = (ip[0] | (ip[1] << 8)); ip += 2; } while (0) #define DECODE_SLABEL do { unum = (ip[0] | (ip[1] << 8)) - 0x8000; ip += 2; } while (0) @@ -363,3 +365,5 @@ void mp_show_byte_code(const byte *ip, int len) { printf("\n"); } } + +#endif // MICROPY_SHOW_BC diff --git a/stm/Makefile b/stm/Makefile index cd998dd882..fecd525276 100644 --- a/stm/Makefile +++ b/stm/Makefile @@ -1,9 +1,16 @@ +# define main target +all: all2 + +# include py core make definitions +include ../py/py.mk + +# program for deletion +RM = /bin/rm + STMSRC=lib #STMOTGSRC=lib-otg FATFSSRC=fatfs CC3KSRC=cc3k -PYSRC=../py -BUILD=build DFU=../tools/dfu.py TARGET=PYBOARD @@ -11,7 +18,7 @@ AS = arm-none-eabi-as CC = arm-none-eabi-gcc LD = arm-none-eabi-ld CFLAGS_CORTEX_M4 = -mthumb -mtune=cortex-m4 -mabi=aapcs-linux -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -fsingle-precision-constant -Wdouble-promotion -DSTM32F40XX -DHSE_VALUE=8000000 -CFLAGS = -I. -I$(PYSRC) -I$(FATFSSRC) -I$(STMSRC) -Wall -ansi -std=gnu99 -Os -DNDEBUG $(CFLAGS_CORTEX_M4) -D$(TARGET) +CFLAGS = -I. -I$(PY_SRC) -I$(FATFSSRC) -I$(STMSRC) -Wall -ansi -std=gnu99 -Os -DNDEBUG $(CFLAGS_CORTEX_M4) -D$(TARGET) #CFLAGS += -I$(STMOTGSRC) -DUSE_HOST_MODE -DUSE_OTG_MODE LDFLAGS = --nostdlib -T stm32f405.ld @@ -43,53 +50,6 @@ SRC_S = \ startup_stm32f40xx.s \ gchelper.s \ -PY_O = \ - nlrthumb.o \ - gc.o \ - malloc.o \ - qstr.o \ - vstr.o \ - unicode.o \ - lexer.o \ - parse.o \ - scope.o \ - compile.o \ - emitcommon.o \ - emitpass1.o \ - emitbc.o \ - asmthumb.o \ - emitnthumb.o \ - emitinlinethumb.o \ - runtime.o \ - map.o \ - obj.o \ - objbool.o \ - objboundmeth.o \ - objcell.o \ - objclass.o \ - objclosure.o \ - objcomplex.o \ - objdict.o \ - objexcept.o \ - objfloat.o \ - objfun.o \ - objgenerator.o \ - objinstance.o \ - objint.o \ - objlist.o \ - objmodule.o \ - objnone.o \ - objrange.o \ - objset.o \ - objslice.o \ - objstr.o \ - objtuple.o \ - objtype.o \ - builtin.o \ - builtinimport.o \ - vm.o \ - repl.o \ - SRC_FATFS = \ ff.c \ diskio.c \ @@ -146,10 +106,10 @@ SRC_CC3K = \ ccspi.c \ pybcc3k.c \ -OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(SRC_S:.s=.o) $(PY_O) $(SRC_FATFS:.c=.o) $(SRC_STM:.c=.o) $(SRC_CC3K:.c=.o)) +OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(SRC_S:.s=.o) $(SRC_FATFS:.c=.o) $(SRC_STM:.c=.o) $(SRC_CC3K:.c=.o)) $(PY_O) #OBJ += $(addprefix $(BUILD)/, $(SRC_STM_OTG:.c=.o)) -all: $(BUILD) $(BUILD)/flash.dfu +all2: $(BUILD) $(BUILD)/flash.dfu $(BUILD)/flash.dfu: $(BUILD)/flash0.bin $(BUILD)/flash1.bin python $(DFU) -b 0x08000000:$(BUILD)/flash0.bin -b 0x08020000:$(BUILD)/flash1.bin $@ @@ -164,9 +124,6 @@ $(BUILD)/flash.elf: $(OBJ) $(LD) $(LDFLAGS) -o $@ $(OBJ) arm-none-eabi-size $@ -$(BUILD): - mkdir -p $@ - $(BUILD)/%.o: %.s $(AS) -o $@ $< @@ -185,31 +142,7 @@ $(BUILD)/%.o: $(STMSRC)/%.c $(BUILD)/%.o: $(CC3KSRC)/%.c $(CC) $(CFLAGS) -c -o $@ $< -$(BUILD)/%.o: $(PYSRC)/%.s - $(AS) -o $@ $< - -$(BUILD)/%.o: $(PYSRC)/%.S - $(CC) $(CFLAGS) -c -o $@ $< - -$(BUILD)/%.o: $(PYSRC)/%.c mpconfigport.h - $(CC) $(CFLAGS) -c -o $@ $< - -$(BUILD)/emitnthumb.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h - $(CC) $(CFLAGS) -DN_THUMB -c -o $@ $< - -# optimising gc for speed; 5ms down to 4ms -$(BUILD)/gc.o: $(PYSRC)/gc.c - $(CC) $(CFLAGS) -O3 -c -o $@ $< - -# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster) -$(BUILD)/vm.o: $(PYSRC)/vm.c - $(CC) $(CFLAGS) -O3 -c -o $@ $< - -$(BUILD)/parse.o: $(PYSRC)/grammar.h -$(BUILD)/compile.o: $(PYSRC)/grammar.h -$(BUILD)/emitbc.o: $(PYSRC)/emit.h - clean: - /bin/rm -rf $(BUILD) + $(RM) -rf $(BUILD) -.PHONY: all clean +.PHONY: all all2 clean @@ -326,18 +326,20 @@ static MP_DEFINE_CONST_FUN_OBJ_1(i2c_obj_read_obj, i2c_obj_read); static MP_DEFINE_CONST_FUN_OBJ_1(i2c_obj_readAndStop_obj, i2c_obj_readAndStop); static MP_DEFINE_CONST_FUN_OBJ_1(i2c_obj_stop_obj, i2c_obj_stop); +static const mp_method_t i2c_methods[] = { + { "start", &i2c_obj_start_obj }, + { "write", &i2c_obj_write_obj }, + { "read", &i2c_obj_read_obj }, + { "readAndStop", &i2c_obj_readAndStop_obj }, + { "stop", &i2c_obj_stop_obj }, + { NULL, NULL }, +}; + static const mp_obj_type_t i2c_obj_type = { { &mp_const_type }, "I2C", .print = i2c_obj_print, - .methods = { - { "start", &i2c_obj_start_obj }, - { "write", &i2c_obj_write_obj }, - { "read", &i2c_obj_read_obj }, - { "readAndStop", &i2c_obj_readAndStop_obj }, - { "stop", &i2c_obj_stop_obj }, - { NULL, NULL }, - } + .methods = i2c_methods, }; // create the I2C object @@ -176,15 +176,17 @@ mp_obj_t led_obj_off(mp_obj_t self_in) { static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_on_obj, led_obj_on); static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_off_obj, led_obj_off); +static const mp_method_t led_methods[] = { + { "on", &led_obj_on_obj }, + { "off", &led_obj_off_obj }, + { NULL, NULL }, +}; + static const mp_obj_type_t led_obj_type = { { &mp_const_type }, "Led", .print = led_obj_print, - .methods = { - { "on", &led_obj_on_obj }, - { "off", &led_obj_off_obj }, - { NULL, NULL }, - } + .methods = led_methods, }; mp_obj_t pyb_Led(mp_obj_t led_id) { diff --git a/stm/main.c b/stm/main.c index 07c974eff8..a038c89b74 100644 --- a/stm/main.c +++ b/stm/main.c @@ -689,22 +689,18 @@ static MP_DEFINE_CONST_FUN_OBJ_1(file_obj_close_obj, file_obj_close); // TODO gc hook to close the file if not already closed +static const mp_method_t file_methods[] = { + { "read", &file_obj_read_obj }, + { "write", &file_obj_write_obj }, + { "close", &file_obj_close_obj }, + {NULL, NULL}, +}; + static const mp_obj_type_t file_obj_type = { { &mp_const_type }, "File", - file_obj_print, // print - NULL, // make_new - NULL, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - NULL, // iternext - .methods = { - { "read", &file_obj_read_obj }, - { "write", &file_obj_write_obj }, - { "close", &file_obj_close_obj }, - {NULL, NULL}, - } + .print = file_obj_print, + .methods = file_methods, }; mp_obj_t pyb_io_open(mp_obj_t o_filename, mp_obj_t o_mode) { diff --git a/stm/mpconfigport.h b/stm/mpconfigport.h index 4cea332f39..dfa46cc504 100644 --- a/stm/mpconfigport.h +++ b/stm/mpconfigport.h @@ -2,11 +2,11 @@ // options to control how Micro Python is built -#define MICROPY_ENABLE_FLOAT (1) -#define MICROPY_EMIT_CPYTHON (0) -#define MICROPY_EMIT_X64 (0) #define MICROPY_EMIT_THUMB (1) #define MICROPY_EMIT_INLINE_THUMB (1) +#define MICROPY_ENABLE_GC (1) +#define MICROPY_ENABLE_REPL_HELPERS (1) +#define MICROPY_ENABLE_FLOAT (1) // type definitions for the specific machine diff --git a/stm/servo.c b/stm/servo.c index 31190ce795..cc9633a996 100644 --- a/stm/servo.c +++ b/stm/servo.c @@ -137,14 +137,16 @@ static mp_obj_t servo_obj_angle(mp_obj_t self_in, mp_obj_t angle) { static MP_DEFINE_CONST_FUN_OBJ_2(servo_obj_angle_obj, servo_obj_angle); +static const mp_method_t servo_methods[] = { + { "angle", &servo_obj_angle_obj }, + { NULL, NULL }, +}; + static const mp_obj_type_t servo_obj_type = { { &mp_const_type }, "Servo", .print = servo_obj_print, - .methods = { - { "angle", &servo_obj_angle_obj }, - { NULL, NULL }, - } + .methods = servo_methods, }; mp_obj_t pyb_Servo(mp_obj_t servo_id) { diff --git a/tests/basics/tests/list_sort.py b/tests/basics/tests/list_sort.py new file mode 100644 index 0000000000..eff12b9c80 --- /dev/null +++ b/tests/basics/tests/list_sort.py @@ -0,0 +1,13 @@ +l = [1, 3, 2, 5] +print(l) +l.sort() +print(l) +l.sort(key=lambda x: -x) +print(l) +l.sort(key=lambda x: -x, reverse=True) +print(l) +l.sort(reverse=True) +print(l) +l.sort(reverse=False) +print(l) + diff --git a/unix-cpy/Makefile b/unix-cpy/Makefile index a1eb9b77e4..d2d698713e 100644 --- a/unix-cpy/Makefile +++ b/unix-cpy/Makefile @@ -1,95 +1,37 @@ -PYSRC=../py -BUILD=build +# define main target +PROG = cpy +all: $(PROG) + +# include py core make definitions +include ../py/py.mk +# program for deletion +RM = /bin/rm + +# compiler settings CC = gcc -CFLAGS = -I. -I$(PYSRC) -Wall -Werror -ansi -std=gnu99 -Os #-DNDEBUG +CFLAGS = -I. -I$(PY_SRC) -Wall -Werror -ansi -std=gnu99 -Os #-DNDEBUG LDFLAGS = -lm +# source files SRC_C = \ main.c \ -PY_O = \ - nlrx86.o \ - nlrx64.o \ - malloc.o \ - qstr.o \ - vstr.o \ - unicode.o \ - lexer.o \ - lexerunix.o \ - parse.o \ - scope.o \ - compile.o \ - emitcommon.o \ - emitpass1.o \ - emitcpy.o \ - runtime.o \ - map.o \ - obj.o \ - objbool.o \ - objboundmeth.o \ - objcell.o \ - objclass.o \ - objclosure.o \ - objcomplex.o \ - objdict.o \ - objexcept.o \ - objfloat.o \ - objfun.o \ - objgenerator.o \ - objinstance.o \ - objint.o \ - objlist.o \ - objmodule.o \ - objnone.o \ - objrange.o \ - objset.o \ - objslice.o \ - objstr.o \ - objtuple.o \ - objtype.o \ - builtin.o \ - builtinimport.o \ - vm.o \ - showbc.o \ - repl.o \ - -OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(PY_O)) +OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) $(PY_O) LIB = -PROG = cpy $(PROG): $(BUILD) $(OBJ) $(CC) -o $@ $(OBJ) $(LIB) $(LDFLAGS) - -$(BUILD): - mkdir -p $@ + strip $(PROG) + size $(PROG) $(BUILD)/%.o: %.c $(CC) $(CFLAGS) -c -o $@ $< -$(BUILD)/%.o: $(PYSRC)/%.S - $(CC) $(CFLAGS) -c -o $@ $< - -$(BUILD)/%.o: $(PYSRC)/%.c mpconfigport.h - $(CC) $(CFLAGS) -c -o $@ $< - -$(BUILD)/emitnx64.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h - $(CC) $(CFLAGS) -DN_X64 -c -o $@ $< - -$(BUILD)/emitnthumb.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h - $(CC) $(CFLAGS) -DN_THUMB -c -o $@ $< - -# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster) -$(BUILD)/vm.o: $(PYSRC)/vm.c - $(CC) $(CFLAGS) -O3 -c -o $@ $< - $(BUILD)/main.o: mpconfigport.h -$(BUILD)/parse.o: $(PYSRC)/grammar.h -$(BUILD)/compile.o: $(PYSRC)/grammar.h -$(BUILD)/emitcpy.o: $(PYSRC)/emit.h -$(BUILD)/emitbc.o: $(PYSRC)/emit.h clean: - /bin/rm -rf $(BUILD) + $(RM) -f $(PROG) + $(RM) -rf $(BUILD) -.PHONY: clean +.PHONY: all clean diff --git a/unix-cpy/main.c b/unix-cpy/main.c index eba97f527b..ea85e32757 100644 --- a/unix-cpy/main.c +++ b/unix-cpy/main.c @@ -11,7 +11,6 @@ #include "obj.h" #include "compile.h" #include "runtime0.h" -#include "runtime.h" void do_file(const char *file) { mp_lexer_t *lex = mp_lexer_new_from_file(file); diff --git a/unix-cpy/mpconfigport.h b/unix-cpy/mpconfigport.h index 983b166a55..3fc1866772 100644 --- a/unix-cpy/mpconfigport.h +++ b/unix-cpy/mpconfigport.h @@ -1,10 +1,8 @@ // options to control how Micro Python is built -#define MICROPY_ENABLE_FLOAT (1) #define MICROPY_EMIT_CPYTHON (1) -#define MICROPY_EMIT_X64 (0) -#define MICROPY_EMIT_THUMB (0) -#define MICROPY_EMIT_INLINE_THUMB (0) +#define MICROPY_ENABLE_LEXER_UNIX (1) +#define MICROPY_ENABLE_FLOAT (1) // type definitions for the specific machine diff --git a/unix/Makefile b/unix/Makefile index 984f1c3bf3..a3faea290a 100644 --- a/unix/Makefile +++ b/unix/Makefile @@ -1,106 +1,39 @@ -PYSRC=../py -BUILD=build +# define main target +PROG = py +all: $(PROG) + +# include py core make definitions +include ../py/py.mk +# program for deletion +RM = /bin/rm + +# compiler settings CC = gcc -CFLAGS = -I. -I$(PYSRC) -Wall -Werror -ansi -std=gnu99 -Os #-DNDEBUG +CFLAGS = -I. -I$(PY_SRC) -Wall -Werror -ansi -std=gnu99 -Os #-DNDEBUG LDFLAGS = -lm +# source files SRC_C = \ main.c \ -PY_O = \ - nlrx86.o \ - nlrx64.o \ - nlrthumb.o \ - malloc.o \ - qstr.o \ - vstr.o \ - unicode.o \ - lexer.o \ - lexerunix.o \ - parse.o \ - scope.o \ - compile.o \ - emitcommon.o \ - emitpass1.o \ - emitcpy.o \ - emitbc.o \ - asmx64.o \ - emitnx64.o \ - asmthumb.o \ - emitnthumb.o \ - emitinlinethumb.o \ - runtime.o \ - map.o \ - obj.o \ - objbool.o \ - objboundmeth.o \ - objcell.o \ - objclass.o \ - objclosure.o \ - objcomplex.o \ - objdict.o \ - objexcept.o \ - objfloat.o \ - objfun.o \ - objgenerator.o \ - objinstance.o \ - objint.o \ - objlist.o \ - objmodule.o \ - objnone.o \ - objrange.o \ - objset.o \ - objslice.o \ - objstr.o \ - objtuple.o \ - objtype.o \ - builtin.o \ - builtinimport.o \ - vm.o \ - showbc.o \ - repl.o \ - -OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(PY_O)) +OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) $(PY_O) LIB = -lreadline # the following is needed for BSD #LIB += -ltermcap -PROG = py $(PROG): $(BUILD) $(OBJ) $(CC) -o $@ $(OBJ) $(LIB) $(LDFLAGS) strip $(PROG) size $(PROG) -$(BUILD): - mkdir -p $@ - $(BUILD)/%.o: %.c $(CC) $(CFLAGS) -c -o $@ $< -$(BUILD)/%.o: $(PYSRC)/%.S - $(CC) $(CFLAGS) -c -o $@ $< - -$(BUILD)/%.o: $(PYSRC)/%.c mpconfigport.h - $(CC) $(CFLAGS) -c -o $@ $< - -$(BUILD)/emitnx64.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h mpconfigport.h - $(CC) $(CFLAGS) -DN_X64 -c -o $@ $< - -$(BUILD)/emitnthumb.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h mpconfigport.h - $(CC) $(CFLAGS) -DN_THUMB -c -o $@ $< - -# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster) -$(BUILD)/vm.o: $(PYSRC)/vm.c - $(CC) $(CFLAGS) -O3 -c -o $@ $< - $(BUILD)/main.o: mpconfigport.h -$(BUILD)/parse.o: $(PYSRC)/grammar.h -$(BUILD)/compile.o: $(PYSRC)/grammar.h -$(BUILD)/emitcpy.o: $(PYSRC)/emit.h -$(BUILD)/emitbc.o: $(PYSRC)/emit.h clean: - /bin/rm -rf $(BUILD) + $(RM) -f $(PROG) + $(RM) -rf $(BUILD) -.PHONY: clean +.PHONY: all clean diff --git a/unix/main.c b/unix/main.c index a06dc36791..920aed3444 100644 --- a/unix/main.c +++ b/unix/main.c @@ -20,6 +20,52 @@ #include <readline/history.h> #endif +static void execute_from_lexer(mp_lexer_t *lex, mp_parse_input_kind_t input_kind, bool is_repl) { + if (lex == NULL) { + return; + } + + if (0) { + // just tokenise + while (!mp_lexer_is_kind(lex, MP_TOKEN_END)) { + mp_token_show(mp_lexer_cur(lex)); + mp_lexer_to_next(lex); + } + mp_lexer_free(lex); + return; + } + + mp_parse_node_t pn = mp_parse(lex, input_kind); + mp_lexer_free(lex); + + if (pn == MP_PARSE_NODE_NULL) { + // parse error + return; + } + + //printf("----------------\n"); + //parse_node_show(pn, 0); + //printf("----------------\n"); + + mp_obj_t module_fun = mp_compile(pn, is_repl); + + if (module_fun == mp_const_none) { + // compile error + return; + } + + // execute it + nlr_buf_t nlr; + if (nlr_push(&nlr) == 0) { + rt_call_function_0(module_fun); + nlr_pop(); + } else { + // uncaught exception + mp_obj_print((mp_obj_t)nlr.ret_val); + printf("\n"); + } +} + static char *str_join(const char *s1, int sep_char, const char *s2) { int l1 = strlen(s1); int l2 = strlen(s2); @@ -80,28 +126,11 @@ static void do_repl(void) { } mp_lexer_t *lex = mp_lexer_new_from_str_len("<stdin>", line, strlen(line), false); - mp_parse_node_t pn = mp_parse(lex, MP_PARSE_SINGLE_INPUT); - mp_lexer_free(lex); - - if (pn != MP_PARSE_NODE_NULL) { - //mp_parse_node_show(pn, 0); - mp_obj_t module_fun = mp_compile(pn, true); - if (module_fun != mp_const_none) { - nlr_buf_t nlr; - if (nlr_push(&nlr) == 0) { - rt_call_function_0(module_fun); - nlr_pop(); - } else { - // uncaught exception - mp_obj_print((mp_obj_t)nlr.ret_val); - printf("\n"); - } - } - } + execute_from_lexer(lex, MP_PARSE_SINGLE_INPUT, true); } } -void do_file(const char *file) { +static void do_file(const char *file) { // hack: set dir for import based on where this file is { const char * s = strrchr(file, '/'); @@ -115,58 +144,17 @@ void do_file(const char *file) { } mp_lexer_t *lex = mp_lexer_new_from_file(file); - //const char *pysrc = "def f():\n x=x+1\n print(42)\n"; - //mp_lexer_t *lex = mp_lexer_from_str_len("<>", pysrc, strlen(pysrc), false); - if (lex == NULL) { - return; - } - - if (0) { - // just tokenise - while (!mp_lexer_is_kind(lex, MP_TOKEN_END)) { - mp_token_show(mp_lexer_cur(lex)); - mp_lexer_to_next(lex); - } - mp_lexer_free(lex); - - } else { - // compile - - mp_parse_node_t pn = mp_parse(lex, MP_PARSE_FILE_INPUT); - mp_lexer_free(lex); - - if (pn != MP_PARSE_NODE_NULL) { - //printf("----------------\n"); - //parse_node_show(pn, 0); - //printf("----------------\n"); - mp_obj_t module_fun = mp_compile(pn, false); - //printf("----------------\n"); + execute_from_lexer(lex, MP_PARSE_FILE_INPUT, false); +} -#if MICROPY_EMIT_CPYTHON - if (!comp_ok) { - printf("compile error\n"); - } -#else - if (1 && module_fun != mp_const_none) { - // execute it - nlr_buf_t nlr; - if (nlr_push(&nlr) == 0) { - rt_call_function_0(module_fun); - nlr_pop(); - } else { - // uncaught exception - mp_obj_print((mp_obj_t)nlr.ret_val); - printf("\n"); - } - } -#endif - } - } +static void do_str(const char *str) { + mp_lexer_t *lex = mp_lexer_new_from_str_len("<stdin>", str, strlen(str), false); + execute_from_lexer(lex, MP_PARSE_SINGLE_INPUT, false); } typedef struct _test_obj_t { mp_obj_base_t base; - bool value; + int value; } test_obj_t; static void test_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) { @@ -188,21 +176,17 @@ static mp_obj_t test_set(mp_obj_t self_in, mp_obj_t arg) { static MP_DEFINE_CONST_FUN_OBJ_1(test_get_obj, test_get); static MP_DEFINE_CONST_FUN_OBJ_2(test_set_obj, test_set); +static const mp_method_t test_methods[] = { + { "get", &test_get_obj }, + { "set", &test_set_obj }, + { NULL, NULL }, +}; + static const mp_obj_type_t test_type = { { &mp_const_type }, "Test", .print = test_print, - .make_new = NULL, - .call_n = NULL, - .unary_op = NULL, - .binary_op = NULL, - .getiter = NULL, - .iternext = NULL, - .methods = { - { "get", &test_get_obj }, - { "set", &test_set_obj }, - { NULL, NULL }, - } + .methods = test_methods, }; mp_obj_t test_obj_new(int value) { @@ -212,6 +196,11 @@ mp_obj_t test_obj_new(int value) { return o; } +int usage(void) { + printf("usage: py [-c <command>] [<filename>]\n"); + return 1; +} + int main(int argc, char **argv) { qstr_init(); rt_init(); @@ -227,12 +216,24 @@ int main(int argc, char **argv) { if (argc == 1) { do_repl(); - } else if (argc == 2) { - do_file(argv[1]); } else { - printf("usage: py [<file>]\n"); - return 1; + for (int a = 1; a < argc; a++) { + if (argv[a][0] == '-') { + if (strcmp(argv[a], "-c") == 0) { + if (a + 1 >= argc) { + return usage(); + } + do_str(argv[a + 1]); + a += 1; + } else { + return usage(); + } + } else { + do_file(argv[a]); + } + } } + rt_deinit(); //printf("total bytes = %d\n", m_get_total_bytes_allocated()); diff --git a/unix/mpconfigport.h b/unix/mpconfigport.h index 7a4622b8b6..8327641213 100644 --- a/unix/mpconfigport.h +++ b/unix/mpconfigport.h @@ -5,11 +5,13 @@ #define MICROPY_USE_READLINE (1) #endif -#define MICROPY_ENABLE_FLOAT (1) -#define MICROPY_EMIT_CPYTHON (0) #define MICROPY_EMIT_X64 (1) #define MICROPY_EMIT_THUMB (0) #define MICROPY_EMIT_INLINE_THUMB (0) +#define MICROPY_MEM_STATS (1) +#define MICROPY_ENABLE_REPL_HELPERS (1) +#define MICROPY_ENABLE_LEXER_UNIX (1) +#define MICROPY_ENABLE_FLOAT (1) // type definitions for the specific machine |