sq3: show SQLite error messages on stderr by default
[iv.d.git] / egra / gfx / aggmini / core.d
blobb74c5393d4cba0267f5c46bbbb3c2a12b2b78f47
1 /*
2 * Simple Framebuffer Gfx/GUI lib
4 * coded by Ketmar // Invisible Vector <ketmar@ketmar.no-ip.org>
5 * Understanding is not required. Only obedience.
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, version 3 of the License ONLY.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 /* *****************************************************************************
20 Anti-Grain Geometry - Version 2.1 Lite
21 Copyright (C) 2002-2003 Maxim Shemanarev (McSeem)
22 D port, additional work: Ketmar Dark
24 Permission to copy, use, modify, sell and distribute this software
25 is granted provided this copyright notice appears in all copies.
26 This software is provided "as is" without express or implied
27 warranty, and with no claim as to its suitability for any purpose.
29 The author gratefully acknowleges the support of David Turner,
30 Robert Wilhelm, and Werner Lemberg - the authors of the FreeType
31 libray - in producing this work. See http://www.freetype.org for details.
33 Initially the rendering algorithm was designed by David Turner and the
34 other authors of the FreeType library - see the above notice. I nearly
35 created a similar renderer, but still I was far from David's work.
36 I completely redesigned the original code and adapted it for Anti-Grain
37 ideas. Two functions - renderLine and renderScanLine are the core of
38 the algorithm - they calculate the exact coverage of each pixel cell
39 of the polygon. I left these functions almost as is, because there's
40 no way to improve the perfection - hats off to David and his group!
42 All other code is very different from the original.
43 ***************************************************************************** */
44 module iv.egra.gfx.aggmini.core;
45 private:
46 //nothrow @safe @nogc:
48 private import iv.egra.gfx.aggmini : DisableCopyingMixin;
49 private import iv.egra.gfx.aggmini.enums;
50 private import iv.egra.gfx.aggmini.supmath;
51 private import iv.egra.gfx.aggmini.render;
52 private import iv.egra.gfx.aggmini.stroker;
54 private import iv.egra.gfx.base;
56 //debug private import iv.cmdcon;
58 //version = egra_aggmini_debug_rasta;
61 // ////////////////////////////////////////////////////////////////////////// //
62 // some "fastgfx" backend
63 public struct AGGDrawer {
64 protected:
65 // added vertex will contain "end poly" command only when `closePoly()`/`endPoly()` was called
66 static struct Vertex {
67 float x, y;
68 uint cmd; // path command
70 this (in float ax, in float ay, in uint acmd) pure nothrow @safe @nogc {
71 pragma(inline, true);
72 x = ax;
73 y = ay;
74 cmd = acmd;
78 protected:
79 Rasterizer rast;
80 SimpleVector!Vertex vtx; // reset by `beginPath()`
82 static struct VtxState {
83 // coords are transformed
84 float startX = 0.0f, startY = 0.0f;
85 float lastX = 0.0f, lastY = 0.0f;
86 uint lineCmdCount = 0;
87 // 0: just started/endpoly resed
88 // 1: got moveto, not issued yet
89 // 2: issued moveto and at least one lineto; lineto count+1
90 // last seen untransformed point
91 float utlastX = 0.0f, utlastY = 0.0f;
93 VtxState vtxState;
95 // for vertex producer
96 uint vpIdx;
98 // for rasterising vertex consumer
99 static struct ConsumerState {
100 float startX = 0.0f, startY = 0.0f;
101 float lastX = 0.0f, lastY = 0.0f;
102 uint lineCmdCount = 0;
103 // 0: poly just started
104 // 1: last command was "move to"
105 // 2 and more: number of sequential "line to" commands minus 1
107 ConsumerState rcsm;
110 public:
111 float tessTol = 0.25f;
112 float angleTol = 0.0f; // 0.0f -- angle tolerance for McSeem Bezier rasterizer
113 float cuspLimit = 0.0f; // 0 -- cusp limit for McSeem Bezier rasterizer (0: real cusps)
114 int bezierLimit = 20; // bezier recursion limit for non-AFD tesselators
116 // default tesselator for Bezier curves
117 AGGTesselation tesselator = AGGTesselation.DeCasteljauMcSeem;
118 //AGGTesselation tesselator = AGGTesselation.DeCasteljau;
119 //AGGTesselation tesselator = AGGTesselation.AFD;
121 mixin(DisableCopyingMixin);
123 public:
124 ref AGGDrawer withTransform(DG) (in auto ref AGGMatrix tmt, scope DG dg)
125 if (is(typeof((inout int=0) { DG vp = void; dg(); })))
127 immutable AGGMatrix old = transform;
128 transform = tmt;
129 scope(exit) transform = old;
130 dg();
131 return this;
134 nothrow @trusted @nogc:
135 protected:
136 enum distTol = cast(float)(1.0f/256.0f);
137 enum KAPPA90 = 0.5522847493f; // length proportional to radius of a cubic bezier handle for 90deg arcs
139 // this does some fancy logic
140 void addVtx (float fx, float fy, uint cmd) {
141 pragma(inline, true);
143 // stop?
144 if (isStop(cmd)) {
145 if (vtxState.lineCmdCount >= 2) {
146 // flush poly
147 if (vtxState.lineCmdCount > 2 && ptEquals(vtxState.startX, vtxState.startY, vtxState.lastX, vtxState.lastY)) {
148 vtx.add(Vertex(vtxState.startX, vtxState.startY, PathCommand.EndPoly|PathFlag.Close));
149 } else {
150 vtx.add(Vertex(vtxState.startX, vtxState.startY, PathCommand.EndPoly));
153 vtxState.lineCmdCount = 0;
154 return;
157 // end poly?
158 if (isEndPoly(cmd)) {
159 // if we haven't seen any lines, only moves -- don't bother
160 if (vtxState.lineCmdCount >= 2) {
161 // fix command if the poly is acutally closed (because why not?)
162 if (!isClosed(cmd)) {
163 if (vtxState.lineCmdCount > 2 && ptEquals(vtxState.startX, vtxState.startY, vtxState.lastX, vtxState.lastY)) {
164 cmd |= PathFlag.Close;
166 } else {
167 // if we've seen only one line so far, it cannot be closed
168 if (vtxState.lineCmdCount <= 2) {
169 cmd &= ~PathFlag.Close;
172 // close poly?
173 if (vtxState.lineCmdCount > 2 && isClosed(cmd) && !ptEquals(vtxState.startX, vtxState.startY, vtxState.lastX, vtxState.lastY)) {
174 vtx.add(Vertex(vtxState.startX, vtxState.startY, PathCommand.LineTo));
175 vtxState.lastX = vtxState.startX;
176 vtxState.lastY = vtxState.startY;
178 // don't do "move to" here, it breaks rendering
179 vtx.add(Vertex(fx, fy, cmd));
181 vtxState.lineCmdCount = 0;
182 return;
185 assert(fx == fx && fy == fy); // reject infs and nans
186 vtxState.utlastX = fx;
187 vtxState.utlastY = fy;
188 // transform coords
189 if (!transform.isIdentity) {
190 transform.point(ref fx, ref fy);
191 assert(fx == fx && fy == fy); // reject infs and nans
194 // moveto?
195 if (isMoveTo(cmd)) {
196 if (vtxState.lineCmdCount >= 2) {
197 // flush poly
198 if (vtxState.lineCmdCount > 2 && ptEquals(vtxState.startX, vtxState.startY, vtxState.lastX, vtxState.lastY)) {
199 vtx.add(Vertex(vtxState.startX, vtxState.startY, PathCommand.EndPoly|PathFlag.Close));
200 } else {
201 vtx.add(Vertex(vtxState.startX, vtxState.startY, PathCommand.EndPoly));
204 vtxState.startX = vtxState.lastX = fx;
205 vtxState.startY = vtxState.lastY = fy;
206 vtxState.lineCmdCount = 1;
207 //vtx.add(fx, fy, cmd); // postponed
208 return;
211 // lineto?
212 if (isLineTo(cmd)) {
213 if (vtxState.lineCmdCount >= 2) {
214 // do not add duplicate points
215 if (ptEquals(fx, fy, vtxState.lastX, vtxState.lastY)) {
216 return;
218 } else if (vtxState.lineCmdCount == 0) {
219 // move to the first point if we didn't yet
220 vtx.add(Vertex(fx, fy, PathCommand.MoveTo));
221 vtxState.startX = fx;
222 vtxState.startY = fy;
223 vtxState.lineCmdCount = 1;
224 } else if (vtxState.lineCmdCount == 1) {
225 // move to the first point if we didn't yet
226 vtx.add(Vertex(vtxState.startX, vtxState.startY, PathCommand.MoveTo));
228 ++vtxState.lineCmdCount;
229 vtxState.lastX = fx;
230 vtxState.lastY = fy;
231 vtx.add(Vertex(fx, fy, cmd));
232 return;
235 assert(0, "invalid path command");
238 public:
239 void dumpVertices () {
240 import core.stdc.stdio : stderr, fprintf;
241 fprintf(stderr, "=== VERTEX COUNT: %u ===\n", vtx.length);
242 foreach (immutable uint idx; 0..vtx.length) {
243 immutable uint cmd = vtx[idx].cmd;
244 fprintf(stderr, " %u: (%g, %g) : 0x%02x ", idx, vtx[idx].x, vtx[idx].y, cmd);
245 if (isStop(cmd)) fprintf(stderr, "STOP");
246 else if (isMoveTo(cmd)) fprintf(stderr, "MOVETO");
247 else if (isLineTo(cmd)) fprintf(stderr, "LINETO");
248 else if (!isEndPoly(cmd)) fprintf(stderr, "WTF?!");
249 else {
250 fprintf(stderr, "ENDPOLY");
251 if (getCloseFlag(cmd)) fprintf(stderr, " CLOSE");
252 if (isCW(cmd)) fprintf(stderr, " CW");
253 if (isCCW(cmd)) fprintf(stderr, " CCW");
255 fprintf(stderr, "\n");
257 fprintf(stderr, "-------\n");
260 protected:
261 Stroker mStroker;
262 Contourer mContourer;
263 Dasher mDasher;
265 public:
266 AGGParams params;
267 // things like "fill rule" doesn't matter here
268 AGGParams paramsContour;
270 AGGMatrix transform;
272 // for contourer
273 // 0: autodetect; -1: ccw; 1: cw
274 @property void defaultOrientation (in int v) { pragma(inline, true); mContourer.defaultOrientation = v; }
275 @property int defaultOrientation () const pure { pragma(inline, true); return mContourer.defaultOrientation; }
277 // 0: autodetect; -1: ccw; 1: cw
278 @property void forcedOrientation (in int v) { pragma(inline, true); mContourer.forcedOrientation = v; }
279 @property int forcedOrientation () const pure { pragma(inline, true); return mContourer.forcedOrientation; }
281 @property void flipOrientation (in bool v) { pragma(inline, true); mContourer.flipOrientation = v; }
282 @property bool flipOrientation () const pure { pragma(inline, true); return mContourer.flipOrientation; }
284 // for dasher
285 void resetDashes () { pragma(inline, true); mDasher.removeAllDashes(); }
286 void addDash (in float dashLen, in float gapLen) { pragma(inline, true); mDasher.addDash(dashLen, gapLen); }
287 void dashStart (in float ds) { pragma(inline, true); mDasher.dashStart(ds); }
289 // untransformed
290 @property float currX () const pure { pragma(inline, true); return vtxState.utlastX; }
291 @property float currY () const pure { pragma(inline, true); return vtxState.utlastY; }
293 // transformed
294 @property float realCurrX () const pure { pragma(inline, true); return vtxState.lastX; }
295 @property float realCurrY () const pure { pragma(inline, true); return vtxState.lastY; }
297 // returns current rasterized bounds
298 // rasterization is done by `fill()`, `stroke()`, and so on
299 @property GxRect rasterBounds () const pure { pragma(inline, true); return GxRect(rast.minX, rast.minY, rast.maxX-rast.minX+1, rast.maxY-rast.minY+1); }
301 @property int rasterMinX () const pure { pragma(inline, true); return rast.minX; }
302 @property int rasterMinY () const pure { pragma(inline, true); return rast.minY; }
303 @property int rasterMaxX () const pure { pragma(inline, true); return rast.maxX; }
304 @property int rasterMaxY () const pure { pragma(inline, true); return rast.maxY; }
306 void resetTransform () { pragma(inline, true); transform.identity(); }
309 // ////////////////////////////////////////////////////////////////////////// //
310 // Vetex Producer API
311 void rewind () {
312 pragma(inline, true);
313 vpIdx = 0;
316 uint vertex (float* x, float* y) {
317 if (vpIdx >= vtx.length) return PathCommand.Stop;
318 *x = vtx[vpIdx].x;
319 *y = vtx[vpIdx].y;
320 return vtx[vpIdx++].cmd;
324 // ////////////////////////////////////////////////////////////////////////// //
325 // Vetex Consumer API does rasterising
326 void removeAll () {
327 pragma(inline, true);
328 rcsm = rcsm.init;
329 version(egra_aggmini_debug_rasta) { import core.stdc.stdio : stderr, fprintf; fprintf(stderr, "=== DRAWER: RENDER RESET ===\n"); }
332 void addVertex (float x, float y, uint cmd) {
333 // stop?
334 if (isStop(cmd)) {
335 //removeAll();
336 version(egra_aggmini_debug_rasta) { import core.stdc.stdio : stderr, fprintf; fprintf(stderr, "=== DRAWER: RENDER STOP ===\n"); }
337 rcsm = rcsm.init;
338 return;
341 // line/move?
342 if (isLineTo(cmd) || isMoveTo(cmd)) {
343 version(egra_aggmini_debug_rasta) {
344 import core.stdc.stdio : stderr, fprintf; fprintf(stderr, " pre*: %s: (%g, %g) lineCmdCount=%u; start=(%g,%g); last=(%g,%g)\n",
345 (isLineTo(cmd) ? "lineto".ptr : "moveto".ptr), x, y, rcsm.lineCmdCount, rcsm.startX, rcsm.startY, rcsm.lastX, rcsm.lastY);
347 if (!rcsm.lineCmdCount) {
348 // just in case: "lineTo" w/o "moveTo"
349 // this can happen on startup, of after poly flush
350 // therefore, it should be safe to do this here
351 if (isLineTo(cmd)) rast.moveTo(x, y);
352 rcsm.startX = x;
353 rcsm.startY = y;
354 rcsm.lineCmdCount = 1;
356 if (isLineTo(cmd)) {
357 // do not add duplicate points
358 if (rcsm.lineCmdCount < 2 || !ptEquals(x, y, rcsm.lastX, rcsm.lastY)) rast.lineTo(x, y);
359 ++rcsm.lineCmdCount;
360 } else {
361 rast.moveTo(x, y);
362 rcsm.lineCmdCount = 1;
364 rcsm.lastX = x;
365 rcsm.lastY = y;
366 version(egra_aggmini_debug_rasta) {
367 import core.stdc.stdio : stderr, fprintf; fprintf(stderr, " post: %s: (%g, %g) lineCmdCount=%u; start=(%g,%g); last=(%g,%g)\n",
368 (isLineTo(cmd) ? "lineto".ptr : "moveto".ptr), x, y, rcsm.lineCmdCount, rcsm.startX, rcsm.startY, rcsm.lastX, rcsm.lastY);
370 return;
373 // end poly?
374 if (isEndPoly(cmd)) {
375 version(egra_aggmini_debug_rasta) {
376 import core.stdc.stdio : stderr, fprintf; fprintf(stderr, " pre*: %s: (%g, %g) lineCmdCount=%u; start=(%g,%g); last=(%g,%g)\n",
377 (isClosed(cmd) ? "close".ptr : "end".ptr), x, y, rcsm.lineCmdCount, rcsm.startX, rcsm.startY, rcsm.lastX, rcsm.lastY);
379 // close poly?
380 if (rcsm.lineCmdCount > 2 && isClosed(cmd) && !ptEquals(rcsm.startX, rcsm.startY, rcsm.lastX, rcsm.lastY)) {
381 rast.lineTo(rcsm.startX, rcsm.startY);
382 rcsm.lastX = rcsm.startX;
383 rcsm.lastY = rcsm.startY;
385 rcsm.lineCmdCount = 0;
386 // don't do "move to" here, it breaks rendering
387 version(egra_aggmini_debug_rasta) {
388 import core.stdc.stdio : stderr, fprintf; fprintf(stderr, " post: %s: (%g, %g) lineCmdCount=%u; start=(%g,%g); last=(%g,%g)\n",
389 (isClosed(cmd) ? "close".ptr : "end".ptr), x, y, rcsm.lineCmdCount, rcsm.startX, rcsm.startY, rcsm.lastX, rcsm.lastY);
391 return;
394 assert(0, "invalid path command");
398 // ////////////////////////////////////////////////////////////////////////// //
399 ref AGGDrawer resetParams () {
400 params = params.init;
401 return this;
404 ref AGGDrawer beginFrame () {
405 resetTransform();
406 vtx.removeAll();
407 vpIdx = 0;
408 vtxState = vtxState.init;
409 rast.reset();
410 return resetParams();
413 ref AGGDrawer cancelFrame () {
414 return beginFrame();
417 // this doesn't reset params or transform
418 ref AGGDrawer resetFrame () {
419 vtx.removeAll();
420 vpIdx = 0;
421 vtxState = vtxState.init;
422 rast.reset();
423 return this;
426 // this renders accumulated pathes, and clears everything
427 ref AGGDrawer endFrame (in GxColor c=gxTransparent) {
428 render(c);
429 return beginFrame();
432 // input coords are unaffected by transform
433 // returns alpha (0 means "no hit")
434 // WARNING! should be called before/instead of `render()`!
435 // WARNING! clipped only by the framebuffer
436 ubyte hitTest (in FillRule aFillRule, in int x, in int y) {
437 pragma(inline, true);
438 rast.fillRule = aFillRule;
439 return rast.hitTest(x, y);
442 // input coords are unaffected by transform
443 // returns alpha (0 means "no hit")
444 // WARNING! should be called before/instead of `render()`!
445 // WARNING! clipped only by the framebuffer
446 ubyte hitTest (in int x, in int y) { pragma(inline, true); return hitTest(params.fillRule, x, y); }
448 // doesn't reset pathes
449 // this can be called several times with different colors
450 ref AGGDrawer render(SG) (in FillRule aFillRule, auto ref SG spangen) if (AGGIsGoodSpanGen!SG) {
451 static if (AGGIsGoodSingleColor!SG) {
452 if (gxIsTransparent(spangen)) { rast.reset(); return this; }
454 GxRect clipRect = gxClipRect;
455 if (clipRect.intersect(0, 0, VBufWidth, VBufHeight)) {
456 // yeah, fill rule matters only at this stage
457 rast.fillRule = aFillRule;
458 rast.render(clipRect, spangen);
460 rast.reset();
461 return this;
464 // doesn't reset pathes
465 // this can be called several times with different colors
466 ref AGGDrawer render(SG) (auto ref SG spangen) if (AGGIsGoodSpanGen!SG) {
467 pragma(inline, true);
468 return render(params.fillRule, spangen);
472 struct VGradient {
473 int[4] yp;
474 GxColor[4] clr;
477 // begin a new path
478 ref AGGDrawer beginPath () {
479 pragma(inline, true);
480 vtx.removeAll();
481 return this;
484 // end polygon without closing
485 ref AGGDrawer endPoly () {
486 addVtx(vtxState.lastX, vtxState.lastY, PathCommand.EndPoly);
487 return this;
490 // end and close polygon
491 // contourer will autodetect orientation to make the "outer" contoue
492 ref AGGDrawer closePoly () {
493 addVtx(vtxState.lastX, vtxState.lastY, PathCommand.EndPoly|PathFlag.Close);
494 return this;
497 // end and close polygon
498 // this can be used to tell the contourer what contour we want
499 // if the orientation is different from the real one, contourer will create the "inner" contour
500 ref AGGDrawer closePolyCCW () {
501 addVtx(vtxState.lastX, vtxState.lastY, PathCommand.EndPoly|PathFlag.Close|PathFlag.CCW);
502 return this;
505 // end and close polygon
506 // this can be used to tell the contourer what contour we want
507 // if the orientation is different from the real one, contourer will create the "inner" contour
508 ref AGGDrawer closePolyCW () {
509 addVtx(vtxState.lastX, vtxState.lastY, PathCommand.EndPoly|PathFlag.Close|PathFlag.CW);
510 return this;
513 // for easy chaining
514 ref AGGDrawer noop () pure { pragma(inline, true); return this; }
516 // starts new sub-path with specified point as first point
517 ref AGGDrawer moveTo (in float x, in float y) { pragma(inline, true); addVtx(x, y, PathCommand.MoveTo); return this; }
519 // adds line segment from the last point in the path to the specified point
520 ref AGGDrawer lineTo (in float x, in float y) { pragma(inline, true); addVtx(x, y, PathCommand.LineTo); return this; }
522 // adds cubic bezier segment from last point in the path via two control points to the specified point
523 ref AGGDrawer bezierTo (in float x2, in float y2, in float x3, in float y3, in float x4, in float y4) {
524 pragma(inline, true);
525 tesselateBezier(currX, currY, x2, y2, x3, y3, x4, y4);
526 return this;
529 // adds quadratic bezier segment from last point in the path via a control point to the specified point
530 ref AGGDrawer quadTo (in float cx, in float cy, in float x, in float y) {
531 immutable float x0 = currX;
532 immutable float y0 = currY;
533 return bezierTo(
534 x0+2.0f/3.0f*(cx-x0), y0+2.0f/3.0f*(cy-y0),
535 x+2.0f/3.0f*(cx-x), y+2.0f/3.0f*(cy-y),
536 x, y,
540 // adds an arc segment at the corner defined by the last path point, and two specified points
541 ref AGGDrawer arcTo (in float x1, in float y1, in float x2, in float y2, in float radius) {
542 import core.stdc.math : acosf, tanf, atan2f;
544 immutable float x0 = currX;
545 immutable float y0 = currY;
547 // handle degenerate cases
548 if (ptEquals(x0, y0, x1, y1) ||
549 ptEquals(x1, y1, x2, y2) ||
550 distPtSegSq(x1, y1, x0, y0, x2, y2) < distTol*distTol ||
551 radius < distTol)
553 lineTo(x1, y1);
554 return this;
557 // calculate tangential circle to lines (x0, y0)-(x1, y1) and (x1, y1)-(x2, y2)
558 float dx0 = x0-x1;
559 float dy0 = y0-y1;
560 float dx1 = x2-x1;
561 float dy1 = y2-y1;
562 normalize(ref dx0, ref dy0);
563 normalize(ref dx1, ref dy1);
564 immutable float a = acosf(dx0*dx1+dy0*dy1);
565 immutable float d = radius/tanf(a*0.5f);
567 if (d > 10000.0f) {
568 lineTo(x1, y1);
569 return this;
572 float cx = void, cy = void, a0 = void, a1 = void;
573 Winding dir = void;
574 if (cross2(dx0, dy0, dx1, dy1) > 0.0f) {
575 cx = x1+dx0*d+dy0*radius;
576 cy = y1+dy0*d+-dx0*radius;
577 a0 = atan2f(dx0, -dy0);
578 a1 = atan2f(-dx1, dy1);
579 dir = Winding.CW;
580 } else {
581 cx = x1+dx0*d+-dy0*radius;
582 cy = y1+dy0*d+dx0*radius;
583 a0 = atan2f(-dx0, dy0);
584 a1 = atan2f(dx1, -dy1);
585 dir = Winding.CCW;
588 return arc!"line"(dir, cx, cy, radius, a0, a1); // first is line
591 /* Creates new circle arc shaped sub-path. The arc center is at (cx, cy), the arc radius is r,
592 * and the arc is drawn from angle a0 to a1, and swept in direction dir (Winding.CCW, or Winding.CW).
593 * Angles are specified in radians.
595 * [mode] is: "move", "line" -- first command will be like original NanoVega, MoveTo, or LineTo
597 ref AGGDrawer arc(string mode="move") (Winding dir, in float cx, in float cy, in float r,
598 in float a0, in float a1)
600 static assert(mode == "move" || mode == "line");
601 import core.stdc.math : fabsf, cosf, sinf;
604 // clamp angles
605 float da = a1-a0;
606 if (dir == Winding.CW) {
607 if (fabsf(da) >= FLT_PI*2.0f) {
608 da = FLT_PI*2.0f;
609 } else {
610 while (da < 0.0f) da += FLT_PI*2.0f;
612 } else {
613 if (fabsf(da) >= FLT_PI*2.0f) {
614 da = -FLT_PI*2.0f;
615 } else {
616 while (da > 0.0f) da -= FLT_PI*2.0f;
620 // split arc into max 90 degree segments
621 immutable int ndivs = max(1, min(cast(int)(fabsf(da)/(FLT_PI*0.5f)+0.5f), 5));
622 immutable float hda = (da/cast(float)ndivs)*0.5f;
623 float kappa = fabsf(4.0f/3.0f*(1.0f-cosf(hda))/sinf(hda));
624 if (dir == Winding.CCW) kappa = -kappa;
626 int nvals = 0;
627 float px = 0, py = 0, ptanx = 0, ptany = 0;
628 foreach (int i; 0..ndivs+1) {
629 immutable float a = a0+da*(i/cast(float)ndivs);
630 immutable float dx = cosf(a);
631 immutable float dy = sinf(a);
632 immutable float x = cx+dx*r;
633 immutable float y = cy+dy*r;
634 immutable float tanx = -dy*r*kappa;
635 immutable float tany = dx*r*kappa;
637 if (i == 0) {
638 static if (mode == "move") moveTo(x, y); else lineTo(x, y);
639 } else {
640 bezierTo(px+ptanx, py+ptany, x-tanx, y-tany, x, y);
642 px = x;
643 py = y;
644 ptanx = tanx;
645 ptany = tany;
648 return this;
651 // creates new rectangle shaped sub-path
652 ref AGGDrawer rect (in float x, in float y, in float w, in float h) {
653 if (w && h) {
654 moveTo(x, y);
655 lineTo(x, y+h);
656 lineTo(x+w, y+h);
657 lineTo(x+w, y);
658 closePoly();
660 return this;
663 // creates new rounded rectangle shaped sub-path
664 ref AGGDrawer roundedRect (in float x, in float y, in float w, in float h, in float radius) {
665 return roundedRectVarying(x, y, w, h, radius, radius, radius, radius);
668 // creates new rounded rectangle shaped sub-path
669 // specify ellipse width and height to round corners according to it
670 ref AGGDrawer roundedRectEllipse (in float x, in float y, in float w, in float h, in float rw, in float rh) {
671 if (rw < 0.1f || rh < 0.1f) return rect(x, y, w, h);
672 moveTo(x+rw, y);
673 lineTo(x+w-rw, y);
674 bezierTo(x+w-rw*(1.0f-KAPPA90), y, x+w, y+rh*(1.0f-KAPPA90), x+w, y+rh);
675 lineTo(x+w, y+h-rh);
676 bezierTo(x+w, y+h-rh*(1.0f-KAPPA90), x+w-rw*(1.0f-KAPPA90), y+h, x+w-rw, y+h);
677 lineTo(x+rw, y+h);
678 bezierTo(x+rw*(1.0f-KAPPA90), y+h, x, y+h-rh*(1.0f-KAPPA90), x, y+h-rh);
679 lineTo(x, y+rh);
680 bezierTo(x, y+rh*(1.0f-KAPPA90), x+rw*(1.0f-KAPPA90), y, x+rw, y);
681 return closePoly();
684 // creates new rounded rectangle shaped sub-path
685 // this one allows you to specify different rounding radii for each corner
686 ref AGGDrawer roundedRectVarying (in float x, in float y, in float w, in float h,
687 in float radTopLeft, in float radTopRight,
688 in float radBottomRight, in float radBottomLeft)
690 import core.stdc.math : fabsf;
691 if (radTopLeft < 0.1f && radTopRight < 0.1f && radBottomRight < 0.1f && radBottomLeft < 0.1f) return rect(x, y, w, h);
692 immutable float halfw = fabsf(w)*0.5f;
693 immutable float halfh = fabsf(h)*0.5f;
694 immutable float rxBL = min(radBottomLeft, halfw)*sign(w), ryBL = min(radBottomLeft, halfh)*sign(h);
695 immutable float rxBR = min(radBottomRight, halfw)*sign(w), ryBR = min(radBottomRight, halfh)*sign(h);
696 immutable float rxTR = min(radTopRight, halfw)*sign(w), ryTR = min(radTopRight, halfh)*sign(h);
697 immutable float rxTL = min(radTopLeft, halfw)*sign(w), ryTL = min(radTopLeft, halfh)*sign(h);
698 moveTo(x, y+ryTL);
699 lineTo(x, y+h-ryBL);
700 bezierTo(x, y+h-ryBL*(1.0f-KAPPA90), x+rxBL*(1.0f-KAPPA90), y+h, x+rxBL, y+h);
701 lineTo(x+w-rxBR, y+h);
702 bezierTo(x+w-rxBR*(1.0f-KAPPA90), y+h, x+w, y+h-ryBR*(1.0f-KAPPA90), x+w, y+h-ryBR);
703 lineTo(x+w, y+ryTR);
704 bezierTo(x+w, y+ryTR*(1.0f-KAPPA90), x+w-rxTR*(1.0f-KAPPA90), y, x+w-rxTR, y);
705 lineTo(x+rxTL, y);
706 bezierTo(x+rxTL*(1.0f-KAPPA90), y, x, y+ryTL*(1.0f-KAPPA90), x, y+ryTL);
707 return closePoly();
710 // creates new ellipse shaped sub-path
711 ref AGGDrawer ellipse (in float cx, in float cy, in float rx, in float ry) {
712 moveTo(cx-rx, cy);
713 bezierTo(cx-rx, cy+ry*KAPPA90, cx-rx*KAPPA90, cy+ry, cx, cy+ry);
714 bezierTo(cx+rx*KAPPA90, cy+ry, cx+rx, cy+ry*KAPPA90, cx+rx, cy);
715 bezierTo(cx+rx, cy-ry*KAPPA90, cx+rx*KAPPA90, cy-ry, cx, cy-ry);
716 bezierTo(cx-rx*KAPPA90, cy-ry, cx-rx, cy-ry*KAPPA90, cx-rx, cy);
717 return closePoly();
720 // creates new circle shaped sub-path
721 ref AGGDrawer circle (in float cx, in float cy, in float r) {
722 return ellipse(cx, cy, r, r);
726 // ////////////////////////////////////////////////////////////////////////// //
727 protected void renderStroker () {
728 // no need to close polys, our consumer will do it
729 streamAllVertices!false(mStroker, this);
730 mStroker.removeAll();
733 protected void streamToStrokerAndRender(VS) (ref VS vs) if (IsGoodVertexProducer!VS) {
734 streamAllVertices(vs, mStroker, &renderStroker);
738 // ////////////////////////////////////////////////////////////////////////// //
739 // fill pathes
740 ref AGGDrawer fill () {
741 streamAllVertices!false(this, this); // no need to close polys, our consumer will do it
742 removeAll();
743 return this;
746 // stroke pathes
747 ref AGGDrawer stroke() (in auto ref AGGParams parm) {
748 if (vtx.isEmpty) return this;
749 mStroker.setFromParams(parm);
750 streamAllVertices(this, mStroker, &renderStroker);
751 removeAll();
752 return this;
755 // stroke pathes
756 ref AGGDrawer stroke () { pragma(inline, true); return stroke(params); }
758 // contour pathes
759 ref AGGDrawer contour() (in auto ref AGGParams ctrparm, in auto ref AGGParams stkparm) {
760 if (vtx.isEmpty) return this;
761 mContourer.setFromParams(ctrparm);
762 mStroker.setFromParams(stkparm);
763 streamAllVertices(this, mContourer, &streamToStrokerAndRender!(typeof(mContourer)));
764 removeAll();
765 return this;
768 // contour pathes
769 ref AGGDrawer contour () { pragma(inline, true); return contour(paramsContour, params); }
771 // filled contour pathes (doesn't work right, DO NOT USE!)
772 ref AGGDrawer contourFill() (in auto ref AGGParams ctrparm) {
773 if (vtx.isEmpty) return this;
774 mContourer.setFromParams(ctrparm);
775 streamAllVertices(this, mContourer, { streamAllVertices!false(mContourer, this); });
776 mContourer.removeAll();
777 removeAll();
778 return this;
781 // fulled contour pathes (doesn't work right, DO NOT USE!)
782 ref AGGDrawer contourFill () { pragma(inline, true); return contourFill(paramsContour); }
784 // dash pathes
785 ref AGGDrawer dashStroke() (in auto ref AGGParams parm) {
786 if (vtx.isEmpty) return this;
787 if (!mDasher.hasDashes) return stroke(parm);
788 mDasher.shorten = parm.shorten;
789 mStroker.setFromParams(parm);
790 streamAllVertices(this, mDasher, &streamToStrokerAndRender!(typeof(mDasher)));
791 removeAll();
792 return this;
795 // dash pathes
796 ref AGGDrawer dashStroke () { pragma(inline, true); return dashStroke(params); }
799 // from top to bottom
800 AGGVGradient3 vgradient (in GxColor c0, in GxColor c1) {
801 pragma(inline, true);
802 return AGGVGradient3(rasterMinY, c0, rasterMaxY, c1);
805 private:
806 // ////////////////////////////////////////////////////////////////////////// //
807 void tesselateBezierDCj (in float x1, in float y1, in float x2, in float y2,
808 in float x3, in float y3, in float x4, in float y4, in int level)
810 import core.stdc.math : fabsf;
811 if (level > bezierLimit) return;
813 immutable float x12 = (x1+x2)*0.5f;
814 immutable float y12 = (y1+y2)*0.5f;
815 immutable float x23 = (x2+x3)*0.5f;
816 immutable float y23 = (y2+y3)*0.5f;
817 immutable float x34 = (x3+x4)*0.5f;
818 immutable float y34 = (y3+y4)*0.5f;
819 immutable float x123 = (x12+x23)*0.5f;
820 immutable float y123 = (y12+y23)*0.5f;
822 immutable float dx = x4-x1;
823 immutable float dy = y4-y1;
824 immutable float d2 = fabsf(((x2-x4)*dy-(y2-y4)*dx));
825 immutable float d3 = fabsf(((x3-x4)*dy-(y3-y4)*dx));
827 if ((d2+d3)*(d2+d3) < tessTol*(dx*dx+dy*dy)) {
828 lineTo(x4, y4);
829 return;
832 immutable float x234 = (x23+x34)*0.5f;
833 immutable float y234 = (y23+y34)*0.5f;
834 immutable float x1234 = (x123+x234)*0.5f;
835 immutable float y1234 = (y123+y234)*0.5f;
837 // "taxicab" / "manhattan" check for flat curves
838 if (fabsf(x1+x3-x2-x2)+fabsf(y1+y3-y2-y2)+fabsf(x2+x4-x3-x3)+fabsf(y2+y4-y3-y3) < tessTol*0.25f) {
839 lineTo(x1234, y1234);
840 return;
843 tesselateBezierDCj(x1, y1, x12, y12, x123, y123, x1234, y1234, level+1);
844 tesselateBezierDCj(x1234, y1234, x234, y234, x34, y34, x4, y4, level+1);
847 // ////////////////////////////////////////////////////////////////////////// //
848 // based on the ideas and code of Maxim Shemanarev. Rest in Peace, bro!
849 // see http://www.antigrain.com/research/adaptive_bezier/index.html
850 void tesselateBezierMcSeem (in float x1, in float y1, in float x2, in float y2,
851 in float x3, in float y3, in float x4, in float y4, in int level)
853 import core.stdc.math : fabsf, atan2f;
855 enum CollinearEPS = 0.00000001f; // 0.00001f;
856 enum AngleTolEPS = 0.01f;
858 static float distSquared (in float x1, in float y1, in float x2, in float y2) pure nothrow @safe @nogc {
859 pragma(inline, true);
860 immutable float dx = x2-x1;
861 immutable float dy = y2-y1;
862 return dx*dx+dy*dy;
866 if (level == 0) {
867 lineTo(x1, y1/*, 0*/);
868 tesselateBezierMcSeem(x1, y1, x2, y2, x3, y3, x4, y4, 1/*, type*/);
869 lineTo(x4, y4/*, type*/);
870 return;
874 if (level > bezierLimit) return; // recurse limit; practically, it should be never reached, but...
876 // calculate all the mid-points of the line segments
877 immutable float x12 = (x1+x2)*0.5f;
878 immutable float y12 = (y1+y2)*0.5f;
879 immutable float x23 = (x2+x3)*0.5f;
880 immutable float y23 = (y2+y3)*0.5f;
881 immutable float x34 = (x3+x4)*0.5f;
882 immutable float y34 = (y3+y4)*0.5f;
883 immutable float x123 = (x12+x23)*0.5f;
884 immutable float y123 = (y12+y23)*0.5f;
885 immutable float x234 = (x23+x34)*0.5f;
886 immutable float y234 = (y23+y34)*0.5f;
887 immutable float x1234 = (x123+x234)*0.5f;
888 immutable float y1234 = (y123+y234)*0.5f;
890 // try to approximate the full cubic curve by a single straight line
891 immutable float dx = x4-x1;
892 immutable float dy = y4-y1;
894 float d2 = fabsf(((x2-x4)*dy-(y2-y4)*dx));
895 float d3 = fabsf(((x3-x4)*dy-(y3-y4)*dx));
897 final switch ((cast(int)(d2 > CollinearEPS)<<1)+cast(int)(d3 > CollinearEPS)) {
898 case 0:
899 // all collinear or p1 == p4
900 float k = dx*dx+dy*dy;
901 if (k == 0.0f) {
902 d2 = distSquared(x1, y1, x2, y2);
903 d3 = distSquared(x4, y4, x3, y3);
904 } else {
905 k = 1.0f/k;
906 float da1 = x2-x1;
907 float da2 = y2-y1;
908 d2 = k*(da1*dx+da2*dy);
909 da1 = x3-x1;
910 da2 = y3-y1;
911 d3 = k*(da1*dx+da2*dy);
912 if (d2 > 0 && d2 < 1 && d3 > 0 && d3 < 1) {
913 // Simple collinear case, 1---2---3---4
914 // We can leave just two endpoints
915 return;
917 if (d2 <= 0.0f) d2 = distSquared(x2, y2, x1, y1);
918 else if (d2 >= 1.0f) d2 = distSquared(x2, y2, x4, y4);
919 else d2 = distSquared(x2, y2, x1+d2*dx, y1+d2*dy);
921 if (d3 <= 0.0f) d3 = distSquared(x3, y3, x1, y1);
922 else if (d3 >= 1.0f) d3 = distSquared(x3, y3, x4, y4);
923 else d3 = distSquared(x3, y3, x1+d3*dx, y1+d3*dy);
925 if (d2 > d3) {
926 if (d2 < tessTol) {
927 lineTo(x2, y2);
928 return;
930 } else if (d3 < tessTol) {
931 lineTo(x3, y3);
932 return;
934 break;
935 case 1:
936 // p1,p2,p4 are collinear, p3 is significant
937 if (d3*d3 <= tessTol*(dx*dx+dy*dy)) {
938 if (angleTol < AngleTolEPS) {
939 lineTo(x23, y23);
940 return;
941 } else {
942 // angle condition
943 float da1 = fabsf(atan2f(y4-y3, x4-x3)-atan2f(y3-y2, x3-x2));
944 if (da1 >= FLT_PI) da1 = 2.0f*FLT_PI-da1;
945 if (da1 < angleTol) {
946 lineTo(x2, y2);
947 lineTo(x3, y3);
948 return;
950 if (cuspLimit != 0.0f) {
951 if (da1 > cuspLimit) {
952 lineTo(x3, y3);
953 return;
958 break;
959 case 2:
960 // p1,p3,p4 are collinear, p2 is significant
961 if (d2*d2 <= tessTol*(dx*dx+dy*dy)) {
962 if (angleTol < AngleTolEPS) {
963 lineTo(x23, y23);
964 return;
965 } else {
966 // angle condition
967 float da1 = fabsf(atan2f(y3-y2, x3-x2)-atan2f(y2-y1, x2-x1));
968 if (da1 >= FLT_PI) da1 = 2.0f*FLT_PI-da1;
969 if (da1 < angleTol) {
970 lineTo(x2, y2);
971 lineTo(x3, y3);
972 return;
974 if (cuspLimit != 0.0f) {
975 if (da1 > cuspLimit) {
976 lineTo(x2, y2);
977 return;
982 break;
983 case 3:
984 // regular case
985 if ((d2+d3)*(d2+d3) <= tessTol*(dx*dx+dy*dy)) {
986 // if the curvature doesn't exceed the distance tolerance value, we tend to finish subdivisions
987 if (angleTol < AngleTolEPS) {
988 lineTo(x23, y23);
989 return;
990 } else {
991 // angle and cusp condition
992 immutable float k = atan2f(y3-y2, x3-x2);
993 float da1 = fabsf(k-atan2f(y2-y1, x2-x1));
994 float da2 = fabsf(atan2f(y4-y3, x4-x3)-k);
995 if (da1 >= FLT_PI) da1 = 2.0f*FLT_PI-da1;
996 if (da2 >= FLT_PI) da2 = 2.0f*FLT_PI-da2;
997 if (da1+da2 < angleTol) {
998 // finally we can stop the recursion
999 lineTo(x23, y23);
1000 return;
1002 if (cuspLimit != 0.0f) {
1003 if (da1 > cuspLimit) {
1004 lineTo(x2, y2);
1005 return;
1007 if (da2 > cuspLimit) {
1008 lineTo(x3, y3);
1009 return;
1014 break;
1017 // continue subdivision
1018 tesselateBezierMcSeem(x1, y1, x12, y12, x123, y123, x1234, y1234, level+1);
1019 tesselateBezierMcSeem(x1234, y1234, x234, y234, x34, y34, x4, y4, level+1);
1022 // Adaptive forward differencing for bezier tesselation.
1023 // See Lien, Sheue-Ling, Michael Shantz, and Vaughan Pratt.
1024 // "Adaptive forward differencing for rendering curves and surfaces."
1025 // ACM SIGGRAPH Computer Graphics. Vol. 21. No. 4. ACM, 1987.
1026 // original code by Taylor Holliday <taylor@audulus.com>
1027 void tesselateBezierAFD (in float x1, in float y1, in float x2, in float y2,
1028 in float x3, in float y3, in float x4, in float y4)
1030 enum AFD_ONE = (1<<10);
1032 // power basis
1033 immutable float ax = -x1+3*x2-3*x3+x4;
1034 immutable float ay = -y1+3*y2-3*y3+y4;
1035 immutable float bx = 3*x1-6*x2+3*x3;
1036 immutable float by = 3*y1-6*y2+3*y3;
1037 immutable float cx = -3*x1+3*x2;
1038 immutable float cy = -3*y1+3*y2;
1040 // Transform to forward difference basis (stepsize 1)
1041 float px = x1;
1042 float py = y1;
1043 float dx = ax+bx+cx;
1044 float dy = ay+by+cy;
1045 float ddx = 6*ax+2*bx;
1046 float ddy = 6*ay+2*by;
1047 float dddx = 6*ax;
1048 float dddy = 6*ay;
1050 //printf("dx: %f, dy: %f\n", dx, dy);
1051 //printf("ddx: %f, ddy: %f\n", ddx, ddy);
1052 //printf("dddx: %f, dddy: %f\n", dddx, dddy);
1054 int t = 0;
1055 int dt = AFD_ONE;
1057 immutable float tol = tessTol*4.0f;
1059 while (t < AFD_ONE) {
1060 // Flatness measure.
1061 float d = ddx*ddx+ddy*ddy+dddx*dddx+dddy*dddy;
1063 // printf("d: %f, th: %f\n", d, th);
1065 // Go to higher resolution if we're moving a lot or overshooting the end.
1066 while ((d > tol && dt > 1) || (t+dt > AFD_ONE)) {
1067 // printf("up\n");
1069 // Apply L to the curve. Increase curve resolution.
1070 dx = 0.5f*dx-(1.0f/8.0f)*ddx+(1.0f/16.0f)*dddx;
1071 dy = 0.5f*dy-(1.0f/8.0f)*ddy+(1.0f/16.0f)*dddy;
1072 ddx = (1.0f/4.0f)*ddx-(1.0f/8.0f)*dddx;
1073 ddy = (1.0f/4.0f)*ddy-(1.0f/8.0f)*dddy;
1074 dddx = (1.0f/8.0f)*dddx;
1075 dddy = (1.0f/8.0f)*dddy;
1077 // Half the stepsize.
1078 dt >>= 1;
1080 // Recompute d
1081 d = ddx*ddx+ddy*ddy+dddx*dddx+dddy*dddy;
1084 // Go to lower resolution if we're really flat
1085 // and we aren't going to overshoot the end.
1086 // XXX: tol/32 is just a guess for when we are too flat.
1087 while ((d > 0 && d < tol/32.0f && dt < AFD_ONE) && (t+2*dt <= AFD_ONE)) {
1088 // printf("down\n");
1090 // Apply L^(-1) to the curve. Decrease curve resolution.
1091 dx = 2*dx+ddx;
1092 dy = 2*dy+ddy;
1093 ddx = 4*ddx+4*dddx;
1094 ddy = 4*ddy+4*dddy;
1095 dddx = 8*dddx;
1096 dddy = 8*dddy;
1098 // Double the stepsize.
1099 dt <<= 1;
1101 // Recompute d
1102 d = ddx*ddx+ddy*ddy+dddx*dddx+dddy*dddy;
1105 // Forward differencing.
1106 px += dx;
1107 py += dy;
1108 dx += ddx;
1109 dy += ddy;
1110 ddx += dddx;
1111 ddy += dddy;
1113 // Output a point.
1114 lineTo(px, py/*, (t > 0 ? type : 0)*/);
1116 // Advance along the curve.
1117 t += dt;
1119 // Ensure we don't overshoot.
1120 assert(t <= AFD_ONE);
1125 public void tesselateBezier (in float x1, in float y1, in float x2, in float y2,
1126 in float x3, in float y3, in float x4, in float y4)
1128 final switch (tesselator) with (AGGTesselation) {
1129 case DeCasteljau:
1130 tesselateBezierDCj(x1, y1, x2, y2, x3, y3, x4, y4, 0);
1131 break;
1132 case AFD:
1133 tesselateBezierAFD(x1, y1, x2, y2, x3, y3, x4, y4);
1134 break;
1135 case DeCasteljauMcSeem:
1136 lineTo(x1, y1);
1137 tesselateBezierMcSeem(x1, y1, x2, y2, x3, y3, x4, y4, 1);
1138 lineTo(x4, y4);
1139 break;
1143 // ////////////////////////////////////////////////////////////////////////// //
1144 public enum BaphometDims = 512; // [0..511]
1145 private enum baph_debug_time = false;
1146 private enum baph_debug_dump = false;
1147 public void renderBaphomet (float ofsx=0.0f, float ofsy=0.0f, float scalex=1.0f, float scaley=1.0f) {
1148 auto path = cast(const(ubyte)[])baphometPath;
1149 immutable plen = path.length;
1150 uint ppos = 0;
1152 enum Command {
1153 Bounds, // always first, has 4 args (x0, y0, x1, y1)
1154 StrokeMode,
1155 FillMode,
1156 StrokeFillMode,
1157 NormalStroke,
1158 ThinStroke,
1159 MoveTo,
1160 LineTo,
1161 CubicTo, // cubic bezier
1162 EndPath,
1165 Command getCommand () nothrow @trusted @nogc {
1166 if (ppos >= plen) assert(0, "invalid path");
1167 return cast(Command)(path.ptr[ppos++]);
1170 float getFloat () nothrow @trusted @nogc {
1171 if (ppos >= plen || plen-ppos < float.sizeof) assert(0, "invalid path");
1172 version(LittleEndian) {
1173 float res = *cast(const(float)*)(&path.ptr[ppos]);
1174 ppos += cast(uint)float.sizeof;
1175 return res;
1176 } else {
1177 static assert(float.sizeof == 4);
1178 uint xp = path.ptr[ppos]|(path.ptr[ppos+1]<<8)|(path.ptr[ppos+2]<<16)|(path.ptr[ppos+3]<<24);
1179 ppos += cast(uint)float.sizeof;
1180 return *cast(const(float)*)(&xp);
1184 float scaleX (in float v) nothrow @trusted @nogc { pragma(inline, true); return ofsx+cast(float)v*scalex; }
1185 float scaleY (in float v) nothrow @trusted @nogc { pragma(inline, true); return ofsy+cast(float)v*scaley; }
1187 static if (baph_debug_time) {
1188 import iv.pxclock;
1189 immutable tstt = clockMicro();
1192 beginPath();
1193 float cx = 0.0f, cy = 0.0f;
1194 bool doStroke = false, doFill = false;
1195 while (ppos < plen) {
1196 auto cmd = getCommand();
1197 static if (baph_debug_dump) {
1198 foreach (string mn; __traits(allMembers, Command)) {
1199 if (__traits(getMember, Command, mn) == cmd) {
1200 import core.stdc.stdio;
1201 static if (baph_debug_time) {
1202 printf("cmd=%s ... ", mn.ptr);
1203 } else {
1204 printf("cmd=%s\n", mn.ptr);
1208 static if (baph_debug_time) {
1209 immutable cstt = clockMicro();
1212 final switch (cmd) {
1213 case Command.Bounds: ppos += 4*cast(uint)float.sizeof; break;
1214 case Command.StrokeMode: doStroke = true; doFill = false; break;
1215 case Command.FillMode: doStroke = false; doFill = true; break;
1216 case Command.StrokeFillMode: doStroke = true; doFill = true; break;
1217 case Command.NormalStroke: case Command.ThinStroke: break;
1218 case Command.MoveTo:
1219 cx = scaleX(getFloat());
1220 cy = scaleY(getFloat());
1221 moveTo(cx, cy);
1222 break;
1223 case Command.LineTo:
1224 immutable float ex = scaleX(getFloat());
1225 immutable float ey = scaleY(getFloat());
1226 lineTo(ex, ey);
1227 cx = ex;
1228 cy = ey;
1229 break;
1230 case Command.CubicTo: // cubic bezier
1231 immutable float x1 = scaleX(getFloat());
1232 immutable float y1 = scaleY(getFloat());
1233 immutable float x2 = scaleX(getFloat());
1234 immutable float y2 = scaleY(getFloat());
1235 immutable float ex = scaleX(getFloat());
1236 immutable float ey = scaleY(getFloat());
1237 bezierTo(x1, y1, x2, y2, ex, ey);
1238 cx = ex;
1239 cy = ey;
1240 break;
1241 case Command.EndPath: // don't close this path
1242 if (doFill) fill();
1243 if (doStroke) stroke();
1244 //doFill = doStroke = false;
1245 beginPath();
1246 break;
1248 static if (baph_debug_dump && baph_debug_time) {
1249 immutable estt = clockMicro()-cstt;
1250 import core.stdc.stdio; printf("microsecs: %u\n", cast(uint)estt);
1253 if (doFill) {
1254 static if (baph_debug_time) {
1255 immutable fstt = clockMicro();
1257 fill();
1258 static if (baph_debug_time) {
1259 immutable t = clockMicro()-fstt;
1260 import core.stdc.stdio; printf("fill microsecs: %u\n", cast(uint)t);
1263 if (doStroke) {
1264 static if (baph_debug_time) {
1265 immutable sstt = clockMicro();
1267 stroke();
1268 static if (baph_debug_time) {
1269 immutable t = clockMicro()-sstt;
1270 import core.stdc.stdio; printf("stroke microsecs: %u\n", cast(uint)t);
1273 static if (baph_debug_time) {
1274 immutable estt = clockMicro()-tstt;
1275 import core.stdc.stdio; printf("total microsecs: %u\n", cast(uint)estt);
1277 beginPath();
1280 private static immutable ubyte[7641] baphometPath = [
1281 0x01,0x04,0x06,0x30,0x89,0x7f,0x43,0x00,0x80,0xff,0x43,0x08,0xa0,0x1d,0xc6,0x43,0x00,0x80,0xff,0x43,
1282 0x00,0x80,0xff,0x43,0xa2,0x1d,0xc6,0x43,0x00,0x80,0xff,0x43,0x30,0x89,0x7f,0x43,0x08,0x00,0x80,0xff,
1283 0x43,0x7a,0x89,0xe5,0x42,0xa0,0x1d,0xc6,0x43,0x00,0x00,0x00,0x00,0x30,0x89,0x7f,0x43,0x00,0x00,0x00,
1284 0x00,0x08,0x7a,0x89,0xe5,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x89,0xe5,0x42,0x00,0x00,
1285 0x00,0x00,0x30,0x89,0x7f,0x43,0x08,0x00,0x00,0x00,0x00,0xa2,0x1d,0xc6,0x43,0x7a,0x89,0xe5,0x42,0x00,
1286 0x80,0xff,0x43,0x30,0x89,0x7f,0x43,0x00,0x80,0xff,0x43,0x09,0x06,0x30,0x89,0x7f,0x43,0x72,0x87,0xdd,
1287 0x43,0x08,0x16,0x68,0xb3,0x43,0x72,0x87,0xdd,0x43,0x71,0x87,0xdd,0x43,0x17,0x68,0xb3,0x43,0x71,0x87,
1288 0xdd,0x43,0x30,0x89,0x7f,0x43,0x08,0x71,0x87,0xdd,0x43,0xd2,0x2f,0x18,0x43,0x16,0x68,0xb3,0x43,0x35,
1289 0xe2,0x87,0x42,0x30,0x89,0x7f,0x43,0x35,0xe2,0x87,0x42,0x08,0xd1,0x2f,0x18,0x43,0x35,0xe2,0x87,0x42,
1290 0x35,0xe2,0x87,0x42,0xd2,0x2f,0x18,0x43,0x35,0xe2,0x87,0x42,0x30,0x89,0x7f,0x43,0x08,0x35,0xe2,0x87,
1291 0x42,0x17,0x68,0xb3,0x43,0xd1,0x2f,0x18,0x43,0x72,0x87,0xdd,0x43,0x30,0x89,0x7f,0x43,0x72,0x87,0xdd,
1292 0x43,0x09,0x06,0x79,0xcb,0x11,0x43,0x62,0xbf,0xd7,0x42,0x07,0xa4,0x3f,0x7f,0x43,0x0b,0x86,0xdc,0x43,
1293 0x07,0x6c,0xb9,0xb2,0x43,0xe8,0xd1,0xca,0x42,0x07,0x6e,0x4d,0xa0,0x42,0xa9,0x10,0x9c,0x43,0x07,0xb7,
1294 0x40,0xd7,0x43,0xa9,0x10,0x9c,0x43,0x07,0x79,0xcb,0x11,0x43,0x62,0xbf,0xd7,0x42,0x09,0x06,0x98,0x42,
1295 0x74,0x43,0xb1,0x8d,0x68,0x43,0x08,0xd7,0x24,0x79,0x43,0xba,0x83,0x6e,0x43,0xa9,0x16,0x7c,0x43,0x56,
1296 0xa1,0x76,0x43,0x74,0x2a,0x7d,0x43,0x44,0x73,0x80,0x43,0x08,0x55,0xd1,0x7e,0x43,0xe3,0xea,0x76,0x43,
1297 0xbc,0x18,0x81,0x43,0x7f,0xa8,0x6e,0x43,0x8f,0x0a,0x84,0x43,0x02,0xfc,0x68,0x43,0x09,0x06,0x92,0x29,
1298 0x8d,0x43,0x73,0xc3,0x67,0x43,0x08,0xa4,0xd9,0x8e,0x43,0xf2,0xa6,0x7a,0x43,0x8f,0x22,0x88,0x43,0x75,
1299 0x2a,0x7d,0x43,0x42,0x7f,0x82,0x43,0x08,0xc8,0x88,0x43,0x09,0x06,0xc1,0x79,0x74,0x43,0x50,0x64,0x89,
1300 0x43,0x08,0x68,0x2d,0x72,0x43,0xee,0x21,0x81,0x43,0xcd,0x97,0x55,0x43,0xe6,0xf1,0x7b,0x43,0x91,0xec,
1301 0x5d,0x43,0xa8,0xc7,0x6a,0x43,0x09,0x06,0xfa,0xa5,0x52,0x43,0x60,0x97,0x7c,0x43,0x08,0x19,0xff,0x50,
1302 0x43,0xe9,0x6e,0x8a,0x43,0xb0,0xbd,0x70,0x43,0x4c,0x51,0x82,0x43,0x04,0xeb,0x69,0x43,0x66,0x0f,0x8e,
1303 0x43,0x09,0x06,0x17,0xbf,0x71,0x43,0x2c,0x58,0x94,0x43,0x08,0x1c,0x96,0x6e,0x43,0x61,0x68,0x99,0x43,
1304 0x2d,0x3a,0x6e,0x43,0xc8,0x81,0x9e,0x43,0xb7,0x9b,0x72,0x43,0x61,0xa4,0xa3,0x43,0x09,0x06,0x30,0xdb,
1305 0x82,0x43,0xdb,0xe9,0x93,0x43,0x08,0x11,0x82,0x84,0x43,0x61,0x68,0x99,0x43,0xe8,0x4a,0x84,0x43,0x8e,
1306 0xa6,0x9e,0x43,0x42,0x7f,0x82,0x43,0x61,0xa4,0xa3,0x43,0x09,0x06,0xc4,0x02,0x85,0x43,0xd1,0x0b,0x92,
1307 0x43,0x08,0xd6,0xb2,0x86,0x43,0x34,0x1e,0x92,0x43,0x4f,0x58,0x87,0x43,0xa4,0xf1,0x92,0x43,0x03,0xd9,
1308 0x87,0x43,0x7b,0xc6,0x94,0x43,0x09,0x06,0x87,0x3e,0x64,0x43,0x31,0x3b,0x93,0x43,0x08,0x3b,0xbf,0x64,
1309 0x43,0x6f,0xf9,0x91,0x43,0x96,0x0b,0x67,0x43,0xc5,0x4a,0x91,0x43,0xcf,0xfe,0x6a,0x43,0x31,0x2f,0x91,
1310 0x43,0x09,0x06,0x16,0x74,0xb5,0x43,0x08,0xec,0x8e,0x43,0x08,0x1b,0x4b,0xb2,0x43,0xee,0x5d,0x8b,0x43,
1311 0x48,0x4d,0xad,0x43,0x12,0xa6,0x8a,0x43,0xf3,0xd7,0xa7,0x43,0x74,0xb8,0x8a,0x43,0x08,0x8c,0xb2,0xa0,
1312 0x43,0xcd,0xf8,0x8a,0x43,0x68,0x46,0x9b,0x43,0x79,0x8f,0x87,0x43,0x49,0xc9,0x96,0x43,0xe9,0x3e,0x82,
1313 0x43,0x08,0x60,0x5c,0x97,0x43,0xa1,0xde,0x8b,0x43,0x4e,0xa0,0x93,0x43,0x31,0x3b,0x93,0x43,0x9f,0xea,
1314 0x8d,0x43,0x27,0x8d,0x99,0x43,0x08,0x07,0xe0,0x8c,0x43,0x06,0x34,0x9b,0x43,0x38,0xe9,0x8c,0x43,0x46,
1315 0x0a,0x9e,0x43,0x3d,0xcc,0x8b,0x43,0xb2,0x06,0xa2,0x43,0x08,0xf1,0x40,0x8a,0x43,0xb0,0x12,0xa4,0x43,
1316 0x39,0xd1,0x88,0x43,0x76,0x43,0xa6,0x43,0xfa,0x06,0x88,0x43,0xa4,0x75,0xa9,0x43,0x08,0x19,0x6c,0x88,
1317 0x43,0x9f,0x9e,0xac,0x43,0x66,0xeb,0x87,0x43,0x44,0x76,0xb0,0x43,0x6b,0xce,0x86,0x43,0x3b,0xbc,0xb4,
1318 0x43,0x08,0xa9,0x8c,0x85,0x43,0x06,0xd0,0xb5,0x43,0xfa,0xee,0x83,0x43,0x74,0xa3,0xb6,0x43,0x3d,0x90,
1319 0x81,0x43,0x31,0xf6,0xb6,0x43,0x08,0x9d,0x61,0x7d,0x43,0xee,0x48,0xb7,0x43,0x3b,0x1f,0x75,0x43,0xcf,
1320 0xe3,0xb6,0x43,0xee,0x6f,0x6d,0x43,0x68,0xe2,0xb5,0x43,0x08,0xd4,0xed,0x6b,0x43,0x87,0x2f,0xb2,0x43,
1321 0x0e,0xc9,0x6b,0x43,0xa7,0x7c,0xae,0x43,0x98,0xfa,0x67,0x43,0xab,0x53,0xab,0x43,0x08,0x25,0x2c,0x64,
1322 0x43,0x33,0xa2,0xa8,0x43,0x40,0x96,0x61,0x43,0xc3,0xc2,0xa5,0x43,0x64,0xde,0x60,0x43,0xfa,0xa2,0xa2,
1323 0x43,0x08,0xb0,0x5d,0x60,0x43,0x06,0x4c,0x9f,0x43,0x9a,0xca,0x5f,0x43,0x38,0x3d,0x9b,0x43,0x3b,0x8f,
1324 0x5c,0x43,0x85,0xb0,0x98,0x43,0x08,0x42,0x36,0x51,0x43,0x3d,0xf0,0x91,0x43,0xcd,0x4f,0x49,0x43,0xdb,
1325 0xb9,0x8b,0x43,0xe0,0xdb,0x44,0x43,0x42,0x8b,0x84,0x43,0x08,0x7e,0xc9,0x44,0x43,0x8a,0x57,0x8d,0x43,
1326 0xbc,0x6c,0x0f,0x43,0x23,0x62,0x8e,0x43,0xf5,0x17,0x07,0x43,0xc5,0x3e,0x8f,0x43,0x09,0x06,0xe0,0xea,
1327 0x76,0x43,0xab,0xef,0xc5,0x43,0x08,0x12,0x00,0x79,0x43,0xab,0xcb,0xbf,0x43,0x79,0xb9,0x6d,0x43,0x7e,
1328 0x8d,0xba,0x43,0xee,0x6f,0x6d,0x43,0x98,0xeb,0xb5,0x43,0x08,0xe0,0x02,0x7b,0x43,0x5f,0x1c,0xb8,0x43,
1329 0x85,0x2c,0x82,0x43,0xe9,0x65,0xb8,0x43,0xd6,0xb2,0x86,0x43,0xc6,0x05,0xb5,0x43,0x08,0x03,0xcd,0x85,
1330 0x43,0x5a,0x39,0xb9,0x43,0xe4,0x4f,0x81,0x43,0xdb,0xd4,0xbf,0x43,0xdf,0x6c,0x82,0x43,0xbc,0x93,0xc5,
1331 0x43,0x09,0x06,0xf0,0xd0,0x22,0x43,0x5d,0x19,0x08,0x43,0x08,0xbc,0xab,0x49,0x43,0x4a,0x35,0x29,0x43,
1332 0xcb,0xf7,0x65,0x43,0xce,0x37,0x45,0x43,0x0e,0x99,0x63,0x43,0x67,0xc6,0x5c,0x43,0x09,0x06,0x05,0x94,
1333 0xab,0x43,0xc2,0x13,0x04,0x43,0x08,0x9f,0x26,0x98,0x43,0x11,0x42,0x25,0x43,0x97,0x00,0x8a,0x43,0x32,
1334 0x32,0x41,0x43,0xf5,0x2f,0x8b,0x43,0xc7,0xc0,0x58,0x43,0x09,0x06,0x8f,0x85,0x48,0x43,0xe0,0xa8,0x8c,
1335 0x43,0x08,0x55,0xaa,0x48,0x43,0xe0,0xa8,0x8c,0x43,0x6b,0x3d,0x49,0x43,0xc1,0x43,0x8c,0x43,0x31,0x62,
1336 0x49,0x43,0xc1,0x43,0x8c,0x43,0x08,0x2f,0xe3,0x2f,0x43,0xad,0xe7,0x98,0x43,0xff,0x0d,0x0d,0x43,0xad,
1337 0xf3,0x9a,0x43,0xf0,0xaf,0xcc,0x42,0x74,0x00,0x97,0x43,0x08,0xbb,0xa2,0xf7,0x42,0x93,0x4d,0x93,0x43,
1338 0x5e,0x19,0x08,0x43,0x5a,0x2a,0x87,0x43,0x23,0x6e,0x10,0x43,0x42,0x97,0x86,0x43,0x08,0xca,0xe8,0x33,
1339 0x43,0x1b,0x3c,0x80,0x43,0x80,0xe8,0x4d,0x43,0xda,0xf4,0x70,0x43,0xae,0x0e,0x4f,0x43,0x2b,0x1b,0x65,
1340 0x43,0x08,0x66,0x96,0x54,0x43,0xa3,0xe1,0x3b,0x43,0x4e,0xc4,0x19,0x43,0xa0,0x1a,0x16,0x43,0x10,0xe2,
1341 0x14,0x43,0x26,0x14,0xe0,0x42,0x08,0x5c,0x91,0x1c,0x43,0xcb,0x27,0xee,0x42,0xa9,0x40,0x24,0x43,0x71,
1342 0x3b,0xfc,0x42,0xf3,0xef,0x2b,0x43,0x8b,0x27,0x05,0x43,0x08,0xe2,0x4b,0x2c,0x43,0x48,0x86,0x07,0x43,
1343 0x79,0x62,0x2f,0x43,0x05,0xe5,0x09,0x43,0x55,0x32,0x34,0x43,0xa0,0xd2,0x09,0x43,0x08,0x74,0xa3,0x36,
1344 0x43,0x3a,0xd1,0x08,0x43,0x7e,0x81,0x38,0x43,0x09,0xd4,0x0a,0x43,0x0d,0xba,0x39,0x43,0xa0,0xea,0x0d,
1345 0x43,0x08,0x6f,0xe4,0x3d,0x43,0x43,0xc7,0x0e,0x43,0xd6,0xe5,0x3e,0x43,0xc4,0x4a,0x11,0x43,0x55,0x7a,
1346 0x40,0x43,0x59,0x72,0x13,0x43,0x08,0x55,0x92,0x44,0x43,0xbf,0x73,0x14,0x43,0x23,0x95,0x46,0x43,0xa5,
1347 0x09,0x17,0x43,0xe0,0xf3,0x48,0x43,0xfe,0x55,0x19,0x43,0x08,0xcd,0x4f,0x49,0x43,0xaa,0x10,0x1c,0x43,
1348 0x61,0x77,0x4b,0x43,0xfe,0x6d,0x1d,0x43,0x80,0xe8,0x4d,0x43,0x2b,0x94,0x1e,0x43,0x08,0x58,0xc9,0x51,
1349 0x43,0x41,0x27,0x1f,0x43,0x9b,0x82,0x53,0x43,0x35,0x72,0x20,0x43,0x53,0xf2,0x54,0x43,0x88,0xcf,0x21,
1350 0x43,0x08,0x7b,0x29,0x55,0x43,0xe8,0x0a,0x25,0x43,0xb2,0x2d,0x58,0x43,0xef,0xe8,0x26,0x43,0x9b,0xb2,
1351 0x5b,0x43,0xd0,0x8f,0x28,0x43,0x08,0x5f,0xef,0x5f,0x43,0xeb,0x11,0x2a,0x43,0xfd,0xdc,0x5f,0x43,0x6e,
1352 0x95,0x2c,0x43,0x3b,0xa7,0x60,0x43,0x2b,0xf4,0x2e,0x43,0x08,0x06,0xbb,0x61,0x43,0xfd,0xe5,0x31,0x43,
1353 0xe7,0x61,0x63,0x43,0xef,0x30,0x33,0x43,0x53,0x52,0x65,0x43,0xa3,0xb1,0x33,0x43,0x08,0x12,0xa0,0x68,
1354 0x43,0x7f,0x69,0x34,0x43,0x40,0xc6,0x69,0x43,0x64,0xff,0x36,0x43,0x7e,0x90,0x6a,0x43,0x71,0xcc,0x39,
1355 0x43,0x08,0xbc,0x5a,0x6b,0x43,0x51,0x73,0x3b,0x43,0xc1,0x49,0x6c,0x43,0xa5,0xd0,0x3c,0x43,0xe0,0xba,
1356 0x6e,0x43,0xb8,0x74,0x3c,0x43,0x08,0x6b,0x1c,0x73,0x43,0x13,0xc1,0x3e,0x43,0x40,0xf6,0x71,0x43,0xce,
1357 0x1f,0x41,0x43,0x55,0x89,0x72,0x43,0x8d,0x7e,0x43,0x43,0x08,0x68,0x2d,0x72,0x43,0x89,0xae,0x4b,0x43,
1358 0xc1,0x79,0x74,0x43,0xcb,0x78,0x4c,0x43,0x55,0xa1,0x76,0x43,0x5b,0xb1,0x4d,0x43,0x08,0xa2,0x38,0x7a,
1359 0x43,0xd1,0x56,0x4e,0x43,0x85,0xb6,0x78,0x43,0xb1,0x15,0x54,0x43,0x83,0xc7,0x77,0x43,0x89,0x0e,0x5c,
1360 0x43,0x08,0xcf,0x46,0x77,0x43,0x0f,0x81,0x5f,0x43,0x1a,0xde,0x7a,0x43,0xce,0xc7,0x5d,0x43,0x42,0x73,
1361 0x80,0x43,0x99,0xc3,0x5a,0x43,0x08,0x85,0x2c,0x82,0x43,0xf6,0xe6,0x59,0x43,0x81,0x3d,0x81,0x43,0x16,
1362 0x10,0x50,0x43,0xd6,0x8e,0x80,0x43,0x5b,0x99,0x49,0x43,0x08,0xc4,0xea,0x80,0x43,0x22,0x95,0x46,0x43,
1363 0xfa,0xe2,0x81,0x43,0xda,0xec,0x43,0x43,0x78,0x77,0x83,0x43,0xe4,0xb2,0x41,0x43,0x08,0x8a,0x27,0x85,
1364 0x43,0x86,0x77,0x3e,0x43,0x0c,0x9f,0x85,0x43,0x07,0xf4,0x3b,0x43,0x8f,0x16,0x86,0x43,0xe6,0x82,0x39,
1365 0x43,0x08,0x85,0x44,0x86,0x43,0x37,0xd9,0x35,0x43,0x1e,0x4f,0x87,0x43,0xe1,0x7b,0x34,0x43,0xdf,0x90,
1366 0x88,0x43,0xb6,0x55,0x33,0x43,0x08,0xae,0x93,0x8a,0x43,0xfd,0xe5,0x31,0x43,0xfa,0x12,0x8a,0x43,0xbf,
1367 0x03,0x2d,0x43,0x19,0x78,0x8a,0x43,0x45,0x5e,0x2c,0x43,0x08,0x03,0xf1,0x8b,0x43,0xac,0x47,0x29,0x43,
1368 0x2f,0x17,0x8d,0x43,0x45,0x46,0x28,0x43,0xc8,0x21,0x8e,0x43,0x30,0xb3,0x27,0x43,0x08,0xa9,0xc8,0x8f,
1369 0x43,0xef,0xe8,0x26,0x43,0xbf,0x5b,0x90,0x43,0x5b,0xc1,0x24,0x43,0x10,0xca,0x90,0x43,0xa0,0x62,0x22,
1370 0x43,0x08,0x26,0x5d,0x91,0x43,0xbb,0xcc,0x1f,0x43,0xf0,0x70,0x92,0x43,0x78,0x13,0x1e,0x43,0x77,0xd7,
1371 0x93,0x43,0x73,0x24,0x1d,0x43,0x08,0x65,0x3f,0x96,0x43,0xce,0x58,0x1b,0x43,0xbe,0x7f,0x96,0x43,0xbf,
1372 0x8b,0x18,0x43,0x60,0x5c,0x97,0x43,0xb6,0xad,0x16,0x43,0x08,0xba,0xa8,0x99,0x43,0x78,0xcb,0x11,0x43,
1373 0x49,0xe1,0x9a,0x43,0x78,0xcb,0x11,0x43,0x01,0x51,0x9c,0x43,0x73,0xdc,0x10,0x43,0x08,0x72,0x24,0x9d,
1374 0x43,0xd2,0xff,0x0f,0x43,0x1c,0xd3,0x9d,0x43,0x07,0xec,0x0e,0x43,0xeb,0xc9,0x9d,0x43,0xe8,0x7a,0x0c,
1375 0x43,0x08,0x60,0x80,0x9d,0x43,0xd7,0xbe,0x08,0x43,0x4d,0xe8,0x9f,0x43,0x86,0x50,0x08,0x43,0x25,0xbd,
1376 0xa1,0x43,0x5b,0x2a,0x07,0x43,0x08,0x99,0x7f,0xa3,0x43,0xc9,0xf1,0x05,0x43,0x48,0x1d,0xa5,0x43,0x86,
1377 0x38,0x04,0x43,0x6c,0x71,0xa6,0x43,0x18,0x59,0x01,0x43,0x08,0x32,0x96,0xa6,0x43,0x6e,0x64,0xff,0x42,
1378 0x48,0x29,0xa7,0x43,0xed,0xcf,0xfd,0x42,0x5f,0xbc,0xa7,0x43,0x71,0x3b,0xfc,0x42,0x08,0xf3,0xe3,0xa9,
1379 0x43,0xf7,0x7d,0xf7,0x42,0xd8,0x6d,0xaa,0x43,0x45,0xe5,0xf2,0x42,0x48,0x41,0xab,0x43,0xcb,0x27,0xee,
1380 0x42,0x08,0x24,0xf9,0xab,0x43,0x52,0x6a,0xe9,0x42,0xee,0x0c,0xad,0x43,0x4c,0x8c,0xe7,0x42,0x1b,0x33,
1381 0xae,0x43,0xcc,0xf7,0xe5,0x42,0x08,0xaa,0x6b,0xaf,0x43,0xe8,0x61,0xe3,0x42,0x90,0xf5,0xaf,0x43,0xc9,
1382 0xf0,0xe0,0x42,0xe0,0x63,0xb0,0x43,0xe5,0x5a,0xde,0x42,0x08,0xaa,0x83,0xb3,0x43,0x29,0x2d,0x09,0x43,
1383 0x6a,0xfe,0x8e,0x43,0xb8,0x74,0x3c,0x43,0xd5,0x06,0x95,0x43,0xe6,0x79,0x67,0x43,0x08,0x2f,0x53,0x97,
1384 0x43,0xe9,0xb0,0x74,0x43,0xa8,0x28,0xa0,0x43,0x43,0xfd,0x76,0x43,0x83,0x28,0xad,0x43,0x17,0x59,0x81,
1385 0x43,0x08,0x3d,0xe7,0xbf,0x43,0x4b,0x8d,0x8c,0x43,0xae,0x96,0xba,0x43,0x66,0x27,0x92,0x43,0x15,0xe0,
1386 0xc7,0x43,0x6f,0x11,0x96,0x43,0x08,0x7e,0x5d,0xb2,0x43,0xdb,0x01,0x98,0x43,0x9e,0x56,0xa0,0x43,0x80,
1387 0xc1,0x97,0x43,0x69,0x2e,0x97,0x43,0x31,0x17,0x8d,0x43,0x09,0x06,0xab,0xa7,0x39,0x43,0x67,0x0f,0x0e,
1388 0x43,0x08,0xdb,0xbc,0x3b,0x43,0xe8,0x92,0x10,0x43,0xb5,0x85,0x3b,0x43,0x97,0x3c,0x14,0x43,0xab,0xa7,
1389 0x39,0x43,0x0c,0x0b,0x18,0x43,0x09,0x06,0xca,0x30,0x40,0x43,0x30,0x3b,0x13,0x43,0x08,0x17,0xc8,0x43,
1390 0x43,0xa5,0x09,0x17,0x43,0x7e,0xc9,0x44,0x43,0x1a,0xd8,0x1a,0x43,0x9d,0x22,0x43,0x43,0x8d,0xa6,0x1e,
1391 0x43,0x09,0x06,0xc8,0x78,0x4c,0x43,0xed,0xc9,0x1d,0x43,0x08,0x0b,0x32,0x4e,0x43,0x22,0xce,0x20,0x43,
1392 0x23,0xc5,0x4e,0x43,0x58,0xd2,0x23,0x43,0x0b,0x32,0x4e,0x43,0x2b,0xc4,0x26,0x43,0x09,0x06,0xec,0x08,
1393 0x58,0x43,0xc7,0xb1,0x26,0x43,0x08,0x02,0x9c,0x58,0x43,0xef,0x00,0x2b,0x43,0xd9,0x64,0x58,0x43,0x02,
1394 0xbd,0x2e,0x43,0x10,0x51,0x57,0x43,0x37,0xc1,0x31,0x43,0x09,0x06,0xcb,0xdf,0x61,0x43,0x4a,0x65,0x31,
1395 0x43,0x08,0xbe,0x2a,0x63,0x43,0xbd,0x33,0x35,0x43,0x32,0xe1,0x62,0x43,0x56,0x4a,0x38,0x43,0xde,0x83,
1396 0x61,0x43,0x3c,0xe0,0x3a,0x43,0x09,0x06,0x1c,0x7e,0x6a,0x43,0x5b,0x39,0x39,0x43,0x08,0x31,0x11,0x6b,
1397 0x43,0x0c,0xd2,0x3d,0x43,0x1c,0x7e,0x6a,0x43,0x13,0xd9,0x42,0x43,0xd9,0xc4,0x68,0x43,0xcb,0x60,0x48,
1398 0x43,0x09,0x06,0xe5,0xc1,0x73,0x43,0x16,0xf8,0x4b,0x43,0x08,0xa6,0xf7,0x72,0x43,0xb1,0xfd,0x4f,0x43,
1399 0x3b,0x07,0x71,0x43,0x4a,0x14,0x53,0x43,0xa2,0xf0,0x6d,0x43,0x7c,0x29,0x55,0x43,0x09,0x06,0x00,0x8d,
1400 0xa6,0x43,0xef,0x21,0x01,0x43,0x08,0x52,0xfb,0xa6,0x43,0xce,0xc8,0x02,0x43,0xe6,0x16,0xa7,0x43,0x51,
1401 0x4c,0x05,0x43,0x3b,0x68,0xa6,0x43,0x4c,0x75,0x08,0x43,0x09,0x06,0xde,0x20,0xa1,0x43,0x86,0x50,0x08,
1402 0x43,0x08,0xd4,0x4e,0xa1,0x43,0xd3,0xe7,0x0b,0x43,0xb5,0xe9,0xa0,0x43,0x59,0x5a,0x0f,0x43,0xba,0xcc,
1403 0x9f,0x43,0x54,0x83,0x12,0x43,0x09,0x06,0x77,0xfb,0x99,0x43,0x6c,0x16,0x13,0x43,0x08,0xde,0xfc,0x9a,
1404 0x43,0x4a,0xbd,0x14,0x43,0x06,0x34,0x9b,0x43,0xfe,0x55,0x19,0x43,0x13,0xe9,0x99,0x43,0x41,0x27,0x1f,
1405 0x43,0x09,0x06,0x46,0xce,0x93,0x43,0x26,0xa5,0x1d,0x43,0x08,0xe7,0xaa,0x94,0x43,0xbb,0xcc,0x1f,0x43,
1406 0x18,0xb4,0x94,0x43,0xa8,0x40,0x24,0x43,0xe2,0xbb,0x93,0x43,0x21,0xfe,0x28,0x43,0x09,0x06,0xb1,0x8e,
1407 0x8d,0x43,0xa8,0x58,0x28,0x43,0x08,0x19,0x90,0x8e,0x43,0x54,0x13,0x2b,0x43,0xa4,0xd9,0x8e,0x43,0x84,
1408 0x40,0x31,0x43,0x46,0xaa,0x8d,0x43,0x29,0x24,0x37,0x43,0x09,0x06,0xd6,0xbe,0x88,0x43,0xef,0x30,0x33,
1409 0x43,0x08,0x0c,0xb7,0x89,0x43,0x0e,0xa2,0x35,0x43,0xc0,0x37,0x8a,0x43,0x7a,0xaa,0x3b,0x43,0xbb,0x48,
1410 0x89,0x43,0xbb,0x7b,0x41,0x43,0x09,0x06,0x3a,0xad,0x82,0x43,0xc4,0x59,0x43,0x43,0x08,0xd2,0xb7,0x83,
1411 0x43,0x2b,0x5b,0x44,0x43,0x35,0xd6,0x85,0x43,0x48,0xf5,0x49,0x43,0x42,0x97,0x86,0x43,0xc4,0xa1,0x4f,
1412 0x43,0x09,0x06,0x9c,0xb3,0x80,0x43,0x48,0x55,0x5a,0x43,0x08,0xff,0xc5,0x80,0x43,0x09,0x73,0x55,0x43,
1413 0x93,0xe1,0x80,0x43,0x0f,0x39,0x53,0x43,0xf1,0xbe,0x7e,0x43,0x18,0xe7,0x4c,0x43,0x09,0x06,0xe0,0x02,
1414 0x7b,0x43,0x92,0xec,0x5d,0x43,0x08,0x09,0x3a,0x7b,0x43,0xf0,0xf7,0x58,0x43,0x09,0x3a,0x7b,0x43,0xe6,
1415 0x31,0x5b,0x43,0xe0,0x02,0x7b,0x43,0xa8,0x4f,0x56,0x43,0x09,0x06,0x39,0x4f,0x7d,0x43,0x3e,0x8f,0x5c,
1416 0x43,0x08,0xe9,0xe0,0x7c,0x43,0x03,0x9c,0x58,0x43,0x1e,0x2b,0x81,0x43,0x7f,0x30,0x5a,0x43,0xff,0x73,
1417 0x7d,0x43,0xf6,0xb6,0x51,0x43,0x09,0x06,0x5c,0xb8,0x52,0x43,0x28,0x21,0x87,0x43,0x08,0xae,0x3e,0x57,
1418 0x43,0x12,0x9a,0x88,0x43,0x23,0xf5,0x56,0x43,0x04,0xf1,0x8b,0x43,0x25,0xfc,0x5b,0x43,0x85,0x74,0x8e,
1419 0x43,0x08,0x2f,0xf2,0x61,0x43,0x8e,0x52,0x90,0x43,0xd9,0xdc,0x6c,0x43,0x85,0x74,0x8e,0x43,0xc6,0x20,
1420 0x69,0x43,0x3d,0xd8,0x8d,0x43,0x08,0x6d,0x8c,0x5a,0x43,0xf5,0x3b,0x8d,0x43,0x3d,0x77,0x58,0x43,0xa1,
1421 0xc6,0x87,0x43,0xf8,0xed,0x5e,0x43,0x5e,0x0d,0x86,0x43,0x09,0x06,0xde,0xcc,0x92,0x43,0xf7,0x17,0x87,
1422 0x43,0x08,0xb6,0x89,0x90,0x43,0xae,0x87,0x88,0x43,0x4a,0xa5,0x90,0x43,0xa1,0xde,0x8b,0x43,0xf9,0x2a,
1423 0x8e,0x43,0x23,0x62,0x8e,0x43,0x08,0xf5,0x2f,0x8b,0x43,0x5c,0x49,0x90,0x43,0x35,0xd6,0x85,0x43,0x8e,
1424 0x46,0x8e,0x43,0x3d,0xb4,0x87,0x43,0x47,0xaa,0x8d,0x43,0x08,0x6a,0xfe,0x8e,0x43,0xff,0x0d,0x8d,0x43,
1425 0xbb,0x6c,0x8f,0x43,0xf7,0x17,0x87,0x43,0x5c,0x31,0x8c,0x43,0xb2,0x5e,0x85,0x43,0x09,0x06,0x60,0x38,
1426 0x91,0x43,0x69,0x5d,0x7a,0x43,0x08,0x34,0x1e,0x92,0x43,0x1e,0x5b,0x89,0x43,0x04,0x63,0x7e,0x43,0x5e,
1427 0x01,0x84,0x43,0x59,0x2a,0x87,0x43,0x0d,0xcf,0x8d,0x43,0x09,0x03,0x04,0x06,0x5a,0x18,0x63,0x43,0x82,
1428 0x79,0x8b,0x43,0x08,0x25,0x2c,0x64,0x43,0x82,0x79,0x8b,0x43,0x2a,0x1b,0x65,0x43,0x9d,0xef,0x8a,0x43,
1429 0x2a,0x1b,0x65,0x43,0xc1,0x37,0x8a,0x43,0x08,0x2a,0x1b,0x65,0x43,0x17,0x89,0x89,0x43,0x25,0x2c,0x64,
1430 0x43,0x31,0xff,0x88,0x43,0x5a,0x18,0x63,0x43,0x31,0xff,0x88,0x43,0x08,0xf3,0x16,0x62,0x43,0x31,0xff,
1431 0x88,0x43,0xee,0x27,0x61,0x43,0x17,0x89,0x89,0x43,0xee,0x27,0x61,0x43,0xc1,0x37,0x8a,0x43,0x08,0xee,
1432 0x27,0x61,0x43,0x9d,0xef,0x8a,0x43,0xf3,0x16,0x62,0x43,0x82,0x79,0x8b,0x43,0x5a,0x18,0x63,0x43,0x82,
1433 0x79,0x8b,0x43,0x09,0x06,0x4f,0x64,0x89,0x43,0x82,0x79,0x8b,0x43,0x08,0x34,0xee,0x89,0x43,0x82,0x79,
1434 0x8b,0x43,0x85,0x5c,0x8a,0x43,0x9d,0xef,0x8a,0x43,0x85,0x5c,0x8a,0x43,0xc1,0x37,0x8a,0x43,0x08,0x85,
1435 0x5c,0x8a,0x43,0x17,0x89,0x89,0x43,0x34,0xee,0x89,0x43,0x31,0xff,0x88,0x43,0x4f,0x64,0x89,0x43,0x31,
1436 0xff,0x88,0x43,0x08,0x9c,0xe3,0x88,0x43,0x31,0xff,0x88,0x43,0x19,0x6c,0x88,0x43,0x17,0x89,0x89,0x43,
1437 0x19,0x6c,0x88,0x43,0xc1,0x37,0x8a,0x43,0x08,0x19,0x6c,0x88,0x43,0x9d,0xef,0x8a,0x43,0x9c,0xe3,0x88,
1438 0x43,0x82,0x79,0x8b,0x43,0x4f,0x64,0x89,0x43,0x82,0x79,0x8b,0x43,0x09,0x02,0x04,0x06,0x19,0x60,0x86,
1439 0x43,0xec,0xed,0xa3,0x43,0x08,0x35,0xd6,0x85,0x43,0x76,0x43,0xa6,0x43,0x93,0xe1,0x80,0x43,0x57,0x02,
1440 0xac,0x43,0x61,0xd8,0x80,0x43,0x87,0x17,0xae,0x43,0x08,0xa5,0x85,0x80,0x43,0xc3,0xfe,0xaf,0x43,0xce,
1441 0xbc,0x80,0x43,0x83,0x40,0xb1,0x43,0xa5,0x91,0x82,0x43,0x79,0x6e,0xb1,0x43,0x08,0x23,0x26,0x84,0x43,
1442 0x40,0x93,0xb1,0x43,0x30,0xe7,0x84,0x43,0xbe,0x1b,0xb1,0x43,0x11,0x82,0x84,0x43,0xab,0x6b,0xaf,0x43,
1443 0x08,0xb7,0x41,0x84,0x43,0x3b,0x98,0xae,0x43,0xb7,0x41,0x84,0x43,0xc3,0xf2,0xad,0x43,0xa1,0xae,0x83,
1444 0x43,0x83,0x28,0xad,0x43,0x08,0xb2,0x52,0x83,0x43,0x80,0x39,0xac,0x43,0x81,0x49,0x83,0x43,0xf0,0x00,
1445 0xab,0x43,0xe4,0x67,0x85,0x43,0x76,0x4f,0xa8,0x43,0x08,0x9c,0xd7,0x86,0x43,0xd1,0x83,0xa6,0x43,0xec,
1446 0x45,0x87,0x43,0x01,0x75,0xa2,0x43,0x19,0x60,0x86,0x43,0xec,0xed,0xa3,0x43,0x09,0x06,0xd9,0xdc,0x6c,
1447 0x43,0x14,0x25,0xa4,0x43,0x08,0xa2,0xf0,0x6d,0x43,0x9f,0x7a,0xa6,0x43,0x47,0xec,0x77,0x43,0x80,0x39,
1448 0xac,0x43,0xa9,0xfe,0x77,0x43,0xb0,0x4e,0xae,0x43,0x08,0x23,0xa4,0x78,0x43,0xea,0x35,0xb0,0x43,0xd2,
1449 0x35,0x78,0x43,0xab,0x77,0xb1,0x43,0xc1,0x79,0x74,0x43,0xa2,0xa5,0xb1,0x43,0x08,0xc6,0x50,0x71,0x43,
1450 0x68,0xca,0xb1,0x43,0xab,0xce,0x6f,0x43,0xe7,0x52,0xb1,0x43,0xea,0x98,0x70,0x43,0xd4,0xa2,0xaf,0x43,
1451 0x08,0x9d,0x19,0x71,0x43,0x96,0xd8,0xae,0x43,0x9d,0x19,0x71,0x43,0xec,0x29,0xae,0x43,0xca,0x3f,0x72,
1452 0x43,0xab,0x5f,0xad,0x43,0x08,0xa6,0xf7,0x72,0x43,0xa7,0x70,0xac,0x43,0x09,0x0a,0x73,0x43,0x17,0x38,
1453 0xab,0x43,0x44,0xcd,0x6e,0x43,0x9f,0x86,0xa8,0x43,0x08,0xd4,0xed,0x6b,0x43,0xf8,0xba,0xa6,0x43,0x31,
1454 0x11,0x6b,0x43,0x2a,0xac,0xa2,0x43,0xd9,0xdc,0x6c,0x43,0x14,0x25,0xa4,0x43,0x09,0x01,0x05,0x06,0x66,
1455 0x5d,0x7a,0x43,0x74,0xeb,0xc2,0x43,0x08,0x09,0x22,0x77,0x43,0x50,0xbb,0xc7,0x43,0xe9,0xe0,0x7c,0x43,
1456 0xf5,0x86,0xc9,0x43,0x8f,0x94,0x7a,0x43,0xc5,0x95,0xcd,0x43,0x09,0x06,0x08,0x98,0x80,0x43,0x6b,0x19,
1457 0xc3,0x43,0x08,0xb7,0x35,0x82,0x43,0x79,0xf2,0xc7,0x43,0xf1,0xbe,0x7e,0x43,0x1e,0xbe,0xc9,0x43,0x73,
1458 0x7c,0x80,0x43,0xec,0xcc,0xcd,0x43,0x09,0x06,0x28,0xab,0x7d,0x43,0xae,0xde,0xc6,0x43,0x08,0x1e,0xcd,
1459 0x7b,0x43,0x8a,0xa2,0xc9,0x43,0x30,0x89,0x7f,0x43,0x5c,0x94,0xcc,0x43,0x28,0xab,0x7d,0x43,0x42,0x2a,
1460 0xcf,0x43,0x09,0x01,0x05,0x06,0x24,0x14,0xe0,0x42,0xf5,0x77,0x97,0x43,0x08,0xf7,0x1d,0xe7,0x42,0x74,
1461 0x00,0x97,0x43,0x4d,0x93,0xec,0x42,0xdb,0xf5,0x95,0x43,0x29,0x4b,0xed,0x42,0xcd,0x34,0x95,0x43,0x09,
1462 0x06,0x29,0x7b,0xf5,0x42,0x6f,0x1d,0x98,0x43,0x08,0xe4,0xf1,0xfb,0x42,0x61,0x5c,0x97,0x43,0xdb,0x7d,
1463 0x01,0x43,0xb2,0xbe,0x95,0x43,0x55,0x23,0x02,0x43,0xe7,0xaa,0x94,0x43,0x09,0x06,0x98,0xdc,0x03,0x43,
1464 0xbe,0x8b,0x98,0x43,0x08,0x66,0xdf,0x05,0x43,0x47,0xe6,0x97,0x43,0xae,0x87,0x08,0x43,0x98,0x48,0x96,
1465 0x43,0x61,0x08,0x09,0x43,0xd6,0x06,0x95,0x43,0x09,0x06,0x31,0x0b,0x0b,0x43,0x8e,0x82,0x98,0x43,0x08,
1466 0xdb,0xc5,0x0d,0x43,0x80,0xc1,0x97,0x43,0xd6,0xee,0x10,0x43,0xa9,0xec,0x95,0x43,0x79,0xcb,0x11,0x43,
1467 0x55,0x8f,0x94,0x43,0x09,0x06,0xd1,0x2f,0x18,0x43,0xdb,0x01,0x98,0x43,0x08,0xad,0xe7,0x18,0x43,0x38,
1468 0x25,0x97,0x43,0x8a,0x9f,0x19,0x43,0x80,0xb5,0x95,0x43,0xd6,0x1e,0x19,0x43,0xe0,0xd8,0x94,0x43,0x09,
1469 0x06,0x9a,0x5b,0x1d,0x43,0x58,0x8a,0x97,0x43,0x08,0x01,0x5d,0x1e,0x43,0xf1,0x88,0x96,0x43,0x2f,0x83,
1470 0x1f,0x43,0x19,0xb4,0x94,0x43,0x19,0xf0,0x1e,0x43,0x6f,0x05,0x94,0x43,0x09,0x06,0x0b,0x53,0x24,0x43,
1471 0xae,0xdb,0x96,0x43,0x08,0x25,0xd5,0x25,0x43,0x50,0xac,0x95,0x43,0x53,0xfb,0x26,0x43,0x8a,0x7b,0x93,
1472 0x43,0x76,0x43,0x26,0x43,0xb7,0x95,0x92,0x43,0x09,0x06,0x76,0x5b,0x2a,0x43,0x47,0xda,0x95,0x43,0x08,
1473 0xf3,0xef,0x2b,0x43,0x10,0xe2,0x94,0x43,0x6d,0x95,0x2c,0x43,0xae,0xc3,0x92,0x43,0x68,0xa6,0x2b,0x43,
1474 0x47,0xc2,0x91,0x43,0x09,0x06,0x36,0xc1,0x31,0x43,0x2c,0x58,0x94,0x43,0x08,0x8c,0x1e,0x33,0x43,0x31,
1475 0x3b,0x93,0x43,0x79,0x7a,0x33,0x43,0xff,0x25,0x91,0x43,0xd9,0x9d,0x32,0x43,0xc1,0x5b,0x90,0x43,0x09,
1476 0x06,0x25,0x35,0x36,0x43,0x31,0x3b,0x93,0x43,0x08,0x3f,0xb7,0x37,0x43,0xc1,0x67,0x92,0x43,0xe0,0x93,
1477 0x38,0x43,0xae,0xb7,0x90,0x43,0x7e,0x81,0x38,0x43,0x0d,0xdb,0x8f,0x43,0x09,0x06,0xb5,0x85,0x3b,0x43,
1478 0xe4,0xaf,0x91,0x43,0x08,0xcf,0x07,0x3d,0x43,0x9d,0x13,0x91,0x43,0xbc,0x63,0x3d,0x43,0x47,0xb6,0x8f,
1479 0x43,0xe5,0x9a,0x3d,0x43,0x74,0xd0,0x8e,0x43,0x09,0x06,0xae,0xc6,0x42,0x43,0xa4,0xd9,0x8e,0x43,0x08,
1480 0xca,0x48,0x44,0x43,0xfa,0x2a,0x8e,0x43,0xa2,0x11,0x44,0x43,0x9d,0xfb,0x8c,0x43,0x55,0x92,0x44,0x43,
1481 0x0d,0xc3,0x8b,0x43,0x09,0x06,0x39,0x10,0xc3,0x43,0x34,0x36,0x96,0x43,0x08,0x92,0x44,0xc1,0x43,0xe4,
1482 0xc7,0x95,0x43,0x6f,0xf0,0xbf,0x43,0x4b,0xbd,0x94,0x43,0x47,0xb9,0xbf,0x43,0x0b,0xf3,0x93,0x43,0x09,
1483 0x06,0x8f,0x49,0xbe,0x43,0xb7,0xad,0x96,0x43,0x08,0x11,0xb5,0xbc,0x43,0x77,0xe3,0x95,0x43,0x9c,0xf2,
1484 0xba,0x43,0xfa,0x4e,0x94,0x43,0xae,0x96,0xba,0x43,0x31,0x3b,0x93,0x43,0x09,0x06,0xdb,0xb0,0xb9,0x43,
1485 0x10,0xee,0x96,0x43,0x08,0x42,0xa6,0xb8,0x43,0xc8,0x51,0x96,0x43,0x50,0x5b,0xb7,0x43,0x19,0xb4,0x94,
1486 0x43,0xf7,0x1a,0xb7,0x43,0x58,0x72,0x93,0x43,0x09,0x06,0xf2,0x2b,0xb6,0x43,0x10,0xee,0x96,0x43,0x08,
1487 0x9d,0xce,0xb4,0x43,0x04,0x2d,0x96,0x43,0xed,0x30,0xb3,0x43,0x2c,0x58,0x94,0x43,0xce,0xcb,0xb2,0x43,
1488 0xd6,0xfa,0x92,0x43,0x09,0x06,0x5a,0x09,0xb1,0x43,0x19,0xc0,0x96,0x43,0x08,0x6c,0xad,0xb0,0x43,0x77,
1489 0xe3,0x95,0x43,0x7e,0x51,0xb0,0x43,0xc0,0x73,0x94,0x43,0xd8,0x91,0xb0,0x43,0x1e,0x97,0x93,0x43,0x09,
1490 0x06,0x48,0x4d,0xad,0x43,0xbe,0x7f,0x96,0x43,0x08,0x95,0xcc,0xac,0x43,0x58,0x7e,0x95,0x43,0x4d,0x30,
1491 0xac,0x43,0x80,0xa9,0x93,0x43,0xd8,0x79,0xac,0x43,0xd6,0xfa,0x92,0x43,0x09,0x06,0x90,0xd1,0xa9,0x43,
1492 0x14,0xd1,0x95,0x43,0x08,0x83,0x10,0xa9,0x43,0xb7,0xa1,0x94,0x43,0x3b,0x74,0xa8,0x43,0xf1,0x70,0x92,
1493 0x43,0x29,0xd0,0xa8,0x43,0x1e,0x8b,0x91,0x43,0x09,0x06,0x5a,0xcd,0xa6,0x43,0x8a,0x87,0x95,0x43,0x08,
1494 0x1c,0x03,0xa6,0x43,0x23,0x86,0x94,0x43,0x5f,0xb0,0xa5,0x43,0xc1,0x67,0x92,0x43,0xe1,0x27,0xa6,0x43,
1495 0x8a,0x6f,0x91,0x43,0x09,0x06,0xd4,0x5a,0xa3,0x43,0x2c,0x58,0x94,0x43,0x08,0x29,0xac,0xa2,0x43,0x31,
1496 0x3b,0x93,0x43,0x32,0x7e,0xa2,0x43,0xff,0x25,0x91,0x43,0x83,0xec,0xa2,0x43,0x8e,0x52,0x90,0x43,0x09,
1497 0x06,0xf8,0x96,0xa0,0x43,0x1e,0x97,0x93,0x43,0x08,0xeb,0xd5,0x9f,0x43,0x7b,0xba,0x92,0x43,0x99,0x67,
1498 0x9f,0x43,0x9d,0x13,0x91,0x43,0x99,0x67,0x9f,0x43,0xfa,0x36,0x90,0x43,0x09,0x06,0xeb,0xc9,0x9d,0x43,
1499 0xc8,0x39,0x92,0x43,0x08,0xde,0x08,0x9d,0x43,0xb2,0xa6,0x91,0x43,0xe6,0xda,0x9c,0x43,0x2c,0x40,0x90,
1500 0x43,0x52,0xbf,0x9c,0x43,0x5a,0x5a,0x8f,0x43,0x09,0x06,0x37,0x3d,0x9b,0x43,0x85,0x80,0x90,0x43,0x08,
1501 0x2a,0x7c,0x9a,0x43,0xdb,0xd1,0x8f,0x43,0xf0,0xa0,0x9a,0x43,0x7d,0xa2,0x8e,0x43,0x65,0x57,0x9a,0x43,
1502 0xee,0x69,0x8d,0x43,0x09,0x02,0x04,0x06,0x2a,0xf4,0x2e,0x42,0x04,0x21,0x94,0x43,0x08,0x0d,0x8a,0x31,
1503 0x42,0x9f,0x0e,0x94,0x43,0xf3,0x1f,0x34,0x42,0x3d,0xfc,0x93,0x43,0x63,0xff,0x36,0x42,0xa9,0xe0,0x93,
1504 0x43,0x08,0xb5,0x34,0x5d,0x42,0x0b,0xf3,0x93,0x43,0x6d,0xa4,0x5e,0x42,0x03,0x39,0x98,0x43,0xe7,0x31,
1505 0x5b,0x42,0x93,0x89,0x9d,0x43,0x08,0x02,0x9c,0x58,0x42,0xd4,0x5a,0xa3,0x43,0x38,0x70,0x53,0x42,0x14,
1506 0x49,0xaa,0x43,0xf8,0xed,0x5e,0x42,0x83,0x28,0xad,0x43,0x08,0xea,0x68,0x68,0x42,0x20,0x22,0xaf,0x43,
1507 0x12,0xb8,0x6c,0x42,0xb5,0x49,0xb1,0x43,0x2a,0x4b,0x6d,0x42,0x0d,0x96,0xb3,0x43,0x07,0x2a,0x4b,0x6d,
1508 0x42,0xc6,0x05,0xb5,0x43,0x08,0x87,0x6e,0x6c,0x42,0x68,0xee,0xb7,0x43,0x1c,0x66,0x66,0x42,0x31,0x0e,
1509 0xbb,0x43,0x57,0x11,0x5e,0x42,0x8f,0x49,0xbe,0x43,0x08,0x66,0x96,0x54,0x42,0xb9,0x5c,0xb8,0x43,0x2c,
1510 0x2b,0x3c,0x42,0x68,0xd6,0xb3,0x43,0x2a,0xf4,0x2e,0x42,0x6d,0xad,0xb0,0x43,0x07,0x2a,0xf4,0x2e,0x42,
1511 0x61,0xa4,0xa3,0x43,0x08,0x55,0x1a,0x30,0x42,0xf0,0xd0,0xa2,0x43,0xf8,0xf6,0x30,0x42,0xb2,0x06,0xa2,
1512 0x43,0x98,0xd3,0x31,0x42,0xd6,0x4e,0xa1,0x43,0x08,0x1c,0x6f,0x38,0x42,0x2a,0x94,0x9e,0x43,0xc1,0x22,
1513 0x36,0x42,0xf5,0x9b,0x9d,0x43,0x2a,0xf4,0x2e,0x42,0x6a,0x52,0x9d,0x43,0x07,0x2a,0xf4,0x2e,0x42,0x57,
1514 0xa2,0x9b,0x43,0x08,0xab,0x8f,0x35,0x42,0x8a,0xab,0x9b,0x43,0xe9,0x71,0x3a,0x42,0xb2,0xe2,0x9b,0x43,
1515 0xb7,0x74,0x3c,0x42,0x34,0x5a,0x9c,0x43,0x08,0x23,0x7d,0x42,0x42,0x0b,0x2f,0x9e,0x43,0xe5,0x9a,0x3d,
1516 0x42,0x38,0x6d,0xa3,0x43,0x36,0xd9,0x35,0x42,0xf3,0xd7,0xa7,0x43,0x08,0x12,0x61,0x2e,0x42,0xb0,0x42,
1517 0xac,0x43,0x63,0xff,0x36,0x42,0xdd,0x74,0xaf,0x43,0x1e,0xa6,0x45,0x42,0x44,0x82,0xb2,0x43,0x08,0x74,
1518 0x1b,0x4b,0x42,0x79,0x7a,0xb3,0x43,0x10,0x21,0x4f,0x42,0x2a,0x18,0xb5,0x43,0xdb,0x4c,0x54,0x42,0x91,
1519 0x19,0xb6,0x43,0x08,0xee,0x3f,0x65,0x42,0x5f,0x28,0xba,0x43,0xa7,0xaf,0x66,0x42,0xb9,0x50,0xb6,0x43,
1520 0x14,0x58,0x5c,0x42,0xca,0xdc,0xb1,0x43,0x08,0x2c,0x8b,0x4c,0x42,0x4e,0x30,0xac,0x43,0x19,0xcf,0x48,
1521 0x42,0x2a,0xd0,0xa8,0x43,0xbc,0xab,0x49,0x42,0xa9,0x4c,0xa6,0x43,0x08,0x61,0x5f,0x47,0x42,0xfa,0xa2,
1522 0xa2,0x43,0xa7,0xaf,0x66,0x42,0x85,0x98,0x94,0x43,0x2a,0xf4,0x2e,0x42,0xc3,0x62,0x95,0x43,0x07,0x2a,
1523 0xf4,0x2e,0x42,0x04,0x21,0x94,0x43,0x09,0x06,0xd0,0xfe,0xea,0x41,0x9f,0x0e,0x94,0x43,0x08,0xdc,0xe3,
1524 0xf1,0x41,0xe9,0x9e,0x92,0x43,0xd2,0xe7,0x0b,0x42,0xd6,0x06,0x95,0x43,0x2a,0xf4,0x2e,0x42,0x04,0x21,
1525 0x94,0x43,0x07,0x2a,0xf4,0x2e,0x42,0xc3,0x62,0x95,0x43,0x08,0x87,0x17,0x2e,0x42,0xc3,0x62,0x95,0x43,
1526 0xe7,0x3a,0x2d,0x42,0xf5,0x6b,0x95,0x43,0x44,0x5e,0x2c,0x42,0xf5,0x6b,0x95,0x43,0x08,0xd1,0x47,0x1c,
1527 0x42,0x19,0xc0,0x96,0x43,0x66,0xdf,0x05,0x42,0x38,0x19,0x95,0x43,0x12,0x6a,0x00,0x42,0xb2,0xbe,0x95,
1528 0x43,0x08,0xbb,0x6b,0xea,0x41,0xd6,0x12,0x97,0x43,0x2d,0x82,0xfa,0x41,0x61,0x74,0x9b,0x43,0x7e,0x72,
1529 0x06,0x42,0x8a,0xab,0x9b,0x43,0x08,0xc8,0x39,0x12,0x42,0x4e,0xd0,0x9b,0x43,0x53,0xe3,0x22,0x42,0xc3,
1530 0x86,0x9b,0x43,0x2a,0xf4,0x2e,0x42,0x57,0xa2,0x9b,0x43,0x07,0x2a,0xf4,0x2e,0x42,0x6a,0x52,0x9d,0x43,
1531 0x08,0x01,0xa5,0x2a,0x42,0xa4,0x2d,0x9d,0x43,0x96,0x9c,0x24,0x42,0x06,0x40,0x9d,0x43,0x8a,0xb7,0x1d,
1532 0x42,0x9a,0x5b,0x9d,0x43,0x08,0x6b,0x16,0x13,0x42,0xcd,0x64,0x9d,0x43,0x42,0xc7,0x0e,0x42,0x9a,0x5b,
1533 0x9d,0x43,0x23,0x26,0x04,0x42,0xcd,0x64,0x9d,0x43,0x08,0xe6,0x91,0xeb,0x41,0x38,0x49,0x9d,0x43,0x73,
1534 0x7b,0xdb,0x41,0xf5,0x83,0x99,0x43,0x7f,0x60,0xe2,0x41,0x0b,0x0b,0x98,0x43,0x08,0x7f,0x60,0xe2,0x41,
1535 0xec,0x99,0x95,0x43,0xe3,0x5a,0xde,0x41,0xbe,0x7f,0x96,0x43,0xd0,0xfe,0xea,0x41,0x9f,0x0e,0x94,0x43,
1536 0x07,0xd0,0xfe,0xea,0x41,0x9f,0x0e,0x94,0x43,0x09,0x06,0x2a,0xf4,0x2e,0x42,0x6d,0xad,0xb0,0x43,0x08,
1537 0xd4,0x7e,0x29,0x42,0xab,0x6b,0xaf,0x43,0x4e,0x0c,0x26,0x42,0x44,0x6a,0xae,0x43,0x38,0x79,0x25,0x42,
1538 0xd4,0x96,0xad,0x43,0x08,0x25,0xbd,0x21,0x42,0xe2,0x4b,0xac,0x43,0x49,0x35,0x29,0x42,0x9a,0x97,0xa7,
1539 0x43,0x2a,0xf4,0x2e,0x42,0x61,0xa4,0xa3,0x43,0x07,0x2a,0xf4,0x2e,0x42,0x6d,0xad,0xb0,0x43,0x09,0x06,
1540 0x1d,0xe5,0x7f,0x43,0x87,0x4a,0xe6,0x43,0x08,0x86,0x20,0x80,0x43,0x57,0x41,0xe6,0x43,0x7d,0x4e,0x80,
1541 0x43,0x25,0x38,0xe6,0x43,0xa5,0x85,0x80,0x43,0xf3,0x2e,0xe6,0x43,0x08,0x35,0xca,0x83,0x43,0xd4,0xc9,
1542 0xe5,0x43,0x9c,0xd7,0x86,0x43,0x44,0x91,0xe4,0x43,0xd5,0xca,0x8a,0x43,0x91,0x1c,0xe6,0x43,0x08,0x53,
1543 0x5f,0x8c,0x43,0xf8,0x1d,0xe7,0x43,0x2f,0x17,0x8d,0x43,0x4e,0x7b,0xe8,0x43,0x92,0x29,0x8d,0x43,0x2f,
1544 0x22,0xea,0x43,0x07,0x92,0x29,0x8d,0x43,0x44,0xb5,0xea,0x43,0x08,0xfe,0x0d,0x8d,0x43,0x2a,0x4b,0xed,
1545 0x43,0xe3,0x8b,0x8b,0x43,0x55,0x7d,0xf0,0x43,0xec,0x51,0x89,0x43,0x72,0x0b,0xf4,0x43,0x08,0xcd,0xd4,
1546 0x84,0x43,0x9d,0x55,0xfb,0x43,0xc9,0xe5,0x83,0x43,0x74,0x1e,0xfb,0x43,0x73,0x94,0x84,0x43,0x5a,0x90,
1547 0xf7,0x43,0x08,0xe8,0x62,0x88,0x43,0xfd,0x30,0xee,0x43,0x39,0xc5,0x86,0x43,0xdd,0xbf,0xeb,0x43,0x35,
1548 0xbe,0x81,0x43,0x40,0xde,0xed,0x43,0x08,0x4f,0x34,0x81,0x43,0x36,0x0c,0xee,0x43,0x08,0x98,0x80,0x43,
1549 0xfd,0x30,0xee,0x43,0x1d,0xe5,0x7f,0x43,0x91,0x4c,0xee,0x43,0x07,0x1d,0xe5,0x7f,0x43,0x91,0x40,0xec,
1550 0x43,0x08,0x35,0xbe,0x81,0x43,0x06,0xf7,0xeb,0x43,0x15,0x65,0x83,0x43,0x49,0xa4,0xeb,0x43,0x1e,0x43,
1551 0x85,0x43,0xbe,0x5a,0xeb,0x43,0x08,0xae,0x93,0x8a,0x43,0xfd,0x18,0xea,0x43,0x42,0x97,0x86,0x43,0x5f,
1552 0x67,0xf4,0x43,0xa9,0x98,0x87,0x43,0xd4,0x1d,0xf4,0x43,0x08,0x5c,0x25,0x8a,0x43,0xcf,0x16,0xef,0x43,
1553 0x46,0xaa,0x8d,0x43,0x5a,0x3c,0xe9,0x43,0x19,0x6c,0x88,0x43,0x53,0x5e,0xe7,0x43,0x08,0xc4,0x02,0x85,
1554 0x43,0x96,0x0b,0xe7,0x43,0x85,0x2c,0x82,0x43,0x83,0x67,0xe7,0x43,0x1d,0xe5,0x7f,0x43,0x72,0xc3,0xe7,
1555 0x43,0x07,0x1d,0xe5,0x7f,0x43,0x87,0x4a,0xe6,0x43,0x09,0x06,0xfd,0x24,0x6c,0x43,0xd9,0x94,0xe0,0x43,
1556 0x08,0xfa,0x6c,0x78,0x43,0xd1,0xc2,0xe0,0x43,0x25,0x5c,0x6c,0x43,0x25,0x44,0xe8,0x43,0x1d,0xe5,0x7f,
1557 0x43,0x87,0x4a,0xe6,0x43,0x07,0x1d,0xe5,0x7f,0x43,0x72,0xc3,0xe7,0x43,0x08,0xa6,0x27,0x7b,0x43,0x91,
1558 0x28,0xe8,0x43,0xbc,0xa2,0x77,0x43,0xb0,0x8d,0xe8,0x43,0xc6,0x68,0x75,0x43,0x57,0x4d,0xe8,0x43,0x08,
1559 0xe0,0xd2,0x72,0x43,0xab,0x9e,0xe7,0x43,0x50,0x9a,0x71,0x43,0x2a,0x27,0xe7,0x43,0xea,0x98,0x70,0x43,
1560 0x57,0x35,0xe4,0x43,0x08,0x94,0x3b,0x6f,0x43,0x14,0x7c,0xe2,0x43,0xff,0x13,0x6d,0x43,0x06,0xbb,0xe1,
1561 0x43,0xcf,0xfe,0x6a,0x43,0x06,0xbb,0xe1,0x43,0x08,0x44,0x9d,0x66,0x43,0x77,0x8e,0xe2,0x43,0x3b,0xef,
1562 0x6c,0x43,0x91,0x10,0xe4,0x43,0xfd,0x24,0x6c,0x43,0xb0,0x81,0xe6,0x43,0x08,0x96,0x23,0x6b,0x43,0xee,
1563 0x57,0xe9,0x43,0xca,0x0f,0x6a,0x43,0x5f,0x37,0xec,0x43,0x55,0x71,0x6e,0x43,0x9f,0x01,0xed,0x43,0x08,
1564 0xdb,0xfb,0x75,0x43,0x3b,0xef,0xec,0x43,0x09,0x3a,0x7b,0x43,0xb0,0xa5,0xec,0x43,0x1d,0xe5,0x7f,0x43,
1565 0x91,0x40,0xec,0x43,0x07,0x1d,0xe5,0x7f,0x43,0x91,0x4c,0xee,0x43,0x08,0xa9,0x16,0x7c,0x43,0xb0,0xb1,
1566 0xee,0x43,0x47,0xec,0x77,0x43,0xd9,0xe8,0xee,0x43,0x1e,0x9d,0x73,0x43,0xcf,0x16,0xef,0x43,0x08,0x0e,
1567 0xc9,0x6b,0x43,0xee,0x7b,0xef,0x43,0x7e,0x90,0x6a,0x43,0xfd,0x30,0xee,0x43,0x01,0xfc,0x68,0x43,0x4e,
1568 0x93,0xec,0x43,0x08,0x31,0xf9,0x66,0x43,0x4e,0x87,0xea,0x43,0x31,0x11,0x6b,0x43,0xd4,0xd5,0xe7,0x43,
1569 0xd9,0xc4,0x68,0x43,0xd4,0xc9,0xe5,0x43,0x08,0xe5,0x79,0x67,0x43,0x77,0x9a,0xe4,0x43,0x44,0x9d,0x66,
1570 0x43,0xab,0x86,0xe3,0x43,0x7e,0x78,0x66,0x43,0x0b,0xaa,0xe2,0x43,0x07,0x7e,0x78,0x66,0x43,0x57,0x29,
1571 0xe2,0x43,0x08,0xa7,0xaf,0x66,0x43,0xbe,0x1e,0xe1,0x43,0x87,0x56,0x68,0x43,0x77,0x82,0xe0,0x43,0xfd,
1572 0x24,0x6c,0x43,0xd9,0x94,0xe0,0x43,0x09,0x06,0xc4,0x41,0xbf,0x43,0x85,0xc0,0x72,0x42,0x08,0x73,0xdf,
1573 0xc0,0x43,0xf4,0x76,0x72,0x42,0x97,0x33,0xc2,0x43,0x85,0xc0,0x72,0x42,0xb2,0xb5,0xc3,0x43,0x64,0x56,
1574 0x75,0x42,0x08,0x03,0x24,0xc4,0x43,0x5e,0x7f,0x78,0x42,0xfa,0x51,0xc4,0x43,0x01,0x85,0x7c,0x42,0x5c,
1575 0x64,0xc4,0x43,0xa0,0xb3,0x80,0x42,0x07,0x5c,0x64,0xc4,0x43,0x10,0x93,0x83,0x42,0x08,0xc8,0x48,0xc4,
1576 0x43,0x1c,0x78,0x8a,0x42,0x27,0x6c,0xc3,0x43,0xaf,0xcf,0x94,0x42,0x23,0x7d,0xc2,0x43,0x99,0x9c,0xa4,
1577 0x42,0x08,0x3d,0xe7,0xbf,0x43,0xfb,0xfd,0xb5,0x42,0xb3,0x9d,0xbf,0x43,0x88,0x17,0xae,0x42,0xc4,0x41,
1578 0xbf,0x43,0x69,0x76,0xa3,0x42,0x07,0xc4,0x41,0xbf,0x43,0xac,0xc8,0x8f,0x42,0x08,0x4f,0x8b,0xbf,0x43,
1579 0xed,0x81,0x91,0x42,0xe4,0xa6,0xbf,0x43,0x5d,0x61,0x94,0x42,0xfa,0x39,0xc0,0x43,0x3b,0x49,0x9d,0x42,
1580 0x08,0x2b,0x43,0xc0,0x43,0x28,0xed,0xa9,0x42,0x61,0x3b,0xc1,0x43,0x00,0x9e,0xa5,0x42,0xe4,0xb2,0xc1,
1581 0x43,0x5d,0x91,0x9c,0x42,0x08,0x78,0xce,0xc1,0x43,0xfd,0x36,0x90,0x42,0x22,0x89,0xc4,0x43,0x81,0x72,
1582 0x86,0x42,0xae,0xc6,0xc2,0x43,0xa0,0xb3,0x80,0x42,0x08,0x54,0x86,0xc2,0x43,0x58,0xd1,0x7e,0x42,0x30,
1583 0x32,0xc1,0x43,0xce,0x5e,0x7b,0x42,0xc4,0x41,0xbf,0x43,0xe8,0xf1,0x7b,0x42,0x07,0xc4,0x41,0xbf,0x43,
1584 0x85,0xc0,0x72,0x42,0x09,0x06,0xf6,0x32,0xbb,0x43,0x40,0xa7,0x60,0x42,0x08,0x35,0xfd,0xbb,0x43,0xa4,
1585 0xa1,0x5c,0x42,0x5e,0x34,0xbc,0x43,0x9d,0x2a,0x70,0x42,0x5e,0x40,0xbe,0x43,0x0e,0x0a,0x73,0x42,0x08,
1586 0x4c,0x9c,0xbe,0x43,0x0e,0x0a,0x73,0x42,0x08,0xef,0xbe,0x43,0x0e,0x0a,0x73,0x42,0xc4,0x41,0xbf,0x43,
1587 0x85,0xc0,0x72,0x42,0x07,0xc4,0x41,0xbf,0x43,0xe8,0xf1,0x7b,0x42,0x08,0xcd,0x13,0xbf,0x43,0xe8,0xf1,
1588 0x7b,0x42,0xd6,0xe5,0xbe,0x43,0x71,0x3b,0x7c,0x42,0xdf,0xb7,0xbe,0x43,0x71,0x3b,0x7c,0x42,0x08,0x08,
1589 0xe3,0xbc,0x43,0xa4,0x61,0x7d,0x42,0x28,0x3c,0xbb,0x43,0x91,0x45,0x69,0x42,0x28,0x3c,0xbb,0x43,0x58,
1590 0x71,0x6e,0x42,0x08,0xce,0xfb,0xba,0x43,0xd5,0x35,0x78,0x42,0x59,0x45,0xbb,0x43,0x58,0x23,0x82,0x42,
1591 0xa1,0xe1,0xbb,0x43,0xd7,0xbe,0x88,0x42,0x08,0xc9,0x18,0xbc,0x43,0xaf,0x9f,0x8c,0x42,0x1e,0x76,0xbd,
1592 0x43,0x51,0x7c,0x8d,0x42,0xd6,0xe5,0xbe,0x43,0xf4,0x58,0x8e,0x42,0x08,0x9c,0x0a,0xbf,0x43,0x45,0xc7,
1593 0x8e,0x42,0x30,0x26,0xbf,0x43,0x96,0x35,0x8f,0x42,0xc4,0x41,0xbf,0x43,0xac,0xc8,0x8f,0x42,0x07,0xc4,
1594 0x41,0xbf,0x43,0x69,0x76,0xa3,0x42,0x08,0x08,0xef,0xbe,0x43,0xb1,0xd6,0x99,0x42,0xe8,0x89,0xbe,0x43,
1595 0xde,0xc5,0x8d,0x42,0xc0,0x46,0xbc,0x43,0xc2,0x5b,0x90,0x42,0x08,0x9c,0xf2,0xba,0x43,0x86,0x80,0x90,
1596 0x42,0xf2,0x43,0xba,0x43,0xe8,0x73,0x87,0x42,0x8f,0x31,0xba,0x43,0xb6,0xf4,0x7d,0x42,0x07,0x8f,0x31,
1597 0xba,0x43,0x21,0xc6,0x76,0x42,0x08,0xc0,0x3a,0xba,0x43,0x5f,0x48,0x6b,0x42,0xae,0x96,0xba,0x43,0xe3,
1598 0x83,0x61,0x42,0xf6,0x32,0xbb,0x43,0x40,0xa7,0x60,0x42,0x09,0x06,0xea,0x74,0xea,0x43,0x61,0x44,0x93,
1599 0x43,0x08,0x24,0x5c,0xec,0x43,0x31,0x3b,0x93,0x43,0xfb,0x30,0xee,0x43,0x93,0x4d,0x93,0x43,0x0d,0xe1,
1600 0xef,0x43,0x80,0xa9,0x93,0x43,0x08,0x8f,0x58,0xf0,0x43,0xd1,0x17,0x94,0x43,0xb7,0x8f,0xf0,0x43,0x10,
1601 0xe2,0x94,0x43,0xea,0x98,0xf0,0x43,0xa9,0xec,0x95,0x43,0x07,0xea,0x98,0xf0,0x43,0x38,0x25,0x97,0x43,
1602 0x08,0x23,0x74,0xf0,0x43,0x9f,0x32,0x9a,0x43,0x5a,0x60,0xef,0x43,0x53,0xcb,0x9e,0x43,0x2d,0x3a,0xee,
1603 0x43,0xfd,0x91,0xa3,0x43,0x08,0xa2,0xf0,0xed,0x43,0xdd,0x38,0xa5,0x43,0x17,0xa7,0xed,0x43,0xbe,0xdf,
1604 0xa6,0x43,0x5a,0x54,0xed,0x43,0x9f,0x86,0xa8,0x43,0x08,0xfc,0x24,0xec,0x43,0xca,0xc4,0xad,0x43,0x48,
1605 0xa4,0xeb,0x43,0x40,0x6f,0xab,0x43,0x28,0x3f,0xeb,0x43,0x1c,0x0f,0xa8,0x43,0x08,0x1f,0x6d,0xeb,0x43,
1606 0x72,0x48,0xa3,0x43,0x67,0x09,0xec,0x43,0xd1,0x53,0x9e,0x43,0xea,0x74,0xea,0x43,0x1e,0xc7,0x9b,0x43,
1607 0x07,0xea,0x74,0xea,0x43,0x8a,0x9f,0x99,0x43,0x08,0x7e,0x90,0xea,0x43,0x8a,0x9f,0x99,0x43,0x12,0xac,
1608 0xea,0x43,0xbc,0xa8,0x99,0x43,0xa7,0xc7,0xea,0x43,0xbc,0xa8,0x99,0x43,0x08,0x51,0x76,0xeb,0x43,0x9f,
1609 0x32,0x9a,0x43,0x5e,0x37,0xec,0x43,0x49,0xed,0x9c,0x43,0xb0,0xa5,0xec,0x43,0x2a,0xa0,0xa0,0x43,0x08,
1610 0x09,0xe6,0xec,0x43,0xd1,0x77,0xa4,0x43,0x28,0x4b,0xed,0x43,0x61,0xa4,0xa3,0x43,0xab,0xc2,0xed,0x43,
1611 0x8e,0xb2,0xa0,0x43,0x08,0x70,0xe7,0xed,0x43,0xde,0x08,0x9d,0x43,0x87,0x86,0xf0,0x43,0x2f,0x53,0x97,
1612 0x43,0x87,0x7a,0xee,0x43,0xec,0x99,0x95,0x43,0x08,0xca,0x27,0xee,0x43,0xff,0x3d,0x95,0x43,0x74,0xca,
1613 0xec,0x43,0x55,0x8f,0x94,0x43,0xea,0x74,0xea,0x43,0xe7,0xaa,0x94,0x43,0x07,0xea,0x74,0xea,0x43,0x61,
1614 0x44,0x93,0x43,0x09,0x06,0x05,0xd3,0xe5,0x43,0x19,0x9c,0x90,0x43,0x08,0x09,0xc2,0xe6,0x43,0xd1,0xff,
1615 0x8f,0x43,0x4d,0x6f,0xe6,0x43,0x74,0xe8,0x92,0x43,0x3b,0xd7,0xe8,0x43,0xc3,0x56,0x93,0x43,0x08,0x1f,
1616 0x61,0xe9,0x43,0x93,0x4d,0x93,0x43,0x05,0xeb,0xe9,0x43,0x93,0x4d,0x93,0x43,0xea,0x74,0xea,0x43,0x61,
1617 0x44,0x93,0x43,0x07,0xea,0x74,0xea,0x43,0xe7,0xaa,0x94,0x43,0x08,0x24,0x50,0xea,0x43,0xe7,0xaa,0x94,
1618 0x43,0x2d,0x22,0xea,0x43,0xe7,0xaa,0x94,0x43,0x36,0xf4,0xe9,0x43,0xe7,0xaa,0x94,0x43,0x08,0xa2,0xcc,
1619 0xe7,0x43,0xe0,0xd8,0x94,0x43,0xd4,0xc9,0xe5,0x43,0x19,0xa8,0x92,0x43,0xd4,0xc9,0xe5,0x43,0x27,0x69,
1620 0x93,0x43,0x08,0x17,0x77,0xe5,0x43,0xe0,0xd8,0x94,0x43,0x67,0xe5,0xe5,0x43,0x47,0xda,0x95,0x43,0x43,
1621 0x9d,0xe6,0x43,0xe2,0xd3,0x97,0x43,0x08,0x9d,0xdd,0xe6,0x43,0xad,0xe7,0x98,0x43,0x09,0xce,0xe8,0x43,
1622 0xff,0x55,0x99,0x43,0xea,0x74,0xea,0x43,0x8a,0x9f,0x99,0x43,0x07,0xea,0x74,0xea,0x43,0x1e,0xc7,0x9b,
1623 0x43,0x08,0x71,0xcf,0xe9,0x43,0x53,0xb3,0x9a,0x43,0xa7,0xbb,0xe8,0x43,0xdb,0x0d,0x9a,0x43,0xc6,0x14,
1624 0xe7,0x43,0xdb,0x0d,0x9a,0x43,0x08,0x48,0x80,0xe5,0x43,0xdb,0x0d,0x9a,0x43,0x0a,0xb6,0xe4,0x43,0xc3,
1625 0x6e,0x97,0x43,0x76,0x9a,0xe4,0x43,0x74,0xf4,0x94,0x43,0x07,0x76,0x9a,0xe4,0x43,0x79,0xd7,0x93,0x43,
1626 0x08,0xd8,0xac,0xe4,0x43,0x66,0x27,0x92,0x43,0x29,0x1b,0xe5,0x43,0xe0,0xc0,0x90,0x43,0x05,0xd3,0xe5,
1627 0x43,0x19,0x9c,0x90,0x43,0x09,0x06,0x1b,0x66,0xe6,0x42,0xe3,0xa3,0x8f,0x42,0x08,0x71,0x0b,0xf4,0x42,
1628 0x00,0x0e,0x8d,0x42,0x8c,0x0f,0x01,0x43,0x3e,0xc0,0x89,0x42,0xf3,0x28,0x06,0x43,0x48,0x9e,0x8b,0x42,
1629 0x08,0x15,0x89,0x09,0x43,0x00,0x0e,0x8d,0x42,0xe0,0x9c,0x0a,0x43,0xc1,0x8b,0x98,0x42,0xa6,0xc1,0x0a,
1630 0x43,0x02,0xa5,0xaa,0x42,0x07,0xa6,0xc1,0x0a,0x43,0xf9,0xf6,0xb0,0x42,0x08,0xa6,0xc1,0x0a,0x43,0x47,
1631 0x8e,0xb4,0x42,0x42,0xaf,0x0a,0x43,0x1f,0x6f,0xb8,0x42,0xe0,0x9c,0x0a,0x43,0xba,0x74,0xbc,0x42,0x08,
1632 0xa1,0xd2,0x09,0x43,0x40,0x47,0xd0,0x42,0x0d,0xab,0x07,0x43,0x91,0xb5,0xd0,0x42,0x3b,0xb9,0x04,0x43,
1633 0xec,0x71,0xba,0x42,0x08,0xe5,0x5b,0x03,0x43,0xe3,0x33,0xa8,0x42,0x63,0xd8,0x00,0x43,0xce,0x70,0x9f,
1634 0x42,0x1b,0x66,0xe6,0x42,0xae,0x2f,0xa5,0x42,0x07,0x1b,0x66,0xe6,0x42,0xa2,0x4a,0x9e,0x42,0x08,0xed,
1635 0x6f,0xed,0x42,0x73,0x24,0x9d,0x42,0xd8,0x0c,0xf5,0x42,0x99,0x6c,0x9c,0x42,0x27,0xab,0xfd,0x42,0xea,
1636 0xda,0x9c,0x42,0x08,0x36,0xca,0x03,0x43,0x2b,0x94,0x9e,0x42,0x68,0xc7,0x01,0x43,0x8f,0xbe,0xa2,0x42,
1637 0xfa,0x06,0x08,0x43,0x73,0xb4,0xb5,0x42,0x08,0x8e,0x2e,0x0a,0x43,0x1f,0x6f,0xb8,0x42,0x9d,0xe3,0x08,
1638 0x43,0xd7,0x1e,0x99,0x42,0x28,0x15,0x05,0x43,0x32,0x3b,0x93,0x42,0x08,0x63,0xf0,0x04,0x43,0x70,0xed,
1639 0x8f,0x42,0x71,0x0b,0xf4,0x42,0x32,0x3b,0x93,0x42,0x1b,0x66,0xe6,0x42,0x73,0xf4,0x94,0x42,0x07,0x1b,
1640 0x66,0xe6,0x42,0xe3,0xa3,0x8f,0x42,0x09,0x06,0x5e,0x28,0xba,0x42,0x35,0xe2,0x87,0x42,0x08,0x8e,0x55,
1641 0xc0,0x42,0xb8,0x4d,0x86,0x42,0x60,0xbf,0xd7,0x42,0x3e,0xf0,0x91,0x42,0x63,0xf6,0xe4,0x42,0x70,0xed,
1642 0x8f,0x42,0x08,0x7a,0x89,0xe5,0x42,0xac,0xc8,0x8f,0x42,0xcc,0xf7,0xe5,0x42,0xac,0xc8,0x8f,0x42,0x1b,
1643 0x66,0xe6,0x42,0xe3,0xa3,0x8f,0x42,0x07,0x1b,0x66,0xe6,0x42,0x73,0xf4,0x94,0x42,0x08,0x63,0xf6,0xe4,
1644 0x42,0x3b,0x19,0x95,0x42,0xe6,0x61,0xe3,0x42,0x00,0x3e,0x95,0x42,0xf4,0x16,0xe2,0x42,0xc4,0x62,0x95,
1645 0x42,0x08,0x6e,0x74,0xd6,0x42,0x15,0xd1,0x95,0x42,0x97,0x63,0xca,0x42,0xaf,0xcf,0x94,0x42,0xfb,0x2d,
1646 0xbe,0x42,0x86,0x80,0x90,0x42,0x08,0x97,0x03,0xba,0x42,0xce,0x10,0x8f,0x42,0x5e,0x28,0xba,0x42,0x3e,
1647 0xf0,0x91,0x42,0xf2,0x4f,0xbc,0x42,0x45,0xf7,0x96,0x42,0x08,0x27,0x54,0xbf,0x42,0x73,0x24,0x9d,0x42,
1648 0xa5,0xe8,0xc0,0x42,0x86,0xe0,0xa0,0x42,0xe4,0xca,0xc5,0x42,0xed,0x11,0xaa,0x42,0x08,0x54,0xaa,0xc8,
1649 0x42,0x86,0x40,0xb1,0x42,0x59,0x81,0xc5,0x42,0xa1,0x11,0xc4,0x42,0x3e,0xe7,0xbf,0x42,0xfb,0x8d,0xce,
1650 0x42,0x08,0xb4,0x6d,0xb7,0x42,0x30,0xc2,0xd9,0x42,0x46,0xf5,0xc9,0x42,0xdf,0x53,0xd9,0x42,0x38,0x40,
1651 0xcb,0x42,0x62,0x8f,0xcf,0x42,0x08,0x7d,0xf9,0xcc,0x42,0xec,0xa1,0xc2,0x42,0x07,0x43,0xcd,0x42,0x6c,
1652 0xdd,0xb8,0x42,0x2b,0x8b,0xcc,0x42,0x92,0xf5,0xaf,0x42,0x08,0xf9,0x8d,0xce,0x42,0x41,0x57,0xa7,0x42,
1653 0x5b,0xb8,0xd2,0x42,0xae,0x2f,0xa5,0x42,0x18,0x2f,0xd9,0x42,0x13,0x2a,0xa1,0x42,0x08,0x41,0x7e,0xdd,
1654 0x42,0xe3,0x03,0xa0,0x42,0x2e,0xf2,0xe1,0x42,0x7c,0x02,0x9f,0x42,0x1b,0x66,0xe6,0x42,0xa2,0x4a,0x9e,
1655 0x42,0x07,0x1b,0x66,0xe6,0x42,0xae,0x2f,0xa5,0x42,0x08,0x4d,0x63,0xe4,0x42,0x00,0x9e,0xa5,0x42,0xf4,
1656 0x16,0xe2,0x42,0x15,0x31,0xa6,0x42,0x99,0xca,0xdf,0x42,0x2b,0xc4,0xa6,0x42,0x08,0xc0,0x82,0xc6,0x42,
1657 0xc4,0xc2,0xa5,0x42,0x57,0xe1,0xd5,0x42,0x91,0xb5,0xd0,0x42,0x54,0xda,0xd0,0x42,0x97,0x93,0xd2,0x42,
1658 0x08,0x9c,0x3a,0xc7,0x42,0x17,0x58,0xdc,0x42,0x9c,0x0a,0xbf,0x42,0x6e,0xa4,0xde,0x42,0x90,0x25,0xb8,
1659 0x42,0xdf,0x53,0xd9,0x42,0x08,0x59,0x21,0xb5,0x42,0xf2,0xdf,0xd4,0x42,0x51,0x43,0xb3,0x42,0x91,0xb5,
1660 0xd0,0x42,0xc5,0x29,0xbb,0x42,0x0e,0x1a,0xca,0x42,0x08,0x65,0x36,0xc4,0x42,0xd0,0x07,0xbd,0x42,0x3e,
1661 0xe7,0xbf,0x42,0x37,0x09,0xbe,0x42,0x0c,0xea,0xc1,0x42,0xcd,0xd0,0xaf,0x42,0x08,0x2b,0x5b,0xc4,0x42,
1662 0x18,0x08,0xa3,0x42,0x67,0xa6,0xab,0x42,0x99,0x3c,0x94,0x42,0x5e,0x28,0xba,0x42,0x35,0xe2,0x87,0x42,
1663 0x09,];