diff options
author | rgl <devnull@localhost> | 2020-02-03 22:42:28 +0100 |
---|---|---|
committer | rgl <devnull@localhost> | 2020-02-03 22:42:28 +0100 |
commit | 0373255087377122eeb10e006ffb8aa1b57e611c (patch) | |
tree | 33a4fafa4996fc2efa205b2973622c3fbd27f368 | |
download | 3dee-0373255087377122eeb10e006ffb8aa1b57e611c.tar.gz 3dee-0373255087377122eeb10e006ffb8aa1b57e611c.tar.bz2 3dee-0373255087377122eeb10e006ffb8aa1b57e611c.zip |
after a year or so of work, i dare create a proper repo.
39 files changed, 16905 insertions, 0 deletions
@@ -0,0 +1,41 @@ +enum { + K↑, + K↓, + K←, + K→, + Krise, + Kfall, + KR↑, + KR↓, + KR←, + KR→, + KR↺, + KR↻, + Kcam0, + Kcam1, + Kcam2, + Kcam3, + Kscrshot, + Ke +}; + +enum { + Scamno, + Sfov, + Scampos, + Scambx, Scamby, Scambz, + Se +}; + +typedef struct Mesh Mesh; +typedef struct TTriangle3 TTriangle3; + +struct Mesh { + Triangle3 *tris; + int ntri; +}; + +struct TTriangle3 { + Triangle3; + Image *tx; +}; @@ -0,0 +1,2 @@ +void *erealloc(void*, ulong); +void *emalloc(ulong); diff --git a/geometry.h b/geometry.h new file mode 100644 index 0000000..a62d667 --- /dev/null +++ b/geometry.h @@ -0,0 +1,110 @@ +#define DEG 0.01745329251994330 + +typedef struct Point2 Point2; +typedef struct Point3 Point3; +typedef double Matrix[3][3]; +typedef double Matrix3[4][4]; +typedef struct Quaternion Quaternion; +typedef struct RFrame RFrame; +typedef struct RFrame3 RFrame3; +typedef struct Triangle3 Triangle3; + +struct Point2 { + double x, y, w; +}; + +struct Point3 { + double x, y, z, w; +}; + +struct Quaternion { + double r, i, j, k; +}; + +struct RFrame { + Point2 p; + Point2 bx, by; +}; + +struct RFrame3 { + Point3 p; + Point3 bx, by, bz; +}; + +struct Triangle3 { + Point3 p0, p1, p2; +}; + +/* Point2 */ +Point2 Pt2(double, double, double); +Point2 Vec2(double, double); +Point2 addpt2(Point2, Point2); +Point2 subpt2(Point2, Point2); +Point2 mulpt2(Point2, double); +Point2 divpt2(Point2, double); +Point2 lerp2(Point2, Point2, double); +double dotvec2(Point2, Point2); +double vec2len(Point2); +Point2 normvec2(Point2); + +/* Point3 */ +Point3 Pt3(double, double, double, double); +Point3 Vec3(double, double, double); +Point3 addpt3(Point3, Point3); +Point3 subpt3(Point3, Point3); +Point3 mulpt3(Point3, double); +Point3 divpt3(Point3, double); +Point3 lerp3(Point3, Point3, double); +double dotvec3(Point3, Point3); +Point3 crossvec3(Point3, Point3); +double vec3len(Point3); +Point3 normvec3(Point3); + +/* Matrix */ +void identity(Matrix); +void addm(Matrix, Matrix); +void subm(Matrix, Matrix); +void mulm(Matrix, Matrix); +void smulm(Matrix, double); +void transposem(Matrix); +double detm(Matrix); +double tracem(Matrix); +void adjm(Matrix); +void invm(Matrix); +Point2 xform(Point2, Matrix); + +/* Matrix3 */ +void identity3(Matrix3); +void addm3(Matrix3, Matrix3); +void subm3(Matrix3, Matrix3); +void mulm3(Matrix3, Matrix3); +void smulm3(Matrix3, double); +void transposem3(Matrix3); +double detm3(Matrix3); +double tracem3(Matrix3); +void adjm3(Matrix3); +void invm3(Matrix3); +Point3 xform3(Point3, Matrix3); + +/* Quaternion */ +Quaternion Quat(double, double, double, double); +Quaternion Quatvec(double, Point3); +Quaternion addq(Quaternion, Quaternion); +Quaternion subq(Quaternion, Quaternion); +Quaternion mulq(Quaternion, Quaternion); +Quaternion smulq(Quaternion, double); +Quaternion sdivq(Quaternion, double); +double dotq(Quaternion, Quaternion); +Quaternion invq(Quaternion); +double qlen(Quaternion); +Quaternion normq(Quaternion); +Point3 qrotate(Point3, Point3, double); + +/* RFrame */ +Point2 rframexform(Point2, RFrame); +Point3 rframexform3(Point3, RFrame3); +Point2 invrframexform(Point2, RFrame); +Point3 invrframexform3(Point3, RFrame3); + +/* Triangle3 */ +Point3 centroid(Triangle3); diff --git a/graphics.h b/graphics.h new file mode 100644 index 0000000..be3105d --- /dev/null +++ b/graphics.h @@ -0,0 +1,55 @@ +typedef enum { + Portho, /* orthographic */ + Ppersp /* perspective */ +} Projection; + +typedef struct Vertex Vertex; +typedef struct Triangle Triangle; +typedef struct Viewport Viewport; +typedef struct Camera Camera; + +struct Vertex { + Point3 p; /* position */ + Point3 n; /* surface normal */ + //Image tx; /* (?) */ +}; + +struct Triangle { + Point p0, p1, p2; +}; + +struct Camera { + RFrame3; /* VCS */ + Image *viewport; + double fov; /* vertical FOV */ + struct { + double n, f; /* near and far clipping planes */ + } clip; + Matrix3 proj; /* VCS to NDC xform */ + Projection ptype; +}; + +/* Triangle */ +Triangle Trian(int, int, int, int, int, int); +Triangle Trianpt(Point, Point, Point); +void triangle(Image *, Triangle, int, Image *, Point); +void filltriangle(Image *, Triangle, Image *, Point); + +/* Camera */ +void perspective(Matrix3, double, double, double, double); +void orthographic(Matrix3, double, double, double, double, double, double); +void configcamera(Camera*, Image*, double, double, double, Projection); +void placecamera(Camera*, Point3, Point3, Point3); +void aimcamera(Camera*, Point3); +void reloadcamera(Camera*); + +/* rendering */ +#define FPS2MS(n) (1000/(n)) +#define WORLD2VCS(cp, p) (rframexform3((p), *(cp))) +#define VCS2NDC(cp, p) (xform3((p), (cp)->proj)) +#define WORLD2NDC(cp, p) (VCS2NDC((cp), WORLD2VCS((cp), (p)))) +int isclipping(Point3); +Point toviewport(Camera*, Point3); +Point2 fromviewport(Camera*, Point); +void line3(Camera *c, Point3 p0, Point3 p1, int end0, int end1, Image *src); +Point string3(Camera *c, Point3 p, Image *src, Font *f, char *s); diff --git a/libgeometry/doc/libgeometry.ms b/libgeometry/doc/libgeometry.ms new file mode 100644 index 0000000..47c8d94 --- /dev/null +++ b/libgeometry/doc/libgeometry.ms @@ -0,0 +1,429 @@ +.TL +libgeometry +.AU +Rodrigo G. López +.sp +rgl@antares-labs.eu +.AI +Antares Telecom Laboratories +Albatera, Alicante +.FS +ACHTUNG! this is a +.B "WORK IN PROGRESS" +.FE +.SH +Introduction +.PP +.I Libgeometry is a computational geometry library that provides all +the utilities anybody working with graphics or scientific simulations +could need. +.NH 1 +Data Structures +.NH 2 +Point2 +.P1 +struct Point2 { + double x, y, w; +}; +.P2 +.PP +.I Point2 +represents a point in two-dimensional projective space, which itself +is an extension of the two-dimensional euclidean space that allows us +to work with vectors and compose affine transformations in a friendly +manner. A point +.EQ +gfont roman +(x, y, w) +.EN +made out of homogenous coordinates +.I x , +.I y , +and +.I w , +yields a point with cartesian coordinates +.EQ +(x/w, y/w) . +.EN +.NH 2 +Point3 +.P1 +struct Point3 { + double x, y, z, w; +}; +.P2 +.PP +.I Point3 +is a point in three-dimensional projective space. +.NH 2 +Matrix +.P1 +typedef double Matrix[3][3]; +.P2 +.PP +.I Matrix +represents a 3x3 matrix, thought to compose affine transformations to +apply to homogeneous 2D points. +.NH 2 +Matrix3 +.P1 +typedef double Matrix3[4][4]; +.P2 +.PP +.I Matrix3 +represents a 4x4 matrix, thought to compose affine transformations to +apply to homogeneous 3D points. +.NH 2 +Quaternion +.P1 +struct Quaternion { + double r, i, j, k; +}; +.P2 +.PP +.I Quaternions +are a numbering system that extends the complex numbers up to +four-dimensional space, and are used to apply rotations and model +mechanical interactions in 3D space. Their main advantages with +respect to their matrix relatives are increased computational and +storage performance and gimbal lock avoidance. +.NH 2 +RFrame +.P1 +struct RFrame { + Point2 p; + Point2 bx, by; +}; +.P2 +.PP +A reference frame (or frame of reference) is +.NH 2 +RFrame3 +.P1 +struct RFrame3 { + Point3 p; + Point3 bx, by, bz; +}; +.P2 +.PP +A reference frame (or frame of reference) is +.NH 1 +Algorithms +.NH 2 +Point2 +.SH +Addition +.P1 +Point2 addpt2(Point2 a, Point2 b) +.P2 +.EQ +a + b ~=~ left ( x sub a + x sub b ,~ y sub a + y sub b ,~ w sub a + w sub b right ) +.EN +.SH +Substraction +.P1 +Point2 subpt2(Point2 a, Point2 b) +.P2 +.EQ +a - b ~=~ left ( x sub a - x sub b ,~ y sub a - y sub b ,~ w sub a - w sub b right ) +.EN +.SH +Multiplication +.P1 +Point2 mulpt2(Point2 p, double s) +.P2 +.EQ +p * s ~=~ left ( xs,~ ys,~ ws right ) +.EN +.SH +Division +.P1 +Point2 divpt2(Point2 p, double s) +.P2 +.EQ +p / s ~=~ left ( x over s ,~ y over s ,~ w over s right ) +.EN +.SH +Vector Dot Product +.P1 +double dotvec2(Point2 a, Point2 b) +.P2 +.EQ +a vec ~•~ b vec ~=~ x sub a x sub b + y sub a y sub b +.EN +.SH +Vector Magnitude/Length +.P1 +double vec2len(Point2 v) +.P2 +.EQ +| v vec | ~=~ sqrt { x sup 2 + y sup 2 } +.EN +.SH +Vector Normalization +.P1 +Point2 normvec2(Point2 v) +.P2 +.EQ +n vec ~=~ left ( x over {| v vec |},~ y over {| v vec |} right ) +.EN +.NH 2 +Point3 +.SH +Addition +.P1 +Point3 addpt3(Point3 a, Point3 b) +.P2 +.EQ +a + b ~=~ left ( x sub a + x sub b ,~ y sub a + y sub b ,~ z sub a + z sub b ,~ w sub a + w sub b right ) +.EN +.SH +Substraction +.P1 +Point3 subpt3(Point3 a, Point3 b) +.P2 +.EQ +a - b ~=~ left ( x sub a - x sub b ,~ y sub a - y sub b ,~ z sub a - z sub b ,~ w sub a - w sub b right ) +.EN +.SH +Multiplication +.P1 +Point3 mulpt3(Point3 p, double s) +.P2 +.EQ +p * s ~=~ left ( xs,~ ys,~ zs,~ ws right ) +.EN +.SH +Division +.P1 +Point3 divpt3(Point3 p, double s) +.P2 +.EQ +p / s ~=~ left ( x over s ,~ y over s ,~ z over s ,~ w over s right ) +.EN +.SH +Vector Dot Product +.P1 +double dotvec3(Point3 a, Point3 b) +.P2 +.EQ +a vec ~•~ b vec ~=~ x sub a x sub b + y sub a y sub b + z sub a z sub b +.EN +.SH +Vector Cross Product +.P1 +double crossvec3(Point3 a, Point3 b) +.P2 +.EQ +a vec ~×~ b vec ~=~ left ( y sub a z sub b - z sub a y sub b ,~ + z sub a x sub b - x sub a z sub b ,~ + x sub a y sub b - y sub a x sub b right ) +.EN +.SH +Vector Magnitude/Length +.P1 +double vec3len(Point3 v) +.P2 +.EQ +| v vec | ~=~ sqrt { x sup 2 + y sup 2 + z sup 2 } +.EN +.SH +Vector Normalization +.P1 +Point3 normvec3(Point3 v) +.P2 +.EQ +n vec ~=~ left ( x over {| v vec |},~ y over {| v vec |},~ z over {| v vec |} right ) +.EN +.NH 2 +Matrix +.SH +Addition +.P1 +void addm(Matrix A, Matrix B) +.P2 +.EQ +( bold A + bold B ) sub {i,j} ~=~ bold A sub {i,j} + bold B sub {i,j} +.EN +.SH +Substraction +.P1 +void subm(Matrix A, Matrix B) +.P2 +.EQ +( bold A - bold B ) sub {i,j} ~=~ bold A sub {i,j} - bold B sub {i,j} +.EN +.SH +Multiplication +.P1 +void mulm(Matrix A, Matrix B) +.P2 +.EQ +left [ bold A bold B right ] sub {i,j} ~=~ sum from {k = 0} to 3-1 bold A sub {i,k} bold B sub {k,j} +.EN +.SH +Transpose +.P1 +void transposem(Matrix M) +.P2 +.EQ +( bold M sup T ) sub {i,j} ~=~ bold A sub {j,i} +.EN +.SH +Identity +.P1 +void identity(Matrix M) +.P2 +.EQ +bold M ~=~ left [ rpile { + 1 ~ 0 ~ 0 +above 0 ~ 1 ~ 0 +above 0 ~ 0 ~ 1 +} right ] +.EN +.SH +Determinant +.P1 +double detm(Matrix M) +.P2 +.EQ +det( bold M ) ~=~ lpile { + m sub 00 ( m sub 11 m sub 22 - m sub 12 m sub 21 ) + +above m sub 01 ( m sub 12 m sub 20 - m sub 10 m sub 22 ) + +above m sub 02 ( m sub 10 m sub 21 - m sub 11 m sub 20 ) +} +.EN +.NH 2 +Matrix3 +.SH +Addition +.P1 +void addm3(Matrix3 A, Matrix3 B) +.P2 +.EQ +( bold A + bold B ) sub {i,j} ~=~ bold A sub {i,j} + bold B sub {i,j} +.EN +.SH +Substraction +.P1 +void subm3(Matrix3 A, Matrix3 B) +.P2 +.EQ +( bold A - bold B ) sub {i,j} ~=~ bold A sub {i,j} - bold B sub {i,j} +.EN +.SH +Multiplication +.P1 +void mulm3(Matrix3 A, Matrix3 B) +.P2 +.EQ +left [ bold A bold B right ] sub {i,j} ~=~ sum from {k = 0} to 4-1 bold A sub {i,k} bold B sub {k,j} +.EN +.SH +Transpose +.P1 +void transposem3(Matrix3 M) +.P2 +.EQ +( bold M sup T ) sub {i,j} ~=~ bold A sub {j,i} +.EN +.SH +Identity +.P1 +void identity3(Matrix3 M) +.P2 +.EQ +bold M ~=~ left [ rpile { + 1 ~ 0 ~ 0 ~ 0 +above 0 ~ 1 ~ 0 ~ 0 +above 0 ~ 0 ~ 1 ~ 0 +above 0 ~ 0 ~ 0 ~ 1 +} right ] +.EN +.SH +Determinant +.P1 +double detm3(Matrix3 M) +.P2 +.EQ +det( bold M ) ~=~ rpile { + m sub 00 ( m sub 11 ( m sub 22 m sub 33 - m sub 23 m sub 32 ) + + m sub 12 ( m sub 23 m sub 31 - m sub 21 m sub 33 ) + + m sub 13 ( m sub 21 m sub 32 - m sub 22 m sub 31 ) ) +above -m sub 01 ( m sub 10 ( m sub 22 m sub 33 - m sub 23 m sub 32 ) + + m sub 12 ( m sub 23 m sub 30 - m sub 20 m sub 33 ) + + m sub 13 ( m sub 20 m sub 32 - m sub 22 m sub 30 ) ) +above +m sub 02 ( m sub 10 ( m sub 21 m sub 33 - m sub 23 m sub 31 ) + + m sub 11 ( m sub 23 m sub 30 - m sub 20 m sub 33 ) + + m sub 13 ( m sub 20 m sub 31 - m sub 21 m sub 30 ) ) +above -m sub 03 ( m sub 10 ( m sub 21 m sub 32 - m sub 22 m sub 31 ) + + m sub 11 ( m sub 22 m sub 30 - m sub 20 m sub 32 ) + + m sub 12 ( m sub 20 m sub 31 - m sub 21 m sub 30 ) ) +} +.EN +.NH 2 +Quaternion +.SH +Addition +.P1 +Quaternion addq(Quaternion q, Quaternion r) +.P2 +.EQ +q + r ~=~ ( r sub q + r sub r ,~ i sub q + i sub r ,~ j sub q + j sub r ,~ k sub q + k sub r ) +.EN +.SH +Substraction +.P1 +Quaternion subq(Quaternion q, Quaternion r) +.P2 +.EQ +q - r ~=~ ( r sub q - r sub r ,~ i sub q - i sub r ,~ j sub q - j sub r ,~ k sub q - k sub r ) +.EN +.SH +Multiplication +.P1 +Quaternion mulq(Quaternion q, Quaternion r) +.P2 +.EQ +q ~=~ [ r sub q ,~ v vec sub q ] +r ~=~ [ r sub r ,~ v vec sub r ] +qr ~=~ [ r sub q r sub r - v vec sub q • v vec sub r ,~ v vec sub r r sub q + v vec sub q r sub r + v vec sub q X v vec sub r ] +.EN +.SH +Scalar Multiplication +.P1 +Quaternion smulq(Quaternion q, double s) +.P2 +.EQ +qs ~=~ [ r sub q s ,~ i sub q s ,~ j sub q s ,~ k sub q s ] +.EN +.SH +Inverse +.P1 +Quaternion invq(Quaternion q) +.P2 +.EQ +q sup -1 ~=~ left ( r over {| q | sup 2} ,~ -i over {| q | sup 2} ,~ -j over {| q | sup 2} ,~ -k over {| q | sup 2} right ) +.EN +.SH +Magnitude/Length +.P1 +double qlen(Quaternion q) +.P2 +.EQ +| q | ~=~ sqrt { r sup 2 + i sup 2 + j sup 2 + k sup 2 } +.EN +.NH 2 +RFrame +.SH +Change of reference +.P1 +Point2 rframexform(Point2 p, RFrame rf) +.P2 +.NH 2 +RFrame3 +.SH +Change of reference +.P1 +Point3 rframexform3(Point3 p, RFrame3 rf) +.P2 diff --git a/libgeometry/doc/libgeometry.pdf b/libgeometry/doc/libgeometry.pdf Binary files differnew file mode 100644 index 0000000..3a49480 --- /dev/null +++ b/libgeometry/doc/libgeometry.pdf diff --git a/libgeometry/doc/libgeometry.ps b/libgeometry/doc/libgeometry.ps new file mode 100644 index 0000000..635b9cd --- /dev/null +++ b/libgeometry/doc/libgeometry.ps @@ -0,0 +1,2799 @@ +%!PS-Adobe-2.0 +%%Version: 0.1 +%%Creator: troff, Plan 9 edition +%%DocumentFonts: (atend) +%%Pages: (atend) +%%EndComments +% +% Version 3.3.2 prologue for troff files. +% + +/#copies 1 store +/aspectratio 1 def +/formsperpage 1 def +/landscape false def +/linewidth .3 def +/magnification 1 def +/margin 0 def +/orientation 0 def +/resolution 720 def +/rotation 1 def +/xoffset 0 def +/yoffset 0 def + +/roundpage true def +/useclippath true def +/pagebbox [0 0 612 792] def + +/R /Times-Roman def +/I /Times-Italic def +/B /Times-Bold def +/BI /Times-BoldItalic def +/H /Helvetica def +/HI /Helvetica-Oblique def +/HB /Helvetica-Bold def +/HX /Helvetica-BoldOblique def +/CW /Courier def +/CO /Courier def +/CI /Courier-Oblique def +/CB /Courier-Bold def +/CX /Courier-BoldOblique def +/PA /Palatino-Roman def +/PI /Palatino-Italic def +/PB /Palatino-Bold def +/PX /Palatino-BoldItalic def +/Hr /Helvetica-Narrow def +/Hi /Helvetica-Narrow-Oblique def +/Hb /Helvetica-Narrow-Bold def +/Hx /Helvetica-Narrow-BoldOblique def +/KR /Bookman-Light def +/KI /Bookman-LightItalic def +/KB /Bookman-Demi def +/KX /Bookman-DemiItalic def +/AR /AvantGarde-Book def +/AI /AvantGarde-BookOblique def +/AB /AvantGarde-Demi def +/AX /AvantGarde-DemiOblique def +/NR /NewCenturySchlbk-Roman def +/NI /NewCenturySchlbk-Italic def +/NB /NewCenturySchlbk-Bold def +/NX /NewCenturySchlbk-BoldItalic def +/ZD /ZapfDingbats def +/ZI /ZapfChancery-MediumItalic def +/S /S def +/S1 /S1 def +/GR /Symbol def + +/inch {72 mul} bind def +/min {2 copy gt {exch} if pop} bind def + +/setup { + counttomark 2 idiv {def} repeat pop + + landscape {/orientation 90 orientation add def} if + /scaling 72 resolution div def + linewidth setlinewidth + 1 setlinecap + + pagedimensions + xcenter ycenter translate + orientation rotation mul rotate + width 2 div neg height 2 div translate + xoffset inch yoffset inch neg translate + margin 2 div dup neg translate + magnification dup aspectratio mul scale + scaling scaling scale + + addmetrics + 0 0 moveto +} def + +/pagedimensions { + useclippath userdict /gotpagebbox known not and { + /pagebbox [clippath pathbbox newpath] def + roundpage currentdict /roundpagebbox known and {roundpagebbox} if + } if + pagebbox aload pop + 4 -1 roll exch 4 1 roll 4 copy + landscape {4 2 roll} if + sub /width exch def + sub /height exch def + add 2 div /xcenter exch def + add 2 div /ycenter exch def + userdict /gotpagebbox true put +} def + +/addmetrics { + /Symbol /S null Sdefs cf + /Times-Roman /S1 StandardEncoding dup length array copy S1defs cf +} def + +/pagesetup { + /page exch def + currentdict /pagedict known currentdict page known and { + page load pagedict exch get cvx exec + } if +} def + +/decodingdefs [ + {counttomark 2 idiv {y moveto show} repeat} + {neg /y exch def counttomark 2 idiv {y moveto show} repeat} + {neg moveto {2 index stringwidth pop sub exch div 0 32 4 -1 roll widthshow} repeat} + {neg moveto {spacewidth sub 0.0 32 4 -1 roll widthshow} repeat} + {counttomark 2 idiv {y moveto show} repeat} + {neg setfunnytext} +] def + +/setdecoding {/t decodingdefs 3 -1 roll get bind def} bind def + +/w {neg moveto show} bind def +/m {neg dup /y exch def moveto} bind def +/done {/lastpage where {pop lastpage} if} def + +/f { + dup /font exch def findfont exch + dup /ptsize exch def scaling div dup /size exch def scalefont setfont + linewidth ptsize mul scaling 10 mul div setlinewidth + /spacewidth ( ) stringwidth pop def +} bind def + +/changefont { + /fontheight exch def + /fontslant exch def + currentfont [ + 1 0 + fontheight ptsize div fontslant sin mul fontslant cos div + fontheight ptsize div + 0 0 + ] makefont setfont +} bind def + +/sf {f} bind def + +/cf { + dup length 2 idiv + /entries exch def + /chtab exch def + /newencoding exch def + /newfont exch def + + findfont dup length 1 add dict + /newdict exch def + {1 index /FID ne {newdict 3 1 roll put}{pop pop} ifelse} forall + + newencoding type /arraytype eq {newdict /Encoding newencoding put} if + + newdict /Metrics entries dict put + newdict /Metrics get + begin + chtab aload pop + 1 1 entries {pop def} for + newfont newdict definefont pop + end +} bind def + +% +% A few arrays used to adjust reference points and character widths in some +% of the printer resident fonts. If square roots are too high try changing +% the lines describing /radical and /radicalex to, +% +% /radical [0 -75 550 0] +% /radicalex [-50 -75 500 0] +% +% Move braceleftbt a bit - default PostScript character is off a bit. +% + +/Sdefs [ + /bracketlefttp [201 500] + /bracketleftbt [201 500] + /bracketrighttp [-81 380] + /bracketrightbt [-83 380] + /braceleftbt [203 490] + /bracketrightex [220 -125 500 0] + /radical [0 0 550 0] + /radicalex [-50 0 500 0] + /parenleftex [-20 -170 0 0] + /integral [100 -50 500 0] + /infinity [10 -75 730 0] +] def + +/S1defs [ + /underscore [0 80 500 0] + /endash [7 90 650 0] +] def +% +% Tries to round clipping path dimensions, as stored in array pagebbox, so they +% match one of the known sizes in the papersizes array. Lower left coordinates +% are always set to 0. +% + +/roundpagebbox { + 7 dict begin + /papersizes [8.5 inch 11 inch 14 inch 17 inch] def + + /mappapersize { + /val exch def + /slop .5 inch def + /diff slop def + /j 0 def + 0 1 papersizes length 1 sub { + /i exch def + papersizes i get val sub abs + dup diff le {/diff exch def /j i def} {pop} ifelse + } for + diff slop lt {papersizes j get} {val} ifelse + } def + + pagebbox 0 0 put + pagebbox 1 0 put + pagebbox dup 2 get mappapersize 2 exch put + pagebbox dup 3 get mappapersize 3 exch put + end +} bind def + +%%EndProlog +%%BeginSetup +mark +% +% Encoding vector and redefinition of findfont for the ISO Latin1 standard. +% The 18 characters missing from ROM based fonts on older printers are noted +% below. +% + +/ISOLatin1Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quoteright + /parenleft + /parenright + /asterisk + /plus + /comma + /minus + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /quoteleft + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /dotlessi + /grave + /acute + /circumflex + /tilde + /macron + /breve + /dotaccent + /dieresis + /.notdef + /ring + /cedilla + /.notdef + /hungarumlaut + /ogonek + /caron + /space + /exclamdown + /cent + /sterling + /currency + /yen + /brokenbar % missing + /section + /dieresis + /copyright + /ordfeminine + /guillemotleft + /logicalnot + /hyphen + /registered + /macron + /degree % missing + /plusminus % missing + /twosuperior % missing + /threesuperior % missing + /acute + /mu % missing + /paragraph + /periodcentered + /cedilla + /onesuperior % missing + /ordmasculine + /guillemotright + /onequarter % missing + /onehalf % missing + /threequarters % missing + /questiondown + /Agrave + /Aacute + /Acircumflex + /Atilde + /Adieresis + /Aring + /AE + /Ccedilla + /Egrave + /Eacute + /Ecircumflex + /Edieresis + /Igrave + /Iacute + /Icircumflex + /Idieresis + /Eth % missing + /Ntilde + /Ograve + /Oacute + /Ocircumflex + /Otilde + /Odieresis + /multiply % missing + /Oslash + /Ugrave + /Uacute + /Ucircumflex + /Udieresis + /Yacute % missing + /Thorn % missing + /germandbls + /agrave + /aacute + /acircumflex + /atilde + /adieresis + /aring + /ae + /ccedilla + /egrave + /eacute + /ecircumflex + /edieresis + /igrave + /iacute + /icircumflex + /idieresis + /eth % missing + /ntilde + /ograve + /oacute + /ocircumflex + /otilde + /odieresis + /divide % missing + /oslash + /ugrave + /uacute + /ucircumflex + /udieresis + /yacute % missing + /thorn % missing + /ydieresis +] def + +/NewFontDirectory FontDirectory maxlength dict def + +% +% Apparently no guarantee findfont is defined in systemdict so the obvious +% +% systemdict /findfont get exec +% +% can generate an error. So far the only exception is a VT600 (version 48.0). +% + +userdict /@RealFindfont known not { + userdict begin + /@RealFindfont systemdict begin /findfont load end def + end +} if + +/findfont { + dup NewFontDirectory exch known not { + dup + %dup systemdict /findfont get exec % not always in systemdict + dup userdict /@RealFindfont get exec + dup /Encoding get StandardEncoding eq { + dup length dict begin + {1 index /FID ne {def}{pop pop} ifelse} forall + /Encoding ISOLatin1Encoding def + currentdict + end + /DummyFontName exch definefont + } if + NewFontDirectory 3 1 roll put + } if + NewFontDirectory exch get +} bind def + +%%Patch from lp +%%EndPatch from lp + +setup +%%EndSetup +%%Page: 1 1 +/saveobj save def +mark +1 pagesetup +12 /LucidaSans-Demi f +(libgeometry) 2507 1220 w +10 /LucidaSans-Italic f +(Rodrigo G. L\363pez) 2469 1480 w +(rgl@antares-labs.eu) 2377 1760 w +10 /LucidaSansUnicode00 f +(Antares Telecom Laboratories) 2156 1960 w +(Albatera, Alicante) 2451 2100 w +10 /LucidaSans-Demi f +(1.) 720 2700 w +(Data Structures) 873 2700 w +(1.1.) 720 2940 w +(Point2) 962 2940 w +9 /LucidaTypewriter f +(struct) 920 3110 w +(Point2) 1375 3110 w +({) 1830 3110 w +(double) 1440 3220 w +(x,) 1895 3220 w +(y,) 2090 3220 w +(w;) 2285 3220 w +(};) 920 3330 w +10 /LucidaSans-Italic f +(Point2) 970 3546 w +10 /LucidaSansUnicode00 f +(represents) 1324 3546 w +(a) 1886 3546 w +(point) 1989 3546 w +(in) 2289 3546 w +(two-dimensional) 2428 3546 w +(projective) 3299 3546 w +(space,) 3823 3546 w +(which) 4179 3546 w +(itself) 4508 3546 w +(is) 4795 3546 w +(an) 4923 3546 w +(extension) 720 3666 w +(of) 1240 3666 w +(the) 1383 3666 w +(two-dimensional) 1583 3666 w +(euclidean) 2451 3666 w +(space) 2959 3666 w +(that) 3280 3666 w +(allows) 3516 3666 w +(us) 3862 3666 w +(to) 4019 3666 w +(work) 4161 3666 w +(with) 4442 3666 w +(vectors) 4691 3666 w +(and compose affine transformations in a friendly manner.) 720 3786 w +(A point) 3589 3786 w +(\() 2696 3966 w +(x) 2737 3966 w +(,) 2806 3966 w +(y) 2846 3966 w +(,) 2906 3966 w +(w) 2946 3966 w +(\)) 3031 3966 w +(made) 720 4146 w +(out) 1027 4146 w +(of) 1227 4146 w +(homogenous) 1365 4146 w +(coordinates) 2036 4146 w +10 /LucidaSans-Italic f +(x) 2643 4146 w +10 /LucidaSansUnicode00 f +(,) 2697 4146 w +10 /LucidaSans-Italic f +(y) 2769 4146 w +10 /LucidaSansUnicode00 f +(,) 2824 4146 w +(and) 2896 4146 w +10 /LucidaSans-Italic f +(w) 3116 4146 w +10 /LucidaSansUnicode00 f +(,) 3194 4146 w +(yields) 3267 4146 w +(a) 3588 4146 w +(point) 3684 4146 w +(with) 3977 4146 w +(cartesian) 4223 4146 w +(coordi\255) 4701 4146 w +(nates) 720 4266 w +(\() 2588 4446 w +(x) 2629 4446 w +(/) 2698 4446 w +(w) 2759 4446 w +(,) 2844 4446 w +(y) 2884 4446 w +(/) 2944 4446 w +(w) 3005 4446 w +(\)) 3090 4446 w +(.) 3139 4446 w +10 /LucidaSans-Demi f +(1.2.) 720 4746 w +(Point3) 962 4746 w +9 /LucidaTypewriter f +(struct) 920 4916 w +(Point3) 1375 4916 w +({) 1830 4916 w +(double) 1440 5026 w +(x,) 1895 5026 w +(y,) 2090 5026 w +(z,) 2285 5026 w +(w;) 2480 5026 w +(};) 920 5136 w +10 /LucidaSans-Italic f +(Point3) 970 5352 w +10 /LucidaSansUnicode00 f +(is a point in three-dimensional projective space.) 1309 5352 w +10 /LucidaSans-Demi f +(1.3.) 720 5592 w +(Matrix) 962 5592 w +9 /LucidaTypewriter f +(typedef) 920 5762 w +(double) 1440 5762 w +(Matrix[3][3];) 1895 5762 w +10 /LucidaSans-Italic f +(Matrix) 970 5978 w +10 /LucidaSansUnicode00 f +(represents) 1341 5978 w +(a) 1914 5978 w +(3x3) 2028 5978 w +(matrix,) 2274 5978 w +(thought) 2681 5978 w +(to) 3123 5978 w +(compose) 3280 5978 w +(affine) 3775 5978 w +(transformations) 4110 5978 w +(to) 4942 5978 w +(apply to homogeneous 2D points.) 720 6098 w +10 /LucidaSans-Demi f +(1.4.) 720 6338 w +(Matrix3) 962 6338 w +9 /LucidaTypewriter f +(typedef) 920 6508 w +(double) 1440 6508 w +(Matrix3[4][4];) 1895 6508 w +10 /LucidaSans-Italic f +(Matrix3) 970 6724 w +10 /LucidaSansUnicode00 f +(represents) 1398 6724 w +(a) 1964 6724 w +(4x4) 2071 6724 w +(matrix,) 2310 6724 w +(thought) 2711 6724 w +(to) 3147 6724 w +(compose) 3298 6724 w +(affine) 3787 6724 w +(transformations) 4116 6724 w +(to) 4942 6724 w +(apply to homogeneous 3D points.) 720 6844 w +8 /S1 f +(__________________) 720 6980 w +8 /LucidaSansUnicode00 f +(ACHTUNG!) 720 7080 w +(this) 1163 7080 w +(is) 1333 7080 w +(a) 1423 7080 w +8 /LucidaSans-Demi f +(WORK) 1493 7080 w +(IN) 1769 7080 w +(PROGRESS) 1883 7080 w +cleartomark +showpage +saveobj restore +%%EndPage: 1 1 +%%Page: 2 2 +/saveobj save def +mark +2 pagesetup +10 /LucidaSansUnicode00 f +(\255 2 \255) 2783 480 w +10 /LucidaSans-Demi f +(1.5.) 720 840 w +(Quaternion) 962 840 w +9 /LucidaTypewriter f +(struct) 920 1010 w +(Quaternion) 1375 1010 w +({) 2090 1010 w +(double) 1440 1120 w +(r,) 1895 1120 w +(i,) 2090 1120 w +(j,) 2285 1120 w +(k;) 2480 1120 w +(};) 920 1230 w +10 /LucidaSans-Italic f +(Quaternions) 970 1446 w +10 /LucidaSansUnicode00 f +(are) 1623 1446 w +(a) 1829 1446 w +(numbering) 1938 1446 w +(system) 2522 1446 w +(that) 2916 1446 w +(extends) 3161 1446 w +(the) 3601 1446 w +(complex) 3810 1446 w +(numbers) 4279 1446 w +(up) 4762 1446 w +(to) 4942 1446 w +(four-dimensional) 720 1566 w +(space,) 1607 1566 w +(and) 1953 1566 w +(are) 2171 1566 w +(used) 2361 1566 w +(to) 2631 1566 w +(apply) 2767 1566 w +(rotations) 3067 1566 w +(and) 3539 1566 w +(model) 3757 1566 w +(mechanical) 4096 1566 w +(interac\255) 4676 1566 w +(tions) 720 1686 w +(in) 1015 1686 w +(3D) 1161 1686 w +(space.) 1354 1686 w +(Their) 1749 1686 w +(main) 2055 1686 w +(advantages) 2349 1686 w +(with) 2952 1686 w +(respect) 3212 1686 w +(to) 3622 1686 w +(their) 3775 1686 w +(matrix) 4055 1686 w +(relatives) 4426 1686 w +(are) 4888 1686 w +(increased computational and storage performance and gimbal lock avoidance.) 720 1806 w +10 /LucidaSans-Demi f +(2.) 720 2046 w +(Algorithms) 873 2046 w +(2.1.) 720 2286 w +(Point2) 962 2286 w +(Addition) 720 2526 w +9 /LucidaTypewriter f +(Point2) 920 2696 w +(addpt2\(Point2) 1375 2696 w +(a,) 2285 2696 w +(Point2) 2480 2696 w +(b\)) 2935 2696 w +10 /LucidaSansUnicode00 f +(a) 2051 2971 w +10 /S f +(+) 2122 2971 w +10 /LucidaSansUnicode00 f +(b) 2193 2971 w +10 /S f +(=) 2312 2971 w +10 /LucidaSansUnicode00 f +10 /S f +(\354) 2431 2934 w +(\356) 2431 3034 w +10 /LucidaSansUnicode00 f +(x) 2480 2971 w +7 /LucidaSansUnicode00 f +(a) 2552 2991 w +10 /S f +(+) 2615 2971 w +10 /LucidaSansUnicode00 f +(x) 2686 2971 w +7 /LucidaSansUnicode00 f +(b) 2758 2991 w +10 /LucidaSansUnicode00 f +(,) 2818 2971 w +(y) 2898 2971 w +7 /LucidaSansUnicode00 f +(a) 2961 2991 w +10 /S f +(+) 3024 2971 w +10 /LucidaSansUnicode00 f +(y) 3095 2971 w +7 /LucidaSansUnicode00 f +(b) 3158 2991 w +10 /LucidaSansUnicode00 f +(,) 3218 2971 w +(w) 3298 2971 w +7 /LucidaSansUnicode00 f +(a) 3386 2991 w +10 /S f +(+) 3449 2971 w +10 /LucidaSansUnicode00 f +(w) 3520 2971 w +7 /LucidaSansUnicode00 f +(b) 3608 2991 w +10 /S f +(\374) 3660 2934 w +(\376) 3660 3034 w +10 /LucidaSans-Demi f +(Substraction) 720 3326 w +9 /LucidaTypewriter f +(Point2) 920 3496 w +(subpt2\(Point2) 1375 3496 w +(a,) 2285 3496 w +(Point2) 2480 3496 w +(b\)) 2935 3496 w +10 /LucidaSansUnicode00 f +(a) 2051 3771 w +10 /S f +(-) 2122 3771 w +10 /LucidaSansUnicode00 f +(b) 2193 3771 w +10 /S f +(=) 2312 3771 w +10 /LucidaSansUnicode00 f +10 /S f +(\354) 2431 3734 w +(\356) 2431 3834 w +10 /LucidaSansUnicode00 f +(x) 2480 3771 w +7 /LucidaSansUnicode00 f +(a) 2552 3791 w +10 /S f +(-) 2615 3771 w +10 /LucidaSansUnicode00 f +(x) 2686 3771 w +7 /LucidaSansUnicode00 f +(b) 2758 3791 w +10 /LucidaSansUnicode00 f +(,) 2818 3771 w +(y) 2898 3771 w +7 /LucidaSansUnicode00 f +(a) 2961 3791 w +10 /S f +(-) 3024 3771 w +10 /LucidaSansUnicode00 f +(y) 3095 3771 w +7 /LucidaSansUnicode00 f +(b) 3158 3791 w +10 /LucidaSansUnicode00 f +(,) 3218 3771 w +(w) 3298 3771 w +7 /LucidaSansUnicode00 f +(a) 3386 3791 w +10 /S f +(-) 3449 3771 w +10 /LucidaSansUnicode00 f +(w) 3520 3771 w +7 /LucidaSansUnicode00 f +(b) 3608 3791 w +10 /S f +(\374) 3660 3734 w +(\376) 3660 3834 w +10 /LucidaSans-Demi f +(Multiplication) 720 4126 w +9 /LucidaTypewriter f +(Point2) 920 4296 w +(mulpt2\(Point2) 1375 4296 w +(p,) 2285 4296 w +(double) 2480 4296 w +(s\)) 2935 4296 w +10 /LucidaSansUnicode00 f +(p) 2395 4536 w +(*) 2466 4536 w +(s) 2522 4536 w +10 /S f +(=) 2629 4536 w +10 /LucidaSansUnicode00 f +10 /S f +(\354) 2748 4499 w +(\356) 2748 4599 w +10 /LucidaSansUnicode00 f +(xs) 2797 4546 w +(,) 2917 4546 w +(ys) 2997 4546 w +(,) 3108 4546 w +(ws) 3188 4546 w +10 /S f +(\374) 3316 4499 w +(\376) 3316 4599 w +10 /LucidaSans-Demi f +(Division) 720 4841 w +9 /LucidaTypewriter f +(Point2) 920 5011 w +(divpt2\(Point2) 1375 5011 w +(p,) 2285 5011 w +(double) 2480 5011 w +(s\)) 2935 5011 w +10 /LucidaSansUnicode00 f +(p) 2394 5336 w +(/) 2465 5336 w +(s) 2526 5336 w +10 /S f +(=) 2633 5336 w +10 /LucidaSansUnicode00 f +10 /S f +(\354) 2752 5249 w +(\357) 2752 5349 w +(\356) 2752 5449 w +10 /LucidaSansUnicode00 f +(s) 2831 5406 w +(x) 2826 5276 w +10 /S1 f +(_) 2811 5306 w +(_) 2852 5306 w +10 /LucidaSansUnicode00 f +(,) 2920 5336 w +(s) 3025 5406 w +(y) 3025 5276 w +10 /S1 f +(_) 3010 5306 w +(_) 3042 5306 w +10 /LucidaSansUnicode00 f +(,) 3110 5336 w +(s) 3228 5406 w +(w) 3215 5276 w +10 /S1 f +(_) 3200 5306 w +(__) 3207 5306 w +10 /S f +(\374) 3317 5249 w +(\357) 3317 5349 w +(\376) 3317 5449 w +10 /LucidaSans-Demi f +(Vector Dot Product) 720 5741 w +9 /LucidaTypewriter f +(double) 920 5911 w +(dotvec2\(Point2) 1375 5911 w +(a,) 2350 5911 w +(Point2) 2545 5911 w +(b\)) 3000 5911 w +10 /LucidaSansUnicode00 f +(a) 2375 6156 w +7 /LucidaSansUnicode21 f +(\222) 2370 6106 w +10 /LucidaSansUnicode00 f +10 /LucidaSansUnicode20 f +(") 2479 6156 w +10 /LucidaSansUnicode00 f +(b) 2583 6156 w +7 /LucidaSansUnicode21 f +(\222) 2582 6081 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2703 6156 w +10 /LucidaSansUnicode00 f +(x) 2814 6156 w +7 /LucidaSansUnicode00 f +(a) 2886 6176 w +10 /LucidaSansUnicode00 f +(x) 2941 6156 w +7 /LucidaSansUnicode00 f +(b) 3013 6176 w +10 /S f +(+) 3081 6156 w +10 /LucidaSansUnicode00 f +(y) 3152 6156 w +7 /LucidaSansUnicode00 f +(a) 3215 6176 w +10 /LucidaSansUnicode00 f +(y) 3270 6156 w +7 /LucidaSansUnicode00 f +(b) 3333 6176 w +10 /LucidaSans-Demi f +(Vector Magnitude/Length) 720 6456 w +9 /LucidaTypewriter f +(double) 920 6626 w +(vec2len\(Point2) 1375 6626 w +(v\)) 2350 6626 w +10 /LucidaSansUnicode00 f +(|) 2509 6901 w +(v) 2557 6884 w +7 /LucidaSansUnicode21 f +(\222) 2550 6834 w +10 /LucidaSansUnicode00 f +(|) 2609 6901 w +10 /S f +(=) 2705 6884 w +10 /LucidaSansUnicode00 f +12 /LucidaSansUnicode22 f +(\032) 2816 6884 w +12 /S f +(`) 2913 6884 w +(`````) 2943 6884 w +10 /LucidaSansUnicode00 f +(x) 2921 6884 w +7 /LucidaSansUnicode00 f +(2) 2987 6844 w +10 /S f +(+) 3055 6884 w +10 /LucidaSansUnicode00 f +(y) 3126 6884 w +7 /LucidaSansUnicode00 f +(2) 3183 6844 w +cleartomark +showpage +saveobj restore +%%EndPage: 2 2 +%%Page: 3 3 +/saveobj save def +mark +3 pagesetup +10 /LucidaSansUnicode00 f +(\255 3 \255) 2783 480 w +10 /LucidaSans-Demi f +(Vector Normalization) 720 840 w +9 /LucidaTypewriter f +(Point2) 920 1010 w +(normvec2\(Point2) 1375 1010 w +(v\)) 2415 1010 w +10 /LucidaSansUnicode00 f +(n) 2502 1335 w +7 /LucidaSansUnicode21 f +(\222) 2500 1285 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2620 1335 w +10 /LucidaSansUnicode00 f +10 /S f +(\354) 2739 1248 w +(\357) 2739 1348 w +(\356) 2739 1448 w +10 /LucidaSansUnicode00 f +(|) 2813 1447 w +(v) 2861 1430 w +7 /LucidaSansUnicode21 f +(\222) 2854 1380 w +10 /LucidaSansUnicode00 f +(|) 2913 1447 w +(x) 2841 1275 w +10 /S1 f +(_) 2799 1305 w +(__) 2845 1305 w +10 /LucidaSansUnicode00 f +(,) 2963 1335 w +(|) 3068 1447 w +(v) 3116 1430 w +7 /LucidaSansUnicode21 f +(\222) 3109 1380 w +10 /LucidaSansUnicode00 f +(|) 3168 1447 w +(y) 3100 1275 w +10 /S1 f +(_) 3053 1305 w +(__) 3099 1305 w +10 /S f +(\374) 3209 1248 w +(\357) 3209 1348 w +(\376) 3209 1448 w +10 /LucidaSans-Demi f +(2.2.) 720 1740 w +(Point3) 962 1740 w +(Addition) 720 1980 w +9 /LucidaTypewriter f +(Point3) 920 2150 w +(addpt3\(Point3) 1375 2150 w +(a,) 2285 2150 w +(Point3) 2480 2150 w +(b\)) 2935 2150 w +10 /LucidaSansUnicode00 f +(a) 1846 2425 w +10 /S f +(+) 1917 2425 w +10 /LucidaSansUnicode00 f +(b) 1988 2425 w +10 /S f +(=) 2107 2425 w +10 /LucidaSansUnicode00 f +10 /S f +(\354) 2226 2388 w +(\356) 2226 2488 w +10 /LucidaSansUnicode00 f +(x) 2275 2425 w +7 /LucidaSansUnicode00 f +(a) 2347 2445 w +10 /S f +(+) 2410 2425 w +10 /LucidaSansUnicode00 f +(x) 2481 2425 w +7 /LucidaSansUnicode00 f +(b) 2553 2445 w +10 /LucidaSansUnicode00 f +(,) 2613 2425 w +(y) 2693 2425 w +7 /LucidaSansUnicode00 f +(a) 2756 2445 w +10 /S f +(+) 2819 2425 w +10 /LucidaSansUnicode00 f +(y) 2890 2425 w +7 /LucidaSansUnicode00 f +(b) 2953 2445 w +10 /LucidaSansUnicode00 f +(,) 3013 2425 w +(z) 3093 2425 w +7 /LucidaSansUnicode00 f +(a) 3161 2445 w +10 /S f +(+) 3224 2425 w +10 /LucidaSansUnicode00 f +(z) 3295 2425 w +7 /LucidaSansUnicode00 f +(b) 3363 2445 w +10 /LucidaSansUnicode00 f +(,) 3423 2425 w +(w) 3503 2425 w +7 /LucidaSansUnicode00 f +(a) 3591 2445 w +10 /S f +(+) 3654 2425 w +10 /LucidaSansUnicode00 f +(w) 3725 2425 w +7 /LucidaSansUnicode00 f +(b) 3813 2445 w +10 /S f +(\374) 3865 2388 w +(\376) 3865 2488 w +10 /LucidaSans-Demi f +(Substraction) 720 2780 w +9 /LucidaTypewriter f +(Point3) 920 2950 w +(subpt3\(Point3) 1375 2950 w +(a,) 2285 2950 w +(Point3) 2480 2950 w +(b\)) 2935 2950 w +10 /LucidaSansUnicode00 f +(a) 1846 3225 w +10 /S f +(-) 1917 3225 w +10 /LucidaSansUnicode00 f +(b) 1988 3225 w +10 /S f +(=) 2107 3225 w +10 /LucidaSansUnicode00 f +10 /S f +(\354) 2226 3188 w +(\356) 2226 3288 w +10 /LucidaSansUnicode00 f +(x) 2275 3225 w +7 /LucidaSansUnicode00 f +(a) 2347 3245 w +10 /S f +(-) 2410 3225 w +10 /LucidaSansUnicode00 f +(x) 2481 3225 w +7 /LucidaSansUnicode00 f +(b) 2553 3245 w +10 /LucidaSansUnicode00 f +(,) 2613 3225 w +(y) 2693 3225 w +7 /LucidaSansUnicode00 f +(a) 2756 3245 w +10 /S f +(-) 2819 3225 w +10 /LucidaSansUnicode00 f +(y) 2890 3225 w +7 /LucidaSansUnicode00 f +(b) 2953 3245 w +10 /LucidaSansUnicode00 f +(,) 3013 3225 w +(z) 3093 3225 w +7 /LucidaSansUnicode00 f +(a) 3161 3245 w +10 /S f +(-) 3224 3225 w +10 /LucidaSansUnicode00 f +(z) 3295 3225 w +7 /LucidaSansUnicode00 f +(b) 3363 3245 w +10 /LucidaSansUnicode00 f +(,) 3423 3225 w +(w) 3503 3225 w +7 /LucidaSansUnicode00 f +(a) 3591 3245 w +10 /S f +(-) 3654 3225 w +10 /LucidaSansUnicode00 f +(w) 3725 3225 w +7 /LucidaSansUnicode00 f +(b) 3813 3245 w +10 /S f +(\374) 3865 3188 w +(\376) 3865 3288 w +10 /LucidaSans-Demi f +(Multiplication) 720 3580 w +9 /LucidaTypewriter f +(Point3) 920 3750 w +(mulpt3\(Point3) 1375 3750 w +(p,) 2285 3750 w +(double) 2480 3750 w +(s\)) 2935 3750 w +10 /LucidaSansUnicode00 f +(p) 2297 3990 w +(*) 2368 3990 w +(s) 2424 3990 w +10 /S f +(=) 2531 3990 w +10 /LucidaSansUnicode00 f +10 /S f +(\354) 2650 3953 w +(\356) 2650 4053 w +10 /LucidaSansUnicode00 f +(xs) 2699 4000 w +(,) 2819 4000 w +(ys) 2899 4000 w +(,) 3010 4000 w +(zs) 3090 4000 w +(,) 3206 4000 w +(ws) 3286 4000 w +10 /S f +(\374) 3414 3953 w +(\376) 3414 4053 w +10 /LucidaSans-Demi f +(Division) 720 4295 w +9 /LucidaTypewriter f +(Point3) 920 4465 w +(divpt3\(Point3) 1375 4465 w +(p,) 2285 4465 w +(double) 2480 4465 w +(s\)) 2935 4465 w +10 /LucidaSansUnicode00 f +(p) 2296 4790 w +(/) 2367 4790 w +(s) 2428 4790 w +10 /S f +(=) 2535 4790 w +10 /LucidaSansUnicode00 f +10 /S f +(\354) 2654 4703 w +(\357) 2654 4803 w +(\356) 2654 4903 w +10 /LucidaSansUnicode00 f +(s) 2733 4860 w +(x) 2728 4730 w +10 /S1 f +(_) 2713 4760 w +(_) 2754 4760 w +10 /LucidaSansUnicode00 f +(,) 2822 4790 w +(s) 2927 4860 w +(y) 2927 4730 w +10 /S1 f +(_) 2912 4760 w +(_) 2944 4760 w +10 /LucidaSansUnicode00 f +(,) 3012 4790 w +(s) 3120 4860 w +(z) 3117 4730 w +10 /S1 f +(_) 3102 4760 w +(_) 3139 4760 w +10 /LucidaSansUnicode00 f +(,) 3207 4790 w +(s) 3325 4860 w +(w) 3312 4730 w +10 /S1 f +(_) 3297 4760 w +(__) 3304 4760 w +10 /S f +(\374) 3414 4703 w +(\357) 3414 4803 w +(\376) 3414 4903 w +10 /LucidaSans-Demi f +(Vector Dot Product) 720 5195 w +9 /LucidaTypewriter f +(double) 920 5365 w +(dotvec3\(Point3) 1375 5365 w +(a,) 2350 5365 w +(Point3) 2545 5365 w +(b\)) 3000 5365 w +10 /LucidaSansUnicode00 f +(a) 2210 5610 w +7 /LucidaSansUnicode21 f +(\222) 2205 5560 w +10 /LucidaSansUnicode00 f +10 /LucidaSansUnicode20 f +(") 2314 5610 w +10 /LucidaSansUnicode00 f +(b) 2418 5610 w +7 /LucidaSansUnicode21 f +(\222) 2417 5535 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2538 5610 w +10 /LucidaSansUnicode00 f +(x) 2649 5610 w +7 /LucidaSansUnicode00 f +(a) 2721 5630 w +10 /LucidaSansUnicode00 f +(x) 2776 5610 w +7 /LucidaSansUnicode00 f +(b) 2848 5630 w +10 /S f +(+) 2916 5610 w +10 /LucidaSansUnicode00 f +(y) 2987 5610 w +7 /LucidaSansUnicode00 f +(a) 3050 5630 w +10 /LucidaSansUnicode00 f +(y) 3105 5610 w +7 /LucidaSansUnicode00 f +(b) 3168 5630 w +10 /S f +(+) 3236 5610 w +10 /LucidaSansUnicode00 f +(z) 3307 5610 w +7 /LucidaSansUnicode00 f +(a) 3375 5630 w +10 /LucidaSansUnicode00 f +(z) 3430 5610 w +7 /LucidaSansUnicode00 f +(b) 3498 5630 w +10 /LucidaSans-Demi f +(Vector Cross Product) 720 5910 w +9 /LucidaTypewriter f +(double) 920 6080 w +(crossvec3\(Point3) 1375 6080 w +(a,) 2480 6080 w +(Point3) 2675 6080 w +(b\)) 3130 6080 w +10 /LucidaSansUnicode00 f +(a) 1650 6355 w +7 /LucidaSansUnicode21 f +(\222) 1645 6305 w +10 /LucidaSansUnicode00 f +(\327) 1754 6355 w +(b) 1882 6355 w +7 /LucidaSansUnicode21 f +(\222) 1881 6280 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2002 6355 w +10 /LucidaSansUnicode00 f +10 /S f +(\354) 2121 6318 w +(\356) 2121 6418 w +10 /LucidaSansUnicode00 f +(y) 2170 6355 w +7 /LucidaSansUnicode00 f +(a) 2233 6375 w +10 /LucidaSansUnicode00 f +(z) 2288 6355 w +7 /LucidaSansUnicode00 f +(b) 2356 6375 w +10 /S f +(-) 2424 6355 w +10 /LucidaSansUnicode00 f +(z) 2495 6355 w +7 /LucidaSansUnicode00 f +(a) 2563 6375 w +10 /LucidaSansUnicode00 f +(y) 2618 6355 w +7 /LucidaSansUnicode00 f +(b) 2681 6375 w +10 /LucidaSansUnicode00 f +(,) 2741 6355 w +(z) 2821 6355 w +7 /LucidaSansUnicode00 f +(a) 2889 6375 w +10 /LucidaSansUnicode00 f +(x) 2944 6355 w +7 /LucidaSansUnicode00 f +(b) 3016 6375 w +10 /S f +(-) 3084 6355 w +10 /LucidaSansUnicode00 f +(x) 3155 6355 w +7 /LucidaSansUnicode00 f +(a) 3227 6375 w +10 /LucidaSansUnicode00 f +(z) 3282 6355 w +7 /LucidaSansUnicode00 f +(b) 3350 6375 w +10 /LucidaSansUnicode00 f +(,) 3410 6355 w +(x) 3490 6355 w +7 /LucidaSansUnicode00 f +(a) 3562 6375 w +10 /LucidaSansUnicode00 f +(y) 3617 6355 w +7 /LucidaSansUnicode00 f +(b) 3680 6375 w +10 /S f +(-) 3748 6355 w +10 /LucidaSansUnicode00 f +(y) 3819 6355 w +7 /LucidaSansUnicode00 f +(a) 3882 6375 w +10 /LucidaSansUnicode00 f +(x) 3937 6355 w +7 /LucidaSansUnicode00 f +(b) 4009 6375 w +10 /S f +(\374) 4061 6318 w +(\376) 4061 6418 w +10 /LucidaSans-Demi f +(Vector Magnitude/Length) 720 6710 w +9 /LucidaTypewriter f +(double) 920 6880 w +(vec3len\(Point3) 1375 6880 w +(v\)) 2350 6880 w +10 /LucidaSansUnicode00 f +(|) 2408 7155 w +(v) 2456 7138 w +7 /LucidaSansUnicode21 f +(\222) 2449 7088 w +10 /LucidaSansUnicode00 f +(|) 2508 7155 w +10 /S f +(=) 2604 7138 w +10 /LucidaSansUnicode00 f +12 /LucidaSansUnicode22 f +(\032) 2715 7138 w +12 /S f +(`) 2812 7138 w +(````````) 2863 7138 w +10 /LucidaSansUnicode00 f +(x) 2820 7138 w +7 /LucidaSansUnicode00 f +(2) 2886 7098 w +10 /S f +(+) 2954 7138 w +10 /LucidaSansUnicode00 f +(y) 3025 7138 w +7 /LucidaSansUnicode00 f +(2) 3082 7098 w +10 /S f +(+) 3150 7138 w +10 /LucidaSansUnicode00 f +(z) 3221 7138 w +7 /LucidaSansUnicode00 f +(2) 3283 7098 w +cleartomark +showpage +saveobj restore +%%EndPage: 3 3 +%%Page: 4 4 +/saveobj save def +mark +4 pagesetup +10 /LucidaSansUnicode00 f +(\255 4 \255) 2783 480 w +10 /LucidaSans-Demi f +(Vector Normalization) 720 840 w +9 /LucidaTypewriter f +(Point3) 920 1010 w +(normvec3\(Point3) 1375 1010 w +(v\)) 2415 1010 w +10 /LucidaSansUnicode00 f +(n) 2374 1335 w +7 /LucidaSansUnicode21 f +(\222) 2372 1285 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2492 1335 w +10 /LucidaSansUnicode00 f +10 /S f +(\354) 2611 1248 w +(\357) 2611 1348 w +(\356) 2611 1448 w +10 /LucidaSansUnicode00 f +(|) 2685 1447 w +(v) 2733 1430 w +7 /LucidaSansUnicode21 f +(\222) 2726 1380 w +10 /LucidaSansUnicode00 f +(|) 2785 1447 w +(x) 2713 1275 w +10 /S1 f +(_) 2671 1305 w +(__) 2717 1305 w +10 /LucidaSansUnicode00 f +(,) 2835 1335 w +(|) 2940 1447 w +(v) 2988 1430 w +7 /LucidaSansUnicode21 f +(\222) 2981 1380 w +10 /LucidaSansUnicode00 f +(|) 3040 1447 w +(y) 2972 1275 w +10 /S1 f +(_) 2925 1305 w +(__) 2971 1305 w +10 /LucidaSansUnicode00 f +(,) 3089 1335 w +(|) 3194 1447 w +(v) 3242 1430 w +7 /LucidaSansUnicode21 f +(\222) 3235 1380 w +10 /LucidaSansUnicode00 f +(|) 3294 1447 w +(z) 3224 1275 w +10 /S1 f +(_) 3180 1305 w +(__) 3226 1305 w +10 /S f +(\374) 3336 1248 w +(\357) 3336 1348 w +(\376) 3336 1448 w +10 /LucidaSans-Demi f +(2.3.) 720 1740 w +(Matrix) 962 1740 w +(Addition) 720 1980 w +9 /LucidaTypewriter f +(void) 920 2150 w +(addm\(Matrix) 1245 2150 w +(A,) 2025 2150 w +(Matrix) 2220 2150 w +(B\)) 2675 2150 w +10 /LucidaSansUnicode00 f +(\() 2393 2390 w +10 /LucidaSans-Demi f +(A) 2434 2390 w +10 /S f +(+) 2524 2390 w +10 /LucidaSans-Demi f +(B) 2595 2390 w +10 /LucidaSansUnicode00 f +(\)) 2666 2390 w +7 /LucidaSansUnicode00 f +(i) 2710 2410 w +(,) 2735 2410 w +(j) 2762 2410 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2847 2390 w +10 /LucidaSansUnicode00 f +10 /LucidaSans-Demi f +(A) 2958 2390 w +7 /LucidaSansUnicode00 f +(i) 3043 2410 w +(,) 3068 2410 w +(j) 3095 2410 w +10 /S f +(+) 3140 2390 w +10 /LucidaSans-Demi f +(B) 3211 2390 w +7 /LucidaSansUnicode00 f +(i) 3285 2410 w +(,) 3310 2410 w +(j) 3337 2410 w +10 /LucidaSans-Demi f +(Substraction) 720 2690 w +9 /LucidaTypewriter f +(void) 920 2860 w +(subm\(Matrix) 1245 2860 w +(A,) 2025 2860 w +(Matrix) 2220 2860 w +(B\)) 2675 2860 w +10 /LucidaSansUnicode00 f +(\() 2393 3100 w +10 /LucidaSans-Demi f +(A) 2434 3100 w +10 /S f +(-) 2524 3100 w +10 /LucidaSans-Demi f +(B) 2595 3100 w +10 /LucidaSansUnicode00 f +(\)) 2666 3100 w +7 /LucidaSansUnicode00 f +(i) 2710 3120 w +(,) 2735 3120 w +(j) 2762 3120 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2847 3100 w +10 /LucidaSansUnicode00 f +10 /LucidaSans-Demi f +(A) 2958 3100 w +7 /LucidaSansUnicode00 f +(i) 3043 3120 w +(,) 3068 3120 w +(j) 3095 3120 w +10 /S f +(-) 3140 3100 w +10 /LucidaSans-Demi f +(B) 3211 3100 w +7 /LucidaSansUnicode00 f +(i) 3285 3120 w +(,) 3310 3120 w +(j) 3337 3120 w +10 /LucidaSans-Demi f +(Multiplication) 720 3400 w +9 /LucidaTypewriter f +(void) 920 3570 w +(mulm\(Matrix) 1245 3570 w +(A,) 2025 3570 w +(Matrix) 2220 3570 w +(B\)) 2675 3570 w +10 /S f +(\351) 2370 3823 w +(\353) 2370 3923 w +10 /LucidaSans-Demi f +(AB) 2420 3870 w +10 /S f +(\371) 2557 3823 w +(\373) 2557 3923 w +7 /LucidaSansUnicode00 f +(i) 2606 3905 w +(,) 2631 3905 w +(j) 2658 3905 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2743 3860 w +10 /LucidaSansUnicode00 f +7 /LucidaSansUnicode00 f +(k) 2847 3960 w +7 /S f +(=) 2899 3960 w +7 /LucidaSansUnicode00 f +(0) 2949 3960 w +15 /S f +(S) 2876 3890 w +7 /LucidaSansUnicode00 f +(3) 2846 3760 w +7 /S f +(-) 2901 3760 w +7 /LucidaSansUnicode00 f +(1) 2951 3760 w +10 /LucidaSans-Demi f +(A) 3027 3860 w +7 /LucidaSansUnicode00 f +(i) 3112 3880 w +(,) 3137 3880 w +(k) 3164 3880 w +10 /LucidaSans-Demi f +(B) 3221 3860 w +7 /LucidaSansUnicode00 f +(k) 3295 3880 w +(,) 3341 3880 w +(j) 3368 3880 w +10 /LucidaSans-Demi f +(Transpose) 720 4240 w +9 /LucidaTypewriter f +(void) 920 4410 w +(transposem\(Matrix) 1245 4410 w +(M\)) 2415 4410 w +10 /LucidaSansUnicode00 f +(\() 2552 4650 w +10 /LucidaSans-Demi f +(M) 2593 4650 w +7 /LucidaSansUnicode00 f +(T) 2689 4610 w +10 /LucidaSansUnicode00 f +(\)) 2749 4650 w +7 /LucidaSansUnicode00 f +(i) 2793 4670 w +(,) 2818 4670 w +(j) 2845 4670 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2930 4650 w +10 /LucidaSansUnicode00 f +10 /LucidaSans-Demi f +(A) 3041 4650 w +7 /LucidaSansUnicode00 f +(j) 3126 4670 w +(,) 3152 4670 w +(i) 3179 4670 w +10 /LucidaSans-Demi f +(Identity) 720 4950 w +9 /LucidaTypewriter f +(void) 920 5120 w +(identity\(Matrix) 1245 5120 w +(M\)) 2285 5120 w +10 /LucidaSans-Demi f +(M) 2560 5495 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2707 5495 w +10 /LucidaSansUnicode00 f +10 /S f +(\351) 2826 5358 w +(\357) 2826 5458 w +(\357) 2826 5558 w +(\353) 2826 5658 w +10 /LucidaSansUnicode00 f +(0) 2876 5645 w +(0) 2987 5645 w +(1) 3098 5645 w +(0) 2876 5505 w +(1) 2987 5505 w +(0) 3098 5505 w +(1) 2876 5365 w +(0) 2987 5365 w +(0) 3098 5365 w +10 /S f +(\371) 3161 5358 w +(\357) 3161 5458 w +(\357) 3161 5558 w +(\373) 3161 5658 w +10 /LucidaSans-Demi f +(Determinant) 720 5950 w +9 /LucidaTypewriter f +(double) 920 6120 w +(detm\(Matrix) 1375 6120 w +(M\)) 2155 6120 w +10 /LucidaSansUnicode00 f +(det) 1992 6500 w +(\() 2156 6500 w +10 /LucidaSans-Demi f +(M) 2197 6500 w +10 /LucidaSansUnicode00 f +(\)) 2296 6500 w +10 /S f +(=) 2393 6500 w +10 /LucidaSansUnicode00 f +(m) 2504 6660 w +7 /LucidaSansUnicode00 f +(02) 2608 6680 w +10 /LucidaSansUnicode00 f +(\() 2712 6660 w +(m) 2753 6660 w +7 /LucidaSansUnicode00 f +(10) 2857 6680 w +10 /LucidaSansUnicode00 f +(m) 2961 6660 w +7 /LucidaSansUnicode00 f +(21) 3065 6680 w +10 /S f +(-) 3177 6660 w +10 /LucidaSansUnicode00 f +(m) 3248 6660 w +7 /LucidaSansUnicode00 f +(11) 3352 6680 w +10 /LucidaSansUnicode00 f +(m) 3456 6660 w +7 /LucidaSansUnicode00 f +(20) 3560 6680 w +10 /LucidaSansUnicode00 f +(\)) 3664 6660 w +(m) 2504 6500 w +7 /LucidaSansUnicode00 f +(01) 2608 6520 w +10 /LucidaSansUnicode00 f +(\() 2712 6500 w +(m) 2753 6500 w +7 /LucidaSansUnicode00 f +(12) 2857 6520 w +10 /LucidaSansUnicode00 f +(m) 2961 6500 w +7 /LucidaSansUnicode00 f +(20) 3065 6520 w +10 /S f +(-) 3177 6500 w +10 /LucidaSansUnicode00 f +(m) 3248 6500 w +7 /LucidaSansUnicode00 f +(10) 3352 6520 w +10 /LucidaSansUnicode00 f +(m) 3456 6500 w +7 /LucidaSansUnicode00 f +(22) 3560 6520 w +10 /LucidaSansUnicode00 f +(\)) 3664 6500 w +10 /S f +(+) 3713 6500 w +10 /LucidaSansUnicode00 f +(m) 2504 6340 w +7 /LucidaSansUnicode00 f +(00) 2608 6360 w +10 /LucidaSansUnicode00 f +(\() 2712 6340 w +(m) 2753 6340 w +7 /LucidaSansUnicode00 f +(11) 2857 6360 w +10 /LucidaSansUnicode00 f +(m) 2961 6340 w +7 /LucidaSansUnicode00 f +(22) 3065 6360 w +10 /S f +(-) 3177 6340 w +10 /LucidaSansUnicode00 f +(m) 3248 6340 w +7 /LucidaSansUnicode00 f +(12) 3352 6360 w +10 /LucidaSansUnicode00 f +(m) 3456 6340 w +7 /LucidaSansUnicode00 f +(21) 3560 6360 w +10 /LucidaSansUnicode00 f +(\)) 3664 6340 w +10 /S f +(+) 3713 6340 w +cleartomark +showpage +saveobj restore +%%EndPage: 4 4 +%%Page: 5 5 +/saveobj save def +mark +5 pagesetup +10 /LucidaSansUnicode00 f +(\255 5 \255) 2783 480 w +10 /LucidaSans-Demi f +(2.4.) 720 840 w +(Matrix3) 962 840 w +(Addition) 720 1080 w +9 /LucidaTypewriter f +(void) 920 1250 w +(addm3\(Matrix3) 1245 1250 w +(A,) 2155 1250 w +(Matrix3) 2350 1250 w +(B\)) 2870 1250 w +10 /LucidaSansUnicode00 f +(\() 2393 1490 w +10 /LucidaSans-Demi f +(A) 2434 1490 w +10 /S f +(+) 2524 1490 w +10 /LucidaSans-Demi f +(B) 2595 1490 w +10 /LucidaSansUnicode00 f +(\)) 2666 1490 w +7 /LucidaSansUnicode00 f +(i) 2710 1510 w +(,) 2735 1510 w +(j) 2762 1510 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2847 1490 w +10 /LucidaSansUnicode00 f +10 /LucidaSans-Demi f +(A) 2958 1490 w +7 /LucidaSansUnicode00 f +(i) 3043 1510 w +(,) 3068 1510 w +(j) 3095 1510 w +10 /S f +(+) 3140 1490 w +10 /LucidaSans-Demi f +(B) 3211 1490 w +7 /LucidaSansUnicode00 f +(i) 3285 1510 w +(,) 3310 1510 w +(j) 3337 1510 w +10 /LucidaSans-Demi f +(Substraction) 720 1790 w +9 /LucidaTypewriter f +(void) 920 1960 w +(subm3\(Matrix3) 1245 1960 w +(A,) 2155 1960 w +(Matrix3) 2350 1960 w +(B\)) 2870 1960 w +10 /LucidaSansUnicode00 f +(\() 2393 2200 w +10 /LucidaSans-Demi f +(A) 2434 2200 w +10 /S f +(-) 2524 2200 w +10 /LucidaSans-Demi f +(B) 2595 2200 w +10 /LucidaSansUnicode00 f +(\)) 2666 2200 w +7 /LucidaSansUnicode00 f +(i) 2710 2220 w +(,) 2735 2220 w +(j) 2762 2220 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2847 2200 w +10 /LucidaSansUnicode00 f +10 /LucidaSans-Demi f +(A) 2958 2200 w +7 /LucidaSansUnicode00 f +(i) 3043 2220 w +(,) 3068 2220 w +(j) 3095 2220 w +10 /S f +(-) 3140 2200 w +10 /LucidaSans-Demi f +(B) 3211 2200 w +7 /LucidaSansUnicode00 f +(i) 3285 2220 w +(,) 3310 2220 w +(j) 3337 2220 w +10 /LucidaSans-Demi f +(Multiplication) 720 2500 w +9 /LucidaTypewriter f +(void) 920 2670 w +(mulm3\(Matrix3) 1245 2670 w +(A,) 2155 2670 w +(Matrix3) 2350 2670 w +(B\)) 2870 2670 w +10 /S f +(\351) 2374 2923 w +(\353) 2374 3023 w +10 /LucidaSans-Demi f +(AB) 2424 2970 w +10 /S f +(\371) 2561 2923 w +(\373) 2561 3023 w +7 /LucidaSansUnicode00 f +(i) 2610 3005 w +(,) 2635 3005 w +(j) 2662 3005 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2747 2960 w +10 /LucidaSansUnicode00 f +7 /LucidaSansUnicode00 f +(k) 2859 3060 w +7 /S f +(=) 2911 3060 w +7 /LucidaSansUnicode00 f +(0) 2961 3060 w +15 /S f +(S) 2888 2990 w +7 /LucidaSansUnicode00 f +(4) 2858 2860 w +7 /S f +(-) 2913 2860 w +7 /LucidaSansUnicode00 f +(1) 2963 2860 w +10 /LucidaSans-Demi f +(A) 3023 2960 w +7 /LucidaSansUnicode00 f +(i) 3108 2980 w +(,) 3133 2980 w +(k) 3160 2980 w +10 /LucidaSans-Demi f +(B) 3217 2960 w +7 /LucidaSansUnicode00 f +(k) 3291 2980 w +(,) 3337 2980 w +(j) 3364 2980 w +10 /LucidaSans-Demi f +(Transpose) 720 3340 w +9 /LucidaTypewriter f +(void) 920 3510 w +(transposem3\(Matrix3) 1245 3510 w +(M\)) 2545 3510 w +10 /LucidaSansUnicode00 f +(\() 2552 3750 w +10 /LucidaSans-Demi f +(M) 2593 3750 w +7 /LucidaSansUnicode00 f +(T) 2689 3710 w +10 /LucidaSansUnicode00 f +(\)) 2749 3750 w +7 /LucidaSansUnicode00 f +(i) 2793 3770 w +(,) 2818 3770 w +(j) 2845 3770 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2930 3750 w +10 /LucidaSansUnicode00 f +10 /LucidaSans-Demi f +(A) 3041 3750 w +7 /LucidaSansUnicode00 f +(j) 3126 3770 w +(,) 3152 3770 w +(i) 3179 3770 w +10 /LucidaSans-Demi f +(Identity) 720 4050 w +9 /LucidaTypewriter f +(void) 920 4220 w +(identity3\(Matrix3) 1245 4220 w +(M\)) 2415 4220 w +10 /LucidaSans-Demi f +(M) 2505 4695 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2652 4695 w +10 /LucidaSansUnicode00 f +10 /S f +(\351) 2771 4458 w +(\357) 2771 4558 w +(\357) 2771 4658 w +(\357) 2771 4758 w +(\357) 2771 4858 w +(\353) 2771 4958 w +10 /LucidaSansUnicode00 f +(0) 2821 4915 w +(0) 2932 4915 w +(0) 3043 4915 w +(1) 3154 4915 w +(0) 2821 4775 w +(0) 2932 4775 w +(1) 3043 4775 w +(0) 3154 4775 w +(0) 2821 4635 w +(1) 2932 4635 w +(0) 3043 4635 w +(0) 3154 4635 w +(1) 2821 4495 w +(0) 2932 4495 w +(0) 3043 4495 w +(0) 3154 4495 w +10 /S f +(\371) 3217 4458 w +(\357) 3217 4558 w +(\357) 3217 4658 w +(\357) 3217 4758 w +(\357) 3217 4858 w +(\373) 3217 4958 w +10 /LucidaSans-Demi f +(Determinant) 720 5250 w +9 /LucidaTypewriter f +(double) 920 5420 w +(detm3\(Matrix3) 1375 5420 w +(M\)) 2285 5420 w +10 /LucidaSansUnicode00 f +(det) 567 5910 w +(\() 731 5910 w +10 /LucidaSans-Demi f +(M) 772 5910 w +10 /LucidaSansUnicode00 f +(\)) 871 5910 w +10 /S f +(=) 968 5910 w +10 /LucidaSansUnicode00 f +10 /S f +(-) 1079 6120 w +10 /LucidaSansUnicode00 f +(m) 1150 6120 w +7 /LucidaSansUnicode00 f +(03) 1254 6140 w +10 /LucidaSansUnicode00 f +(\() 1358 6120 w +(m) 1399 6120 w +7 /LucidaSansUnicode00 f +(10) 1503 6140 w +10 /LucidaSansUnicode00 f +(\() 1607 6120 w +(m) 1648 6120 w +7 /LucidaSansUnicode00 f +(21) 1752 6140 w +10 /LucidaSansUnicode00 f +(m) 1856 6120 w +7 /LucidaSansUnicode00 f +(32) 1960 6140 w +10 /S f +(-) 2072 6120 w +10 /LucidaSansUnicode00 f +(m) 2143 6120 w +7 /LucidaSansUnicode00 f +(22) 2247 6140 w +10 /LucidaSansUnicode00 f +(m) 2351 6120 w +7 /LucidaSansUnicode00 f +(31) 2455 6140 w +10 /LucidaSansUnicode00 f +(\)) 2559 6120 w +10 /S f +(+) 2608 6120 w +10 /LucidaSansUnicode00 f +(m) 2679 6120 w +7 /LucidaSansUnicode00 f +(11) 2783 6140 w +10 /LucidaSansUnicode00 f +(\() 2887 6120 w +(m) 2928 6120 w +7 /LucidaSansUnicode00 f +(22) 3032 6140 w +10 /LucidaSansUnicode00 f +(m) 3136 6120 w +7 /LucidaSansUnicode00 f +(30) 3240 6140 w +10 /S f +(-) 3352 6120 w +10 /LucidaSansUnicode00 f +(m) 3423 6120 w +7 /LucidaSansUnicode00 f +(20) 3527 6140 w +10 /LucidaSansUnicode00 f +(m) 3631 6120 w +7 /LucidaSansUnicode00 f +(32) 3735 6140 w +10 /LucidaSansUnicode00 f +(\)) 3839 6120 w +10 /S f +(+) 3888 6120 w +10 /LucidaSansUnicode00 f +(m) 3959 6120 w +7 /LucidaSansUnicode00 f +(12) 4063 6140 w +10 /LucidaSansUnicode00 f +(\() 4167 6120 w +(m) 4208 6120 w +7 /LucidaSansUnicode00 f +(20) 4312 6140 w +10 /LucidaSansUnicode00 f +(m) 4416 6120 w +7 /LucidaSansUnicode00 f +(31) 4520 6140 w +10 /S f +(-) 4632 6120 w +10 /LucidaSansUnicode00 f +(m) 4703 6120 w +7 /LucidaSansUnicode00 f +(21) 4807 6140 w +10 /LucidaSansUnicode00 f +(m) 4911 6120 w +7 /LucidaSansUnicode00 f +(30) 5015 6140 w +10 /LucidaSansUnicode00 f +(\)) 5119 6120 w +(\)) 5160 6120 w +10 /S f +(+) 1079 5960 w +10 /LucidaSansUnicode00 f +(m) 1150 5960 w +7 /LucidaSansUnicode00 f +(02) 1254 5980 w +10 /LucidaSansUnicode00 f +(\() 1358 5960 w +(m) 1399 5960 w +7 /LucidaSansUnicode00 f +(10) 1503 5980 w +10 /LucidaSansUnicode00 f +(\() 1607 5960 w +(m) 1648 5960 w +7 /LucidaSansUnicode00 f +(21) 1752 5980 w +10 /LucidaSansUnicode00 f +(m) 1856 5960 w +7 /LucidaSansUnicode00 f +(33) 1960 5980 w +10 /S f +(-) 2072 5960 w +10 /LucidaSansUnicode00 f +(m) 2143 5960 w +7 /LucidaSansUnicode00 f +(23) 2247 5980 w +10 /LucidaSansUnicode00 f +(m) 2351 5960 w +7 /LucidaSansUnicode00 f +(31) 2455 5980 w +10 /LucidaSansUnicode00 f +(\)) 2559 5960 w +10 /S f +(+) 2608 5960 w +10 /LucidaSansUnicode00 f +(m) 2679 5960 w +7 /LucidaSansUnicode00 f +(11) 2783 5980 w +10 /LucidaSansUnicode00 f +(\() 2887 5960 w +(m) 2928 5960 w +7 /LucidaSansUnicode00 f +(23) 3032 5980 w +10 /LucidaSansUnicode00 f +(m) 3136 5960 w +7 /LucidaSansUnicode00 f +(30) 3240 5980 w +10 /S f +(-) 3352 5960 w +10 /LucidaSansUnicode00 f +(m) 3423 5960 w +7 /LucidaSansUnicode00 f +(20) 3527 5980 w +10 /LucidaSansUnicode00 f +(m) 3631 5960 w +7 /LucidaSansUnicode00 f +(33) 3735 5980 w +10 /LucidaSansUnicode00 f +(\)) 3839 5960 w +10 /S f +(+) 3888 5960 w +10 /LucidaSansUnicode00 f +(m) 3959 5960 w +7 /LucidaSansUnicode00 f +(13) 4063 5980 w +10 /LucidaSansUnicode00 f +(\() 4167 5960 w +(m) 4208 5960 w +7 /LucidaSansUnicode00 f +(20) 4312 5980 w +10 /LucidaSansUnicode00 f +(m) 4416 5960 w +7 /LucidaSansUnicode00 f +(31) 4520 5980 w +10 /S f +(-) 4632 5960 w +10 /LucidaSansUnicode00 f +(m) 4703 5960 w +7 /LucidaSansUnicode00 f +(21) 4807 5980 w +10 /LucidaSansUnicode00 f +(m) 4911 5960 w +7 /LucidaSansUnicode00 f +(30) 5015 5980 w +10 /LucidaSansUnicode00 f +(\)) 5119 5960 w +(\)) 5160 5960 w +10 /S f +(-) 1079 5800 w +10 /LucidaSansUnicode00 f +(m) 1150 5800 w +7 /LucidaSansUnicode00 f +(01) 1254 5820 w +10 /LucidaSansUnicode00 f +(\() 1358 5800 w +(m) 1399 5800 w +7 /LucidaSansUnicode00 f +(10) 1503 5820 w +10 /LucidaSansUnicode00 f +(\() 1607 5800 w +(m) 1648 5800 w +7 /LucidaSansUnicode00 f +(22) 1752 5820 w +10 /LucidaSansUnicode00 f +(m) 1856 5800 w +7 /LucidaSansUnicode00 f +(33) 1960 5820 w +10 /S f +(-) 2072 5800 w +10 /LucidaSansUnicode00 f +(m) 2143 5800 w +7 /LucidaSansUnicode00 f +(23) 2247 5820 w +10 /LucidaSansUnicode00 f +(m) 2351 5800 w +7 /LucidaSansUnicode00 f +(32) 2455 5820 w +10 /LucidaSansUnicode00 f +(\)) 2559 5800 w +10 /S f +(+) 2608 5800 w +10 /LucidaSansUnicode00 f +(m) 2679 5800 w +7 /LucidaSansUnicode00 f +(12) 2783 5820 w +10 /LucidaSansUnicode00 f +(\() 2887 5800 w +(m) 2928 5800 w +7 /LucidaSansUnicode00 f +(23) 3032 5820 w +10 /LucidaSansUnicode00 f +(m) 3136 5800 w +7 /LucidaSansUnicode00 f +(30) 3240 5820 w +10 /S f +(-) 3352 5800 w +10 /LucidaSansUnicode00 f +(m) 3423 5800 w +7 /LucidaSansUnicode00 f +(20) 3527 5820 w +10 /LucidaSansUnicode00 f +(m) 3631 5800 w +7 /LucidaSansUnicode00 f +(33) 3735 5820 w +10 /LucidaSansUnicode00 f +(\)) 3839 5800 w +10 /S f +(+) 3888 5800 w +10 /LucidaSansUnicode00 f +(m) 3959 5800 w +7 /LucidaSansUnicode00 f +(13) 4063 5820 w +10 /LucidaSansUnicode00 f +(\() 4167 5800 w +(m) 4208 5800 w +7 /LucidaSansUnicode00 f +(20) 4312 5820 w +10 /LucidaSansUnicode00 f +(m) 4416 5800 w +7 /LucidaSansUnicode00 f +(32) 4520 5820 w +10 /S f +(-) 4632 5800 w +10 /LucidaSansUnicode00 f +(m) 4703 5800 w +7 /LucidaSansUnicode00 f +(22) 4807 5820 w +10 /LucidaSansUnicode00 f +(m) 4911 5800 w +7 /LucidaSansUnicode00 f +(30) 5015 5820 w +10 /LucidaSansUnicode00 f +(\)) 5119 5800 w +(\)) 5160 5800 w +(m) 1150 5640 w +7 /LucidaSansUnicode00 f +(00) 1254 5660 w +10 /LucidaSansUnicode00 f +(\() 1358 5640 w +(m) 1399 5640 w +7 /LucidaSansUnicode00 f +(11) 1503 5660 w +10 /LucidaSansUnicode00 f +(\() 1607 5640 w +(m) 1648 5640 w +7 /LucidaSansUnicode00 f +(22) 1752 5660 w +10 /LucidaSansUnicode00 f +(m) 1856 5640 w +7 /LucidaSansUnicode00 f +(33) 1960 5660 w +10 /S f +(-) 2072 5640 w +10 /LucidaSansUnicode00 f +(m) 2143 5640 w +7 /LucidaSansUnicode00 f +(23) 2247 5660 w +10 /LucidaSansUnicode00 f +(m) 2351 5640 w +7 /LucidaSansUnicode00 f +(32) 2455 5660 w +10 /LucidaSansUnicode00 f +(\)) 2559 5640 w +10 /S f +(+) 2608 5640 w +10 /LucidaSansUnicode00 f +(m) 2679 5640 w +7 /LucidaSansUnicode00 f +(12) 2783 5660 w +10 /LucidaSansUnicode00 f +(\() 2887 5640 w +(m) 2928 5640 w +7 /LucidaSansUnicode00 f +(23) 3032 5660 w +10 /LucidaSansUnicode00 f +(m) 3136 5640 w +7 /LucidaSansUnicode00 f +(31) 3240 5660 w +10 /S f +(-) 3352 5640 w +10 /LucidaSansUnicode00 f +(m) 3423 5640 w +7 /LucidaSansUnicode00 f +(21) 3527 5660 w +10 /LucidaSansUnicode00 f +(m) 3631 5640 w +7 /LucidaSansUnicode00 f +(33) 3735 5660 w +10 /LucidaSansUnicode00 f +(\)) 3839 5640 w +10 /S f +(+) 3888 5640 w +10 /LucidaSansUnicode00 f +(m) 3959 5640 w +7 /LucidaSansUnicode00 f +(13) 4063 5660 w +10 /LucidaSansUnicode00 f +(\() 4167 5640 w +(m) 4208 5640 w +7 /LucidaSansUnicode00 f +(21) 4312 5660 w +10 /LucidaSansUnicode00 f +(m) 4416 5640 w +7 /LucidaSansUnicode00 f +(32) 4520 5660 w +10 /S f +(-) 4632 5640 w +10 /LucidaSansUnicode00 f +(m) 4703 5640 w +7 /LucidaSansUnicode00 f +(22) 4807 5660 w +10 /LucidaSansUnicode00 f +(m) 4911 5640 w +7 /LucidaSansUnicode00 f +(31) 5015 5660 w +10 /LucidaSansUnicode00 f +(\)) 5119 5640 w +(\)) 5160 5640 w +10 /LucidaSans-Demi f +(2.5.) 720 6420 w +(Quaternion) 962 6420 w +(Addition) 720 6660 w +9 /LucidaTypewriter f +(Quaternion) 920 6830 w +(addq\(Quaternion) 1635 6830 w +(q,) 2675 6830 w +(Quaternion) 2870 6830 w +(r\)) 3585 6830 w +10 /LucidaSansUnicode00 f +(q) 1974 7070 w +10 /S f +(+) 2053 7070 w +10 /LucidaSansUnicode00 f +(r) 2124 7070 w +10 /S f +(=) 2221 7070 w +10 /LucidaSansUnicode00 f +(\() 2332 7070 w +(r) 2373 7070 w +7 /LucidaSansUnicode00 f +(q) 2425 7090 w +10 /S f +(+) 2493 7070 w +10 /LucidaSansUnicode00 f +(r) 2564 7070 w +7 /LucidaSansUnicode00 f +(r) 2616 7090 w +10 /LucidaSansUnicode00 f +(,) 2661 7070 w +(i) 2741 7070 w +7 /LucidaSansUnicode00 f +(q) 2781 7090 w +10 /S f +(+) 2849 7070 w +10 /LucidaSansUnicode00 f +(i) 2920 7070 w +7 /LucidaSansUnicode00 f +(r) 2960 7090 w +10 /LucidaSansUnicode00 f +(,) 3005 7070 w +(j) 3085 7070 w +7 /LucidaSansUnicode00 f +(q) 3126 7090 w +10 /S f +(+) 3194 7070 w +10 /LucidaSansUnicode00 f +(j) 3265 7070 w +7 /LucidaSansUnicode00 f +(r) 3306 7090 w +10 /LucidaSansUnicode00 f +(,) 3351 7070 w +(k) 3431 7070 w +7 /LucidaSansUnicode00 f +(q) 3500 7090 w +10 /S f +(+) 3568 7070 w +10 /LucidaSansUnicode00 f +(k) 3639 7070 w +7 /LucidaSansUnicode00 f +(r) 3708 7090 w +10 /LucidaSansUnicode00 f +(\)) 3753 7070 w +cleartomark +showpage +saveobj restore +%%EndPage: 5 5 +%%Page: 6 6 +/saveobj save def +mark +6 pagesetup +10 /LucidaSansUnicode00 f +(\255 6 \255) 2783 480 w +10 /LucidaSans-Demi f +(Substraction) 720 840 w +9 /LucidaTypewriter f +(Quaternion) 920 1010 w +(subq\(Quaternion) 1635 1010 w +(q,) 2675 1010 w +(Quaternion) 2870 1010 w +(r\)) 3585 1010 w +10 /LucidaSansUnicode00 f +(q) 1974 1250 w +10 /S f +(-) 2053 1250 w +10 /LucidaSansUnicode00 f +(r) 2124 1250 w +10 /S f +(=) 2221 1250 w +10 /LucidaSansUnicode00 f +(\() 2332 1250 w +(r) 2373 1250 w +7 /LucidaSansUnicode00 f +(q) 2425 1270 w +10 /S f +(-) 2493 1250 w +10 /LucidaSansUnicode00 f +(r) 2564 1250 w +7 /LucidaSansUnicode00 f +(r) 2616 1270 w +10 /LucidaSansUnicode00 f +(,) 2661 1250 w +(i) 2741 1250 w +7 /LucidaSansUnicode00 f +(q) 2781 1270 w +10 /S f +(-) 2849 1250 w +10 /LucidaSansUnicode00 f +(i) 2920 1250 w +7 /LucidaSansUnicode00 f +(r) 2960 1270 w +10 /LucidaSansUnicode00 f +(,) 3005 1250 w +(j) 3085 1250 w +7 /LucidaSansUnicode00 f +(q) 3126 1270 w +10 /S f +(-) 3194 1250 w +10 /LucidaSansUnicode00 f +(j) 3265 1250 w +7 /LucidaSansUnicode00 f +(r) 3306 1270 w +10 /LucidaSansUnicode00 f +(,) 3351 1250 w +(k) 3431 1250 w +7 /LucidaSansUnicode00 f +(q) 3500 1270 w +10 /S f +(-) 3568 1250 w +10 /LucidaSansUnicode00 f +(k) 3639 1250 w +7 /LucidaSansUnicode00 f +(r) 3708 1270 w +10 /LucidaSansUnicode00 f +(\)) 3753 1250 w +10 /LucidaSans-Demi f +(Multiplication) 720 1550 w +9 /LucidaTypewriter f +(Quaternion) 920 1720 w +(mulq\(Quaternion) 1635 1720 w +(q,) 2675 1720 w +(Quaternion) 2870 1720 w +(r\)) 3585 1720 w +10 /LucidaSansUnicode00 f +(q) 1321 1965 w +10 /S f +(=) 1440 1965 w +10 /LucidaSansUnicode00 f +([) 1551 1965 w +(r) 1592 1965 w +7 /LucidaSansUnicode00 f +(q) 1644 1985 w +10 /LucidaSansUnicode00 f +(,) 1704 1965 w +(v) 1784 1965 w +7 /LucidaSansUnicode21 f +(\222) 1777 1915 w +7 /LucidaSansUnicode00 f +(q) 1847 1985 w +10 /LucidaSansUnicode00 f +(]) 1907 1965 w +(r) 1956 1965 w +10 /S f +(=) 2053 1965 w +10 /LucidaSansUnicode00 f +([) 2164 1965 w +(r) 2205 1965 w +7 /LucidaSansUnicode00 f +(r) 2257 1985 w +10 /LucidaSansUnicode00 f +(,) 2302 1965 w +(v) 2382 1965 w +7 /LucidaSansUnicode21 f +(\222) 2375 1915 w +7 /LucidaSansUnicode00 f +(r) 2445 1985 w +10 /LucidaSansUnicode00 f +(]) 2490 1965 w +(qr) 2539 1965 w +10 /S f +(=) 2699 1965 w +10 /LucidaSansUnicode00 f +([) 2810 1965 w +(r) 2851 1965 w +7 /LucidaSansUnicode00 f +(q) 2903 1985 w +10 /LucidaSansUnicode00 f +(r) 2963 1965 w +7 /LucidaSansUnicode00 f +(r) 3015 1985 w +10 /S f +(-) 3068 1965 w +10 /LucidaSansUnicode00 f +(v) 3139 1965 w +7 /LucidaSansUnicode21 f +(\222) 3132 1915 w +7 /LucidaSansUnicode00 f +(q) 3202 1985 w +10 /LucidaSansUnicode20 f +(") 3262 1965 w +10 /LucidaSansUnicode00 f +(v) 3326 1965 w +7 /LucidaSansUnicode21 f +(\222) 3319 1915 w +7 /LucidaSansUnicode00 f +(r) 3389 1985 w +10 /LucidaSansUnicode00 f +(,) 3434 1965 w +(v) 3514 1965 w +7 /LucidaSansUnicode21 f +(\222) 3507 1915 w +7 /LucidaSansUnicode00 f +(r) 3577 1985 w +10 /LucidaSansUnicode00 f +(r) 3622 1965 w +7 /LucidaSansUnicode00 f +(q) 3674 1985 w +10 /S f +(+) 3742 1965 w +10 /LucidaSansUnicode00 f +(v) 3813 1965 w +7 /LucidaSansUnicode21 f +(\222) 3806 1915 w +7 /LucidaSansUnicode00 f +(q) 3876 1985 w +10 /LucidaSansUnicode00 f +(r) 3936 1965 w +7 /LucidaSansUnicode00 f +(r) 3988 1985 w +10 /S f +(+) 4041 1965 w +10 /LucidaSansUnicode00 f +(v) 4112 1965 w +7 /LucidaSansUnicode21 f +(\222) 4105 1915 w +7 /LucidaSansUnicode00 f +(q) 4175 1985 w +10 /LucidaSansUnicode00 f +(Xv) 4235 1965 w +7 /LucidaSansUnicode21 f +(\222) 4291 1915 w +7 /LucidaSansUnicode00 f +(r) 4361 1985 w +10 /LucidaSansUnicode00 f +(]) 4406 1965 w +10 /LucidaSans-Demi f +(Scalar Multiplication) 720 2265 w +9 /LucidaTypewriter f +(Quaternion) 920 2435 w +(smulq\(Quaternion) 1635 2435 w +(q,) 2740 2435 w +(double) 2935 2435 w +(s\)) 3390 2435 w +10 /LucidaSansUnicode00 f +(qs) 2243 2675 w +10 /S f +(=) 2413 2675 w +10 /LucidaSansUnicode00 f +([) 2524 2675 w +(r) 2565 2675 w +7 /LucidaSansUnicode00 f +(q) 2617 2695 w +10 /LucidaSansUnicode00 f +(s) 2677 2675 w +(,) 2736 2675 w +(i) 2816 2675 w +7 /LucidaSansUnicode00 f +(q) 2856 2695 w +10 /LucidaSansUnicode00 f +(s) 2916 2675 w +(,) 2975 2675 w +(j) 3055 2675 w +7 /LucidaSansUnicode00 f +(q) 3096 2695 w +10 /LucidaSansUnicode00 f +(s) 3156 2675 w +(,) 3215 2675 w +(k) 3295 2675 w +7 /LucidaSansUnicode00 f +(q) 3364 2695 w +10 /LucidaSansUnicode00 f +(s) 3424 2675 w +(]) 3483 2675 w +10 /LucidaSans-Demi f +(Inverse) 720 2975 w +9 /LucidaTypewriter f +(Quaternion) 920 3145 w +(invq\(Quaternion) 1635 3145 w +(q\)) 2675 3145 w +10 /LucidaSansUnicode00 f +(q) 2009 3470 w +7 /S f +(-) 2083 3430 w +7 /LucidaSansUnicode00 f +(1) 2133 3430 w +10 /LucidaSansUnicode00 f +10 /S f +(=) 2241 3470 w +10 /LucidaSansUnicode00 f +10 /S f +(\354) 2360 3383 w +(\357) 2360 3483 w +(\356) 2360 3583 w +10 /LucidaSansUnicode00 f +(|) 2434 3567 w +(q) 2482 3550 w +(|) 2545 3567 w +7 /LucidaSansUnicode00 f +(2) 2583 3510 w +10 /LucidaSansUnicode00 f +(r) 2514 3410 w +10 /S1 f +(_) 2419 3440 w +(____) 2450 3440 w +10 /LucidaSansUnicode00 f +(,) 2668 3470 w +(|) 2781 3567 w +(q) 2829 3550 w +(|) 2892 3567 w +7 /LucidaSansUnicode00 f +(2) 2930 3510 w +10 /S f +(-) 2832 3410 w +10 /LucidaSansUnicode00 f +(i) 2903 3410 w +10 /S1 f +(_) 2767 3440 w +(____) 2798 3440 w +10 /LucidaSansUnicode00 f +(,) 3016 3470 w +(|) 3129 3567 w +(q) 3177 3550 w +(|) 3240 3567 w +7 /LucidaSansUnicode00 f +(2) 3278 3510 w +10 /S f +(-) 3179 3410 w +10 /LucidaSansUnicode00 f +(j) 3250 3410 w +10 /S1 f +(_) 3114 3440 w +(____) 3145 3440 w +10 /LucidaSansUnicode00 f +(,) 3363 3470 w +(|) 3476 3567 w +(q) 3524 3550 w +(|) 3587 3567 w +7 /LucidaSansUnicode00 f +(2) 3625 3510 w +10 /S f +(-) 3512 3410 w +10 /LucidaSansUnicode00 f +(k) 3583 3410 w +10 /S1 f +(_) 3461 3440 w +(____) 3492 3440 w +10 /S f +(\374) 3702 3383 w +(\357) 3702 3483 w +(\376) 3702 3583 w +10 /LucidaSans-Demi f +(Magnitude/Length) 720 3875 w +9 /LucidaTypewriter f +(double) 920 4045 w +(qlen\(Quaternion) 1375 4045 w +(q\)) 2415 4045 w +10 /LucidaSansUnicode00 f +(|) 2337 4320 w +(q) 2385 4303 w +(|) 2448 4320 w +10 /S f +(=) 2544 4303 w +10 /LucidaSansUnicode00 f +12 /LucidaSansUnicode22 f +(\032) 2655 4303 w +12 /S f +(`) 2752 4303 w +(```````````) 2755 4303 w +10 /LucidaSansUnicode00 f +(r) 2760 4303 w +7 /LucidaSansUnicode00 f +(2) 2806 4263 w +10 /S f +(+) 2874 4303 w +10 /LucidaSansUnicode00 f +(i) 2945 4303 w +7 /LucidaSansUnicode00 f +(2) 2979 4263 w +10 /S f +(+) 3047 4303 w +10 /LucidaSansUnicode00 f +(j) 3118 4303 w +7 /LucidaSansUnicode00 f +(2) 3153 4263 w +10 /S f +(+) 3221 4303 w +10 /LucidaSansUnicode00 f +(k) 3292 4303 w +7 /LucidaSansUnicode00 f +(2) 3355 4263 w +cleartomark +showpage +saveobj restore +%%EndPage: 6 6 +%%Trailer +done +%%DocumentFonts: LucidaSansUnicode20 LucidaSansUnicode21 LucidaSansUnicode22 S1 S LucidaSansUnicode00 LucidaSans-Demi LucidaSans-Italic LucidaTypewriter +%%Pages: 6 diff --git a/libgeometry/doc/mkfile b/libgeometry/doc/mkfile new file mode 100644 index 0000000..8fb6d1c --- /dev/null +++ b/libgeometry/doc/mkfile @@ -0,0 +1,15 @@ +FONTS='.FP lucidasans' +DOCNAME=libgeometry + +all:VQ: $DOCNAME.ps $DOCNAME.pdf + +clean:VQ: + rm -f $DOCNAME.ps $DOCNAME.pdf + +$DOCNAME.ps:V: $DOCNAME.ms + {echo $FONTS; cat $prereq}> _$prereq + eval `{doctype _$prereq} | lp -dstdout > $target && rm -f _$prereq + +$DOCNAME.pdf:V: $DOCNAME.ps + cat /sys/doc/docfonts $prereq > _$prereq + ps2pdf _$prereq $target && rm -f _$prereq diff --git a/libgeometry/matrix.c b/libgeometry/matrix.c new file mode 100644 index 0000000..b7efc84 --- /dev/null +++ b/libgeometry/matrix.c @@ -0,0 +1,348 @@ +#include <u.h> +#include <libc.h> +#include "../geometry.h" + +/* 2D */ + +void +identity(Matrix m) +{ + memset(m, 0, 3*3*sizeof(double)); + m[0][0] = m[1][1] = m[2][2] = 1; +} + +void +addm(Matrix a, Matrix b) +{ + int i, j; + + for(i = 0; i < 3; i++) + for(j = 0; j < 3; j++) + a[i][j] += b[i][j]; +} + +void +subm(Matrix a, Matrix b) +{ + int i, j; + + for(i = 0; i < 3; i++) + for(j = 0; j < 3; j++) + a[i][j] -= b[i][j]; +} + +void +mulm(Matrix a, Matrix b) +{ + int i, j, k; + Matrix tmp; + + for(i = 0; i < 3; i++) + for(j = 0; j < 3; j++){ + tmp[i][j] = 0; + for(k = 0; k < 3; k++) + tmp[i][j] += a[i][k]*b[k][j]; + } + memmove(a, tmp, 3*3*sizeof(double)); +} + +void +smulm(Matrix m, double s) +{ + int i, j; + + for(i = 0; i < 3; i++) + for(j = 0; j < 3; j++) + m[i][j] *= s; +} + +void +transposem(Matrix m) +{ + int i, j; + double tmp; + + for(i = 0; i < 3; i++) + for(j = i; j < 3; j++){ + tmp = m[i][j]; + m[i][j] = m[j][i]; + m[j][i] = tmp; + } +} + +double +detm(Matrix m) +{ + return m[0][0]*(m[1][1]*m[2][2] - m[1][2]*m[2][1])+ + m[0][1]*(m[1][2]*m[2][0] - m[1][0]*m[2][2])+ + m[0][2]*(m[1][0]*m[2][1] - m[1][1]*m[2][0]); +} + +double +tracem(Matrix m) +{ + return m[0][0] + m[1][1] + m[2][2]; +} + +void +adjm(Matrix m) +{ + Matrix tmp; + + tmp[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1]; + tmp[0][1] = -m[0][1]*m[2][2] + m[0][2]*m[2][1]; + tmp[0][2] = m[0][1]*m[1][2] - m[0][2]*m[1][1]; + tmp[1][0] = -m[1][0]*m[2][2] + m[1][2]*m[2][0]; + tmp[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0]; + tmp[1][2] = -m[0][0]*m[1][2] + m[0][2]*m[1][0]; + tmp[2][0] = m[1][0]*m[2][1] - m[1][1]*m[2][0]; + tmp[2][1] = -m[0][0]*m[2][1] + m[0][1]*m[2][0]; + tmp[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]; + memmove(m, tmp, 3*3*sizeof(double)); +} + +/* Cayley-Hamilton */ +//void +//invertm(Matrix m) +//{ +// Matrix m², r; +// double det, trm, trm²; +// +// det = detm(m); +// if(det == 0) +// return; +// trm = tracem(m); +// memmove(m², m, 3*3*sizeof(double)); +// mulm(m², m²); +// trm² = tracem(m²); +// identity(r); +// smulm(r, (trm*trm - trm²)/2); +// smulm(m, trm); +// subm(r, m); +// addm(r, m²); +// smulm(r, 1/det); +// memmove(m, r, 3*3*sizeof(double)); +//} + +/* Cramer's */ +void +invm(Matrix m) +{ + double det; + + det = detm(m); + if(det == 0) + return; /* singular matrices are not invertible */ + adjm(m); + smulm(m, 1/det); +} + +Point2 +xform(Point2 p, Matrix m) +{ + return (Point2){ + p.x*m[0][0] + p.y*m[0][1] + p.w*m[0][2], + p.x*m[1][0] + p.y*m[1][1] + p.w*m[1][2], + p.x*m[2][0] + p.y*m[2][1] + p.w*m[2][2] + }; +} + +/* 3D */ + +void +identity3(Matrix3 m) +{ + memset(m, 0, 4*4*sizeof(double)); + m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1; +} + +void +addm3(Matrix3 a, Matrix3 b) +{ + int i, j; + + for(i = 0; i < 4; i++) + for(j = 0; j < 4; j++) + a[i][j] += b[i][j]; +} + +void +subm3(Matrix3 a, Matrix3 b) +{ + int i, j; + + for(i = 0; i < 4; i++) + for(j = 0; j < 4; j++) + a[i][j] -= b[i][j]; +} + +void +mulm3(Matrix3 a, Matrix3 b) +{ + int i, j, k; + Matrix3 tmp; + + for(i = 0; i < 4; i++) + for(j = 0; j < 4; j++){ + tmp[i][j] = 0; + for(k = 0; k < 4; k++) + tmp[i][j] += a[i][k]*b[k][j]; + } + memmove(a, tmp, 4*4*sizeof(double)); +} + +void +smulm3(Matrix3 m, double s) +{ + int i, j; + + for(i = 0; i < 4; i++) + for(j = 0; j < 4; j++) + m[i][j] *= s; +} + +void +transposem3(Matrix3 m) +{ + int i, j; + double tmp; + + for(i = 0; i < 4; i++) + for(j = i; j < 4; j++){ + tmp = m[i][j]; + m[i][j] = m[j][i]; + m[j][i] = tmp; + } +} + +double +detm3(Matrix3 m) +{ + return m[0][0]*(m[1][1]*(m[2][2]*m[3][3] - m[2][3]*m[3][2])+ + m[1][2]*(m[2][3]*m[3][1] - m[2][1]*m[3][3])+ + m[1][3]*(m[2][1]*m[3][2] - m[2][2]*m[3][1])) + -m[0][1]*(m[1][0]*(m[2][2]*m[3][3] - m[2][3]*m[3][2])+ + m[1][2]*(m[2][3]*m[3][0] - m[2][0]*m[3][3])+ + m[1][3]*(m[2][0]*m[3][2] - m[2][2]*m[3][0])) + +m[0][2]*(m[1][0]*(m[2][1]*m[3][3] - m[2][3]*m[3][1])+ + m[1][1]*(m[2][3]*m[3][0] - m[2][0]*m[3][3])+ + m[1][3]*(m[2][0]*m[3][1] - m[2][1]*m[3][0])) + -m[0][3]*(m[1][0]*(m[2][1]*m[3][2] - m[2][2]*m[3][1])+ + m[1][1]*(m[2][2]*m[3][0] - m[2][0]*m[3][2])+ + m[1][2]*(m[2][0]*m[3][1] - m[2][1]*m[3][0])); +} + +double +tracem3(Matrix3 m) +{ + return m[0][0] + m[1][1] + m[2][2] + m[3][3]; +} + +void +adjm3(Matrix3 m) +{ + Matrix3 tmp; + + tmp[0][0]=m[1][1]*(m[2][2]*m[3][3] - m[2][3]*m[3][2])+ + m[2][1]*(m[1][3]*m[3][2] - m[1][2]*m[3][3])+ + m[3][1]*(m[1][2]*m[2][3] - m[1][3]*m[2][2]); + tmp[0][1]=m[0][1]*(m[2][3]*m[3][2] - m[2][2]*m[3][3])+ + m[2][1]*(m[0][2]*m[3][3] - m[0][3]*m[3][2])+ + m[3][1]*(m[0][3]*m[2][2] - m[0][2]*m[2][3]); + tmp[0][2]=m[0][1]*(m[1][2]*m[3][3] - m[1][3]*m[3][2])+ + m[1][1]*(m[0][3]*m[3][2] - m[0][2]*m[3][3])+ + m[3][1]*(m[0][2]*m[1][3] - m[0][3]*m[1][2]); + tmp[0][3]=m[0][1]*(m[1][3]*m[2][2] - m[1][2]*m[2][3])+ + m[1][1]*(m[0][2]*m[2][3] - m[0][3]*m[2][2])+ + m[2][1]*(m[0][3]*m[1][2] - m[0][2]*m[1][3]); + tmp[1][0]=m[1][0]*(m[2][3]*m[3][2] - m[2][2]*m[3][3])+ + m[2][0]*(m[1][2]*m[3][3] - m[1][3]*m[3][2])+ + m[3][0]*(m[1][3]*m[2][2] - m[1][2]*m[2][3]); + tmp[1][1]=m[0][0]*(m[2][2]*m[3][3] - m[2][3]*m[3][2])+ + m[2][0]*(m[0][3]*m[3][2] - m[0][2]*m[3][3])+ + m[3][0]*(m[0][2]*m[2][3] - m[0][3]*m[2][2]); + tmp[1][2]=m[0][0]*(m[1][3]*m[3][2] - m[1][2]*m[3][3])+ + m[1][0]*(m[0][2]*m[3][3] - m[0][3]*m[3][2])+ + m[3][0]*(m[0][3]*m[1][2] - m[0][2]*m[1][3]); + tmp[1][3]=m[0][0]*(m[1][2]*m[2][3] - m[1][3]*m[2][2])+ + m[1][0]*(m[0][3]*m[2][2] - m[0][2]*m[2][3])+ + m[2][0]*(m[0][2]*m[1][3] - m[0][3]*m[1][2]); + tmp[2][0]=m[1][0]*(m[2][1]*m[3][3] - m[2][3]*m[3][1])+ + m[2][0]*(m[1][3]*m[3][1] - m[1][1]*m[3][3])+ + m[3][0]*(m[1][1]*m[2][3] - m[1][3]*m[2][1]); + tmp[2][1]=m[0][0]*(m[2][3]*m[3][1] - m[2][1]*m[3][3])+ + m[2][0]*(m[0][1]*m[3][3] - m[0][3]*m[3][1])+ + m[3][0]*(m[0][3]*m[2][1] - m[0][1]*m[2][3]); + tmp[2][2]=m[0][0]*(m[1][1]*m[3][3] - m[1][3]*m[3][1])+ + m[1][0]*(m[0][3]*m[3][1] - m[0][1]*m[3][3])+ + m[3][0]*(m[0][1]*m[1][3] - m[0][3]*m[1][1]); + tmp[2][3]=m[0][0]*(m[1][3]*m[2][1] - m[1][1]*m[2][3])+ + m[1][0]*(m[0][1]*m[2][3] - m[0][3]*m[2][1])+ + m[2][0]*(m[0][3]*m[1][1] - m[0][1]*m[1][3]); + tmp[3][0]=m[1][0]*(m[2][2]*m[3][1] - m[2][1]*m[3][2])+ + m[2][0]*(m[1][1]*m[3][2] - m[1][2]*m[3][1])+ + m[3][0]*(m[1][2]*m[2][1] - m[1][1]*m[2][2]); + tmp[3][1]=m[0][0]*(m[2][1]*m[3][2] - m[2][2]*m[3][1])+ + m[2][0]*(m[0][2]*m[3][1] - m[0][1]*m[3][2])+ + m[3][0]*(m[0][1]*m[2][2] - m[0][2]*m[2][1]); + tmp[3][2]=m[0][0]*(m[1][2]*m[3][1] - m[1][1]*m[3][2])+ + m[1][0]*(m[0][1]*m[3][2] - m[0][2]*m[3][1])+ + m[3][0]*(m[0][2]*m[1][1] - m[0][1]*m[1][2]); + tmp[3][3]=m[0][0]*(m[1][1]*m[2][2] - m[1][2]*m[2][1])+ + m[1][0]*(m[0][2]*m[2][1] - m[0][1]*m[2][2])+ + m[2][0]*(m[0][1]*m[1][2] - m[0][2]*m[1][1]); + memmove(m, tmp, 4*4*sizeof(double)); +} + +/* Cayley-Hamilton */ +//void +//invertm3(Matrix3 m) +//{ +// Matrix3 m², m³, r; +// double det, trm, trm², trm³; +// +// det = detm3(m); +// if(det == 0) +// return; +// trm = tracem3(m); +// memmove(m³, m, 4*4*sizeof(double)); +// mulm(m³, m³); +// mulm(m³, m); +// trm³ = tracem3(m³); +// memmove(m², m, 4*4*sizeof(double)); +// mulm(m², m²); +// trm² = tracem3(m²); +// identity3(r); +// smulm3(r, (trm*trm*trm - 3*trm*trm² + 2*trm³)/6); +// smulm3(m, (trm*trm - trm²)/2); +// smulm3(m², trm); +// subm(r, m); +// addm(r, m²); +// subm(r, m³); +// smulm(r, 1/det); +// memmove(m, r, 4*4*sizeof(double)); +//} + +/* Cramer's */ +void +invm3(Matrix3 m) +{ + double det; + + det = detm3(m); + if(det == 0) + return; /* singular matrices are not invertible */ + adjm3(m); + smulm3(m, 1/det); +} + +Point3 +xform3(Point3 p, Matrix3 m) +{ + return (Point3){ + p.x*m[0][0] + p.y*m[0][1] + p.z*m[0][2] + p.w*m[0][3], + p.x*m[1][0] + p.y*m[1][1] + p.z*m[1][2] + p.w*m[1][3], + p.x*m[2][0] + p.y*m[2][1] + p.z*m[2][2] + p.w*m[2][3], + p.x*m[3][0] + p.y*m[3][1] + p.z*m[3][2] + p.w*m[3][3], + }; +} diff --git a/libgeometry/mkfile b/libgeometry/mkfile new file mode 100644 index 0000000..5c7d79f --- /dev/null +++ b/libgeometry/mkfile @@ -0,0 +1,13 @@ +</$objtype/mkfile + +LIB=../libgeometry.a$O +OFILES=\ + point.$O\ + matrix.$O\ + quaternion.$O\ + rframe.$O\ + triangle.$O\ + +HFILES=../geometry.h + +</sys/src/cmd/mklib diff --git a/libgeometry/point.c b/libgeometry/point.c new file mode 100644 index 0000000..657eb4c --- /dev/null +++ b/libgeometry/point.c @@ -0,0 +1,161 @@ +#include <u.h> +#include <libc.h> +#include "../geometry.h" + +/* 2D */ + +Point2 +Pt2(double x, double y, double w) +{ + return (Point2){x, y, w}; +} + +Point2 +Vec2(double x, double y) +{ + return (Point2){x, y, 0}; +} + +Point2 +addpt2(Point2 a, Point2 b) +{ + return (Point2){a.x+b.x, a.y+b.y, a.w+b.w}; +} + +Point2 +subpt2(Point2 a, Point2 b) +{ + return (Point2){a.x-b.x, a.y-b.y, a.w-b.w}; +} + +Point2 +mulpt2(Point2 p, double s) +{ + return (Point2){p.x*s, p.y*s, p.w*s}; +} + +Point2 +divpt2(Point2 p, double s) +{ + return (Point2){p.x/s, p.y/s, p.w/s}; +} + +Point2 +lerp2(Point2 a, Point2 b, double t) +{ + if(t < 0) t = 0; + if(t > 1) t = 1; + return (Point2){ + (1 - t)*a.x + t*b.x, + (1 - t)*a.y + t*b.y, + (1 - t)*a.w + t*b.w + }; +} + +double +dotvec2(Point2 a, Point2 b) +{ + return a.x*b.x + a.y*b.y; +} + +double +vec2len(Point2 v) +{ + return sqrt(dotvec2(v, v)); +} + +Point2 +normvec2(Point2 v) +{ + double len; + + len = vec2len(v); + if(len == 0) + return (Point2){0, 0, 0}; + return (Point2){v.x/len, v.y/len, 0}; +} + +/* 3D */ + +Point3 +Pt3(double x, double y, double z, double w) +{ + return (Point3){x, y, z, w}; +} + +Point3 +Vec3(double x, double y, double z) +{ + return (Point3){x, y, z, 0}; +} + +Point3 +addpt3(Point3 a, Point3 b) +{ + return (Point3){a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; +} + +Point3 +subpt3(Point3 a, Point3 b) +{ + return (Point3){a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; +} + +Point3 +mulpt3(Point3 p, double s) +{ + return (Point3){p.x*s, p.y*s, p.z*s, p.w*s}; +} + +Point3 +divpt3(Point3 p, double s) +{ + return (Point3){p.x/s, p.y/s, p.z/s, p.w/s}; +} + +Point3 +lerp3(Point3 a, Point3 b, double t) +{ + if(t < 0) t = 0; + if(t > 1) t = 1; + return (Point3){ + (1 - t)*a.x + t*b.x, + (1 - t)*a.y + t*b.y, + (1 - t)*a.z + t*b.z, + (1 - t)*a.w + t*b.w + }; +} + +double +dotvec3(Point3 a, Point3 b) +{ + return a.x*b.x + a.y*b.y + a.z*b.z; +} + +Point3 +crossvec3(Point3 a, Point3 b) +{ + return (Point3){ + a.y*b.z - a.z*b.y, + a.z*b.x - a.x*b.z, + a.x*b.y - a.y*b.x, + 0 + }; +} + +double +vec3len(Point3 v) +{ + return sqrt(dotvec3(v, v)); +} + +Point3 +normvec3(Point3 v) +{ + double len; + + len = vec3len(v); + if(len == 0) + return (Point3){0, 0, 0, 0}; + return (Point3){v.x/len, v.y/len, v.z/len, 0}; +} diff --git a/libgeometry/quaternion.c b/libgeometry/quaternion.c new file mode 100644 index 0000000..b8eaa88 --- /dev/null +++ b/libgeometry/quaternion.c @@ -0,0 +1,90 @@ +#include <u.h> +#include <libc.h> +#include "../geometry.h" + +Quaternion +Quat(double r, double i, double j, double k) +{ + return (Quaternion){r, i, j, k}; +} + +Quaternion +Quatvec(double s, Point3 v) +{ + return (Quaternion){s, v.x, v.y, v.z}; +} + +Quaternion +addq(Quaternion a, Quaternion b) +{ + return (Quaternion){a.r+b.r, a.i+b.i, a.j+b.j, a.k+b.k}; +} + +Quaternion +subq(Quaternion a, Quaternion b) +{ + return (Quaternion){a.r-b.r, a.i-b.i, a.j-b.j, a.k-b.k}; +} + +Quaternion +mulq(Quaternion q, Quaternion r) +{ + Point3 qv, rv, tmp; + + qv = Vec3(q.i, q.j, q.k); + rv = Vec3(r.i, r.j, r.k); + tmp = addpt3(addpt3(mulpt3(rv, q.r), mulpt3(qv, r.r)), crossvec3(qv, rv)); + return (Quaternion){q.r*r.r - dotvec3(qv, rv), tmp.x, tmp.y, tmp.z}; +} + +Quaternion +smulq(Quaternion q, double s) +{ + return (Quaternion){q.r*s, q.i*s, q.j*s, q.k*s}; +} + +Quaternion +sdivq(Quaternion q, double s) +{ + return (Quaternion){q.r/s, q.i/s, q.j/s, q.k/s}; +} + +double +dotq(Quaternion q, Quaternion r) +{ + return q.r*r.r + q.i*r.i + q.j*r.j + q.k*r.k; +} + +Quaternion +invq(Quaternion q) +{ + double len²; + + len² = dotq(q, q); + if(len² == 0) + return (Quaternion){0, 0, 0, 0}; + return (Quaternion){q.r/len², -q.i/len², -q.j/len², -q.k/len²}; +} + +double +qlen(Quaternion q) +{ + return sqrt(q.r*q.r + q.i*q.i + q.j*q.j + q.k*q.k); +} + +Quaternion +normq(Quaternion q) +{ + return sdivq(q, qlen(q)); +} + +Point3 +qrotate(Point3 p, Point3 axis, double angle) +{ + Quaternion qaxis, qr; + + angle /= 2; + qaxis = Quatvec(cos(angle), mulpt3(axis, sin(angle))); + qr = mulq(mulq(qaxis, Quatvec(0, p)), invq(qaxis)); + return Vec3(qr.i, qr.j, qr.k); +} diff --git a/libgeometry/rframe.c b/libgeometry/rframe.c new file mode 100644 index 0000000..06d63f2 --- /dev/null +++ b/libgeometry/rframe.c @@ -0,0 +1,51 @@ +#include <u.h> +#include <libc.h> +#include "../geometry.h" + +Point2 +rframexform(Point2 p, RFrame rf) +{ + Matrix m = { + rf.bx.x, rf.bx.y, -dotvec2(rf.bx, rf.p), + rf.by.x, rf.by.y, -dotvec2(rf.by, rf.p), + 0, 0, 1, + }; + return xform(p, m); +} + +Point3 +rframexform3(Point3 p, RFrame3 rf) +{ + Matrix3 m = { + rf.bx.x, rf.bx.y, rf.bx.z, -dotvec3(rf.bx, rf.p), + rf.by.x, rf.by.y, rf.by.z, -dotvec3(rf.by, rf.p), + rf.bz.x, rf.bz.y, rf.bz.z, -dotvec3(rf.bz, rf.p), + 0, 0, 0, 1, + }; + return xform3(p, m); +} + +Point2 +invrframexform(Point2 p, RFrame rf) +{ + Matrix m = { + rf.bx.x, rf.bx.y, -dotvec2(rf.bx, rf.p), + rf.by.x, rf.by.y, -dotvec2(rf.by, rf.p), + 0, 0, 1, + }; + invm(m); + return xform(p, m); +} + +Point3 +invrframexform3(Point3 p, RFrame3 rf) +{ + Matrix3 m = { + rf.bx.x, rf.bx.y, rf.bx.z, -dotvec3(rf.bx, rf.p), + rf.by.x, rf.by.y, rf.by.z, -dotvec3(rf.by, rf.p), + rf.bz.x, rf.bz.y, rf.bz.z, -dotvec3(rf.bz, rf.p), + 0, 0, 0, 1, + }; + invm3(m); + return xform3(p, m); +} diff --git a/libgeometry/triangle.c b/libgeometry/triangle.c new file mode 100644 index 0000000..a8bbf0f --- /dev/null +++ b/libgeometry/triangle.c @@ -0,0 +1,9 @@ +#include <u.h> +#include <libc.h> +#include "../geometry.h" + +Point3 +centroid(Triangle3 t) +{ + return divpt3(addpt3(t.p0, addpt3(t.p1, t.p2)), 3); +} diff --git a/libgraphics/camera.c b/libgraphics/camera.c new file mode 100644 index 0000000..c850477 --- /dev/null +++ b/libgraphics/camera.c @@ -0,0 +1,103 @@ +#include <u.h> +#include <libc.h> +#include <draw.h> +#include "../geometry.h" +#include "../graphics.h" + +static int +max(int a, int b) +{ + return a > b ? a : b; +} + +static void +verifycfg(Camera *c) +{ + assert(c->viewport != nil); + if(c->ptype == Ppersp) + assert(c->fov >= 1 && c->fov < 360); + assert(c->clip.n > 0 && c->clip.n < c->clip.f); +} + +void +perspective(Matrix3 m, double fov, double a, double n, double f) +{ + double cotan; + + cotan = 1/tan(fov/2*DEG); + identity3(m); + m[0][0] = cotan/a; + m[1][1] = cotan; + m[2][2] = -(f+n)/(f-n); + m[2][3] = -2*f*n/(f-n); + m[3][2] = -1; +} + +void +orthographic(Matrix3 m, double l, double r, double b, double t, double n, double f) +{ + identity3(m); + m[0][0] = 2/(r - l); + m[1][1] = 2/(t - b); + m[2][2] = -2/(f - n); + m[0][3] = -(r + l)/(r - l); + m[1][3] = -(t + b)/(t - b); + m[2][3] = -(f + n)/(f - n); +} + +void +configcamera(Camera *c, Image *v, double fov, double n, double f, Projection p) +{ + c->viewport = v; + c->fov = fov; + c->clip.n = n; + c->clip.f = f; + c->ptype = p; + reloadcamera(c); +} + +void +placecamera(Camera *c, Point3 p, Point3 focus, Point3 up) +{ + c->p = p; + if(focus.w == 0) + c->bz = focus; + else + c->bz = normvec3(subpt3(c->p, focus)); + c->bx = normvec3(crossvec3(up, c->bz)); + c->by = crossvec3(c->bz, c->bx); +} + +void +aimcamera(Camera *c, Point3 focus) +{ + placecamera(c, c->p, focus, c->by); +} + +void +reloadcamera(Camera *c) +{ + double a; + double l, r, b, t; + + verifycfg(c); + switch(c->ptype){ + case Portho: + /* + r = Dx(c->viewport->r)/2; + t = Dy(c->viewport->r)/2; + l = -r; + b = -t; + */ + l = t = 0; + r = Dx(c->viewport->r); + b = Dy(c->viewport->r); + orthographic(c->proj, l, r, b, t, c->clip.n, c->clip.f); + break; + case Ppersp: + a = (double)Dx(c->viewport->r)/Dy(c->viewport->r); + perspective(c->proj, c->fov, a, c->clip.n, c->clip.f); + break; + default: sysfatal("unknown projection type"); + } +} diff --git a/libgraphics/doc/libgraphics.ms b/libgraphics/doc/libgraphics.ms new file mode 100644 index 0000000..87a23a7 --- /dev/null +++ b/libgraphics/doc/libgraphics.ms @@ -0,0 +1,34 @@ +.TL +libgraphics +.AU +Rodrigo G. López +.sp +rgl@antares-labs.eu +.AI +Antares Telecom Laboratories +Albatera, Alicante +.FS +ACHTUNG! this is a +.B "WORK IN PROGRESS" +.FE +.NH 1 +Data Structures +.NH 2 +Camera +.P1 +struct Camera { + RFrame3; /* VCS */ + Image *viewport; + double fov; /* vertical FOV */ + struct { + double n, f; /* near and far clipping planes */ + } clip; + Projection ptype; + Matrix3 proj; /* VCS to viewport xform */ +}; +.P2 +.PP +A camera is an image capturing entity, analog to the real world device +we all know, that allows us to see the virtual 3-D world by projecting +it into a viewport we can attach to a screen or window for real-time +visualization or write out into a file. diff --git a/libgraphics/doc/libgraphics.pdf b/libgraphics/doc/libgraphics.pdf Binary files differnew file mode 100644 index 0000000..0291710 --- /dev/null +++ b/libgraphics/doc/libgraphics.pdf diff --git a/libgraphics/doc/libgraphics.ps b/libgraphics/doc/libgraphics.ps new file mode 100644 index 0000000..1a566f7 --- /dev/null +++ b/libgraphics/doc/libgraphics.ps @@ -0,0 +1,583 @@ +%!PS-Adobe-2.0 +%%Version: 0.1 +%%Creator: troff, Plan 9 edition +%%DocumentFonts: (atend) +%%Pages: (atend) +%%EndComments +% +% Version 3.3.2 prologue for troff files. +% + +/#copies 1 store +/aspectratio 1 def +/formsperpage 1 def +/landscape false def +/linewidth .3 def +/magnification 1 def +/margin 0 def +/orientation 0 def +/resolution 720 def +/rotation 1 def +/xoffset 0 def +/yoffset 0 def + +/roundpage true def +/useclippath true def +/pagebbox [0 0 612 792] def + +/R /Times-Roman def +/I /Times-Italic def +/B /Times-Bold def +/BI /Times-BoldItalic def +/H /Helvetica def +/HI /Helvetica-Oblique def +/HB /Helvetica-Bold def +/HX /Helvetica-BoldOblique def +/CW /Courier def +/CO /Courier def +/CI /Courier-Oblique def +/CB /Courier-Bold def +/CX /Courier-BoldOblique def +/PA /Palatino-Roman def +/PI /Palatino-Italic def +/PB /Palatino-Bold def +/PX /Palatino-BoldItalic def +/Hr /Helvetica-Narrow def +/Hi /Helvetica-Narrow-Oblique def +/Hb /Helvetica-Narrow-Bold def +/Hx /Helvetica-Narrow-BoldOblique def +/KR /Bookman-Light def +/KI /Bookman-LightItalic def +/KB /Bookman-Demi def +/KX /Bookman-DemiItalic def +/AR /AvantGarde-Book def +/AI /AvantGarde-BookOblique def +/AB /AvantGarde-Demi def +/AX /AvantGarde-DemiOblique def +/NR /NewCenturySchlbk-Roman def +/NI /NewCenturySchlbk-Italic def +/NB /NewCenturySchlbk-Bold def +/NX /NewCenturySchlbk-BoldItalic def +/ZD /ZapfDingbats def +/ZI /ZapfChancery-MediumItalic def +/S /S def +/S1 /S1 def +/GR /Symbol def + +/inch {72 mul} bind def +/min {2 copy gt {exch} if pop} bind def + +/setup { + counttomark 2 idiv {def} repeat pop + + landscape {/orientation 90 orientation add def} if + /scaling 72 resolution div def + linewidth setlinewidth + 1 setlinecap + + pagedimensions + xcenter ycenter translate + orientation rotation mul rotate + width 2 div neg height 2 div translate + xoffset inch yoffset inch neg translate + margin 2 div dup neg translate + magnification dup aspectratio mul scale + scaling scaling scale + + addmetrics + 0 0 moveto +} def + +/pagedimensions { + useclippath userdict /gotpagebbox known not and { + /pagebbox [clippath pathbbox newpath] def + roundpage currentdict /roundpagebbox known and {roundpagebbox} if + } if + pagebbox aload pop + 4 -1 roll exch 4 1 roll 4 copy + landscape {4 2 roll} if + sub /width exch def + sub /height exch def + add 2 div /xcenter exch def + add 2 div /ycenter exch def + userdict /gotpagebbox true put +} def + +/addmetrics { + /Symbol /S null Sdefs cf + /Times-Roman /S1 StandardEncoding dup length array copy S1defs cf +} def + +/pagesetup { + /page exch def + currentdict /pagedict known currentdict page known and { + page load pagedict exch get cvx exec + } if +} def + +/decodingdefs [ + {counttomark 2 idiv {y moveto show} repeat} + {neg /y exch def counttomark 2 idiv {y moveto show} repeat} + {neg moveto {2 index stringwidth pop sub exch div 0 32 4 -1 roll widthshow} repeat} + {neg moveto {spacewidth sub 0.0 32 4 -1 roll widthshow} repeat} + {counttomark 2 idiv {y moveto show} repeat} + {neg setfunnytext} +] def + +/setdecoding {/t decodingdefs 3 -1 roll get bind def} bind def + +/w {neg moveto show} bind def +/m {neg dup /y exch def moveto} bind def +/done {/lastpage where {pop lastpage} if} def + +/f { + dup /font exch def findfont exch + dup /ptsize exch def scaling div dup /size exch def scalefont setfont + linewidth ptsize mul scaling 10 mul div setlinewidth + /spacewidth ( ) stringwidth pop def +} bind def + +/changefont { + /fontheight exch def + /fontslant exch def + currentfont [ + 1 0 + fontheight ptsize div fontslant sin mul fontslant cos div + fontheight ptsize div + 0 0 + ] makefont setfont +} bind def + +/sf {f} bind def + +/cf { + dup length 2 idiv + /entries exch def + /chtab exch def + /newencoding exch def + /newfont exch def + + findfont dup length 1 add dict + /newdict exch def + {1 index /FID ne {newdict 3 1 roll put}{pop pop} ifelse} forall + + newencoding type /arraytype eq {newdict /Encoding newencoding put} if + + newdict /Metrics entries dict put + newdict /Metrics get + begin + chtab aload pop + 1 1 entries {pop def} for + newfont newdict definefont pop + end +} bind def + +% +% A few arrays used to adjust reference points and character widths in some +% of the printer resident fonts. If square roots are too high try changing +% the lines describing /radical and /radicalex to, +% +% /radical [0 -75 550 0] +% /radicalex [-50 -75 500 0] +% +% Move braceleftbt a bit - default PostScript character is off a bit. +% + +/Sdefs [ + /bracketlefttp [201 500] + /bracketleftbt [201 500] + /bracketrighttp [-81 380] + /bracketrightbt [-83 380] + /braceleftbt [203 490] + /bracketrightex [220 -125 500 0] + /radical [0 0 550 0] + /radicalex [-50 0 500 0] + /parenleftex [-20 -170 0 0] + /integral [100 -50 500 0] + /infinity [10 -75 730 0] +] def + +/S1defs [ + /underscore [0 80 500 0] + /endash [7 90 650 0] +] def +% +% Tries to round clipping path dimensions, as stored in array pagebbox, so they +% match one of the known sizes in the papersizes array. Lower left coordinates +% are always set to 0. +% + +/roundpagebbox { + 7 dict begin + /papersizes [8.5 inch 11 inch 14 inch 17 inch] def + + /mappapersize { + /val exch def + /slop .5 inch def + /diff slop def + /j 0 def + 0 1 papersizes length 1 sub { + /i exch def + papersizes i get val sub abs + dup diff le {/diff exch def /j i def} {pop} ifelse + } for + diff slop lt {papersizes j get} {val} ifelse + } def + + pagebbox 0 0 put + pagebbox 1 0 put + pagebbox dup 2 get mappapersize 2 exch put + pagebbox dup 3 get mappapersize 3 exch put + end +} bind def + +%%EndProlog +%%BeginSetup +mark +% +% Encoding vector and redefinition of findfont for the ISO Latin1 standard. +% The 18 characters missing from ROM based fonts on older printers are noted +% below. +% + +/ISOLatin1Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quoteright + /parenleft + /parenright + /asterisk + /plus + /comma + /minus + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /quoteleft + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /dotlessi + /grave + /acute + /circumflex + /tilde + /macron + /breve + /dotaccent + /dieresis + /.notdef + /ring + /cedilla + /.notdef + /hungarumlaut + /ogonek + /caron + /space + /exclamdown + /cent + /sterling + /currency + /yen + /brokenbar % missing + /section + /dieresis + /copyright + /ordfeminine + /guillemotleft + /logicalnot + /hyphen + /registered + /macron + /degree % missing + /plusminus % missing + /twosuperior % missing + /threesuperior % missing + /acute + /mu % missing + /paragraph + /periodcentered + /cedilla + /onesuperior % missing + /ordmasculine + /guillemotright + /onequarter % missing + /onehalf % missing + /threequarters % missing + /questiondown + /Agrave + /Aacute + /Acircumflex + /Atilde + /Adieresis + /Aring + /AE + /Ccedilla + /Egrave + /Eacute + /Ecircumflex + /Edieresis + /Igrave + /Iacute + /Icircumflex + /Idieresis + /Eth % missing + /Ntilde + /Ograve + /Oacute + /Ocircumflex + /Otilde + /Odieresis + /multiply % missing + /Oslash + /Ugrave + /Uacute + /Ucircumflex + /Udieresis + /Yacute % missing + /Thorn % missing + /germandbls + /agrave + /aacute + /acircumflex + /atilde + /adieresis + /aring + /ae + /ccedilla + /egrave + /eacute + /ecircumflex + /edieresis + /igrave + /iacute + /icircumflex + /idieresis + /eth % missing + /ntilde + /ograve + /oacute + /ocircumflex + /otilde + /odieresis + /divide % missing + /oslash + /ugrave + /uacute + /ucircumflex + /udieresis + /yacute % missing + /thorn % missing + /ydieresis +] def + +/NewFontDirectory FontDirectory maxlength dict def + +% +% Apparently no guarantee findfont is defined in systemdict so the obvious +% +% systemdict /findfont get exec +% +% can generate an error. So far the only exception is a VT600 (version 48.0). +% + +userdict /@RealFindfont known not { + userdict begin + /@RealFindfont systemdict begin /findfont load end def + end +} if + +/findfont { + dup NewFontDirectory exch known not { + dup + %dup systemdict /findfont get exec % not always in systemdict + dup userdict /@RealFindfont get exec + dup /Encoding get StandardEncoding eq { + dup length dict begin + {1 index /FID ne {def}{pop pop} ifelse} forall + /Encoding ISOLatin1Encoding def + currentdict + end + /DummyFontName exch definefont + } if + NewFontDirectory 3 1 roll put + } if + NewFontDirectory exch get +} bind def + +%%Patch from lp +%%EndPatch from lp + +setup +%%EndSetup +%%Page: 1 1 +/saveobj save def +mark +1 pagesetup +12 /LucidaSans-Demi f +(libgraphics) 2533 1220 w +10 /LucidaSans-Italic f +(Rodrigo G. L\363pez) 2469 1480 w +(rgl@antares-labs.eu) 2377 1760 w +10 /LucidaSansUnicode00 f +(Antares Telecom Laboratories) 2156 1960 w +(Albatera, Alicante) 2451 2100 w +10 /LucidaSans-Demi f +(1.) 720 2700 w +(Data Structures) 873 2700 w +(1.1.) 720 2940 w +(Camera) 962 2940 w +9 /LucidaTypewriter f +(struct) 920 3110 w +(Camera) 1375 3110 w +({) 1830 3110 w +(};) 920 3330 w +10 /LucidaSansUnicode00 f +(A camera) 970 3546 w +8 /S1 f +(__________________) 720 6980 w +8 /LucidaSansUnicode00 f +(ACHTUNG!) 720 7080 w +(this) 1163 7080 w +(is) 1333 7080 w +(a) 1423 7080 w +8 /LucidaSans-Demi f +(WORK) 1493 7080 w +(IN) 1769 7080 w +(PROGRESS) 1883 7080 w +cleartomark +showpage +saveobj restore +%%EndPage: 1 1 +%%Trailer +done +%%DocumentFonts: S1 LucidaSansUnicode00 LucidaSans-Demi LucidaSans-Italic LucidaTypewriter +%%Pages: 1 diff --git a/libgraphics/doc/mkfile b/libgraphics/doc/mkfile new file mode 100644 index 0000000..3bac031 --- /dev/null +++ b/libgraphics/doc/mkfile @@ -0,0 +1,15 @@ +FONTS='.FP lucidasans' +DOCNAME=libgraphics + +all:VQ: $DOCNAME.ps $DOCNAME.pdf + +clean:VQ: + rm -f $DOCNAME.ps $DOCNAME.pdf + +$DOCNAME.ps:V: $DOCNAME.ms + {echo $FONTS; cat $prereq}> _$prereq + eval `{doctype _$prereq} | lp -dstdout > $target && rm -f _$prereq + +$DOCNAME.pdf:V: $DOCNAME.ps + cat /sys/doc/docfonts $prereq > _$prereq + ps2pdf _$prereq $target && rm -f _$prereq diff --git a/libgraphics/mkfile b/libgraphics/mkfile new file mode 100644 index 0000000..b7669a3 --- /dev/null +++ b/libgraphics/mkfile @@ -0,0 +1,11 @@ +</$objtype/mkfile + +LIB=../libgraphics.a$O +OFILES=\ + triangle.$O\ + camera.$O\ + render.$O\ + +HFILES=../graphics.h + +</sys/src/cmd/mklib diff --git a/libgraphics/render.c b/libgraphics/render.c new file mode 100644 index 0000000..f4e4c0f --- /dev/null +++ b/libgraphics/render.c @@ -0,0 +1,84 @@ +#include <u.h> +#include <libc.h> +#include <draw.h> +#include "../geometry.h" +#include "../graphics.h" + +/* + * careful with concurrent rendering. + * use a lock or embed on each routine. + */ +static RFrame imgrframe = { + 0, 0, 1, /* p */ + 1, 0, 0, /* bx */ + 0, -1, 0 /* by */ +}; + +/* requires p to be in NDC */ +int +isclipping(Point3 p) +{ + if(p.x > p.w || p.x < -p.w || + p.y > p.w || p.y < -p.w || + p.z > p.w || p.z < 0) + return 1; + return 0; +} + +static Point2 +flatten(Camera *c, Point3 p) +{ + Point2 p2; + Matrix S = { + Dx(c->viewport->r)/2, 0, 0, + 0, Dy(c->viewport->r)/2, 0, + 0, 0, 1, + }, T = { + 1, 0, 1, + 0, 1, 1, + 0, 0, 1, + }; + + p2 = (Point2){p.x, p.y, p.w}; + if(p2.w != 0) + p2 = divpt2(p2, p2.w); + mulm(S, T); + p2 = xform(p2, S); + return p2; +} + +Point +toviewport(Camera *c, Point3 p) +{ + Point2 p2; + + imgrframe.p = Pt2(c->viewport->r.min.x, c->viewport->r.max.y, 1); + p2 = invrframexform(flatten(c, p), imgrframe); + return (Point){p2.x, p2.y}; +} + +Point2 +fromviewport(Camera *c, Point p) +{ + imgrframe.p = Pt2(c->viewport->r.min.x, c->viewport->r.max.y, 1); + return rframexform(Pt2(p.x, p.y, 1), imgrframe); +} + +void +line3(Camera *c, Point3 p0, Point3 p1, int end0, int end1, Image *src) +{ + p0 = WORLD2NDC(c, p0); + p1 = WORLD2NDC(c, p1); + if(isclipping(p0) || isclipping(p1)) + return; + line(c->viewport, toviewport(c, p0), toviewport(c, p1), end0, end1, 0, src, ZP); +} + +Point +string3(Camera *c, Point3 p, Image *src, Font *f, char *s) +{ + p = WORLD2NDC(c, p); + if(isclipping(p)) + return (Point){~0, ~0}; + return string(c->viewport, toviewport(c, p), src, ZP, f, s); +} diff --git a/libgraphics/triangle.c b/libgraphics/triangle.c new file mode 100644 index 0000000..b598855 --- /dev/null +++ b/libgraphics/triangle.c @@ -0,0 +1,43 @@ +#include <u.h> +#include <libc.h> +#include <draw.h> +#include "../geometry.h" +#include "../graphics.h" + +Triangle +Trian(int x0, int y0, int x1, int y1, int x2, int y2) +{ + return (Triangle){Pt(x0, y0), Pt(x1, y1), Pt(x2, y2)}; +} + +Triangle +Trianpt(Point p0, Point p1, Point p2) +{ + return (Triangle){p0, p1, p2}; +} + +void +triangle(Image *dst, Triangle t, int thick, Image *src, Point sp) +{ + Point pl[4]; + + pl[0] = t.p0; + pl[1] = t.p1; + pl[2] = t.p2; + pl[3] = pl[0]; + + poly(dst, pl, nelem(pl), 0, 0, thick, src, sp); +} + +void +filltriangle(Image *dst, Triangle t, Image *src, Point sp) +{ + Point pl[4]; + + pl[0] = t.p0; + pl[1] = t.p1; + pl[2] = t.p2; + pl[3] = pl[0]; + + fillpoly(dst, pl, nelem(pl), 0, src, sp); +} diff --git a/libobj/examples/box.obj b/libobj/examples/box.obj new file mode 100644 index 0000000..bd72661 --- /dev/null +++ b/libobj/examples/box.obj @@ -0,0 +1,30 @@ +# Vertices: 8 +# Points: 0 +# Lines: 0 +# Faces: 6 +# Materials: 1 + +o 1 + +# Vertex list + +v -0.5 -0.5 0.5 +v -0.5 -0.5 -0.5 +v -0.5 0.5 -0.5 +v -0.5 0.5 0.5 +v 0.5 -0.5 0.5 +v 0.5 -0.5 -0.5 +v 0.5 0.5 -0.5 +v 0.5 0.5 0.5 + +# Point/Line/Face list + +usemtl Default +f 4 3 2 1 +f 2 6 5 1 +f 3 7 6 2 +f 8 7 3 4 +f 5 8 4 1 +f 6 7 8 5 + +# End of file diff --git a/libobj/examples/cube.obj b/libobj/examples/cube.obj new file mode 100644 index 0000000..c569712 --- /dev/null +++ b/libobj/examples/cube.obj @@ -0,0 +1,16 @@ +# This is a cube that measures two units on each side. Each vertex is +# shared by three different faces. +v 0.000000 2.000000 2.000000 +v 0.000000 0.000000 2.000000 +v 2.000000 0.000000 2.000000 +v 2.000000 2.000000 2.000000 +v 0.000000 2.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 2.000000 0.000000 0.000000 +v 2.000000 2.000000 0.000000 +f 1 2 3 4 +f 8 7 6 5 +f 4 3 7 8 +f 5 1 4 8 +f 5 6 2 1 +f 2 6 7 3 diff --git a/libobj/examples/diamond.obj b/libobj/examples/diamond.obj new file mode 100644 index 0000000..519f3ac --- /dev/null +++ b/libobj/examples/diamond.obj @@ -0,0 +1,20 @@ +# diamond.obj + +g Object001 + +v 0.000000E+00 0.000000E+00 78.0000 +v 45.0000 45.0000 0.000000E+00 +v 45.0000 -45.0000 0.000000E+00 +v -45.0000 -45.0000 0.000000E+00 +v -45.0000 45.0000 0.000000E+00 +v 0.000000E+00 0.000000E+00 -78.0000 + +f 1 2 3 +f 1 3 4 +f 1 4 5 +f 1 5 2 +f 6 5 4 +f 6 4 3 +f 6 3 2 +f 6 2 1 +f 6 1 5 diff --git a/libobj/examples/lamp.obj b/libobj/examples/lamp.obj new file mode 100644 index 0000000..d8023e1 --- /dev/null +++ b/libobj/examples/lamp.obj @@ -0,0 +1,8863 @@ +# Viewpoint Datalabs International, Inc. Copyright 1996 + + +mtllib ./vp.mtl + +g +v 0.000000 8.407028 0.000000 +v 0.000000 8.380042 -0.204985 +v 0.053054 8.380042 -0.198000 +v 0.102492 8.380042 -0.177522 +v 0.144946 8.380042 -0.144946 +v 0.177522 8.380042 -0.102492 +v 0.198000 8.380042 -0.053054 +v 0.204985 8.380042 0.000000 +v 0.198000 8.380042 0.053054 +v 0.177522 8.380042 0.102492 +v 0.144946 8.380042 0.144946 +v 0.102493 8.380042 0.177522 +v 0.053054 8.380042 0.198000 +v 0.000000 8.380042 0.204985 +v -0.053054 8.380042 0.198000 +v -0.102492 8.380042 0.177522 +v -0.144946 8.380042 0.144946 +v -0.177522 8.380042 0.102493 +v -0.198000 8.380042 0.053054 +v -0.204985 8.380042 0.000000 +v -0.198000 8.380042 -0.053054 +v -0.177522 8.380042 -0.102492 +v -0.144946 8.380042 -0.144946 +v -0.102493 8.380042 -0.177522 +v -0.053054 8.380042 -0.198000 +v 0.000000 8.300921 -0.396000 +v 0.102492 8.300921 -0.382507 +v 0.198000 8.300921 -0.342946 +v 0.280014 8.300921 -0.280014 +v 0.342946 8.300921 -0.198000 +v 0.382506 8.300921 -0.102493 +v 0.396000 8.300921 0.000000 +v 0.382507 8.300921 0.102492 +v 0.342946 8.300921 0.198000 +v 0.280015 8.300921 0.280014 +v 0.198000 8.300921 0.342946 +v 0.102493 8.300921 0.382506 +v 0.000000 8.300921 0.396000 +v -0.102492 8.300921 0.382507 +v -0.197999 8.300921 0.342946 +v -0.280014 8.300921 0.280015 +v -0.342946 8.300921 0.198000 +v -0.382506 8.300921 0.102493 +v -0.396000 8.300921 0.000000 +v -0.382507 8.300921 -0.102492 +v -0.342946 8.300921 -0.197999 +v -0.280015 8.300921 -0.280014 +v -0.198001 8.300921 -0.342946 +v -0.102493 8.300921 -0.382506 +v 0.000000 8.175057 -0.560028 +v 0.144946 8.175057 -0.540946 +v 0.280014 8.175057 -0.484999 +v 0.396000 8.175057 -0.396000 +v 0.484999 8.175057 -0.280015 +v 0.540946 8.175057 -0.144947 +v 0.560028 8.175057 0.000000 +v 0.540946 8.175057 0.144945 +v 0.484999 8.175057 0.280014 +v 0.396000 8.175057 0.395999 +v 0.280015 8.175057 0.484999 +v 0.144947 8.175057 0.540946 +v 0.000000 8.175057 0.560028 +v -0.144945 8.175057 0.540946 +v -0.280014 8.175057 0.484999 +v -0.395999 8.175057 0.396001 +v -0.484998 8.175057 0.280015 +v -0.540946 8.175057 0.144947 +v -0.560028 8.175057 0.000000 +v -0.540946 8.175057 -0.144945 +v -0.484999 8.175057 -0.280013 +v -0.396001 8.175057 -0.395999 +v -0.280015 8.175057 -0.484998 +v -0.144947 8.175057 -0.540946 +v 0.000000 8.011028 -0.685892 +v 0.177521 8.011028 -0.662521 +v 0.342946 8.011028 -0.594000 +v 0.484999 8.011028 -0.484999 +v 0.594000 8.011028 -0.342947 +v 0.662521 8.011028 -0.177523 +v 0.685892 8.011028 0.000000 +v 0.662521 8.011028 0.177521 +v 0.594000 8.011028 0.342945 +v 0.484999 8.011028 0.484998 +v 0.342947 8.011028 0.594000 +v 0.177523 8.011028 0.662521 +v 0.000000 8.011028 0.685892 +v -0.177521 8.011028 0.662521 +v -0.342945 8.011028 0.594000 +v -0.484998 8.011028 0.485000 +v -0.593999 8.011028 0.342947 +v -0.662521 8.011028 0.177523 +v -0.685892 8.011028 0.000001 +v -0.662521 8.011028 -0.177521 +v -0.594001 8.011028 -0.342945 +v -0.485000 8.011028 -0.484998 +v -0.342947 8.011028 -0.593999 +v -0.177523 8.011028 -0.662521 +v 0.000000 7.820013 -0.765013 +v 0.197999 7.820013 -0.738946 +v 0.382506 7.820013 -0.662521 +v 0.540946 7.820013 -0.540946 +v 0.662521 7.820013 -0.382507 +v 0.738946 7.820013 -0.198001 +v 0.765013 7.820013 0.000000 +v 0.738946 7.820013 0.197999 +v 0.662521 7.820013 0.382506 +v 0.540947 7.820013 0.540945 +v 0.382507 7.820013 0.662520 +v 0.198001 7.820013 0.738946 +v 0.000001 7.820013 0.765013 +v -0.197999 7.820013 0.738946 +v -0.382506 7.820013 0.662521 +v -0.540945 7.820013 0.540947 +v -0.662520 7.820013 0.382508 +v -0.738946 7.820013 0.198001 +v -0.765013 7.820013 0.000001 +v -0.738946 7.820013 -0.197999 +v -0.662522 7.820013 -0.382505 +v -0.540947 7.820013 -0.540945 +v -0.382508 7.820013 -0.662520 +v -0.198001 7.820013 -0.738946 +v 0.000000 7.615029 -0.792000 +v 0.204984 7.615029 -0.765013 +v 0.395999 7.615029 -0.685892 +v 0.560028 7.615029 -0.560029 +v 0.685892 7.615029 -0.396001 +v 0.765013 7.615029 -0.204985 +v 0.792000 7.615029 0.000000 +v 0.765013 7.615029 0.204984 +v 0.685893 7.615029 0.395999 +v 0.560029 7.615029 0.560028 +v 0.396001 7.615029 0.685892 +v 0.204986 7.615029 0.765013 +v 0.000001 7.615029 0.792000 +v -0.204984 7.615029 0.765014 +v -0.395999 7.615029 0.685893 +v -0.560028 7.615029 0.560029 +v -0.685892 7.615029 0.396001 +v -0.765013 7.615029 0.204986 +v -0.792000 7.615029 0.000001 +v -0.765014 7.615029 -0.204983 +v -0.685893 7.615029 -0.395999 +v -0.560030 7.615029 -0.560028 +v -0.396001 7.615029 -0.685891 +v -0.204986 7.615029 -0.765013 +v 0.000000 7.410044 -0.765013 +v 0.198000 7.410044 -0.738946 +v 0.382506 7.410044 -0.662521 +v 0.540946 7.410044 -0.540947 +v 0.662521 7.410044 -0.382507 +v 0.738946 7.410044 -0.198001 +v 0.765013 7.410044 0.000000 +v 0.738946 7.410044 0.197999 +v 0.662521 7.410044 0.382506 +v 0.540947 7.410044 0.540945 +v 0.382507 7.410044 0.662521 +v 0.198001 7.410044 0.738946 +v 0.000001 7.410044 0.765013 +v -0.197999 7.410044 0.738946 +v -0.382506 7.410044 0.662522 +v -0.540945 7.410044 0.540947 +v -0.662520 7.410044 0.382508 +v -0.738946 7.410044 0.198001 +v -0.765013 7.410044 0.000001 +v -0.738946 7.410044 -0.197999 +v -0.662522 7.410044 -0.382506 +v -0.540947 7.410044 -0.540945 +v -0.382508 7.410044 -0.662520 +v -0.198001 7.410044 -0.738946 +v 0.000000 7.219029 -0.685892 +v 0.177522 7.219029 -0.662521 +v 0.342946 7.219029 -0.594000 +v 0.484999 7.219029 -0.485000 +v 0.594000 7.219029 -0.342947 +v 0.662521 7.219029 -0.177523 +v 0.685892 7.219029 0.000000 +v 0.662521 7.219029 0.177521 +v 0.594001 7.219029 0.342946 +v 0.485000 7.219029 0.484999 +v 0.342947 7.219029 0.594000 +v 0.177523 7.219029 0.662521 +v 0.000000 7.219029 0.685892 +v -0.177521 7.219029 0.662521 +v -0.342945 7.219029 0.594001 +v -0.484998 7.219029 0.485000 +v -0.594000 7.219029 0.342947 +v -0.662521 7.219029 0.177523 +v -0.685892 7.219029 0.000001 +v -0.662521 7.219029 -0.177521 +v -0.594001 7.219029 -0.342945 +v -0.485000 7.219029 -0.484998 +v -0.342947 7.219029 -0.594000 +v -0.177523 7.219029 -0.662521 +v 0.000000 7.055001 -0.560029 +v 0.144946 7.055001 -0.540946 +v 0.280014 7.055001 -0.484999 +v 0.396000 7.055001 -0.396001 +v 0.484999 7.055001 -0.280015 +v 0.540946 7.055001 -0.144947 +v 0.560029 7.055001 0.000000 +v 0.540946 7.055001 0.144946 +v 0.485000 7.055001 0.280014 +v 0.396001 7.055001 0.396000 +v 0.280015 7.055001 0.484999 +v 0.144947 7.055001 0.540946 +v 0.000000 7.055001 0.560029 +v -0.144945 7.055001 0.540947 +v -0.280014 7.055001 0.485000 +v -0.396000 7.055001 0.396001 +v -0.484999 7.055001 0.280015 +v -0.540946 7.055001 0.144947 +v -0.560029 7.055001 0.000000 +v -0.540947 7.055001 -0.144945 +v -0.485000 7.055001 -0.280014 +v -0.396001 7.055001 -0.395999 +v -0.280015 7.055001 -0.484999 +v -0.144947 7.055001 -0.540946 +v 0.000000 6.929136 -0.396000 +v 0.102492 6.929136 -0.382507 +v 0.198000 6.929136 -0.342947 +v 0.280014 6.929136 -0.280015 +v 0.342946 6.929136 -0.198000 +v 0.382507 6.929136 -0.102493 +v 0.396000 6.929136 0.000000 +v 0.382507 6.929136 0.102492 +v 0.342947 6.929136 0.198000 +v 0.280015 6.929136 0.280014 +v 0.198001 6.929136 0.342946 +v 0.102493 6.929136 0.382507 +v 0.000000 6.929136 0.396000 +v -0.102492 6.929136 0.382507 +v -0.198000 6.929136 0.342947 +v -0.280014 6.929136 0.280015 +v -0.342946 6.929136 0.198001 +v -0.382507 6.929136 0.102493 +v -0.396000 6.929136 0.000000 +v -0.382507 6.929136 -0.102492 +v -0.342947 6.929136 -0.198000 +v -0.280015 6.929136 -0.280014 +v -0.198001 6.929136 -0.342946 +v -0.102493 6.929136 -0.382507 +v 0.000000 6.850015 -0.204985 +v 0.053054 6.850015 -0.198000 +v 0.102492 6.850015 -0.177522 +v 0.144946 6.850015 -0.144947 +v 0.177522 6.850015 -0.102493 +v 0.198000 6.850015 -0.053054 +v 0.204985 6.850015 0.000000 +v 0.198001 6.850015 0.053054 +v 0.177522 6.850015 0.102492 +v 0.144947 6.850015 0.144946 +v 0.102493 6.850015 0.177522 +v 0.053054 6.850015 0.198000 +v 0.000000 6.850015 0.204985 +v -0.053054 6.850015 0.198001 +v -0.102492 6.850015 0.177522 +v -0.144946 6.850015 0.144947 +v -0.177522 6.850015 0.102493 +v -0.198000 6.850015 0.053054 +v -0.204985 6.850015 0.000000 +v -0.198001 6.850015 -0.053054 +v -0.177523 6.850015 -0.102492 +v -0.144947 6.850015 -0.144946 +v -0.102493 6.850015 -0.177522 +v -0.053054 6.850015 -0.198000 +v 0.000000 6.823029 0.000000 +v 1.871946 7.231124 0.000000 +v 1.924999 7.204138 -0.198000 +v 1.871946 7.204138 -0.204985 +v 1.974438 7.204138 -0.177522 +v 2.016892 7.204138 -0.144946 +v 2.049468 7.204138 -0.102492 +v 2.069946 7.204138 -0.053054 +v 2.076930 7.204138 0.000000 +v 2.069946 7.204138 0.053054 +v 2.049468 7.204138 0.102492 +v 2.016892 7.204138 0.144946 +v 1.974438 7.204138 0.177522 +v 1.925000 7.204138 0.198000 +v 1.871946 7.204138 0.204985 +v 1.818892 7.204138 0.198000 +v 1.769454 7.204138 0.177522 +v 1.727000 7.204138 0.144946 +v 1.694424 7.204138 0.102493 +v 1.673946 7.204138 0.053054 +v 1.666961 7.204138 0.000000 +v 1.673946 7.204138 -0.053054 +v 1.694424 7.204138 -0.102492 +v 1.726999 7.204138 -0.144946 +v 1.769453 7.204138 -0.177522 +v 1.818891 7.204138 -0.198000 +v 1.974438 7.125016 -0.382507 +v 1.871946 7.125016 -0.396000 +v 2.069945 7.125016 -0.342946 +v 2.151960 7.125016 -0.280014 +v 2.214891 7.125016 -0.198000 +v 2.254452 7.125016 -0.102493 +v 2.267946 7.125016 0.000000 +v 2.254452 7.125016 0.102492 +v 2.214892 7.125016 0.198000 +v 2.151960 7.125016 0.280014 +v 2.069946 7.125016 0.342946 +v 1.974439 7.125016 0.382506 +v 1.871946 7.125016 0.396000 +v 1.769454 7.125016 0.382507 +v 1.673946 7.125016 0.342946 +v 1.591932 7.125016 0.280015 +v 1.529000 7.125016 0.198000 +v 1.489439 7.125016 0.102493 +v 1.475946 7.125016 0.000000 +v 1.489439 7.125016 -0.102492 +v 1.528999 7.125016 -0.197999 +v 1.591931 7.125016 -0.280014 +v 1.673945 7.125016 -0.342946 +v 1.769453 7.125016 -0.382506 +v 2.016891 6.999153 -0.540946 +v 1.871945 6.999153 -0.560028 +v 2.151960 6.999153 -0.484999 +v 2.267945 6.999153 -0.396000 +v 2.356944 6.999153 -0.280015 +v 2.412892 6.999153 -0.144947 +v 2.431974 6.999153 0.000000 +v 2.412892 6.999153 0.144945 +v 2.356945 6.999153 0.280014 +v 2.267946 6.999153 0.395999 +v 2.151961 6.999153 0.484999 +v 2.016892 6.999153 0.540946 +v 1.871946 6.999153 0.560028 +v 1.727000 6.999153 0.540946 +v 1.591932 6.999153 0.484999 +v 1.475946 6.999153 0.396001 +v 1.386947 6.999153 0.280015 +v 1.331000 6.999153 0.144947 +v 1.311917 6.999153 0.000000 +v 1.330999 6.999153 -0.144945 +v 1.386946 6.999153 -0.280013 +v 1.475945 6.999153 -0.395999 +v 1.591931 6.999153 -0.484998 +v 1.726999 6.999153 -0.540946 +v 2.049467 6.835124 -0.662521 +v 1.871945 6.835124 -0.685892 +v 2.214891 6.835124 -0.594000 +v 2.356944 6.835124 -0.484999 +v 2.465945 6.835124 -0.342947 +v 2.534467 6.835124 -0.177523 +v 2.557838 6.835124 0.000000 +v 2.534467 6.835124 0.177521 +v 2.465946 6.835124 0.342945 +v 2.356945 6.835124 0.484998 +v 2.214892 6.835124 0.594000 +v 2.049469 6.835124 0.662521 +v 1.871947 6.835124 0.685892 +v 1.694425 6.835124 0.662521 +v 1.529001 6.835124 0.594000 +v 1.386948 6.835124 0.485000 +v 1.277946 6.835124 0.342947 +v 1.209425 6.835124 0.177523 +v 1.186054 6.835124 0.000001 +v 1.209425 6.835124 -0.177521 +v 1.277945 6.835124 -0.342945 +v 1.386946 6.835124 -0.484998 +v 1.528999 6.835124 -0.593999 +v 1.694423 6.835124 -0.662521 +v 2.069945 6.644109 -0.738946 +v 1.871945 6.644109 -0.765013 +v 2.254452 6.644109 -0.662521 +v 2.412891 6.644109 -0.540946 +v 2.534466 6.644109 -0.382507 +v 2.610892 6.644109 -0.198001 +v 2.636959 6.644109 0.000000 +v 2.610892 6.644109 0.197999 +v 2.534467 6.644109 0.382506 +v 2.412892 6.644109 0.540945 +v 2.254453 6.644109 0.662520 +v 2.069947 6.644109 0.738946 +v 1.871947 6.644109 0.765013 +v 1.673947 6.644109 0.738946 +v 1.489440 6.644109 0.662521 +v 1.331001 6.644109 0.540947 +v 1.209425 6.644109 0.382508 +v 1.133000 6.644109 0.198001 +v 1.106933 6.644109 0.000001 +v 1.132999 6.644109 -0.197999 +v 1.209424 6.644109 -0.382505 +v 1.330999 6.644109 -0.540945 +v 1.489438 6.644109 -0.662520 +v 1.673944 6.644109 -0.738946 +v 2.076930 6.439125 -0.765013 +v 1.871945 6.439125 -0.792000 +v 2.267945 6.439125 -0.685892 +v 2.431974 6.439125 -0.560029 +v 2.557837 6.439125 -0.396001 +v 2.636959 6.439125 -0.204985 +v 2.663946 6.439125 0.000000 +v 2.636959 6.439125 0.204984 +v 2.557838 6.439125 0.395999 +v 2.431975 6.439125 0.560028 +v 2.267946 6.439125 0.685892 +v 2.076931 6.439125 0.765013 +v 1.871947 6.439125 0.792000 +v 1.666962 6.439125 0.765014 +v 1.475947 6.439125 0.685893 +v 1.311918 6.439125 0.560029 +v 1.186054 6.439125 0.396001 +v 1.106933 6.439125 0.204986 +v 1.079946 6.439125 0.000001 +v 1.106932 6.439125 -0.204983 +v 1.186053 6.439125 -0.395999 +v 1.311916 6.439125 -0.560028 +v 1.475945 6.439125 -0.685891 +v 1.666960 6.439125 -0.765013 +v 2.069945 6.234140 -0.738946 +v 1.871945 6.234140 -0.765013 +v 2.254452 6.234140 -0.662521 +v 2.412891 6.234140 -0.540947 +v 2.534466 6.234140 -0.382507 +v 2.610892 6.234140 -0.198001 +v 2.636959 6.234140 0.000000 +v 2.610892 6.234140 0.197999 +v 2.534467 6.234140 0.382506 +v 2.412892 6.234140 0.540945 +v 2.254453 6.234140 0.662521 +v 2.069947 6.234140 0.738946 +v 1.871947 6.234140 0.765013 +v 1.673947 6.234140 0.738946 +v 1.489440 6.234140 0.662522 +v 1.331000 6.234140 0.540947 +v 1.209425 6.234140 0.382508 +v 1.133000 6.234140 0.198001 +v 1.106932 6.234140 0.000001 +v 1.132999 6.234140 -0.197999 +v 1.209424 6.234140 -0.382506 +v 1.330999 6.234140 -0.540945 +v 1.489438 6.234140 -0.662520 +v 1.673944 6.234140 -0.738946 +v 2.049467 6.043124 -0.662521 +v 1.871945 6.043124 -0.685892 +v 2.214891 6.043124 -0.594000 +v 2.356945 6.043124 -0.485000 +v 2.465946 6.043124 -0.342947 +v 2.534467 6.043124 -0.177523 +v 2.557838 6.043124 0.000000 +v 2.534467 6.043124 0.177521 +v 2.465946 6.043124 0.342946 +v 2.356946 6.043124 0.484999 +v 2.214893 6.043124 0.594000 +v 2.049469 6.043124 0.662521 +v 1.871947 6.043124 0.685892 +v 1.694425 6.043124 0.662521 +v 1.529000 6.043124 0.594001 +v 1.386947 6.043124 0.485000 +v 1.277946 6.043124 0.342947 +v 1.209425 6.043124 0.177523 +v 1.186054 6.043124 0.000001 +v 1.209424 6.043124 -0.177521 +v 1.277945 6.043124 -0.342945 +v 1.386946 6.043124 -0.484998 +v 1.528998 6.043124 -0.594000 +v 1.694422 6.043124 -0.662521 +v 2.016891 5.879096 -0.540946 +v 1.871945 5.879096 -0.560029 +v 2.151960 5.879096 -0.484999 +v 2.267946 5.879096 -0.396001 +v 2.356945 5.879096 -0.280015 +v 2.412892 5.879096 -0.144947 +v 2.431975 5.879096 0.000000 +v 2.412892 5.879096 0.144946 +v 2.356945 5.879096 0.280014 +v 2.267946 5.879096 0.396000 +v 2.151961 5.879096 0.484999 +v 2.016892 5.879096 0.540946 +v 1.871946 5.879096 0.560029 +v 1.727000 5.879096 0.540947 +v 1.591932 5.879096 0.485000 +v 1.475946 5.879096 0.396001 +v 1.386947 5.879096 0.280015 +v 1.331000 5.879096 0.144947 +v 1.311917 5.879096 0.000000 +v 1.330999 5.879096 -0.144945 +v 1.386946 5.879096 -0.280014 +v 1.475945 5.879096 -0.395999 +v 1.591930 5.879096 -0.484999 +v 1.726999 5.879096 -0.540946 +v 1.974438 5.753232 -0.382507 +v 1.871946 5.753232 -0.396000 +v 2.069946 5.753232 -0.342947 +v 2.151960 5.753232 -0.280015 +v 2.214892 5.753232 -0.198000 +v 2.254453 5.753232 -0.102493 +v 2.267946 5.753232 0.000000 +v 2.254453 5.753232 0.102492 +v 2.214892 5.753232 0.198000 +v 2.151961 5.753232 0.280014 +v 2.069946 5.753232 0.342946 +v 1.974439 5.753232 0.382507 +v 1.871946 5.753232 0.396000 +v 1.769454 5.753232 0.382507 +v 1.673946 5.753232 0.342947 +v 1.591932 5.753232 0.280015 +v 1.529000 5.753232 0.198001 +v 1.489439 5.753232 0.102493 +v 1.475945 5.753232 0.000000 +v 1.489439 5.753232 -0.102492 +v 1.528999 5.753232 -0.198000 +v 1.591931 5.753232 -0.280014 +v 1.673945 5.753232 -0.342946 +v 1.769453 5.753232 -0.382507 +v 1.925000 5.674111 -0.198000 +v 1.871946 5.674111 -0.204985 +v 1.974438 5.674111 -0.177522 +v 2.016892 5.674111 -0.144947 +v 2.049468 5.674111 -0.102493 +v 2.069946 5.674111 -0.053054 +v 2.076931 5.674111 0.000000 +v 2.069946 5.674111 0.053054 +v 2.049468 5.674111 0.102492 +v 2.016892 5.674111 0.144946 +v 1.974439 5.674111 0.177522 +v 1.925000 5.674111 0.198000 +v 1.871946 5.674111 0.204985 +v 1.818892 5.674111 0.198001 +v 1.769453 5.674111 0.177522 +v 1.727000 5.674111 0.144947 +v 1.694424 5.674111 0.102493 +v 1.673945 5.674111 0.053054 +v 1.666961 5.674111 0.000000 +v 1.673945 5.674111 -0.053054 +v 1.694423 5.674111 -0.102492 +v 1.726999 5.674111 -0.144946 +v 1.769453 5.674111 -0.177522 +v 1.818891 5.674111 -0.198000 +v 1.871946 5.647125 0.000000 +v 0.309896 5.515944 -0.041455 +v 0.345870 5.486310 -0.041455 +v 0.424286 5.504072 -0.093361 +v 0.418141 5.501982 -0.113838 +v 0.396498 5.533141 -0.113838 +v 0.411730 5.534671 -0.093361 +v 0.454673 5.520028 -0.112858 +v 0.438094 5.507370 -0.092381 +v 0.425538 5.537968 -0.092381 +v 0.443761 5.538089 -0.112858 +v 0.453302 5.457216 -0.089738 +v 0.441317 5.475670 -0.110215 +v 0.481455 5.465744 -0.089738 +v 0.606229 5.515820 -0.123867 +v 0.602834 5.475719 -0.123867 +v 0.579542 5.483232 -0.123867 +v 0.582807 5.538704 -0.123867 +v 0.445729 5.233723 -0.123867 +v 0.821135 5.315813 -0.123867 +v 1.000863 5.651269 -0.123867 +v 0.998508 5.634236 -0.123867 +v 0.802170 5.613324 -0.123867 +v 0.877842 5.588543 -0.123867 +v 0.948260 5.556879 -0.123867 +v 0.919384 5.572126 -0.123867 +v 0.887220 5.368674 -0.123867 +v 0.394917 5.657471 -0.123867 +v 0.406946 5.503573 -0.123867 +v 0.381454 5.531240 -0.123867 +v 0.531150 5.719302 -0.123867 +v 0.736686 5.605947 -0.123867 +v 0.458223 5.412295 -0.113265 +v 0.428678 5.362868 -0.113265 +v 0.402774 5.356741 -0.092786 +v 0.439946 5.417790 -0.092786 +v 0.403944 5.274145 -0.113282 +v 0.376874 5.259162 -0.092804 +v 0.416054 5.201977 -0.113084 +v 0.399372 5.179461 -0.092606 +v 0.480014 5.144361 -0.113117 +v 0.478291 5.118040 -0.092638 +v 0.527722 5.136270 -0.113282 +v 0.573570 5.146466 -0.113282 +v 0.582210 5.122450 -0.092804 +v 0.525999 5.109948 -0.092804 +v 0.610153 5.170753 -0.112581 +v 0.623349 5.197310 -0.112581 +v 0.646468 5.194917 -0.092102 +v 0.618793 5.146736 -0.092102 +v 0.623135 5.227768 -0.112810 +v 0.606183 5.243670 -0.112810 +v 0.622495 5.253418 -0.092331 +v 0.646254 5.225375 -0.092331 +v 0.570921 5.255943 -0.114459 +v 0.513188 5.262099 -0.114459 +v 0.550742 5.267126 -0.093982 +v 0.587233 5.265692 -0.093982 +v 0.509146 5.282185 -0.114400 +v 0.560599 5.325606 -0.114400 +v 0.575304 5.316366 -0.093922 +v 0.546701 5.287212 -0.093922 +v 0.593234 5.371274 -0.113305 +v 0.607939 5.362035 -0.092826 +v 0.625473 5.470294 -0.113282 +v 0.628868 5.510393 -0.113282 +v 0.649330 5.520258 -0.092804 +v 0.645166 5.471096 -0.092804 +v 0.615937 5.547515 -0.112902 +v 0.592514 5.570402 -0.112902 +v 0.599770 5.592010 -0.092425 +v 0.636398 5.557381 -0.092425 +v 0.536419 5.601588 -0.113282 +v 0.537775 5.625658 -0.092804 +v 0.502804 5.605110 -0.112799 +v 0.504160 5.629180 -0.092322 +v 0.433839 5.604552 -0.091985 +v 0.450710 5.583147 -0.112462 +v 0.482219 5.499254 -0.114462 +v 0.530931 5.473194 -0.114462 +v 0.499634 5.474578 -0.093983 +v 0.465640 5.486594 -0.093983 +v 0.534608 5.457798 -0.114274 +v 0.493435 5.445159 -0.114274 +v 0.475158 5.450655 -0.093796 +v 0.503310 5.459183 -0.093796 +v 0.421121 5.612298 -0.093871 +v 0.418937 5.628274 -0.114350 +v 0.506708 5.666801 -0.113882 +v 0.501502 5.648447 -0.093404 +v 0.550349 5.662285 -0.114218 +v 0.545143 5.643930 -0.093740 +v 0.629492 5.612260 -0.113562 +v 0.664060 5.578382 -0.113562 +v 0.650154 5.569179 -0.093084 +v 0.613526 5.603806 -0.093084 +v 0.696662 5.549114 -0.114802 +v 0.682757 5.539909 -0.094323 +v 0.760234 5.486811 -0.113282 +v 0.730038 5.495645 -0.092804 +v 0.810358 5.424101 -0.113282 +v 0.786797 5.426218 -0.092804 +v 0.819314 5.365025 -0.113282 +v 0.797526 5.360498 -0.092804 +v 0.802562 5.320957 -0.113282 +v 0.788883 5.308403 -0.113282 +v 0.762682 5.295666 -0.092804 +v 0.779451 5.311057 -0.092804 +v 0.794186 5.297959 -0.111517 +v 0.804707 5.297311 -0.111517 +v 0.767983 5.285222 -0.091038 +v 0.836627 5.301105 -0.113282 +v 0.843061 5.281743 -0.092804 +v 0.896286 5.324542 -0.113282 +v 0.909790 5.306975 -0.092804 +v 0.928906 5.373504 -0.113282 +v 0.946826 5.360417 -0.092804 +v 0.926206 5.448348 -0.113700 +v 0.907602 5.497252 -0.113700 +v 0.930586 5.489536 -0.093222 +v 0.945004 5.442576 -0.093222 +v 0.919570 5.525727 -0.113282 +v 0.942554 5.518014 -0.092804 +v 0.984745 5.550106 -0.113325 +v 1.015682 5.544410 -0.092846 +v 1.023436 5.590175 -0.113106 +v 1.049458 5.591613 -0.092627 +v 1.029258 5.632510 -0.113424 +v 1.018718 5.655898 -0.113424 +v 1.039579 5.667114 -0.092946 +v 1.051585 5.640802 -0.092946 +v 1.005948 5.675226 -0.110215 +v 0.995631 5.701816 -0.089738 +v 1.026809 5.686442 -0.089738 +v 0.993280 5.668571 -0.114556 +v 0.978032 5.657892 -0.114556 +v 0.980578 5.679368 -0.094078 +v 0.982963 5.695159 -0.094078 +v 0.927556 5.636914 -0.113282 +v 0.923474 5.656149 -0.092804 +v 0.877212 5.640411 -0.113949 +v 0.802427 5.662618 -0.113949 +v 0.810786 5.676223 -0.093471 +v 0.873130 5.659646 -0.093471 +v 0.539941 5.773489 -0.113282 +v 0.526252 5.797686 -0.092804 +v 0.457298 5.767262 -0.113282 +v 0.434858 5.792035 -0.092804 +v 0.382350 5.721624 -0.113282 +v 0.350880 5.742265 -0.092804 +v 0.342812 5.652568 -0.113282 +v 0.306206 5.666270 -0.092804 +v 0.335251 5.577381 -0.113282 +v 0.296974 5.582496 -0.092804 +v 0.362685 5.519274 -0.113282 +v 0.392027 5.495102 -0.113282 +v 0.361985 5.488284 -0.092804 +v 0.326010 5.517920 -0.092804 +v 0.417923 5.476707 -0.110215 +v 0.429909 5.458251 -0.089737 +v 0.387881 5.469887 -0.089737 +v 0.439370 5.482518 -0.110215 +v 0.445514 5.484608 -0.089738 +v 0.479508 5.472592 -0.089738 +v 0.440389 5.273817 -0.123867 +v 0.802856 5.311946 -0.123867 +v 0.470522 5.538355 -0.123867 +v 0.479066 5.555797 -0.123867 +v 0.530146 5.494235 -0.123867 +v 0.481434 5.520294 -0.123867 +v 0.527090 5.570638 -0.123867 +v 0.549926 5.504280 -0.123867 +v 0.591474 5.219917 -0.123867 +v 0.547534 5.217666 -0.123867 +v 0.574522 5.235818 -0.123867 +v 0.510551 5.186327 -0.123867 +v 0.856916 5.339489 -0.123867 +v 0.785386 5.561415 -0.123867 +v 0.831140 5.511280 -0.123867 +v 0.970352 5.590698 -0.123867 +v 0.874926 5.424644 -0.123867 +v 0.861703 5.463790 -0.123867 +v 0.385730 5.608974 -0.123867 +v 0.490694 5.715039 -0.123867 +v 0.541191 5.438536 -0.123867 +v 0.564482 5.431025 -0.123867 +v 0.470473 5.376470 -0.123867 +v 0.500018 5.425898 -0.123867 +v 0.545513 5.349375 -0.123867 +v 0.494061 5.305954 -0.123867 +v 0.426899 5.454040 -0.000178 +v 0.384872 5.465675 -0.000178 +v 0.392157 5.356647 -0.000178 +v 0.429328 5.417697 -0.000178 +v 0.364079 5.254062 -0.000178 +v 0.389204 5.170083 -0.000178 +v 0.474331 5.106178 -0.000178 +v 0.583881 5.110291 -0.000178 +v 0.527670 5.097790 -0.000178 +v 0.653498 5.188813 -0.000178 +v 0.625824 5.140632 -0.000178 +v 0.631697 5.254966 -0.000178 +v 0.655456 5.226924 -0.000178 +v 0.565082 5.271138 -0.000178 +v 0.601572 5.269704 -0.000178 +v 0.589741 5.315586 -0.000178 +v 0.561138 5.286431 -0.000178 +v 0.616228 5.359894 -0.000178 +v 0.659029 5.522835 -0.000178 +v 0.654866 5.473672 -0.000178 +v 0.670598 5.539687 -0.000178 +v 0.717054 5.498289 -0.000178 +v 0.775843 5.425636 -0.000178 +v 0.786682 5.357014 -0.000178 +v 0.750770 5.290197 -0.000178 +v 0.767541 5.305588 -0.000178 +v 0.763965 5.278866 -0.000178 +v 0.847876 5.272824 -0.000178 +v 0.917379 5.299571 -0.000178 +v 0.955695 5.355863 -0.000178 +v 0.941216 5.485821 -0.000178 +v 0.955634 5.438861 -0.000178 +v 0.955578 5.514775 -0.000178 +v 1.029874 5.543750 -0.000178 +v 1.061003 5.594168 -0.000178 +v 1.050158 5.671900 -0.000178 +v 1.062163 5.645587 -0.000178 +v 0.997389 5.708117 -0.000178 +v 1.028566 5.692743 -0.000178 +v 0.978222 5.692117 -0.000178 +v 0.980607 5.707908 -0.000178 +v 0.923102 5.665982 -0.000178 +v 0.811612 5.684768 -0.000178 +v 0.873955 5.668191 -0.000178 +v 0.517526 5.809513 -0.000178 +v 0.421837 5.803005 -0.000178 +v 0.334437 5.750560 -0.000178 +v 0.288120 5.670815 -0.000178 +v 0.278871 5.583405 -0.000178 +v 0.345870 5.486310 -0.000178 +v 0.309896 5.515944 -0.000178 +v 0.494061 5.305954 0.123511 +v 0.545513 5.349375 0.123511 +v 0.500018 5.425898 0.123511 +v 0.470473 5.376470 0.123511 +v 0.564482 5.431025 0.123511 +v 0.541191 5.438536 0.123511 +v 0.490694 5.715039 0.123511 +v 0.385730 5.608974 0.123511 +v 0.861703 5.463790 0.123511 +v 0.874926 5.424644 0.123511 +v 0.970352 5.590698 0.123511 +v 0.831140 5.511280 0.123511 +v 0.785386 5.561415 0.123511 +v 0.856916 5.339489 0.123511 +v 0.510551 5.186327 0.123511 +v 0.574522 5.235818 0.123511 +v 0.547534 5.217666 0.123511 +v 0.591474 5.219917 0.123511 +v 0.549926 5.504280 0.123511 +v 0.527090 5.570638 0.123511 +v 0.481434 5.520294 0.123511 +v 0.530146 5.494235 0.123511 +v 0.479066 5.555797 0.123511 +v 0.470522 5.538355 0.123511 +v 0.802856 5.311946 0.123511 +v 0.440389 5.273817 0.123511 +v 0.479508 5.472592 0.089382 +v 0.445514 5.484608 0.089382 +v 0.439370 5.482518 0.109859 +v 0.387881 5.469887 0.089381 +v 0.429909 5.458251 0.089381 +v 0.417923 5.476707 0.109859 +v 0.326010 5.517920 0.092448 +v 0.361985 5.488284 0.092448 +v 0.392027 5.495102 0.112926 +v 0.362685 5.519274 0.112926 +v 0.296974 5.582496 0.092448 +v 0.335251 5.577381 0.112926 +v 0.306206 5.666270 0.092448 +v 0.342812 5.652568 0.112926 +v 0.350880 5.742265 0.092448 +v 0.382350 5.721624 0.112926 +v 0.434858 5.792035 0.092448 +v 0.457298 5.767262 0.112926 +v 0.526252 5.797686 0.092448 +v 0.539941 5.773489 0.112926 +v 0.873130 5.659646 0.093115 +v 0.810786 5.676223 0.093115 +v 0.802427 5.662618 0.113593 +v 0.877212 5.640411 0.113593 +v 0.923474 5.656149 0.092448 +v 0.927556 5.636914 0.112926 +v 0.982963 5.695159 0.093722 +v 0.980578 5.679368 0.093722 +v 0.978032 5.657892 0.114200 +v 0.993280 5.668571 0.114200 +v 1.026809 5.686442 0.089382 +v 0.995631 5.701816 0.089382 +v 1.005948 5.675226 0.109859 +v 1.051585 5.640802 0.092590 +v 1.039579 5.667114 0.092590 +v 1.018718 5.655898 0.113068 +v 1.029258 5.632510 0.113068 +v 1.049458 5.591613 0.092271 +v 1.023436 5.590175 0.112750 +v 1.015682 5.544410 0.092490 +v 0.984745 5.550106 0.112969 +v 0.942554 5.518014 0.092448 +v 0.919570 5.525727 0.112926 +v 0.945004 5.442576 0.092866 +v 0.930586 5.489536 0.092866 +v 0.907602 5.497252 0.113344 +v 0.926206 5.448348 0.113344 +v 0.946826 5.360417 0.092448 +v 0.928906 5.373504 0.112926 +v 0.909790 5.306975 0.092448 +v 0.896286 5.324542 0.112926 +v 0.843061 5.281743 0.092448 +v 0.836627 5.301105 0.112926 +v 0.767983 5.285222 0.090682 +v 0.804707 5.297311 0.111161 +v 0.794186 5.297959 0.111161 +v 0.779451 5.311057 0.092448 +v 0.762682 5.295666 0.092448 +v 0.788883 5.308403 0.112926 +v 0.802562 5.320957 0.112926 +v 0.797526 5.360498 0.092448 +v 0.819314 5.365025 0.112926 +v 0.786797 5.426218 0.092448 +v 0.810358 5.424101 0.112926 +v 0.730038 5.495645 0.092448 +v 0.760234 5.486811 0.112926 +v 0.682757 5.539909 0.093967 +v 0.696662 5.549114 0.114446 +v 0.613526 5.603806 0.092728 +v 0.650154 5.569179 0.092728 +v 0.664060 5.578382 0.113206 +v 0.629492 5.612260 0.113206 +v 0.545143 5.643930 0.093384 +v 0.550349 5.662285 0.113862 +v 0.501502 5.648447 0.093048 +v 0.506708 5.666801 0.113526 +v 0.418937 5.628274 0.113994 +v 0.421121 5.612298 0.093515 +v 0.503310 5.459183 0.093440 +v 0.475158 5.450655 0.093440 +v 0.493435 5.445159 0.113918 +v 0.534608 5.457798 0.113918 +v 0.465640 5.486594 0.093627 +v 0.499634 5.474578 0.093627 +v 0.530931 5.473194 0.114106 +v 0.482219 5.499254 0.114106 +v 0.450710 5.583147 0.112106 +v 0.433839 5.604552 0.091629 +v 0.504160 5.629180 0.091966 +v 0.502804 5.605110 0.112443 +v 0.537775 5.625658 0.092448 +v 0.536419 5.601588 0.112926 +v 0.636398 5.557381 0.092069 +v 0.599770 5.592010 0.092069 +v 0.592514 5.570402 0.112546 +v 0.615937 5.547515 0.112546 +v 0.645166 5.471096 0.092448 +v 0.649330 5.520258 0.092448 +v 0.628868 5.510393 0.112926 +v 0.625473 5.470294 0.112926 +v 0.607939 5.362035 0.092470 +v 0.593234 5.371274 0.112949 +v 0.546701 5.287212 0.093566 +v 0.575304 5.316366 0.093566 +v 0.560599 5.325606 0.114044 +v 0.509146 5.282185 0.114044 +v 0.587233 5.265692 0.093626 +v 0.550742 5.267126 0.093626 +v 0.513188 5.262099 0.114103 +v 0.570921 5.255943 0.114103 +v 0.646254 5.225375 0.091975 +v 0.622495 5.253418 0.091975 +v 0.606183 5.243670 0.112454 +v 0.623135 5.227768 0.112454 +v 0.618793 5.146736 0.091746 +v 0.646468 5.194917 0.091746 +v 0.623349 5.197310 0.112225 +v 0.610153 5.170753 0.112225 +v 0.525999 5.109948 0.092448 +v 0.582210 5.122450 0.092448 +v 0.573570 5.146466 0.112926 +v 0.527722 5.136270 0.112926 +v 0.478291 5.118040 0.092282 +v 0.480014 5.144361 0.112761 +v 0.399372 5.179461 0.092250 +v 0.416054 5.201977 0.112728 +v 0.376874 5.259162 0.092448 +v 0.403944 5.274145 0.112926 +v 0.439946 5.417790 0.092430 +v 0.402774 5.356741 0.092430 +v 0.428678 5.362868 0.112909 +v 0.458223 5.412295 0.112909 +v 0.736686 5.605947 0.123511 +v 0.531150 5.719302 0.123511 +v 0.381454 5.531240 0.123511 +v 0.406946 5.503573 0.123511 +v 0.394917 5.657471 0.123511 +v 0.887220 5.368674 0.123511 +v 0.919384 5.572126 0.123511 +v 0.948260 5.556879 0.123511 +v 0.877842 5.588543 0.123511 +v 0.802170 5.613324 0.123511 +v 0.998508 5.634236 0.123511 +v 1.000863 5.651269 0.123511 +v 0.821135 5.315813 0.123511 +v 0.445729 5.233723 0.123511 +v 0.582807 5.538704 0.123511 +v 0.579542 5.483232 0.123511 +v 0.602834 5.475719 0.123511 +v 0.606229 5.515820 0.123511 +v 0.481455 5.465744 0.089382 +v 0.441317 5.475670 0.109859 +v 0.453302 5.457216 0.089382 +v 0.443761 5.538089 0.112502 +v 0.425538 5.537968 0.092025 +v 0.438094 5.507370 0.092025 +v 0.454673 5.520028 0.112502 +v 0.411730 5.534671 0.093005 +v 0.396498 5.533141 0.113482 +v 0.418141 5.501982 0.113482 +v 0.424286 5.504072 0.093005 +v 0.345870 5.486310 0.041099 +v 0.309896 5.515944 0.041099 +v 2.041447 5.441407 0.000016 +v 1.902422 5.157276 0.000038 +v 2.000598 5.267411 -0.000016 +v 0.827715 5.464243 -0.018954 +v 1.649046 5.069851 -0.032847 +v 1.776509 5.091953 -0.036823 +v 1.898296 5.160740 -0.040898 +v 1.994962 5.269464 -0.045596 +v 2.035121 5.441407 -0.048052 +v 2.109306 5.441407 -0.067926 +v 2.146399 5.479807 -0.077862 +v 2.084578 5.531006 -0.061302 +v 1.991847 5.569407 -0.036460 +v 2.041304 5.595008 -0.049708 +v 2.096942 5.665406 -0.064614 +v 2.127852 5.665406 -0.072894 +v 2.127852 5.697407 -0.072894 +v 0.830914 5.470578 -0.036093 +v 0.836005 5.480661 -0.050811 +v 1.643436 5.101691 -0.088847 +v 1.758191 5.123687 -0.100293 +v 1.866940 5.187052 -0.111804 +v 1.952135 5.285051 -0.124545 +v 1.987059 5.441407 -0.131312 +v 2.041368 5.441407 -0.185614 +v 2.068523 5.479807 -0.212766 +v 2.023265 5.531006 -0.167514 +v 1.955379 5.569407 -0.099636 +v 1.991585 5.595008 -0.135838 +v 2.032317 5.665406 -0.176565 +v 2.054945 5.665406 -0.199190 +v 2.054945 5.697407 -0.199190 +v 0.850366 5.509098 -0.069204 +v 1.633711 5.156838 -0.121179 +v 1.726459 5.178650 -0.136939 +v 1.812627 5.232628 -0.152744 +v 1.877953 5.312052 -0.170130 +v 1.903806 5.441407 -0.179386 +v 1.923689 5.441407 -0.253568 +v 1.933629 5.479807 -0.290659 +v 1.917061 5.531006 -0.228842 +v 1.892206 5.569407 -0.136114 +v 1.905463 5.595008 -0.185568 +v 1.920375 5.665406 -0.241205 +v 1.928659 5.665406 -0.272114 +v 1.928659 5.697407 -0.272114 +v 0.866946 5.541935 -0.069204 +v 1.622482 5.220516 -0.121182 +v 1.689813 5.242119 -0.136943 +v 1.749908 5.285254 -0.152750 +v 1.792290 5.343229 -0.170137 +v 1.807669 5.441407 -0.179394 +v 1.787799 5.441407 -0.253579 +v 1.777863 5.479807 -0.290672 +v 1.794421 5.531006 -0.228851 +v 1.819260 5.569407 -0.136119 +v 1.806012 5.595008 -0.185577 +v 1.791109 5.665406 -0.241215 +v 1.782831 5.665406 -0.272125 +v 1.782831 5.697407 -0.272125 +v 0.881305 5.570374 -0.050811 +v 1.612755 5.275664 -0.088854 +v 1.658075 5.297085 -0.100303 +v 1.695589 5.330832 -0.111818 +v 1.718102 5.370231 -0.124564 +v 1.724408 5.441407 -0.131333 +v 1.670107 5.441407 -0.185643 +v 1.642957 5.479807 -0.212799 +v 1.688207 5.531006 -0.167541 +v 1.756084 5.569407 -0.099651 +v 1.719882 5.595008 -0.135859 +v 1.679158 5.665406 -0.176592 +v 1.656531 5.665406 -0.199222 +v 1.656531 5.697407 -0.199222 +v 1.733685 5.569407 -0.070469 +v 0.889594 5.586796 -0.018954 +v 1.607137 5.307508 -0.032856 +v 1.639748 5.328821 -0.036838 +v 1.664223 5.357145 -0.040918 +v 1.675264 5.385822 -0.045622 +v 1.676331 5.441407 -0.048081 +v 1.602150 5.441407 -0.067966 +v 1.565059 5.479807 -0.077909 +v 1.626877 5.531006 -0.061338 +v 1.719603 5.569407 -0.036482 +v 1.670149 5.595008 -0.049738 +v 1.614513 5.665406 -0.064651 +v 1.583606 5.665406 -0.072936 +v 1.583606 5.697407 -0.072936 +v 0.889594 5.586796 0.017833 +v 1.607132 5.307511 0.031806 +v 1.639743 5.328824 0.036450 +v 1.664215 5.357148 0.040955 +v 1.675255 5.385825 0.045538 +v 1.676321 5.441407 0.048057 +v 1.602136 5.441407 0.067926 +v 1.565044 5.479807 0.077860 +v 1.626865 5.531006 0.061302 +v 1.719597 5.569407 0.036466 +v 1.670139 5.595008 0.049711 +v 1.614500 5.665406 0.064614 +v 1.583589 5.665406 0.072893 +v 1.583589 5.697407 0.072893 +v 1.691782 5.379807 0.088014 +v 0.881302 5.570380 0.049690 +v 1.612743 5.275675 0.087806 +v 1.658060 5.297095 0.099922 +v 1.695569 5.330838 0.111863 +v 1.718076 5.370237 0.124489 +v 1.724379 5.441407 0.131318 +v 1.670067 5.441407 0.185618 +v 1.642911 5.479807 0.212767 +v 1.688171 5.531006 0.167518 +v 1.756062 5.569407 0.099644 +v 1.719855 5.595008 0.135843 +v 1.679120 5.665406 0.176567 +v 1.656490 5.665406 0.199191 +v 1.656490 5.697407 0.199191 +v 0.866942 5.541945 0.068085 +v 1.622465 5.220531 0.120141 +v 1.689792 5.242130 0.136571 +v 1.749879 5.285265 0.152806 +v 1.792256 5.343235 0.170078 +v 1.807631 5.441407 0.179396 +v 1.787743 5.441407 0.253577 +v 1.777802 5.479807 0.290667 +v 1.794373 5.531006 0.228850 +v 1.819231 5.569407 0.136125 +v 1.805974 5.595008 0.185578 +v 1.791058 5.665406 0.241213 +v 1.782773 5.665406 0.272123 +v 1.782773 5.697407 0.272123 +v 0.850362 5.509104 0.068087 +v 1.633698 5.156850 0.120147 +v 1.726436 5.178664 0.136579 +v 1.812598 5.232639 0.152818 +v 1.877919 5.312058 0.170090 +v 1.903767 5.441407 0.179410 +v 1.923634 5.441407 0.253595 +v 1.933568 5.479807 0.290689 +v 1.917012 5.531006 0.228866 +v 1.892178 5.569407 0.136134 +v 1.905423 5.595008 0.185592 +v 1.920323 5.665406 0.241231 +v 1.928601 5.665406 0.272141 +v 1.928601 5.697407 0.272141 +v 0.836002 5.480664 0.049696 +v 1.643425 5.101700 0.087822 +v 1.758174 5.123696 0.099943 +v 1.866919 5.187061 0.111890 +v 1.952110 5.285056 0.124521 +v 1.987030 5.441407 0.131352 +v 2.041330 5.441407 0.185667 +v 2.068478 5.479807 0.212822 +v 2.023230 5.531006 0.167562 +v 1.955357 5.569407 0.099670 +v 1.991556 5.595008 0.135879 +v 2.032280 5.665406 0.176614 +v 2.054904 5.665406 0.199245 +v 2.054904 5.697407 0.199245 +v 1.977757 5.569407 0.070487 +v 0.827713 5.464243 0.017841 +v 1.649043 5.069855 0.031826 +v 1.776505 5.091958 0.036479 +v 1.898288 5.160743 0.040991 +v 1.994951 5.269464 0.045582 +v 2.035112 5.441407 0.048103 +v 2.109293 5.441407 0.067991 +v 2.146382 5.479807 0.077937 +v 2.084566 5.531006 0.061362 +v 1.991841 5.569407 0.036501 +v 2.041295 5.595008 0.049761 +v 2.096928 5.665406 0.064676 +v 2.127837 5.665406 0.072964 +v 2.127837 5.697407 0.072964 +v 1.480159 5.243531 -0.106571 +v 1.502341 5.287462 -0.078158 +v 1.454546 5.192803 -0.106571 +v 1.432361 5.148871 -0.078157 +v 1.515146 5.312833 0.027885 +v 1.502338 5.287472 0.077100 +v 1.480153 5.243540 0.105516 +v 1.454540 5.192812 0.105519 +v 1.432358 5.148880 0.077109 +v 1.419550 5.123511 0.027896 +v 1.516179 5.312378 -0.028960 +v 1.419042 5.123801 -0.028934 +v 1.563461 5.304673 0.030392 +v 1.564023 5.304605 -0.031455 +v 1.558218 5.274195 -0.084999 +v 1.549126 5.221419 -0.115918 +v 1.529535 5.107703 -0.084997 +v 1.538628 5.160480 -0.115917 +v 1.558211 5.274205 0.083947 +v 1.549116 5.221431 0.114869 +v 1.538617 5.160491 0.114874 +v 1.529527 5.107712 0.083959 +v 1.523994 5.077298 -0.031438 +v 1.524280 5.077236 0.030408 +v -0.935916 7.231124 1.621186 +v -0.790965 7.204138 1.766126 +v -0.758390 7.204138 1.723672 +v -0.833417 7.204138 1.798704 +v -0.882855 7.204138 1.819184 +v -0.935909 7.204138 1.826170 +v -0.988963 7.204138 1.819188 +v -1.038402 7.204138 1.798711 +v -1.080857 7.204138 1.766137 +v -1.113434 7.204138 1.723684 +v -1.133914 7.204138 1.674246 +v -1.140901 7.204138 1.621192 +v -1.133918 7.204138 1.568139 +v -1.113442 7.204138 1.518699 +v -1.080867 7.204138 1.476245 +v -1.038415 7.204138 1.443668 +v -0.988977 7.204138 1.423187 +v -0.935924 7.204138 1.416201 +v -0.882869 7.204138 1.423184 +v -0.833430 7.204138 1.443660 +v -0.790975 7.204138 1.476234 +v -0.758398 7.204138 1.518687 +v -0.737918 7.204138 1.568124 +v -0.730931 7.204138 1.621178 +v -0.737914 7.204138 1.674232 +v -0.655892 7.125016 1.901190 +v -0.592963 7.125016 1.819174 +v -0.737904 7.125016 1.964124 +v -0.833411 7.125016 2.003688 +v -0.935902 7.125016 2.017184 +v -1.038394 7.125016 2.003695 +v -1.133904 7.125016 1.964139 +v -1.215920 7.125016 1.901209 +v -1.278855 7.125016 1.819197 +v -1.318419 7.125016 1.723691 +v -1.331916 7.125016 1.621200 +v -1.318426 7.125016 1.518708 +v -1.278869 7.125016 1.423198 +v -1.215941 7.125016 1.341181 +v -1.133928 7.125016 1.278246 +v -1.038423 7.125016 1.238682 +v -0.935930 7.125016 1.225186 +v -0.833438 7.125016 1.238675 +v -0.737928 7.125016 1.278233 +v -0.655912 7.125016 1.341161 +v -0.592978 7.125016 1.423172 +v -0.553413 7.125016 1.518679 +v -0.539916 7.125016 1.621171 +v -0.553406 7.125016 1.723664 +v -0.539902 6.999153 2.017171 +v -0.450907 6.999153 1.901182 +v -0.655885 6.999153 2.106174 +v -0.790951 6.999153 2.162126 +v -0.935896 6.999153 2.181214 +v -1.080843 6.999153 2.162137 +v -1.215913 6.999153 2.106194 +v -1.331902 6.999153 2.017200 +v -1.420905 6.999153 1.901217 +v -1.476856 6.999153 1.766151 +v -1.495945 6.999153 1.621206 +v -1.476867 6.999153 1.476258 +v -1.420925 6.999153 1.341189 +v -1.331930 6.999153 1.225199 +v -1.215948 6.999153 1.136197 +v -1.080882 6.999153 1.080244 +v -0.935937 6.999153 1.061157 +v -0.790990 6.999153 1.080234 +v -0.655919 6.999153 1.136176 +v -0.539931 6.999153 1.225170 +v -0.450928 6.999153 1.341153 +v -0.394976 6.999153 1.476219 +v -0.375888 6.999153 1.621165 +v -0.394965 6.999153 1.766112 +v -0.450900 6.835124 2.106167 +v -0.341904 6.835124 1.964110 +v -0.592949 6.835124 2.215173 +v -0.758371 6.835124 2.283700 +v -0.935891 6.835124 2.307077 +v -1.113414 6.835124 2.283713 +v -1.278841 6.835124 2.215197 +v -1.420897 6.835124 2.106202 +v -1.529903 6.835124 1.964153 +v -1.598430 6.835124 1.798731 +v -1.621808 6.835124 1.621209 +v -1.598444 6.835124 1.443688 +v -1.529929 6.835124 1.278261 +v -1.420933 6.835124 1.136204 +v -1.278884 6.835124 1.027199 +v -1.113463 6.835124 0.958671 +v -0.935941 6.835124 0.935293 +v -0.758418 6.835124 0.958658 +v -0.592992 6.835124 1.027173 +v -0.450935 6.835124 1.136169 +v -0.341929 6.835124 1.278217 +v -0.273402 6.835124 1.443639 +v -0.250024 6.835124 1.621160 +v -0.273389 6.835124 1.798683 +v -0.394951 6.644109 2.162112 +v -0.273382 6.644109 2.003668 +v -0.553386 6.644109 2.283693 +v -0.737890 6.644109 2.360124 +v -0.935889 6.644109 2.386198 +v -1.133890 6.644109 2.360139 +v -1.318400 6.644109 2.283720 +v -1.476843 6.644109 2.162151 +v -1.598423 6.644109 2.003716 +v -1.674855 6.644109 1.819212 +v -1.700929 6.644109 1.621213 +v -1.674870 6.644109 1.423212 +v -1.598451 6.644109 1.238703 +v -1.476882 6.644109 1.080259 +v -1.318446 6.644109 0.958678 +v -1.133944 6.644109 0.882247 +v -0.935944 6.644109 0.856172 +v -0.737943 6.644109 0.882232 +v -0.553434 6.644109 0.958651 +v -0.394989 6.644109 1.080219 +v -0.273410 6.644109 1.238654 +v -0.196978 6.644109 1.423158 +v -0.170903 6.644109 1.621157 +v -0.196962 6.644109 1.819158 +v -0.375868 6.439125 2.181194 +v -0.250010 6.439125 2.017161 +v -0.539892 6.439125 2.307063 +v -0.730904 6.439125 2.386191 +v -0.935887 6.439125 2.413185 +v -1.140874 6.439125 2.386206 +v -1.331892 6.439125 2.307091 +v -1.495925 6.439125 2.181234 +v -1.621794 6.439125 2.017210 +v -1.700922 6.439125 1.826198 +v -1.727916 6.439125 1.621213 +v -1.700937 6.439125 1.416228 +v -1.621823 6.439125 1.225210 +v -1.495965 6.439125 1.061177 +v -1.331942 6.439125 0.935308 +v -1.140928 6.439125 0.856180 +v -0.935945 6.439125 0.829185 +v -0.730960 6.439125 0.856165 +v -0.539941 6.439125 0.935279 +v -0.375908 6.439125 1.061136 +v -0.250038 6.439125 1.225160 +v -0.170910 6.439125 1.416173 +v -0.143917 6.439125 1.621156 +v -0.170895 6.439125 1.826142 +v -0.394951 6.234140 2.162112 +v -0.273382 6.234140 2.003668 +v -0.553386 6.234140 2.283693 +v -0.737889 6.234140 2.360124 +v -0.935889 6.234140 2.386198 +v -1.133890 6.234140 2.360139 +v -1.318400 6.234140 2.283720 +v -1.476843 6.234140 2.162151 +v -1.598423 6.234140 2.003716 +v -1.674855 6.234140 1.819212 +v -1.700930 6.234140 1.621213 +v -1.674870 6.234140 1.423212 +v -1.598451 6.234140 1.238703 +v -1.476882 6.234140 1.080259 +v -1.318447 6.234140 0.958678 +v -1.133943 6.234140 0.882246 +v -0.935944 6.234140 0.856172 +v -0.737943 6.234140 0.882232 +v -0.553433 6.234140 0.958650 +v -0.394989 6.234140 1.080219 +v -0.273409 6.234140 1.238654 +v -0.196978 6.234140 1.423158 +v -0.170903 6.234140 1.621157 +v -0.196962 6.234140 1.819158 +v -0.450900 6.043124 2.106167 +v -0.341904 6.043124 1.964110 +v -0.592949 6.043124 2.215173 +v -0.758370 6.043124 2.283701 +v -0.935891 6.043124 2.307078 +v -1.113414 6.043124 2.283713 +v -1.278841 6.043124 2.215197 +v -1.420897 6.043124 2.106202 +v -1.529904 6.043124 1.964153 +v -1.598432 6.043124 1.798732 +v -1.621809 6.043124 1.621211 +v -1.598444 6.043124 1.443688 +v -1.529929 6.043124 1.278261 +v -1.420933 6.043124 1.136204 +v -1.278884 6.043124 1.027197 +v -1.113462 6.043124 0.958670 +v -0.935941 6.043124 0.935293 +v -0.758418 6.043124 0.958658 +v -0.592992 6.043124 1.027173 +v -0.450935 6.043124 1.136168 +v -0.341929 6.043124 1.278217 +v -0.273402 6.043124 1.443639 +v -0.250023 6.043124 1.621160 +v -0.273388 6.043124 1.798683 +v -0.539902 5.879096 2.017171 +v -0.450907 5.879096 1.901182 +v -0.655885 5.879096 2.106174 +v -0.790950 5.879096 2.162127 +v -0.935896 5.879096 2.181215 +v -1.080843 5.879096 2.162137 +v -1.215914 5.879096 2.106194 +v -1.331902 5.879096 2.017200 +v -1.420905 5.879096 1.901217 +v -1.476857 5.879096 1.766150 +v -1.495945 5.879096 1.621206 +v -1.476867 5.879096 1.476258 +v -1.420925 5.879096 1.341188 +v -1.331931 5.879096 1.225199 +v -1.215949 5.879096 1.136196 +v -1.080882 5.879096 1.080244 +v -0.935937 5.879096 1.061157 +v -0.790990 5.879096 1.080234 +v -0.655919 5.879096 1.136176 +v -0.539931 5.879096 1.225170 +v -0.450927 5.879096 1.341153 +v -0.394976 5.879096 1.476219 +v -0.375887 5.879096 1.621165 +v -0.394965 5.879096 1.766112 +v -0.655892 5.753232 1.901190 +v -0.592963 5.753232 1.819174 +v -0.737903 5.753232 1.964125 +v -0.833410 5.753232 2.003689 +v -0.935902 5.753232 2.017185 +v -1.038395 5.753232 2.003696 +v -1.133904 5.753232 1.964139 +v -1.215921 5.753232 1.901210 +v -1.278855 5.753232 1.819197 +v -1.318419 5.753232 1.723692 +v -1.331916 5.753232 1.621200 +v -1.318427 5.753232 1.518707 +v -1.278869 5.753232 1.423198 +v -1.215941 5.753232 1.341181 +v -1.133929 5.753232 1.278246 +v -1.038423 5.753232 1.238682 +v -0.935931 5.753232 1.225185 +v -0.833438 5.753232 1.238675 +v -0.737928 5.753232 1.278232 +v -0.655912 5.753232 1.341161 +v -0.592977 5.753232 1.423173 +v -0.553413 5.753232 1.518679 +v -0.539916 5.753232 1.621171 +v -0.553405 5.753232 1.723664 +v -0.790965 5.674111 1.766127 +v -0.758390 5.674111 1.723672 +v -0.833417 5.674111 1.798704 +v -0.882854 5.674111 1.819184 +v -0.935909 5.674111 1.826171 +v -0.988963 5.674111 1.819188 +v -1.038403 5.674111 1.798711 +v -1.080857 5.674111 1.766137 +v -1.113434 5.674111 1.723684 +v -1.133914 5.674111 1.674246 +v -1.140901 5.674111 1.621193 +v -1.133918 5.674111 1.568139 +v -1.113442 5.674111 1.518699 +v -1.080868 5.674111 1.476244 +v -1.038415 5.674111 1.443667 +v -0.988978 5.674111 1.423187 +v -0.935924 5.674111 1.416201 +v -0.882869 5.674111 1.423183 +v -0.833430 5.674111 1.443660 +v -0.790975 5.674111 1.476233 +v -0.758398 5.674111 1.518686 +v -0.737918 5.674111 1.568124 +v -0.730931 5.674111 1.621178 +v -0.737914 5.674111 1.674232 +v -0.935916 5.647125 1.621186 +v -0.935916 7.231124 -1.621186 +v -1.133918 7.204138 -1.568138 +v -1.113442 7.204138 -1.518699 +v -1.140901 7.204138 -1.621192 +v -1.133914 7.204138 -1.674246 +v -1.113434 7.204138 -1.723684 +v -1.080857 7.204138 -1.766137 +v -1.038402 7.204138 -1.798711 +v -0.988963 7.204138 -1.819188 +v -0.935909 7.204138 -1.826170 +v -0.882855 7.204138 -1.819184 +v -0.833417 7.204138 -1.798704 +v -0.790965 7.204138 -1.766127 +v -0.758390 7.204138 -1.723672 +v -0.737914 7.204138 -1.674233 +v -0.730932 7.204138 -1.621179 +v -0.737918 7.204138 -1.568125 +v -0.758397 7.204138 -1.518687 +v -0.790975 7.204138 -1.476234 +v -0.833430 7.204138 -1.443660 +v -0.882869 7.204138 -1.423184 +v -0.935923 7.204138 -1.416201 +v -0.988977 7.204138 -1.423187 +v -1.038415 7.204138 -1.443667 +v -1.080867 7.204138 -1.476244 +v -1.318427 7.125016 -1.518706 +v -1.278869 7.125016 -1.423198 +v -1.331916 7.125016 -1.621199 +v -1.318419 7.125016 -1.723691 +v -1.278855 7.125016 -1.819197 +v -1.215921 7.125016 -1.901209 +v -1.133904 7.125016 -1.964139 +v -1.038395 7.125016 -2.003695 +v -0.935902 7.125016 -2.017185 +v -0.833411 7.125016 -2.003688 +v -0.737904 7.125016 -1.964125 +v -0.655893 7.125016 -1.901190 +v -0.592963 7.125016 -1.819174 +v -0.553406 7.125016 -1.723665 +v -0.539916 7.125016 -1.621172 +v -0.553413 7.125016 -1.518680 +v -0.592977 7.125016 -1.423174 +v -0.655911 7.125016 -1.341161 +v -0.737928 7.125016 -1.278233 +v -0.833437 7.125016 -1.238675 +v -0.935929 7.125016 -1.225185 +v -1.038421 7.125016 -1.238682 +v -1.133928 7.125016 -1.278245 +v -1.215940 7.125016 -1.341181 +v -1.476867 6.999153 -1.476258 +v -1.420924 6.999153 -1.341188 +v -1.495945 6.999153 -1.621205 +v -1.476857 6.999153 -1.766150 +v -1.420906 6.999153 -1.901216 +v -1.331903 6.999153 -2.017199 +v -1.215913 6.999153 -2.106194 +v -1.080844 6.999153 -2.162136 +v -0.935897 6.999153 -2.181214 +v -0.790952 6.999153 -2.162126 +v -0.655885 6.999153 -2.106175 +v -0.539902 6.999153 -2.017172 +v -0.450908 6.999153 -1.901183 +v -0.394965 6.999153 -1.766113 +v -0.375888 6.999153 -1.621166 +v -0.394974 6.999153 -1.476221 +v -0.450926 6.999153 -1.341155 +v -0.539929 6.999153 -1.225172 +v -0.655919 6.999153 -1.136176 +v -0.790988 6.999153 -1.080234 +v -0.935934 6.999153 -1.061157 +v -1.080880 6.999153 -1.080244 +v -1.215946 6.999153 -1.136196 +v -1.331930 6.999153 -1.225199 +v -1.598443 6.835124 -1.443686 +v -1.529928 6.835124 -1.278260 +v -1.621808 6.835124 -1.621209 +v -1.598431 6.835124 -1.798730 +v -1.529905 6.835124 -1.964151 +v -1.420899 6.835124 -2.106201 +v -1.278841 6.835124 -2.215197 +v -1.113416 6.835124 -2.283712 +v -0.935893 6.835124 -2.307077 +v -0.758372 6.835124 -2.283700 +v -0.592949 6.835124 -2.215173 +v -0.450901 6.835124 -2.106169 +v -0.341905 6.835124 -1.964112 +v -0.273390 6.835124 -1.798685 +v -0.250025 6.835124 -1.621162 +v -0.273401 6.835124 -1.443642 +v -0.341927 6.835124 -1.278219 +v -0.450933 6.835124 -1.136170 +v -0.592990 6.835124 -1.027174 +v -0.758417 6.835124 -0.958659 +v -0.935939 6.835124 -0.935293 +v -1.113460 6.835124 -0.958670 +v -1.278882 6.835124 -1.027197 +v -1.420932 6.835124 -1.136203 +v -1.674869 6.644109 -1.423211 +v -1.598450 6.644109 -1.238701 +v -1.700929 6.644109 -1.621212 +v -1.674855 6.644109 -1.819211 +v -1.598424 6.644109 -2.003714 +v -1.476844 6.644109 -2.162150 +v -1.318400 6.644109 -2.283720 +v -1.133891 6.644109 -2.360138 +v -0.935890 6.644109 -2.386199 +v -0.737891 6.644109 -2.360124 +v -0.553387 6.644109 -2.283693 +v -0.394952 6.644109 -2.162114 +v -0.273383 6.644109 -2.003670 +v -0.196964 6.644109 -1.819160 +v -0.170903 6.644109 -1.621159 +v -0.196977 6.644109 -1.423161 +v -0.273407 6.644109 -1.238656 +v -0.394988 6.644109 -1.080221 +v -0.553432 6.644109 -0.958652 +v -0.737941 6.644109 -0.882232 +v -0.935941 6.644109 -0.856172 +v -1.133941 6.644109 -0.882246 +v -1.318445 6.644109 -0.958677 +v -1.476880 6.644109 -1.080257 +v -1.700936 6.439125 -1.416227 +v -1.621822 6.439125 -1.225209 +v -1.727916 6.439125 -1.621213 +v -1.700922 6.439125 -1.826196 +v -1.621795 6.439125 -2.017208 +v -1.495925 6.439125 -2.181233 +v -1.331892 6.439125 -2.307091 +v -1.140875 6.439125 -2.386206 +v -0.935889 6.439125 -2.413185 +v -0.730905 6.439125 -2.386192 +v -0.539892 6.439125 -2.307064 +v -0.375868 6.439125 -2.181195 +v -0.250011 6.439125 -2.017163 +v -0.170896 6.439125 -1.826144 +v -0.143916 6.439125 -1.621159 +v -0.170910 6.439125 -1.416175 +v -0.250037 6.439125 -1.225162 +v -0.375906 6.439125 -1.061138 +v -0.539939 6.439125 -0.935280 +v -0.730957 6.439125 -0.856165 +v -0.935943 6.439125 -0.829185 +v -1.140927 6.439125 -0.856179 +v -1.331939 6.439125 -0.935307 +v -1.495964 6.439125 -1.061176 +v -1.674869 6.234140 -1.423211 +v -1.598450 6.234140 -1.238701 +v -1.700929 6.234140 -1.621212 +v -1.674856 6.234140 -1.819210 +v -1.598424 6.234140 -2.003714 +v -1.476844 6.234140 -2.162150 +v -1.318400 6.234140 -2.283720 +v -1.133891 6.234140 -2.360138 +v -0.935890 6.234140 -2.386199 +v -0.737891 6.234140 -2.360124 +v -0.553387 6.234140 -2.283693 +v -0.394952 6.234140 -2.162114 +v -0.273383 6.234140 -2.003670 +v -0.196964 6.234140 -1.819160 +v -0.170902 6.234140 -1.621160 +v -0.196976 6.234140 -1.423160 +v -0.273407 6.234140 -1.238656 +v -0.394988 6.234140 -1.080221 +v -0.553432 6.234140 -0.958651 +v -0.737941 6.234140 -0.882232 +v -0.935942 6.234140 -0.856172 +v -1.133941 6.234140 -0.882246 +v -1.318445 6.234140 -0.958677 +v -1.476880 6.234140 -1.080257 +v -1.598443 6.043124 -1.443686 +v -1.529928 6.043124 -1.278260 +v -1.621808 6.043124 -1.621209 +v -1.598432 6.043124 -1.798730 +v -1.529905 6.043124 -1.964152 +v -1.420899 6.043124 -2.106201 +v -1.278841 6.043124 -2.215197 +v -1.113416 6.043124 -2.283712 +v -0.935892 6.043124 -2.307078 +v -0.758372 6.043124 -2.283701 +v -0.592950 6.043124 -2.215174 +v -0.450901 6.043124 -2.106169 +v -0.341905 6.043124 -1.964112 +v -0.273390 6.043124 -1.798685 +v -0.250023 6.043124 -1.621162 +v -0.273401 6.043124 -1.443641 +v -0.341927 6.043124 -1.278219 +v -0.450933 6.043124 -1.136170 +v -0.592990 6.043124 -1.027174 +v -0.758416 6.043124 -0.958658 +v -0.935939 6.043124 -0.935293 +v -1.113460 6.043124 -0.958670 +v -1.278882 6.043124 -1.027196 +v -1.420931 6.043124 -1.136202 +v -1.476867 5.879096 -1.476258 +v -1.420925 5.879096 -1.341187 +v -1.495945 5.879096 -1.621205 +v -1.476858 5.879096 -1.766150 +v -1.420906 5.879096 -1.901217 +v -1.331903 5.879096 -2.017199 +v -1.215914 5.879096 -2.106194 +v -1.080844 5.879096 -2.162137 +v -0.935897 5.879096 -2.181214 +v -0.790951 5.879096 -2.162127 +v -0.655885 5.879096 -2.106175 +v -0.539902 5.879096 -2.017172 +v -0.450907 5.879096 -1.901183 +v -0.394964 5.879096 -1.766113 +v -0.375887 5.879096 -1.621167 +v -0.394974 5.879096 -1.476221 +v -0.450926 5.879096 -1.341155 +v -0.539929 5.879096 -1.225172 +v -0.655919 5.879096 -1.136176 +v -0.790988 5.879096 -1.080234 +v -0.935935 5.879096 -1.061156 +v -1.080880 5.879096 -1.080244 +v -1.215947 5.879096 -1.136195 +v -1.331930 5.879096 -1.225199 +v -1.318427 5.753232 -1.518706 +v -1.278869 5.753232 -1.423198 +v -1.331917 5.753232 -1.621199 +v -1.318420 5.753232 -1.723691 +v -1.278855 5.753232 -1.819197 +v -1.215922 5.753232 -1.901210 +v -1.133904 5.753232 -1.964139 +v -1.038396 5.753232 -2.003696 +v -0.935902 5.753232 -2.017185 +v -0.833411 5.753232 -2.003689 +v -0.737904 5.753232 -1.964125 +v -0.655892 5.753232 -1.901191 +v -0.592963 5.753232 -1.819174 +v -0.553406 5.753232 -1.723665 +v -0.539915 5.753232 -1.621172 +v -0.553413 5.753232 -1.518680 +v -0.592976 5.753232 -1.423174 +v -0.655911 5.753232 -1.341161 +v -0.737928 5.753232 -1.278232 +v -0.833437 5.753232 -1.238675 +v -0.935930 5.753232 -1.225185 +v -1.038421 5.753232 -1.238682 +v -1.133928 5.753232 -1.278245 +v -1.215940 5.753232 -1.341180 +v -1.133918 5.674111 -1.568139 +v -1.113442 5.674111 -1.518699 +v -1.140901 5.674111 -1.621192 +v -1.133915 5.674111 -1.674246 +v -1.113435 5.674111 -1.723684 +v -1.080857 5.674111 -1.766137 +v -1.038403 5.674111 -1.798711 +v -0.988963 5.674111 -1.819188 +v -0.935909 5.674111 -1.826170 +v -0.882855 5.674111 -1.819184 +v -0.833418 5.674111 -1.798705 +v -0.790965 5.674111 -1.766127 +v -0.758390 5.674111 -1.723672 +v -0.737913 5.674111 -1.674233 +v -0.730931 5.674111 -1.621178 +v -0.737917 5.674111 -1.568125 +v -0.758397 5.674111 -1.518687 +v -0.790975 5.674111 -1.476233 +v -0.833430 5.674111 -1.443660 +v -0.882869 5.674111 -1.423183 +v -0.935923 5.674111 -1.416200 +v -0.988977 5.674111 -1.423187 +v -1.038415 5.674111 -1.443667 +v -1.080867 5.674111 -1.476244 +v -0.935916 5.647125 -1.621186 +v -0.190840 5.515944 -0.247657 +v -0.243367 5.517920 -0.235939 +v -0.261354 5.488284 -0.267095 +v -0.208826 5.486310 -0.278812 +v -0.173079 5.486310 -0.299449 +v -0.155093 5.515944 -0.268294 +v -0.228850 5.582496 -0.210793 +v -0.139581 5.583405 -0.241425 +v -0.233466 5.666270 -0.218788 +v -0.144205 5.670815 -0.249435 +v -0.255802 5.742265 -0.257478 +v -0.167363 5.750560 -0.289548 +v -0.297788 5.792035 -0.330207 +v -0.211060 5.803005 -0.365240 +v -0.343482 5.797686 -0.409358 +v -0.258901 5.809513 -0.448111 +v -0.486318 5.676223 -0.655443 +v -0.405936 5.684768 -0.702802 +v -0.517488 5.659646 -0.709435 +v -0.437105 5.668191 -0.756794 +v -0.571735 5.679368 -0.802186 +v -0.542081 5.656149 -0.753369 +v -0.461677 5.665982 -0.799357 +v -0.489236 5.692117 -0.847093 +v -0.572927 5.695159 -0.804252 +v -0.490428 5.707908 -0.849159 +v -0.591090 5.686442 -0.844394 +v -0.575502 5.701816 -0.817393 +v -0.498818 5.708117 -0.863693 +v -0.514406 5.692743 -0.890693 +v -0.606256 5.640802 -0.864248 +v -0.600253 5.667114 -0.853850 +v -0.525201 5.671900 -0.909393 +v -0.531203 5.645587 -0.919790 +v -0.604916 5.591613 -0.862565 +v -0.530623 5.594168 -0.918785 +v -0.588219 5.544410 -0.833204 +v -0.515060 5.543750 -0.891826 +v -0.551621 5.518014 -0.769893 +v -0.477914 5.514775 -0.827483 +v -0.553208 5.442576 -0.771806 +v -0.545999 5.489536 -0.759319 +v -0.470734 5.485821 -0.815044 +v -0.477942 5.438861 -0.827531 +v -0.553757 5.360417 -0.773593 +v -0.477973 5.355863 -0.827584 +v -0.535240 5.306975 -0.741518 +v -0.458816 5.299571 -0.794401 +v -0.501877 5.281743 -0.683728 +v -0.424066 5.272824 -0.734208 +v -0.462811 5.285222 -0.619590 +v -0.382114 5.278866 -0.661537 +v -0.470074 5.311057 -0.628639 +v -0.461690 5.295666 -0.614116 +v -0.375516 5.290197 -0.650110 +v -0.383901 5.305588 -0.664634 +v -0.479111 5.360498 -0.644293 +v -0.393471 5.357014 -0.681211 +v -0.473747 5.426218 -0.635001 +v -0.388052 5.425636 -0.671824 +v -0.445369 5.495645 -0.585845 +v -0.358659 5.498289 -0.620911 +v -0.423046 5.539909 -0.544138 +v -0.335433 5.539687 -0.580678 +v -0.402936 5.471096 -0.512342 +v -0.405018 5.520258 -0.515948 +v -0.329649 5.522835 -0.570658 +v -0.327567 5.473672 -0.567053 +v -0.384342 5.362035 -0.480091 +v -0.308249 5.359894 -0.533591 +v -0.354674 5.287212 -0.426508 +v -0.368975 5.316366 -0.451280 +v -0.295007 5.315586 -0.510652 +v -0.280706 5.286431 -0.485881 +v -0.374991 5.265692 -0.461581 +v -0.356747 5.267126 -0.429978 +v -0.282678 5.271138 -0.489296 +v -0.300922 5.269704 -0.520898 +v -0.403070 5.225375 -0.513521 +v -0.391191 5.253418 -0.492945 +v -0.315984 5.254966 -0.546988 +v -0.327862 5.226924 -0.567564 +v -0.389142 5.146736 -0.489853 +v -0.402979 5.194917 -0.513821 +v -0.326883 5.188813 -0.565868 +v -0.313047 5.140632 -0.541901 +v -0.343356 5.109948 -0.409139 +v -0.371460 5.122450 -0.457820 +v -0.292077 5.110291 -0.505577 +v -0.263973 5.097790 -0.456896 +v -0.279875 5.179461 -0.299573 +v -0.319359 5.118040 -0.367904 +v -0.237305 5.106178 -0.410702 +v -0.194744 5.170083 -0.336978 +v -0.268798 5.259162 -0.279990 +v -0.182183 5.254062 -0.315219 +v -0.281731 5.356741 -0.302429 +v -0.196221 5.356647 -0.339536 +v -0.300316 5.417790 -0.334622 +v -0.214805 5.417697 -0.371727 +v -0.271645 5.469887 -0.291056 +v -0.292658 5.458251 -0.327454 +v -0.213591 5.454040 -0.369624 +v -0.192578 5.465675 -0.333227 +v -0.296826 5.533141 -0.286469 +v -0.286707 5.534671 -0.309898 +v -0.292985 5.504072 -0.320772 +v -0.307646 5.501982 -0.305212 +v -0.292762 5.537968 -0.322346 +v -0.319607 5.538089 -0.327890 +v -0.325063 5.520028 -0.337341 +v -0.299040 5.507370 -0.333220 +v -0.318430 5.465744 -0.372094 +v -0.304354 5.457216 -0.347713 +v -0.316096 5.475670 -0.327095 +v -0.397028 5.483232 -0.439979 +v -0.398660 5.538704 -0.442806 +v -0.410370 5.515820 -0.463091 +v -0.408673 5.475719 -0.460150 +v -0.381025 5.217666 -0.412258 +v -0.362534 5.186327 -0.380229 +v -0.330125 5.233723 -0.324091 +v -0.355705 5.262099 -0.387217 +v -0.546223 5.324542 -0.719585 +v -0.516395 5.301105 -0.667917 +v -0.517817 5.315813 -0.649208 +v -0.535706 5.339489 -0.680196 +v -0.588197 5.657892 -0.789743 +v -0.595820 5.668571 -0.802949 +v -0.607675 5.651269 -0.804861 +v -0.606498 5.634236 -0.802821 +v -0.522819 5.511280 -0.657873 +v -0.499943 5.561415 -0.618248 +v -0.508335 5.613324 -0.632784 +v -0.546169 5.588543 -0.698319 +v -0.592421 5.590698 -0.778437 +v -0.581375 5.556879 -0.759304 +v -0.566938 5.572126 -0.734296 +v -0.561544 5.448348 -0.745288 +v -0.562532 5.373504 -0.747835 +v -0.550857 5.368674 -0.706441 +v -0.544711 5.424644 -0.695794 +v -0.300127 5.608974 -0.272129 +v -0.265722 5.577381 -0.233704 +v -0.269503 5.652568 -0.240252 +v -0.304721 5.657471 -0.280085 +v -0.310735 5.503573 -0.290503 +v -0.297990 5.531240 -0.268426 +v -0.374076 5.662285 -0.419520 +v -0.351965 5.666801 -0.381893 +v -0.352606 5.715039 -0.363032 +v -0.372833 5.719302 -0.398069 +v -0.327190 5.412295 -0.340212 +v -0.312418 5.362868 -0.314624 +v -0.300067 5.274145 -0.293195 +v -0.305950 5.201977 -0.303782 +v -0.337957 5.144361 -0.359158 +v -0.361952 5.136270 -0.400392 +v -0.384875 5.146466 -0.440099 +v -0.402558 5.170753 -0.472132 +v -0.409156 5.197310 -0.483560 +v -0.409247 5.227768 -0.483260 +v -0.400771 5.243670 -0.468579 +v -0.384570 5.255943 -0.437216 +v -0.353633 5.282185 -0.383746 +v -0.379358 5.325606 -0.428306 +v -0.394726 5.371274 -0.457117 +v -0.410825 5.470294 -0.485049 +v -0.412522 5.510393 -0.487989 +v -0.379911 5.592010 -0.473217 +v -0.398224 5.557381 -0.504938 +v -0.405728 5.547515 -0.476980 +v -0.394017 5.570402 -0.456695 +v -0.349243 5.625658 -0.419337 +v -0.366300 5.601588 -0.407924 +v -0.296569 5.604552 -0.329733 +v -0.332020 5.629180 -0.390466 +v -0.349076 5.605110 -0.379054 +v -0.322738 5.583147 -0.334107 +v -0.331195 5.474578 -0.385716 +v -0.314199 5.486594 -0.356276 +v -0.340224 5.499254 -0.360395 +v -0.364578 5.473194 -0.402582 +v -0.318796 5.450655 -0.364612 +v -0.332871 5.459183 -0.388993 +v -0.366254 5.457798 -0.405860 +v -0.345669 5.445159 -0.370202 +v -0.308488 5.628274 -0.305646 +v -0.291844 5.612298 -0.317776 +v -0.331628 5.648447 -0.387623 +v -0.387359 5.603806 -0.484801 +v -0.353738 5.643930 -0.425250 +v -0.413076 5.612260 -0.488390 +v -0.405672 5.569179 -0.516522 +v -0.430359 5.578382 -0.518327 +v -0.447733 5.549114 -0.545942 +v -0.478201 5.486811 -0.601758 +v -0.503262 5.424101 -0.645167 +v -0.507739 5.365025 -0.652924 +v -0.499364 5.320957 -0.638416 +v -0.492525 5.308403 -0.626569 +v -0.493647 5.297959 -0.632044 +v -0.498908 5.297311 -0.641156 +v -0.552243 5.497252 -0.729176 +v -0.557864 5.525727 -0.739749 +v -0.590487 5.550106 -0.796172 +v -0.609642 5.590175 -0.829790 +v -0.612828 5.632510 -0.834673 +v -0.607558 5.655898 -0.825545 +v -0.598394 5.675226 -0.816090 +v -0.561857 5.636914 -0.746666 +v -0.537264 5.640411 -0.702732 +v -0.499874 5.662618 -0.637965 +v -0.368061 5.773489 -0.410975 +v -0.326742 5.767262 -0.339402 +v -0.289270 5.721624 -0.274494 +v -0.279439 5.519274 -0.257463 +v -0.294109 5.495102 -0.282875 +v -0.304400 5.476707 -0.306835 +v -0.317456 5.472592 -0.370408 +v -0.315123 5.482518 -0.325409 +v -0.300460 5.484608 -0.340968 +v -0.508678 5.311946 -0.633378 +v -0.372331 5.494235 -0.397199 +v -0.347977 5.520294 -0.355013 +v -0.342521 5.538355 -0.345562 +v -0.346793 5.555797 -0.352962 +v -0.370803 5.570638 -0.394553 +v -0.382220 5.504280 -0.414330 +v -0.394518 5.235818 -0.435631 +v -0.402993 5.219917 -0.450312 +v -0.538100 5.463790 -0.684342 +v -0.342496 5.376470 -0.345520 +v -0.357268 5.425898 -0.371107 +v -0.377853 5.438536 -0.406765 +v -0.389498 5.431025 -0.426936 +v -0.380014 5.349375 -0.410508 +v -0.354290 5.305954 -0.365948 +v -0.327455 5.273817 -0.319466 +v -0.475595 5.605947 -0.576072 +v -0.155791 5.282185 -0.497961 +v -0.140050 5.305954 -0.489630 +v -0.113215 5.273817 -0.443148 +v -0.115885 5.233723 -0.447772 +v -0.157760 5.262099 -0.501491 +v -0.233969 5.578382 -0.631704 +v -0.249195 5.549114 -0.660559 +v -0.261355 5.605947 -0.699753 +v -0.244751 5.569179 -0.609422 +v -0.238444 5.557381 -0.597180 +v -0.244581 5.520258 -0.608569 +v -0.259978 5.539909 -0.638278 +v -0.303458 5.320957 -0.751513 +v -0.321466 5.339489 -0.803878 +v -0.311833 5.365025 -0.766021 +v -0.216686 5.612260 -0.601767 +v -0.158593 5.719302 -0.521750 +v -0.176548 5.662285 -0.533553 +v -0.167981 5.504280 -0.538011 +v -0.184420 5.538704 -0.566488 +v -0.156563 5.570638 -0.518234 +v -0.285703 5.561415 -0.741930 +v -0.294095 5.613324 -0.756465 +v -0.294438 5.311946 -0.757060 +v -0.296619 5.308403 -0.739666 +v -0.300799 5.297959 -0.743376 +v -0.323860 5.463790 -0.808024 +v -0.308579 5.511280 -0.781555 +v -0.307356 5.424101 -0.758264 +v -0.191680 5.643930 -0.518806 +v -0.170152 5.648447 -0.480843 +v -0.172418 5.629180 -0.482604 +v -0.188807 5.625658 -0.511957 +v -0.170394 5.601588 -0.521021 +v -0.154006 5.605110 -0.491668 +v -0.165774 5.349375 -0.534189 +v -0.181516 5.325606 -0.542521 +v -0.198780 5.371274 -0.570237 +v -0.180278 5.235818 -0.559312 +v -0.205683 5.243670 -0.581204 +v -0.186625 5.255943 -0.551490 +v -0.188753 5.219917 -0.573994 +v -0.214464 5.197310 -0.595956 +v -0.214159 5.227768 -0.595885 +v -0.148294 5.186327 -0.503911 +v -0.188969 5.146466 -0.553196 +v -0.207866 5.170753 -0.584528 +v -0.166785 5.217666 -0.535940 +v -0.142337 5.144361 -0.472090 +v -0.166046 5.136270 -0.513489 +v -0.143028 5.425898 -0.494789 +v -0.148045 5.445159 -0.484291 +v -0.131314 5.412295 -0.453292 +v -0.397708 5.668571 -0.917320 +v -0.393435 5.651269 -0.928542 +v -0.411406 5.655898 -0.938784 +v -0.407801 5.675226 -0.926120 +v -0.163613 5.438536 -0.530446 +v -0.182788 5.483232 -0.563660 +v -0.158091 5.494235 -0.520881 +v -0.166629 5.473194 -0.516859 +v -0.168630 5.457798 -0.519949 +v -0.210480 5.547515 -0.589697 +v -0.196130 5.515820 -0.586772 +v -0.216616 5.510393 -0.601086 +v -0.162331 5.472592 -0.459963 +v -0.163304 5.465744 -0.461649 +v -0.170717 5.459183 -0.482605 +v -0.168717 5.474578 -0.479515 +v -0.133737 5.520294 -0.478694 +v -0.129891 5.520028 -0.450014 +v -0.142274 5.499254 -0.474672 +v -0.124529 5.482518 -0.435439 +v -0.110778 5.501982 -0.418866 +v -0.096495 5.503573 -0.414184 +v -0.098203 5.495102 -0.395972 +v -0.113806 5.476707 -0.416865 +v -0.125503 5.475670 -0.437126 +v -0.145335 5.484608 -0.430523 +v -0.151721 5.486594 -0.450075 +v -0.139336 5.507370 -0.425418 +v -0.131584 5.504072 -0.413950 +v -0.355613 5.497252 -0.842691 +v -0.361958 5.525727 -0.852847 +v -0.352698 5.572126 -0.857978 +v -0.331929 5.588543 -0.822001 +v -0.116542 5.362868 -0.427705 +v -0.128256 5.376470 -0.469202 +v -0.100918 5.488284 -0.359716 +v -0.116521 5.469887 -0.380609 +v -0.365951 5.636914 -0.859763 +v -0.381645 5.656149 -0.845989 +v -0.355897 5.659646 -0.802723 +v -0.340203 5.640411 -0.816496 +v -0.420377 5.701816 -0.906947 +v -0.410284 5.695159 -0.898146 +v -0.439571 5.667114 -0.946612 +v -0.435965 5.686442 -0.933949 +v -0.384839 5.489536 -0.852358 +v -0.391184 5.518014 -0.862513 +v -0.350317 5.324542 -0.832682 +v -0.366626 5.373504 -0.860932 +v -0.336617 5.368674 -0.830122 +v -0.301254 5.295666 -0.706737 +v -0.305434 5.285222 -0.710445 +v -0.303577 5.315813 -0.772890 +v -0.155020 5.666801 -0.495590 +v -0.128253 5.583147 -0.446384 +v -0.124435 5.538089 -0.440564 +v -0.128281 5.538355 -0.469244 +v -0.132553 5.555797 -0.476643 +v -0.133059 5.537968 -0.414544 +v -0.137552 5.604552 -0.421535 +v -0.129560 5.612298 -0.411464 +v -0.125306 5.534671 -0.403076 +v -0.198769 5.570402 -0.569412 +v -0.220131 5.592010 -0.565458 +v -0.226438 5.603806 -0.577701 +v -0.214919 5.470294 -0.598146 +v -0.194433 5.475719 -0.583832 +v -0.175258 5.431025 -0.550617 +v -0.206602 5.316366 -0.545018 +v -0.223868 5.362035 -0.572733 +v -0.194270 5.267126 -0.523776 +v -0.192302 5.287212 -0.520247 +v -0.231574 5.253418 -0.585092 +v -0.212515 5.265692 -0.555379 +v -0.243758 5.194917 -0.605739 +v -0.243453 5.225375 -0.605668 +v -0.211023 5.122450 -0.550440 +v -0.229922 5.146736 -0.581772 +v -0.159211 5.118040 -0.460359 +v -0.182920 5.109948 -0.501759 +v -0.110387 5.201977 -0.416681 +v -0.104161 5.274145 -0.406292 +v -0.139911 5.417790 -0.427224 +v -0.156642 5.450655 -0.458224 +v -0.282295 5.486811 -0.714855 +v -0.302813 5.662618 -0.751729 +v -0.172155 5.773489 -0.524072 +v -0.138366 5.715039 -0.486714 +v -0.130836 5.767262 -0.452499 +v -0.083750 5.531240 -0.392107 +v -0.083533 5.519274 -0.370560 +v -0.110732 5.628274 -0.419811 +v -0.085887 5.608974 -0.395810 +v -0.099957 5.533141 -0.400122 +v -0.090481 5.657471 -0.403767 +v -0.093365 5.721624 -0.387591 +v -0.073597 5.652568 -0.353349 +v -0.330471 5.424644 -0.819475 +v -0.367135 5.556879 -0.882986 +v -0.394507 5.550106 -0.909312 +v -0.378181 5.590698 -0.902118 +v -0.414041 5.590175 -0.942711 +v -0.392258 5.634236 -0.926503 +v -0.416676 5.632510 -0.947912 +v -0.390084 5.657892 -0.904114 +v -0.149229 5.457216 -0.437267 +v -0.137534 5.458251 -0.417007 +v -0.137331 5.486310 -0.320087 +v -0.069817 5.577381 -0.346801 +v -0.364914 5.448348 -0.858803 +v -0.306059 5.297311 -0.752488 +v -0.320489 5.301105 -0.781014 +v -0.082931 5.517920 -0.328560 +v -0.068414 5.582496 -0.303413 +v -0.073030 5.666270 -0.311409 +v -0.095365 5.742265 -0.350098 +v -0.137352 5.792035 -0.422827 +v -0.183046 5.797686 -0.501978 +v -0.324727 5.676223 -0.748730 +v -0.409092 5.679368 -0.896081 +v -0.445574 5.640802 -0.957010 +v -0.444787 5.591613 -0.955008 +v -0.427710 5.544410 -0.925866 +v -0.392047 5.442576 -0.864844 +v -0.393320 5.360417 -0.866213 +v -0.374803 5.306975 -0.834138 +v -0.341441 5.281743 -0.776348 +v -0.309638 5.311057 -0.721259 +v -0.318675 5.360498 -0.736913 +v -0.313311 5.426218 -0.727621 +v -0.284933 5.495645 -0.678465 +v -0.242500 5.471096 -0.604963 +v -0.119781 5.179461 -0.391995 +v -0.108362 5.259162 -0.372610 +v -0.121326 5.356741 -0.395032 +v -0.119345 5.515944 -0.288931 +v -0.398380 5.464243 -0.725755 +v -0.430247 5.464243 -0.707360 +v -0.734536 5.123801 -1.214485 +v -0.685573 5.123511 -1.243338 +v -0.796909 5.069855 -1.444054 +v -0.852920 5.069851 -1.411722 +v -0.920091 5.091953 -1.520123 +v -0.856606 5.091958 -1.556768 +v -0.913586 5.160743 -1.664493 +v -0.984510 5.160740 -1.623558 +v -0.951120 5.157276 -1.647598 +v -0.957939 5.269464 -1.750503 +v -1.036909 5.269464 -1.704926 +v -1.000252 5.267411 -1.732596 +v -0.975835 5.441407 -1.786544 +v -1.059114 5.441407 -1.738478 +v -1.020648 5.441407 -1.767989 +v -1.113416 5.441407 -1.792789 +v -0.995699 5.441407 -1.860732 +v -1.140566 5.479807 -1.819945 +v -1.005629 5.479807 -1.897825 +v -1.095316 5.531006 -1.774685 +v -0.989078 5.531006 -1.836003 +v -1.027439 5.569407 -1.706796 +v -0.964249 5.569407 -1.743269 +v -1.063639 5.595008 -1.743004 +v -0.977490 5.595008 -1.792728 +v -1.104366 5.665406 -1.783737 +v -0.992388 5.665406 -1.848366 +v -1.126991 5.665406 -1.806366 +v -1.000664 5.665406 -1.879278 +v -1.126991 5.697407 -1.806366 +v -1.000664 5.697407 -1.879278 +v -0.446690 5.470578 -0.701562 +v -0.461982 5.480661 -0.698612 +v -0.783824 5.148871 -1.201410 +v -0.898613 5.101691 -1.378865 +v -0.965900 5.123687 -1.472525 +v -1.030241 5.187052 -1.560951 +v -1.083870 5.285051 -1.628364 +v -1.107191 5.441407 -1.655226 +v -1.181372 5.441407 -1.675111 +v -1.218463 5.479807 -1.685053 +v -1.156646 5.531006 -1.668482 +v -1.063919 5.569407 -1.643627 +v -1.113374 5.595008 -1.656883 +v -1.169010 5.665406 -1.671797 +v -1.199917 5.665406 -1.680082 +v -1.199917 5.697407 -1.680082 +v -0.789177 5.077298 -1.304126 +v -0.838332 5.107703 -1.282147 +v -0.869656 5.160480 -1.274563 +v -0.921752 5.156838 -1.354278 +v -0.981772 5.178650 -1.426722 +v -1.038541 5.232628 -1.493445 +v -1.086259 5.312052 -1.541328 +v -1.107201 5.441407 -1.559090 +v -1.181387 5.441407 -1.539221 +v -1.218479 5.479807 -1.529285 +v -1.156659 5.531006 -1.545843 +v -1.063926 5.569407 -1.570679 +v -1.113384 5.595008 -1.557434 +v -1.169023 5.665406 -1.542532 +v -1.199933 5.665406 -1.534253 +v -1.199933 5.697407 -1.534253 +v -0.874906 5.221419 -1.283654 +v -0.916141 5.220516 -1.344552 +v -0.963454 5.242119 -1.394983 +v -1.007189 5.285254 -1.439125 +v -1.043437 5.343229 -1.467137 +v -1.059143 5.441407 -1.475827 +v -1.113456 5.441407 -1.421529 +v -1.140612 5.479807 -1.394378 +v -1.095351 5.531006 -1.439627 +v -1.027460 5.569407 -1.507502 +v -1.063669 5.595008 -1.471301 +v -1.104403 5.665406 -1.430577 +v -1.127033 5.665406 -1.407954 +v -1.127033 5.697407 -1.407954 +v -0.852675 5.274195 -1.306987 +v -0.883280 5.275664 -1.352291 +v -0.915854 5.297085 -1.385816 +v -0.944582 5.330832 -1.412547 +v -0.966877 5.370231 -1.425672 +v -0.975892 5.441407 -1.427749 +v -0.995778 5.441407 -1.353568 +v -1.005722 5.479807 -1.316478 +v -0.989150 5.531006 -1.378294 +v -0.964291 5.569407 -1.471022 +v -0.977549 5.595008 -1.421566 +v -0.992464 5.665406 -1.365932 +v -1.000750 5.665406 -1.335022 +v -1.000750 5.697407 -1.335022 +v -0.809206 5.304605 -1.338784 +v -0.831975 5.307508 -1.375422 +v -0.851728 5.328821 -1.401674 +v -0.867498 5.357145 -1.420831 +v -0.877092 5.385822 -1.428041 +v -0.879755 5.441407 -1.427736 +v -0.859888 5.441407 -1.353550 +v -0.849955 5.479807 -1.316456 +v -0.866511 5.531006 -1.378278 +v -0.891344 5.569407 -1.471010 +v -0.927819 5.569407 -1.466213 +v -0.878099 5.595008 -1.421553 +v -0.863198 5.665406 -1.365914 +v -0.854921 5.665406 -1.335005 +v -0.854921 5.697407 -1.335005 +v -0.755362 5.304673 -1.369219 +v -0.775972 5.307511 -1.407747 +v -0.788254 5.328824 -1.438312 +v -0.796588 5.357148 -1.461758 +v -0.798139 5.385825 -1.473610 +v -0.796490 5.441407 -1.475793 +v -0.742193 5.441407 -1.421479 +v -0.715044 5.479807 -1.394323 +v -0.760293 5.531006 -1.439584 +v -0.828165 5.569407 -1.507477 +v -0.791967 5.595008 -1.471266 +v -0.751243 5.665406 -1.430531 +v -0.728618 5.665406 -1.407900 +v -0.728618 5.697407 -1.407900 +v -0.706357 5.274205 -1.391448 +v -0.730279 5.275675 -1.440605 +v -0.742443 5.297095 -1.485909 +v -0.750855 5.330838 -1.524364 +v -0.751173 5.370237 -1.550168 +v -0.769616 5.379807 -1.509160 +v -0.748410 5.441407 -1.559041 +v -0.674230 5.441407 -1.539153 +v -0.637140 5.479807 -1.529208 +v -0.698957 5.531006 -1.545782 +v -0.791682 5.569407 -1.570644 +v -0.742229 5.595008 -1.557386 +v -0.686594 5.665406 -1.542468 +v -0.655687 5.665406 -1.534181 +v -0.655687 5.697407 -1.534181 +v -0.429326 5.586796 -0.779343 +v -0.397591 5.570380 -0.788089 +v -0.684352 5.287472 -1.339637 +v -0.733378 5.312833 -1.326123 +v -0.648650 5.243540 -1.334631 +v -0.675030 5.221431 -1.399032 +v -0.707136 5.220531 -1.465191 +v -0.726568 5.242130 -1.531714 +v -0.742550 5.285265 -1.591869 +v -0.748779 5.343235 -1.637205 +v -0.748396 5.441407 -1.655179 +v -0.674209 5.441407 -1.675043 +v -0.637117 5.479807 -1.684978 +v -0.698938 5.531006 -1.668422 +v -0.791670 5.569407 -1.643591 +v -0.742214 5.595008 -1.656834 +v -0.686574 5.665406 -1.671732 +v -0.655662 5.665406 -1.680011 +v -0.655662 5.697407 -1.680011 +v -0.635842 5.192812 -1.312450 +v -0.669776 5.160491 -1.389942 +v -0.712747 5.156850 -1.474922 +v -0.744882 5.178664 -1.563453 +v -0.773897 5.232639 -1.646192 +v -0.791597 5.312058 -1.711398 +v -0.796449 5.441407 -1.738443 +v -0.742135 5.441407 -1.792739 +v -0.714976 5.479807 -1.819889 +v -0.760240 5.531006 -1.774641 +v -0.828134 5.569407 -1.706770 +v -0.791923 5.595008 -1.742968 +v -0.751187 5.665406 -1.783690 +v -0.728556 5.665406 -1.806314 +v -0.728556 5.697407 -1.806314 +v -0.649356 5.148880 -1.279036 +v -0.692005 5.107712 -1.366613 +v -0.745605 5.101700 -1.467185 +v -0.792479 5.123696 -1.572623 +v -0.836501 5.187061 -1.672774 +v -0.868155 5.285056 -1.752868 +v -0.879698 5.441407 -1.786525 +v -0.859808 5.441407 -1.860707 +v -0.849863 5.479807 -1.897795 +v -0.866438 5.531006 -1.835980 +v -0.891301 5.569407 -1.743255 +v -0.878041 5.595008 -1.792708 +v -0.863123 5.665406 -1.848343 +v -0.854835 5.665406 -1.879251 +v -0.854835 5.697407 -1.879251 +v -0.735759 5.077236 -1.335295 +v -0.927774 5.569407 -1.748064 +v -0.374937 5.480664 -0.748860 +v -0.366189 5.509104 -0.770491 +v -0.374480 5.541945 -0.784849 +v -0.783124 5.312378 -1.298597 +v -0.461185 5.586796 -0.760950 +v -0.818813 5.287462 -1.262015 +v -0.484630 5.570374 -0.737844 +v -0.832330 5.243531 -1.228599 +v -0.493380 5.541935 -0.716213 +v -0.819524 5.192803 -1.206417 +v -0.485091 5.509098 -0.701854 +v -0.119037 5.515944 0.289109 +v -0.082623 5.517920 0.328738 +v -0.100609 5.488284 0.359894 +v -0.137023 5.486310 0.320264 +v -0.172770 5.486310 0.299627 +v -0.154784 5.515944 0.268472 +v -0.068106 5.582496 0.303591 +v -0.139273 5.583405 0.241603 +v -0.072721 5.666270 0.311587 +v -0.143897 5.670815 0.249613 +v -0.095057 5.742265 0.350276 +v -0.167054 5.750560 0.289726 +v -0.137044 5.792035 0.423005 +v -0.210752 5.803005 0.365418 +v -0.182738 5.797686 0.502156 +v -0.258593 5.809513 0.448289 +v -0.324419 5.676223 0.748908 +v -0.405627 5.684768 0.702980 +v -0.355589 5.659646 0.802901 +v -0.436797 5.668191 0.756972 +v -0.408784 5.679368 0.896259 +v -0.381337 5.656149 0.846167 +v -0.461369 5.665982 0.799535 +v -0.488927 5.692117 0.847271 +v -0.409976 5.695159 0.898324 +v -0.490120 5.707908 0.849337 +v -0.435656 5.686442 0.934127 +v -0.420068 5.701816 0.907125 +v -0.498510 5.708117 0.863871 +v -0.514098 5.692743 0.890871 +v -0.445265 5.640802 0.957188 +v -0.439263 5.667114 0.946790 +v -0.524893 5.671900 0.909571 +v -0.530895 5.645587 0.919968 +v -0.444478 5.591613 0.955186 +v -0.530315 5.594168 0.918963 +v -0.427402 5.544410 0.926044 +v -0.514752 5.543750 0.892004 +v -0.390876 5.518014 0.862691 +v -0.477606 5.514775 0.827661 +v -0.391739 5.442576 0.865022 +v -0.384531 5.489536 0.852536 +v -0.470425 5.485821 0.815222 +v -0.477634 5.438861 0.827709 +v -0.393012 5.360417 0.866391 +v -0.477664 5.355863 0.827762 +v -0.374495 5.306975 0.834316 +v -0.458508 5.299571 0.794579 +v -0.341133 5.281743 0.776526 +v -0.423758 5.272824 0.734386 +v -0.305125 5.285222 0.710622 +v -0.381805 5.278866 0.661715 +v -0.309330 5.311057 0.721437 +v -0.300946 5.295666 0.706915 +v -0.375208 5.290197 0.650288 +v -0.383593 5.305588 0.664812 +v -0.318367 5.360498 0.737091 +v -0.393163 5.357014 0.681389 +v -0.313002 5.426218 0.727799 +v -0.387744 5.425636 0.672002 +v -0.284625 5.495645 0.678643 +v -0.358351 5.498289 0.621089 +v -0.259670 5.539909 0.638456 +v -0.335124 5.539687 0.580856 +v -0.242191 5.471096 0.605141 +v -0.244273 5.520258 0.608747 +v -0.329340 5.522835 0.570836 +v -0.327259 5.473672 0.567231 +v -0.223560 5.362035 0.572911 +v -0.307941 5.359894 0.533769 +v -0.191993 5.287212 0.520425 +v -0.206294 5.316366 0.545196 +v -0.294698 5.315586 0.510830 +v -0.280398 5.286431 0.486059 +v -0.212206 5.265692 0.555557 +v -0.193962 5.267126 0.523954 +v -0.282370 5.271138 0.489474 +v -0.300614 5.269704 0.521076 +v -0.243145 5.225375 0.605846 +v -0.231266 5.253418 0.585270 +v -0.315675 5.254966 0.547166 +v -0.327554 5.226924 0.567742 +v -0.229613 5.146736 0.581950 +v -0.243450 5.194917 0.605917 +v -0.326575 5.188813 0.566046 +v -0.312739 5.140632 0.542079 +v -0.182611 5.109948 0.501937 +v -0.210715 5.122450 0.550618 +v -0.291769 5.110291 0.505755 +v -0.263665 5.097790 0.457074 +v -0.119473 5.179461 0.392173 +v -0.158903 5.118040 0.460537 +v -0.236997 5.106178 0.410880 +v -0.194436 5.170083 0.337156 +v -0.108053 5.259162 0.372788 +v -0.181874 5.254062 0.315397 +v -0.121018 5.356741 0.395210 +v -0.195912 5.356647 0.339714 +v -0.139603 5.417790 0.427402 +v -0.214497 5.417697 0.371905 +v -0.116213 5.469887 0.380787 +v -0.137225 5.458251 0.417185 +v -0.213282 5.454040 0.369802 +v -0.192270 5.465675 0.333405 +v -0.099648 5.533141 0.400300 +v -0.124998 5.534671 0.403254 +v -0.131276 5.504072 0.414128 +v -0.110469 5.501982 0.419044 +v -0.132750 5.537968 0.414722 +v -0.124127 5.538089 0.440742 +v -0.129583 5.520028 0.450192 +v -0.139028 5.507370 0.425596 +v -0.162996 5.465744 0.461827 +v -0.148920 5.457216 0.437445 +v -0.125194 5.475670 0.437304 +v -0.182479 5.483232 0.563838 +v -0.184112 5.538704 0.566666 +v -0.195822 5.515820 0.586950 +v -0.194125 5.475719 0.584010 +v -0.166476 5.217666 0.536118 +v -0.147986 5.186327 0.504089 +v -0.115577 5.233723 0.447950 +v -0.157452 5.262099 0.501669 +v -0.350009 5.324542 0.832860 +v -0.320181 5.301105 0.781192 +v -0.303268 5.315813 0.773068 +v -0.321158 5.339489 0.804056 +v -0.389776 5.657892 0.904292 +v -0.397399 5.668571 0.917498 +v -0.393127 5.651269 0.928720 +v -0.391950 5.634236 0.926681 +v -0.308271 5.511280 0.781733 +v -0.285395 5.561415 0.742108 +v -0.293787 5.613324 0.756643 +v -0.331620 5.588543 0.822179 +v -0.377872 5.590698 0.902296 +v -0.366827 5.556879 0.883164 +v -0.352390 5.572126 0.858156 +v -0.364606 5.448348 0.858981 +v -0.366318 5.373504 0.861110 +v -0.336309 5.368674 0.830300 +v -0.330162 5.424644 0.819653 +v -0.085579 5.608974 0.395988 +v -0.069508 5.577381 0.346979 +v -0.073289 5.652568 0.353527 +v -0.090172 5.657471 0.403945 +v -0.096187 5.503573 0.414362 +v -0.083441 5.531240 0.392285 +v -0.176240 5.662285 0.533731 +v -0.154712 5.666801 0.495768 +v -0.138058 5.715039 0.486892 +v -0.158285 5.719302 0.521928 +v -0.131005 5.412295 0.453470 +v -0.116234 5.362868 0.427883 +v -0.103853 5.274145 0.406470 +v -0.110079 5.201977 0.416859 +v -0.142028 5.144361 0.472268 +v -0.165738 5.136270 0.513667 +v -0.188661 5.146466 0.553374 +v -0.207558 5.170753 0.584706 +v -0.214156 5.197310 0.596134 +v -0.213850 5.227768 0.596063 +v -0.205375 5.243670 0.581382 +v -0.186317 5.255943 0.551668 +v -0.155482 5.282185 0.498139 +v -0.181207 5.325606 0.542699 +v -0.198472 5.371274 0.570415 +v -0.214610 5.470294 0.598324 +v -0.216308 5.510393 0.601264 +v -0.219823 5.592010 0.565636 +v -0.238136 5.557381 0.597358 +v -0.210172 5.547515 0.589875 +v -0.198461 5.570402 0.569590 +v -0.188499 5.625658 0.512135 +v -0.170086 5.601588 0.521199 +v -0.137243 5.604552 0.421713 +v -0.172110 5.629180 0.482782 +v -0.153698 5.605110 0.491846 +v -0.127944 5.583147 0.446562 +v -0.168409 5.474578 0.479693 +v -0.151413 5.486594 0.450253 +v -0.141966 5.499254 0.474850 +v -0.166320 5.473194 0.517037 +v -0.156333 5.450655 0.458402 +v -0.170408 5.459183 0.482783 +v -0.168322 5.457798 0.520127 +v -0.147736 5.445159 0.484469 +v -0.110424 5.628274 0.419989 +v -0.129251 5.612298 0.411642 +v -0.169844 5.648447 0.481021 +v -0.226130 5.603806 0.577879 +v -0.191372 5.643930 0.518984 +v -0.216377 5.612260 0.601945 +v -0.244443 5.569179 0.609600 +v -0.233660 5.578382 0.631882 +v -0.248886 5.549114 0.660737 +v -0.281987 5.486811 0.715033 +v -0.307047 5.424101 0.758442 +v -0.311525 5.365025 0.766199 +v -0.303150 5.320957 0.751691 +v -0.296311 5.308403 0.739844 +v -0.300490 5.297959 0.743554 +v -0.305751 5.297311 0.752666 +v -0.355304 5.497252 0.842869 +v -0.361650 5.525727 0.853025 +v -0.394198 5.550106 0.909490 +v -0.413732 5.590175 0.942889 +v -0.416368 5.632510 0.948090 +v -0.411098 5.655898 0.938962 +v -0.407493 5.675226 0.926298 +v -0.365643 5.636914 0.859941 +v -0.339895 5.640411 0.816674 +v -0.302504 5.662618 0.751907 +v -0.171847 5.773489 0.524250 +v -0.130528 5.767262 0.452677 +v -0.093056 5.721624 0.387769 +v -0.083224 5.519274 0.370738 +v -0.097895 5.495102 0.396150 +v -0.113498 5.476707 0.417043 +v -0.162023 5.472592 0.460141 +v -0.124221 5.482518 0.435617 +v -0.145027 5.484608 0.430701 +v -0.294130 5.311946 0.757238 +v -0.157783 5.494235 0.521059 +v -0.133428 5.520294 0.478872 +v -0.127973 5.538355 0.469422 +v -0.132244 5.555797 0.476821 +v -0.156255 5.570638 0.518412 +v -0.167672 5.504280 0.538189 +v -0.179969 5.235818 0.559490 +v -0.188445 5.219917 0.574172 +v -0.323551 5.463790 0.808201 +v -0.127948 5.376470 0.469380 +v -0.142720 5.425898 0.494967 +v -0.163305 5.438536 0.530624 +v -0.174950 5.431025 0.550795 +v -0.165466 5.349375 0.534367 +v -0.139741 5.305954 0.489808 +v -0.112907 5.273817 0.443326 +v -0.261047 5.605947 0.699931 +v -0.353325 5.282185 0.383924 +v -0.353981 5.305954 0.366126 +v -0.327147 5.273817 0.319644 +v -0.329817 5.233723 0.324269 +v -0.355397 5.262099 0.387395 +v -0.430051 5.578382 0.518505 +v -0.447425 5.549114 0.546120 +v -0.475286 5.605947 0.576250 +v -0.405364 5.569179 0.516700 +v -0.397915 5.557381 0.505116 +v -0.404709 5.520258 0.516126 +v -0.422737 5.539909 0.544316 +v -0.499055 5.320957 0.638594 +v -0.535398 5.339489 0.680374 +v -0.507431 5.365025 0.653102 +v -0.412768 5.612260 0.488568 +v -0.372525 5.719302 0.398247 +v -0.373767 5.662285 0.419698 +v -0.381912 5.504280 0.414508 +v -0.398352 5.538704 0.442984 +v -0.370495 5.570638 0.394731 +v -0.499635 5.561415 0.618426 +v -0.508026 5.613324 0.632962 +v -0.508370 5.311946 0.633556 +v -0.492216 5.308403 0.626747 +v -0.493339 5.297959 0.632222 +v -0.537791 5.463790 0.684520 +v -0.522511 5.511280 0.658051 +v -0.502953 5.424101 0.645345 +v -0.353430 5.643930 0.425428 +v -0.331319 5.648447 0.387801 +v -0.331711 5.629180 0.390644 +v -0.348935 5.625658 0.419515 +v -0.365992 5.601588 0.408102 +v -0.348767 5.605110 0.379232 +v -0.379706 5.349375 0.410686 +v -0.379050 5.325606 0.428484 +v -0.394418 5.371274 0.457295 +v -0.394209 5.235818 0.435809 +v -0.400463 5.243670 0.468757 +v -0.384261 5.255943 0.437394 +v -0.402685 5.219917 0.450490 +v -0.408847 5.197310 0.483738 +v -0.408939 5.227768 0.483438 +v -0.362226 5.186327 0.380407 +v -0.384566 5.146466 0.440277 +v -0.402250 5.170753 0.472310 +v -0.380716 5.217666 0.412436 +v -0.337648 5.144361 0.359336 +v -0.361644 5.136270 0.400570 +v -0.356960 5.425898 0.371285 +v -0.345360 5.445159 0.370380 +v -0.326882 5.412295 0.340390 +v -0.595512 5.668571 0.803127 +v -0.607367 5.651269 0.805039 +v -0.607250 5.655898 0.825723 +v -0.598086 5.675226 0.816268 +v -0.377545 5.438536 0.406943 +v -0.396719 5.483232 0.440156 +v -0.372023 5.494235 0.397377 +v -0.364270 5.473194 0.402759 +v -0.365946 5.457798 0.406038 +v -0.405419 5.547515 0.477158 +v -0.410062 5.515820 0.463269 +v -0.412214 5.510393 0.488167 +v -0.317148 5.472592 0.370586 +v -0.318122 5.465744 0.372272 +v -0.332563 5.459183 0.389171 +v -0.330887 5.474578 0.385894 +v -0.347668 5.520294 0.355191 +v -0.324754 5.520028 0.337519 +v -0.339916 5.499254 0.360573 +v -0.314814 5.482518 0.325587 +v -0.307338 5.501982 0.305390 +v -0.310426 5.503573 0.290681 +v -0.293800 5.495102 0.283053 +v -0.304091 5.476707 0.307013 +v -0.315788 5.475670 0.327273 +v -0.300152 5.484608 0.341146 +v -0.313891 5.486594 0.356454 +v -0.298731 5.507370 0.333398 +v -0.292676 5.504072 0.320950 +v -0.551934 5.497252 0.729354 +v -0.557556 5.525727 0.739928 +v -0.566630 5.572126 0.734474 +v -0.545860 5.588543 0.698497 +v -0.312110 5.362868 0.314802 +v -0.342188 5.376470 0.345698 +v -0.261045 5.488284 0.267273 +v -0.271337 5.469887 0.291234 +v -0.561549 5.636914 0.746844 +v -0.541773 5.656149 0.753547 +v -0.517180 5.659646 0.709613 +v -0.536956 5.640411 0.702910 +v -0.575194 5.701816 0.817571 +v -0.572619 5.695159 0.804430 +v -0.599945 5.667114 0.854028 +v -0.590782 5.686442 0.844572 +v -0.545691 5.489536 0.759497 +v -0.551312 5.518014 0.770071 +v -0.545915 5.324542 0.719763 +v -0.562224 5.373504 0.748013 +v -0.550549 5.368674 0.706619 +v -0.461382 5.295666 0.614294 +v -0.462503 5.285222 0.619768 +v -0.517508 5.315813 0.649386 +v -0.351657 5.666801 0.382071 +v -0.322430 5.583147 0.334285 +v -0.319299 5.538089 0.328068 +v -0.342213 5.538355 0.345740 +v -0.346484 5.555797 0.353140 +v -0.292454 5.537968 0.322524 +v -0.296261 5.604552 0.329911 +v -0.291536 5.612298 0.317954 +v -0.286399 5.534671 0.310076 +v -0.393709 5.570402 0.456873 +v -0.379603 5.592010 0.473395 +v -0.387051 5.603806 0.484979 +v -0.410516 5.470294 0.485227 +v -0.408365 5.475719 0.460328 +v -0.389190 5.431025 0.427114 +v -0.368667 5.316366 0.451458 +v -0.384034 5.362035 0.480269 +v -0.356438 5.267126 0.430156 +v -0.354366 5.287212 0.426686 +v -0.390883 5.253418 0.493123 +v -0.374683 5.265692 0.461759 +v -0.402670 5.194917 0.513999 +v -0.402762 5.225375 0.513699 +v -0.371151 5.122450 0.457998 +v -0.388834 5.146736 0.490031 +v -0.319051 5.118040 0.368082 +v -0.343047 5.109948 0.409317 +v -0.305642 5.201977 0.303960 +v -0.299758 5.274145 0.293373 +v -0.300008 5.417790 0.334800 +v -0.318488 5.450655 0.364790 +v -0.477893 5.486811 0.601936 +v -0.499566 5.662618 0.638143 +v -0.367753 5.773489 0.411153 +v -0.352298 5.715039 0.363210 +v -0.326434 5.767262 0.339580 +v -0.297681 5.531240 0.268604 +v -0.279130 5.519274 0.257641 +v -0.308179 5.628274 0.305824 +v -0.299819 5.608974 0.272307 +v -0.296517 5.533141 0.286647 +v -0.304412 5.657471 0.280263 +v -0.288962 5.721624 0.274672 +v -0.269194 5.652568 0.240430 +v -0.544402 5.424644 0.695972 +v -0.581067 5.556879 0.759482 +v -0.590179 5.550106 0.796350 +v -0.592112 5.590698 0.778615 +v -0.609333 5.590175 0.829968 +v -0.606190 5.634236 0.802999 +v -0.612520 5.632510 0.834851 +v -0.587888 5.657892 0.789921 +v -0.304046 5.457216 0.347891 +v -0.292349 5.458251 0.327632 +v -0.208518 5.486310 0.278990 +v -0.265414 5.577381 0.233882 +v -0.561236 5.448348 0.745466 +v -0.498599 5.297311 0.641334 +v -0.516087 5.301105 0.668095 +v -0.243059 5.517920 0.236117 +v -0.228542 5.582496 0.210971 +v -0.233158 5.666270 0.218966 +v -0.255493 5.742265 0.257656 +v -0.297480 5.792035 0.330384 +v -0.343174 5.797686 0.409536 +v -0.486010 5.676223 0.655621 +v -0.571427 5.679368 0.802365 +v -0.605947 5.640802 0.864426 +v -0.604608 5.591613 0.862743 +v -0.587911 5.544410 0.833382 +v -0.552899 5.442576 0.771984 +v -0.553448 5.360417 0.773771 +v -0.534931 5.306975 0.741696 +v -0.501569 5.281743 0.683906 +v -0.469766 5.311057 0.628817 +v -0.478803 5.360498 0.644471 +v -0.473439 5.426218 0.635179 +v -0.445061 5.495645 0.586023 +v -0.402627 5.471096 0.512520 +v -0.279566 5.179461 0.299751 +v -0.268490 5.259162 0.280168 +v -0.281423 5.356741 0.302607 +v -0.190532 5.515944 0.247835 +v -0.429282 5.464243 0.707915 +v -0.397417 5.464243 0.726313 +v -0.684420 5.123801 1.243417 +v -0.733891 5.123511 1.215444 +v -0.852034 5.069855 1.412230 +v -0.796026 5.069851 1.444567 +v -0.856310 5.091953 1.556943 +v -0.919791 5.091958 1.520291 +v -0.984586 5.160743 1.623505 +v -0.913671 5.160740 1.664454 +v -0.951186 5.157276 1.647560 +v -1.036891 5.269464 1.704924 +v -0.957932 5.269464 1.750519 +v -1.000224 5.267411 1.732612 +v -1.059154 5.441407 1.738444 +v -0.975884 5.441407 1.786527 +v -1.020675 5.441407 1.767973 +v -0.995762 5.441407 1.860711 +v -1.113466 5.441407 1.792745 +v -1.005703 5.479807 1.897802 +v -1.140623 5.479807 1.819893 +v -0.989136 5.531006 1.835983 +v -1.095362 5.531006 1.774645 +v -0.964287 5.569407 1.743254 +v -1.027472 5.569407 1.706770 +v -0.977541 5.595008 1.792709 +v -1.063681 5.595008 1.742970 +v -0.992449 5.665406 1.848347 +v -1.104413 5.665406 1.783694 +v -1.000732 5.665406 1.879256 +v -1.127044 5.665406 1.806318 +v -1.000732 5.697407 1.879256 +v -1.127044 5.697407 1.806318 +v -0.384174 5.470578 0.737653 +v -0.373973 5.480661 0.749420 +v -0.648450 5.148871 1.279562 +v -0.744723 5.101691 1.467707 +v -0.792184 5.123687 1.572812 +v -0.836586 5.187052 1.672749 +v -0.868147 5.285051 1.752901 +v -0.879747 5.441407 1.786530 +v -0.859872 5.441407 1.860714 +v -0.849934 5.479807 1.897806 +v -0.866497 5.531006 1.835986 +v -0.891341 5.569407 1.743257 +v -0.878091 5.595008 1.792713 +v -0.863184 5.665406 1.848351 +v -0.854903 5.665406 1.879260 +v -0.854903 5.697407 1.879260 +v -0.734724 5.077298 1.335562 +v -0.691110 5.107703 1.367139 +v -0.668878 5.160480 1.390473 +v -0.711860 5.156838 1.475450 +v -0.744582 5.178650 1.563653 +v -0.773976 5.232628 1.646180 +v -0.791580 5.312052 1.711448 +v -0.796489 5.441407 1.738465 +v -0.742185 5.441407 1.792774 +v -0.715033 5.479807 1.819926 +v -0.760285 5.531006 1.774671 +v -0.828165 5.569407 1.706784 +v -0.791964 5.595008 1.742991 +v -0.751235 5.665406 1.783722 +v -0.728609 5.665406 1.806350 +v -0.728609 5.697407 1.806350 +v -0.674126 5.221419 1.399565 +v -0.706243 5.220516 1.465726 +v -0.726257 5.242119 1.531918 +v -0.742613 5.285254 1.591866 +v -0.748745 5.343229 1.637263 +v -0.748417 5.441407 1.655210 +v -0.674235 5.441407 1.675092 +v -0.637143 5.479807 1.685033 +v -0.698961 5.531006 1.668464 +v -0.791690 5.569407 1.643613 +v -0.742234 5.595008 1.656867 +v -0.686598 5.665406 1.671777 +v -0.655689 5.665406 1.680062 +v -0.655689 5.697407 1.680062 +v -0.705449 5.274195 1.391981 +v -0.729377 5.275664 1.441139 +v -0.742121 5.297085 1.486113 +v -0.750904 5.330832 1.524358 +v -0.751121 5.370231 1.550228 +v -0.748412 5.441407 1.559074 +v -0.674228 5.441407 1.539200 +v -0.637136 5.479807 1.529264 +v -0.698955 5.531006 1.545825 +v -0.791687 5.569407 1.570667 +v -0.742229 5.595008 1.557417 +v -0.686592 5.665406 1.542514 +v -0.655681 5.665406 1.534232 +v -0.655681 5.697407 1.534232 +v -0.754723 5.304605 1.370238 +v -0.775065 5.307508 1.408277 +v -0.787921 5.328821 1.438510 +v -0.796624 5.357145 1.461746 +v -0.798071 5.385822 1.473660 +v -0.796475 5.441407 1.475814 +v -0.742165 5.441407 1.421512 +v -0.715010 5.479807 1.394360 +v -0.760268 5.531006 1.439612 +v -0.828154 5.569407 1.507490 +v -0.805761 5.569407 1.536678 +v -0.791949 5.595008 1.471288 +v -0.751217 5.665406 1.430561 +v -0.728589 5.665406 1.407937 +v -0.728589 5.697407 1.407937 +v -0.808004 5.304673 1.338829 +v -0.831063 5.307511 1.375943 +v -0.851389 5.328824 1.401864 +v -0.867526 5.357148 1.420805 +v -0.877015 5.385825 1.428075 +v -0.879729 5.441407 1.427739 +v -0.859846 5.441407 1.353558 +v -0.849905 5.479807 1.316468 +v -0.866473 5.531006 1.378286 +v -0.891328 5.569407 1.471013 +v -0.878071 5.595008 1.421558 +v -0.863160 5.665406 1.365921 +v -0.854875 5.665406 1.335012 +v -0.854875 5.697407 1.335012 +v -0.851760 5.274205 1.307507 +v -0.882366 5.275675 1.352804 +v -0.915516 5.297095 1.385993 +v -0.944611 5.330838 1.412507 +v -0.966799 5.370237 1.425687 +v -0.922064 5.379807 1.421152 +v -0.975864 5.441407 1.427731 +v -0.995736 5.441407 1.353546 +v -1.005671 5.479807 1.316454 +v -0.989112 5.531006 1.378275 +v -0.964274 5.569407 1.471006 +v -0.977521 5.595008 1.421551 +v -0.992424 5.665406 1.365912 +v -1.000703 5.665406 1.335002 +v -1.000703 5.697407 1.335002 +v -0.460214 5.586796 0.761511 +v -0.483658 5.570380 0.738402 +v -0.817895 5.287472 1.262542 +v -0.781677 5.312833 1.298240 +v -0.831413 5.243540 1.229121 +v -0.873993 5.221431 1.284170 +v -0.915231 5.220531 1.345057 +v -0.963121 5.242130 1.395151 +v -1.007223 5.285265 1.439072 +v -1.043369 5.343235 1.467137 +v -1.059125 5.441407 1.475793 +v -1.113426 5.441407 1.421481 +v -1.140577 5.479807 1.394328 +v -1.095326 5.531006 1.439586 +v -1.027450 5.569407 1.507474 +v -1.063651 5.595008 1.471268 +v -1.104375 5.665406 1.430534 +v -1.127003 5.665406 1.407905 +v -1.127003 5.697407 1.407905 +v -0.818610 5.192812 1.206938 +v -0.868748 5.160491 1.275075 +v -0.920852 5.156850 1.354783 +v -0.981449 5.178664 1.426882 +v -1.038591 5.232639 1.493383 +v -1.086208 5.312058 1.541319 +v -1.107203 5.441407 1.559044 +v -1.181383 5.441407 1.539160 +v -1.218475 5.479807 1.529217 +v -1.156656 5.531006 1.545789 +v -1.063930 5.569407 1.570644 +v -1.113384 5.595008 1.557388 +v -1.169020 5.665406 1.542474 +v -1.199928 5.665406 1.534189 +v -1.199928 5.697407 1.534189 +v -0.782915 5.148880 1.201931 +v -0.837429 5.107712 1.282659 +v -0.897720 5.101700 1.379368 +v -0.965589 5.123696 1.472686 +v -1.030305 5.187061 1.560890 +v -1.083836 5.285056 1.628354 +v -1.107211 5.441407 1.655181 +v -1.181399 5.441407 1.675052 +v -1.218489 5.479807 1.684986 +v -1.156670 5.531006 1.668428 +v -1.063938 5.569407 1.643591 +v -1.113395 5.595008 1.656838 +v -1.169034 5.665406 1.671740 +v -1.199944 5.665406 1.680019 +v -1.199944 5.697407 1.680019 +v -0.788428 5.077236 1.304889 +v -1.049863 5.569407 1.677581 +v -0.461015 5.480664 0.699167 +v -0.484121 5.509104 0.702409 +v -0.492409 5.541945 0.716769 +v -0.732963 5.312378 1.327555 +v -0.428355 5.586796 0.779903 +v -0.683437 5.287462 1.340168 +v -0.396621 5.570374 0.788652 +v -0.647740 5.243531 1.335163 +v -0.373513 5.541935 0.785412 +v -0.634934 5.192803 1.312981 +v -0.365224 5.509098 0.771053 +v -0.255882 6.871280 0.000000 +v -0.255882 6.823281 0.000000 +v -0.207882 6.815281 0.000000 +v -0.175883 6.775281 0.000000 +v -0.111882 6.751280 0.000000 +v -0.143882 6.727280 0.000000 +v -0.135882 6.671281 0.000000 +v -0.143882 6.607280 0.000000 +v -0.175883 6.535279 0.000000 +v -0.239882 6.479280 0.000000 +v -0.239882 6.439281 0.000000 +v -0.307844 6.439281 0.000000 +v -0.331844 6.391280 0.000000 +v -0.283844 6.359281 0.000000 +v -0.227844 6.287280 0.000000 +v -0.179844 6.135281 0.000000 +v -0.171844 5.991281 0.000000 +v -0.243844 5.991281 0.000000 +v -0.243844 5.927280 0.000000 +v -0.187844 5.927280 0.000000 +v -0.187844 5.847281 0.000000 +v -0.239774 5.847281 0.000000 +v -0.295774 5.791280 0.000000 +v -0.295774 5.023280 0.000000 +v -0.351774 5.023280 0.000000 +v -0.399774 4.967279 0.000000 +v -0.401771 4.865267 0.000000 +v -0.355758 4.767281 0.000000 +v -0.411919 -0.855625 0.000000 +v -0.525026 -0.855625 0.000000 +v -0.581026 -0.903625 0.000000 +v -0.581026 -1.079625 0.000000 +v -0.541026 -1.127625 0.000000 +v -0.449117 -1.127625 0.000000 +v -0.425117 -1.183625 0.000000 +v -0.441708 -1.365037 0.000000 +v -0.511333 -1.530860 0.000000 +v -0.564391 -1.673745 0.000000 +v -0.660251 -1.819721 0.000000 +v -0.932420 -1.996708 0.000000 +v -1.076103 -2.040090 0.000000 +v -1.100103 -2.072090 0.000000 +v -1.100103 -2.128090 0.000000 +v -1.076103 -2.160089 0.000000 +v -1.012103 -2.192089 0.000000 +v -1.004103 -2.256090 0.000000 +v -1.028103 -2.356090 0.000000 +v -1.108103 -2.524090 0.000000 +v -1.192103 -2.600090 0.000000 +v -1.256103 -2.602085 0.000000 +v -1.304103 -2.642078 0.000000 +v -1.304103 -2.728091 0.000000 +v -1.272103 -2.760090 0.000000 +v -1.224103 -2.760090 0.000000 +v -1.224103 -3.284090 0.000000 +v -1.182394 -3.284090 0.316816 +v -1.182394 -2.760090 0.316816 +v -1.228759 -2.760090 0.329239 +v -1.259668 -2.728091 0.337521 +v -1.259668 -2.642078 0.337521 +v -1.213304 -2.602085 0.325098 +v -1.151484 -2.600090 0.308534 +v -1.070347 -2.524090 0.286793 +v -0.993072 -2.356090 0.266088 +v -0.969890 -2.256090 0.259877 +v -0.977618 -2.192089 0.261947 +v -1.039437 -2.160089 0.278511 +v -1.062619 -2.128090 0.284723 +v -1.062619 -2.072090 0.284723 +v -1.039437 -2.040090 0.278511 +v -0.900649 -1.996708 0.241324 +v -0.637754 -1.819721 0.170883 +v -0.545161 -1.673745 0.146073 +v -0.493910 -1.530860 0.132340 +v -0.426657 -1.365037 0.114321 +v -0.410632 -1.183625 0.110027 +v -0.433814 -1.127625 0.116238 +v -0.522592 -1.127625 0.140026 +v -0.561229 -1.079625 0.150378 +v -0.561229 -0.903625 0.150378 +v -0.507137 -0.855625 0.135884 +v -0.397884 -0.855625 0.106611 +v -0.386152 4.967279 0.103467 +v -0.131252 6.671281 0.035168 +v -0.108070 6.751280 0.028957 +v -1.060110 -3.284090 0.612042 +v -1.060110 -2.760090 0.612042 +v -1.101679 -2.760090 0.636042 +v -1.129392 -2.728091 0.652042 +v -1.129392 -2.642078 0.652042 +v -1.087823 -2.602085 0.628042 +v -1.032397 -2.600090 0.596043 +v -0.959650 -2.524090 0.554043 +v -0.890368 -2.356090 0.514044 +v -0.869583 -2.256090 0.502044 +v -0.876511 -2.192089 0.506044 +v -0.931937 -2.160089 0.538043 +v -0.952722 -2.128090 0.550043 +v -0.952722 -2.072090 0.550043 +v -0.931937 -2.040090 0.538043 +v -0.807503 -1.996708 0.466203 +v -0.571797 -1.819721 0.330120 +v -0.488780 -1.673745 0.282191 +v -0.442829 -1.530860 0.255662 +v -0.382532 -1.365037 0.220851 +v -0.368164 -1.183625 0.212555 +v -0.388949 -1.127625 0.224555 +v -0.468545 -1.127625 0.270509 +v -0.503186 -1.079625 0.290509 +v -0.503186 -0.903625 0.290509 +v -0.454688 -0.855625 0.262509 +v -0.356734 -0.855625 0.205956 +v -0.308097 4.767281 0.177876 +v -0.347946 4.865267 0.200882 +v -0.346216 4.967279 0.199884 +v -0.304647 5.023280 0.175884 +v -0.256149 5.023280 0.147885 +v -0.256149 5.791280 0.147885 +v -0.207651 5.847281 0.119885 +v -0.162678 5.847281 0.093921 +v -0.162678 5.927280 0.093921 +v -0.211176 5.927280 0.121920 +v -0.211176 5.991281 0.121920 +v -0.148822 5.991281 0.085921 +v -0.155750 6.135281 0.089921 +v -0.197320 6.287280 0.113920 +v -0.245817 6.359281 0.141920 +v -0.287387 6.391280 0.165919 +v -0.266602 6.439281 0.153920 +v -0.207745 6.439281 0.119939 +v -0.207745 6.479280 0.119939 +v -0.152320 6.535279 0.087940 +v -0.124606 6.607280 0.071940 +v -0.117678 6.671281 0.067940 +v -0.124606 6.727280 0.071940 +v -0.096893 6.751280 0.055940 +v -0.152320 6.775281 0.087940 +v -0.180032 6.815281 0.103939 +v -0.221601 6.823281 0.127939 +v -0.221601 6.871280 0.127939 +v -0.865583 -3.284090 0.865560 +v -0.865583 -2.760090 0.865560 +v -0.899524 -2.760090 0.899501 +v -0.922152 -2.728091 0.922128 +v -0.922152 -2.642078 0.922128 +v -0.888211 -2.602085 0.888187 +v -0.842955 -2.600090 0.842933 +v -0.783557 -2.524090 0.783537 +v -0.726988 -2.356090 0.726969 +v -0.710017 -2.256090 0.709999 +v -0.715674 -2.192089 0.715655 +v -0.760930 -2.160089 0.760910 +v -0.777901 -2.128090 0.777880 +v -0.777901 -2.072090 0.777880 +v -0.760930 -2.040090 0.760910 +v -0.659329 -1.996708 0.659312 +v -0.466874 -1.819721 0.466862 +v -0.399090 -1.673745 0.399080 +v -0.361571 -1.530860 0.361562 +v -0.312339 -1.365037 0.312330 +v -0.300607 -1.183625 0.300599 +v -0.317578 -1.127625 0.317569 +v -0.382568 -1.127625 0.382558 +v -0.410853 -1.079625 0.410842 +v -0.410853 -0.903625 0.410842 +v -0.371254 -0.855625 0.371245 +v -0.291275 -0.855625 0.291267 +v -0.132827 5.927280 0.132824 +v -0.172426 5.927280 0.172421 +v -0.161112 6.287280 0.161108 +v -0.200711 6.359281 0.200705 +v -0.234652 6.391280 0.234646 +v -0.101741 6.727280 0.101739 +v -0.079114 6.751280 0.079111 +v -0.612070 -3.284090 1.060094 +v -0.612070 -2.760090 1.060094 +v -0.636071 -2.760090 1.101662 +v -0.652071 -2.728091 1.129375 +v -0.652071 -2.642078 1.129375 +v -0.628071 -2.602085 1.087806 +v -0.596070 -2.600090 1.032381 +v -0.554068 -2.524090 0.959636 +v -0.514067 -2.356090 0.890354 +v -0.502067 -2.256090 0.869570 +v -0.506067 -2.192089 0.876498 +v -0.538068 -2.160089 0.931923 +v -0.550068 -2.128090 0.952708 +v -0.550068 -2.072090 0.952708 +v -0.538068 -2.040090 0.931923 +v -0.466224 -1.996708 0.807491 +v -0.330135 -1.819721 0.571788 +v -0.282204 -1.673745 0.488772 +v -0.255674 -1.530860 0.442823 +v -0.220861 -1.365037 0.382526 +v -0.212565 -1.183625 0.368158 +v -0.224565 -1.127625 0.388943 +v -0.270521 -1.127625 0.468538 +v -0.290522 -1.079625 0.503178 +v -0.290522 -0.903625 0.503178 +v -0.262521 -0.855625 0.454681 +v -0.205966 -0.855625 0.356729 +v -0.177884 4.767281 0.308092 +v -0.200892 4.865267 0.347940 +v -0.199893 4.967279 0.346211 +v -0.175892 5.023280 0.304642 +v -0.147891 5.023280 0.256145 +v -0.147891 5.791280 0.256145 +v -0.119891 5.847281 0.207648 +v -0.093925 5.847281 0.162676 +v -0.093925 5.927280 0.162676 +v -0.121926 5.927280 0.211173 +v -0.121926 5.991281 0.211173 +v -0.085925 5.991281 0.148820 +v -0.089925 6.135281 0.155748 +v -0.113925 6.287280 0.197317 +v -0.141926 6.359281 0.245814 +v -0.165927 6.391280 0.287382 +v -0.153927 6.439281 0.266598 +v -0.119945 6.439281 0.207742 +v -0.119945 6.479280 0.207742 +v -0.087944 6.535279 0.152318 +v -0.071943 6.607280 0.124604 +v -0.067943 6.671281 0.117676 +v -0.071943 6.727280 0.124604 +v -0.055943 6.751280 0.096892 +v -0.087944 6.775281 0.152318 +v -0.103944 6.815281 0.180029 +v -0.127945 6.823281 0.221598 +v -0.127945 6.871280 0.221598 +v -0.316847 -3.284090 1.182386 +v -0.316847 -2.760090 1.182386 +v -0.329271 -2.760090 1.228750 +v -0.337554 -2.728091 1.259659 +v -0.337554 -2.642078 1.259659 +v -0.325130 -2.602085 1.213295 +v -0.308564 -2.600090 1.151476 +v -0.286822 -2.524090 1.070339 +v -0.266114 -2.356090 0.993065 +v -0.259902 -2.256090 0.969883 +v -0.261973 -2.192089 0.977611 +v -0.278539 -2.160089 1.039430 +v -0.284751 -2.128090 1.062612 +v -0.284751 -2.072090 1.062612 +v -0.278539 -2.040090 1.039430 +v -0.241348 -1.996708 0.900643 +v -0.170899 -1.819721 0.637750 +v -0.146087 -1.673745 0.545157 +v -0.132353 -1.530860 0.493906 +v -0.114332 -1.365037 0.426654 +v -0.110037 -1.183625 0.410629 +v -0.116250 -1.127625 0.433811 +v -0.140039 -1.127625 0.522588 +v -0.150393 -1.079625 0.561225 +v -0.150393 -0.903625 0.561225 +v -0.135898 -0.855625 0.507133 +v -0.106621 -0.855625 0.397881 +v -0.092084 4.767281 0.343634 +v -0.091053 5.023280 0.339786 +v -0.037242 6.727280 0.138978 +v -0.028960 6.751280 0.108069 +v -0.000032 -3.284090 1.224103 +v -0.000032 -2.760090 1.224103 +v -0.000033 -2.760090 1.272103 +v -0.000034 -2.728091 1.304103 +v -0.000034 -2.642078 1.304103 +v -0.000033 -2.602085 1.256103 +v -0.000031 -2.600090 1.192103 +v -0.000029 -2.524090 1.108103 +v -0.000027 -2.356090 1.028103 +v -0.000026 -2.256090 1.004103 +v -0.000027 -2.192089 1.012103 +v -0.000028 -2.160089 1.076103 +v -0.000029 -2.128090 1.100103 +v -0.000029 -2.072090 1.100103 +v -0.000028 -2.040090 1.076103 +v -0.000025 -1.996708 0.932420 +v -0.000017 -1.819721 0.660251 +v -0.000015 -1.673745 0.564391 +v -0.000013 -1.530860 0.511333 +v -0.000012 -1.365037 0.441708 +v -0.000011 -1.183625 0.425117 +v -0.000012 -1.127625 0.449117 +v -0.000014 -1.127625 0.541026 +v -0.000015 -1.079625 0.581026 +v -0.000015 -0.903625 0.581026 +v -0.000014 -0.855625 0.525026 +v -0.000011 -0.855625 0.411919 +v -0.000009 4.767281 0.355758 +v -0.000011 4.865267 0.401771 +v -0.000011 4.967279 0.399774 +v -0.000009 5.023280 0.351774 +v -0.000008 5.023280 0.295774 +v -0.000008 5.791280 0.295774 +v -0.000006 5.847281 0.239774 +v -0.000005 5.847281 0.187844 +v -0.000005 5.927280 0.187844 +v -0.000006 5.927280 0.243844 +v -0.000006 5.991281 0.243844 +v -0.000005 5.991281 0.171844 +v -0.000005 6.135281 0.179844 +v -0.000006 6.287280 0.227844 +v -0.000007 6.359281 0.283844 +v -0.000009 6.391280 0.331844 +v -0.000008 6.439281 0.307844 +v -0.000006 6.439281 0.239882 +v -0.000006 6.479280 0.239882 +v -0.000005 6.535279 0.175883 +v -0.000004 6.607280 0.143882 +v -0.000004 6.671281 0.135882 +v -0.000004 6.727280 0.143882 +v -0.000003 6.751280 0.111882 +v -0.000005 6.775281 0.175883 +v -0.000005 6.815281 0.207882 +v -0.000007 6.823281 0.255882 +v -0.000007 6.871280 0.255882 +v 0.316785 -3.284090 1.182402 +v 0.316785 -2.760090 1.182402 +v 0.329207 -2.760090 1.228767 +v 0.337488 -2.728091 1.259677 +v 0.337488 -2.642078 1.259677 +v 0.325066 -2.602085 1.213312 +v 0.308504 -2.600090 1.151493 +v 0.286765 -2.524090 1.070354 +v 0.266062 -2.356090 0.993079 +v 0.259851 -2.256090 0.969897 +v 0.261921 -2.192089 0.977624 +v 0.278484 -2.160089 1.039444 +v 0.284695 -2.128090 1.062627 +v 0.284695 -2.072090 1.062627 +v 0.278484 -2.040090 1.039444 +v 0.241300 -1.996708 0.900656 +v 0.170866 -1.819721 0.637759 +v 0.146058 -1.673745 0.545165 +v 0.132327 -1.530860 0.493913 +v 0.114309 -1.365037 0.426660 +v 0.110016 -1.183625 0.410635 +v 0.116227 -1.127625 0.433817 +v 0.140012 -1.127625 0.522595 +v 0.150363 -1.079625 0.561233 +v 0.150363 -0.903625 0.561233 +v 0.135871 -0.855625 0.507140 +v 0.106600 -0.855625 0.397886 +v 0.092066 4.767281 0.343639 +v 0.612014 -3.284090 1.060126 +v 0.612014 -2.760090 1.060126 +v 0.636013 -2.760090 1.101696 +v 0.652012 -2.728091 1.129409 +v 0.652012 -2.642078 1.129409 +v 0.628013 -2.602085 1.087839 +v 0.596015 -2.600090 1.032412 +v 0.554018 -2.524090 0.959665 +v 0.514020 -2.356090 0.890381 +v 0.502021 -2.256090 0.869596 +v 0.506021 -2.192089 0.876525 +v 0.538019 -2.160089 0.931951 +v 0.550018 -2.128090 0.952736 +v 0.550018 -2.072090 0.952736 +v 0.538019 -2.040090 0.931951 +v 0.466182 -1.996708 0.807515 +v 0.330105 -1.819721 0.571806 +v 0.282179 -1.673745 0.488787 +v 0.255651 -1.530860 0.442836 +v 0.220840 -1.365037 0.382538 +v 0.212546 -1.183625 0.368170 +v 0.224545 -1.127625 0.388955 +v 0.270497 -1.127625 0.468552 +v 0.290495 -1.079625 0.503193 +v 0.290495 -0.903625 0.503193 +v 0.262497 -0.855625 0.454695 +v 0.205947 -0.855625 0.356740 +v 0.177868 4.767281 0.308102 +v 0.200873 4.865267 0.347951 +v 0.199875 4.967279 0.346221 +v 0.175876 5.023280 0.304651 +v 0.147878 5.023280 0.256153 +v 0.147878 5.791280 0.256153 +v 0.119880 5.847281 0.207655 +v 0.093916 5.847281 0.162681 +v 0.093916 5.927280 0.162681 +v 0.121915 5.927280 0.211179 +v 0.121915 5.991281 0.211179 +v 0.085917 5.991281 0.148824 +v 0.089917 6.135281 0.155753 +v 0.113915 6.287280 0.197323 +v 0.141913 6.359281 0.245821 +v 0.165912 6.391280 0.287391 +v 0.153913 6.439281 0.266606 +v 0.119934 6.439281 0.207748 +v 0.119934 6.479280 0.207748 +v 0.087936 6.535279 0.152322 +v 0.071937 6.607280 0.124608 +v 0.067937 6.671281 0.117680 +v 0.071937 6.727280 0.124608 +v 0.055938 6.751280 0.096895 +v 0.087936 6.775281 0.152322 +v 0.103935 6.815281 0.180035 +v 0.127933 6.823281 0.221605 +v 0.127933 6.871280 0.221605 +v 0.865537 -3.284090 0.865606 +v 0.865537 -2.760090 0.865606 +v 0.899477 -2.760090 0.899548 +v 0.922104 -2.728091 0.922177 +v 0.922104 -2.642078 0.922177 +v 0.888164 -2.602085 0.888234 +v 0.842911 -2.600090 0.842978 +v 0.783516 -2.524090 0.783578 +v 0.726950 -2.356090 0.727007 +v 0.709980 -2.256090 0.710036 +v 0.715637 -2.192089 0.715693 +v 0.760890 -2.160089 0.760950 +v 0.777860 -2.128090 0.777921 +v 0.777860 -2.072090 0.777921 +v 0.760890 -2.040090 0.760950 +v 0.659294 -1.996708 0.659346 +v 0.466849 -1.819721 0.466886 +v 0.399069 -1.673745 0.399101 +v 0.361552 -1.530860 0.361581 +v 0.312322 -1.365037 0.312347 +v 0.300591 -1.183625 0.300615 +v 0.317561 -1.127625 0.317586 +v 0.382548 -1.127625 0.382578 +v 0.410831 -1.079625 0.410864 +v 0.410831 -0.903625 0.410864 +v 0.371235 -0.855625 0.371264 +v 0.291259 -0.855625 0.291282 +v 0.132821 5.927280 0.132831 +v 0.172417 5.927280 0.172431 +v 0.172417 5.991281 0.172431 +v 0.121507 5.991281 0.121517 +v 0.127164 6.135281 0.127174 +v 0.161104 6.287280 0.161116 +v 0.096079 6.671281 0.096087 +v 0.101736 6.727280 0.101744 +v 0.079109 6.751280 0.079116 +v 1.060077 -3.284090 0.612098 +v 1.060077 -2.760090 0.612098 +v 1.101646 -2.760090 0.636100 +v 1.129358 -2.728091 0.652101 +v 1.129358 -2.642078 0.652101 +v 1.087790 -2.602085 0.628099 +v 1.032365 -2.600090 0.596097 +v 0.959621 -2.524090 0.554094 +v 0.890341 -2.356090 0.514091 +v 0.869557 -2.256090 0.502090 +v 0.876485 -2.192089 0.506090 +v 0.931909 -2.160089 0.538092 +v 0.952693 -2.128090 0.550093 +v 0.952693 -2.072090 0.550093 +v 0.931909 -2.040090 0.538092 +v 0.807479 -1.996708 0.466245 +v 0.571779 -1.819721 0.330150 +v 0.488765 -1.673745 0.282217 +v 0.442816 -1.530860 0.255686 +v 0.382520 -1.365037 0.220871 +v 0.368153 -1.183625 0.212575 +v 0.388937 -1.127625 0.224576 +v 0.468530 -1.127625 0.270534 +v 0.503170 -1.079625 0.290535 +v 0.503170 -0.903625 0.290535 +v 0.454674 -0.855625 0.262533 +v 0.356723 -0.855625 0.205975 +v 0.308088 4.767281 0.177893 +v 0.347935 4.865267 0.200901 +v 0.346206 4.967279 0.199902 +v 0.304637 5.023280 0.175900 +v 0.256141 5.023280 0.147898 +v 0.256141 5.791280 0.147898 +v 0.207645 5.847281 0.119896 +v 0.162674 5.847281 0.093929 +v 0.162674 5.927280 0.093929 +v 0.211170 5.927280 0.121931 +v 0.211170 5.991281 0.121931 +v 0.148817 5.991281 0.085929 +v 0.155746 6.135281 0.089929 +v 0.197314 6.287280 0.113931 +v 0.245810 6.359281 0.141933 +v 0.287378 6.391280 0.165935 +v 0.266594 6.439281 0.153934 +v 0.207739 6.439281 0.119950 +v 0.207739 6.479280 0.119950 +v 0.152315 6.535279 0.087948 +v 0.124602 6.607280 0.071946 +v 0.117674 6.671281 0.067946 +v 0.124602 6.727280 0.071946 +v 0.096890 6.751280 0.055945 +v 0.152315 6.775281 0.087948 +v 0.180027 6.815281 0.103949 +v 0.221595 6.823281 0.127951 +v 0.221595 6.871280 0.127951 +v 1.182377 -3.284090 0.316878 +v 1.182377 -2.760090 0.316878 +v 1.228741 -2.760090 0.329304 +v 1.259650 -2.728091 0.337587 +v 1.259650 -2.642078 0.337587 +v 1.213287 -2.602085 0.325162 +v 1.151468 -2.600090 0.308595 +v 1.070332 -2.524090 0.286850 +v 0.993058 -2.356090 0.266141 +v 0.969876 -2.256090 0.259928 +v 0.977604 -2.192089 0.261999 +v 1.039422 -2.160089 0.278566 +v 1.062604 -2.128090 0.284779 +v 1.062604 -2.072090 0.284779 +v 1.039422 -2.040090 0.278566 +v 0.900637 -1.996708 0.241371 +v 0.637745 -1.819721 0.170916 +v 0.545153 -1.673745 0.146102 +v 0.493903 -1.530860 0.132366 +v 0.426651 -1.365037 0.114343 +v 0.410626 -1.183625 0.110048 +v 0.433808 -1.127625 0.116261 +v 0.522584 -1.127625 0.140053 +v 0.561221 -1.079625 0.150408 +v 0.561221 -0.903625 0.150408 +v 0.507130 -0.855625 0.135911 +v 0.397878 -0.855625 0.106632 +v 0.131250 6.671281 0.035175 +v 0.108068 6.751280 0.028962 +v 1.224103 -3.284090 0.000064 +v 1.224103 -2.760090 0.000064 +v 1.272103 -2.760090 0.000067 +v 1.304103 -2.728091 0.000069 +v 1.304103 -2.642078 0.000069 +v 1.256103 -2.602085 0.000066 +v 1.192103 -2.600090 0.000063 +v 1.108103 -2.524090 0.000058 +v 1.028103 -2.356090 0.000054 +v 1.004103 -2.256090 0.000053 +v 1.012103 -2.192089 0.000053 +v 1.076103 -2.160089 0.000057 +v 1.100103 -2.128090 0.000058 +v 1.100103 -2.072090 0.000058 +v 1.076103 -2.040090 0.000057 +v 0.932420 -1.996708 0.000049 +v 0.660251 -1.819721 0.000035 +v 0.564391 -1.673745 0.000030 +v 0.511333 -1.530860 0.000027 +v 0.441708 -1.365037 0.000023 +v 0.425117 -1.183625 0.000022 +v 0.449117 -1.127625 0.000024 +v 0.541026 -1.127625 0.000028 +v 0.581026 -1.079625 0.000031 +v 0.581026 -0.903625 0.000031 +v 0.525026 -0.855625 0.000028 +v 0.411919 -0.855625 0.000022 +v 0.355758 4.767281 0.000019 +v 0.401771 4.865267 0.000021 +v 0.399774 4.967279 0.000021 +v 0.351774 5.023280 0.000019 +v 0.295774 5.023280 0.000016 +v 0.295774 5.791280 0.000016 +v 0.239774 5.847281 0.000013 +v 0.187844 5.847281 0.000010 +v 0.187844 5.927280 0.000010 +v 0.243844 5.927280 0.000013 +v 0.243844 5.991281 0.000013 +v 0.171844 5.991281 0.000009 +v 0.179844 6.135281 0.000009 +v 0.227844 6.287280 0.000012 +v 0.283844 6.359281 0.000015 +v 0.331844 6.391280 0.000017 +v 0.307844 6.439281 0.000016 +v 0.239882 6.439281 0.000013 +v 0.239882 6.479280 0.000013 +v 0.175883 6.535279 0.000009 +v 0.143882 6.607280 0.000008 +v 0.135882 6.671281 0.000007 +v 0.143882 6.727280 0.000008 +v 0.111882 6.751280 0.000006 +v 0.175883 6.775281 0.000009 +v 0.207882 6.815281 0.000011 +v 0.255882 6.823281 0.000013 +v 0.255882 6.871280 0.000013 +v 1.182411 -3.284090 -0.316754 +v 1.182411 -2.760090 -0.316754 +v 1.228776 -2.760090 -0.329174 +v 1.259686 -2.728091 -0.337455 +v 1.259686 -2.642078 -0.337455 +v 1.213321 -2.602085 -0.325034 +v 1.151501 -2.600090 -0.308473 +v 1.070362 -2.524090 -0.286737 +v 0.993086 -2.356090 -0.266036 +v 0.969904 -2.256090 -0.259826 +v 0.977631 -2.192089 -0.261896 +v 1.039451 -2.160089 -0.278457 +v 1.062634 -2.128090 -0.284667 +v 1.062634 -2.072090 -0.284667 +v 1.039451 -2.040090 -0.278457 +v 0.900662 -1.996708 -0.241277 +v 0.637763 -1.819721 -0.170849 +v 0.545169 -1.673745 -0.146044 +v 0.493917 -1.530860 -0.132314 +v 0.426663 -1.365037 -0.114298 +v 0.410638 -1.183625 -0.110005 +v 0.433820 -1.127625 -0.116215 +v 0.522599 -1.127625 -0.139998 +v 0.561237 -1.079625 -0.150349 +v 0.561237 -0.903625 -0.150349 +v 0.507144 -0.855625 -0.135858 +v 0.397889 -0.855625 -0.106590 +v 0.138981 6.727280 -0.037231 +v 1.060142 -3.284090 -0.611986 +v 1.060142 -2.760090 -0.611986 +v 1.101713 -2.760090 -0.635984 +v 1.129426 -2.728091 -0.651982 +v 1.129426 -2.642078 -0.651982 +v 1.087856 -2.602085 -0.627985 +v 1.032428 -2.600090 -0.595988 +v 0.959679 -2.524090 -0.553992 +v 0.890395 -2.356090 -0.513997 +v 0.869610 -2.256090 -0.501998 +v 0.876538 -2.192089 -0.505998 +v 0.931966 -2.160089 -0.537994 +v 0.952751 -2.128090 -0.549993 +v 0.952751 -2.072090 -0.549993 +v 0.931966 -2.040090 -0.537994 +v 0.807528 -1.996708 -0.466160 +v 0.571814 -1.819721 -0.330090 +v 0.488795 -1.673745 -0.282166 +v 0.442843 -1.530860 -0.255639 +v 0.382544 -1.365037 -0.220830 +v 0.368175 -1.183625 -0.212536 +v 0.388961 -1.127625 -0.224535 +v 0.468559 -1.127625 -0.270484 +v 0.503201 -1.079625 -0.290482 +v 0.503201 -0.903625 -0.290482 +v 0.454702 -0.855625 -0.262485 +v 0.356745 -0.855625 -0.205938 +v 0.308106 4.767281 -0.177860 +v 0.347956 4.865267 -0.200864 +v 0.346227 4.967279 -0.199866 +v 0.304656 5.023280 -0.175868 +v 0.256157 5.023280 -0.147871 +v 0.256157 5.791280 -0.147871 +v 0.207658 5.847281 -0.119874 +v 0.162683 5.847281 -0.093912 +v 0.162683 5.927280 -0.093912 +v 0.211183 5.927280 -0.121909 +v 0.211183 5.991281 -0.121909 +v 0.148827 5.991281 -0.085913 +v 0.155755 6.135281 -0.089912 +v 0.197326 6.287280 -0.113910 +v 0.245825 6.359281 -0.141907 +v 0.287396 6.391280 -0.165904 +v 0.266610 6.439281 -0.153906 +v 0.207751 6.439281 -0.119928 +v 0.207751 6.479280 -0.119928 +v 0.152325 6.535279 -0.087932 +v 0.124610 6.607280 -0.071933 +v 0.117681 6.671281 -0.067934 +v 0.124610 6.727280 -0.071933 +v 0.096896 6.751280 -0.055935 +v 0.152325 6.775281 -0.087932 +v 0.180037 6.815281 -0.103930 +v 0.221608 6.823281 -0.127927 +v 0.221608 6.871280 -0.127927 +v 0.865629 -3.284090 -0.865515 +v 0.865629 -2.760090 -0.865515 +v 0.899572 -2.760090 -0.899453 +v 0.922201 -2.728091 -0.922079 +v 0.922201 -2.642078 -0.922079 +v 0.888258 -2.602085 -0.888140 +v 0.843000 -2.600090 -0.842889 +v 0.783599 -2.524090 -0.783496 +v 0.727027 -2.356090 -0.726931 +v 0.710055 -2.256090 -0.709961 +v 0.715712 -2.192089 -0.715618 +v 0.760970 -2.160089 -0.760870 +v 0.777942 -2.128090 -0.777839 +v 0.777942 -2.072090 -0.777839 +v 0.760970 -2.040090 -0.760870 +v 0.659364 -1.996708 -0.659277 +v 0.466899 -1.819721 -0.466837 +v 0.399111 -1.673745 -0.399059 +v 0.361591 -1.530860 -0.361543 +v 0.312355 -1.365037 -0.312314 +v 0.300623 -1.183625 -0.300583 +v 0.317595 -1.127625 -0.317553 +v 0.382588 -1.127625 -0.382538 +v 0.410874 -1.079625 -0.410820 +v 0.410874 -0.903625 -0.410820 +v 0.371274 -0.855625 -0.371225 +v 0.291290 -0.855625 -0.291252 +v 0.132835 5.927280 -0.132817 +v 0.101747 6.607280 -0.101733 +v 0.180948 6.823281 -0.180924 +v 0.612126 -3.284090 -1.060061 +v 0.612126 -2.760090 -1.060061 +v 0.636129 -2.760090 -1.101629 +v 0.652131 -2.728091 -1.129341 +v 0.652131 -2.642078 -1.129341 +v 0.628128 -2.602085 -1.087773 +v 0.596124 -2.600090 -1.032350 +v 0.554119 -2.524090 -0.959607 +v 0.514114 -2.356090 -0.890327 +v 0.502112 -2.256090 -0.869543 +v 0.506113 -2.192089 -0.876471 +v 0.538117 -2.160089 -0.931895 +v 0.550118 -2.128090 -0.952679 +v 0.550118 -2.072090 -0.952679 +v 0.538117 -2.040090 -0.931895 +v 0.466266 -1.996708 -0.807466 +v 0.330165 -1.819721 -0.571771 +v 0.282230 -1.673745 -0.488758 +v 0.255697 -1.530860 -0.442809 +v 0.220881 -1.365037 -0.382515 +v 0.212584 -1.183625 -0.368147 +v 0.224586 -1.127625 -0.388931 +v 0.270546 -1.127625 -0.468523 +v 0.290548 -1.079625 -0.503163 +v 0.290548 -0.903625 -0.503163 +v 0.262545 -0.855625 -0.454667 +v 0.205984 -0.855625 -0.356718 +v 0.177901 4.767281 -0.308083 +v 0.200910 4.865267 -0.347930 +v 0.199911 4.967279 -0.346200 +v 0.175908 5.023280 -0.304633 +v 0.147905 5.023280 -0.256137 +v 0.147905 5.791280 -0.256137 +v 0.119902 5.847281 -0.207642 +v 0.093933 5.847281 -0.162671 +v 0.093933 5.927280 -0.162671 +v 0.121937 5.927280 -0.211167 +v 0.121937 5.991281 -0.211167 +v 0.085932 5.991281 -0.148815 +v 0.089933 6.135281 -0.155743 +v 0.113936 6.287280 -0.197311 +v 0.141939 6.359281 -0.245806 +v 0.165942 6.391280 -0.287374 +v 0.153941 6.439281 -0.266590 +v 0.119956 6.439281 -0.207736 +v 0.119956 6.479280 -0.207736 +v 0.087952 6.535279 -0.152313 +v 0.071950 6.607280 -0.124600 +v 0.067949 6.671281 -0.117672 +v 0.071950 6.727280 -0.124600 +v 0.055948 6.751280 -0.096889 +v 0.087952 6.775281 -0.152313 +v 0.103954 6.815281 -0.180024 +v 0.127956 6.823281 -0.221591 +v 0.127956 6.871280 -0.221591 +v 0.316910 -3.284090 -1.182369 +v 0.316910 -2.760090 -1.182369 +v 0.329336 -2.760090 -1.228732 +v 0.337621 -2.728091 -1.259642 +v 0.337621 -2.642078 -1.259642 +v 0.325194 -2.602085 -1.213278 +v 0.308625 -2.600090 -1.151460 +v 0.286878 -2.524090 -1.070324 +v 0.266167 -2.356090 -0.993051 +v 0.259953 -2.256090 -0.969869 +v 0.262025 -2.192089 -0.977597 +v 0.278594 -2.160089 -1.039415 +v 0.284807 -2.128090 -1.062597 +v 0.284807 -2.072090 -1.062597 +v 0.278594 -2.040090 -1.039415 +v 0.241395 -1.996708 -0.900630 +v 0.170933 -1.819721 -0.637740 +v 0.146116 -1.673745 -0.545149 +v 0.132380 -1.530860 -0.493899 +v 0.114354 -1.365037 -0.426648 +v 0.110059 -1.183625 -0.410623 +v 0.116272 -1.127625 -0.433805 +v 0.140067 -1.127625 -0.522581 +v 0.150423 -1.079625 -0.561217 +v 0.150423 -0.903625 -0.561217 +v 0.135925 -0.855625 -0.507126 +v 0.106642 -0.855625 -0.397875 +v 0.000097 -3.284090 -1.224103 +v 0.000097 -2.760090 -1.224103 +v 0.000101 -2.760090 -1.272103 +v 0.000103 -2.728091 -1.304103 +v 0.000103 -2.642078 -1.304103 +v 0.000099 -2.602085 -1.256103 +v 0.000094 -2.600090 -1.192103 +v 0.000088 -2.524090 -1.108103 +v 0.000081 -2.356090 -1.028103 +v 0.000079 -2.256090 -1.004103 +v 0.000080 -2.192089 -1.012103 +v 0.000085 -2.160089 -1.076103 +v 0.000087 -2.128090 -1.100103 +v 0.000087 -2.072090 -1.100103 +v 0.000085 -2.040090 -1.076103 +v 0.000074 -1.996708 -0.932420 +v 0.000052 -1.819721 -0.660251 +v 0.000045 -1.673745 -0.564391 +v 0.000040 -1.530860 -0.511333 +v 0.000035 -1.365037 -0.441708 +v 0.000034 -1.183625 -0.425117 +v 0.000036 -1.127625 -0.449117 +v 0.000043 -1.127625 -0.541026 +v 0.000046 -1.079625 -0.581026 +v 0.000046 -0.903625 -0.581026 +v 0.000042 -0.855625 -0.525026 +v 0.000033 -0.855625 -0.411919 +v 0.000028 4.767281 -0.355758 +v 0.000032 4.865267 -0.401771 +v 0.000032 4.967279 -0.399774 +v 0.000028 5.023280 -0.351774 +v 0.000023 5.023280 -0.295774 +v 0.000023 5.791280 -0.295774 +v 0.000019 5.847281 -0.239774 +v 0.000015 5.847281 -0.187844 +v 0.000015 5.927280 -0.187844 +v 0.000019 5.927280 -0.243844 +v 0.000019 5.991281 -0.243844 +v 0.000014 5.991281 -0.171844 +v 0.000014 6.135281 -0.179844 +v 0.000018 6.287280 -0.227844 +v 0.000022 6.359281 -0.283844 +v 0.000026 6.391280 -0.331844 +v 0.000024 6.439281 -0.307844 +v 0.000019 6.439281 -0.239882 +v 0.000019 6.479280 -0.239882 +v 0.000014 6.535279 -0.175883 +v 0.000011 6.607280 -0.143882 +v 0.000011 6.671281 -0.135882 +v 0.000011 6.727280 -0.143882 +v 0.000009 6.751280 -0.111882 +v 0.000014 6.775281 -0.175883 +v 0.000016 6.815281 -0.207882 +v 0.000020 6.823281 -0.255882 +v 0.000020 6.871280 -0.255882 +v -0.316722 -3.284090 -1.182419 +v -0.316722 -2.760090 -1.182419 +v -0.329142 -2.760090 -1.228785 +v -0.337422 -2.728091 -1.259695 +v -0.337422 -2.642078 -1.259695 +v -0.325002 -2.602085 -1.213330 +v -0.308443 -2.600090 -1.151509 +v -0.286709 -2.524090 -1.070369 +v -0.266010 -2.356090 -0.993093 +v -0.259800 -2.256090 -0.969911 +v -0.261870 -2.192089 -0.977638 +v -0.278429 -2.160089 -1.039459 +v -0.284639 -2.128090 -1.062642 +v -0.284639 -2.072090 -1.062642 +v -0.278429 -2.040090 -1.039459 +v -0.241253 -1.996708 -0.900668 +v -0.170832 -1.819721 -0.637768 +v -0.146030 -1.673745 -0.545173 +v -0.132301 -1.530860 -0.493920 +v -0.114287 -1.365037 -0.426666 +v -0.109994 -1.183625 -0.410641 +v -0.116204 -1.127625 -0.433823 +v -0.139984 -1.127625 -0.522603 +v -0.150334 -1.079625 -0.561241 +v -0.150334 -0.903625 -0.561241 +v -0.135844 -0.855625 -0.507147 +v -0.106579 -0.855625 -0.397892 +v -0.037228 6.727280 -0.138982 +v -0.028948 6.751280 -0.108072 +v -0.611958 -3.284090 -1.060158 +v -0.611958 -2.760090 -1.060158 +v -0.635955 -2.760090 -1.101729 +v -0.651952 -2.728091 -1.129444 +v -0.651952 -2.642078 -1.129444 +v -0.627956 -2.602085 -1.087872 +v -0.595961 -2.600090 -1.032444 +v -0.553967 -2.524090 -0.959694 +v -0.513973 -2.356090 -0.890408 +v -0.501975 -2.256090 -0.869623 +v -0.505975 -2.192089 -0.876551 +v -0.537970 -2.160089 -0.931980 +v -0.549968 -2.128090 -0.952765 +v -0.549968 -2.072090 -0.952765 +v -0.537970 -2.040090 -0.931980 +v -0.466139 -1.996708 -0.807540 +v -0.330075 -1.819721 -0.571823 +v -0.282153 -1.673745 -0.488802 +v -0.255627 -1.530860 -0.442849 +v -0.220820 -1.365037 -0.382550 +v -0.212526 -1.183625 -0.368181 +v -0.224524 -1.127625 -0.388966 +v -0.270472 -1.127625 -0.468566 +v -0.290469 -1.079625 -0.503209 +v -0.290469 -0.903625 -0.503209 +v -0.262473 -0.855625 -0.454709 +v -0.205928 -0.855625 -0.356750 +v -0.177852 4.767281 -0.308111 +v -0.200855 4.865267 -0.347962 +v -0.199857 4.967279 -0.346232 +v -0.175860 5.023280 -0.304661 +v -0.147864 5.023280 -0.256161 +v -0.147864 5.791280 -0.256161 +v -0.119869 5.847281 -0.207661 +v -0.093908 5.847281 -0.162686 +v -0.093908 5.927280 -0.162686 +v -0.121903 5.927280 -0.211186 +v -0.121903 5.991281 -0.211186 +v -0.085909 5.991281 -0.148829 +v -0.089908 6.135281 -0.155757 +v -0.113905 6.287280 -0.197329 +v -0.141900 6.359281 -0.245829 +v -0.165897 6.391280 -0.287400 +v -0.153899 6.439281 -0.266614 +v -0.119923 6.439281 -0.207754 +v -0.119923 6.479280 -0.207754 +v -0.087928 6.535279 -0.152327 +v -0.071930 6.607280 -0.124612 +v -0.067931 6.671281 -0.117683 +v -0.071930 6.727280 -0.124612 +v -0.055932 6.751280 -0.096898 +v -0.087928 6.775281 -0.152327 +v -0.103925 6.815281 -0.180040 +v -0.127922 6.823281 -0.221612 +v -0.127922 6.871280 -0.221612 +v -0.865492 -3.284090 -0.865651 +v -0.865492 -2.760090 -0.865651 +v -0.899430 -2.760090 -0.899596 +v -0.922055 -2.728091 -0.922225 +v -0.922055 -2.642078 -0.922225 +v -0.888117 -2.602085 -0.888281 +v -0.842866 -2.600090 -0.843022 +v -0.783475 -2.524090 -0.783619 +v -0.726912 -2.356090 -0.727046 +v -0.709943 -2.256090 -0.710073 +v -0.715599 -2.192089 -0.715731 +v -0.760850 -2.160089 -0.760990 +v -0.777819 -2.128090 -0.777962 +v -0.777819 -2.072090 -0.777962 +v -0.760850 -2.040090 -0.760990 +v -0.659259 -1.996708 -0.659381 +v -0.466825 -1.819721 -0.466911 +v -0.399048 -1.673745 -0.399122 +v -0.361533 -1.530860 -0.361600 +v -0.312306 -1.365037 -0.312363 +v -0.300575 -1.183625 -0.300631 +v -0.317544 -1.127625 -0.317603 +v -0.382528 -1.127625 -0.382598 +v -0.410810 -1.079625 -0.410885 +v -0.410810 -0.903625 -0.410885 +v -0.371215 -0.855625 -0.371284 +v -0.291244 -0.855625 -0.291298 +v -0.251536 4.767281 -0.251582 +v -0.284069 4.865267 -0.284121 +v -0.132814 5.847281 -0.132838 +v -0.132814 5.927280 -0.132838 +v -0.172408 5.927280 -0.172440 +v -0.121501 5.991281 -0.121523 +v -0.127157 6.135281 -0.127181 +v -0.161095 6.287280 -0.161125 +v -0.200690 6.359281 -0.200727 +v -0.169607 6.439281 -0.169638 +v -0.124357 6.535279 -0.124380 +v -0.101731 6.607280 -0.101749 +v -0.096074 6.671281 -0.096092 +v -0.101731 6.727280 -0.101749 +v -0.079105 6.751280 -0.079120 +v -0.124357 6.775281 -0.124380 +v -0.146981 6.815281 -0.147008 +v -0.180919 6.871280 -0.180953 +v -1.060045 -3.284090 -0.612154 +v -1.060045 -2.760090 -0.612154 +v -1.101612 -2.760090 -0.636158 +v -1.129323 -2.728091 -0.652160 +v -1.129323 -2.642078 -0.652160 +v -1.087757 -2.602085 -0.628156 +v -1.032334 -2.600090 -0.596151 +v -0.959592 -2.524090 -0.554144 +v -0.890314 -2.356090 -0.514137 +v -0.869530 -2.256090 -0.502135 +v -0.876458 -2.192089 -0.506136 +v -0.931881 -2.160089 -0.538141 +v -0.952664 -2.128090 -0.550143 +v -0.952664 -2.072090 -0.550143 +v -0.931881 -2.040090 -0.538141 +v -0.807454 -1.996708 -0.466288 +v -0.571762 -1.819721 -0.330181 +v -0.488750 -1.673745 -0.282243 +v -0.442802 -1.530860 -0.255709 +v -0.382509 -1.365037 -0.220891 +v -0.368142 -1.183625 -0.212594 +v -0.388925 -1.127625 -0.224596 +v -0.468516 -1.127625 -0.270558 +v -0.503155 -1.079625 -0.290562 +v -0.503155 -0.903625 -0.290562 +v -0.454661 -0.855625 -0.262557 +v -0.356712 -0.855625 -0.205994 +v -0.308078 4.767281 -0.177909 +v -0.347925 4.865267 -0.200919 +v -0.346195 4.967279 -0.199920 +v -0.304628 5.023280 -0.175916 +v -0.256134 5.023280 -0.147912 +v -0.256134 5.791280 -0.147912 +v -0.207639 5.847281 -0.119907 +v -0.162669 5.847281 -0.093938 +v -0.162669 5.927280 -0.093938 +v -0.211163 5.927280 -0.121942 +v -0.211163 5.991281 -0.121942 +v -0.148813 5.991281 -0.085936 +v -0.155741 6.135281 -0.089937 +v -0.197308 6.287280 -0.113941 +v -0.245802 6.359281 -0.141946 +v -0.287369 6.391280 -0.165950 +v -0.266586 6.439281 -0.153948 +v -0.207732 6.439281 -0.119961 +v -0.207732 6.479280 -0.119961 +v -0.152311 6.535279 -0.087956 +v -0.124599 6.607280 -0.071953 +v -0.117671 6.671281 -0.067952 +v -0.124599 6.727280 -0.071953 +v -0.096887 6.751280 -0.055950 +v -0.152311 6.775281 -0.087956 +v -0.180021 6.815281 -0.103958 +v -0.221588 6.823281 -0.127962 +v -0.221588 6.871280 -0.127962 +v -1.182361 -3.284090 -0.316940 +v -1.182361 -2.760090 -0.316940 +v -1.228724 -2.760090 -0.329368 +v -1.259633 -2.728091 -0.337654 +v -1.259633 -2.642078 -0.337654 +v -1.213270 -2.602085 -0.325226 +v -1.151452 -2.600090 -0.308655 +v -1.070316 -2.524090 -0.286906 +v -0.993044 -2.356090 -0.266193 +v -0.969863 -2.256090 -0.259979 +v -0.977590 -2.192089 -0.262050 +v -1.039407 -2.160089 -0.278621 +v -1.062589 -2.128090 -0.284835 +v -1.062589 -2.072090 -0.284835 +v -1.039407 -2.040090 -0.278621 +v -0.900624 -1.996708 -0.241419 +v -0.637736 -1.819721 -0.170950 +v -0.545146 -1.673745 -0.146130 +v -0.493896 -1.530860 -0.132392 +v -0.426645 -1.365037 -0.114365 +v -0.410620 -1.183625 -0.110070 +v -0.433802 -1.127625 -0.116284 +v -0.522577 -1.127625 -0.140081 +v -0.561213 -1.079625 -0.150437 +v -0.561213 -0.903625 -0.150437 +v -0.507122 -0.855625 -0.135938 +v -0.397872 -0.855625 -0.106653 +v -0.343627 4.767281 -0.092112 +v -0.138976 6.727280 -0.037253 +v -0.215708 4.671280 0.000000 +v -0.271708 4.671280 0.000000 +v -0.303708 4.639273 0.000000 +v -0.303708 4.591273 0.000000 +v -0.275705 4.561275 0.000000 +v -0.331920 0.793487 0.000000 +v -0.403919 0.779474 0.000000 +v -0.419919 0.707474 0.000000 +v -0.403919 0.641487 0.000000 +v -0.363919 0.601487 0.000000 +v -0.403919 -0.543625 0.000000 +v -0.451919 -0.543625 0.000000 +v -0.483920 -0.583625 0.000000 +v -0.483920 -0.665634 0.000000 +v -0.453928 -0.695625 0.000000 +v -0.411927 -0.695618 0.000000 +v -0.397891 -0.695618 0.106613 +v -0.438461 -0.695625 0.117483 +v -0.467431 -0.665634 0.125246 +v -0.467431 -0.583625 0.125246 +v -0.436521 -0.543625 0.116963 +v -0.390156 -0.543625 0.104540 +v -0.351519 0.601487 0.094188 +v -0.390156 0.641487 0.104540 +v -0.405611 0.707474 0.108681 +v -0.390156 0.779474 0.104540 +v -0.320610 0.793487 0.085906 +v -0.231540 4.559279 0.062040 +v -0.356741 -0.695618 0.205960 +v -0.393115 -0.695625 0.226961 +v -0.419089 -0.665634 0.241956 +v -0.419089 -0.583625 0.241956 +v -0.391375 -0.543625 0.225956 +v -0.349806 -0.543625 0.201956 +v -0.315165 0.601487 0.181957 +v -0.349806 0.641487 0.201956 +v -0.363662 0.707474 0.209956 +v -0.349806 0.779474 0.201956 +v -0.287453 0.793487 0.165957 +v -0.207594 4.559279 0.119852 +v -0.238769 4.561275 0.137850 +v -0.263020 4.591273 0.151852 +v -0.263020 4.639273 0.151852 +v -0.235307 4.671280 0.135852 +v -0.186810 4.671280 0.107852 +v -0.291280 -0.695618 0.291273 +v -0.320980 -0.695625 0.320971 +v -0.342188 -0.665634 0.342179 +v -0.342188 -0.583625 0.342179 +v -0.319559 -0.543625 0.319551 +v -0.285618 -0.543625 0.285610 +v -0.257333 0.601487 0.257326 +v -0.285618 0.641487 0.285610 +v -0.296931 0.707474 0.296924 +v -0.285618 0.779474 0.285610 +v -0.234706 0.793487 0.234700 +v -0.169501 4.559279 0.169497 +v -0.205970 -0.695618 0.356736 +v -0.226971 -0.695625 0.393109 +v -0.241967 -0.665634 0.419083 +v -0.241967 -0.583625 0.419083 +v -0.225966 -0.543625 0.391369 +v -0.201966 -0.543625 0.349801 +v -0.181965 0.601487 0.315160 +v -0.201966 0.641487 0.349801 +v -0.209966 0.707474 0.363657 +v -0.201966 0.779474 0.349801 +v -0.165965 0.793487 0.287448 +v -0.119858 4.559279 0.207591 +v -0.137857 4.561275 0.238765 +v -0.151859 4.591273 0.263016 +v -0.151859 4.639273 0.263016 +v -0.135858 4.671280 0.235304 +v -0.107857 4.671280 0.186807 +v -0.106623 -0.695618 0.397889 +v -0.117495 -0.695625 0.438458 +v -0.125258 -0.665634 0.467428 +v -0.125258 -0.583625 0.467428 +v -0.116975 -0.543625 0.436518 +v -0.104550 -0.543625 0.390153 +v -0.094197 0.601487 0.351517 +v -0.104550 0.641487 0.390153 +v -0.108692 0.707474 0.405608 +v -0.104550 0.779474 0.390153 +v -0.085914 0.793487 0.320608 +v -0.062046 4.559279 0.231539 +v -0.078612 4.639273 0.293358 +v -0.070329 4.671280 0.262448 +v -0.055834 4.671280 0.208357 +v -0.000011 -0.695618 0.411927 +v -0.000012 -0.695625 0.453928 +v -0.000013 -0.665634 0.483920 +v -0.000013 -0.583625 0.483920 +v -0.000012 -0.543625 0.451919 +v -0.000011 -0.543625 0.403919 +v -0.000010 0.601487 0.363919 +v -0.000011 0.641487 0.403919 +v -0.000011 0.707474 0.419919 +v -0.000011 0.779474 0.403919 +v -0.000009 0.793487 0.331920 +v -0.000006 4.559279 0.239708 +v -0.000007 4.561275 0.275705 +v -0.000008 4.591273 0.303708 +v -0.000008 4.639273 0.303708 +v -0.000007 4.671280 0.271708 +v -0.000006 4.671280 0.215708 +v 0.106602 -0.695618 0.397894 +v 0.117472 -0.695625 0.438464 +v 0.125233 -0.665634 0.467435 +v 0.125233 -0.583625 0.467435 +v 0.116952 -0.543625 0.436524 +v 0.104530 -0.543625 0.390159 +v 0.094178 0.601487 0.351522 +v 0.104530 0.641487 0.390159 +v 0.108671 0.707474 0.405614 +v 0.104530 0.779474 0.390159 +v 0.085897 0.793487 0.320613 +v 0.062034 4.559279 0.231542 +v 0.078596 4.591273 0.293362 +v 0.078596 4.639273 0.293362 +v 0.055823 4.671280 0.208360 +v 0.205951 -0.695618 0.356746 +v 0.226950 -0.695625 0.393121 +v 0.241945 -0.665634 0.419095 +v 0.241945 -0.583625 0.419095 +v 0.225946 -0.543625 0.391381 +v 0.201947 -0.543625 0.349811 +v 0.181948 0.601487 0.315169 +v 0.201947 0.641487 0.349811 +v 0.209947 0.707474 0.363668 +v 0.201947 0.779474 0.349811 +v 0.165950 0.793487 0.287457 +v 0.119847 4.559279 0.207597 +v 0.137844 4.561275 0.238772 +v 0.151845 4.591273 0.263024 +v 0.151845 4.639273 0.263024 +v 0.135846 4.671280 0.235311 +v 0.107847 4.671280 0.186812 +v 0.291265 -0.695618 0.291288 +v 0.320963 -0.695625 0.320988 +v 0.342170 -0.665634 0.342197 +v 0.342170 -0.583625 0.342197 +v 0.319542 -0.543625 0.319568 +v 0.285603 -0.543625 0.285625 +v 0.257319 0.601487 0.257340 +v 0.285603 0.641487 0.285625 +v 0.296916 0.707474 0.296939 +v 0.285603 0.779474 0.285625 +v 0.234694 0.793487 0.234712 +v 0.169492 4.559279 0.169506 +v 0.214745 4.591273 0.214762 +v 0.356730 -0.695618 0.205979 +v 0.393103 -0.695625 0.226981 +v 0.419076 -0.665634 0.241978 +v 0.419076 -0.583625 0.241978 +v 0.391363 -0.543625 0.225977 +v 0.349795 -0.543625 0.201975 +v 0.315155 0.601487 0.181973 +v 0.349795 0.641487 0.201975 +v 0.363651 0.707474 0.209975 +v 0.349795 0.779474 0.201975 +v 0.287444 0.793487 0.165973 +v 0.207588 4.559279 0.119863 +v 0.238761 4.561275 0.137863 +v 0.263012 4.591273 0.151866 +v 0.263012 4.639273 0.151866 +v 0.235300 4.671280 0.135864 +v 0.186804 4.671280 0.107862 +v 0.397886 -0.695618 0.106634 +v 0.438455 -0.695625 0.117506 +v 0.467425 -0.665634 0.125270 +v 0.467425 -0.583625 0.125270 +v 0.436515 -0.543625 0.116986 +v 0.390151 -0.543625 0.104561 +v 0.351514 0.601487 0.094206 +v 0.390151 0.641487 0.104561 +v 0.405605 0.707474 0.108703 +v 0.390151 0.779474 0.104561 +v 0.320606 0.793487 0.085923 +v 0.231537 4.559279 0.062052 +v 0.208355 4.671280 0.055839 +v 0.411927 -0.695618 0.000022 +v 0.453928 -0.695625 0.000024 +v 0.483920 -0.665634 0.000025 +v 0.483920 -0.583625 0.000025 +v 0.451919 -0.543625 0.000024 +v 0.403919 -0.543625 0.000021 +v 0.363919 0.601487 0.000019 +v 0.403919 0.641487 0.000021 +v 0.419919 0.707474 0.000022 +v 0.403919 0.779474 0.000021 +v 0.331920 0.793487 0.000017 +v 0.239708 4.559279 0.000013 +v 0.275705 4.561275 0.000015 +v 0.303708 4.591273 0.000016 +v 0.303708 4.639273 0.000016 +v 0.271708 4.671280 0.000014 +v 0.215708 4.671280 0.000011 +v 0.397897 -0.695618 -0.106592 +v 0.438467 -0.695625 -0.117460 +v 0.467438 -0.665634 -0.125221 +v 0.467438 -0.583625 -0.125221 +v 0.436527 -0.543625 -0.116940 +v 0.390162 -0.543625 -0.104520 +v 0.351524 0.601487 -0.094169 +v 0.390162 0.641487 -0.104520 +v 0.405617 0.707474 -0.108660 +v 0.390162 0.779474 -0.104520 +v 0.320615 0.793487 -0.085889 +v 0.231544 4.559279 -0.062028 +v 0.356752 -0.695618 -0.205942 +v 0.393127 -0.695625 -0.226940 +v 0.419102 -0.665634 -0.241934 +v 0.419102 -0.583625 -0.241934 +v 0.391387 -0.543625 -0.225935 +v 0.349817 -0.543625 -0.201938 +v 0.315174 0.601487 -0.181940 +v 0.349817 0.641487 -0.201938 +v 0.363673 0.707474 -0.209937 +v 0.349817 0.779474 -0.201938 +v 0.287461 0.793487 -0.165942 +v 0.207601 4.559279 -0.119841 +v 0.238776 4.561275 -0.137838 +v 0.263028 4.591273 -0.151838 +v 0.263028 4.639273 -0.151838 +v 0.235314 4.671280 -0.135840 +v 0.186815 4.671280 -0.107842 +v 0.291296 -0.695618 -0.291257 +v 0.320997 -0.695625 -0.320954 +v 0.342206 -0.665634 -0.342161 +v 0.342206 -0.583625 -0.342161 +v 0.319576 -0.543625 -0.319534 +v 0.285633 -0.543625 -0.285595 +v 0.257347 0.601487 -0.257313 +v 0.285633 0.641487 -0.285595 +v 0.296947 0.707474 -0.296908 +v 0.285633 0.779474 -0.285595 +v 0.234718 0.793487 -0.234687 +v 0.169510 4.559279 -0.169488 +v 0.205988 -0.695618 -0.356725 +v 0.226992 -0.695625 -0.393097 +v 0.241989 -0.665634 -0.419070 +v 0.241989 -0.583625 -0.419070 +v 0.225987 -0.543625 -0.391358 +v 0.201984 -0.543625 -0.349790 +v 0.181982 0.601487 -0.315150 +v 0.201984 0.641487 -0.349790 +v 0.209985 0.707474 -0.363646 +v 0.201984 0.779474 -0.349790 +v 0.165980 0.793487 -0.287440 +v 0.119869 4.559279 -0.207585 +v 0.137869 4.561275 -0.238758 +v 0.151872 4.591273 -0.263008 +v 0.151872 4.639273 -0.263008 +v 0.135870 4.671280 -0.235297 +v 0.107867 4.671280 -0.186801 +v 0.106644 -0.695618 -0.397883 +v 0.117518 -0.695625 -0.438452 +v 0.125283 -0.665634 -0.467421 +v 0.125283 -0.583625 -0.467421 +v 0.116998 -0.543625 -0.436511 +v 0.104571 -0.543625 -0.390148 +v 0.094215 0.601487 -0.351512 +v 0.104571 0.641487 -0.390148 +v 0.108713 0.707474 -0.405602 +v 0.104571 0.779474 -0.390148 +v 0.085931 0.793487 -0.320604 +v 0.062058 4.559279 -0.231535 +v 0.070343 4.671280 -0.262444 +v 0.000033 -0.695618 -0.411927 +v 0.000036 -0.695625 -0.453928 +v 0.000038 -0.665634 -0.483920 +v 0.000038 -0.583625 -0.483920 +v 0.000036 -0.543625 -0.451919 +v 0.000032 -0.543625 -0.403919 +v 0.000029 0.601487 -0.363919 +v 0.000032 0.641487 -0.403919 +v 0.000033 0.707474 -0.419919 +v 0.000032 0.779474 -0.403919 +v 0.000026 0.793487 -0.331920 +v 0.000019 4.559279 -0.239708 +v 0.000022 4.561275 -0.275705 +v 0.000024 4.591273 -0.303708 +v 0.000024 4.639273 -0.303708 +v 0.000022 4.671280 -0.271708 +v 0.000017 4.671280 -0.215708 +v -0.106581 -0.695618 -0.397900 +v -0.117449 -0.695625 -0.438471 +v -0.125209 -0.665634 -0.467441 +v -0.125209 -0.583625 -0.467441 +v -0.116929 -0.543625 -0.436530 +v -0.104509 -0.543625 -0.390165 +v -0.094160 0.601487 -0.351527 +v -0.104509 0.641487 -0.390165 +v -0.108649 0.707474 -0.405620 +v -0.104509 0.779474 -0.390165 +v -0.085880 0.793487 -0.320617 +v -0.062022 4.559279 -0.231545 +v -0.078581 4.591273 -0.293366 +v -0.205932 -0.695618 -0.356757 +v -0.226929 -0.695625 -0.393133 +v -0.241923 -0.665634 -0.419108 +v -0.241923 -0.583625 -0.419108 +v -0.225925 -0.543625 -0.391393 +v -0.201929 -0.543625 -0.349822 +v -0.181932 0.601487 -0.315179 +v -0.201929 0.641487 -0.349822 +v -0.209928 0.707474 -0.363679 +v -0.201929 0.779474 -0.349822 +v -0.165935 0.793487 -0.287466 +v -0.119836 4.559279 -0.207604 +v -0.137832 4.561275 -0.238780 +v -0.151831 4.591273 -0.263032 +v -0.151831 4.639273 -0.263032 +v -0.135833 4.671280 -0.235318 +v -0.107838 4.671280 -0.186818 +v -0.291250 -0.695618 -0.291303 +v -0.320946 -0.695625 -0.321005 +v -0.342152 -0.665634 -0.342215 +v -0.342152 -0.583625 -0.342215 +v -0.319526 -0.543625 -0.319584 +v -0.285588 -0.543625 -0.285640 +v -0.257306 0.601487 -0.257353 +v -0.285588 0.641487 -0.285640 +v -0.296900 0.707474 -0.296955 +v -0.285588 0.779474 -0.285640 +v -0.234681 0.793487 -0.234725 +v -0.169484 4.559279 -0.169515 +v -0.152515 4.671280 -0.152543 +v -0.356719 -0.695618 -0.205998 +v -0.393091 -0.695625 -0.227002 +v -0.419064 -0.665634 -0.242000 +v -0.419064 -0.583625 -0.242000 +v -0.391352 -0.543625 -0.225997 +v -0.349785 -0.543625 -0.201993 +v -0.315146 0.601487 -0.181990 +v -0.349785 0.641487 -0.201993 +v -0.363640 0.707474 -0.209995 +v -0.349785 0.779474 -0.201993 +v -0.287435 0.793487 -0.165988 +v -0.207582 4.559279 -0.119874 +v -0.238754 4.561275 -0.137876 +v -0.263004 4.591273 -0.151879 +v -0.263004 4.639273 -0.151879 +v -0.235293 4.671280 -0.135877 +v -0.186798 4.671280 -0.107872 +v -0.397880 -0.695618 -0.106655 +v -0.438449 -0.695625 -0.117529 +v -0.467418 -0.665634 -0.125295 +v -0.467418 -0.583625 -0.125295 +v -0.436508 -0.543625 -0.117009 +v -0.390145 -0.543625 -0.104581 +v -0.351509 0.601487 -0.094225 +v -0.390145 0.641487 -0.104581 +v -0.405600 0.707474 -0.108724 +v -0.390145 0.779474 -0.104581 +v -0.320601 0.793487 -0.085940 +v -0.231534 4.559279 -0.062064 +v -0.208352 4.671280 -0.055850 +v 0.042099 0.760516 0.319849 +v 0.049195 0.755443 0.373756 +v 0.049945 0.707794 0.379455 +v 0.048430 0.657846 0.367941 +v 0.043001 0.613739 0.326701 +v 0.047878 -0.544789 0.363746 +v -0.140407 -0.544789 0.338953 +v -0.291071 -0.544789 0.223341 +v -0.363745 -0.544789 0.047887 +v 0.223334 -0.544789 0.291076 +v 0.200588 0.613739 0.261432 +v 0.225910 0.657846 0.294434 +v 0.232979 0.707794 0.303647 +v 0.229480 0.755443 0.299087 +v 0.196382 0.760516 0.255949 +v -0.123463 0.760516 0.298048 +v -0.255945 0.760516 0.196388 +v -0.319848 0.760516 0.042108 +v -0.373755 0.755443 0.049205 +v -0.299081 0.755444 0.229487 +v -0.144271 0.755443 0.348281 +v -0.142026 0.657846 0.342863 +v -0.126108 0.613739 0.304434 +v -0.146471 0.707794 0.353592 +v -0.303641 0.707794 0.232987 +v -0.261427 0.613739 0.200596 +v -0.294428 0.657846 0.225917 +v -0.379454 0.707794 0.049955 +v -0.367940 0.657846 0.048439 +v -0.326700 0.613739 0.043010 +v -0.298039 0.760516 -0.123487 +v -0.196368 0.760516 -0.255960 +v -0.042083 0.760516 -0.319851 +v -0.049175 0.755443 -0.373759 +v -0.049925 0.707794 -0.379458 +v -0.048410 0.657846 -0.367944 +v -0.042984 0.613739 -0.326704 +v -0.200575 0.613739 -0.261443 +v -0.225894 0.657846 -0.294446 +v -0.232963 0.707794 -0.303660 +v -0.229464 0.755443 -0.299099 +v -0.348270 0.755443 -0.144298 +v -0.353580 0.707794 -0.146499 +v -0.342852 0.657846 -0.142053 +v -0.304424 0.613739 -0.126132 +v -0.338942 -0.544789 -0.140434 +v -0.223319 -0.544789 -0.291089 +v -0.047858 -0.544789 -0.363749 +v 0.140425 -0.544789 -0.338946 +v 0.291083 -0.544789 -0.223326 +v 0.363748 -0.544789 -0.047868 +v 0.123478 0.760516 -0.298043 +v 0.144289 0.755444 -0.348273 +v 0.146489 0.707794 -0.353584 +v 0.142044 0.657846 -0.342855 +v 0.126124 0.613739 -0.304427 +v 0.261438 0.613739 -0.200582 +v 0.294440 0.657846 -0.225902 +v 0.303653 0.707794 -0.232971 +v 0.299093 0.755444 -0.229471 +v 0.255955 0.760516 -0.196375 +v 0.319851 0.760516 -0.042092 +v 0.373758 0.755443 -0.049186 +v 0.379457 0.707794 -0.049935 +v 0.367943 0.657846 -0.048420 +v 0.326702 0.613739 -0.042993 +v 0.298045 0.760516 0.123471 +v 0.348277 0.755444 0.144280 +v 0.353588 0.707794 0.146480 +v 0.342859 0.657846 0.142035 +v 0.304430 0.613739 0.126115 +v 0.338950 -0.544789 0.140416 +v -0.026067 4.543957 0.197960 +v -0.038002 0.778164 0.288601 +v -0.121553 4.543957 0.158406 +v -0.177209 0.778164 0.230936 +v -0.184470 4.543957 0.076408 +v -0.268934 0.778164 0.111395 +v -0.197958 4.543957 -0.026072 +v -0.288597 0.778165 -0.038010 +v 0.184475 4.543957 -0.076399 +v 0.268941 0.778164 -0.111380 +v 0.121561 4.543957 -0.158400 +v 0.177221 0.778164 -0.230926 +v 0.026077 4.543957 -0.197959 +v 0.038017 0.778164 -0.288599 +v -0.076395 4.543957 -0.184476 +v -0.111373 0.778164 -0.268943 +v -0.158396 4.543957 -0.121565 +v -0.230922 0.778164 -0.177227 +v 0.197959 4.543957 0.026072 +v 0.288599 0.778164 0.038010 +v 0.158403 4.543957 0.121557 +v 0.230932 0.778164 0.177215 +v 0.076404 4.543957 0.184472 +v 0.111387 0.778164 0.268937 +v -0.231537 4.559279 -0.000012 +# 4440 vertices + +# 0 vertex parms + +# 0 texture vertices + +# 0 normals + +g globes +f 1669 1692 1691 +f 1688 1692 1687 +f 1684 1692 1683 +f 1680 1692 1679 +f 1676 1692 1675 +f 1672 1692 1671 +f 1645 1669 1691 1667 +f 1664 1688 1687 1663 +f 1660 1684 1683 1659 +f 1656 1680 1679 1655 +f 1652 1676 1675 1651 +f 1648 1672 1671 1647 +f 1621 1645 1667 1643 +f 1640 1664 1663 1639 +f 1636 1660 1659 1635 +f 1632 1656 1655 1631 +f 1628 1652 1651 1627 +f 1624 1648 1647 1623 +f 1597 1621 1643 1619 +f 1616 1640 1639 1615 +f 1612 1636 1635 1611 +f 1608 1632 1631 1607 +f 1604 1628 1627 1603 +f 1600 1624 1623 1599 +f 1573 1597 1619 1595 +f 1592 1616 1615 1591 +f 1588 1612 1611 1587 +f 1584 1608 1607 1583 +f 1580 1604 1603 1579 +f 1576 1600 1599 1575 +f 1549 1573 1595 1571 +f 1568 1592 1591 1567 +f 1564 1588 1587 1563 +f 1560 1584 1583 1559 +f 1556 1580 1579 1555 +f 1552 1576 1575 1551 +f 1525 1549 1571 1547 +f 1544 1568 1567 1543 +f 1540 1564 1563 1539 +f 1536 1560 1559 1535 +f 1532 1556 1555 1531 +f 1528 1552 1551 1527 +f 1501 1525 1547 1523 +f 1520 1544 1543 1519 +f 1516 1540 1539 1515 +f 1512 1536 1535 1511 +f 1508 1532 1531 1507 +f 1504 1528 1527 1503 +f 1477 1501 1523 1499 +f 1496 1520 1519 1495 +f 1492 1516 1515 1491 +f 1488 1512 1511 1487 +f 1484 1508 1507 1483 +f 1480 1504 1503 1479 +f 1453 1477 1499 1475 +f 1472 1496 1495 1471 +f 1468 1492 1491 1467 +f 1464 1488 1487 1463 +f 1460 1484 1483 1459 +f 1456 1480 1479 1455 +f 1429 1453 1475 1451 +f 1448 1472 1471 1447 +f 1444 1468 1467 1443 +f 1440 1464 1463 1439 +f 1436 1460 1459 1435 +f 1432 1456 1455 1431 +f 1427 1429 1451 +f 1427 1448 1447 +f 1427 1444 1443 +f 1427 1440 1439 +f 1427 1436 1435 +f 1427 1432 1431 +f 1403 1426 1425 +f 1422 1426 1421 +f 1418 1426 1417 +f 1414 1426 1413 +f 1410 1426 1409 +f 1406 1426 1405 +f 1379 1403 1425 1401 +f 1398 1422 1421 1397 +f 1394 1418 1417 1393 +f 1390 1414 1413 1389 +f 1386 1410 1409 1385 +f 1382 1406 1405 1381 +f 1355 1379 1401 1377 +f 1374 1398 1397 1373 +f 1370 1394 1393 1369 +f 1366 1390 1389 1365 +f 1362 1386 1385 1361 +f 1358 1382 1381 1357 +f 1331 1355 1377 1353 +f 1350 1374 1373 1349 +f 1346 1370 1369 1345 +f 1342 1366 1365 1341 +f 1338 1362 1361 1337 +f 1334 1358 1357 1333 +f 1307 1331 1353 1329 +f 1326 1350 1349 1325 +f 1322 1346 1345 1321 +f 1318 1342 1341 1317 +f 1314 1338 1337 1313 +f 1310 1334 1333 1309 +f 1283 1307 1329 1305 +f 1302 1326 1325 1301 +f 1298 1322 1321 1297 +f 1294 1318 1317 1293 +f 1290 1314 1313 1289 +f 1286 1310 1309 1285 +f 1259 1283 1305 1281 +f 1278 1302 1301 1277 +f 1274 1298 1297 1273 +f 1270 1294 1293 1269 +f 1266 1290 1289 1265 +f 1262 1286 1285 1261 +f 1235 1259 1281 1257 +f 1254 1278 1277 1253 +f 1250 1274 1273 1249 +f 1246 1270 1269 1245 +f 1242 1266 1265 1241 +f 1238 1262 1261 1237 +f 1211 1235 1257 1233 +f 1230 1254 1253 1229 +f 1226 1250 1249 1225 +f 1222 1246 1245 1221 +f 1218 1242 1241 1217 +f 1214 1238 1237 1213 +f 1187 1211 1233 1209 +f 1206 1230 1229 1205 +f 1202 1226 1225 1201 +f 1198 1222 1221 1197 +f 1194 1218 1217 1193 +f 1190 1214 1213 1189 +f 1163 1187 1209 1185 +f 1182 1206 1205 1181 +f 1178 1202 1201 1177 +f 1174 1198 1197 1173 +f 1170 1194 1193 1169 +f 1166 1190 1189 1165 +f 1161 1163 1185 +f 1161 1182 1181 +f 1161 1178 1177 +f 1161 1174 1173 +f 1161 1170 1169 +f 1161 1166 1165 +f 531 532 530 +f 527 532 526 +f 523 532 522 +f 519 532 518 +f 515 532 514 +f 511 532 510 +f 507 531 530 506 +f 503 527 526 502 +f 499 523 522 498 +f 495 519 518 494 +f 491 515 514 490 +f 487 511 510 486 +f 483 507 506 482 +f 479 503 502 478 +f 475 499 498 474 +f 471 495 494 470 +f 467 491 490 466 +f 463 487 486 462 +f 459 483 482 458 +f 455 479 478 454 +f 451 475 474 450 +f 447 471 470 446 +f 443 467 466 442 +f 439 463 462 438 +f 435 459 458 434 +f 431 455 454 430 +f 427 451 450 426 +f 423 447 446 422 +f 419 443 442 418 +f 415 439 438 414 +f 411 435 434 410 +f 407 431 430 406 +f 403 427 426 402 +f 399 423 422 398 +f 395 419 418 394 +f 391 415 414 390 +f 387 411 410 386 +f 383 407 406 382 +f 379 403 402 378 +f 375 399 398 374 +f 371 395 394 370 +f 367 391 390 366 +f 363 387 386 362 +f 359 383 382 358 +f 355 379 378 354 +f 351 375 374 350 +f 347 371 370 346 +f 343 367 366 342 +f 339 363 362 338 +f 335 359 358 334 +f 331 355 354 330 +f 327 351 350 326 +f 323 347 346 322 +f 319 343 342 318 +f 315 339 338 314 +f 311 335 334 310 +f 307 331 330 306 +f 303 327 326 302 +f 299 323 322 298 +f 295 319 318 294 +f 291 315 314 290 +f 287 311 310 286 +f 283 307 306 282 +f 279 303 302 278 +f 275 299 298 274 +f 271 295 294 270 +f 267 291 290 +f 267 287 286 +f 267 283 282 +f 267 279 278 +f 267 275 274 +f 267 271 270 +f 265 266 264 +f 261 266 260 +f 257 266 256 +f 253 266 252 +f 249 266 248 +f 245 266 244 +f 241 265 264 240 +f 237 261 260 236 +f 233 257 256 232 +f 229 253 252 228 +f 225 249 248 224 +f 221 245 244 220 +f 217 241 240 216 +f 213 237 236 212 +f 209 233 232 208 +f 205 229 228 204 +f 201 225 224 200 +f 197 221 220 196 +f 193 217 216 192 +f 189 213 212 188 +f 185 209 208 184 +f 181 205 204 180 +f 177 201 200 176 +f 173 197 196 172 +f 169 193 192 168 +f 165 189 188 164 +f 161 185 184 160 +f 157 181 180 156 +f 153 177 176 152 +f 149 173 172 148 +f 145 169 168 144 +f 141 165 164 140 +f 137 161 160 136 +f 133 157 156 132 +f 129 153 152 128 +f 125 149 148 124 +f 121 145 144 120 +f 117 141 140 116 +f 113 137 136 112 +f 109 133 132 108 +f 105 129 128 104 +f 101 125 124 100 +f 97 121 120 96 +f 93 117 116 92 +f 89 113 112 88 +f 85 109 108 84 +f 81 105 104 80 +f 77 101 100 76 +f 73 97 96 72 +f 69 93 92 68 +f 65 89 88 64 +f 61 85 84 60 +f 57 81 80 56 +f 53 77 76 52 +f 49 73 72 48 +f 45 69 68 44 +f 41 65 64 40 +f 37 61 60 36 +f 33 57 56 32 +f 29 53 52 28 +f 25 49 48 24 +f 21 45 44 20 +f 17 41 40 16 +f 13 37 36 12 +f 9 33 32 8 +f 5 29 28 4 +f 1 25 24 +f 1 21 20 +f 1 17 16 +f 1 13 12 +f 1 9 8 +f 1 5 4 +f 1 4 3 +f 1 8 7 +f 1 12 11 +f 1 16 15 +f 1 20 19 +f 1 24 23 +f 4 28 27 3 +f 8 32 31 7 +f 12 36 35 11 +f 16 40 39 15 +f 20 44 43 19 +f 24 48 47 23 +f 28 52 51 27 +f 32 56 55 31 +f 36 60 59 35 +f 40 64 63 39 +f 44 68 67 43 +f 48 72 71 47 +f 52 76 75 51 +f 56 80 79 55 +f 60 84 83 59 +f 64 88 87 63 +f 68 92 91 67 +f 72 96 95 71 +f 76 100 99 75 +f 80 104 103 79 +f 84 108 107 83 +f 88 112 111 87 +f 92 116 115 91 +f 96 120 119 95 +f 100 124 123 99 +f 104 128 127 103 +f 108 132 131 107 +f 112 136 135 111 +f 116 140 139 115 +f 120 144 143 119 +f 124 148 147 123 +f 128 152 151 127 +f 132 156 155 131 +f 136 160 159 135 +f 140 164 163 139 +f 144 168 167 143 +f 148 172 171 147 +f 152 176 175 151 +f 156 180 179 155 +f 160 184 183 159 +f 164 188 187 163 +f 168 192 191 167 +f 172 196 195 171 +f 176 200 199 175 +f 180 204 203 179 +f 184 208 207 183 +f 188 212 211 187 +f 192 216 215 191 +f 196 220 219 195 +f 200 224 223 199 +f 204 228 227 203 +f 208 232 231 207 +f 212 236 235 211 +f 216 240 239 215 +f 220 244 243 219 +f 224 248 247 223 +f 228 252 251 227 +f 232 256 255 231 +f 236 260 259 235 +f 240 264 263 239 +f 244 266 243 +f 248 266 247 +f 252 266 251 +f 256 266 255 +f 260 266 259 +f 264 266 263 +f 267 270 268 +f 267 274 273 +f 267 278 277 +f 267 282 281 +f 267 286 285 +f 267 290 289 +f 270 294 292 268 +f 274 298 297 273 +f 278 302 301 277 +f 282 306 305 281 +f 286 310 309 285 +f 290 314 313 289 +f 294 318 316 292 +f 298 322 321 297 +f 302 326 325 301 +f 306 330 329 305 +f 310 334 333 309 +f 314 338 337 313 +f 318 342 340 316 +f 322 346 345 321 +f 326 350 349 325 +f 330 354 353 329 +f 334 358 357 333 +f 338 362 361 337 +f 342 366 364 340 +f 346 370 369 345 +f 350 374 373 349 +f 354 378 377 353 +f 358 382 381 357 +f 362 386 385 361 +f 366 390 388 364 +f 370 394 393 369 +f 374 398 397 373 +f 378 402 401 377 +f 382 406 405 381 +f 386 410 409 385 +f 390 414 412 388 +f 394 418 417 393 +f 398 422 421 397 +f 402 426 425 401 +f 406 430 429 405 +f 410 434 433 409 +f 414 438 436 412 +f 418 442 441 417 +f 422 446 445 421 +f 426 450 449 425 +f 430 454 453 429 +f 434 458 457 433 +f 438 462 460 436 +f 442 466 465 441 +f 446 470 469 445 +f 450 474 473 449 +f 454 478 477 453 +f 458 482 481 457 +f 462 486 484 460 +f 466 490 489 465 +f 470 494 493 469 +f 474 498 497 473 +f 478 502 501 477 +f 482 506 505 481 +f 486 510 508 484 +f 490 514 513 489 +f 494 518 517 493 +f 498 522 521 497 +f 502 526 525 501 +f 506 530 529 505 +f 510 532 508 +f 514 532 513 +f 518 532 517 +f 522 532 521 +f 526 532 525 +f 530 532 529 +f 1161 1162 1163 +f 1161 1167 1166 +f 1161 1171 1170 +f 1161 1175 1174 +f 1161 1179 1178 +f 1161 1183 1182 +f 1162 1186 1187 1163 +f 1167 1191 1190 1166 +f 1171 1195 1194 1170 +f 1175 1199 1198 1174 +f 1179 1203 1202 1178 +f 1183 1207 1206 1182 +f 1186 1210 1211 1187 +f 1191 1215 1214 1190 +f 1195 1219 1218 1194 +f 1199 1223 1222 1198 +f 1203 1227 1226 1202 +f 1207 1231 1230 1206 +f 1210 1234 1235 1211 +f 1215 1239 1238 1214 +f 1219 1243 1242 1218 +f 1223 1247 1246 1222 +f 1227 1251 1250 1226 +f 1231 1255 1254 1230 +f 1234 1258 1259 1235 +f 1239 1263 1262 1238 +f 1243 1267 1266 1242 +f 1247 1271 1270 1246 +f 1251 1275 1274 1250 +f 1255 1279 1278 1254 +f 1258 1282 1283 1259 +f 1263 1287 1286 1262 +f 1267 1291 1290 1266 +f 1271 1295 1294 1270 +f 1275 1299 1298 1274 +f 1279 1303 1302 1278 +f 1282 1306 1307 1283 +f 1287 1311 1310 1286 +f 1291 1315 1314 1290 +f 1295 1319 1318 1294 +f 1299 1323 1322 1298 +f 1303 1327 1326 1302 +f 1306 1330 1331 1307 +f 1311 1335 1334 1310 +f 1315 1339 1338 1314 +f 1319 1343 1342 1318 +f 1323 1347 1346 1322 +f 1327 1351 1350 1326 +f 1330 1354 1355 1331 +f 1335 1359 1358 1334 +f 1339 1363 1362 1338 +f 1343 1367 1366 1342 +f 1347 1371 1370 1346 +f 1351 1375 1374 1350 +f 1354 1378 1379 1355 +f 1359 1383 1382 1358 +f 1363 1387 1386 1362 +f 1367 1391 1390 1366 +f 1371 1395 1394 1370 +f 1375 1399 1398 1374 +f 1378 1402 1403 1379 +f 1383 1407 1406 1382 +f 1387 1411 1410 1386 +f 1391 1415 1414 1390 +f 1395 1419 1418 1394 +f 1399 1423 1422 1398 +f 1402 1426 1403 +f 1407 1426 1406 +f 1411 1426 1410 +f 1415 1426 1414 +f 1419 1426 1418 +f 1423 1426 1422 +f 1427 1428 1429 +f 1427 1433 1432 +f 1427 1437 1436 +f 1427 1441 1440 +f 1427 1445 1444 +f 1427 1449 1448 +f 1428 1452 1453 1429 +f 1433 1457 1456 1432 +f 1437 1461 1460 1436 +f 1441 1465 1464 1440 +f 1445 1469 1468 1444 +f 1449 1473 1472 1448 +f 1452 1476 1477 1453 +f 1457 1481 1480 1456 +f 1461 1485 1484 1460 +f 1465 1489 1488 1464 +f 1469 1493 1492 1468 +f 1473 1497 1496 1472 +f 1476 1500 1501 1477 +f 1481 1505 1504 1480 +f 1485 1509 1508 1484 +f 1489 1513 1512 1488 +f 1493 1517 1516 1492 +f 1497 1521 1520 1496 +f 1500 1524 1525 1501 +f 1505 1529 1528 1504 +f 1509 1533 1532 1508 +f 1513 1537 1536 1512 +f 1517 1541 1540 1516 +f 1521 1545 1544 1520 +f 1524 1548 1549 1525 +f 1529 1553 1552 1528 +f 1533 1557 1556 1532 +f 1537 1561 1560 1536 +f 1541 1565 1564 1540 +f 1545 1569 1568 1544 +f 1548 1572 1573 1549 +f 1553 1577 1576 1552 +f 1557 1581 1580 1556 +f 1561 1585 1584 1560 +f 1565 1589 1588 1564 +f 1569 1593 1592 1568 +f 1572 1596 1597 1573 +f 1577 1601 1600 1576 +f 1581 1605 1604 1580 +f 1585 1609 1608 1584 +f 1589 1613 1612 1588 +f 1593 1617 1616 1592 +f 1596 1620 1621 1597 +f 1601 1625 1624 1600 +f 1605 1629 1628 1604 +f 1609 1633 1632 1608 +f 1613 1637 1636 1612 +f 1617 1641 1640 1616 +f 1620 1644 1645 1621 +f 1625 1649 1648 1624 +f 1629 1653 1652 1628 +f 1633 1657 1656 1632 +f 1637 1661 1660 1636 +f 1641 1665 1664 1640 +f 1644 1668 1669 1645 +f 1649 1673 1672 1648 +f 1653 1677 1676 1652 +f 1657 1681 1680 1656 +f 1661 1685 1684 1660 +f 1665 1689 1688 1664 +f 1668 1692 1669 +f 1673 1692 1672 +f 1677 1692 1676 +f 1681 1692 1680 +f 1685 1692 1684 +f 1689 1692 1688 +f 1691 1692 1690 +f 1687 1692 1686 +f 1683 1692 1682 +f 1679 1692 1678 +f 1675 1692 1674 +f 1671 1692 1670 +f 1667 1691 1690 1666 +f 1663 1687 1686 1662 +f 1659 1683 1682 1658 +f 1655 1679 1678 1654 +f 1651 1675 1674 1650 +f 1647 1671 1670 1646 +f 1643 1667 1666 1642 +f 1639 1663 1662 1638 +f 1635 1659 1658 1634 +f 1631 1655 1654 1630 +f 1627 1651 1650 1626 +f 1623 1647 1646 1622 +f 1619 1643 1642 1618 +f 1615 1639 1638 1614 +f 1611 1635 1634 1610 +f 1607 1631 1630 1606 +f 1603 1627 1626 1602 +f 1599 1623 1622 1598 +f 1595 1619 1618 1594 +f 1591 1615 1614 1590 +f 1587 1611 1610 1586 +f 1583 1607 1606 1582 +f 1579 1603 1602 1578 +f 1575 1599 1598 1574 +f 1571 1595 1594 1570 +f 1567 1591 1590 1566 +f 1563 1587 1586 1562 +f 1559 1583 1582 1558 +f 1555 1579 1578 1554 +f 1551 1575 1574 1550 +f 1547 1571 1570 1546 +f 1543 1567 1566 1542 +f 1539 1563 1562 1538 +f 1535 1559 1558 1534 +f 1531 1555 1554 1530 +f 1527 1551 1550 1526 +f 1523 1547 1546 1522 +f 1519 1543 1542 1518 +f 1515 1539 1538 1514 +f 1511 1535 1534 1510 +f 1507 1531 1530 1506 +f 1503 1527 1526 1502 +f 1499 1523 1522 1498 +f 1495 1519 1518 1494 +f 1491 1515 1514 1490 +f 1487 1511 1510 1486 +f 1483 1507 1506 1482 +f 1479 1503 1502 1478 +f 1475 1499 1498 1474 +f 1471 1495 1494 1470 +f 1467 1491 1490 1466 +f 1463 1487 1486 1462 +f 1459 1483 1482 1458 +f 1455 1479 1478 1454 +f 1451 1475 1474 1450 +f 1447 1471 1470 1446 +f 1443 1467 1466 1442 +f 1439 1463 1462 1438 +f 1435 1459 1458 1434 +f 1431 1455 1454 1430 +f 1427 1451 1450 +f 1427 1447 1446 +f 1427 1443 1442 +f 1427 1439 1438 +f 1427 1435 1434 +f 1427 1431 1430 +f 1425 1426 1424 +f 1421 1426 1420 +f 1417 1426 1416 +f 1413 1426 1412 +f 1409 1426 1408 +f 1405 1426 1404 +f 1401 1425 1424 1400 +f 1397 1421 1420 1396 +f 1393 1417 1416 1392 +f 1389 1413 1412 1388 +f 1385 1409 1408 1384 +f 1381 1405 1404 1380 +f 1377 1401 1400 1376 +f 1373 1397 1396 1372 +f 1369 1393 1392 1368 +f 1365 1389 1388 1364 +f 1361 1385 1384 1360 +f 1357 1381 1380 1356 +f 1353 1377 1376 1352 +f 1349 1373 1372 1348 +f 1345 1369 1368 1344 +f 1341 1365 1364 1340 +f 1337 1361 1360 1336 +f 1333 1357 1356 1332 +f 1329 1353 1352 1328 +f 1325 1349 1348 1324 +f 1321 1345 1344 1320 +f 1317 1341 1340 1316 +f 1313 1337 1336 1312 +f 1309 1333 1332 1308 +f 1305 1329 1328 1304 +f 1301 1325 1324 1300 +f 1297 1321 1320 1296 +f 1293 1317 1316 1292 +f 1289 1313 1312 1288 +f 1285 1309 1308 1284 +f 1281 1305 1304 1280 +f 1277 1301 1300 1276 +f 1273 1297 1296 1272 +f 1269 1293 1292 1268 +f 1265 1289 1288 1264 +f 1261 1285 1284 1260 +f 1257 1281 1280 1256 +f 1253 1277 1276 1252 +f 1249 1273 1272 1248 +f 1245 1269 1268 1244 +f 1241 1265 1264 1240 +f 1237 1261 1260 1236 +f 1233 1257 1256 1232 +f 1229 1253 1252 1228 +f 1225 1249 1248 1224 +f 1221 1245 1244 1220 +f 1217 1241 1240 1216 +f 1213 1237 1236 1212 +f 1209 1233 1232 1208 +f 1205 1229 1228 1204 +f 1201 1225 1224 1200 +f 1197 1221 1220 1196 +f 1193 1217 1216 1192 +f 1189 1213 1212 1188 +f 1185 1209 1208 1184 +f 1181 1205 1204 1180 +f 1177 1201 1200 1176 +f 1173 1197 1196 1172 +f 1169 1193 1192 1168 +f 1165 1189 1188 1164 +f 1161 1185 1184 +f 1161 1181 1180 +f 1161 1177 1176 +f 1161 1173 1172 +f 1161 1169 1168 +f 1161 1165 1164 +f 509 532 531 +f 528 532 527 +f 524 532 523 +f 520 532 519 +f 516 532 515 +f 512 532 511 +f 485 509 531 507 +f 504 528 527 503 +f 500 524 523 499 +f 496 520 519 495 +f 492 516 515 491 +f 488 512 511 487 +f 461 485 507 483 +f 480 504 503 479 +f 476 500 499 475 +f 472 496 495 471 +f 468 492 491 467 +f 464 488 487 463 +f 437 461 483 459 +f 456 480 479 455 +f 452 476 475 451 +f 448 472 471 447 +f 444 468 467 443 +f 440 464 463 439 +f 413 437 459 435 +f 432 456 455 431 +f 428 452 451 427 +f 424 448 447 423 +f 420 444 443 419 +f 416 440 439 415 +f 389 413 435 411 +f 408 432 431 407 +f 404 428 427 403 +f 400 424 423 399 +f 396 420 419 395 +f 392 416 415 391 +f 365 389 411 387 +f 384 408 407 383 +f 380 404 403 379 +f 376 400 399 375 +f 372 396 395 371 +f 368 392 391 367 +f 341 365 387 363 +f 360 384 383 359 +f 356 380 379 355 +f 352 376 375 351 +f 348 372 371 347 +f 344 368 367 343 +f 317 341 363 339 +f 336 360 359 335 +f 332 356 355 331 +f 328 352 351 327 +f 324 348 347 323 +f 320 344 343 319 +f 293 317 339 315 +f 312 336 335 311 +f 308 332 331 307 +f 304 328 327 303 +f 300 324 323 299 +f 296 320 319 295 +f 269 293 315 291 +f 288 312 311 287 +f 284 308 307 283 +f 280 304 303 279 +f 276 300 299 275 +f 272 296 295 271 +f 267 269 291 +f 267 288 287 +f 267 284 283 +f 267 280 279 +f 267 276 275 +f 267 272 271 +f 242 266 265 +f 262 266 261 +f 258 266 257 +f 254 266 253 +f 250 266 249 +f 246 266 245 +f 218 242 265 241 +f 238 262 261 237 +f 234 258 257 233 +f 230 254 253 229 +f 226 250 249 225 +f 222 246 245 221 +f 194 218 241 217 +f 214 238 237 213 +f 210 234 233 209 +f 206 230 229 205 +f 202 226 225 201 +f 198 222 221 197 +f 170 194 217 193 +f 190 214 213 189 +f 186 210 209 185 +f 182 206 205 181 +f 178 202 201 177 +f 174 198 197 173 +f 146 170 193 169 +f 166 190 189 165 +f 162 186 185 161 +f 158 182 181 157 +f 154 178 177 153 +f 150 174 173 149 +f 122 146 169 145 +f 142 166 165 141 +f 138 162 161 137 +f 134 158 157 133 +f 130 154 153 129 +f 126 150 149 125 +f 98 122 145 121 +f 118 142 141 117 +f 114 138 137 113 +f 110 134 133 109 +f 106 130 129 105 +f 102 126 125 101 +f 74 98 121 97 +f 94 118 117 93 +f 90 114 113 89 +f 86 110 109 85 +f 82 106 105 81 +f 78 102 101 77 +f 50 74 97 73 +f 70 94 93 69 +f 66 90 89 65 +f 62 86 85 61 +f 58 82 81 57 +f 54 78 77 53 +f 26 50 73 49 +f 46 70 69 45 +f 42 66 65 41 +f 38 62 61 37 +f 34 58 57 33 +f 30 54 53 29 +f 2 26 49 25 +f 22 46 45 21 +f 18 42 41 17 +f 14 38 37 13 +f 10 34 33 9 +f 6 30 29 5 +f 1 2 25 +f 1 22 21 +f 1 18 17 +f 1 14 13 +f 1 10 9 +f 1 6 5 +f 1 3 2 +f 1 7 6 +f 1 11 10 +f 1 15 14 +f 1 19 18 +f 1 23 22 +f 3 27 26 2 +f 7 31 30 6 +f 11 35 34 10 +f 15 39 38 14 +f 19 43 42 18 +f 23 47 46 22 +f 27 51 50 26 +f 31 55 54 30 +f 35 59 58 34 +f 39 63 62 38 +f 43 67 66 42 +f 47 71 70 46 +f 51 75 74 50 +f 55 79 78 54 +f 59 83 82 58 +f 63 87 86 62 +f 67 91 90 66 +f 71 95 94 70 +f 75 99 98 74 +f 79 103 102 78 +f 83 107 106 82 +f 87 111 110 86 +f 91 115 114 90 +f 95 119 118 94 +f 99 123 122 98 +f 103 127 126 102 +f 107 131 130 106 +f 111 135 134 110 +f 115 139 138 114 +f 119 143 142 118 +f 123 147 146 122 +f 127 151 150 126 +f 131 155 154 130 +f 135 159 158 134 +f 139 163 162 138 +f 143 167 166 142 +f 147 171 170 146 +f 151 175 174 150 +f 155 179 178 154 +f 159 183 182 158 +f 163 187 186 162 +f 167 191 190 166 +f 171 195 194 170 +f 175 199 198 174 +f 179 203 202 178 +f 183 207 206 182 +f 187 211 210 186 +f 191 215 214 190 +f 195 219 218 194 +f 199 223 222 198 +f 203 227 226 202 +f 207 231 230 206 +f 211 235 234 210 +f 215 239 238 214 +f 219 243 242 218 +f 223 247 246 222 +f 227 251 250 226 +f 231 255 254 230 +f 235 259 258 234 +f 239 263 262 238 +f 243 266 242 +f 247 266 246 +f 251 266 250 +f 255 266 254 +f 259 266 258 +f 263 266 262 +f 267 268 269 +f 267 273 272 +f 267 277 276 +f 267 281 280 +f 267 285 284 +f 267 289 288 +f 268 292 293 269 +f 273 297 296 272 +f 277 301 300 276 +f 281 305 304 280 +f 285 309 308 284 +f 289 313 312 288 +f 292 316 317 293 +f 297 321 320 296 +f 301 325 324 300 +f 305 329 328 304 +f 309 333 332 308 +f 313 337 336 312 +f 316 340 341 317 +f 321 345 344 320 +f 325 349 348 324 +f 329 353 352 328 +f 333 357 356 332 +f 337 361 360 336 +f 340 364 365 341 +f 345 369 368 344 +f 349 373 372 348 +f 353 377 376 352 +f 357 381 380 356 +f 361 385 384 360 +f 364 388 389 365 +f 369 393 392 368 +f 373 397 396 372 +f 377 401 400 376 +f 381 405 404 380 +f 385 409 408 384 +f 388 412 413 389 +f 393 417 416 392 +f 397 421 420 396 +f 401 425 424 400 +f 405 429 428 404 +f 409 433 432 408 +f 412 436 437 413 +f 417 441 440 416 +f 421 445 444 420 +f 425 449 448 424 +f 429 453 452 428 +f 433 457 456 432 +f 436 460 461 437 +f 441 465 464 440 +f 445 469 468 444 +f 449 473 472 448 +f 453 477 476 452 +f 457 481 480 456 +f 460 484 485 461 +f 465 489 488 464 +f 469 493 492 468 +f 473 497 496 472 +f 477 501 500 476 +f 481 505 504 480 +f 484 508 509 485 +f 489 513 512 488 +f 493 517 516 492 +f 497 521 520 496 +f 501 525 524 500 +f 505 529 528 504 +f 508 532 509 +f 513 532 512 +f 517 532 516 +f 521 532 520 +f 525 532 524 +f 529 532 528 +f 1161 1164 1162 +f 1161 1168 1167 +f 1161 1172 1171 +f 1161 1176 1175 +f 1161 1180 1179 +f 1161 1184 1183 +f 1164 1188 1186 1162 +f 1168 1192 1191 1167 +f 1172 1196 1195 1171 +f 1176 1200 1199 1175 +f 1180 1204 1203 1179 +f 1184 1208 1207 1183 +f 1188 1212 1210 1186 +f 1192 1216 1215 1191 +f 1196 1220 1219 1195 +f 1200 1224 1223 1199 +f 1204 1228 1227 1203 +f 1208 1232 1231 1207 +f 1212 1236 1234 1210 +f 1216 1240 1239 1215 +f 1220 1244 1243 1219 +f 1224 1248 1247 1223 +f 1228 1252 1251 1227 +f 1232 1256 1255 1231 +f 1236 1260 1258 1234 +f 1240 1264 1263 1239 +f 1244 1268 1267 1243 +f 1248 1272 1271 1247 +f 1252 1276 1275 1251 +f 1256 1280 1279 1255 +f 1260 1284 1282 1258 +f 1264 1288 1287 1263 +f 1268 1292 1291 1267 +f 1272 1296 1295 1271 +f 1276 1300 1299 1275 +f 1280 1304 1303 1279 +f 1284 1308 1306 1282 +f 1288 1312 1311 1287 +f 1292 1316 1315 1291 +f 1296 1320 1319 1295 +f 1300 1324 1323 1299 +f 1304 1328 1327 1303 +f 1308 1332 1330 1306 +f 1312 1336 1335 1311 +f 1316 1340 1339 1315 +f 1320 1344 1343 1319 +f 1324 1348 1347 1323 +f 1328 1352 1351 1327 +f 1332 1356 1354 1330 +f 1336 1360 1359 1335 +f 1340 1364 1363 1339 +f 1344 1368 1367 1343 +f 1348 1372 1371 1347 +f 1352 1376 1375 1351 +f 1356 1380 1378 1354 +f 1360 1384 1383 1359 +f 1364 1388 1387 1363 +f 1368 1392 1391 1367 +f 1372 1396 1395 1371 +f 1376 1400 1399 1375 +f 1380 1404 1402 1378 +f 1384 1408 1407 1383 +f 1388 1412 1411 1387 +f 1392 1416 1415 1391 +f 1396 1420 1419 1395 +f 1400 1424 1423 1399 +f 1404 1426 1402 +f 1408 1426 1407 +f 1412 1426 1411 +f 1416 1426 1415 +f 1420 1426 1419 +f 1424 1426 1423 +f 1427 1430 1428 +f 1427 1434 1433 +f 1427 1438 1437 +f 1427 1442 1441 +f 1427 1446 1445 +f 1427 1450 1449 +f 1430 1454 1452 1428 +f 1434 1458 1457 1433 +f 1438 1462 1461 1437 +f 1442 1466 1465 1441 +f 1446 1470 1469 1445 +f 1450 1474 1473 1449 +f 1454 1478 1476 1452 +f 1458 1482 1481 1457 +f 1462 1486 1485 1461 +f 1466 1490 1489 1465 +f 1470 1494 1493 1469 +f 1474 1498 1497 1473 +f 1478 1502 1500 1476 +f 1482 1506 1505 1481 +f 1486 1510 1509 1485 +f 1490 1514 1513 1489 +f 1494 1518 1517 1493 +f 1498 1522 1521 1497 +f 1502 1526 1524 1500 +f 1506 1530 1529 1505 +f 1510 1534 1533 1509 +f 1514 1538 1537 1513 +f 1518 1542 1541 1517 +f 1522 1546 1545 1521 +f 1526 1550 1548 1524 +f 1530 1554 1553 1529 +f 1534 1558 1557 1533 +f 1538 1562 1561 1537 +f 1542 1566 1565 1541 +f 1546 1570 1569 1545 +f 1550 1574 1572 1548 +f 1554 1578 1577 1553 +f 1558 1582 1581 1557 +f 1562 1586 1585 1561 +f 1566 1590 1589 1565 +f 1570 1594 1593 1569 +f 1574 1598 1596 1572 +f 1578 1602 1601 1577 +f 1582 1606 1605 1581 +f 1586 1610 1609 1585 +f 1590 1614 1613 1589 +f 1594 1618 1617 1593 +f 1598 1622 1620 1596 +f 1602 1626 1625 1601 +f 1606 1630 1629 1605 +f 1610 1634 1633 1609 +f 1614 1638 1637 1613 +f 1618 1642 1641 1617 +f 1622 1646 1644 1620 +f 1626 1650 1649 1625 +f 1630 1654 1653 1629 +f 1634 1658 1657 1633 +f 1638 1662 1661 1637 +f 1642 1666 1665 1641 +f 1646 1670 1668 1644 +f 1650 1674 1673 1649 +f 1654 1678 1677 1653 +f 1658 1682 1681 1657 +f 1662 1686 1685 1661 +f 1666 1690 1689 1665 +f 1670 1692 1668 +f 1674 1692 1673 +f 1678 1692 1677 +f 1682 1692 1681 +f 1686 1692 1685 +f 1690 1692 1689 +g arms +usemtl bronze +f 2106 2107 1728 1726 1725 2029 +f 2936 2922 2921 2753 +f 2892 2907 2908 2893 +f 2829 2815 2945 2943 +f 2945 2947 2948 2946 +f 2858 2890 2889 2872 +f 2753 2921 2938 2750 +f 2932 2776 2778 2933 +f 2928 2768 2770 2929 +f 2924 2757 2758 2925 +f 2918 2933 2934 2919 +f 2914 2929 2930 2915 +f 2910 2925 2926 2911 +f 2904 2919 2920 2905 +f 2900 2915 2916 2901 +f 2896 2911 2912 2897 +f 2891 2906 2907 2892 +f 2882 2901 2902 2883 +f 2878 2897 2898 2879 +f 2873 2893 2894 2874 +f 2869 2884 2885 2870 +f 2865 2880 2881 2866 +f 2861 2875 2876 2877 2862 +f 2856 2870 2871 2857 +f 2851 2866 2867 2852 +f 2847 2862 2863 2848 +f 2843 2858 2859 2844 +f 2838 2853 2852 2854 2839 +f 2834 2848 2849 2835 +f 2830 2844 2845 2831 +f 2825 2839 2840 2826 +f 2821 2835 2836 2822 +f 2817 2831 2832 2818 +f 2812 2826 2827 2813 +f 2808 2822 2823 2809 +f 2804 2818 2819 2805 +f 2797 2813 2814 2798 +f 2793 2809 2810 2794 +f 2789 2805 2806 2790 +f 2800 2801 2802 2786 +f 2775 2795 2796 2777 +f 2767 2791 2792 2769 +f 2756 2787 2788 2759 +f 2778 2777 2779 2780 +f 2770 2769 2771 2772 +f 2761 2758 2760 2759 2762 2763 +f 2721 2649 2726 2749 2326 2325 +f 2729 2730 2334 2332 +f 2652 2733 2344 2343 +f 2736 2660 2360 2358 +f 2739 2740 2370 2368 +f 2742 2743 2380 2378 +f 2745 2683 2390 2388 +f 2688 2691 2406 2405 +f 2747 2748 2418 2416 +f 2669 2672 2641 2631 +f 2725 2661 2574 2666 +f 2662 2723 2711 2663 +f 2696 2748 2647 2613 +f 2693 2690 2606 2610 +f 2685 2682 2597 2561 +f 2677 2593 2594 2676 +f 2628 2697 2612 2622 +f 2678 2569 2566 2576 +f 2742 2741 2573 2575 +f 2739 2738 2662 2661 +f 2736 2735 2715 2713 +f 2656 2733 2718 2614 +f 2731 2730 2702 2700 +f 2727 2726 2704 2722 +f 2586 2724 2725 2666 2584 +f 2606 2605 2610 +f 2723 2643 2587 2711 +f 2681 2648 2562 2596 +f 2658 2657 2353 2350 +f 2683 2682 2393 2390 +f 2691 2690 2409 2406 +f 2642 2634 2633 2639 +f 2627 2719 2697 2628 +f 2624 2680 2679 2625 +f 2651 2714 2716 2718 +f 2714 2712 2713 2715 +f 2705 2667 2701 2708 2706 +f 2583 2699 2700 2577 2568 +f 2613 2647 2648 2611 +f 2606 2690 2691 2607 +f 2600 2686 2687 2601 +f 2597 2682 2683 2598 +f 2677 2678 2590 2593 +f 2668 2671 2581 2595 +f 2632 2621 2620 2630 +f 2566 2569 2572 2567 +f 2643 2659 2660 2644 +f 2636 2649 2650 2637 +f 2633 2634 2635 2636 2637 2638 +f 2618 2619 2579 2620 2621 2622 +f 2605 2606 2607 2608 +f 2581 2594 2595 +f 2582 2583 2568 +f 2569 2570 2571 2572 +f 2515 2560 2516 +f 2549 2548 2437 +f 2510 2512 2494 2497 +f 2551 2482 2481 +f 2450 2449 2530 2529 +f 2545 2502 2431 +f 2559 2474 2553 2558 +f 2352 2529 2530 2347 +f 2521 2520 2446 2543 +f 2500 2503 2506 2505 +f 2496 2429 2426 2509 +f 2495 2493 2437 2548 +f 2556 2439 2488 2487 2557 +f 2443 2484 2550 2440 +f 2481 2480 2440 2551 +f 2474 2559 2475 +f 2517 2516 2560 2453 +f 2463 2508 2425 2468 +f 2458 2457 2526 2525 +f 2451 2450 2529 2528 +f 2436 2439 2556 2555 +f 2435 2434 2422 2539 +f 2431 2430 2546 2545 +f 2412 2407 2410 2413 +f 2396 2391 2394 2397 +f 2362 2359 2360 2363 +f 2324 2323 2421 2424 2325 +f 2537 2464 2463 2468 +f 2519 2461 2447 +f 2544 2545 2546 2547 +f 2323 2322 2537 2538 +f 2331 2333 2535 2536 +f 2342 2341 2448 2531 +f 2351 2355 2527 2528 +f 2361 2365 2460 2459 +f 2374 2373 2520 2521 +f 2381 2383 2516 2517 +f 2425 2508 2509 2426 +f 2496 2497 2498 2499 +f 2385 2389 2487 2488 +f 2404 2403 2480 2481 +f 2415 2417 2474 2475 +f 2463 2464 2465 2466 +f 2448 2449 2450 2451 +f 2433 2434 2435 +f 2419 2417 2418 2420 +f 2407 2408 2409 2410 +f 2391 2392 2393 2394 +f 2381 2379 2380 2382 +f 2371 2369 2370 2372 +f 2361 2362 2363 2364 +f 2351 2352 2353 2354 +f 2339 2337 2338 2340 +f 2331 2329 2330 2332 +f 2153 2170 2186 2200 2214 2229 2243 2258 2277 2292 2307 2154 +f 2172 2171 2124 2157 +f 2173 2172 2157 2319 +f 2230 2215 2313 2262 +f 2313 2315 2316 2314 +f 2278 2263 2312 2311 +f 2306 2152 2154 2307 +f 2302 2144 2146 2309 2303 +f 2298 2133 2136 2299 +f 2294 2308 2126 2295 +f 2288 2303 2304 2289 +f 2284 2299 2300 2285 +f 2280 2295 2296 2281 +f 2274 2289 2290 2275 +f 2270 2285 2286 2271 +f 2266 2281 2282 2267 +f 2256 2275 2276 2257 +f 2252 2271 2272 2253 +f 2247 2267 2268 2248 +f 2259 2260 2261 2262 +f 2239 2254 2255 2240 +f 2235 2250 2251 2236 +f 2231 2245 2246 2232 +f 2226 2240 2241 2227 +f 2221 2236 2237 2222 +f 2217 2232 2233 2218 +f 2212 2227 2228 2213 +f 2208 2222 2223 2209 +f 2204 2218 2219 2205 +f 2199 2213 2214 2200 +f 2195 2209 2210 2196 +f 2191 2205 2206 2192 +f 2187 2201 2202 2188 +f 2182 2196 2197 2183 +f 2178 2192 2193 2179 +f 2174 2188 2189 2175 +f 2167 2183 2184 2168 +f 2163 2179 2180 2164 +f 2159 2175 2176 2160 +f 2151 2169 2170 2153 +f 2143 2165 2166 2145 +f 2134 2161 2162 2137 +f 2123 2155 2156 2157 2124 +f 2146 2145 2147 2148 +f 2136 2138 2137 2139 2140 +f 2126 2127 2128 2129 +f 2099 2100 1702 1700 +f 2103 2104 1710 1708 +f 2027 2030 1722 1721 +f 2109 2110 1738 1736 +f 2036 2113 1748 1747 +f 2116 1944 1756 1754 +f 2056 2059 1770 1769 +f 2064 2118 1786 1785 +f 2092 2022 1796 1795 +f 1952 1991 2052 1996 +f 1954 1960 2018 1955 +f 2006 2079 2075 2007 +f 2119 2118 2066 2067 +f 2061 2058 1972 1976 +f 2117 1943 1997 2051 +f 2044 2041 2040 2045 +f 2046 1963 2039 2077 +f 2116 2115 1961 2070 +f 2037 2112 2097 2096 1958 +f 2109 2031 2015 2095 +f 2106 2029 1988 2089 +f 2025 2104 2071 2026 +f 2101 2100 2082 2081 +f 2022 2092 2009 +f 2043 1992 1951 1953 +f 2070 1961 1960 1954 +f 2074 2081 2080 2073 +f 2025 2024 1715 1712 +f 2037 2036 1747 1744 +f 2059 2058 1773 1770 +f 2068 2069 2091 2092 1795 1792 +f 2003 2013 2012 2004 +f 1991 1952 1951 +f 1936 1935 2067 2066 +f 2086 2023 2026 2018 2017 +f 1959 1961 1947 2035 2083 +f 2007 2075 2076 2008 +f 1940 1948 1938 +f 2066 1981 1977 1936 +f 1975 2060 2061 1976 +f 1937 2056 2057 1933 +f 1997 1943 1942 1995 +f 1966 1965 1964 1967 +f 2040 2041 2042 2043 +f 1994 1984 1983 1990 +f 1957 2036 2037 1958 +f 1989 2027 2028 1986 +f 2015 2016 2017 2018 1960 1959 +f 1998 1999 2000 2001 +f 1983 1984 1985 +f 1971 1972 1973 +f 1959 1960 1961 +f 1948 1940 1949 1950 +f 1933 1934 1935 1936 1937 +f 1892 1891 1819 +f 1915 1894 1893 +f 1929 1859 1858 +f 1813 1850 1849 +f 1864 1861 1810 +f 1873 1914 1799 1804 +f 1714 1903 1904 1711 +f 1832 1816 1819 1833 +f 1882 1842 1841 1884 +f 1873 1872 1912 1914 +f 1869 1868 1881 1882 +f 1863 1862 1883 1886 +f 1858 1857 1930 1929 +f 1855 1854 1923 1922 +f 1784 1849 1850 1779 +f 1845 1791 1876 1879 +f 1844 1843 1907 1906 +f 1838 1837 1908 +f 1827 1826 1905 1904 +f 1892 1819 1818 +f 1810 1809 1865 1864 +f 1805 1807 1913 1912 +f 1799 1798 1801 1804 +f 1776 1771 1774 1777 +f 1758 1755 1756 1759 +f 1720 1717 1718 1721 +f 1925 1926 1927 1928 +f 1900 1899 1828 1823 +f 1922 1923 1812 +f 1912 1913 1914 +f 1699 1701 1837 1836 +f 1707 1709 1905 1906 +f 1719 1902 1720 +f 1729 1731 1897 1898 +f 1739 1741 1817 1816 +f 1749 1751 1890 1891 +f 1883 1884 1841 1885 +f 1872 1873 1874 1875 +f 1862 1863 1864 1865 +f 1768 1767 1856 1815 +f 1784 1783 1848 1849 +f 1841 1842 1843 1844 +f 1828 1829 1830 +f 1812 1813 1814 1815 +f 1797 1798 1799 1800 +f 1787 1783 1786 1788 +f 1771 1772 1773 1774 +f 1757 1758 1759 1760 +f 1749 1745 1748 1750 +f 1739 1737 1738 1740 +f 1729 1727 1728 1730 +f 1717 1713 1716 1718 +f 1707 1705 1706 1708 +f 1699 1694 1693 1698 1700 +f 1160 1158 1145 1146 +f 1156 1157 1095 1081 +f 1151 1152 1137 1138 +f 1137 1139 994 1008 +f 1149 1141 1142 1155 +f 1146 1145 1108 1123 +f 1118 1133 1134 1119 +f 1114 1129 1130 1115 +f 1110 1125 1126 1111 +f 1105 1119 1120 1106 +f 1101 1115 1116 1102 +f 1097 1111 1112 1098 +f 1092 1106 1107 1093 +f 1088 1102 1103 1089 +f 1084 1098 1099 1085 +f 1143 1144 1157 1156 +f 1075 1089 1090 1076 +f 1071 1085 1086 1072 +f 1067 1081 1082 1068 +f 1062 1077 1078 1063 +f 1058 1073 1074 1059 +f 1054 1069 1070 1065 1055 +f 1049 1063 1064 1050 +f 1045 1059 1060 1046 +f 1041 1055 1056 1042 +f 1150 1149 1052 1038 +f 1031 1036 1046 1047 1032 +f 1027 1042 1043 1028 +f 1023 1038 1039 1024 +f 1018 1032 1033 1019 +f 1014 1028 1029 1015 +f 1010 1024 1025 1011 +f 1005 1019 1020 1006 +f 1001 1015 1016 1002 +f 997 1011 1012 998 +f 992 1006 1007 993 +f 988 1002 1003 989 +f 984 998 999 985 +f 1153 1154 995 981 +f 975 990 991 976 +f 971 986 987 972 +f 967 982 983 968 +f 1134 976 977 1135 +f 1130 972 973 1131 +f 1127 1126 963 968 969 964 +f 960 806 805 961 772 771 +f 813 815 767 768 +f 823 826 761 763 +f 832 836 756 758 +f 842 846 751 753 +f 856 855 747 746 +f 863 865 742 743 +f 906 905 736 735 +f 921 923 727 728 +f 803 802 723 722 +f 945 946 947 948 +f 785 784 939 940 +f 958 957 933 934 +f 925 923 924 926 +f 909 910 911 912 +f 895 896 897 898 +f 953 952 885 886 +f 876 873 874 875 +f 863 861 862 864 +f 852 850 851 853 854 +f 842 843 844 845 +f 832 833 834 835 +f 819 820 821 822 +f 813 811 812 814 +f 802 803 804 +f 795 794 791 792 +f 864 862 784 785 +f 816 814 935 779 +f 819 823 763 765 +f 852 856 746 748 +f 905 910 733 736 +f 927 878 951 803 722 725 +f 955 954 881 884 +f 946 945 791 +f 944 798 926 924 +f 783 824 822 939 937 +f 781 862 860 936 782 +f 934 933 808 807 +f 931 870 869 +f 924 922 787 944 +f 915 914 909 912 +f 907 906 901 904 +f 897 896 891 894 +f 890 889 887 888 +f 885 952 796 795 +f 880 879 775 778 +f 857 856 852 854 +f 831 830 825 828 +f 844 841 937 939 784 781 +f 799 949 877 882 +f 775 879 930 +f 788 911 908 +f 781 784 862 +f 870 931 932 872 +f 904 773 798 944 907 +f 636 634 708 +f 697 640 637 +f 720 594 591 +f 707 574 572 +f 600 597 546 +f 613 694 535 540 +f 671 670 672 675 +f 647 645 708 558 +f 621 620 622 623 +f 613 612 695 694 +f 607 608 618 621 +f 603 602 627 626 +f 591 590 721 720 +f 583 582 704 706 +f 573 572 574 577 +f 564 567 616 615 +f 562 715 678 676 +f 559 682 680 +f 555 554 673 672 +f 636 708 551 +f 546 549 601 600 +f 545 544 693 695 +f 535 538 541 540 +f 580 585 734 731 +f 598 629 742 740 +f 664 669 762 759 +f 718 719 716 717 +f 659 657 711 553 +f 706 704 705 +f 695 693 694 +f 685 683 682 684 +f 677 674 673 676 +f 665 663 664 +f 656 654 653 655 +f 646 644 643 645 +f 635 633 632 634 +f 627 623 622 624 +f 612 613 610 611 +f 602 603 600 601 +f 588 589 586 587 +f 573 571 570 572 +f 622 620 715 562 +f 711 556 557 +f 705 707 550 587 +f 537 538 535 536 +f 569 571 727 726 +f 585 584 733 734 +f 599 598 740 741 +f 635 639 747 745 +f 646 648 751 750 +f 656 658 756 755 +f 669 668 761 762 +f 677 679 767 766 +f 685 689 533 772 770 +f 683 685 770 769 +f 674 677 766 764 +f 665 664 759 760 +f 654 656 755 754 +f 644 646 750 749 +f 633 635 745 744 +f 595 599 741 739 +f 581 580 731 732 +f 566 569 726 724 +f 541 542 539 540 +f 645 643 551 708 +f 649 647 558 712 +f 566 567 564 565 +f 576 577 574 575 +f 592 593 590 591 +f 605 602 601 604 +f 616 617 614 615 +f 626 627 624 625 +f 639 635 634 636 +f 648 646 645 647 +f 658 656 655 657 +f 668 669 666 667 +f 679 677 676 678 +f 689 685 684 686 +f 643 641 640 697 551 +f 575 574 707 +f 650 649 712 713 +f 718 717 720 721 +f 661 665 760 757 +f 592 595 739 737 +f 576 581 732 729 +f 536 535 694 693 +f 543 545 617 616 +f 547 546 597 596 +f 711 670 667 553 +f 556 711 657 655 +f 715 620 619 714 559 +f 676 673 554 563 562 +f 565 564 719 718 +f 576 575 578 581 +f 584 583 586 589 +f 592 591 594 595 +f 627 602 605 623 +f 699 609 606 702 +f 611 610 701 700 +f 626 625 628 629 +f 651 650 653 654 +f 688 687 690 692 +f 687 560 536 693 544 690 +f 700 703 548 716 614 611 +f 575 707 705 578 +f 702 606 604 +f 709 563 554 +f 603 626 629 598 +f 869 866 931 +f 791 945 792 +f 871 873 887 889 +f 790 915 912 +f 828 942 834 831 +f 793 955 884 +f 929 798 773 776 +f 834 833 829 831 +f 858 857 797 943 +f 883 882 877 880 +f 953 886 876 956 +f 893 890 792 945 +f 898 947 777 774 900 +f 908 907 789 788 +f 916 915 790 789 +f 929 926 798 +f 866 864 785 931 +f 875 780 933 957 +f 938 937 841 839 +f 942 941 835 834 +f 947 946 778 777 +f 951 950 804 803 +f 952 955 793 796 +f 917 921 728 730 +f 901 906 735 738 +f 840 843 752 754 +f 802 806 960 771 723 +f 810 808 933 780 +f 860 786 936 +f 793 794 795 796 +f 805 806 807 808 +f 815 813 814 816 +f 826 823 824 827 +f 836 832 835 837 +f 846 842 845 847 +f 855 856 857 858 +f 865 863 864 866 +f 875 957 956 876 +f 887 886 885 888 +f 899 895 898 900 +f 913 914 915 916 +f 928 925 926 929 +f 810 780 935 812 +f 828 827 941 942 +f 949 950 951 +f 928 927 725 724 +f 918 917 730 729 +f 902 901 738 737 +f 861 863 743 744 +f 850 852 748 749 +f 843 842 753 752 +f 833 832 758 757 +f 820 819 765 764 +f 811 813 768 769 +f 1123 965 1148 1146 +f 1128 1127 964 969 970 962 +f 1131 973 974 1132 +f 1135 977 978 1136 +f 968 983 984 969 +f 972 987 988 973 +f 976 991 992 977 +f 981 995 996 982 +f 985 999 1000 986 +f 989 1003 1004 990 +f 1154 1152 1009 995 +f 998 1012 1013 999 +f 1002 1016 1017 1003 +f 1006 1020 1021 1007 +f 1011 1025 1026 1012 +f 1015 1029 1030 1016 +f 1019 1033 1034 1020 +f 1024 1039 1040 1025 +f 1028 1043 1044 1029 +f 1032 1047 1048 1033 +f 1038 1052 1053 1039 +f 1042 1056 1057 1043 +f 1046 1060 1061 1047 +f 1149 1155 1067 1052 +f 1055 1065 1070 1071 1056 +f 1059 1074 1075 1060 +f 1063 1078 1079 1064 +f 1068 1082 1083 1069 +f 1072 1086 1087 1073 +f 1076 1090 1091 1077 +f 1081 1095 1096 1082 +f 1085 1099 1100 1086 +f 1089 1103 1104 1090 +f 1144 1145 1158 1157 +f 1098 1112 1113 1099 +f 1102 1116 1117 1103 +f 1106 1120 1121 1107 +f 1111 1126 1127 1112 +f 1115 1130 1131 1116 +f 1119 1134 1135 1120 +f 1145 1144 1094 1108 +f 1141 1147 1037 1051 +f 1139 1140 980 994 +f 1152 1154 1139 1137 +f 1157 1158 1109 1095 +f 1080 1066 1051 1037 1022 1008 994 980 979 965 1123 1108 1094 +f 1701 1699 1700 1702 +f 1709 1707 1708 1710 +f 1719 1720 1721 1722 +f 1731 1729 1730 1732 +f 1741 1739 1740 1742 +f 1751 1749 1750 1752 +f 1761 1757 1760 1762 +f 1775 1776 1777 1778 +f 1789 1787 1788 1790 +f 1801 1802 1803 1804 +f 1816 1817 1818 1819 +f 1831 1832 1833 1834 +f 1789 1791 1845 1846 +f 1780 1779 1850 1851 +f 1764 1763 1857 1858 +f 1866 1862 1865 1867 +f 1876 1877 1878 1879 +f 1886 1883 1885 1887 +f 1745 1749 1891 1892 +f 1737 1739 1816 1832 +f 1727 1729 1898 1899 +f 1713 1717 1821 1820 +f 1705 1707 1906 1907 +f 1694 1699 1836 1909 +f 1817 1895 1894 1915 1818 +f 1851 1850 1813 +f 1896 1831 1834 1924 +f 1925 1928 1929 1930 +f 1724 1719 1722 1725 +f 1764 1761 1762 1765 +f 1780 1775 1778 1781 +f 1800 1799 1914 1913 +f 1806 1805 1877 1876 +f 1811 1810 1861 1860 +f 1828 1903 1820 1823 +f 1829 1828 1899 1898 +f 1843 1842 1880 1835 1838 +f 1906 1905 1826 1932 1844 +f 1846 1845 1926 1925 +f 1780 1851 1852 1775 +f 1772 1855 1856 1767 +f 1764 1858 1859 1761 +f 1883 1862 1866 1884 +f 1919 1871 1870 1920 +f 1875 1874 1917 1916 +f 1886 1887 1888 1755 +f 1734 1896 1897 1731 +f 1695 1910 1911 1793 +f 1910 1839 1800 1913 1807 1911 +f 1916 1921 1808 1927 1878 1875 +f 1851 1813 1812 1852 +f 1920 1870 1867 +f 1825 1932 1826 +f 1863 1886 1755 1758 +f 1938 1939 1940 +f 1951 1952 1953 +f 1962 1963 1964 1965 +f 1974 1975 1976 +f 1986 1987 1988 1989 +f 2002 2003 2004 +f 2019 1935 1934 2020 +f 1988 2029 2030 1989 +f 1945 1957 1956 2038 +f 1993 2001 2000 1994 +f 2044 2045 2046 2047 +f 2048 1966 1953 1952 +f 2051 2052 2053 1968 1970 +f 1973 1937 1980 1971 +f 1979 1975 1974 1980 +f 2019 2067 1935 +f 1939 2070 1954 1940 +f 2077 2078 2075 2079 +f 2084 2017 2016 2085 +f 1987 2088 2089 1988 +f 2052 1991 1990 2053 +f 2091 2010 2009 2092 +f 2041 2003 2002 2042 +f 2065 2064 1785 1782 +f 2057 2056 1769 1766 +f 2032 2031 1735 1732 +f 2022 2021 2093 1697 1796 +f 2094 2076 2075 2078 +f 1947 1946 2035 +f 2002 1992 2043 2042 +f 2098 2021 2008 2076 +f 2102 2101 2081 2074 +f 2105 2024 2023 2090 +f 2107 2106 2089 2087 +f 2110 2109 2095 2034 +f 2113 2036 1957 1945 +f 1944 2116 2070 1939 +f 2077 2079 2047 2046 +f 1964 2045 2040 1967 +f 2055 2117 2051 1970 +f 2063 2060 1975 1979 +f 2120 2119 2067 2019 +f 2094 2078 2080 2082 +f 1986 2090 2088 1987 +f 1999 2010 2091 +f 2120 2068 1792 1790 +f 2062 2065 1782 1781 +f 2054 2057 1766 1765 +f 2115 2116 1754 1752 +f 2112 2037 1744 1742 +f 2031 2109 1736 1735 +f 2105 2028 1718 1716 +f 2102 2103 1708 1706 +f 2121 2098 2099 1700 1698 +f 2130 2129 2128 2131 2132 +f 2140 2139 2141 2142 +f 2148 2147 2149 2150 +f 2127 2158 2159 2128 +f 2137 2162 2163 2139 +f 2145 2166 2167 2147 +f 2127 2171 2172 2158 +f 2160 2176 2177 2161 +f 2164 2180 2181 2165 +f 2168 2184 2185 2169 +f 2175 2189 2190 2176 +f 2179 2193 2194 2180 +f 2183 2197 2198 2184 +f 2188 2202 2203 2189 +f 2192 2206 2207 2193 +f 2196 2210 2211 2197 +f 2201 2215 2216 2202 +f 2205 2219 2220 2206 +f 2209 2223 2224 2225 2210 +f 2213 2228 2229 2214 +f 2218 2233 2234 2219 +f 2222 2237 2238 2223 +f 2227 2241 2242 2228 +f 2232 2246 2247 2233 +f 2236 2251 2252 2237 +f 2240 2255 2256 2241 +f 2261 2263 2264 2244 +f 2248 2268 2269 2250 +f 2253 2272 2273 2254 +f 2257 2276 2277 2258 +f 2267 2282 2283 2268 +f 2271 2286 2287 2272 +f 2275 2290 2291 2276 +f 2281 2296 2297 2282 +f 2285 2300 2301 2286 +f 2289 2304 2305 2290 +f 2295 2126 2129 2296 +f 2299 2136 2140 2300 +f 2303 2309 2146 2148 2304 +f 2308 2171 2127 2126 +f 2263 2261 2260 2312 +f 2315 2317 2318 2316 +f 2215 2201 2315 2313 +f 2244 2264 2265 2245 +f 2171 2308 2125 2124 +f 2321 2322 2323 2324 2325 2326 +f 2333 2331 2332 2334 +f 2341 2342 2343 2344 +f 2355 2351 2354 2356 +f 2365 2361 2364 2366 +f 2373 2374 2375 2376 +f 2383 2381 2382 2384 +f 2395 2396 2397 2398 +f 2411 2412 2413 2414 +f 2421 2422 2423 2424 +f 2436 2437 2438 2439 +f 2452 2453 2454 2455 +f 2425 2428 2467 2468 +f 2411 2415 2475 2476 +f 2400 2399 2482 2483 +f 2386 2385 2488 2489 +f 2430 2429 2496 2499 +f 2510 2509 2508 2470 +f 2379 2381 2517 2518 +f 2445 2369 2371 2522 2523 +f 2362 2361 2459 2524 +f 2352 2351 2528 2529 +f 2337 2339 2532 2533 +f 2329 2331 2536 2465 +f 2421 2539 2422 +f 2544 2547 2548 2549 +f 2518 2517 2453 2452 +f 2536 2535 2471 2466 +f 2342 2339 2340 2343 +f 2374 2371 2372 2375 +f 2400 2395 2398 2401 +f 2422 2434 2504 2419 2420 2423 +f 2432 2431 2502 2501 +f 2436 2549 2437 +f 2559 2442 2476 2475 +f 2532 2531 2456 2458 2455 +f 2519 2518 2552 2462 2461 +f 2468 2467 2538 2537 +f 2560 2515 2513 +f 2477 2476 2442 2441 +f 2404 2481 2482 2399 +f 2396 2443 2485 2391 +f 2386 2489 2492 2491 +f 2494 2495 2498 2497 +f 2430 2499 2547 2546 +f 2507 2506 2555 2554 +f 2374 2521 2522 2371 +f 2348 2530 2449 2345 +f 2455 2458 2525 2524 2552 2452 +f 2433 2540 2500 2505 +f 2554 2473 2507 +f 2550 2484 2483 +f 2552 2518 2452 +f 2560 2513 2469 2472 +f 2559 2558 2485 2443 2442 +f 2573 2574 2575 +f 2584 2585 2586 +f 2596 2597 2598 +f 2605 2609 2610 +f 2623 2624 2625 +f 2639 2640 2641 2642 +f 2651 2652 2653 2654 +f 2661 2662 2663 2574 +f 2667 2591 2590 2578 +f 2629 2640 2639 2626 +f 2673 2592 2591 2674 +f 2677 2570 2569 2678 +f 2561 2597 2596 2562 +f 2604 2600 2599 2602 +f 2609 2692 2693 2610 +f 2696 2613 2612 2697 +f 2701 2577 2700 2702 +f 2708 2709 2710 +f 2583 2646 2654 2699 +f 2573 2666 2574 +f 2580 2624 2623 2676 +f 2638 2627 2626 2633 +f 2675 2642 2641 2672 +f 2689 2688 2405 2402 +f 2572 2571 2387 2384 +f 2656 2655 2349 2346 +f 2611 2648 2681 2618 +f 2715 2717 2716 2714 +f 2599 2608 2602 +f 2626 2639 2633 +f 2728 2727 2722 2710 +f 2732 2731 2700 2699 +f 2658 2655 2617 +f 2660 2736 2713 2644 +f 2740 2739 2661 2725 +f 2743 2742 2575 2589 +f 2590 2678 2576 2578 +f 2640 2629 2621 2632 +f 2570 2677 2676 2623 +f 2687 2684 2565 2601 +f 2746 2692 2609 2694 +f 2667 2578 2577 2701 +f 2714 2645 2712 +f 2605 2608 2565 2564 +f 2675 2707 2634 2642 +f 2746 2747 2416 2414 +f 2686 2689 2402 2401 +f 2571 2745 2388 2387 +f 2741 2742 2378 2376 +f 2738 2739 2368 2366 +f 2735 2736 2358 2356 +f 2732 2653 2340 2338 +f 2728 2729 2332 2330 +f 2750 2751 2752 2753 +f 2764 2761 2763 2762 2765 2766 +f 2772 2771 2773 2774 +f 2780 2779 2781 2782 +f 2759 2788 2789 2762 +f 2769 2792 2793 2771 +f 2777 2796 2797 2779 +f 2786 2802 2803 2787 +f 2790 2806 2807 2791 +f 2794 2810 2811 2795 +f 2801 2815 2816 2802 +f 2805 2819 2820 2806 +f 2809 2823 2824 2810 +f 2813 2827 2828 2814 +f 2818 2832 2833 2819 +f 2822 2836 2837 2823 +f 2826 2840 2841 2827 +f 2831 2845 2846 2832 +f 2835 2849 2850 2836 +f 2839 2854 2855 2840 +f 2844 2859 2860 2845 +f 2848 2863 2864 2849 +f 2852 2867 2868 2854 +f 2858 2872 2873 2859 +f 2862 2877 2876 2878 2863 +f 2866 2881 2882 2867 +f 2870 2885 2886 2871 +f 2874 2894 2895 2875 +f 2879 2898 2899 2880 +f 2883 2902 2903 2884 +f 2893 2908 2909 2894 +f 2897 2912 2913 2898 +f 2901 2916 2917 2902 +f 2906 2921 2922 2907 +f 2911 2926 2927 2912 +f 2915 2930 2931 2916 +f 2919 2934 2935 2920 +f 2925 2758 2761 2926 +f 2929 2770 2772 2930 +f 2933 2778 2780 2934 +f 2921 2906 2939 2938 +f 2890 2941 2942 2887 +f 2947 2785 2784 2948 +f 2815 2801 2947 2945 +f 2907 2922 2923 2908 +f 2940 2888 2887 2942 2944 2946 2948 2784 2783 2751 2750 2938 2939 +f 2799 2936 2753 2752 +f 2872 2892 2893 2873 +f 2843 2829 2943 2941 +f 2943 2945 2946 2944 +f 2891 2889 2888 2940 +f 2936 2799 2755 2754 +f 2931 2937 2774 2776 2932 +f 2927 2764 2768 2928 +f 2923 2754 2757 2924 +f 2917 2932 2933 2918 +f 2913 2928 2929 2914 +f 2909 2924 2925 2910 +f 2903 2918 2919 2904 +f 2899 2914 2915 2900 +f 2895 2910 2911 2896 +f 2885 2904 2905 2886 +f 2881 2900 2901 2882 +f 2876 2896 2897 2878 +f 2889 2891 2892 2872 +f 2868 2883 2884 2869 +f 2864 2879 2880 2865 +f 2860 2874 2875 2861 +f 2855 2869 2870 2856 +f 2850 2865 2866 2851 +f 2846 2861 2862 2847 +f 2841 2856 2857 2842 +f 2837 2851 2852 2853 2838 +f 2833 2847 2848 2834 +f 2829 2843 2844 2830 +f 2824 2838 2839 2825 +f 2820 2834 2835 2821 +f 2816 2830 2831 2817 +f 2811 2825 2826 2812 +f 2807 2821 2822 2808 +f 2803 2817 2818 2804 +f 2796 2812 2813 2797 +f 2792 2808 2809 2793 +f 2788 2804 2805 2789 +f 2755 2799 2800 2786 +f 2773 2794 2795 2775 +f 2765 2790 2791 2767 +f 2755 2786 2787 2756 +f 2776 2775 2777 2778 +f 2768 2767 2769 2770 +f 2758 2757 2756 2759 2760 +f 2749 2726 2727 2328 2326 +f 2730 2731 2336 2334 +f 2733 2656 2346 2344 +f 2659 2737 2364 2363 +f 2740 2665 2372 2370 +f 2743 2744 2382 2380 +f 2682 2685 2394 2393 +f 2690 2693 2410 2409 +f 2748 2696 2420 2418 +f 2627 2638 2719 +f 2614 2718 2716 2615 +f 2722 2706 2708 2710 +f 2748 2747 2695 2647 +f 2691 2688 2603 2607 +f 2683 2745 2679 2598 +f 2592 2673 2668 2595 +f 2705 2707 2675 2674 +f 2572 2744 2698 2567 +f 2741 2664 2585 2573 +f 2738 2737 2723 2662 +f 2735 2734 2717 2715 +f 2733 2652 2651 2718 +f 2730 2729 2709 2702 +f 2726 2649 2636 2704 +f 2630 2620 2671 2670 +f 2575 2574 2663 +f 2722 2704 2703 2706 +f 2650 2649 2721 2325 2424 +f 2660 2659 2363 2360 +f 2685 2684 2397 2394 +f 2693 2692 2413 2410 +f 2669 2631 2630 2670 +f 2719 2638 2637 2720 +f 2680 2619 2618 2681 +f 2615 2716 2717 2616 +f 2712 2645 2644 2713 +f 2705 2706 2703 2707 +f 2567 2698 2582 2568 +f 2647 2695 2563 +f 2607 2603 2602 2608 +f 2601 2565 2608 2599 +f 2679 2680 2681 2596 2598 +f 2676 2594 2581 2580 +f 2672 2673 2674 2675 +f 2621 2629 2628 2622 +f 2573 2585 2584 2666 +f 2616 2657 2658 2617 +f 2647 2563 2562 2648 +f 2630 2631 2632 +f 2614 2615 2616 2617 +f 2602 2603 2604 +f 2590 2591 2592 2593 +f 2579 2580 2581 +f 2566 2567 2568 +f 2491 2514 2383 2386 +f 2453 2560 2454 +f 2548 2498 2495 +f 2479 2441 2440 2480 +f 2544 2549 2436 2555 2506 2503 +f 2538 2467 2428 2541 2435 2539 +f 2323 2538 2539 2421 +f 2362 2524 2525 2359 +f 2514 2515 2516 2383 +f 2503 2502 2545 2544 +f 2547 2499 2498 2548 +f 2511 2490 2494 2512 +f 2392 2486 2487 2389 +f 2400 2483 2484 2395 +f 2408 2479 2480 2403 +f 2474 2473 2554 2553 +f 2534 2533 2454 2560 2472 +f 2471 2470 2508 2463 2466 +f 2457 2456 2527 2526 +f 2456 2531 2448 2451 +f 2439 2438 2489 2488 +f 2434 2433 2505 2504 +f 2428 2427 2542 2541 +f 2408 2403 2406 2409 +f 2392 2389 2390 2393 +f 2352 2347 2350 2353 +f 2553 2556 2557 2558 +f 2524 2459 2462 2552 +f 2479 2478 2441 +f 2445 2523 2522 2543 2446 +f 2322 2327 2464 2537 +f 2333 2335 2534 2535 +f 2341 2345 2449 2448 +f 2355 2357 2526 2527 +f 2365 2367 2444 2460 +f 2373 2377 2519 2520 +f 2514 2511 2513 2515 +f 2504 2505 2506 2507 +f 2494 2490 2493 2495 +f 2392 2391 2485 2486 +f 2408 2407 2478 2479 +f 2417 2419 2473 2474 +f 2459 2460 2461 2462 +f 2444 2445 2446 2447 +f 2429 2430 2431 2432 +f 2417 2415 2416 2418 +f 2403 2404 2405 2406 +f 2389 2385 2388 2390 +f 2379 2377 2378 2380 +f 2369 2367 2368 2370 +f 2359 2357 2358 2360 +f 2347 2348 2349 2350 +f 2337 2335 2336 2338 +f 2329 2327 2328 2330 +f 2312 2260 2259 2314 2316 2318 2320 2156 2155 2123 2122 2310 2311 +f 2279 2294 2295 2280 +f 2187 2173 2319 2317 +f 2319 2157 2156 2320 +f 2262 2313 2314 2259 +f 2293 2278 2311 2310 +f 2305 2150 2152 2306 +f 2301 2142 2144 2302 +f 2297 2130 2133 2298 +f 2291 2306 2307 2292 +f 2287 2302 2303 2288 +f 2283 2298 2299 2284 +f 2278 2293 2294 2279 +f 2273 2288 2289 2274 +f 2269 2284 2285 2270 +f 2265 2280 2281 2266 +f 2255 2274 2275 2256 +f 2251 2270 2271 2252 +f 2246 2266 2267 2247 +f 2242 2257 2258 2243 +f 2238 2253 2254 2239 +f 2234 2249 2248 2250 2235 +f 2230 2244 2245 2231 +f 2224 2239 2240 2226 +f 2220 2235 2236 2221 +f 2216 2231 2232 2217 +f 2211 2226 2227 2212 +f 2207 2221 2222 2208 +f 2203 2217 2218 2204 +f 2198 2212 2213 2199 +f 2194 2208 2209 2195 +f 2190 2204 2205 2191 +f 2185 2199 2200 2186 +f 2181 2195 2196 2182 +f 2177 2191 2192 2178 +f 2173 2187 2188 2174 +f 2166 2182 2183 2167 +f 2162 2178 2179 2163 +f 2158 2174 2175 2159 +f 2149 2168 2169 2151 +f 2141 2164 2165 2143 +f 2131 2160 2161 2134 +f 2152 2151 2153 2154 +f 2144 2143 2145 2146 +f 2136 2133 2135 2134 2137 2138 +f 2122 2123 2124 2125 +f 2100 2101 1704 1702 +f 2104 2025 1712 1710 +f 2107 2108 1730 1728 +f 2110 2111 1740 1738 +f 2113 2114 1750 1748 +f 1943 2117 1760 1759 +f 2058 2061 1774 1773 +f 2118 2119 1788 1786 +f 2047 2079 2006 2014 +f 1977 1980 1937 1936 +f 2086 2017 2084 +f 2039 1950 1949 2073 +f 2118 2064 1981 2066 +f 2059 2056 1937 1973 +f 1942 2049 2048 1995 +f 2012 2001 1993 2004 +f 1962 2050 1948 1950 +f 2115 2114 1947 1961 +f 2112 2111 2033 2097 +f 2032 2108 2085 2016 +f 2030 2027 1989 +f 2104 2103 2072 2071 +f 2100 2099 2094 2082 +f 1998 2011 2005 +f 1971 1980 1974 +f 2087 2089 2088 2086 +f 1983 2020 2053 1990 +f 2028 2027 1721 1718 +f 1944 1943 1759 1756 +f 2061 2060 1777 1774 +f 2047 2014 2013 2044 +f 2010 1999 1998 2005 +f 1952 1996 1995 2048 +f 1945 2038 1946 +f 1955 2018 2026 2071 +f 2080 2081 2082 +f 2073 1949 2072 2074 +f 2068 1985 1984 2069 +f 1981 2064 2065 1982 +f 1976 1972 1971 1974 +f 1933 1969 1968 1934 +f 2049 1942 1941 2050 +f 2045 1964 1963 2046 +f 2001 2012 2011 1998 +f 2039 1963 1962 1950 +f 2033 2034 2035 1946 +f 2023 2024 2025 2026 +f 2011 2012 2013 2014 +f 1995 1996 1997 +f 1977 1981 1982 +f 1968 1969 1970 +f 1956 1957 1958 +f 1945 1946 1947 +f 1931 1930 1857 1815 1814 +f 1932 1885 1841 1844 +f 1924 1890 1824 +f 1922 1856 1855 +f 1926 1845 1879 +f 1805 1912 1872 1877 +f 1827 1830 1897 1896 1924 1824 +f 1720 1902 1821 1717 +f 1746 1893 1894 1743 +f 1879 1878 1927 1926 +f 1802 1871 1919 1918 +f 1866 1867 1870 1869 +f 1758 1861 1864 1863 +f 1768 1815 1857 1763 +f 1776 1853 1854 1771 +f 1849 1848 1814 1813 +f 1932 1887 1885 +f 1840 1839 1910 1909 +f 1891 1890 1924 1834 1833 +f 1904 1903 1828 1830 1827 +f 1931 1814 1848 1847 +f 1808 1921 1809 +f 1804 1803 1874 1873 +f 1794 1806 1876 1791 1792 1795 +f 1772 1767 1770 1773 +f 1746 1743 1744 1747 +f 1714 1711 1712 1715 +f 1908 1907 1843 1838 +f 1890 1889 1825 1824 +f 1916 1919 1920 1921 +f 1793 1911 1794 +f 1701 1703 1908 1837 +f 1709 1711 1904 1905 +f 1724 1723 1900 1901 +f 1734 1733 1831 1896 +f 1817 1741 1743 1894 1895 +f 1751 1753 1889 1890 +f 1882 1881 1880 1842 +f 1802 1801 1868 1871 +f 1758 1757 1860 1861 +f 1772 1771 1854 1855 +f 1783 1787 1847 1848 +f 1797 1800 1839 1840 +f 1824 1825 1826 1827 +f 1808 1809 1810 1811 +f 1793 1794 1795 1796 +f 1783 1784 1785 1786 +f 1767 1768 1769 1770 +f 1755 1753 1754 1756 +f 1745 1746 1747 1748 +f 1737 1733 1736 1738 +f 1727 1723 1726 1728 +f 1713 1714 1715 1716 +f 1705 1703 1704 1706 +f 1693 1694 1695 1696 1697 1698 +f 1159 1160 1146 1148 +f 1155 1156 1081 1067 +f 1150 1151 1138 1147 +f 1138 1137 1008 1022 +f 1143 1142 1066 1080 +f 1160 1159 966 1124 +f 1117 1122 1132 1133 1118 +f 1113 1128 1129 1114 +f 1109 1124 1125 1110 +f 1104 1118 1119 1105 +f 1100 1114 1115 1101 +f 1096 1110 1111 1097 +f 1091 1105 1106 1092 +f 1087 1101 1102 1088 +f 1083 1097 1098 1084 +f 1078 1092 1093 1079 +f 1074 1088 1089 1075 +f 1070 1084 1085 1071 +f 1142 1143 1156 1155 +f 1061 1076 1077 1062 +f 1057 1072 1073 1058 +f 1053 1068 1069 1054 +f 1048 1062 1063 1049 +f 1044 1058 1059 1045 +f 1040 1054 1055 1041 +f 1034 1049 1050 1035 +f 1030 1045 1046 1036 1031 +f 1026 1041 1042 1027 +f 1151 1150 1038 1023 +f 1017 1031 1032 1018 +f 1013 1027 1028 1014 +f 1009 1023 1024 1010 +f 1004 1018 1019 1005 +f 1000 1014 1015 1001 +f 996 1010 1011 997 +f 991 1005 1006 992 +f 987 1001 1002 988 +f 983 997 998 984 +f 966 1159 1153 981 +f 974 989 990 975 +f 970 985 986 971 +f 966 981 982 967 +f 1133 975 976 1134 +f 1129 971 972 1130 +f 1126 1125 967 968 963 +f 961 805 809 770 772 +f 815 817 766 767 +f 826 825 762 761 +f 836 838 755 756 +f 846 848 750 751 +f 855 859 745 747 +f 896 895 741 740 +f 910 909 734 733 +f 923 925 726 727 +f 956 957 958 959 +f 787 789 907 944 +f 783 937 938 +f 874 872 932 779 +f 923 921 922 924 +f 905 906 907 908 +f 891 892 893 894 +f 881 882 883 884 +f 871 867 870 872 +f 861 859 860 862 +f 850 848 849 851 +f 840 838 839 841 +f 829 830 831 +f 820 817 818 821 +f 811 809 810 812 +f 799 800 801 +f 788 789 790 +f 837 835 941 783 +f 775 776 777 778 +f 825 830 759 762 +f 865 896 740 742 +f 909 914 731 734 +f 956 959 954 953 +f 950 949 799 801 +f 945 948 894 893 +f 858 943 786 +f 940 939 822 821 +f 935 814 812 +f 779 932 818 816 +f 927 930 879 878 +f 922 921 917 920 +f 912 911 788 790 +f 904 903 774 773 +f 892 891 868 867 +f 886 887 873 876 +f 882 881 800 799 +f 874 873 871 872 +f 849 847 936 786 +f 824 823 819 822 +f 800 881 954 959 +f 894 948 897 +f 787 922 920 +f 774 903 900 +f 797 857 854 +f 858 786 860 +f 696 721 590 587 550 +f 563 624 622 562 +f 713 632 710 +f 706 586 583 +f 719 564 615 +f 545 695 612 617 +f 555 557 653 650 713 710 +f 664 663 666 669 +f 638 637 640 642 +f 615 614 716 719 +f 542 609 699 698 +f 605 604 606 607 +f 598 597 600 603 +f 588 587 590 593 +f 580 579 582 585 +f 572 570 550 707 +f 563 625 624 +f 561 560 687 686 +f 634 632 713 712 558 +f 672 670 711 557 555 +f 696 550 570 568 +f 548 703 549 +f 540 539 610 613 +f 691 543 616 567 725 722 +f 584 589 736 733 +f 638 642 748 746 +f 671 675 765 763 +f 680 678 715 559 +f 632 630 709 710 +f 700 699 702 703 +f 692 690 691 +f 683 681 680 682 +f 674 675 672 673 +f 661 662 659 660 +f 651 652 649 650 +f 643 644 642 640 641 +f 633 631 630 632 +f 621 618 619 620 +f 542 541 608 609 +f 598 599 596 597 +f 584 585 582 583 +f 571 569 568 570 +f 537 536 560 561 +f 710 709 554 555 +f 548 549 546 547 +f 692 691 722 723 +f 571 573 728 727 +f 589 588 735 736 +f 629 631 743 742 +f 639 638 746 747 +f 648 652 753 751 +f 658 662 758 756 +f 668 671 763 761 +f 679 681 768 767 +f 533 689 688 534 771 772 +f 681 683 769 768 +f 675 674 764 765 +f 662 661 757 758 +f 652 651 752 753 +f 642 644 749 748 +f 631 633 744 743 +f 593 592 737 738 +f 577 576 729 730 +f 567 566 724 725 +f 545 543 544 +f 667 666 552 553 +f 714 684 682 559 +f 569 566 565 568 +f 580 581 578 579 +f 599 595 594 596 +f 608 607 606 609 +f 537 619 618 538 +f 631 629 628 630 +f 638 639 636 637 +f 652 648 647 649 +f 662 658 657 659 +f 671 668 667 670 +f 681 679 678 680 +f 688 689 686 687 +f 700 701 698 699 +f 634 558 708 +f 686 684 714 561 +f 534 688 692 723 771 +f 651 654 754 752 +f 588 593 738 735 +f 573 577 730 728 +f 539 542 698 701 +f 544 543 691 690 +f 548 547 717 716 +f 553 552 660 659 +f 557 556 655 653 +f 714 619 537 561 +f 630 628 563 709 +f 565 696 568 +f 579 578 705 704 +f 587 586 706 705 +f 717 547 596 594 720 +f 604 601 549 702 +f 608 541 538 618 +f 612 611 614 617 +f 637 636 551 697 +f 661 660 663 665 +f 696 565 718 721 +f 701 610 539 +f 552 666 663 660 +f 704 582 579 +f 621 623 605 607 +f 703 702 549 +f 625 563 628 +f 868 891 896 865 +f 785 940 931 +f 792 890 888 +f 787 919 916 789 +f 778 946 791 794 883 880 +f 801 958 934 807 804 950 +f 807 806 802 804 +f 844 843 840 841 +f 869 868 865 866 +f 884 883 794 793 +f 885 795 792 888 +f 892 867 871 889 +f 903 902 899 900 +f 911 910 905 908 +f 919 918 913 916 +f 930 929 776 775 +f 940 821 818 932 931 +f 875 874 779 935 780 +f 783 938 839 837 +f 824 783 941 827 +f 948 947 898 897 +f 949 951 878 877 +f 959 958 801 800 +f 913 918 729 732 +f 899 902 737 739 +f 829 833 757 760 +f 777 776 773 774 +f 845 844 781 782 +f 919 787 920 +f 854 853 851 943 797 +f 809 805 808 810 +f 817 815 816 818 +f 825 826 827 828 +f 838 836 837 839 +f 848 846 847 849 +f 859 855 858 860 +f 867 868 869 870 +f 877 878 879 880 +f 892 889 890 893 +f 901 902 903 904 +f 917 918 919 920 +f 927 928 929 930 +f 847 845 782 936 +f 851 849 786 943 +f 952 953 954 955 +f 925 928 724 726 +f 914 913 732 731 +f 895 899 739 741 +f 859 861 744 745 +f 848 850 749 750 +f 838 840 754 755 +f 830 829 760 759 +f 817 820 764 766 +f 809 811 769 770 +f 1124 966 967 1125 +f 1128 962 970 971 1129 +f 1132 974 975 1133 +f 965 979 980 1140 1148 +f 969 984 985 970 +f 973 988 989 974 +f 977 992 993 978 +f 982 996 997 983 +f 986 1000 1001 987 +f 990 1004 1005 991 +f 995 1009 1010 996 +f 999 1013 1014 1000 +f 1003 1017 1018 1004 +f 1152 1151 1023 1009 +f 1012 1026 1027 1013 +f 1016 1030 1031 1017 +f 1020 1034 1035 1021 +f 1025 1040 1041 1026 +f 1029 1044 1045 1030 +f 1033 1048 1049 1034 +f 1039 1053 1054 1040 +f 1043 1057 1058 1044 +f 1047 1061 1062 1048 +f 1052 1067 1068 1053 +f 1056 1071 1072 1057 +f 1060 1075 1076 1061 +f 1051 1066 1142 1141 +f 1069 1083 1084 1070 +f 1073 1087 1088 1074 +f 1077 1091 1092 1078 +f 1082 1096 1097 1083 +f 1086 1100 1101 1087 +f 1090 1104 1105 1091 +f 1095 1109 1110 1096 +f 1099 1113 1114 1100 +f 1103 1117 1118 1104 +f 1158 1160 1124 1109 +f 1112 1127 1128 1113 +f 1116 1131 1132 1122 1117 +f 1120 1135 1136 1121 +f 1144 1143 1080 1094 +f 1147 1138 1022 1037 +f 1149 1150 1147 1141 +f 1154 1153 1140 1139 +f 1153 1159 1148 1140 +f 978 993 1007 1021 1035 1050 1064 1079 1093 1107 1121 1136 +f 1703 1701 1702 1704 +f 1711 1709 1710 1712 +f 1723 1724 1725 1726 +f 1733 1734 1735 1736 +f 1743 1741 1742 1744 +f 1753 1751 1752 1754 +f 1763 1764 1765 1766 +f 1779 1780 1781 1782 +f 1791 1789 1790 1792 +f 1805 1806 1807 +f 1820 1821 1822 1823 +f 1835 1836 1837 1838 +f 1787 1789 1846 1847 +f 1776 1775 1852 1853 +f 1757 1761 1859 1860 +f 1868 1869 1870 1871 +f 1797 1880 1881 1798 +f 1753 1755 1888 1889 +f 1746 1745 1892 1893 +f 1733 1737 1832 1831 +f 1723 1727 1899 1900 +f 1714 1713 1820 1903 +f 1703 1705 1907 1908 +f 1695 1694 1909 1910 +f 1916 1917 1918 1919 +f 1891 1833 1819 +f 1909 1836 1835 1840 +f 1696 1695 1793 1796 1697 +f 1734 1731 1732 1735 +f 1768 1763 1766 1769 +f 1784 1779 1782 1785 +f 1803 1802 1918 1917 +f 1807 1806 1794 1911 +f 1808 1811 1928 1927 +f 1823 1822 1901 1900 +f 1830 1829 1898 1897 +f 1835 1880 1797 1840 +f 1889 1888 1932 1825 +f 1846 1931 1847 +f 1853 1852 1812 1923 +f 1815 1856 1922 1812 +f 1928 1811 1860 1859 1929 +f 1867 1865 1809 1920 +f 1868 1801 1798 1881 +f 1872 1875 1878 1877 +f 1893 1892 1818 1915 +f 1724 1901 1902 1719 +f 1931 1846 1925 1930 +f 1917 1874 1803 +f 1822 1821 1902 1901 +f 1923 1854 1853 +f 1882 1884 1866 1869 +f 1921 1920 1809 +f 1887 1932 1888 +f 1941 1942 1943 1944 +f 1954 1955 1940 +f 1953 1966 1967 +f 1977 1978 1979 1980 +f 1990 1991 1951 1992 1993 1994 +f 2005 2006 2007 2008 2009 2010 +f 2008 2021 2022 2009 +f 2015 2031 2032 2016 +f 1938 1941 1944 1939 +f 2004 1993 1992 2002 +f 2040 2043 1953 1967 +f 2049 2050 1962 1965 +f 1969 2054 2055 1970 +f 1972 2058 2059 1973 +f 1978 2062 2063 1979 +f 1985 2019 2020 1983 +f 1955 2071 2072 1949 1940 +f 2077 2039 2073 2080 2078 +f 2086 2084 2085 2087 +f 2023 2086 2088 2090 +f 1996 2052 2051 1997 +f 1999 2091 2069 2000 +f 2014 2006 2005 2011 +f 2063 2062 1781 1778 +f 2055 2054 1765 1762 +f 2030 2029 1725 1722 +f 2053 2020 1934 1968 +f 2095 2015 1959 2083 +f 1978 1977 1982 +f 1958 2096 2097 2038 1956 +f 2099 2098 2076 2094 +f 2103 2102 2074 2072 +f 2028 2105 2090 1986 +f 2108 2107 2087 2085 +f 2111 2110 2034 2033 +f 2114 2113 1945 1947 +f 2050 1941 1938 1948 +f 2000 2069 1984 1994 +f 2049 1965 1966 2048 +f 2057 2054 1969 1933 +f 2065 2062 1978 1982 +f 2068 2120 2019 1985 +f 2034 2095 2083 2035 +f 2097 2033 1946 2038 +f 2041 2044 2013 2003 +f 2119 2120 1790 1788 +f 2060 2063 1778 1777 +f 2117 2055 1762 1760 +f 2114 2115 1752 1750 +f 2111 2112 1742 1740 +f 2108 2032 1732 1730 +f 2024 2105 1716 1715 +f 2101 2102 1706 1704 +f 2093 2021 2098 2121 1698 1697 +f 2133 2130 2132 2131 2134 2135 +f 2142 2141 2143 2144 +f 2150 2149 2151 2152 +f 2128 2159 2160 2131 +f 2139 2163 2164 2141 +f 2147 2167 2168 2149 +f 2172 2173 2174 2158 +f 2161 2177 2178 2162 +f 2165 2181 2182 2166 +f 2169 2185 2186 2170 +f 2176 2190 2191 2177 +f 2180 2194 2195 2181 +f 2184 2198 2199 2185 +f 2189 2203 2204 2190 +f 2193 2207 2208 2194 +f 2197 2211 2212 2198 +f 2202 2216 2217 2203 +f 2206 2220 2221 2207 +f 2210 2225 2224 2226 2211 +f 2215 2230 2231 2216 +f 2219 2234 2235 2220 +f 2223 2238 2239 2224 +f 2228 2242 2243 2229 +f 2233 2247 2248 2249 2234 +f 2237 2252 2253 2238 +f 2241 2256 2257 2242 +f 2245 2265 2266 2246 +f 2250 2269 2270 2251 +f 2254 2273 2274 2255 +f 2263 2278 2279 2264 +f 2268 2283 2284 2269 +f 2272 2287 2288 2273 +f 2276 2291 2292 2277 +f 2282 2297 2298 2283 +f 2286 2301 2302 2287 +f 2290 2305 2306 2291 +f 2296 2129 2130 2297 +f 2300 2140 2142 2301 +f 2304 2148 2150 2305 +f 2125 2293 2310 2122 +f 2230 2262 2261 2244 +f 2317 2319 2320 2318 +f 2201 2187 2317 2315 +f 2264 2279 2280 2265 +f 2308 2294 2293 2125 +f 2327 2322 2321 2326 2328 +f 2335 2333 2334 2336 +f 2345 2341 2344 2346 +f 2357 2355 2356 2358 +f 2367 2365 2366 2368 +f 2377 2373 2376 2378 +f 2385 2386 2387 2388 +f 2399 2400 2401 2402 +f 2415 2411 2414 2416 +f 2425 2426 2427 2428 +f 2440 2441 2442 2443 +f 2456 2457 2458 +f 2469 2470 2471 2472 +f 2412 2411 2476 2477 +f 2396 2395 2484 2443 +f 2490 2491 2492 2493 +f 2500 2501 2502 2503 +f 2511 2512 2469 2513 +f 2377 2379 2518 2519 +f 2367 2369 2445 2444 +f 2357 2359 2525 2526 +f 2347 2530 2348 +f 2335 2337 2533 2534 +f 2327 2329 2465 2464 +f 2540 2541 2542 +f 2550 2551 2440 +f 2528 2527 2456 2451 +f 2553 2554 2555 2556 +f 2348 2345 2346 2349 +f 2386 2383 2384 2387 +f 2404 2399 2402 2405 +f 2427 2426 2429 2432 +f 2433 2435 2541 2540 +f 2438 2437 2493 2492 +f 2520 2447 2446 +f 2455 2454 2533 2532 +f 2466 2465 2536 +f 2472 2471 2535 2534 +f 2473 2419 2504 2507 +f 2412 2477 2478 2407 +f 2483 2482 2551 2550 +f 2486 2485 2558 2557 +f 2491 2490 2511 2514 +f 2497 2496 2509 2510 +f 2501 2500 2540 2542 +f 2510 2470 2469 2512 +f 2460 2444 2447 2461 +f 2342 2531 2532 2339 +f 2501 2542 2427 2432 +f 2492 2489 2438 +f 2441 2478 2477 +f 2557 2487 2486 +f 2543 2522 2521 +f 2520 2519 2447 +f 2561 2562 2563 2564 2565 +f 2576 2568 2577 2578 +f 2587 2588 2589 +f 2599 2600 2601 +f 2611 2612 2613 +f 2626 2627 2628 2629 +f 2643 2644 2645 2646 2588 2587 +f 2617 2655 2656 2614 +f 2585 2664 2665 2586 +f 2622 2612 2611 2618 +f 2668 2669 2670 2671 +f 2594 2593 2592 2595 +f 2625 2571 2570 2623 +f 2565 2684 2685 2561 +f 2603 2688 2689 2604 +f 2694 2609 2605 2564 +f 2568 2576 2566 +f 2635 2703 2704 2636 +f 2587 2589 2575 2663 2711 +f 2714 2651 2654 2646 2645 +f 2564 2563 2695 2694 +f 2619 2580 2579 +f 2631 2641 2640 2632 +f 2696 2697 2719 2720 2423 2420 +f 2687 2686 2401 2398 +f 2665 2664 2375 2372 +f 2653 2652 2343 2340 +f 2702 2709 2708 2701 +f 2698 2589 2588 2582 +f 2671 2620 2579 2581 +f 2650 2720 2637 +f 2729 2728 2710 2709 +f 2653 2732 2699 2654 +f 2734 2657 2616 2717 +f 2737 2659 2643 2723 +f 2665 2740 2725 2724 2586 +f 2744 2743 2589 2698 +f 2674 2591 2667 2705 +f 2672 2669 2668 2673 +f 2745 2571 2625 2679 +f 2689 2686 2600 2604 +f 2747 2746 2694 2695 +f 2634 2707 2703 2635 +f 2582 2588 2646 2583 +f 2580 2619 2680 2624 +f 2720 2650 2424 2423 +f 2692 2746 2414 2413 +f 2684 2687 2398 2397 +f 2744 2572 2384 2382 +f 2664 2741 2376 2375 +f 2737 2738 2366 2364 +f 2655 2658 2350 2349 +f 2731 2732 2338 2336 +f 2727 2728 2330 2328 +f 2754 2755 2756 2757 +f 2764 2766 2765 2767 2768 +f 2774 2773 2775 2776 +f 2751 2783 2784 2785 2752 +f 2762 2789 2790 2765 +f 2771 2793 2794 2773 +f 2779 2797 2798 2781 +f 2787 2803 2804 2788 +f 2791 2807 2808 2792 +f 2795 2811 2812 2796 +f 2802 2816 2817 2803 +f 2806 2820 2821 2807 +f 2810 2824 2825 2811 +f 2815 2829 2830 2816 +f 2819 2833 2834 2820 +f 2823 2837 2838 2824 +f 2827 2841 2842 2828 +f 2832 2846 2847 2833 +f 2836 2850 2851 2837 +f 2840 2855 2856 2841 +f 2845 2860 2861 2846 +f 2849 2864 2865 2850 +f 2854 2868 2869 2855 +f 2859 2873 2874 2860 +f 2863 2878 2879 2864 +f 2867 2882 2883 2868 +f 2887 2888 2889 2890 +f 2875 2895 2896 2876 +f 2880 2899 2900 2881 +f 2884 2903 2904 2885 +f 2894 2909 2910 2895 +f 2898 2913 2914 2899 +f 2902 2917 2918 2903 +f 2908 2923 2924 2909 +f 2912 2927 2928 2913 +f 2916 2931 2932 2917 +f 2922 2936 2754 2923 +f 2926 2761 2764 2927 +f 2930 2772 2774 2937 2931 +f 2934 2780 2782 2935 +f 2906 2891 2940 2939 +f 2941 2943 2944 2942 +f 2858 2843 2941 2890 +f 2801 2800 2785 2947 +f 2800 2799 2752 2785 +f 2781 2798 2814 2828 2842 2857 2871 2886 2905 2920 2935 2782 +f 2734 2735 2356 2354 2353 2657 +g post +f 4422 4440 4342 +f 4147 4134 4436 +f 4163 4176 4435 +f 4324 4325 4432 4433 +f 4265 4252 4428 +f 4222 4234 4427 +f 4205 4206 4424 4425 +f 4023 4024 4420 4421 +f 4085 4070 4416 +f 4401 4400 4218 4219 +f 4396 4395 4234 4233 +f 4392 4399 4230 4229 +f 4380 4379 4261 4260 +f 4383 4382 4308 4309 +f 4386 4385 4323 4322 +f 4373 4352 4006 4007 +f 4361 4362 4010 4011 +f 4369 4370 4020 4019 +f 4367 4365 4066 4067 +f 4346 4345 4083 4082 +f 4354 4353 4128 4129 +f 4358 4357 4132 4133 +f 4409 4408 4173 4172 +f 4413 4412 4144 4143 +f 4340 3991 3990 4341 +f 4336 3995 3994 4337 +f 4332 3999 3998 4333 +f 4329 3986 3985 4343 4330 +f 4325 4342 4440 3989 4326 +f 4387 4338 4339 4386 +f 4317 4334 4335 4318 +f 3927 3982 4331 4314 +f 4308 4321 4322 4309 +f 4304 4317 4318 4305 +f 3882 3927 4314 4301 +f 4297 4327 4328 4298 +f 4384 4375 4294 4293 +f 4390 4381 4290 4289 +f 4285 4302 4303 4286 +f 4280 4293 4294 4281 +f 4276 4289 4290 4277 +f 4272 4285 4286 4273 +f 4269 4299 4300 4270 +f 4265 4282 4295 4296 4266 +f 4379 4278 4279 4378 +f 4257 4274 4275 4258 +f 3743 3798 4271 4254 +f 4248 4261 4262 4249 +f 4244 4257 4258 4245 +f 3716 3743 4254 4241 +f 4237 4267 4268 4238 +f 4396 4250 4251 4395 +f 4392 4246 4247 4399 +f 4225 4242 4243 4226 +f 4221 4233 4234 4222 +f 4217 4229 4230 4218 +f 4213 4225 4226 4214 +f 4210 4239 4240 4211 +f 4206 4223 4235 4236 4207 +f 4401 4402 4203 4202 +f 4198 4215 4216 4199 +f 3576 3631 4212 4195 +f 4190 4202 4203 4191 +f 4186 4198 4199 4187 +f 3548 3576 4195 4183 +f 4179 4208 4209 4180 +f 4406 4192 4193 4405 +f 4394 4188 4189 4409 +f 4167 4184 4185 4168 +f 4162 4175 4176 4163 +f 4158 4171 4172 4159 +f 4154 4167 4168 4155 +f 4151 4181 4182 4165 4152 +f 4147 4164 4177 4178 4148 +f 4413 4160 4161 4412 +f 4139 4156 4157 4140 +f 3409 3464 4153 4136 +f 4130 4143 4144 4131 +f 4126 4139 4140 4127 +f 3373 3409 4136 4123 +f 4119 4135 4149 4150 4120 +f 4357 4358 4116 4115 +f 4353 4354 4112 4111 +f 4107 4124 4125 4108 +f 4100 4115 4116 4101 +f 4096 4111 4112 4097 +f 4092 4107 4108 4093 +f 4089 4121 4122 4105 4090 +f 4085 4102 4117 4118 4086 +f 4347 4098 4099 4346 +f 4077 4094 4095 4078 +f 3235 3290 4091 4074 +f 4066 4081 4082 4067 +f 4062 4077 4078 4063 +f 3204 3235 4074 4059 +f 4055 4087 4088 4071 4056 +f 4364 4359 4052 4051 +f 4350 4366 4048 4047 +f 4043 4060 4061 4044 +f 4039 4051 4052 4040 +f 4035 4047 4048 4036 +f 4031 4043 4044 4032 +f 4028 4057 4058 4029 +f 4024 4041 4053 4054 4025 +f 4370 4037 4038 4368 +f 4016 4033 4034 4017 +f 3060 3115 4030 4013 +f 4008 4020 4021 4009 +f 4004 4016 4017 4005 +f 3030 3060 4013 4001 +f 3988 4026 4027 3987 +f 4362 4361 3990 3991 +f 4352 4373 3994 3995 +f 3999 4002 4003 3998 +f 3772 3717 3690 3635 3605 3550 3522 3467 3438 3383 3347 3292 3264 3209 3178 3123 3089 3034 3004 3003 3956 3901 3856 3801 +f 2980 3979 3978 2981 +f 2984 3975 3974 2985 +f 2988 3971 3970 2989 +f 2992 3967 3966 2993 +f 2996 3963 3962 2997 +f 3000 3959 3958 3001 +f 2951 2950 3954 3953 +f 2955 2954 3984 3950 3949 +f 2959 2958 3946 3945 +f 2963 2962 3942 3941 +f 2967 2966 3938 3937 +f 2971 2970 3934 3933 +f 2975 2974 3930 3929 +f 3980 3925 3924 3979 +f 3976 3921 3920 3975 +f 3972 3917 3916 3971 +f 3968 3913 3912 3967 +f 3964 3909 3908 3963 +f 3960 3905 3904 3959 +f 3927 3882 3881 3926 +f 3923 3878 3877 3922 +f 3919 3874 3873 3918 +f 3915 3870 3869 3914 +f 3911 3866 3865 3910 +f 3907 3862 3861 3906 +f 3903 3858 3857 3902 +f 3952 3953 3899 3853 3852 3898 +f 3948 3949 3895 3849 3848 3894 +f 3944 3945 3892 3845 3844 +f 3940 3941 3890 3841 3840 3889 +f 3936 3937 3887 3837 3836 3886 +f 3932 3933 3833 3832 +f 3928 3929 3884 3829 3828 3883 +f 3879 3824 3823 3878 +f 3875 3820 3819 3874 +f 3871 3816 3815 3870 +f 3867 3812 3811 3866 +f 3863 3808 3807 3862 +f 3859 3804 3803 3858 +f 3826 3797 3796 3825 +f 3822 3793 3792 3821 +f 3818 3789 3788 3817 +f 3814 3785 3784 3813 +f 3810 3781 3780 3809 +f 3806 3777 3776 3805 +f 3802 3773 3772 3801 +f 3851 3852 3768 3767 3800 +f 3847 3848 3764 3763 +f 3843 3844 3760 3759 +f 3839 3840 3756 3755 +f 3835 3836 3752 3751 +f 3831 3832 3748 3747 +f 3798 3743 3742 3797 +f 3794 3739 3738 3793 +f 3790 3735 3734 3789 +f 3786 3731 3730 3785 +f 3782 3727 3726 3781 +f 3778 3723 3722 3777 +f 3774 3719 3718 3773 +f 3741 3714 3713 3740 +f 3737 3710 3709 3736 +f 3733 3706 3705 3732 +f 3729 3702 3701 3728 +f 3725 3698 3697 3724 +f 3721 3694 3693 3720 +f 3770 3771 3689 3688 +f 3766 3767 3685 3684 +f 3762 3763 3681 3680 +f 3758 3759 3677 3676 +f 3754 3755 3673 3672 +f 3750 3751 3669 3668 +f 3746 3747 3665 3664 +f 3715 3660 3659 3714 +f 3711 3656 3655 3710 +f 3707 3652 3651 3706 +f 3703 3648 3647 3702 +f 3699 3644 3643 3698 +f 3695 3640 3639 3694 +f 3691 3636 3635 3690 +f 3658 3628 3627 3657 +f 3654 3624 3623 3653 +f 3650 3620 3619 3649 +f 3646 3616 3615 3645 +f 3642 3612 3611 3641 +f 3638 3608 3607 3637 +f 3687 3688 3634 3603 3602 +f 3683 3684 3599 3598 +f 3679 3680 3595 3594 +f 3675 3676 3591 3590 +f 3671 3672 3587 3586 +f 3667 3668 3583 3582 +f 3663 3664 3579 3578 +f 3629 3574 3573 3628 +f 3625 3570 3569 3624 +f 3621 3566 3565 3620 +f 3617 3562 3561 3616 +f 3613 3558 3557 3612 +f 3609 3554 3553 3608 +f 3576 3548 3547 3575 +f 3572 3544 3543 3571 +f 3568 3540 3539 3567 +f 3564 3536 3535 3563 +f 3560 3532 3531 3559 +f 3556 3528 3527 3555 +f 3552 3524 3523 3551 +f 3601 3602 3519 3518 +f 3597 3598 3515 3514 +f 3593 3594 3511 3510 +f 3589 3590 3507 3506 +f 3585 3586 3503 3502 +f 3581 3582 3499 3498 +f 3578 3495 3494 3577 +f 3545 3490 3489 3544 +f 3541 3486 3485 3540 +f 3537 3482 3481 3536 +f 3533 3478 3477 3532 +f 3529 3474 3473 3528 +f 3525 3470 3469 3524 +f 3492 3463 3462 3491 +f 3488 3459 3458 3487 +f 3484 3455 3454 3483 +f 3480 3451 3450 3479 +f 3476 3447 3446 3475 +f 3472 3443 3442 3471 +f 3468 3439 3438 3467 +f 3517 3518 3434 3433 3466 +f 3513 3514 3430 3429 +f 3509 3510 3426 3425 +f 3505 3506 3422 3421 +f 3501 3502 3418 3417 +f 3497 3498 3414 3413 +f 3464 3409 3408 3463 +f 3460 3405 3404 3459 +f 3456 3401 3400 3455 +f 3452 3397 3396 3451 +f 3448 3393 3392 3447 +f 3444 3389 3388 3443 +f 3440 3385 3384 3439 +f 3407 3371 3370 3406 +f 3403 3367 3366 3402 +f 3399 3363 3362 3398 +f 3395 3359 3358 3394 +f 3391 3355 3354 3390 +f 3387 3351 3350 3386 +f 3436 3437 3346 3345 +f 3432 3433 3382 3342 3341 3381 +f 3428 3429 3338 3337 +f 3424 3425 3334 3333 +f 3420 3421 3377 3330 3329 3376 +f 3416 3417 3326 3325 +f 3412 3413 3322 3321 +f 3372 3317 3316 3371 +f 3368 3313 3312 3367 +f 3364 3309 3308 3363 +f 3360 3305 3304 3359 +f 3356 3301 3300 3355 +f 3352 3297 3296 3351 +f 3348 3293 3292 3347 +f 3315 3287 3286 3314 +f 3311 3283 3282 3310 +f 3307 3279 3278 3306 +f 3303 3275 3274 3302 +f 3299 3271 3270 3298 +f 3295 3267 3266 3294 +f 3344 3345 3262 3261 +f 3340 3341 3258 3257 +f 3336 3337 3254 3253 +f 3332 3333 3250 3249 +f 3328 3329 3246 3245 +f 3324 3325 3242 3241 +f 3320 3321 3238 3237 +f 3288 3233 3232 3287 +f 3284 3229 3228 3283 +f 3280 3225 3224 3279 +f 3276 3221 3220 3275 +f 3272 3217 3216 3271 +f 3268 3213 3212 3267 +f 3235 3204 3203 3234 +f 3231 3200 3199 3230 +f 3227 3196 3195 3226 +f 3223 3192 3191 3222 +f 3219 3188 3187 3218 +f 3215 3184 3183 3214 +f 3211 3180 3179 3210 +f 3260 3261 3175 3174 +f 3256 3257 3171 3170 +f 3252 3253 3167 3166 +f 3248 3249 3163 3162 +f 3244 3245 3159 3158 +f 3240 3241 3155 3154 +f 3236 3237 3151 3150 3205 +f 3201 3146 3145 3200 +f 3197 3142 3141 3196 +f 3193 3138 3137 3192 +f 3189 3134 3133 3188 +f 3185 3130 3129 3184 +f 3181 3126 3125 3180 +f 3148 3114 3113 3147 +f 3144 3110 3109 3143 +f 3140 3106 3105 3139 +f 3136 3102 3101 3135 +f 3132 3098 3097 3131 +f 3128 3094 3093 3127 +f 3124 3090 3089 3123 +f 3173 3174 3085 3084 3122 +f 3169 3170 3081 3080 +f 3165 3166 3077 3076 3120 +f 3161 3162 3073 3072 +f 3157 3158 3116 3069 3068 +f 3153 3154 3065 3064 +f 3115 3060 3059 3114 +f 3111 3056 3055 3110 +f 3107 3052 3051 3106 +f 3103 3048 3047 3102 +f 3099 3044 3043 3098 +f 3095 3040 3039 3094 +f 3091 3036 3035 3090 +f 3058 3028 3027 3057 +f 3054 3024 3023 3053 +f 3050 3020 3019 3049 +f 3046 3016 3015 3045 +f 3042 3012 3011 3041 +f 3038 3008 3007 3037 +f 3087 3088 2949 2950 +f 3083 3084 3033 2953 2954 +f 3079 3080 2957 2958 +f 3075 3076 2961 2962 +f 3071 3072 2965 2966 +f 3067 3068 2969 2970 +f 3063 3064 2973 2974 3031 +f 3029 2978 2979 3028 +f 3025 2982 2983 3024 +f 3021 2986 2987 3020 +f 3017 2990 2991 3016 +f 3013 2994 2995 3012 +f 3009 2998 2999 3008 +f 3005 3002 3003 3004 +f 3008 2999 3000 3007 +f 3012 2995 2996 3011 +f 3016 2991 2992 3015 +f 3020 2987 2988 3019 +f 3024 2983 2984 3023 +f 3028 2979 2980 3027 +f 3062 3063 3031 2974 2975 +f 3066 3067 2970 2971 +f 3070 3071 2966 2967 +f 3074 3075 2962 2963 +f 3078 3079 2958 2959 +f 3082 3083 2954 2955 3032 +f 3086 3087 2950 2951 +f 3037 3007 3006 3036 +f 3041 3011 3010 3040 +f 3045 3015 3014 3044 +f 3049 3019 3018 3048 +f 3053 3023 3022 3052 +f 3057 3027 3026 3056 +f 3090 3035 3034 3089 +f 3094 3039 3038 3093 +f 3098 3043 3042 3097 +f 3102 3047 3046 3101 +f 3106 3051 3050 3105 +f 3110 3055 3054 3109 +f 3114 3059 3058 3113 +f 3152 3153 3064 3063 +f 3156 3157 3068 3067 +f 3160 3161 3072 3071 +f 3164 3165 3120 3076 3075 3119 +f 3168 3169 3080 3079 +f 3172 3173 3122 3084 3083 3121 +f 3176 3177 3088 3087 +f 3127 3093 3092 3126 +f 3131 3097 3096 3130 +f 3135 3101 3100 3134 +f 3139 3105 3104 3138 +f 3143 3109 3108 3142 +f 3147 3113 3112 3146 +f 3180 3125 3124 3179 +f 3184 3129 3128 3183 +f 3188 3133 3132 3187 +f 3192 3137 3136 3191 +f 3196 3141 3140 3195 +f 3200 3145 3144 3199 +f 3204 3149 3148 3203 +f 3239 3240 3154 3153 3206 +f 3243 3244 3158 3157 +f 3247 3248 3162 3161 +f 3251 3252 3166 3165 +f 3255 3256 3170 3169 +f 3259 3260 3174 3173 3208 +f 3210 3179 3178 3209 +f 3214 3183 3182 3213 +f 3218 3187 3186 3217 +f 3222 3191 3190 3221 +f 3226 3195 3194 3225 +f 3230 3199 3198 3229 +f 3234 3203 3202 3233 +f 3267 3212 3211 3266 +f 3271 3216 3215 3270 +f 3275 3220 3219 3274 +f 3279 3224 3223 3278 +f 3283 3228 3227 3282 +f 3287 3232 3231 3286 +f 3319 3320 3237 3236 3291 +f 3323 3324 3241 3240 +f 3327 3328 3245 3244 +f 3331 3332 3249 3248 +f 3335 3336 3253 3252 +f 3339 3340 3257 3256 +f 3343 3344 3261 3260 +f 3294 3266 3265 3293 +f 3298 3270 3269 3297 +f 3302 3274 3273 3301 +f 3306 3278 3277 3305 +f 3310 3282 3281 3309 +f 3314 3286 3285 3313 +f 3318 3290 3289 3317 +f 3351 3296 3295 3350 +f 3355 3300 3299 3354 +f 3359 3304 3303 3358 +f 3363 3308 3307 3362 +f 3367 3312 3311 3366 +f 3371 3316 3315 3370 +f 3411 3412 3321 3320 +f 3415 3416 3325 3324 +f 3419 3420 3376 3329 3328 3375 +f 3423 3424 3333 3332 3379 +f 3427 3428 3337 3336 +f 3431 3432 3381 3341 3340 3380 +f 3435 3436 3345 3344 +f 3386 3350 3349 3385 +f 3390 3354 3353 3389 +f 3394 3358 3357 3393 +f 3398 3362 3361 3397 +f 3402 3366 3365 3401 +f 3406 3370 3369 3405 +f 3439 3384 3383 3438 +f 3443 3388 3387 3442 +f 3447 3392 3391 3446 +f 3451 3396 3395 3450 +f 3455 3400 3399 3454 +f 3459 3404 3403 3458 +f 3463 3408 3407 3462 +f 3496 3497 3413 3412 +f 3500 3501 3417 3416 +f 3504 3505 3421 3420 +f 3508 3509 3425 3424 +f 3512 3513 3429 3428 +f 3516 3517 3466 3433 3432 +f 3520 3521 3437 3436 +f 3471 3442 3441 3470 +f 3475 3446 3445 3474 +f 3479 3450 3449 3478 +f 3483 3454 3453 3482 +f 3487 3458 3457 3486 +f 3491 3462 3461 3490 +f 3524 3469 3468 3523 +f 3528 3473 3472 3527 +f 3532 3477 3476 3531 +f 3536 3481 3480 3535 +f 3540 3485 3484 3539 +f 3544 3489 3488 3543 +f 3548 3493 3492 3547 +f 3580 3581 3498 3497 +f 3584 3585 3502 3501 +f 3588 3589 3506 3505 +f 3592 3593 3510 3509 +f 3596 3597 3514 3513 +f 3600 3601 3518 3517 +f 3551 3523 3522 3550 +f 3555 3527 3526 3554 +f 3559 3531 3530 3558 +f 3563 3535 3534 3562 +f 3567 3539 3538 3566 +f 3571 3543 3542 3570 +f 3575 3547 3546 3574 +f 3608 3553 3552 3607 +f 3612 3557 3556 3611 +f 3616 3561 3560 3615 +f 3620 3565 3564 3619 +f 3624 3569 3568 3623 +f 3628 3573 3572 3627 +f 3663 3578 3577 3662 +f 3666 3667 3582 3581 +f 3670 3671 3586 3585 3632 +f 3674 3675 3590 3589 +f 3678 3679 3594 3593 +f 3682 3683 3598 3597 3633 +f 3686 3687 3602 3601 +f 3637 3607 3606 3636 +f 3641 3611 3610 3640 +f 3645 3615 3614 3644 +f 3649 3619 3618 3648 +f 3653 3623 3622 3652 +f 3657 3627 3626 3656 +f 3661 3631 3630 3660 +f 3694 3639 3638 3693 +f 3698 3643 3642 3697 +f 3702 3647 3646 3701 +f 3706 3651 3650 3705 +f 3710 3655 3654 3709 +f 3714 3659 3658 3713 +f 3745 3746 3664 3663 +f 3749 3750 3668 3667 +f 3753 3754 3672 3671 +f 3757 3758 3676 3675 +f 3761 3762 3680 3679 +f 3765 3766 3684 3683 +f 3769 3770 3688 3687 +f 3720 3693 3692 3719 +f 3724 3697 3696 3723 +f 3728 3701 3700 3727 +f 3732 3705 3704 3731 +f 3736 3709 3708 3735 +f 3740 3713 3712 3739 +f 3773 3718 3717 3772 +f 3777 3722 3721 3776 +f 3781 3726 3725 3780 +f 3785 3730 3729 3784 +f 3789 3734 3733 3788 +f 3793 3738 3737 3792 +f 3797 3742 3741 3796 +f 3830 3831 3747 3746 +f 3834 3835 3751 3750 +f 3838 3839 3755 3754 +f 3842 3843 3759 3758 +f 3846 3847 3763 3762 +f 3850 3851 3800 3767 3766 3799 +f 3854 3855 3771 3770 +f 3805 3776 3775 3804 +f 3809 3780 3779 3808 +f 3813 3784 3783 3812 +f 3817 3788 3787 3816 +f 3821 3792 3791 3820 +f 3825 3796 3795 3824 +f 3858 3803 3802 3857 +f 3862 3807 3806 3861 +f 3866 3811 3810 3865 +f 3870 3815 3814 3869 +f 3874 3819 3818 3873 +f 3878 3823 3822 3877 +f 3882 3827 3826 3881 +f 3931 3932 3832 3831 +f 3935 3936 3886 3836 3835 3885 +f 3939 3940 3889 3840 3839 3888 +f 3943 3944 3844 3843 +f 3947 3948 3894 3848 3847 3893 +f 3951 3952 3898 3852 3851 3897 +f 3902 3857 3856 3901 +f 3906 3861 3860 3905 +f 3910 3865 3864 3909 +f 3914 3869 3868 3913 +f 3918 3873 3872 3917 +f 3922 3877 3876 3921 +f 3926 3881 3880 3925 +f 3959 3904 3903 3958 +f 3963 3908 3907 3962 +f 3967 3912 3911 3966 +f 3971 3916 3915 3970 +f 3975 3920 3919 3974 +f 3979 3924 3923 3978 +f 2976 2975 3929 3928 3983 +f 2972 2971 3933 3932 +f 2968 2967 3937 3936 +f 2964 2963 3941 3940 +f 2960 2959 3945 3944 +f 2956 2955 3949 3948 +f 2952 2951 3953 3952 +f 3001 3958 3957 3002 +f 2997 3962 3961 2998 +f 2993 3966 3965 2994 +f 2989 3970 3969 2990 +f 2985 3974 3973 2986 +f 2981 3978 3977 2982 +f 2977 3982 3981 2978 +f 4000 4001 4002 3999 +f 3995 3996 4005 4006 4352 +f 4371 4362 3991 3992 +f 3989 4025 4026 3988 +f 3985 4029 3061 2976 +f 4003 4015 4016 4004 +f 4007 4019 4020 4008 +f 4012 4011 4421 4420 +f 4015 4032 4033 4016 +f 4369 4036 4037 4370 +f 4023 4360 4040 4041 4024 +f 4027 4056 4057 4028 +f 4030 4042 4043 4031 +f 4034 4046 4047 4035 +f 4038 4050 4051 4039 +f 4042 4059 4060 4043 +f 4047 4046 4063 4064 4350 +f 4367 4364 4051 4050 +f 4054 4086 4087 4055 +f 4058 4073 4090 3236 3205 3150 +f 4061 4076 4077 4062 +f 4065 4080 4081 4066 +f 4070 4069 4417 4416 +f 4076 4093 4094 4077 +f 4348 4097 4098 4347 +f 4084 4344 4101 4102 4085 +f 4088 4104 4120 4121 4089 +f 4091 4106 4107 4092 +f 4095 4110 4111 4096 +f 4099 4114 4115 4100 +f 4106 4123 4124 4107 +f 4111 4110 4127 4128 4353 +f 4356 4357 4115 4114 +f 4118 4148 4149 4135 4119 +f 4122 4152 3410 3319 +f 4125 4138 4139 4126 +f 4129 4142 4143 4130 +f 4134 4133 4437 4436 +f 4138 4155 4156 4139 +f 4414 4159 4160 4413 +f 4146 4410 4163 4164 4147 +f 4150 4180 4181 4151 +f 4153 4166 4167 4154 +f 4157 4170 4171 4158 +f 4161 4174 4175 4162 +f 4166 4183 4184 4167 +f 4171 4170 4187 4188 4394 +f 4407 4191 4192 4406 +f 4178 4207 4208 4179 +f 4182 4211 3577 3494 +f 4185 4197 4198 4186 +f 4189 4201 4202 4190 +f 4194 4193 4425 4424 +f 4197 4214 4215 4198 +f 4400 4401 4202 4201 +f 4205 4404 4222 4223 4206 +f 4209 4238 4239 4210 +f 4212 4224 4225 4213 +f 4216 4228 4229 4217 +f 4220 4232 4233 4221 +f 4224 4241 4242 4225 +f 4229 4228 4245 4246 4392 +f 4397 4249 4250 4396 +f 4236 4266 4267 4237 +f 4240 4270 3744 3662 +f 4243 4256 4257 4244 +f 4247 4260 4261 4248 +f 4252 4251 4429 4428 +f 4256 4273 4274 4257 +f 4380 4277 4278 4379 +f 4264 4376 4281 4282 4265 +f 4268 4298 4299 4269 +f 4271 4284 4285 4272 +f 4275 4288 4289 4276 +f 4279 4292 4293 4280 +f 4284 4301 4302 4285 +f 4289 4288 4305 4306 4390 +f 4383 4384 4293 4292 +f 4296 4326 4327 4297 +f 4300 4313 4330 3928 3883 3828 +f 4303 4316 4317 4304 +f 4307 4320 4321 4308 +f 4312 4311 4433 4432 +f 4316 4333 4334 4317 +f 4388 4337 4338 4387 +f 4324 4374 4341 4342 4325 +f 4328 3987 3986 4329 +f 4331 4000 3999 4332 +f 4335 3996 3995 4336 +f 4339 3992 3991 4340 +f 4414 4413 4143 4142 +f 4394 4409 4172 4171 +f 4406 4405 4176 4175 +f 4355 4354 4129 4130 +f 4347 4346 4082 4081 +f 4364 4367 4067 4068 +f 4351 4369 4019 4018 +f 4363 4360 4023 4022 +f 4372 4373 4007 4008 +f 4387 4386 4322 4321 +f 4384 4383 4309 4310 +f 4391 4380 4260 4259 +f 4377 4376 4264 4263 +f 4397 4396 4233 4232 +f 4402 4401 4219 4220 +f 4069 4084 4417 +f 4053 4041 4418 +f 4341 3990 4423 +f 4234 4235 4426 4427 +f 4251 4264 4429 +f 4295 4282 4430 +f 4176 4177 4434 4435 +f 4133 4146 4437 +f 4117 4102 4438 +f 4440 4422 4423 3990 +f 4116 4117 4438 4439 +f 4177 4164 4434 +f 4311 4324 4433 +f 4294 4295 4430 4431 +f 4235 4223 4426 +f 4193 4205 4425 +f 4011 4023 4421 +f 4052 4053 4418 4419 +f 4400 4393 4217 4218 +f 4404 4403 4221 4222 +f 4399 4398 4231 4230 +f 4379 4378 4262 4261 +f 4382 4381 4307 4308 +f 4385 4374 4324 4323 +f 4389 4388 4320 4319 +f 4362 4371 4009 4010 +f 4370 4368 4021 4020 +f 4365 4366 4065 4066 +f 4344 4084 4083 4345 +f 4349 4348 4080 4079 +f 4357 4356 4131 4132 +f 4408 4407 4174 4173 +f 4412 4411 4145 4144 +f 4342 4341 4423 4422 +f 4337 3994 3993 4338 +f 4333 3998 3997 4334 +f 4330 4343 3985 2976 3983 3928 +f 4326 3989 3988 4327 +f 4386 4339 4340 4385 +f 4319 4318 4335 4336 4389 +f 4314 4331 4332 4315 +f 4309 4322 4323 4310 +f 4305 4318 4319 4306 +f 4301 4314 4315 4302 +f 4298 4328 4329 4299 +f 4294 4375 4311 4312 4295 +f 4381 4382 4291 4290 +f 4286 4303 4304 4287 +f 4282 4281 4431 4430 +f 4277 4290 4291 4278 +f 4273 4286 4287 4274 +f 4270 4300 3828 3744 +f 4266 4296 4297 4283 4267 +f 4378 4279 4280 4377 +f 4259 4258 4275 4276 4391 +f 4254 4271 4272 4255 +f 4249 4262 4263 4250 +f 4245 4258 4259 4246 +f 4241 4254 4255 4242 +f 4238 4268 4269 4253 4239 +f 4234 4395 4251 4252 4235 +f 4399 4247 4248 4398 +f 4226 4243 4244 4227 +f 4223 4222 4427 4426 +f 4218 4230 4231 4219 +f 4214 4226 4227 4215 +f 4211 4240 3662 3577 +f 4207 4236 4237 4208 +f 4402 4403 4204 4203 +f 4200 4199 4216 4217 4393 +f 4195 4212 4213 4196 +f 4191 4203 4204 4192 +f 4187 4199 4200 4188 +f 4183 4195 4196 4184 +f 4180 4209 4210 4181 +f 4176 4405 4193 4194 4177 +f 4409 4189 4190 4408 +f 4168 4185 4186 4169 +f 4164 4163 4435 4434 +f 4159 4172 4173 4160 +f 4155 4168 4169 4156 +f 4152 4165 4182 3494 3410 +f 4148 4178 4179 4149 +f 4412 4161 4162 4411 +f 4141 4140 4157 4158 4415 +f 4136 4153 4154 4137 +f 4131 4144 4145 4132 +f 4127 4140 4141 4128 +f 4123 4136 4137 4124 +f 4120 4150 4151 4121 +f 4116 4358 4133 4134 4117 +f 4354 4355 4113 4112 +f 4108 4125 4126 4109 +f 4102 4101 4439 4438 +f 4097 4112 4113 4098 +f 4093 4108 4109 4094 +f 4090 4105 4122 3319 3291 3236 +f 4086 4118 4119 4103 4087 +f 4346 4099 4100 4345 +f 4079 4078 4095 4096 4349 +f 4074 4091 4092 4075 +f 4067 4082 4083 4068 +f 4063 4078 4079 4064 +f 4059 4074 4075 4060 +f 4056 4071 4088 4089 4072 4057 +f 4052 4359 4069 4070 4053 +f 4366 4365 4049 4048 +f 4044 4061 4062 4045 +f 4041 4040 4419 4418 +f 4036 4048 4049 4037 +f 4032 4044 4045 4033 +f 4029 4058 3150 3061 +f 4025 4054 4055 4026 +f 4368 4038 4039 4363 +f 4018 4017 4034 4035 4351 +f 4013 4030 4031 4014 +f 4009 4021 4022 4010 +f 4005 4017 4018 4006 +f 4001 4013 4014 4002 +f 3987 4027 4028 3986 +f 4440 3990 4361 4011 4012 +f 4373 4372 3993 3994 +f 3998 4003 4004 3997 +f 3088 3177 3263 3346 3437 3521 3604 3689 3771 3855 3900 3955 2949 +f 2979 3980 3979 2980 +f 2983 3976 3975 2984 +f 2987 3972 3971 2988 +f 2991 3968 3967 2992 +f 2995 3964 3963 2996 +f 2999 3960 3959 3000 +f 2950 2949 3955 3954 +f 2954 2953 3951 3950 3984 +f 2958 2957 3947 3946 +f 2962 2961 3943 3942 +f 2966 2965 3939 3938 +f 2970 2969 3935 3934 +f 2974 2973 3931 3930 +f 3981 3926 3925 3980 +f 3977 3922 3921 3976 +f 3973 3918 3917 3972 +f 3969 3914 3913 3968 +f 3965 3910 3909 3964 +f 3961 3906 3905 3960 +f 3957 3902 3901 3956 +f 3924 3879 3878 3923 +f 3920 3875 3874 3919 +f 3916 3871 3870 3915 +f 3912 3867 3866 3911 +f 3908 3863 3862 3907 +f 3904 3859 3858 3903 +f 3953 3954 3854 3853 3899 +f 3949 3950 3896 3850 3849 3895 +f 3945 3946 3846 3845 3892 +f 3941 3942 3891 3842 3841 3890 +f 3937 3938 3838 3837 3887 +f 3933 3934 3834 3833 +f 3929 3930 3830 3829 3884 +f 3880 3825 3824 3879 +f 3876 3821 3820 3875 +f 3872 3817 3816 3871 +f 3868 3813 3812 3867 +f 3864 3809 3808 3863 +f 3860 3805 3804 3859 +f 3827 3798 3797 3826 +f 3823 3794 3793 3822 +f 3819 3790 3789 3818 +f 3815 3786 3785 3814 +f 3811 3782 3781 3810 +f 3807 3778 3777 3806 +f 3803 3774 3773 3802 +f 3852 3853 3769 3768 +f 3848 3849 3765 3764 +f 3844 3845 3761 3760 +f 3840 3841 3757 3756 +f 3836 3837 3753 3752 +f 3832 3833 3749 3748 +f 3829 3745 3744 3828 +f 3795 3740 3739 3794 +f 3791 3736 3735 3790 +f 3787 3732 3731 3786 +f 3783 3728 3727 3782 +f 3779 3724 3723 3778 +f 3775 3720 3719 3774 +f 3742 3715 3714 3741 +f 3738 3711 3710 3737 +f 3734 3707 3706 3733 +f 3730 3703 3702 3729 +f 3726 3699 3698 3725 +f 3722 3695 3694 3721 +f 3718 3691 3690 3717 +f 3767 3768 3686 3685 +f 3763 3764 3682 3681 +f 3759 3760 3678 3677 +f 3755 3756 3674 3673 +f 3751 3752 3670 3669 +f 3747 3748 3666 3665 +f 3716 3661 3660 3715 +f 3712 3657 3656 3711 +f 3708 3653 3652 3707 +f 3704 3649 3648 3703 +f 3700 3645 3644 3699 +f 3696 3641 3640 3695 +f 3692 3637 3636 3691 +f 3659 3629 3628 3658 +f 3655 3625 3624 3654 +f 3651 3621 3620 3650 +f 3647 3617 3616 3646 +f 3643 3613 3612 3642 +f 3639 3609 3608 3638 +f 3688 3689 3604 3603 3634 +f 3684 3685 3600 3599 +f 3680 3681 3596 3595 +f 3676 3677 3592 3591 +f 3672 3673 3588 3587 +f 3668 3669 3584 3583 +f 3664 3665 3580 3579 +f 3630 3575 3574 3629 +f 3626 3571 3570 3625 +f 3622 3567 3566 3621 +f 3618 3563 3562 3617 +f 3614 3559 3558 3613 +f 3610 3555 3554 3609 +f 3606 3551 3550 3605 +f 3573 3545 3544 3572 +f 3569 3541 3540 3568 +f 3565 3537 3536 3564 +f 3561 3533 3532 3560 +f 3557 3529 3528 3556 +f 3553 3525 3524 3552 +f 3602 3603 3520 3519 +f 3598 3599 3549 3516 3515 +f 3594 3595 3512 3511 +f 3590 3591 3508 3507 +f 3586 3587 3504 3503 +f 3582 3583 3500 3499 +f 3578 3579 3496 3495 +f 3546 3491 3490 3545 +f 3542 3487 3486 3541 +f 3538 3483 3482 3537 +f 3534 3479 3478 3533 +f 3530 3475 3474 3529 +f 3526 3471 3470 3525 +f 3493 3464 3463 3492 +f 3489 3460 3459 3488 +f 3485 3456 3455 3484 +f 3481 3452 3451 3480 +f 3477 3448 3447 3476 +f 3473 3444 3443 3472 +f 3469 3440 3439 3468 +f 3518 3519 3435 3434 +f 3514 3515 3465 3431 3430 +f 3510 3511 3427 3426 +f 3506 3507 3423 3422 +f 3502 3503 3419 3418 +f 3498 3499 3415 3414 +f 3495 3411 3410 3494 +f 3461 3406 3405 3460 +f 3457 3402 3401 3456 +f 3453 3398 3397 3452 +f 3449 3394 3393 3448 +f 3445 3390 3389 3444 +f 3441 3386 3385 3440 +f 3408 3372 3371 3407 +f 3404 3368 3367 3403 +f 3400 3364 3363 3399 +f 3396 3360 3359 3395 +f 3392 3356 3355 3391 +f 3388 3352 3351 3387 +f 3384 3348 3347 3383 +f 3433 3434 3343 3342 3382 +f 3429 3430 3339 3338 +f 3425 3426 3335 3334 +f 3421 3422 3378 3331 3330 3377 +f 3417 3418 3374 3327 3326 +f 3413 3414 3323 3322 +f 3373 3318 3317 3372 +f 3369 3314 3313 3368 +f 3365 3310 3309 3364 +f 3361 3306 3305 3360 +f 3357 3302 3301 3356 +f 3353 3298 3297 3352 +f 3349 3294 3293 3348 +f 3316 3288 3287 3315 +f 3312 3284 3283 3311 +f 3308 3280 3279 3307 +f 3304 3276 3275 3303 +f 3300 3272 3271 3299 +f 3296 3268 3267 3295 +f 3345 3346 3263 3262 +f 3341 3342 3259 3258 +f 3337 3338 3255 3254 +f 3333 3334 3251 3250 +f 3329 3330 3247 3246 +f 3325 3326 3243 3242 +f 3321 3322 3239 3238 +f 3289 3234 3233 3288 +f 3285 3230 3229 3284 +f 3281 3226 3225 3280 +f 3277 3222 3221 3276 +f 3273 3218 3217 3272 +f 3269 3214 3213 3268 +f 3265 3210 3209 3264 +f 3232 3201 3200 3231 +f 3228 3197 3196 3227 +f 3224 3193 3192 3223 +f 3220 3189 3188 3219 +f 3216 3185 3184 3215 +f 3212 3181 3180 3211 +f 3261 3262 3176 3175 +f 3257 3258 3207 3172 3171 +f 3253 3254 3168 3167 +f 3249 3250 3164 3163 +f 3245 3246 3160 3159 +f 3241 3242 3156 3155 +f 3237 3238 3152 3151 +f 3202 3147 3146 3201 +f 3198 3143 3142 3197 +f 3194 3139 3138 3193 +f 3190 3135 3134 3189 +f 3186 3131 3130 3185 +f 3182 3127 3126 3181 +f 3149 3115 3114 3148 +f 3145 3111 3110 3144 +f 3141 3107 3106 3140 +f 3137 3103 3102 3136 +f 3133 3099 3098 3132 +f 3129 3095 3094 3128 +f 3125 3091 3090 3124 +f 3174 3175 3086 3085 +f 3170 3171 3082 3081 +f 3166 3167 3078 3077 +f 3162 3163 3118 3074 3073 +f 3158 3159 3117 3070 3069 3116 +f 3154 3155 3066 3065 +f 3151 3062 3061 3150 +f 3112 3057 3056 3111 +f 3108 3053 3052 3107 +f 3104 3049 3048 3103 +f 3100 3045 3044 3099 +f 3096 3041 3040 3095 +f 3092 3037 3036 3091 +f 3059 3029 3028 3058 +f 3055 3025 3024 3054 +f 3051 3021 3020 3050 +f 3047 3017 3016 3046 +f 3043 3013 3012 3042 +f 3039 3009 3008 3038 +f 3035 3005 3004 3034 +f 3084 3085 2952 2953 3033 +f 3080 3081 2956 2957 +f 3076 3077 2960 2961 +f 3072 3073 2964 2965 +f 3068 3069 2968 2969 +f 3064 3065 2972 2973 +f 3030 2977 2978 3029 +f 3026 2981 2982 3025 +f 3022 2985 2986 3021 +f 3018 2989 2990 3017 +f 3014 2993 2994 3013 +f 3010 2997 2998 3009 +f 3006 3001 3002 3005 +f 3007 3000 3001 3006 +f 3011 2996 2997 3010 +f 3015 2992 2993 3014 +f 3019 2988 2989 3018 +f 3023 2984 2985 3022 +f 3027 2980 2981 3026 +f 3062 2975 2976 3061 +f 3065 3066 2971 2972 +f 3069 3070 2967 2968 +f 3073 3074 2963 2964 +f 3077 3078 2959 2960 +f 3081 3082 3032 2955 2956 +f 3085 3086 2951 2952 +f 3036 3006 3005 3035 +f 3040 3010 3009 3039 +f 3044 3014 3013 3043 +f 3048 3018 3017 3047 +f 3052 3022 3021 3051 +f 3056 3026 3025 3055 +f 3060 3030 3029 3059 +f 3093 3038 3037 3092 +f 3097 3042 3041 3096 +f 3101 3046 3045 3100 +f 3105 3050 3049 3104 +f 3109 3054 3053 3108 +f 3113 3058 3057 3112 +f 3151 3152 3063 3062 +f 3155 3156 3067 3066 +f 3159 3160 3071 3070 3117 +f 3163 3164 3119 3075 3074 3118 +f 3167 3168 3079 3078 +f 3171 3172 3121 3083 3082 +f 3175 3176 3087 3086 +f 3126 3092 3091 3125 +f 3130 3096 3095 3129 +f 3134 3100 3099 3133 +f 3138 3104 3103 3137 +f 3142 3108 3107 3141 +f 3146 3112 3111 3145 +f 3179 3124 3123 3178 +f 3183 3128 3127 3182 +f 3187 3132 3131 3186 +f 3191 3136 3135 3190 +f 3195 3140 3139 3194 +f 3199 3144 3143 3198 +f 3203 3148 3147 3202 +f 3238 3239 3206 3153 3152 +f 3242 3243 3157 3156 +f 3246 3247 3161 3160 +f 3250 3251 3165 3164 +f 3254 3255 3169 3168 +f 3258 3259 3208 3173 3172 3207 +f 3262 3263 3177 3176 +f 3213 3182 3181 3212 +f 3217 3186 3185 3216 +f 3221 3190 3189 3220 +f 3225 3194 3193 3224 +f 3229 3198 3197 3228 +f 3233 3202 3201 3232 +f 3266 3211 3210 3265 +f 3270 3215 3214 3269 +f 3274 3219 3218 3273 +f 3278 3223 3222 3277 +f 3282 3227 3226 3281 +f 3286 3231 3230 3285 +f 3290 3235 3234 3289 +f 3322 3323 3240 3239 +f 3326 3327 3244 3243 +f 3330 3331 3248 3247 +f 3334 3335 3252 3251 +f 3338 3339 3256 3255 +f 3342 3343 3260 3259 +f 3293 3265 3264 3292 +f 3297 3269 3268 3296 +f 3301 3273 3272 3300 +f 3305 3277 3276 3304 +f 3309 3281 3280 3308 +f 3313 3285 3284 3312 +f 3317 3289 3288 3316 +f 3350 3295 3294 3349 +f 3354 3299 3298 3353 +f 3358 3303 3302 3357 +f 3362 3307 3306 3361 +f 3366 3311 3310 3365 +f 3370 3315 3314 3369 +f 3411 3320 3319 3410 +f 3414 3415 3324 3323 +f 3418 3419 3375 3328 3327 3374 +f 3422 3423 3379 3332 3331 3378 +f 3426 3427 3336 3335 +f 3430 3431 3380 3340 3339 +f 3434 3435 3344 3343 +f 3385 3349 3348 3384 +f 3389 3353 3352 3388 +f 3393 3357 3356 3392 +f 3397 3361 3360 3396 +f 3401 3365 3364 3400 +f 3405 3369 3368 3404 +f 3409 3373 3372 3408 +f 3442 3387 3386 3441 +f 3446 3391 3390 3445 +f 3450 3395 3394 3449 +f 3454 3399 3398 3453 +f 3458 3403 3402 3457 +f 3462 3407 3406 3461 +f 3495 3496 3412 3411 +f 3499 3500 3416 3415 +f 3503 3504 3420 3419 +f 3507 3508 3424 3423 +f 3511 3512 3428 3427 +f 3515 3516 3432 3431 3465 +f 3519 3520 3436 3435 +f 3470 3441 3440 3469 +f 3474 3445 3444 3473 +f 3478 3449 3448 3477 +f 3482 3453 3452 3481 +f 3486 3457 3456 3485 +f 3490 3461 3460 3489 +f 3523 3468 3467 3522 +f 3527 3472 3471 3526 +f 3531 3476 3475 3530 +f 3535 3480 3479 3534 +f 3539 3484 3483 3538 +f 3543 3488 3487 3542 +f 3547 3492 3491 3546 +f 3579 3580 3497 3496 +f 3583 3584 3501 3500 +f 3587 3588 3505 3504 +f 3591 3592 3509 3508 +f 3595 3596 3513 3512 +f 3599 3600 3517 3516 3549 +f 3603 3604 3521 3520 +f 3554 3526 3525 3553 +f 3558 3530 3529 3557 +f 3562 3534 3533 3561 +f 3566 3538 3537 3565 +f 3570 3542 3541 3569 +f 3574 3546 3545 3573 +f 3607 3552 3551 3606 +f 3611 3556 3555 3610 +f 3615 3560 3559 3614 +f 3619 3564 3563 3618 +f 3623 3568 3567 3622 +f 3627 3572 3571 3626 +f 3631 3576 3575 3630 +f 3665 3666 3581 3580 +f 3669 3670 3632 3585 3584 +f 3673 3674 3589 3588 +f 3677 3678 3593 3592 +f 3681 3682 3633 3597 3596 +f 3685 3686 3601 3600 +f 3636 3606 3605 3635 +f 3640 3610 3609 3639 +f 3644 3614 3613 3643 +f 3648 3618 3617 3647 +f 3652 3622 3621 3651 +f 3656 3626 3625 3655 +f 3660 3630 3629 3659 +f 3693 3638 3637 3692 +f 3697 3642 3641 3696 +f 3701 3646 3645 3700 +f 3705 3650 3649 3704 +f 3709 3654 3653 3708 +f 3713 3658 3657 3712 +f 3745 3663 3662 3744 +f 3748 3749 3667 3666 +f 3752 3753 3671 3670 +f 3756 3757 3675 3674 +f 3760 3761 3679 3678 +f 3764 3765 3683 3682 +f 3768 3769 3687 3686 +f 3719 3692 3691 3718 +f 3723 3696 3695 3722 +f 3727 3700 3699 3726 +f 3731 3704 3703 3730 +f 3735 3708 3707 3734 +f 3739 3712 3711 3738 +f 3743 3716 3715 3742 +f 3776 3721 3720 3775 +f 3780 3725 3724 3779 +f 3784 3729 3728 3783 +f 3788 3733 3732 3787 +f 3792 3737 3736 3791 +f 3796 3741 3740 3795 +f 3829 3830 3746 3745 +f 3833 3834 3750 3749 +f 3837 3838 3754 3753 +f 3841 3842 3758 3757 +f 3845 3846 3762 3761 +f 3849 3850 3799 3766 3765 +f 3853 3854 3770 3769 +f 3804 3775 3774 3803 +f 3808 3779 3778 3807 +f 3812 3783 3782 3811 +f 3816 3787 3786 3815 +f 3820 3791 3790 3819 +f 3824 3795 3794 3823 +f 3857 3802 3801 3856 +f 3861 3806 3805 3860 +f 3865 3810 3809 3864 +f 3869 3814 3813 3868 +f 3873 3818 3817 3872 +f 3877 3822 3821 3876 +f 3881 3826 3825 3880 +f 3930 3931 3831 3830 +f 3934 3935 3885 3835 3834 +f 3938 3939 3888 3839 3838 +f 3942 3943 3843 3842 3891 +f 3946 3947 3893 3847 3846 +f 3950 3951 3897 3851 3850 3896 +f 3954 3955 3900 3855 3854 +f 3905 3860 3859 3904 +f 3909 3864 3863 3908 +f 3913 3868 3867 3912 +f 3917 3872 3871 3916 +f 3921 3876 3875 3920 +f 3925 3880 3879 3924 +f 3958 3903 3902 3957 +f 3962 3907 3906 3961 +f 3966 3911 3910 3965 +f 3970 3915 3914 3969 +f 3974 3919 3918 3973 +f 3978 3923 3922 3977 +f 3982 3927 3926 3981 +f 2973 2972 3932 3931 +f 2969 2968 3936 3935 +f 2965 2964 3940 3939 +f 2961 2960 3944 3943 +f 2957 2956 3948 3947 +f 2953 2952 3952 3951 +f 3002 3957 3956 3003 +f 2998 3961 3960 2999 +f 2994 3965 3964 2995 +f 2990 3969 3968 2991 +f 2986 3973 3972 2987 +f 2982 3977 3976 2983 +f 2978 3981 3980 2979 +f 2977 3030 4001 4000 +f 3997 4004 4005 3996 +f 4372 4371 3992 3993 +f 4440 4012 4024 4025 3989 +f 3986 4028 4029 3985 +f 4002 4014 4015 4003 +f 4006 4018 4019 4007 +f 4010 4022 4023 4011 +f 4014 4031 4032 4015 +f 4351 4035 4036 4369 +f 4363 4039 4040 4360 +f 4026 4055 4056 4027 +f 3115 3149 4042 4030 +f 4033 4045 4046 4034 +f 4037 4049 4050 4038 +f 3149 3204 4059 4042 +f 4045 4062 4063 4046 +f 4365 4367 4050 4049 +f 4053 4070 4085 4086 4054 +f 4057 4072 4089 4090 4073 4058 +f 4060 4075 4076 4061 +f 4064 4079 4080 4065 +f 4068 4083 4084 4069 +f 4075 4092 4093 4076 +f 4349 4096 4097 4348 +f 4345 4100 4101 4344 +f 4087 4103 4119 4120 4104 4088 +f 3290 3318 4106 4091 +f 4094 4109 4110 4095 +f 4098 4113 4114 4099 +f 3318 3373 4123 4106 +f 4109 4126 4127 4110 +f 4355 4356 4114 4113 +f 4117 4134 4147 4148 4118 +f 4121 4151 4152 4122 +f 4124 4137 4138 4125 +f 4128 4141 4142 4129 +f 4132 4145 4146 4133 +f 4137 4154 4155 4138 +f 4415 4158 4159 4414 +f 4411 4162 4163 4410 +f 4149 4179 4180 4150 +f 3464 3493 4166 4153 +f 4156 4169 4170 4157 +f 4160 4173 4174 4161 +f 3493 3548 4183 4166 +f 4169 4186 4187 4170 +f 4408 4190 4191 4407 +f 4177 4194 4206 4207 4178 +f 4181 4210 4211 4182 +f 4184 4196 4197 4185 +f 4188 4200 4201 4189 +f 4192 4204 4205 4193 +f 4196 4213 4214 4197 +f 4393 4400 4201 4200 +f 4403 4404 4205 4204 +f 4208 4237 4238 4209 +f 3631 3661 4224 4212 +f 4215 4227 4228 4216 +f 4219 4231 4232 4220 +f 3661 3716 4241 4224 +f 4227 4244 4245 4228 +f 4398 4248 4249 4397 +f 4235 4252 4265 4266 4236 +f 4239 4253 4269 4270 4240 +f 4242 4255 4256 4243 +f 4246 4259 4260 4247 +f 4250 4263 4264 4251 +f 4255 4272 4273 4256 +f 4391 4276 4277 4380 +f 4377 4280 4281 4376 +f 4267 4283 4297 4298 4268 +f 3798 3827 4284 4271 +f 4274 4287 4288 4275 +f 4278 4291 4292 4279 +f 3827 3882 4301 4284 +f 4287 4304 4305 4288 +f 4382 4383 4292 4291 +f 4295 4312 4325 4326 4296 +f 4299 4329 4330 4313 4300 +f 4302 4315 4316 4303 +f 4306 4319 4320 4307 +f 4310 4323 4324 4311 +f 4315 4332 4333 4316 +f 4389 4336 4337 4388 +f 4385 4340 4341 4374 +f 4327 3988 3987 4328 +f 3982 2977 4000 4331 +f 4334 3997 3996 4335 +f 4338 3993 3992 4339 +f 4415 4414 4142 4141 +f 4411 4410 4146 4145 +f 4407 4406 4175 4174 +f 4356 4355 4130 4131 +f 4348 4347 4081 4080 +f 4359 4364 4068 4069 +f 4366 4350 4064 4065 +f 4368 4363 4022 4021 +f 4371 4372 4008 4009 +f 4388 4387 4321 4320 +f 4375 4384 4310 4311 +f 4381 4390 4306 4307 +f 4378 4377 4263 4262 +f 4398 4397 4232 4231 +f 4403 4402 4220 4221 +f 4084 4085 4416 4417 +f 4040 4052 4419 +f 4024 4012 4420 +f 4206 4194 4424 +f 4264 4265 4428 4429 +f 4281 4294 4431 +f 4325 4312 4432 +f 4146 4147 4436 4437 +f 4101 4116 4439 +# 4404 elements diff --git a/libobj/examples/negcube.obj b/libobj/examples/negcube.obj new file mode 100644 index 0000000..18109cd --- /dev/null +++ b/libobj/examples/negcube.obj @@ -0,0 +1,33 @@ +# This is a cube with negative vertex reference numbers. Each element +# references the vertices stored immediately above it in the file. +# Note that vertices are not shared. +v 0.000000 2.000000 2.000000 +v 0.000000 0.000000 2.000000 +v 2.000000 0.000000 2.000000 +v 2.000000 2.000000 2.000000 +f -4 -3 -2 -1 +v 2.000000 2.000000 0.000000 +v 2.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 0.000000 2.000000 0.000000 +f -4 -3 -2 -1 +v 2.000000 2.000000 2.000000 +v 2.000000 0.000000 2.000000 +v 2.000000 0.000000 0.000000 +v 2.000000 2.000000 0.000000 +f -4 -3 -2 -1 +v 0.000000 2.000000 0.000000 +v 0.000000 2.000000 2.000000 +v 2.000000 2.000000 2.000000 +v 2.000000 2.000000 0.000000 +f -4 -3 -2 -1 +v 0.000000 2.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 2.000000 +v 0.000000 2.000000 2.000000 +f -4 -3 -2 -1 +v 0.000000 0.000000 2.000000 +v 0.000000 0.000000 0.000000 +v 2.000000 0.000000 0.000000 +v 2.000000 0.000000 2.000000 +f -4 -3 -2 -1 diff --git a/libobj/examples/square.obj b/libobj/examples/square.obj new file mode 100644 index 0000000..d44fd6d --- /dev/null +++ b/libobj/examples/square.obj @@ -0,0 +1,9 @@ +# This example shows a square that measures two units on each side and +# faces in the positive direction (toward the camera). Note that the +# ordering of the vertices is counterclockwise. This ordering +# determines that the square is facing forward. +v 0.000000 2.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 2.000000 0.000000 0.000000 +v 2.000000 2.000000 0.000000 +f 1 2 3 4 diff --git a/libobj/mkfile b/libobj/mkfile new file mode 100644 index 0000000..f32264e --- /dev/null +++ b/libobj/mkfile @@ -0,0 +1,9 @@ +</$objtype/mkfile + +LIB=../libobj.a$O +OFILES=\ + obj.$O\ + +HFILES=../obj.h + +</sys/src/cmd/mklib diff --git a/libobj/obj.2.man b/libobj/obj.2.man new file mode 100644 index 0000000..9196385 --- /dev/null +++ b/libobj/obj.2.man @@ -0,0 +1,88 @@ +.TH OBJ 2 +.SH NAME +objparse, +objfree, +OBJfmt, +OBJfmtinstall +\- OBJ parser +.SH SYNOPSIS +.ta 0.7i +0.7i +0.7i +0.7i +0.7i +0.7i +0.7i +.EX +#include <u.h> +#include <libc.h> +#include <obj.h> + +enum { + OBJVGeometric, + OBJVTexture, + OBJVNormal, + OBJVParametric, + OBJNVERT +}; + +enum { + OBJEPoint, + OBJELine, + OBJEFace, + OBJECurve, + OBJECurve2, + OBJESurface +}; + +enum { + OBJHTSIZE = 17 +}; + +typedef struct +{ + union { + struct { double x, y, z, w; }; /* geometric */ + struct { double u, v, vv; }; /* texture and parametric */ + struct { double i, j, k; }; /* normal */ + }; +} OBJVertex; + +typedef struct +{ + OBJVertex *verts; + int nvert; +} OBJVertexArray; + +typedef struct +{ + int *indices; + int nindex; + int type; + OBJElem *next; +} OBJElem; + +typedef struct +{ + char *name; + OBJElem *child; + OBJObject *next; +} OBJObject; + +typedef struct +{ + OBJVertexArray vertdata[OBJNVERT]; + OBJObject *objtab[OBJHTSIZE]; +} OBJ; + +OBJ *objparse(char *file); +void objfree(OBJ *obj); +int OBJfmt(Fmt*); +void OBJfmtinstall(void); +.EE +.SH DESCRIPTION +An OBJ structure contains geometry and material information about a set of 3D objects +.SH SOURCE +.B /sys/src/libobj +.SH SEE ALSO +.IR geometry (2) +.br +http://paulbourke.net/dataformats/obj +.br +https://people.sc.fsu.edu/~jburkardt/data/obj/obj.html +.SH DIAGNOSTICS +.SH BUGS diff --git a/libobj/obj.c b/libobj/obj.c new file mode 100644 index 0000000..1575f70 --- /dev/null +++ b/libobj/obj.c @@ -0,0 +1,584 @@ +#include <u.h> +#include <libc.h> +#include <ctype.h> +#include <bio.h> +#include "../obj.h" + +#undef isspace(c) +#define isspace(c) ((c) == ' ' || (c) == '\t') + +typedef struct Line Line; +struct Line +{ + char *file; + ulong lineno; +}; + +static Line curline; + +static void +error(char *fmt, ...) +{ + va_list va; + char buf[ERRMAX], *bp; + + va_start(va, fmt); + bp = seprint(buf, buf + sizeof buf, "%s:%lud ", curline.file, curline.lineno); + vseprint(bp, buf + sizeof buf, fmt, va); + va_end(va); + werrstr("%s\n", buf); +} + +static void * +emalloc(ulong n) +{ + void *p; + + p = malloc(n); + if(p == nil) + sysfatal("malloc: %r"); + memset(p, 0, n); + setmalloctag(p, getcallerpc(&n)); + return p; +} + +static void * +erealloc(void *v, ulong n) +{ + void *nv; + + nv = realloc(v, n); + if(nv == nil) + sysfatal("realloc: %r"); + setrealloctag(nv, getcallerpc(&v)); + return nv; +} + +static uint +hash(char *s) +{ + uint h; + + h = 0x811c9dc5; + while(*s != 0) + h = (h^(uchar)*s++) * 0x1000193; + return h % OBJHTSIZE; +} + +static void +addvertva(OBJVertexArray *va, OBJVertex v) +{ + va->verts = erealloc(va->verts, ++va->nvert*sizeof(OBJVertex)); + va->verts[va->nvert-1] = v; +} + +static void +addvert(OBJ *obj, OBJVertex v, int vtype) +{ + addvertva(&obj->vertdata[vtype], v); +} + +static void +addelem(OBJObject *o, OBJElem *e) +{ + OBJElem *ep; + + if(o->child == nil){ + o->child = e; + return; + } + for(ep = o->child; ep->next != nil; ep = ep->next) + ; + ep->next = e; +} + +static OBJElem * +allocelem(int t) +{ + OBJElem *e; + + e = emalloc(sizeof(OBJElem)); + e->type = t; + return e; +} + +static void +addelemidx(OBJElem *e, int idx) +{ + e->indices = erealloc(e->indices, ++e->nindex*sizeof(int)); + e->indices[e->nindex-1] = idx; +} + +static void +freeelem(OBJElem *e) +{ + free(e->indices); + free(e); +} + +static OBJObject * +alloco(char *n) +{ + OBJObject *o; + + o = emalloc(sizeof(OBJObject)); + o->name = strdup(n); + return o; +} + +static void +freeo(OBJObject *o) +{ + OBJElem *e, *ne; + + free(o->name); + for(e = o->child; e != nil; e = ne){ + ne = e->next; + freeelem(e); + } + free(o); +} + +static void +pusho(OBJ *obj, OBJObject *o) +{ + OBJObject *op, *prev; + uint h; + + prev = nil; + h = hash(o->name); + for(op = obj->objtab[h]; op != nil; prev = op, op = op->next) + if(strcmp(op->name, o->name) == 0){ + o->next = op->next; + freeo(op); + break; + } + if(prev == nil){ + obj->objtab[h] = o; + return; + } + prev->next = o; +} + +static OBJObject * +geto(OBJ *obj, char *n) +{ + OBJObject *o; + uint h; + + h = hash(n); + for(o = obj->objtab[h]; o != nil; o = o->next) + if(strcmp(o->name, n) == 0) + break; + return o; +} + +OBJ * +objparse(char *file) +{ + Biobuf *bin; + OBJ *obj; + OBJObject *o; + OBJElem *e; + OBJVertex v; + double *d; + char c, buf[256], *p; + int vtype, idx, sign; + + o = nil; + bin = Bopen(file, OREAD); + if(bin == nil) + sysfatal("Bopen: %r"); + curline.file = file; + curline.lineno = 1; + obj = emalloc(sizeof(OBJ)); + while((c = Bgetc(bin)) != Beof){ + switch(c){ + case 'v': + d = (double*)&v; + c = Bgetc(bin); + vtype = OBJVGeometric; + switch(c){ + case 't': vtype = OBJVTexture; break; + case 'p': vtype = OBJVParametric; break; + case 'n': vtype = OBJVNormal; break; + default: + if(!isspace(c)){ + error("wrong vertex type"); + goto error; + } + } + while(c = Bgetc(bin), c != Beof && c != '\n' && d-(double*)&v < 4){ + while(isspace(c)) + c = Bgetc(bin); + if(c == '\\'){ + while(c != '\n') + c = Bgetc(bin); + continue; + } + if(c != '-' && !isdigit(c)){ + error("unexpected character '%c'", c); + goto error; + } + Bungetc(bin); + Bgetd(bin, d++); + } + switch(vtype){ + case OBJVGeometric: + if(d-(double*)&v < 3){ + error("not enough coordinates"); + goto error; + } + if(d-(double*)&v < 4) + *d = 1; /* default w value */ + break; + case OBJVTexture: + if(d-(double*)&v < 1){ + error("not enough coordinates"); + goto error; + } + while(d-(double*)&v < 3) + *d++ = 0; /* default v and w values */ + break; + case OBJVParametric: + if(d-(double*)&v < 2){ + error("not enough coordinates"); + goto error; + } + if(d-(double*)&v < 3) + *d = 1; /* default w value */ + break; + case OBJVNormal: + if(d-(double*)&v < 3){ + error("not enough coordinates"); + goto error; + } + } + addvert(obj, v, vtype); + break; + case 'o': + p = buf; + c = Bgetc(bin); + if(!isspace(c)){ + error("syntax error"); + goto error; + } + while(isspace(c)) + c = Bgetc(bin); + if(!isalnum(c)){ + error("unexpected character '%c'", c); + goto error; + } + do{ + *p++ = c; + }while(c = Bgetc(bin), isalnum(c) && p-buf < sizeof(buf)-1); + *p = 0; + o = geto(obj, buf); + if(o == nil){ + o = alloco(buf); + pusho(obj, o); + } + break; + case 'g': + case 's': + /* element and smoothing groups ignored for now */ + while(c != '\n') + c = Bgetc(bin); + break; + case 'p': + c = Bgetc(bin); + if(!isspace(c)){ + error("syntax error"); + goto error; + } + while(c = Bgetc(bin), c != '\n'){ + idx = 0; + sign = 0; + while(isspace(c)) + c = Bgetc(bin); + if(c == '\\'){ + while(c != '\n') + c = Bgetc(bin); + continue; + } + if(c != '-' && !isdigit(c)){ + error("unexpected character '%c'", c); + goto error; + } + if(c == '-'){ + sign = 1; + c = Bgetc(bin); + if(!isdigit(c)){ + error("unexpected character '%c'", c); + goto error; + } + } + do{ + idx = idx*10 + c-'0'; + }while(c = Bgetc(bin), isdigit(c)); + Bungetc(bin); + idx = sign ? obj->vertdata[OBJVGeometric].nvert-idx : idx-1; + if(idx+1 > obj->vertdata[OBJVGeometric].nvert){ + error("not enough vertices"); + goto error; + } + e = allocelem(OBJEPoint); + addelemidx(e, idx); + if(o == nil){ + o = alloco("default"); + pusho(obj, o); + } + addelem(o, e); + } + break; + case 'l': + c = Bgetc(bin); + if(!isspace(c)){ + error("syntax error"); + goto error; + } + while(c = Bgetc(bin), c != '\n'){ + idx = 0; + sign = 0; + while(isspace(c)) + c = Bgetc(bin); + if(c == '\\'){ + while(c != '\n') + c = Bgetc(bin); + continue; + } + if(c != '-' && !isdigit(c)){ + error("unexpected character '%c'", c); + goto error; + } + if(c == '-'){ + sign = 1; + c = Bgetc(bin); + if(!isdigit(c)){ + error("unexpected character '%c'", c); + goto error; + } + } + do{ + idx = idx*10 + c-'0'; + }while(c = Bgetc(bin), isdigit(c)); + idx = sign ? obj->vertdata[OBJVGeometric].nvert-idx : idx-1; + if(idx+1 > obj->vertdata[OBJVGeometric].nvert){ + error("not enough vertices"); + goto error; + } + e = allocelem(OBJELine); + addelemidx(e, idx); +Line2: + idx = 0; + sign = 0; + while(isspace(c)) + c = Bgetc(bin); + if(c == '\\'){ + while(c != '\n') + c = Bgetc(bin); + c = Bgetc(bin); + goto Line2; + } + if(c != '-' && !isdigit(c)){ + freeelem(e); + error("unexpected character '%c'", c); + goto error; + } + if(c == '-'){ + sign = 1; + c = Bgetc(bin); + if(!isdigit(c)){ + freeelem(e); + error("unexpected character '%c'", c); + goto error; + } + } + do{ + idx = idx*10 + c-'0'; + }while(c = Bgetc(bin), isdigit(c)); + Bungetc(bin); + idx = sign ? obj->vertdata[OBJVGeometric].nvert-idx : idx-1; + if(idx+1 > obj->vertdata[OBJVGeometric].nvert){ + freeelem(e); + error("not enough vertices"); + goto error; + } + addelemidx(e, idx); + if(o == nil){ + o = alloco("default"); + pusho(obj, o); + } + addelem(o, e); + } + break; + case 'f': + e = allocelem(OBJEFace); + c = Bgetc(bin); + if(!isspace(c)){ + freeelem(e); + error("syntax error"); + goto error; + } + while(c = Bgetc(bin), c != '\n'){ + idx = 0; + sign = 0; + while(isspace(c)) + c = Bgetc(bin); + if(c == '\\'){ + while(c != '\n') + c = Bgetc(bin); + continue; + } + if(c != '-' && !isdigit(c)){ + freeelem(e); + error("unexpected character '%c'", c); + goto error; + } + if(c == '-'){ + sign = 1; + c = Bgetc(bin); + if(!isdigit(c)){ + freeelem(e); + error("unexpected character '%c'", c); + goto error; + } + } + do{ + idx = idx*10 + c-'0'; + }while(c = Bgetc(bin), isdigit(c)); + Bungetc(bin); + idx = sign ? obj->vertdata[OBJVGeometric].nvert-idx : idx-1; + if(idx+1 > obj->vertdata[OBJVGeometric].nvert){ + freeelem(e); + error("not enough vertices"); + goto error; + } + addelemidx(e, idx); + } + if(o == nil){ + o = alloco("default"); + pusho(obj, o); + } + addelem(o, e); + break; + case 'm': + case 'u': + p = buf; + do{ + *p++ = c; + }while(c = Bgetc(bin), isalpha(c) && p-buf < sizeof(buf)-1); + *p = 0; + if(strcmp(buf, "mtllib") != 0 && strcmp(buf, "usemtl") != 0){ + error("syntax error"); + goto error; + } + while(c != '\n') + c = Bgetc(bin); + break; + case '#': + while(c != '\n') + c = Bgetc(bin); + break; + } + do{ + if(c == '\n'){ + curline.lineno++; + break; + } + if(!isspace(c)){ + error("syntax error"); + goto error; + } + }while((c = Bgetc(bin)) != Beof); + } + Bterm(bin); + return obj; +error: + objfree(obj); + Bterm(bin); + return nil; +} + +void +objfree(OBJ *obj) +{ + OBJObject *o, *no; + int i; + + if(obj == nil) + return; + for(i = 0; i < nelem(obj->vertdata); i++) + free(obj->vertdata[i].verts); + for(i = 0; i < nelem(obj->objtab); i++) + for(o = obj->objtab[i]; o != nil; o = no){ + no = o->next; + freeo(o); + } + free(obj); +} + +int +OBJfmt(Fmt *f) +{ + OBJ *obj; + OBJObject *o; + OBJElem *e; + OBJVertex v; + int i, j, r, pack; + + r = pack = 0; + obj = va_arg(f->args, OBJ*); + for(i = 0; i < nelem(obj->vertdata); i++) + for(j = 0; j < obj->vertdata[i].nvert; j++){ + v = obj->vertdata[i].verts[j]; + switch(i){ + case OBJVGeometric: + r += fmtprint(f, "v %g %g %g %g\n", v.x, v.y, v.z, v.w); + break; + case OBJVTexture: + r += fmtprint(f, "vt %g %g %g\n", v.u, v.v, v.vv); + break; + case OBJVNormal: + r += fmtprint(f, "vn %g %g %g\n", v.i, v.j, v.k); + break; + case OBJVParametric: + r += fmtprint(f, "vp %g %g %g\n", v.u, v.v, v.vv); + break; + } + } + for(i = 0; i < nelem(obj->objtab); i++) + for(o = obj->objtab[i]; o != nil; o = o->next){ + if(strcmp(o->name, "default") != 0) + r += fmtprint(f, "o %s\n", o->name); + for(e = o->child; e != nil; e = e->next){ + switch(e->type){ + case OBJEPoint: + if(pack == 0) + r += fmtprint(f, "p"); + pack = pack > 0 ? --pack : 8-1; + break; + case OBJELine: + r += fmtprint(f, "l"); + break; + case OBJEFace: + r += fmtprint(f, "f"); + break; + //case OBJECurve: + //case OBJECurve2: + //case OBJESurface: + } + for(j = 0; j < e->nindex; j++) + r += fmtprint(f, " %d", e->indices[j]+1); + if(e->type != OBJEPoint || pack == 0) + r += fmtprint(f, "\n"); + } + } + return r; +} + +void +OBJfmtinstall(void) +{ + fmtinstall('O', OBJfmt); +} diff --git a/libobj/spec b/libobj/spec new file mode 100644 index 0000000..a535f4b --- /dev/null +++ b/libobj/spec @@ -0,0 +1,2 @@ +http://paulbourke.net/dataformats/obj +https://people.sc.fsu.edu/~jburkardt/data/obj/obj.html diff --git a/libobj/test/main.acid b/libobj/test/main.acid new file mode 100644 index 0000000..25a8f30 --- /dev/null +++ b/libobj/test/main.acid @@ -0,0 +1,525 @@ +sizeof_1_ = 8; +aggr _1_ +{ + 'U' 0 lo; + 'U' 4 hi; +}; + +defn +_1_(addr) { + complex _1_ addr; + print(" lo ", addr.lo, "\n"); + print(" hi ", addr.hi, "\n"); +}; + +sizeofFPdbleword = 8; +aggr FPdbleword +{ + 'F' 0 x; + { + 'U' 0 lo; + 'U' 4 hi; + }; +}; + +defn +FPdbleword(addr) { + complex FPdbleword addr; + print(" x ", addr.x, "\n"); + print("_1_ {\n"); + _1_(addr+0); + print("}\n"); +}; + +UTFmax = 4; +Runesync = 128; +Runeself = 128; +Runeerror = 65533; +Runemax = 1114111; +Runemask = 2097151; +sizeofFmt = 80; +aggr Fmt +{ + 'b' 0 runes; + 'Y' 8 start; + 'Y' 16 to; + 'Y' 24 stop; + 'Y' 32 flush; + 'Y' 40 farg; + 'D' 48 nfmt; + 'Y' 56 args; + 'D' 64 r; + 'D' 68 width; + 'D' 72 prec; + 'U' 76 flags; +}; + +defn +Fmt(addr) { + complex Fmt addr; + print(" runes ", addr.runes, "\n"); + print(" start ", addr.start\Y, "\n"); + print(" to ", addr.to\Y, "\n"); + print(" stop ", addr.stop\Y, "\n"); + print(" flush ", addr.flush\Y, "\n"); + print(" farg ", addr.farg\Y, "\n"); + print(" nfmt ", addr.nfmt, "\n"); + print(" args ", addr.args\Y, "\n"); + print(" r ", addr.r, "\n"); + print(" width ", addr.width, "\n"); + print(" prec ", addr.prec, "\n"); + print(" flags ", addr.flags, "\n"); +}; + +FmtWidth = 1; +FmtLeft = 2; +FmtPrec = 4; +FmtSharp = 8; +FmtSpace = 16; +FmtSign = 32; +FmtZero = 64; +FmtUnsigned = 128; +FmtShort = 256; +FmtLong = 512; +FmtVLong = 1024; +FmtComma = 2048; +FmtByte = 4096; +FmtFlag = 8192; +sizeofTm = 40; +aggr Tm +{ + 'D' 0 sec; + 'D' 4 min; + 'D' 8 hour; + 'D' 12 mday; + 'D' 16 mon; + 'D' 20 year; + 'D' 24 wday; + 'D' 28 yday; + 'a' 32 zone; + 'D' 36 tzoff; +}; + +defn +Tm(addr) { + complex Tm addr; + print(" sec ", addr.sec, "\n"); + print(" min ", addr.min, "\n"); + print(" hour ", addr.hour, "\n"); + print(" mday ", addr.mday, "\n"); + print(" mon ", addr.mon, "\n"); + print(" year ", addr.year, "\n"); + print(" wday ", addr.wday, "\n"); + print(" yday ", addr.yday, "\n"); + print(" zone ", addr.zone, "\n"); + print(" tzoff ", addr.tzoff, "\n"); +}; + +PNPROC = 1; +PNGROUP = 2; +Profoff = 0; +Profuser = 1; +Profkernel = 2; +Proftime = 3; +Profsample = 4; +sizeofLock = 8; +aggr Lock +{ + 'D' 0 val; +}; + +defn +Lock(addr) { + complex Lock addr; + print(" val ", addr.val, "\n"); +}; + +sizeofQLp = 16; +aggr QLp +{ + 'D' 0 inuse; + 'D' 4 state; + 'A' QLp 8 next; +}; + +defn +QLp(addr) { + complex QLp addr; + print(" inuse ", addr.inuse, "\n"); + print(" state ", addr.state, "\n"); + print(" next ", addr.next\Y, "\n"); +}; + +sizeofQLock = 32; +aggr QLock +{ + Lock 0 lock; + 'D' 8 locked; + 'A' QLp 16 $head; + 'A' QLp 24 $tail; +}; + +defn +QLock(addr) { + complex QLock addr; + print("Lock lock {\n"); + Lock(addr.lock); + print("}\n"); + print(" locked ", addr.locked, "\n"); + print(" $head ", addr.$head\Y, "\n"); + print(" $tail ", addr.$tail\Y, "\n"); +}; + +sizeofRWLock = 32; +aggr RWLock +{ + Lock 0 lock; + 'D' 8 readers; + 'D' 12 writer; + 'A' QLp 16 $head; + 'A' QLp 24 $tail; +}; + +defn +RWLock(addr) { + complex RWLock addr; + print("Lock lock {\n"); + Lock(addr.lock); + print("}\n"); + print(" readers ", addr.readers, "\n"); + print(" writer ", addr.writer, "\n"); + print(" $head ", addr.$head\Y, "\n"); + print(" $tail ", addr.$tail\Y, "\n"); +}; + +sizeofRendez = 24; +aggr Rendez +{ + 'A' QLock 0 l; + 'A' QLp 8 $head; + 'A' QLp 16 $tail; +}; + +defn +Rendez(addr) { + complex Rendez addr; + print(" l ", addr.l\Y, "\n"); + print(" $head ", addr.$head\Y, "\n"); + print(" $tail ", addr.$tail\Y, "\n"); +}; + +sizeofNetConnInfo = 72; +aggr NetConnInfo +{ + 'Y' 0 dir; + 'Y' 8 root; + 'Y' 16 spec; + 'Y' 24 lsys; + 'Y' 32 lserv; + 'Y' 40 rsys; + 'Y' 48 rserv; + 'Y' 56 laddr; + 'Y' 64 raddr; +}; + +defn +NetConnInfo(addr) { + complex NetConnInfo addr; + print(" dir ", addr.dir\Y, "\n"); + print(" root ", addr.root\Y, "\n"); + print(" spec ", addr.spec\Y, "\n"); + print(" lsys ", addr.lsys\Y, "\n"); + print(" lserv ", addr.lserv\Y, "\n"); + print(" rsys ", addr.rsys\Y, "\n"); + print(" rserv ", addr.rserv\Y, "\n"); + print(" laddr ", addr.laddr\Y, "\n"); + print(" raddr ", addr.raddr\Y, "\n"); +}; + +RFNAMEG = 1; +RFENVG = 2; +RFFDG = 4; +RFNOTEG = 8; +RFPROC = 16; +RFMEM = 32; +RFNOWAIT = 64; +RFCNAMEG = 1024; +RFCENVG = 2048; +RFCFDG = 4096; +RFREND = 8192; +RFNOMNT = 16384; +sizeofQid = 16; +aggr Qid +{ + 'W' 0 path; + 'U' 8 vers; + 'b' 12 type; +}; + +defn +Qid(addr) { + complex Qid addr; + print(" path ", addr.path, "\n"); + print(" vers ", addr.vers, "\n"); + print(" type ", addr.type, "\n"); +}; + +sizeofDir = 80; +aggr Dir +{ + 'u' 0 type; + 'U' 4 dev; + Qid 8 qid; + 'U' 24 mode; + 'U' 28 atime; + 'U' 32 mtime; + 'V' 40 length; + 'Y' 48 name; + 'Y' 56 uid; + 'Y' 64 gid; + 'Y' 72 muid; +}; + +defn +Dir(addr) { + complex Dir addr; + print(" type ", addr.type, "\n"); + print(" dev ", addr.dev, "\n"); + print("Qid qid {\n"); + Qid(addr.qid); + print("}\n"); + print(" mode ", addr.mode, "\n"); + print(" atime ", addr.atime, "\n"); + print(" mtime ", addr.mtime, "\n"); + print(" length ", addr.length, "\n"); + print(" name ", addr.name\Y, "\n"); + print(" uid ", addr.uid\Y, "\n"); + print(" gid ", addr.gid\Y, "\n"); + print(" muid ", addr.muid\Y, "\n"); +}; + +sizeofWaitmsg = 24; +aggr Waitmsg +{ + 'D' 0 pid; + 'a' 4 time; + 'Y' 16 msg; +}; + +defn +Waitmsg(addr) { + complex Waitmsg addr; + print(" pid ", addr.pid, "\n"); + print(" time ", addr.time, "\n"); + print(" msg ", addr.msg\Y, "\n"); +}; + +sizeofIOchunk = 16; +aggr IOchunk +{ + 'Y' 0 addr; + 'U' 8 len; +}; + +defn +IOchunk(addr) { + complex IOchunk addr; + print(" addr ", addr.addr\Y, "\n"); + print(" len ", addr.len, "\n"); +}; + +OBJVGeometric = 0; +OBJVTexture = 1; +OBJVNormal = 2; +OBJVParametric = 3; +OBJNVERT = 4; +OBJEPoint = 0; +OBJELine = 1; +OBJEFace = 2; +OBJECurve = 3; +OBJECurve2 = 4; +OBJESurface = 5; +OBJGGlobal = 0; +OBJGSmoothing = 1; +OBJGMerging = 2; +OBJGObject = 3; +OBJHTSIZE = 16; +sizeof_2_ = 32; +aggr _2_ +{ + 'F' 0 x; + 'F' 8 y; + 'F' 16 z; + 'F' 24 w; +}; + +defn +_2_(addr) { + complex _2_ addr; + print(" x ", addr.x, "\n"); + print(" y ", addr.y, "\n"); + print(" z ", addr.z, "\n"); + print(" w ", addr.w, "\n"); +}; + +sizeof_3_ = 24; +aggr _3_ +{ + 'F' 0 u; + 'F' 8 v; + 'F' 16 vv; +}; + +defn +_3_(addr) { + complex _3_ addr; + print(" u ", addr.u, "\n"); + print(" v ", addr.v, "\n"); + print(" vv ", addr.vv, "\n"); +}; + +sizeof_4_ = 24; +aggr _4_ +{ + 'F' 0 i; + 'F' 8 j; + 'F' 16 k; +}; + +defn +_4_(addr) { + complex _4_ addr; + print(" i ", addr.i, "\n"); + print(" j ", addr.j, "\n"); + print(" k ", addr.k, "\n"); +}; + +sizeof_5_ = 32; +aggr _5_ +{ + { + 'F' 0 x; + 'F' 8 y; + 'F' 16 z; + 'F' 24 w; + }; + { + 'F' 0 u; + 'F' 8 v; + 'F' 16 vv; + }; + { + 'F' 0 i; + 'F' 8 j; + 'F' 16 k; + }; +}; + +defn +_5_(addr) { + complex _5_ addr; + print("_2_ {\n"); + _2_(addr+0); + print("}\n"); + print("_3_ {\n"); + _3_(addr+0); + print("}\n"); + print("_4_ {\n"); + _4_(addr+0); + print("}\n"); +}; + +sizeofOBJVertex = 32; +aggr OBJVertex +{ + { + { + 'F' 0 x; + 'F' 8 y; + 'F' 16 z; + 'F' 24 w; + }; + { + 'F' 0 u; + 'F' 8 v; + 'F' 16 vv; + }; + { + 'F' 0 i; + 'F' 8 j; + 'F' 16 k; + }; + }; +}; + +defn +OBJVertex(addr) { + complex OBJVertex addr; + print("_5_ {\n"); + _5_(addr+0); + print("}\n"); +}; + +sizeofOBJVertexArray = 16; +aggr OBJVertexArray +{ + 'A' OBJVertex 0 verts; + 'D' 8 nvert; +}; + +defn +OBJVertexArray(addr) { + complex OBJVertexArray addr; + print(" verts ", addr.verts\Y, "\n"); + print(" nvert ", addr.nvert, "\n"); +}; + +sizeofOBJElem = 24; +aggr OBJElem +{ + 'Y' 0 indices; + 'D' 8 nindex; + 'D' 12 type; + 'A' OBJElem 16 next; +}; + +defn +OBJElem(addr) { + complex OBJElem addr; + print(" indices ", addr.indices\Y, "\n"); + print(" nindex ", addr.nindex, "\n"); + print(" type ", addr.type, "\n"); + print(" next ", addr.next\Y, "\n"); +}; + +sizeofOBJObject = 24; +aggr OBJObject +{ + 'Y' 0 name; + 'A' OBJElem 8 child; + 'A' OBJObject 16 next; +}; + +defn +OBJObject(addr) { + complex OBJObject addr; + print(" name ", addr.name\Y, "\n"); + print(" child ", addr.child\Y, "\n"); + print(" next ", addr.next\Y, "\n"); +}; + +sizeofOBJ = 192; +aggr OBJ +{ + 'a' 0 vertdata; + 'a' 64 objtab; +}; + +defn +OBJ(addr) { + complex OBJ addr; + print(" vertdata ", addr.vertdata, "\n"); + print(" objtab ", addr.objtab, "\n"); +}; + +complex OBJ main:obj; diff --git a/libobj/test/main.c b/libobj/test/main.c new file mode 100644 index 0000000..1a60b42 --- /dev/null +++ b/libobj/test/main.c @@ -0,0 +1,35 @@ +#include <u.h> +#include <libc.h> +#include "../../obj.h" + +static char fd0[] = "/fd/0"; + +void +usage(void) +{ + fprint(2, "usage: %s [file]\n", argv0); + exits("usage"); +} + +void +main(int argc, char *argv[]) +{ + OBJ *obj; + char *f; + + f = fd0; + OBJfmtinstall(); + ARGBEGIN{ + default: usage(); + }ARGEND; + if(argc > 1) + usage(); + if(argc == 1) + f = argv[0]; + obj = objparse(f); + if(obj == nil) + sysfatal("objparse: %r"); + print("%O\n", obj); + objfree(obj); + exits(0); +} diff --git a/libobj/test/mkfile b/libobj/test/mkfile new file mode 100644 index 0000000..2f4895c --- /dev/null +++ b/libobj/test/mkfile @@ -0,0 +1,21 @@ +</$objtype/mkfile + +BIN=$home/$objtype/bin +TARG=objtest +OFILES=\ + main.$O\ + +HFILES=../../obj.h + +LIB=\ + ../../libobj.a$O\ + +</sys/src/cmd/mkone + +../../libobj.a$O: + cd .. + mk install + +clean nuke:V: + rm -f *.[$OS] [$OS].out y.tab.? y.debug y.output $TARG + @{cd ..; mk $target} diff --git a/main.acid b/main.acid new file mode 100644 index 0000000..67e14e0 --- /dev/null +++ b/main.acid @@ -0,0 +1,1153 @@ +sizeof_1_ = 8; +aggr _1_ +{ + 'U' 0 lo; + 'U' 4 hi; +}; + +defn +_1_(addr) { + complex _1_ addr; + print(" lo ", addr.lo, "\n"); + print(" hi ", addr.hi, "\n"); +}; + +sizeofFPdbleword = 8; +aggr FPdbleword +{ + 'F' 0 x; + { + 'U' 0 lo; + 'U' 4 hi; + }; +}; + +defn +FPdbleword(addr) { + complex FPdbleword addr; + print(" x ", addr.x, "\n"); + print("_1_ {\n"); + _1_(addr+0); + print("}\n"); +}; + +UTFmax = 4; +Runesync = 128; +Runeself = 128; +Runeerror = 65533; +Runemax = 1114111; +Runemask = 2097151; +sizeofFmt = 80; +aggr Fmt +{ + 'b' 0 runes; + 'Y' 8 start; + 'Y' 16 to; + 'Y' 24 stop; + 'Y' 32 flush; + 'Y' 40 farg; + 'D' 48 nfmt; + 'Y' 56 args; + 'D' 64 r; + 'D' 68 width; + 'D' 72 prec; + 'U' 76 flags; +}; + +defn +Fmt(addr) { + complex Fmt addr; + print(" runes ", addr.runes, "\n"); + print(" start ", addr.start\Y, "\n"); + print(" to ", addr.to\Y, "\n"); + print(" stop ", addr.stop\Y, "\n"); + print(" flush ", addr.flush\Y, "\n"); + print(" farg ", addr.farg\Y, "\n"); + print(" nfmt ", addr.nfmt, "\n"); + print(" args ", addr.args\Y, "\n"); + print(" r ", addr.r, "\n"); + print(" width ", addr.width, "\n"); + print(" prec ", addr.prec, "\n"); + print(" flags ", addr.flags, "\n"); +}; + +FmtWidth = 1; +FmtLeft = 2; +FmtPrec = 4; +FmtSharp = 8; +FmtSpace = 16; +FmtSign = 32; +FmtZero = 64; +FmtUnsigned = 128; +FmtShort = 256; +FmtLong = 512; +FmtVLong = 1024; +FmtComma = 2048; +FmtByte = 4096; +FmtFlag = 8192; +sizeofTm = 40; +aggr Tm +{ + 'D' 0 sec; + 'D' 4 min; + 'D' 8 hour; + 'D' 12 mday; + 'D' 16 mon; + 'D' 20 year; + 'D' 24 wday; + 'D' 28 yday; + 'a' 32 zone; + 'D' 36 tzoff; +}; + +defn +Tm(addr) { + complex Tm addr; + print(" sec ", addr.sec, "\n"); + print(" min ", addr.min, "\n"); + print(" hour ", addr.hour, "\n"); + print(" mday ", addr.mday, "\n"); + print(" mon ", addr.mon, "\n"); + print(" year ", addr.year, "\n"); + print(" wday ", addr.wday, "\n"); + print(" yday ", addr.yday, "\n"); + print(" zone ", addr.zone, "\n"); + print(" tzoff ", addr.tzoff, "\n"); +}; + +PNPROC = 1; +PNGROUP = 2; +Profoff = 0; +Profuser = 1; +Profkernel = 2; +Proftime = 3; +Profsample = 4; +sizeofLock = 8; +aggr Lock +{ + 'D' 0 val; +}; + +defn +Lock(addr) { + complex Lock addr; + print(" val ", addr.val, "\n"); +}; + +sizeofQLp = 16; +aggr QLp +{ + 'D' 0 inuse; + 'D' 4 state; + 'A' QLp 8 next; +}; + +defn +QLp(addr) { + complex QLp addr; + print(" inuse ", addr.inuse, "\n"); + print(" state ", addr.state, "\n"); + print(" next ", addr.next\Y, "\n"); +}; + +sizeofQLock = 32; +aggr QLock +{ + Lock 0 lock; + 'D' 8 locked; + 'A' QLp 16 $head; + 'A' QLp 24 $tail; +}; + +defn +QLock(addr) { + complex QLock addr; + print("Lock lock {\n"); + Lock(addr.lock); + print("}\n"); + print(" locked ", addr.locked, "\n"); + print(" $head ", addr.$head\Y, "\n"); + print(" $tail ", addr.$tail\Y, "\n"); +}; + +sizeofRWLock = 32; +aggr RWLock +{ + Lock 0 lock; + 'D' 8 readers; + 'D' 12 writer; + 'A' QLp 16 $head; + 'A' QLp 24 $tail; +}; + +defn +RWLock(addr) { + complex RWLock addr; + print("Lock lock {\n"); + Lock(addr.lock); + print("}\n"); + print(" readers ", addr.readers, "\n"); + print(" writer ", addr.writer, "\n"); + print(" $head ", addr.$head\Y, "\n"); + print(" $tail ", addr.$tail\Y, "\n"); +}; + +sizeofRendez = 24; +aggr Rendez +{ + 'A' QLock 0 l; + 'A' QLp 8 $head; + 'A' QLp 16 $tail; +}; + +defn +Rendez(addr) { + complex Rendez addr; + print(" l ", addr.l\Y, "\n"); + print(" $head ", addr.$head\Y, "\n"); + print(" $tail ", addr.$tail\Y, "\n"); +}; + +sizeofNetConnInfo = 72; +aggr NetConnInfo +{ + 'Y' 0 dir; + 'Y' 8 root; + 'Y' 16 spec; + 'Y' 24 lsys; + 'Y' 32 lserv; + 'Y' 40 rsys; + 'Y' 48 rserv; + 'Y' 56 laddr; + 'Y' 64 raddr; +}; + +defn +NetConnInfo(addr) { + complex NetConnInfo addr; + print(" dir ", addr.dir\Y, "\n"); + print(" root ", addr.root\Y, "\n"); + print(" spec ", addr.spec\Y, "\n"); + print(" lsys ", addr.lsys\Y, "\n"); + print(" lserv ", addr.lserv\Y, "\n"); + print(" rsys ", addr.rsys\Y, "\n"); + print(" rserv ", addr.rserv\Y, "\n"); + print(" laddr ", addr.laddr\Y, "\n"); + print(" raddr ", addr.raddr\Y, "\n"); +}; + +RFNAMEG = 1; +RFENVG = 2; +RFFDG = 4; +RFNOTEG = 8; +RFPROC = 16; +RFMEM = 32; +RFNOWAIT = 64; +RFCNAMEG = 1024; +RFCENVG = 2048; +RFCFDG = 4096; +RFREND = 8192; +RFNOMNT = 16384; +sizeofQid = 16; +aggr Qid +{ + 'W' 0 path; + 'U' 8 vers; + 'b' 12 type; +}; + +defn +Qid(addr) { + complex Qid addr; + print(" path ", addr.path, "\n"); + print(" vers ", addr.vers, "\n"); + print(" type ", addr.type, "\n"); +}; + +sizeofDir = 80; +aggr Dir +{ + 'u' 0 type; + 'U' 4 dev; + Qid 8 qid; + 'U' 24 mode; + 'U' 28 atime; + 'U' 32 mtime; + 'V' 40 length; + 'Y' 48 name; + 'Y' 56 uid; + 'Y' 64 gid; + 'Y' 72 muid; +}; + +defn +Dir(addr) { + complex Dir addr; + print(" type ", addr.type, "\n"); + print(" dev ", addr.dev, "\n"); + print("Qid qid {\n"); + Qid(addr.qid); + print("}\n"); + print(" mode ", addr.mode, "\n"); + print(" atime ", addr.atime, "\n"); + print(" mtime ", addr.mtime, "\n"); + print(" length ", addr.length, "\n"); + print(" name ", addr.name\Y, "\n"); + print(" uid ", addr.uid\Y, "\n"); + print(" gid ", addr.gid\Y, "\n"); + print(" muid ", addr.muid\Y, "\n"); +}; + +sizeofWaitmsg = 24; +aggr Waitmsg +{ + 'D' 0 pid; + 'a' 4 time; + 'Y' 16 msg; +}; + +defn +Waitmsg(addr) { + complex Waitmsg addr; + print(" pid ", addr.pid, "\n"); + print(" time ", addr.time, "\n"); + print(" msg ", addr.msg\Y, "\n"); +}; + +sizeofIOchunk = 16; +aggr IOchunk +{ + 'Y' 0 addr; + 'U' 8 len; +}; + +defn +IOchunk(addr) { + complex IOchunk addr; + print(" addr ", addr.addr\Y, "\n"); + print(" len ", addr.len, "\n"); +}; + +Nqwds = 2; +Nqshift = 5; +Nqmask = -1; +Nqbits = 64; +sizeofChannel = 48; +aggr Channel +{ + 'D' 0 s; + 'U' 4 f; + 'U' 8 n; + 'D' 12 e; + 'D' 16 freed; + 'Y' 24 qentry; + 'D' 32 nentry; + 'D' 36 closed; + 'a' 40 v; +}; + +defn +Channel(addr) { + complex Channel addr; + print(" s ", addr.s, "\n"); + print(" f ", addr.f, "\n"); + print(" n ", addr.n, "\n"); + print(" e ", addr.e, "\n"); + print(" freed ", addr.freed, "\n"); + print(" qentry ", addr.qentry\Y, "\n"); + print(" nentry ", addr.nentry, "\n"); + print(" closed ", addr.closed, "\n"); + print(" v ", addr.v, "\n"); +}; + +CHANEND = 0; +CHANSND = 1; +CHANRCV = 2; +CHANNOP = 3; +CHANNOBLK = 4; +sizeofAlt = 48; +aggr Alt +{ + 'A' Channel 0 c; + 'Y' 8 v; + 'D' 16 op; + 'Y' 24 err; + 'A' Channel 32 tag; + 'D' 40 entryno; +}; + +defn +Alt(addr) { + complex Alt addr; + print(" c ", addr.c\Y, "\n"); + print(" v ", addr.v\Y, "\n"); + print(" op ", addr.op, "\n"); + print(" err ", addr.err\Y, "\n"); + print(" tag ", addr.tag\Y, "\n"); + print(" entryno ", addr.entryno, "\n"); +}; + +sizeofRef = 8; +aggr Ref +{ + 'D' 0 ref; +}; + +defn +Ref(addr) { + complex Ref addr; + print(" ref ", addr.ref, "\n"); +}; + +DOpaque = 4294967295; +DTransparent = 0; +DBlack = 255; +DWhite = 4294967295; +DRed = 4278190335; +DGreen = 16711935; +DBlue = 65535; +DCyan = 16777215; +DMagenta = 4278255615; +DYellow = 4294902015; +DPaleyellow = 4294945535; +DDarkyellow = 4008615679; +DDarkgreen = 1149781247; +DPalegreen = 2868882175; +DMedgreen = 2295105791; +DDarkblue = 22015; +DPalebluegreen = 2868903935; +DPaleblue = 48127; +DBluegreen = 8947967; +DGreygreen = 1437248255; +DPalegreygreen = 2666458879; +DYellowgreen = 2576960767; +DMedblue = 39423; +DGreyblue = 6142975; +DPalegreyblue = 1234427391; +DPurpleblue = 2290666751; +DNotacolor = 4294967040; +DNofill = 4294967040; +Displaybufsize = 8000; +ICOSSCALE = 1024; +Borderwidth = 4; +Refbackup = 0; +Refnone = 1; +Refmesg = 2; +Endsquare = 0; +Enddisc = 1; +Endarrow = 2; +Endmask = 31; +Clear = 0; +SinD = 8; +DinS = 4; +SoutD = 2; +DoutS = 1; +S = 10; +SoverD = 11; +SatopD = 9; +SxorD = 3; +D = 5; +DoverS = 7; +DatopS = 6; +DxorS = 3; +Ncomp = 12; +CRed = 0; +CGreen = 1; +CBlue = 2; +CGrey = 3; +CAlpha = 4; +CMap = 5; +CIgnore = 6; +NChan = 7; +GREY1 = 49; +GREY2 = 50; +GREY4 = 52; +GREY8 = 56; +CMAP8 = 88; +RGB15 = 1627723045; +RGB16 = 333349; +RGB24 = 530472; +RGBA32 = 135800904; +ARGB32 = 1208490024; +XRGB32 = 1745360936; +BGR24 = 2627592; +ABGR32 = 1210587144; +XBGR32 = 1747458056; +sizeofPoint = 8; +aggr Point +{ + 'D' 0 x; + 'D' 4 y; +}; + +defn +Point(addr) { + complex Point addr; + print(" x ", addr.x, "\n"); + print(" y ", addr.y, "\n"); +}; + +sizeofRectangle = 16; +aggr Rectangle +{ + Point 0 min; + Point 8 max; +}; + +defn +Rectangle(addr) { + complex Rectangle addr; + print("Point min {\n"); + Point(addr.min); + print("}\n"); + print("Point max {\n"); + Point(addr.max); + print("}\n"); +}; + +sizeofScreen = 32; +aggr Screen +{ + 'Y' 0 display; + 'D' 8 id; + 'Y' 16 image; + 'Y' 24 fill; +}; + +defn +Screen(addr) { + complex Screen addr; + print(" display ", addr.display\Y, "\n"); + print(" id ", addr.id, "\n"); + print(" image ", addr.image\Y, "\n"); + print(" fill ", addr.fill\Y, "\n"); +}; + +sizeofDisplay = 264; +aggr Display +{ + QLock 0 qlock; + 'D' 32 locking; + 'D' 36 dirno; + 'D' 40 fd; + 'D' 44 reffd; + 'D' 48 ctlfd; + 'D' 52 imageid; + 'D' 56 $local; + 'Y' 64 error; + 'Y' 72 devdir; + 'Y' 80 windir; + 'a' 88 oldlabel; + 'U' 152 dataqid; + 'Y' 160 white; + 'Y' 168 black; + 'Y' 176 opaque; + 'Y' 184 transparent; + 'Y' 192 image; + 'Y' 200 buf; + 'D' 208 bufsize; + 'Y' 216 bufp; + 'Y' 224 defaultfont; + 'Y' 232 defaultsubfont; + 'Y' 240 windows; + 'Y' 248 screenimage; + 'D' 256 _isnewdisplay; +}; + +defn +Display(addr) { + complex Display addr; + print("QLock qlock {\n"); + QLock(addr.qlock); + print("}\n"); + print(" locking ", addr.locking, "\n"); + print(" dirno ", addr.dirno, "\n"); + print(" fd ", addr.fd, "\n"); + print(" reffd ", addr.reffd, "\n"); + print(" ctlfd ", addr.ctlfd, "\n"); + print(" imageid ", addr.imageid, "\n"); + print(" $local ", addr.$local, "\n"); + print(" error ", addr.error\Y, "\n"); + print(" devdir ", addr.devdir\Y, "\n"); + print(" windir ", addr.windir\Y, "\n"); + print(" oldlabel ", addr.oldlabel, "\n"); + print(" dataqid ", addr.dataqid, "\n"); + print(" white ", addr.white\Y, "\n"); + print(" black ", addr.black\Y, "\n"); + print(" opaque ", addr.opaque\Y, "\n"); + print(" transparent ", addr.transparent\Y, "\n"); + print(" image ", addr.image\Y, "\n"); + print(" buf ", addr.buf\Y, "\n"); + print(" bufsize ", addr.bufsize, "\n"); + print(" bufp ", addr.bufp\Y, "\n"); + print(" defaultfont ", addr.defaultfont\Y, "\n"); + print(" defaultsubfont ", addr.defaultsubfont\Y, "\n"); + print(" windows ", addr.windows\Y, "\n"); + print(" screenimage ", addr.screenimage\Y, "\n"); + print(" _isnewdisplay ", addr._isnewdisplay, "\n"); +}; + +sizeofImage = 80; +aggr Image +{ + 'A' Display 0 display; + 'D' 8 id; + Rectangle 16 r; + Rectangle 32 clipr; + 'D' 48 depth; + 'U' 52 chan; + 'D' 56 repl; + 'A' Screen 64 screen; + 'A' Image 72 next; +}; + +defn +Image(addr) { + complex Image addr; + print(" display ", addr.display\Y, "\n"); + print(" id ", addr.id, "\n"); + print("Rectangle r {\n"); + Rectangle(addr.r); + print("}\n"); + print("Rectangle clipr {\n"); + Rectangle(addr.clipr); + print("}\n"); + print(" depth ", addr.depth, "\n"); + print(" chan ", addr.chan, "\n"); + print(" repl ", addr.repl, "\n"); + print(" screen ", addr.screen\Y, "\n"); + print(" next ", addr.next\Y, "\n"); +}; + +sizeofRGB = 16; +aggr RGB +{ + 'U' 0 red; + 'U' 4 green; + 'U' 8 blue; +}; + +defn +RGB(addr) { + complex RGB addr; + print(" red ", addr.red, "\n"); + print(" green ", addr.green, "\n"); + print(" blue ", addr.blue, "\n"); +}; + +sizeofFontchar = 8; +aggr Fontchar +{ + 'D' 0 x; + 'b' 4 top; + 'b' 5 bottom; + 'C' 6 left; + 'b' 7 width; +}; + +defn +Fontchar(addr) { + complex Fontchar addr; + print(" x ", addr.x, "\n"); + print(" top ", addr.top, "\n"); + print(" bottom ", addr.bottom, "\n"); + print(" left ", addr.left, "\n"); + print(" width ", addr.width, "\n"); +}; + +sizeofSubfont = 40; +aggr Subfont +{ + 'Y' 0 name; + 'd' 8 n; + 'b' 10 height; + 'C' 11 ascent; + 'A' Fontchar 16 info; + 'A' Image 24 bits; + 'D' 32 ref; +}; + +defn +Subfont(addr) { + complex Subfont addr; + print(" name ", addr.name\Y, "\n"); + print(" n ", addr.n, "\n"); + print(" height ", addr.height, "\n"); + print(" ascent ", addr.ascent, "\n"); + print(" info ", addr.info\Y, "\n"); + print(" bits ", addr.bits\Y, "\n"); + print(" ref ", addr.ref, "\n"); +}; + +LOG2NFCACHE = 6; +NFCACHE = 64; +NFLOOK = 5; +NFSUBF = 2; +MAXFCACHE = 1029; +MAXSUBF = 50; +DSUBF = 4; +SUBFAGE = 10000; +CACHEAGE = 10000; +sizeofCachefont = 32; +aggr Cachefont +{ + 'U' 0 min; + 'U' 4 max; + 'D' 8 offset; + 'Y' 16 name; + 'Y' 24 subfontname; +}; + +defn +Cachefont(addr) { + complex Cachefont addr; + print(" min ", addr.min, "\n"); + print(" max ", addr.max, "\n"); + print(" offset ", addr.offset, "\n"); + print(" name ", addr.name\Y, "\n"); + print(" subfontname ", addr.subfontname\Y, "\n"); +}; + +sizeofCacheinfo = 16; +aggr Cacheinfo +{ + 'u' 0 x; + 'b' 2 width; + 'C' 3 left; + 'U' 4 value; + 'u' 8 age; +}; + +defn +Cacheinfo(addr) { + complex Cacheinfo addr; + print(" x ", addr.x, "\n"); + print(" width ", addr.width, "\n"); + print(" left ", addr.left, "\n"); + print(" value ", addr.value, "\n"); + print(" age ", addr.age, "\n"); +}; + +sizeofCachesubf = 24; +aggr Cachesubf +{ + 'U' 0 age; + 'A' Cachefont 8 cf; + 'A' Subfont 16 f; +}; + +defn +Cachesubf(addr) { + complex Cachesubf addr; + print(" age ", addr.age, "\n"); + print(" cf ", addr.cf\Y, "\n"); + print(" f ", addr.f\Y, "\n"); +}; + +sizeofFont = 72; +aggr Font +{ + 'Y' 0 name; + 'A' Display 8 display; + 'd' 16 height; + 'd' 18 ascent; + 'd' 20 width; + 'd' 22 nsub; + 'U' 24 age; + 'D' 28 maxdepth; + 'D' 32 ncache; + 'D' 36 nsubf; + 'A' Cacheinfo 40 cache; + 'A' Cachesubf 48 subf; + 'A' Cachefont 56 sub; + 'A' Image 64 cacheimage; +}; + +defn +Font(addr) { + complex Font addr; + print(" name ", addr.name\Y, "\n"); + print(" display ", addr.display\Y, "\n"); + print(" height ", addr.height, "\n"); + print(" ascent ", addr.ascent, "\n"); + print(" width ", addr.width, "\n"); + print(" nsub ", addr.nsub, "\n"); + print(" age ", addr.age, "\n"); + print(" maxdepth ", addr.maxdepth, "\n"); + print(" ncache ", addr.ncache, "\n"); + print(" nsubf ", addr.nsubf, "\n"); + print(" cache ", addr.cache\Y, "\n"); + print(" subf ", addr.subf\Y, "\n"); + print(" sub ", addr.sub\Y, "\n"); + print(" cacheimage ", addr.cacheimage\Y, "\n"); +}; + +complex Point ZP; +complex Rectangle ZR; +complex Display display; +complex Font font; +complex Image screen; +complex Screen _screen; +sizeofMouse = 24; +aggr Mouse +{ + 'D' 0 buttons; + Point 8 xy; + 'U' 16 msec; +}; + +defn +Mouse(addr) { + complex Mouse addr; + print(" buttons ", addr.buttons, "\n"); + print("Point xy {\n"); + Point(addr.xy); + print("}\n"); + print(" msec ", addr.msec, "\n"); +}; + +sizeofMousectl = 72; +aggr Mousectl +{ + { + 'D' 0 buttons; + Point 8 xy; + 'U' 16 msec; + }; + 'A' Channel 24 c; + 'A' Channel 32 resizec; + 'Y' 40 file; + 'D' 48 mfd; + 'D' 52 cfd; + 'D' 56 pid; + 'A' Image 64 image; +}; + +defn +Mousectl(addr) { + complex Mousectl addr; + print("Mouse {\n"); + Mouse(addr+0); + print("}\n"); + print(" c ", addr.c\Y, "\n"); + print(" resizec ", addr.resizec\Y, "\n"); + print(" file ", addr.file\Y, "\n"); + print(" mfd ", addr.mfd, "\n"); + print(" cfd ", addr.cfd, "\n"); + print(" pid ", addr.pid, "\n"); + print(" image ", addr.image\Y, "\n"); +}; + +sizeofMenu = 24; +aggr Menu +{ + 'Y' 0 item; + 'Y' 8 gen; + 'D' 16 lasthit; +}; + +defn +Menu(addr) { + complex Menu addr; + print(" item ", addr.item\Y, "\n"); + print(" gen ", addr.gen\Y, "\n"); + print(" lasthit ", addr.lasthit, "\n"); +}; + +sizeofKeyboardctl = 32; +aggr Keyboardctl +{ + 'A' Channel 0 c; + 'Y' 8 file; + 'D' 16 consfd; + 'D' 20 ctlfd; + 'D' 24 pid; +}; + +defn +Keyboardctl(addr) { + complex Keyboardctl addr; + print(" c ", addr.c\Y, "\n"); + print(" file ", addr.file\Y, "\n"); + print(" consfd ", addr.consfd, "\n"); + print(" ctlfd ", addr.ctlfd, "\n"); + print(" pid ", addr.pid, "\n"); +}; + +KF = 61440; +Spec = 63488; +PF = 63520; +Kview = 63488; +Khome = 61453; +Kup = 61454; +Kdown = 63488; +Kpgup = 61455; +Kprint = 61456; +Kleft = 61457; +Kright = 61458; +Kpgdown = 61459; +Kins = 61460; +Kalt = 61461; +Kshift = 61462; +Kctl = 61463; +Kend = 61464; +Kscroll = 61465; +Kscrolloneup = 61472; +Kscrollonedown = 61473; +Ksoh = 1; +Kstx = 2; +Ketx = 3; +Keof = 4; +Kenq = 5; +Kack = 6; +Kbs = 8; +Knack = 21; +Ketb = 23; +Kdel = 127; +Kesc = 27; +Kbreak = 63585; +Kcaps = 63588; +Knum = 63589; +Kmiddle = 63590; +Kaltgr = 63591; +Kmouse = 63744; +sizeofPoint2 = 24; +aggr Point2 +{ + 'F' 0 x; + 'F' 8 y; + 'F' 16 w; +}; + +defn +Point2(addr) { + complex Point2 addr; + print(" x ", addr.x, "\n"); + print(" y ", addr.y, "\n"); + print(" w ", addr.w, "\n"); +}; + +sizeofPoint3 = 32; +aggr Point3 +{ + 'F' 0 x; + 'F' 8 y; + 'F' 16 z; + 'F' 24 w; +}; + +defn +Point3(addr) { + complex Point3 addr; + print(" x ", addr.x, "\n"); + print(" y ", addr.y, "\n"); + print(" z ", addr.z, "\n"); + print(" w ", addr.w, "\n"); +}; + +sizeofQuaternion = 32; +aggr Quaternion +{ + 'F' 0 r; + 'F' 8 i; + 'F' 16 j; + 'F' 24 k; +}; + +defn +Quaternion(addr) { + complex Quaternion addr; + print(" r ", addr.r, "\n"); + print(" i ", addr.i, "\n"); + print(" j ", addr.j, "\n"); + print(" k ", addr.k, "\n"); +}; + +sizeofReferenceFrame = 72; +aggr ReferenceFrame +{ + Point2 0 p; + Point2 24 xb; + Point2 48 yb; +}; + +defn +ReferenceFrame(addr) { + complex ReferenceFrame addr; + print("Point2 p {\n"); + Point2(addr.p); + print("}\n"); + print("Point2 xb {\n"); + Point2(addr.xb); + print("}\n"); + print("Point2 yb {\n"); + Point2(addr.yb); + print("}\n"); +}; + +sizeofReferenceFrame3 = 128; +aggr ReferenceFrame3 +{ + Point3 0 p; + Point3 32 xb; + Point3 64 yb; + Point3 96 zb; +}; + +defn +ReferenceFrame3(addr) { + complex ReferenceFrame3 addr; + print("Point3 p {\n"); + Point3(addr.p); + print("}\n"); + print("Point3 xb {\n"); + Point3(addr.xb); + print("}\n"); + print("Point3 yb {\n"); + Point3(addr.yb); + print("}\n"); + print("Point3 zb {\n"); + Point3(addr.zb); + print("}\n"); +}; + +sizeofTriangle3 = 96; +aggr Triangle3 +{ + Point3 0 p0; + Point3 32 p1; + Point3 64 p2; +}; + +defn +Triangle3(addr) { + complex Triangle3 addr; + print("Point3 p0 {\n"); + Point3(addr.p0); + print("}\n"); + print("Point3 p1 {\n"); + Point3(addr.p1); + print("}\n"); + print("Point3 p2 {\n"); + Point3(addr.p2); + print("}\n"); +}; + +Portho = 0; +Ppersp = 1; +sizeofVertex = 64; +aggr Vertex +{ + Point3 0 p; + Point3 32 n; +}; + +defn +Vertex(addr) { + complex Vertex addr; + print("Point3 p {\n"); + Point3(addr.p); + print("}\n"); + print("Point3 n {\n"); + Point3(addr.n); + print("}\n"); +}; + +sizeofTriangle = 24; +aggr Triangle +{ + Point 0 p0; + Point 8 p1; + Point 16 p2; +}; + +defn +Triangle(addr) { + complex Triangle addr; + print("Point p0 {\n"); + Point(addr.p0); + print("}\n"); + print("Point p1 {\n"); + Point(addr.p1); + print("}\n"); + print("Point p2 {\n"); + Point(addr.p2); + print("}\n"); +}; + +sizeof_2_ = 16; +aggr _2_ +{ + 'F' 0 n; + 'F' 8 f; +}; + +defn +_2_(addr) { + complex _2_ addr; + print(" n ", addr.n, "\n"); + print(" f ", addr.f, "\n"); +}; + +sizeofCamera = 296; +aggr Camera +{ + { + Point3 0 p; + Point3 32 xb; + Point3 64 yb; + Point3 96 zb; + }; + 'A' Image 128 viewport; + 'F' 136 fov; + _2_ 144 clip; + 'D' 160 ptype; + 'a' 168 proj; +}; + +defn +Camera(addr) { + complex Camera addr; + print("ReferenceFrame3 {\n"); + ReferenceFrame3(addr+0); + print("}\n"); + print(" viewport ", addr.viewport\Y, "\n"); + print(" fov ", addr.fov, "\n"); + print("_2_ clip {\n"); + _2_(addr.clip); + print("}\n"); + print(" ptype ", addr.ptype, "\n"); + print(" proj ", addr.proj, "\n"); +}; + +STACK = 8192; +SEC = 1000; +FPS = 60; +Scamno = 0; +Scampos = 1; +Scambs = 2; +Sfov = 3; +Se = 4; +complex Mousectl mctl; +complex Keyboardctl kctl; +complex ReferenceFrame scrrf; +complex RWLock worldlock; +complex Triangle3 tri; +complex Camera cam0; +complex Camera cam1; +complex Camera cam2; +complex Camera cam3; +complex Camera maincam; +complex Fmt vfmt:f; +complex Point2 vfmt:p; +complex Fmt Vfmt:f; +complex Point3 Vfmt:p; +complex Point3 flatten:p; +complex Point2 toscreen:p; +complex Point fromscreen:p; +complex Triangle redraw:trit; +complex Quaternion key:q; +complex Quaternion key:qtmp; +MOUSE = 0; +KBD = 1; +RESIZE = 2; @@ -0,0 +1,396 @@ +#include <u.h> +#include <libc.h> +#include <thread.h> +#include <draw.h> +#include <mouse.h> +#include <keyboard.h> +#include "geometry.h" +#include "graphics.h" +#include "obj.h" +#include "dat.h" +#include "fns.h" + +Rune keys[Ke] = { + [K↑] = Kup, + [K↓] = Kdown, + [K←] = Kleft, + [K→] = Kright, + [Krise] = Kpgup, + [Kfall] = Kpgdown, + [KR↑] = 'w', + [KR↓] = 's', + [KR←] = 'a', + [KR→] = 'd', + [KR↺] = 'q', + [KR↻] = 'e', + [Kcam0] = KF|1, + [Kcam1] = KF|2, + [Kcam2] = KF|3, + [Kcam3] = KF|4, + [Kscrshot] = KF|12 +}; + +char stats[Se][256]; + +Mousectl *mctl; +int kdown; +double t0, Δt; +RWLock worldlock; +Mesh model; +char *mdlpath = "../threedee/mdl/rocket.obj"; + +Camera cams[4], *maincam; + +#pragma varargck type "v" Point2 +int +vfmt(Fmt *f) +{ + Point2 p; + + p = va_arg(f->args, Point2); + return fmtprint(f, "[%g %g %g]", p.x, p.y, p.w); +} + +#pragma varargck type "V" Point3 +int +Vfmt(Fmt *f) +{ + Point3 p; + + p = va_arg(f->args, Point3); + return fmtprint(f, "[%g %g %g %g]", p.x, p.y, p.z, p.w); +} + +void * +emalloc(ulong n) +{ + void *p; + + p = malloc(n); + if(p == nil) + sysfatal("malloc: %r"); + setmalloctag(p, getcallerpc(&n)); + return p; +} + +void * +erealloc(void *p, ulong n) +{ + void *np; + + np = realloc(p, n); + if(np == nil) + sysfatal("realloc: %r"); + setrealloctag(np, getcallerpc(&p)); + return np; +} + +int +depthcmp(void *a, void *b) +{ + Triangle3 *ta, *tb; + double za, zb; + + ta = (Triangle3 *)a; + tb = (Triangle3 *)b; + za = (ta->p0.z + ta->p1.z + ta->p2.z)/3; + zb = (tb->p0.z + tb->p1.z + tb->p2.z)/3; + return zb-za; +} + +void +drawaxis(void) +{ + Point3 op = (Point3){0, 0, 0, 1}, + px = (Point3){1, 0, 0, 1}, + py = (Point3){0, 1, 0, 1}, + pz = (Point3){0, 0, 1, 1}; + + line3(maincam, op, px, 0, Endarrow, display->black); + string3(maincam, px, display->black, font, "x"); + line3(maincam, op, py, 0, Endarrow, display->black); + string3(maincam, py, display->black, font, "y"); + line3(maincam, op, pz, 0, Endarrow, display->black); + string3(maincam, pz, display->black, font, "z"); +} + +void +drawstats(void) +{ + int i; + + snprint(stats[Scamno], sizeof(stats[Scamno]), "CAM %d", maincam-cams+1); + snprint(stats[Sfov], sizeof(stats[Sfov]), "FOV %g°", maincam->fov); + snprint(stats[Scampos], sizeof(stats[Scampos]), "%V", maincam->p); + snprint(stats[Scambx], sizeof(stats[Scambx]), "bx %V", maincam->bx); + snprint(stats[Scamby], sizeof(stats[Scamby]), "by %V", maincam->by); + snprint(stats[Scambz], sizeof(stats[Scambz]), "bz %V", maincam->bz); + for(i = 0; i < Se; i++) + stringn(maincam->viewport, addpt(screen->r.min, Pt(10, 10 + i*font->height)), display->black, ZP, font, stats[i], sizeof(stats[i])); +} + +void +redraw(void) +{ + Triangle3 tmp; + static TTriangle3 *vistris; + static int nallocvistri; + Triangle trit; + Point3 n; + u8int c; + int i, nvistri; + + nvistri = 0; + if(nallocvistri == 0 && vistris == nil){ + nallocvistri = model.ntri/2; + vistris = emalloc(nallocvistri*sizeof(TTriangle3)); + } + for(i = 0; i < model.ntri; i++){ + /* world to camera */ + tmp.p0 = WORLD2VCS(maincam, model.tris[i].p0); + tmp.p1 = WORLD2VCS(maincam, model.tris[i].p1); + tmp.p2 = WORLD2VCS(maincam, model.tris[i].p2); + /* back-face culling */ + n = normvec3(crossvec3(subpt3(tmp.p1, tmp.p0), subpt3(tmp.p2, tmp.p0))); + if(dotvec3(n, mulpt3(tmp.p0, -1)) <= 0) + continue; + /* camera to projected ndc */ + tmp.p0 = VCS2NDC(maincam, tmp.p0); + tmp.p1 = VCS2NDC(maincam, tmp.p1); + tmp.p2 = VCS2NDC(maincam, tmp.p2); + /* clipping */ + /* + * no clipping for now, the whole triangle is ignored + * if any of its vertices gets outside the fustrum. + */ + if(isclipping(tmp.p0) || isclipping(tmp.p1) || isclipping(tmp.p2)) + continue; + if(nvistri >= nallocvistri){ + nallocvistri += model.ntri/3; + vistris = erealloc(vistris, nallocvistri*sizeof(TTriangle3)); + } + vistris[nvistri] = (TTriangle3)tmp; + c = 0xff*fabs(dotvec3(n, Vec3(0, 0, 1))); + vistris[nvistri].tx = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, c<<24|c<<16|c<<8|0xff); + nvistri++; + } + qsort(vistris, nvistri, sizeof(TTriangle3), depthcmp); + lockdisplay(display); + draw(maincam->viewport, maincam->viewport->r, display->white, nil, ZP); + drawaxis(); + for(i = 0; i < nvistri; i++){ + /* ndc to screen */ + trit.p0 = toviewport(maincam, vistris[i].p0); + trit.p1 = toviewport(maincam, vistris[i].p1); + trit.p2 = toviewport(maincam, vistris[i].p2); + filltriangle(maincam->viewport, trit, vistris[i].tx, ZP); + triangle(maincam->viewport, trit, 0, display->black, ZP); + freeimage(vistris[i].tx); + } + drawstats(); + flushimage(display, 1); + unlockdisplay(display); +} + +void +scrsynproc(void *) +{ + threadsetname("scrsynproc"); + for(;;){ + rlock(&worldlock); + redraw(); + runlock(&worldlock); + sleep(FPS2MS(60)); + } +} + +void +screenshot(void) +{ + int fd; + static char buf[128]; + + enter("Path", buf, sizeof buf, mctl, nil, nil); + if(buf[0] == 0) + return; + fd = create(buf, OWRITE, 0644); + if(fd < 0) + sysfatal("open: %r"); + if(writeimage(fd, screen, 1) < 0) + sysfatal("writeimage: %r"); + close(fd); +} + +void +mouse(void) +{ + if(mctl->buttons & 1) + fprint(2, "%v\n", fromviewport(maincam, mctl->xy)); + if(mctl->buttons & 8){ + maincam->fov -= 5; + if(maincam->fov < 1) + maincam->fov = 1; + reloadcamera(maincam); + } + if(mctl->buttons & 16){ + maincam->fov += 5; + if(maincam->fov > 359) + maincam->fov = 359; + reloadcamera(maincam); + } +} + +void +kbdproc(void *) +{ + Rune r, *a; + char buf[128], *s; + int fd, n; + + threadsetname("kbdproc"); + if((fd = open("/dev/kbd", OREAD)) < 0) + sysfatal("kbdproc: %r"); + memset(buf, 0, sizeof buf); + for(;;){ + if(buf[0] != 0){ + n = strlen(buf)+1; + memmove(buf, buf+n, sizeof(buf)-n); + } + if(buf[0] == 0){ + if((n = read(fd, buf, sizeof(buf)-1)) <= 0) + break; + buf[n-1] = 0; + buf[n] = 0; + } + if(buf[0] == 'c'){ + if(utfrune(buf, Kdel)){ + close(fd); + threadexitsall(nil); + } + } + if(buf[0] != 'k' && buf[0] != 'K') + continue; + s = buf+1; + kdown = 0; + while(*s){ + s += chartorune(&r, s); + for(a = keys; a < keys+Ke; a++) + if(r == *a){ + kdown |= 1 << a-keys; + break; + } + } + } +} + +void +handlekeys(void) +{ + if(kdown & 1<<K↑) + placecamera(maincam, subpt3(maincam->p, maincam->bz), maincam->bz, maincam->by); + if(kdown & 1<<K↓) + placecamera(maincam, addpt3(maincam->p, maincam->bz), maincam->bz, maincam->by); + if(kdown & 1<<K←) + placecamera(maincam, subpt3(maincam->p, maincam->bx), maincam->bz, maincam->by); + if(kdown & 1<<K→) + placecamera(maincam, addpt3(maincam->p, maincam->bx), maincam->bz, maincam->by); + if(kdown & 1<<Krise) + placecamera(maincam, addpt3(maincam->p, maincam->by), maincam->bz, maincam->by); + if(kdown & 1<<Kfall) + placecamera(maincam, subpt3(maincam->p, maincam->by), maincam->bz, maincam->by); + if(kdown & 1<<KR↑) + aimcamera(maincam, qrotate(maincam->bz, maincam->bx, 5*DEG)); + if(kdown & 1<<KR↓) + aimcamera(maincam, qrotate(maincam->bz, maincam->bx, -5*DEG)); + if(kdown & 1<<KR←) + aimcamera(maincam, qrotate(maincam->bz, maincam->by, 5*DEG)); + if(kdown & 1<<KR→) + aimcamera(maincam, qrotate(maincam->bz, maincam->by, -5*DEG)); + if(kdown & 1<<KR↺) + placecamera(maincam, maincam->p, maincam->bz, qrotate(maincam->by, maincam->bz, 5*DEG)); + if(kdown & 1<<KR↻) + placecamera(maincam, maincam->p, maincam->bz, qrotate(maincam->by, maincam->bz, -5*DEG)); + if(kdown & 1<<Kcam0) + maincam = &cams[0]; + if(kdown & 1<<Kcam1) + maincam = &cams[1]; + if(kdown & 1<<Kcam2) + maincam = &cams[2]; + if(kdown & 1<<Kcam3) + maincam = &cams[3]; + if(kdown & 1<<Kscrshot) + screenshot(); +} + +void +resize(void) +{ + lockdisplay(display); + if(getwindow(display, Refnone) < 0) + fprint(2, "can't reattach to window\n"); + unlockdisplay(display); + maincam->viewport = screen; + reloadcamera(maincam); +} + +void +usage(void) +{ + fprint(2, "usage: %s\n", argv0); + exits("usage"); +} + +void +threadmain(int argc, char *argv[]) +{ + OBJ *objmesh; + + fmtinstall('V', Vfmt); + fmtinstall('v', vfmt); + ARGBEGIN{ + default: usage(); + case 'l': + mdlpath = EARGF(usage()); + break; + }ARGEND; + if(argc != 0) + usage(); + if(initdraw(nil, nil, "3d") < 0) + sysfatal("initdraw: %r"); + if((mctl = initmouse(nil, screen)) == nil) + sysfatal("initmouse: %r"); + placecamera(&cams[0], Pt3(2, 0, -4, 1), Pt3(0, 0, 0, 1), Vec3(0, 1, 0)); + configcamera(&cams[0], screen, 90, 0.1, 100, Ppersp); + placecamera(&cams[1], Pt3(-2, 0, -4, 1), Pt3(0, 0, 0, 1), Vec3(0, 1, 0)); + configcamera(&cams[1], screen, 120, 0.1, 100, Ppersp); + placecamera(&cams[2], Pt3(-2, 0, 4, 1), Pt3(0, 0, 0, 1), Vec3(0, 1, 0)); + configcamera(&cams[2], screen, 90, 0.1, 100, Ppersp); + placecamera(&cams[3], Pt3(2, 0, 4, 1), Pt3(0, 0, 0, 1), Vec3(0, 1, 0)); + configcamera(&cams[3], screen, 120, 0.1, 100, Ppersp); + maincam = &cams[0]; + if((objmesh = objparse(mdlpath)) == nil) + sysfatal("objparse: %r"); + display->locking = 1; + unlockdisplay(display); + proccreate(scrsynproc, nil, mainstacksize); + proccreate(kbdproc, nil, mainstacksize); + t0 = nsec(); + for(;;){ + enum {MOUSE, RESIZE}; + Alt a[] = { + {mctl->c, &mctl->Mouse, CHANRCV}, + {mctl->resizec, nil, CHANRCV}, + {nil, nil, CHANNOBLK} + }; + wlock(&worldlock); + switch(alt(a)){ + case MOUSE: mouse(); break; + case RESIZE: resize(); break; + } + Δt = (nsec()-t0)/1e9; + handlekeys(); + t0 += Δt*1e9; + wunlock(&worldlock); + sleep(16); + } +} @@ -0,0 +1,33 @@ +</$objtype/mkfile + +BIN=$home/$objtype/bin +TARG=3d +OFILES=\ + main.$O\ + +HFILES=geometry.h graphics.h obj.h dat.h fns.h + +LIB=\ + libgeometry.a$O\ + libgraphics.a$O\ + libobj.a$O + +</sys/src/cmd/mkone + +libgeometry.a$O: + cd libgeometry + mk install + +libgraphics.a$O: + cd libgraphics + mk install + +libobj.a$O: + cd libobj + mk install + +clean nuke:V: + rm -f *.[$OS] [$OS].out y.tab.? y.debug y.output $TARG + @{cd libgeometry; mk $target} + @{cd libgraphics; mk $target} + @{cd libobj; mk $target} @@ -0,0 +1,92 @@ +/* vertex types */ +enum { + OBJVGeometric, + OBJVTexture, + OBJVNormal, + OBJVParametric, + OBJNVERT +}; +/* element types */ +enum { + OBJEPoint, + OBJELine, + OBJEFace, + OBJECurve, + OBJECurve2, + OBJESurface +}; +/* grouping types */ +enum { + OBJGGlobal, + OBJGSmoothing, + OBJGMerging +}; +/* object hash table size */ +enum { + OBJHTSIZE = 17 +}; + +typedef struct OBJVertex OBJVertex; +typedef struct OBJVertexArray OBJVertexArray; +typedef struct OBJElem OBJElem; +//typedef struct OBJGroup OBJGroup; +typedef struct OBJObject OBJObject; +typedef struct OBJ OBJ; + +#pragma varargck type "O" OBJ* + +struct OBJVertex +{ + union { + struct { double x, y, z, w; }; /* geometric */ + struct { double u, v, vv; }; /* texture and parametric */ + struct { double i, j, k; }; /* normal */ + }; +}; + +struct OBJVertexArray +{ + OBJVertex *verts; + int nvert; +}; + +struct OBJElem +{ + int *indices; + int nindex; + int type; + OBJElem *next; +}; + +//struct OBJGroup +//{ +// char *name; +// int type; +// OBJElem *elem0; +// OBJGroup *next; +//}; +//struct OBJObject +//{ +// char *name; +// OBJGroup *grptab[OBJHTSIZE]; +// OBJObject *next; +//}; + +struct OBJObject +{ + char *name; + OBJElem *child; + OBJObject *next; +}; + +struct OBJ +{ + OBJVertexArray vertdata[OBJNVERT]; + OBJObject *objtab[OBJHTSIZE]; +}; + +OBJ *objparse(char*); +void objfree(OBJ*); + +int OBJfmt(Fmt*); +void OBJfmtinstall(void); |