From f350f3bd13f97bc8e907452d502571b162a8c0de Mon Sep 17 00:00:00 2001 From: Walter Fetter Lages Date: Tue, 22 May 2018 15:39:46 -0300 Subject: [PATCH] Add ICSP interface. Updated to use FreeRTOSV7.4.2. Minor changes in Makefiles. Included ISCP interface. --- Changes | 6 + DaemonRTOS/Makefile | 4 +- DaemonRTOS/TODO | 4293 -------------- FreeRTOS1/croutine.c | 352 -- FreeRTOS1/include/FreeRTOS.h | 148 - FreeRTOS1/include/croutine.h | 730 --- FreeRTOS1/include/list.h | 294 - FreeRTOS1/include/portable.h | 271 - FreeRTOS1/include/projdefs.h | 66 - FreeRTOS1/include/queue.h | 1222 ---- FreeRTOS1/include/semphr.h | 698 --- FreeRTOS1/include/task.h | 995 ---- FreeRTOS1/list.c | 211 - FreeRTOS1/portable/AIC-2.0.0/port.c | 325 -- FreeRTOS1/portable/AIC-2.0.0/portmacro.h | 119 - FreeRTOS1/portable/MemMang/heap_1.c | 147 - FreeRTOS1/portable/MemMang/heap_2.c | 251 - FreeRTOS1/portable/MemMang/heap_3.c | 89 - FreeRTOS1/portable/readme.txt | 19 - FreeRTOS1/queue.c | 1322 ----- FreeRTOS1/readme.txt | 15 - FreeRTOS1/tasks.c | 2046 ------- Makefile | 3 +- TODO | 1 - c~ | 286 + doc/aic-0.5080.drill.gcode | 83 + doc/aic-0.7112.drill.gcode | 149 + doc/aic-0.7620.drill.gcode | 121 + doc/aic-0.8890.drill.gcode | 142 + doc/aic-bottom.gcode | 8980 ++++++++++++++++++++++++++++++ doc/aic-bottom.gcode.png | Bin 0 -> 69487 bytes doc/aic-drillmill.gcode | 392 ++ doc/aic-outline.gcode | 23 + doc/aic.bottom.gbr | 1685 ++++++ doc/aic.bottommask.gbr | 755 +++ doc/aic.bottompaste.gbr | 13 + doc/aic.bottomsilk.gbr | 17 + doc/aic.fab.gbr | 7511 +++++++++++++------------ doc/aic.nelma.bottom.png | Bin 0 -> 6769 bytes doc/aic.nelma.em | 5725 +++++++++++++++++++ doc/aic.nelma.top.png | Bin 0 -> 6580 bytes doc/aic.plated-drill.cnc | 1026 ++-- doc/aic.top.gbr | 1638 ++++++ doc/aic.topmask.gbr | 755 +++ doc/aic.toppaste.gbr | 13 + doc/aic.topsilk.gbr | 1647 ++++++ doc/aic.xy | 9 + doc/aicpic.pdf | Bin 15414 -> 16226 bytes doc/aicpic.sch | 86 +- doc/attribs | 4 + lib/Makefile | 2 +- test/README | 21 + test/braketest/Makefile | 5 +- test/braketest/braketest.c | 2 +- test/dsPICAICtest/Makefile | 5 +- test/dsPICAICtest/dspicaictest.c | 1 + test/dsPICtest/Makefile | 5 +- test/dsPICtest/dspictest.c | 4 +- test/encodertest/Makefile | 5 +- test/encodertest/encodertest.c | 3 +- test/freertosAICtest/FreeRTOSConfig.h | 4 +- test/freertosAICtest/Makefile | 13 +- test/freertosAICtest/freertosAICtest.c | 97 +- test/freertostest/Makefile | 9 +- test/freertostest/freertostest.c | 11 +- test/motortest/Makefile | 5 +- test/pwmtest/Makefile | 5 +- test/serialtest/Makefile | 5 +- test/serialtest/serialtest.c | 31 +- 69 files changed, 27026 insertions(+), 17894 deletions(-) delete mode 100644 DaemonRTOS/TODO delete mode 100644 FreeRTOS1/croutine.c delete mode 100644 FreeRTOS1/include/FreeRTOS.h delete mode 100644 FreeRTOS1/include/croutine.h delete mode 100644 FreeRTOS1/include/list.h delete mode 100644 FreeRTOS1/include/portable.h delete mode 100644 FreeRTOS1/include/projdefs.h delete mode 100644 FreeRTOS1/include/queue.h delete mode 100644 FreeRTOS1/include/semphr.h delete mode 100644 FreeRTOS1/include/task.h delete mode 100644 FreeRTOS1/list.c delete mode 100644 FreeRTOS1/portable/AIC-2.0.0/port.c delete mode 100644 FreeRTOS1/portable/AIC-2.0.0/portmacro.h delete mode 100644 FreeRTOS1/portable/MemMang/heap_1.c delete mode 100644 FreeRTOS1/portable/MemMang/heap_2.c delete mode 100644 FreeRTOS1/portable/MemMang/heap_3.c delete mode 100644 FreeRTOS1/portable/readme.txt delete mode 100644 FreeRTOS1/queue.c delete mode 100644 FreeRTOS1/readme.txt delete mode 100644 FreeRTOS1/tasks.c delete mode 100644 TODO create mode 100644 c~ create mode 100644 doc/aic-0.5080.drill.gcode create mode 100644 doc/aic-0.7112.drill.gcode create mode 100644 doc/aic-0.7620.drill.gcode create mode 100644 doc/aic-0.8890.drill.gcode create mode 100644 doc/aic-bottom.gcode create mode 100644 doc/aic-bottom.gcode.png create mode 100644 doc/aic-drillmill.gcode create mode 100644 doc/aic-outline.gcode create mode 100644 doc/aic.bottom.gbr create mode 100644 doc/aic.bottommask.gbr create mode 100644 doc/aic.bottompaste.gbr create mode 100644 doc/aic.bottomsilk.gbr create mode 100644 doc/aic.nelma.bottom.png create mode 100644 doc/aic.nelma.em create mode 100644 doc/aic.nelma.top.png create mode 100644 doc/aic.top.gbr create mode 100644 doc/aic.topmask.gbr create mode 100644 doc/aic.toppaste.gbr create mode 100644 doc/aic.topsilk.gbr create mode 100644 doc/aic.xy create mode 100644 test/README diff --git a/Changes b/Changes index 83eb549..fa4708d 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,9 @@ +2013.07.17 Started aic-2.4.0. + Updated to use FreeRTOSV7.4.2. + Minor changes in Makefiles. + Included ISCP interface. + + 2012.04.20 Started aic-2.3.0. Reworked source tree. Capacitor involucre sizes made invisible in schematics. diff --git a/DaemonRTOS/Makefile b/DaemonRTOS/Makefile index 6d4c8d8..99efb7b 100644 --- a/DaemonRTOS/Makefile +++ b/DaemonRTOS/Makefile @@ -10,10 +10,10 @@ daemonrtos:daemonrtos.o $(OSOBJS) $(CC) $(CPU) $^ -o $@ $(CCLIBDIR) $(AICLIBDIR) -Wl $(CCGLD) $(AICLIB) daemonrtos.o:daemonrtos.c - $(CC) $(CPU) -x c -c $^ $(CCINCDIR) $(OSINCDIR) $(CCFLAGS) $(OSFLAGS) + $(CC) $(CPU) -c $^ $(CCINCDIR) $(OSINCDIR) $(CCFLAGS) $(OSFLAGS) $(OSOBJS):$(OSFILES) - for i in $(OSFILES); do $(CC) $(CPU) -x c -c $$i $(CCINCDIR) $(OSINCDIR) $(CCFLAGS) $(OSFLAGS) ; done + for i in $(OSFILES); do $(CC) $(CPU) -c $$i $(CCINCDIR) $(OSINCDIR) $(CCFLAGS) $(OSFLAGS) ; done clean: rm -f *.o daemonrtos *~ diff --git a/DaemonRTOS/TODO b/DaemonRTOS/TODO deleted file mode 100644 index c9b6621..0000000 --- a/DaemonRTOS/TODO +++ /dev/null @@ -1,4293 +0,0 @@ - -daemonrtos: file format elf32-pic30 - -Disassembly of section .reset: - -00000000 <.reset>: - 0: 08 01 04 goto 0x108 - 2: 00 00 00 -Disassembly of section .text: - -00000100 <.handle>: - ... - -00000108 <__resetPRI>: - 108: 0f dc 20 mov.w #0xdc0, w15 - 10a: 80 ff 20 mov.w #0xff8, w0 - 10c: 00 01 88 mov.w w0, 0x20 - 10e: 00 00 00 nop - 110: 05 00 07 rcall . + 0xC - 112: 0c 00 07 rcall . + 0x1A - 114: d4 05 02 call 0x5d4 <_main> - 116: 00 00 00 - 118: 00 40 da .pword 0xda4000 - 11a: 00 00 fe reset - -0000011c <__psv_init>: - 11c: 44 40 a9 bclr.b 0x44, #0x2 - 11e: 80 08 20 mov.w #0x88, w0 - 120: 00 00 e0 cp0.w w0 - 122: 03 00 32 bra Z, . + 0x8 - 124: 00 00 20 mov.w #0x0, w0 - 126: a0 01 88 mov.w w0, 0x34 - 128: 44 40 a8 bset.b 0x44, #0x2 - -0000012a : - 12a: 00 00 06 return - -0000012c <__data_init>: - 12c: c0 a8 21 mov.w #0x1a8c, w0 - 12e: 01 00 20 mov.w #0x0, w1 - 130: 16 00 37 bra . + 0x2E - -00000132 : - 132: 62 00 40 add.w w0, #0x2, w0 - 134: e0 80 48 addc.w w1, #0x0, w1 - 136: 91 01 88 mov.w w1, 0x32 - 138: 90 01 ba tblrdl.w [w0], w3 - 13a: 62 00 40 add.w w0, #0x2, w0 - 13c: e0 80 48 addc.w w1, #0x0, w1 - 13e: 91 01 88 mov.w w1, 0x32 - 140: 90 02 ba tblrdl.w [w0], w5 - 142: 62 00 40 add.w w0, #0x2, w0 - 144: e0 80 48 addc.w w1, #0x0, w1 - 146: 00 02 eb clr.w w4 - 148: 60 28 e1 cp.w w5, #0x0 - 14a: 05 00 3a bra NZ, . + 0xC - 14c: 83 01 e9 dec.w w3, w3 - 14e: 07 00 33 bra N, . + 0x10 - 150: 03 80 09 repeat w3 - 152: 00 59 eb clr.b [w2++] - 154: 04 00 37 bra . + 0xA - -00000156 : - 156: 61 28 e1 cp.w w5, #0x1 - 158: 01 00 32 bra Z, . + 0x4 - 15a: 00 82 eb setm.w w4 - -0000015c : - 15c: 05 00 07 rcall . + 0xC - -0000015e : - 15e: 91 01 88 mov.w w1, 0x32 - 160: 10 01 ba tblrdl.w [w0], w2 - 162: 02 00 e0 cp0.w w2 - 164: e6 ff 3a bra NZ, . + 0xFFFFFFCE - 166: 00 00 05 retlw.w #0x0, w0 - -00000168 : - 168: 91 01 88 mov.w w1, 0x32 - 16a: 80 02 78 mov.w w0, w5 - 16c: 62 00 40 add.w w0, #0x2, w0 - 16e: e0 80 48 addc.w w1, #0x0, w1 - 170: 35 59 ba tblrdl.b [w5++], [w2++] - 172: 83 01 e9 dec.w w3, w3 - 174: 08 00 32 bra Z, . + 0x12 - 176: 25 59 ba tblrdl.b [w5--], [w2++] - 178: 83 01 e9 dec.w w3, w3 - 17a: 05 00 32 bra Z, . + 0xC - 17c: 04 00 e0 cp0.w w4 - 17e: f4 ff 32 bra Z, . + 0xFFFFFFEA - 180: 15 d9 ba tblrdh.b [w5], [w2++] - 182: 83 01 e9 dec.w w3, w3 - 184: f1 ff 3a bra NZ, . + 0xFFFFFFE4 - -00000186 : - 186: 00 00 06 return - -00000188 <_memcpy>: - 188: 80 01 78 mov.w w0, w3 - -0000018a <.LM3>: - 18a: 02 00 e0 cp0.w w2 - 18c: 03 00 32 bra Z, . + 0x8 - -0000018e <.L6>: - 18e: b1 59 78 mov.b [w1++], [w3++] - -00000190 <.LM5>: - 190: 02 01 e9 dec.w w2, w2 - 192: fd ff 3a bra NZ, . + 0xFFFFFFFC - -00000194 <.L8>: - 194: 00 00 06 return - -00000196 <_memset>: - 196: 80 01 78 mov.w w0, w3 - -00000198 <.LM3>: - 198: 02 00 e0 cp0.w w2 - 19a: 03 00 32 bra Z, . + 0x8 - -0000019c <.L6>: - 19c: 81 59 78 mov.b w1, [w3++] - -0000019e <.LM5>: - 19e: 02 01 e9 dec.w w2, w2 - 1a0: fd ff 3a bra NZ, . + 0xFFFFFFFC - -000001a2 <.L8>: - 1a2: 00 00 06 return - -000001a4 <_strncpy>: - 1a4: 80 01 78 mov.w w0, w3 - 1a6: 02 00 e0 cp0.w w2 - 1a8: 07 00 32 bra Z, . + 0x10 - 1aa: 11 04 e0 cp0.b [w1] - 1ac: 05 00 32 bra Z, . + 0xC - -000001ae <.L7>: - 1ae: b1 59 78 mov.b [w1++], [w3++] - -000001b0 <.LM4>: - 1b0: 02 01 e9 dec.w w2, w2 - 1b2: 02 00 32 bra Z, . + 0x6 - 1b4: 11 04 e0 cp0.b [w1] - 1b6: fb ff 3a bra NZ, . + 0xFFFFFFF8 - -000001b8 <.L3>: - 1b8: 02 00 e0 cp0.w w2 - 1ba: 03 00 32 bra Z, . + 0x8 - -000001bc <.L12>: - 1bc: 80 59 eb clr.b [w3++] - -000001be <.LM7>: - 1be: 02 01 e9 dec.w w2, w2 - 1c0: fd ff 3a bra NZ, . + 0xFFFFFFFC - -000001c2 <.L15>: - 1c2: 00 00 06 return - -000001c4 <___truncdfsf2>: - 1c4: 14 00 fa lnk #0x14 - 1c6: 88 9f be mov.d w8, [w15++] - 1c8: 8a 9f be mov.d w10, [w15++] - 1ca: 8c 9f be mov.d w12, [w15++] - 1cc: 00 05 be mov.d w0, w10 - 1ce: 02 06 be mov.d w2, w12 - 1d0: 68 00 47 add.w w14, #0x8, w0 - 1d2: 0c 90 be mov.d w12, [w0--] - 1d4: 0a 90 be mov.d w10, [w0--] - 1d6: 5c 01 07 rcall . + 0x2BA - 1d8: 64 00 e1 cp.w w0, #0x4 - 1da: 1a 00 32 bra Z, . + 0x36 - 1dc: 16 00 3e bra GTU, . + 0x2E - 1de: 61 00 e1 cp.w w0, #0x1 - 1e0: 1a 00 32 bra Z, . + 0x36 - 1e2: 6e 04 90 mov.w [w14+12], w8 - 1e4: fe 04 90 mov.w [w14+14], w9 - 1e6: 0e 0b 90 mov.w [w14+16], w6 - 1e8: 9e 0b 90 mov.w [w14+18], w7 - 1ea: 60 11 b8 mul.uu w2, #0x0, w2 - 1ec: 9e 05 90 mov.w [w14+2], w11 - 1ee: 0b 38 b1 sub.w #0x380, w11 - 1f0: d5 01 20 mov.w #0x1d, w5 - -000001f2 : - 1f2: 82 81 71 ior.w w3, w2, w3 - 1f4: 61 01 64 and.w w8, #0x1, w2 - 1f6: 87 03 d1 lsr.w w7, w7 - 1f8: 06 83 d3 rrc.w w6, w6 - 1fa: 89 84 d3 rrc.w w9, w9 - 1fc: 08 84 d3 rrc.w w8, w8 - 1fe: 85 02 e9 dec.w w5, w5 - 200: f8 ff 3a bra NZ, . + 0xFFFFFFF2 - 202: 6d 01 07 rcall . + 0x2DC - -00000204 : - 204: 0d f0 a7 btsc.w w13, #0xf - 206: 01 f0 a0 bset.w w1, #0xf - -00000208 : - 208: a4 01 37 bra . + 0x34A - -0000020a : - 20a: f1 ff 27 mov.w #0x7fff, w1 - 20c: f0 ff 2f mov.w #0xffff, w0 - 20e: a1 01 37 bra . + 0x344 - -00000210 : - 210: 01 f8 27 mov.w #0x7f80, w1 - 212: 00 00 20 mov.w #0x0, w0 - 214: f7 ff 37 bra . + 0xFFFFFFF0 - -00000216 : - 216: 60 00 b8 mul.uu w0, #0x0, w0 - 218: f5 ff 37 bra . + 0xFFFFFFEC - -0000021a <___floatsisf>: - 21a: 88 9f be mov.d w8, [w15++] - 21c: 8a 9f be mov.d w10, [w15++] - 21e: 01 05 78 mov.w w1, w10 - 220: 01 00 e0 cp0.w w1 - 222: 04 00 35 bra LT, . + 0xA - 224: 08 00 3c bra GT, . + 0x12 - 226: 00 00 e0 cp0.w w0 - 228: 20 00 32 bra Z, . + 0x42 - 22a: 05 00 37 bra . + 0xC - -0000022c : - 22c: 60 00 10 subr.w w0, #0x0, w0 - 22e: e0 80 18 subbr.w w1, #0x0, w1 - 230: 02 00 3b bra NN, . + 0x6 - 232: 01 f0 2c mov.w #0xcf00, w1 - 234: 1a 00 37 bra . + 0x36 - -00000236 : - 236: 00 04 be mov.d w0, w8 - 238: 60 11 b8 mul.uu w2, #0x0, w2 - 23a: 6b 09 20 mov.w #0x96, w11 - 23c: 09 82 cf ff1l w9, w4 - 23e: 02 00 39 bra NC, . + 0x6 - 240: 08 82 cf ff1l w8, w4 - 242: 04 41 b0 add.b #0x10, w4 - -00000244 : - 244: 69 42 52 sub.b w4, #0x9, w4 - 246: 0e 00 32 bra Z, . + 0x1E - 248: 08 00 3b bra NN, . + 0x12 - -0000024a : - 24a: 82 81 71 ior.w w3, w2, w3 - 24c: 61 01 64 and.w w8, #0x1, w2 - 24e: 89 04 d1 lsr.w w9, w9 - 250: 08 84 d3 rrc.w w8, w8 - 252: 8b 05 e8 inc.w w11, w11 - 254: 04 42 e8 inc.b w4, w4 - 256: f9 ff 3a bra NZ, . + 0xFFFFFFF4 - 258: 05 00 37 bra . + 0xC - -0000025a : - 25a: 08 04 44 add.w w8, w8, w8 - 25c: 89 84 4c addc.w w9, w9, w9 - 25e: 8b 05 e9 dec.w w11, w11 - 260: 04 42 e9 dec.b w4, w4 - 262: fb ff 3a bra NZ, . + 0xFFFFFFF8 - -00000264 : - 264: 3c 01 07 rcall . + 0x27A - 266: 0a f0 a7 btsc.w w10, #0xf - 268: 01 f0 a0 bset.w w1, #0xf - -0000026a : - 26a: 4f 05 be mov.d [--w15], w10 - 26c: 4f 04 be mov.d [--w15], w8 - 26e: 00 00 06 return - -00000270 <___divsf3>: - 270: 88 9f be mov.d w8, [w15++] - 272: 8a 9f be mov.d w10, [w15++] - 274: 8c 1f 78 mov.w w12, [w15++] - 276: 72 01 07 rcall . + 0x2E6 - 278: 79 01 33 bra N, . + 0x2F4 - 27a: 03 86 6c xor.w w9, w3, w12 - 27c: 64 50 e1 cp.w w10, #0x4 - 27e: 2e 00 32 bra Z, . + 0x5E - 280: 64 20 e1 cp.w w4, #0x4 - 282: 33 00 32 bra Z, . + 0x68 - 284: 61 50 e1 cp.w w10, #0x1 - 286: 2f 00 32 bra Z, . + 0x60 - 288: 61 20 e1 cp.w w4, #0x1 - 28a: 31 00 32 bra Z, . + 0x64 - -0000028c : - 28c: 85 85 55 sub.w w11, w5, w11 - 28e: eb 07 b0 add.w #0x7e, w11 - 290: 09 00 20 mov.w #0x0, w9 - 292: 08 04 20 mov.w #0x40, w8 - 294: 05 00 37 bra . + 0xC - -00000296 : - 296: 08 04 44 add.w w8, w8, w8 - 298: 89 84 4c addc.w w9, w9, w9 - 29a: 0a 00 31 bra C, . + 0x16 - -0000029c : - 29c: 06 03 43 add.w w6, w6, w6 - 29e: 87 83 4b addc.w w7, w7, w7 - -000002a0 : - 2a0: 00 01 53 sub.w w6, w0, w2 - 2a2: 81 81 5b subb.w w7, w1, w3 - 2a4: f8 ff 33 bra N, . + 0xFFFFFFF2 - 2a6: 02 03 be mov.d w2, w6 - 2a8: 08 00 a0 bset.w w8, #0x0 - 2aa: 08 04 44 add.w w8, w8, w8 - 2ac: 89 84 4c addc.w w9, w9, w9 - 2ae: f6 ff 39 bra NC, . + 0xFFFFFFEE - -000002b0 : - 2b0: c6 39 dd sl.w w7, #0x6, w3 - 2b2: 83 01 73 ior.w w6, w3, w3 - 2b4: 01 00 32 bra Z, . + 0x4 - 2b6: 13 00 20 mov.w #0x1, w3 - -000002b8 : - 2b8: 89 04 d1 lsr.w w9, w9 - 2ba: 08 84 d3 rrc.w w8, w8 - 2bc: 09 98 a3 btst.z w9, #0x9 - 2be: 05 00 32 bra Z, . + 0xC - 2c0: 08 00 a7 btsc.w w8, #0x0 - 2c2: 03 00 a0 bset.w w3, #0x0 - 2c4: 89 04 d1 lsr.w w9, w9 - 2c6: 08 84 d3 rrc.w w8, w8 - 2c8: 8b 05 e8 inc.w w11, w11 - -000002ca : - 2ca: 89 04 d1 lsr.w w9, w9 - 2cc: 08 84 d3 rrc.w w8, w8 - 2ce: 00 01 eb clr.w w2 - 2d0: 02 81 d2 rlc.w w2, w2 - 2d2: 05 01 07 rcall . + 0x20C - -000002d4 : - 2d4: 01 f0 a1 bclr.w w1, #0xf - 2d6: 0c f0 a7 btsc.w w12, #0xf - 2d8: 01 f0 a0 bset.w w1, #0xf - 2da: 51 01 37 bra . + 0x2A4 - -000002dc : - 2dc: 64 20 e1 cp.w w4, #0x4 - 2de: 53 01 32 bra Z, . + 0x2A8 - -000002e0 : - 2e0: 08 01 be mov.d w8, w2 - -000002e2 : - 2e2: 02 00 be mov.d w2, w0 - 2e4: f7 ff 37 bra . + 0xFFFFFFF0 - -000002e6 : - 2e6: 61 20 e1 cp.w w4, #0x1 - 2e8: 4e 01 32 bra Z, . + 0x29E - -000002ea : - 2ea: 60 00 b8 mul.uu w0, #0x0, w0 - 2ec: f3 ff 37 bra . + 0xFFFFFFE8 - -000002ee : - 2ee: 00 00 20 mov.w #0x0, w0 - 2f0: 01 f8 27 mov.w #0x7f80, w1 - 2f2: f0 ff 37 bra . + 0xFFFFFFE2 - -000002f4 <___subsf3>: - 2f4: 03 f0 a2 btg.w w3, #0xf - -000002f6 <___addsf3>: - 2f6: 88 9f be mov.d w8, [w15++] - 2f8: 8a 9f be mov.d w10, [w15++] - 2fa: 8c 1f 78 mov.w w12, [w15++] - 2fc: 2f 01 07 rcall . + 0x260 - 2fe: 36 01 33 bra N, . + 0x26E - 300: 64 50 e1 cp.w w10, #0x4 - 302: 4f 00 32 bra Z, . + 0xA0 - -00000304 : - 304: 64 20 e1 cp.w w4, #0x4 - 306: 52 00 32 bra Z, . + 0xA6 - 308: 03 82 6c xor.w w9, w3, w4 - 30a: 07 00 3b bra NN, . + 0x10 - 30c: 09 05 d0 sl.w w9, w10 - 30e: 03 06 d0 sl.w w3, w12 - 310: 82 0f 54 sub.w w8, w2, [w15] - 312: 0c 06 5d subb.w w10, w12, w12 - 314: 02 00 39 bra NC, . + 0x6 - 316: 02 00 32 bra Z, . + 0x6 - 318: 89 01 78 mov.w w9, w3 - -0000031a : - 31a: 03 06 78 mov.w w3, w12 - -0000031c : - 31c: 85 82 55 sub.w w11, w5, w5 - 31e: 04 00 3d bra GE, . + 0xA - 320: 00 03 fd exch w0, w6 - 322: 81 03 fd exch w1, w7 - 324: 85 02 ea neg.w w5, w5 - 326: 8b 85 42 add.w w5, w11, w11 - -00000328 : - 328: 84 0f 72 ior.w w4, w4, [w15] - 32a: 02 00 3b bra NN, . + 0x6 - 32c: 60 00 10 subr.w w0, #0x0, w0 - 32e: e0 80 18 subbr.w w1, #0x0, w1 - -00000330 : - 330: 60 11 b8 mul.uu w2, #0x0, w2 - 332: 00 05 eb clr.w w10 - 334: 7a 28 e1 cp.w w5, #0x1a - 336: 0a 00 39 bra NC, . + 0x16 - 338: 06 00 78 mov.w w6, w0 - 33a: c7 5d dd sl.w w11, #0x7, w11 - 33c: f7 07 b2 and.w #0x7f, w7 - 33e: 87 80 75 ior.w w11, w7, w1 - 340: 2d 00 37 bra . + 0x5C - -00000342 : - 342: 82 81 71 ior.w w3, w2, w3 - 344: 0a 01 78 mov.w w10, w2 - 346: 61 05 60 and.w w0, #0x1, w10 - 348: 81 80 d1 asr.w w1, w1 - 34a: 00 80 d3 rrc.w w0, w0 - -0000034c : - 34c: 85 02 e9 dec.w w5, w5 - 34e: f9 ff 3b bra NN, . + 0xFFFFFFF4 - -00000350 : - 350: 06 04 40 add.w w0, w6, w8 - 352: 87 84 48 addc.w w1, w7, w9 - 354: 02 00 3b bra NN, . + 0x6 - 356: 60 04 14 subr.w w8, #0x0, w8 - 358: e0 84 1c subbr.w w9, #0x0, w9 - -0000035a : - 35a: 09 88 a3 btst.z w9, #0x8 - 35c: 07 00 32 bra Z, . + 0x10 - 35e: 8a 81 71 ior.w w3, w10, w3 - 360: 82 81 71 ior.w w3, w2, w3 - 362: 61 01 64 and.w w8, #0x1, w2 - 364: 89 04 d1 lsr.w w9, w9 - 366: 08 84 d3 rrc.w w8, w8 - 368: 8b 05 e8 inc.w w11, w11 - 36a: 17 00 37 bra . + 0x30 - -0000036c : - 36c: 09 78 a3 btst.z w9, #0x7 - 36e: 13 00 3a bra NZ, . + 0x28 - -00000370 : - 370: 0b 00 e0 cp0.w w11 - 372: 13 00 34 bra LE, . + 0x28 - 374: 8b 05 e9 dec.w w11, w11 - 376: 08 04 44 add.w w8, w8, w8 - 378: 89 84 4c addc.w w9, w9, w9 - 37a: 0a 44 74 ior.b w8, w10, w8 - 37c: 09 78 a3 btst.z w9, #0x7 - 37e: 0d 00 3a bra NZ, . + 0x1C - -00000380 : - 380: 0b 00 e0 cp0.w w11 - 382: 07 00 34 bra LE, . + 0x10 - 384: 8b 05 e9 dec.w w11, w11 - 386: 08 04 44 add.w w8, w8, w8 - 388: 89 84 4c addc.w w9, w9, w9 - 38a: 01 00 3a bra NZ, . + 0x4 - 38c: 0b 00 20 mov.w #0x0, w11 - -0000038e : - 38e: 09 78 a3 btst.z w9, #0x7 - 390: f7 ff 32 bra Z, . + 0xFFFFFFF0 - -00000392 : - 392: 00 01 eb clr.w w2 - 394: 02 00 37 bra . + 0x6 - -00000396 : - 396: 82 81 71 ior.w w3, w2, w3 - 398: 0a 01 78 mov.w w10, w2 - -0000039a : - 39a: a1 00 07 rcall . + 0x144 - -0000039c : - 39c: 0c f0 a7 btsc.w w12, #0xf - 39e: 01 f0 a0 bset.w w1, #0xf - 3a0: ee 00 37 bra . + 0x1DE - -000003a2 : - 3a2: 64 20 e1 cp.w w4, #0x4 - 3a4: 02 00 3a bra NZ, . + 0x6 - 3a6: 83 8f 6c xor.w w9, w3, [w15] - 3a8: ee 00 33 bra N, . + 0x1DE - -000003aa : - 3aa: 08 01 be mov.d w8, w2 - -000003ac : - 3ac: 02 00 be mov.d w2, w0 - 3ae: e7 00 37 bra . + 0x1D0 - -000003b0 <___mulsf3>: - 3b0: 88 9f be mov.d w8, [w15++] - 3b2: 8a 9f be mov.d w10, [w15++] - 3b4: 8c 1f 78 mov.w w12, [w15++] - 3b6: d2 00 07 rcall . + 0x1A6 - 3b8: d9 00 33 bra N, . + 0x1B4 - 3ba: 03 86 6c xor.w w9, w3, w12 - 3bc: 64 50 e1 cp.w w10, #0x4 - 3be: 24 00 32 bra Z, . + 0x4A - 3c0: 64 20 e1 cp.w w4, #0x4 - 3c2: 27 00 32 bra Z, . + 0x50 - 3c4: 61 50 e1 cp.w w10, #0x1 - 3c6: 22 00 32 bra Z, . + 0x46 - 3c8: 61 20 e1 cp.w w4, #0x1 - 3ca: 21 00 32 bra Z, . + 0x44 - 3cc: 8b 85 42 add.w w5, w11, w11 - 3ce: eb 07 b1 sub.w #0x7e, w11 - 3d0: 01 34 b8 mul.uu w6, w1, w8 - 3d2: 00 3a b8 mul.uu w7, w0, w4 - 3d4: 08 04 42 add.w w4, w8, w8 - 3d6: 89 84 4a addc.w w5, w9, w9 - 3d8: 01 3a b8 mul.uu w7, w1, w4 - 3da: 00 30 b8 mul.uu w6, w0, w0 - 3dc: 88 80 40 add.w w1, w8, w1 - 3de: 09 01 4a addc.w w4, w9, w2 - 3e0: 04 00 33 bra N, . + 0xA - 3e2: 00 00 40 add.w w0, w0, w0 - 3e4: 81 80 48 addc.w w1, w1, w1 - 3e6: 02 01 49 addc.w w2, w2, w2 - 3e8: 8b 05 e9 dec.w w11, w11 - -000003ea : - 3ea: c9 09 dd sl.w w1, #0x9, w3 - 3ec: 83 01 70 ior.w w0, w3, w3 - 3ee: 01 00 32 bra Z, . + 0x4 - 3f0: 13 00 20 mov.w #0x1, w3 - -000003f2 : - 3f2: c8 14 de lsr.w w2, #0x8, w9 - 3f4: 48 14 dd sl.w w2, #0x8, w8 - 3f6: 47 09 de lsr.w w1, #0x7, w2 - 3f8: 12 00 b2 and.w #0x1, w2 - 3fa: c8 08 de lsr.w w1, #0x8, w1 - 3fc: 08 84 70 ior.w w1, w8, w8 - 3fe: 6f 00 07 rcall . + 0xE0 - -00000400 : - 400: 01 f0 a1 bclr.w w1, #0xf - 402: 0c f0 a7 btsc.w w12, #0xf - 404: 01 f0 a0 bset.w w1, #0xf - 406: bb 00 37 bra . + 0x178 - -00000408 : - 408: 61 20 e1 cp.w w4, #0x1 - 40a: bd 00 32 bra Z, . + 0x17C - -0000040c : - 40c: 08 01 be mov.d w8, w2 - -0000040e : - 40e: 02 00 be mov.d w2, w0 - 410: f7 ff 37 bra . + 0xFFFFFFF0 - -00000412 : - 412: 61 50 e1 cp.w w10, #0x1 - 414: fc ff 3a bra NZ, . + 0xFFFFFFFA - 416: b7 00 37 bra . + 0x170 - -00000418 <___fixsfsi>: - 418: 00 01 be mov.d w0, w2 - 41a: b8 00 07 rcall . + 0x172 - 41c: 04 70 a7 btsc.w w4, #0x7 - 41e: 03 f0 a1 bclr.w w3, #0xf - 420: 65 09 b1 sub.w #0x96, w5 - 422: 16 00 32 bra Z, . + 0x2E - 424: 0d 00 35 bra LT, . + 0x1C - 426: 68 28 e1 cp.w w5, #0x8 - 428: 06 00 35 bra LT, . + 0xE - 42a: f0 ff 2f mov.w #0xffff, w0 - 42c: f1 ff 27 mov.w #0x7fff, w1 - 42e: 03 00 e0 cp0.w w3 - 430: 13 00 3b bra NN, . + 0x28 - 432: 01 00 28 mov.w #0x8000, w1 - 434: 00 00 05 retlw.w #0x0, w0 - -00000436 : - 436: 00 00 40 add.w w0, w0, w0 - 438: 81 80 48 addc.w w1, w1, w1 - 43a: 85 02 e9 dec.w w5, w5 - 43c: fc ff 3a bra NZ, . + 0xFFFFFFFA - 43e: 08 00 37 bra . + 0x12 - -00000440 : - 440: f8 8f 42 add.w w5, #0x18, [w15] - 442: 02 00 3c bra GT, . + 0x6 - 444: 80 00 eb clr.w w1 - 446: 00 00 05 retlw.w #0x0, w0 - -00000448 : - 448: 81 00 d1 lsr.w w1, w1 - 44a: 00 80 d3 rrc.w w0, w0 - 44c: 85 02 e8 inc.w w5, w5 - 44e: fc ff 3a bra NZ, . + 0xFFFFFFFA - -00000450 : - 450: 03 00 e0 cp0.w w3 - 452: 02 00 3b bra NN, . + 0x6 - 454: 60 00 10 subr.w w0, #0x0, w0 - 456: e0 80 18 subbr.w w1, #0x0, w1 - -00000458 : - 458: 00 00 06 return - -0000045a <___fixunssfsi>: - 45a: 00 01 be mov.d w0, w2 - 45c: 97 00 07 rcall . + 0x130 - 45e: 04 70 a7 btsc.w w4, #0x7 - 460: 03 f0 a1 bclr.w w3, #0xf - 462: 03 f8 a3 btst.z w3, #0xf - 464: 13 00 3a bra NZ, . + 0x28 - 466: 65 09 b1 sub.w #0x96, w5 - 468: 10 00 32 bra Z, . + 0x22 - 46a: 09 00 35 bra LT, . + 0x14 - 46c: 69 28 e1 cp.w w5, #0x9 - 46e: 02 00 35 bra LT, . + 0x6 - 470: 01 00 28 mov.w #0x8000, w1 - 472: 00 00 05 retlw.w #0x0, w0 - -00000474 : - 474: 00 00 40 add.w w0, w0, w0 - 476: 81 80 48 addc.w w1, w1, w1 - 478: 85 02 e9 dec.w w5, w5 - 47a: fc ff 3a bra NZ, . + 0xFFFFFFFA - 47c: 00 00 06 return - -0000047e : - 47e: f8 8f 42 add.w w5, #0x18, [w15] - 480: 05 00 35 bra LT, . + 0xC - -00000482 : - 482: 81 00 d1 lsr.w w1, w1 - 484: 00 80 d3 rrc.w w0, w0 - 486: 85 02 e8 inc.w w5, w5 - 488: fc ff 3a bra NZ, . + 0xFFFFFFFA - -0000048a : - 48a: 00 00 06 return - -0000048c : - 48c: 80 00 eb clr.w w1 - 48e: 00 00 05 retlw.w #0x0, w0 - -00000490 <__dunpack>: - 490: 80 00 78 mov.w w0, w1 - 492: 50 02 be mov.d [++w0], w4 - 494: 50 03 be mov.d [++w0], w6 - 496: 44 39 de lsr.w w7, #0x4, w2 - 498: f7 00 b2 and.w #0xf, w7 - 49a: f3 7f 20 mov.w #0x7ff, w3 - 49c: 03 01 61 and.w w2, w3, w2 - 49e: 09 00 32 bra Z, . + 0x14 - 4a0: 02 18 e1 cp.w w3, w2 - 4a2: 16 00 3a bra NZ, . + 0x2E - 4a4: 85 01 72 ior.w w4, w5, w3 - 4a6: 83 01 73 ior.w w6, w3, w3 - 4a8: 83 81 73 ior.w w7, w3, w3 - 4aa: 00 08 20 mov.w #0x80, w0 - 4ac: 15 00 3a bra NZ, . + 0x2C - 4ae: 40 00 20 mov.w #0x4, w0 - 4b0: 13 00 37 bra . + 0x28 - -000004b2 : - 4b2: 85 01 72 ior.w w4, w5, w3 - 4b4: 83 01 73 ior.w w6, w3, w3 - 4b6: 83 81 73 ior.w w7, w3, w3 - 4b8: 05 00 3a bra NZ, . + 0xC - 4ba: 04 a8 be mov.d w4, [++w0] - 4bc: 06 a8 be mov.d w6, [++w0] - 4be: 10 00 20 mov.w #0x1, w0 - 4c0: 0b 00 37 bra . + 0x18 - -000004c2 : - 4c2: 02 01 e9 dec.w w2, w2 - -000004c4 : - 4c4: 04 02 42 add.w w4, w4, w4 - 4c6: 85 82 4a addc.w w5, w5, w5 - 4c8: 06 03 4b addc.w w6, w6, w6 - 4ca: 87 83 4b addc.w w7, w7, w7 - 4cc: 07 48 a3 btst.z w7, #0x4 - 4ce: f9 ff 32 bra Z, . + 0xFFFFFFF4 - -000004d0 : - 4d0: 07 40 a0 bset.w w7, #0x4 - 4d2: 04 a8 be mov.d w4, [++w0] - 4d4: 06 a8 be mov.d w6, [++w0] - 4d6: 20 00 20 mov.w #0x2, w0 - -000004d8 : - 4d8: 80 00 98 mov.w w0, [w1+0] - 4da: 92 00 98 mov.w w2, [w1+2] - 4dc: 00 00 06 return - -000004de <__fpack>: - 4de: 81 00 20 mov.w #0x8, w1 - 4e0: 61 80 55 sub.w w11, #0x1, w0 - 4e2: 0b 00 3d bra GE, . + 0x18 - 4e4: 0b 00 20 mov.w #0x0, w11 - 4e6: 61 fe 2f mov.w #0xffe6, w1 - 4e8: 01 00 e1 cp.w w0, w1 - 4ea: 1d 00 34 bra LE, . + 0x3C - -000004ec : - 4ec: 82 81 71 ior.w w3, w2, w3 - 4ee: 61 01 64 and.w w8, #0x1, w2 - 4f0: 89 04 d1 lsr.w w9, w9 - 4f2: 08 84 d3 rrc.w w8, w8 - 4f4: 00 00 e8 inc.w w0, w0 - 4f6: fa ff 3a bra NZ, . + 0xFFFFFFF6 - 4f8: 71 00 20 mov.w #0x7, w1 - -000004fa : - 4fa: 61 00 64 and.w w8, #0x1, w0 - 4fc: 03 00 70 ior.w w0, w3, w0 - 4fe: 02 00 60 and.w w0, w2, w0 - 500: 09 00 32 bra Z, . + 0x14 - 502: 61 04 44 add.w w8, #0x1, w8 - 504: e0 84 4c addc.w w9, #0x0, w9 - 506: 09 88 a5 btst.z w9, w1 - 508: 05 00 32 bra Z, . + 0xC - 50a: 8b 05 e8 inc.w w11, w11 - 50c: 68 08 e1 cp.w w1, #0x8 - 50e: 02 00 3a bra NZ, . + 0x6 - 510: 89 04 d1 lsr.w w9, w9 - 512: 08 84 d3 rrc.w w8, w8 - -00000514 : - 514: f2 0f 20 mov.w #0xff, w2 - 516: 02 58 e1 cp.w w11, w2 - 518: 05 00 3d bra GE, . + 0xC - 51a: c7 5d dd sl.w w11, #0x7, w11 - 51c: f9 07 b2 and.w #0x7f, w9 - 51e: 89 80 75 ior.w w11, w9, w1 - 520: 08 00 78 mov.w w8, w0 - 522: 00 00 06 return - -00000524 : - 524: 0b f8 27 mov.w #0x7f80, w11 - -00000526 : - 526: 8b 00 78 mov.w w11, w1 - 528: 00 00 05 retlw.w #0x0, w0 - -0000052a <__dunpack2>: - 52a: 68 04 47 add.w w14, #0x8, w8 - 52c: 02 94 be mov.d w2, [w8--] - 52e: 00 94 be mov.d w0, [w8--] - 530: fc 04 47 add.w w14, #0x1c, w9 - 532: 86 94 be mov.d w6, [w9--] - 534: 84 94 be mov.d w4, [w9--] - 536: 09 00 78 mov.w w9, w0 - 538: ab ff 07 rcall . + 0xFFFFFF58 - 53a: 08 00 78 mov.w w8, w0 - 53c: a9 ff 07 rcall . + 0xFFFFFF54 - 53e: 99 00 78 mov.w [w9], w1 - 540: 81 4f 70 ior.b w0, w1, [w15] - 542: 0b 00 3b bra NN, . + 0x18 - -00000544 : - 544: 08 00 be mov.d w8, w0 - 546: 37 00 07 rcall . + 0x70 - 548: 4f 00 b1 sub.w #0x4, w15 - 54a: 03 00 37 bra . + 0x8 - -0000054c <__dreturnNaN>: - 54c: f3 ff 27 mov.w #0x7fff, w3 - 54e: f2 ff 2f mov.w #0xffff, w2 - 550: 61 10 b9 mul.su w2, #0x1, w0 - -00000552 <__dunpack2exit>: - 552: 4f 06 be mov.d [--w15], w12 - 554: 4f 05 be mov.d [--w15], w10 - 556: 4f 04 be mov.d [--w15], w8 - 558: 00 80 fa ulnk - -0000055a : - 55a: 00 00 06 return - -0000055c <__funpack2>: - 55c: 00 04 be mov.d w0, w8 - 55e: 16 00 07 rcall . + 0x2E - 560: 00 03 be mov.d w0, w6 - 562: 04 05 be mov.d w4, w10 - 564: 02 00 be mov.d w2, w0 - 566: 12 00 07 rcall . + 0x26 - 568: 84 4f 75 ior.b w10, w4, [w15] - 56a: 00 00 06 return - -0000056c <__fPropagateNaN>: - 56c: 02 00 be mov.d w2, w0 - 56e: 64 50 e1 cp.w w10, #0x4 - 570: 05 00 36 bra LEU, . + 0xC - 572: 64 20 e1 cp.w w4, #0x4 - 574: 02 00 36 bra LEU, . + 0x6 - 576: 09 68 a3 btst.z w9, #0x6 - 578: 01 00 3a bra NZ, . + 0x4 - -0000057a : - 57a: 08 00 be mov.d w8, w0 - -0000057c : - 57c: 01 60 a0 bset.w w1, #0x6 - -0000057e <__fbopExit>: - 57e: 4f 06 78 mov.w [--w15], w12 - 580: 4f 05 be mov.d [--w15], w10 - 582: 4f 04 be mov.d [--w15], w8 - 584: 00 00 06 return - -00000586 <__fbopReturnNaN>: - 586: f0 ff 2f mov.w #0xffff, w0 - 588: f1 ff 27 mov.w #0x7fff, w1 - 58a: f9 ff 37 bra . + 0xFFFFFFF4 - -0000058c <__funpack>: - 58c: c7 0a de lsr.w w1, #0x7, w5 - 58e: f1 07 b2 and.w #0x7f, w1 - 590: f5 0f b2 and.w #0xff, w5 - 592: 08 00 32 bra Z, . + 0x12 - 594: e1 cf 42 add.b w5, #0x1, [w15] - 596: 02 00 32 bra Z, . + 0x6 - -00000598 : - 598: 01 70 a0 bset.w w1, #0x7 - 59a: 24 00 05 retlw.w #0x2, w4 - -0000059c : - 59c: 81 0f 70 ior.w w0, w1, [w15] - 59e: 01 00 32 bra Z, . + 0x4 - 5a0: 04 08 05 retlw.w #0x80, w4 - -000005a2 : - 5a2: 44 00 05 retlw.w #0x4, w4 - -000005a4 : - 5a4: 81 0f 70 ior.w w0, w1, [w15] - 5a6: 02 00 3a bra NZ, . + 0x6 - 5a8: 14 00 05 retlw.w #0x1, w4 - -000005aa : - 5aa: 85 02 e9 dec.w w5, w5 - -000005ac : - 5ac: 00 00 40 add.w w0, w0, w0 - 5ae: 81 c0 48 addc.b w1, w1, w1 - 5b0: fc ff 3b bra NN, . + 0xFFFFFFFA - 5b2: 01 70 a0 bset.w w1, #0x7 - 5b4: 24 00 05 retlw.w #0x2, w4 - -000005b6 <__dPropagateNaN>: - 5b6: e4 82 40 add.w w1, #0x4, w5 - 5b8: 10 78 a3 btst.z [w0], #0x7 - 5ba: 07 00 32 bra Z, . + 0x10 - 5bc: 64 02 40 add.w w0, #0x4, w4 - 5be: 11 78 a3 btst.z [w1], #0x7 - 5c0: 34 00 be mov.d [w4++], w0 - 5c2: 14 01 be mov.d [w4], w2 - 5c4: 04 00 32 bra Z, . + 0xA - 5c6: 03 30 a7 btsc.w w3, #0x3 - 5c8: 00 00 06 return - -000005ca : - 5ca: 35 00 be mov.d [w5++], w0 - 5cc: 15 01 be mov.d [w5], w2 - -000005ce : - 5ce: 03 30 a0 bset.w w3, #0x3 - 5d0: 00 00 06 return - -000005d2 <_end>: - 5d2: ff ff 37 bra . - -000005d4 <_main>: - 5d4: 06 00 22 mov.w #0x2000, w6 - 5d6: 07 00 20 mov.w #0x0, w7 - 5d8: 04 00 24 mov.w #0x4000, w4 - 5da: c5 69 24 mov.w #0x469c, w5 - 5dc: 02 00 20 mov.w #0x0, w2 - 5de: 03 14 24 mov.w #0x4140, w3 - 5e0: 60 00 b8 mul.uu w0, #0x0, w0 - 5e2: 03 09 07 rcall . + 0x1208 - 5e4: 80 02 eb clr.w w5 - 5e6: 34 00 20 mov.w #0x3, w4 - 5e8: 85 01 78 mov.w w5, w3 - 5ea: 92 06 20 mov.w #0x69, w2 - 5ec: 81 a4 29 mov.w #0x9a48, w1 - 5ee: 60 5f 20 mov.w #0x5f6, w0 - 5f0: c3 04 07 rcall . + 0x988 - 5f2: 67 05 07 rcall . + 0xAD0 - 5f4: 00 00 05 retlw.w #0x0, w0 - -000005f6 <_vDaemonTask>: - 5f6: 2f 02 b0 add.w #0x22, w15 - 5f8: 88 9f be mov.d w8, [w15++] - 5fa: 8a 9f be mov.d w10, [w15++] - 5fc: 8c 9f be mov.d w12, [w15++] - 5fe: 8e 1f 78 mov.w w14, [w15++] - 600: 60 00 b8 mul.uu w0, #0x0, w0 - 602: d0 af 9f mov.w w0, [w15-38] - 604: e1 af 9f mov.w w1, [w15-36] - 606: 60 00 b8 mul.uu w0, #0x0, w0 - 608: 60 11 b8 mul.uu w2, #0x0, w2 - 60a: 90 b7 9f mov.w w0, [w15-30] - 60c: a1 b7 9f mov.w w1, [w15-28] - 60e: b2 b7 9f mov.w w2, [w15-26] - 610: c3 b7 9f mov.w w3, [w15-24] - 612: 80 04 eb clr.w w9 - 614: 99 af 9f mov.w w9, [w15-46] - 616: a9 af 9f mov.w w9, [w15-44] - 618: 89 00 78 mov.w w9, w1 - 61a: 09 00 78 mov.w w9, w0 - 61c: 4c 07 07 rcall . + 0xE9A - 61e: 00 04 78 mov.w w0, w8 - 620: 00 00 e0 cp0.w w0 - 622: 99 00 35 bra LT, . + 0x134 - 624: 89 03 78 mov.w w9, w7 - 626: 09 03 78 mov.w w9, w6 - 628: 89 02 78 mov.w w9, w5 - 62a: 09 02 78 mov.w w9, w4 - 62c: 89 00 78 mov.w w9, w1 - 62e: 12 00 20 mov.w #0x1, w2 - 630: 03 00 20 mov.w #0x0, w3 - 632: 08 00 78 mov.w w8, w0 - 634: 6e 07 07 rcall . + 0xEDE - 636: 00 00 e0 cp0.w w0 - 638: 9a 00 35 bra LT, . + 0x136 - -0000063a <.L14>: - 63a: 41 00 20 mov.w #0x4, w1 - 63c: f2 01 20 mov.w #0x1f, w2 - 63e: 03 00 20 mov.w #0x0, w3 - 640: 08 00 78 mov.w w8, w0 - 642: d1 07 07 rcall . + 0xFA4 - 644: 31 00 20 mov.w #0x3, w1 - 646: 12 00 20 mov.w #0x1, w2 - 648: 03 00 20 mov.w #0x0, w3 - 64a: 08 00 78 mov.w w8, w0 - 64c: cc 07 07 rcall . + 0xF9A - 64e: 00 00 e0 cp0.w w0 - 650: 9b 00 35 bra LT, . + 0x138 - -00000652 <.L16>: - 652: 08 00 78 mov.w w8, w0 - 654: a9 07 07 rcall . + 0xF54 - 656: 00 00 e0 cp0.w w0 - 658: 9c 00 35 bra LT, . + 0x13A - -0000065a <.L18>: - 65a: f0 09 07 rcall . + 0x13E2 - 65c: 20 fd 2f mov.w #0xffd2, w0 - 65e: 0f 00 40 add.w w0, w15, w0 - 660: 80 85 e8 inc2.w w0, w11 - 662: fe 84 57 sub.w w15, #0x1e, w9 - 664: 68 06 40 add.w w0, #0x8, w12 - 666: ef 86 57 sub.w w15, #0xf, w13 - 668: 77 85 57 sub.w w15, #0x17, w10 - 66a: 64 07 40 add.w w0, #0x4, w14 - -0000066c <.L51>: - 66c: d3 03 07 rcall . + 0x7A8 - 66e: b0 af 9f mov.w w0, [w15-42] - 670: c1 af 9f mov.w w1, [w15-40] - 672: 80 02 eb clr.w w5 - 674: 0b 02 78 mov.w w11, w4 - 676: 23 fd 2f mov.w #0xffd2, w3 - 678: 8f 81 41 add.w w3, w15, w3 - 67a: 09 01 78 mov.w w9, w2 - 67c: 8c 00 78 mov.w w12, w1 - 67e: 08 00 78 mov.w w8, w0 - 680: ff 07 07 rcall . + 0x1000 - 682: 00 00 e0 cp0.w w0 - 684: 1e 00 35 bra LT, . + 0x3E - -00000686 <.L57>: - 686: 5f a8 97 mov.w [w15-38], w0 - 688: ef a8 97 mov.w [w15-36], w1 - 68a: 4b 09 dd sl.w w1, #0xb, w2 - 68c: 45 00 de lsr.w w0, #0x5, w0 - 68e: 00 00 71 ior.w w2, w0, w0 - 690: c5 88 de asr.w w1, #0x5, w1 - 692: f0 0f 50 sub.w w0, #0x10, [w15] - 694: e0 8f 58 subb.w w1, #0x0, [w15] - 696: 48 00 32 bra Z, . + 0x92 - 698: 1c 00 3c bra GT, . + 0x3A - 69a: e2 0f 50 sub.w w0, #0x2, [w15] - 69c: e0 8f 58 subb.w w1, #0x0, [w15] - 69e: 55 00 32 bra Z, . + 0xAC - 6a0: e3 0f 50 sub.w w0, #0x3, [w15] - 6a2: e0 8f 58 subb.w w1, #0x0, [w15] - 6a4: 13 00 32 bra Z, . + 0x28 - -000006a6 <.L23>: - 6a6: 95 ff 07 rcall . + 0xFFFFFF2C - 6a8: b5 03 07 rcall . + 0x76C - 6aa: b0 af 9f mov.w w0, [w15-42] - 6ac: c1 af 9f mov.w w1, [w15-40] - 6ae: 80 02 eb clr.w w5 - 6b0: 0b 02 78 mov.w w11, w4 - 6b2: 23 fd 2f mov.w #0xffd2, w3 - 6b4: 8f 81 41 add.w w3, w15, w3 - 6b6: 09 01 78 mov.w w9, w2 - 6b8: 8c 00 78 mov.w w12, w1 - 6ba: 08 00 78 mov.w w8, w0 - 6bc: e1 07 07 rcall . + 0xFC4 - 6be: 00 00 e0 cp0.w w0 - 6c0: e2 ff 3d bra GE, . + 0xFFFFFFC6 - -000006c2 <.L21>: - 6c2: 12 00 20 mov.w #0x1, w2 - 6c4: 03 00 20 mov.w #0x0, w3 - 6c6: 0e 00 78 mov.w w14, w0 - 6c8: 68 03 07 rcall . + 0x6D2 - 6ca: d0 ff 37 bra . + 0xFFFFFFA2 - -000006cc <.L26>: - 6cc: b9 09 07 rcall . + 0x1374 - 6ce: a0 08 07 rcall . + 0x1142 - 6d0: cd ff 37 bra . + 0xFFFFFF9C - -000006d2 <.L31>: - 6d2: 02 03 20 mov.w #0x30, w2 - 6d4: 82 0f 50 sub.w w0, w2, [w15] - 6d6: e0 8f 58 subb.w w1, #0x0, [w15] - 6d8: 35 00 32 bra Z, . + 0x6C - 6da: 12 03 20 mov.w #0x31, w2 - 6dc: 82 0f 50 sub.w w0, w2, [w15] - 6de: e0 8f 58 subb.w w1, #0x0, [w15] - 6e0: 37 00 32 bra Z, . + 0x70 - 6e2: 02 02 20 mov.w #0x20, w2 - 6e4: 82 0f 50 sub.w w0, w2, [w15] - 6e6: e0 8f 58 subb.w w1, #0x0, [w15] - 6e8: de ff 3a bra NZ, . + 0xFFFFFFBE - 6ea: aa 09 07 rcall . + 0x1356 - 6ec: 2f a8 97 mov.w [w15-44], w0 - 6ee: 00 00 e0 cp0.w w0 - 6f0: bd ff 32 bra Z, . + 0xFFFFFF7C - 6f2: f7 08 07 rcall . + 0x11F0 - 6f4: f0 af 9f mov.w w0, [w15-34] - 6f6: 81 b7 9f mov.w w1, [w15-32] - 6f8: a3 08 07 rcall . + 0x1148 - 6fa: e1 fd 2f mov.w #0xffde, w1 - 6fc: 8f 80 40 add.w w1, w15, w1 - 6fe: 7b 80 57 sub.w w15, #0x1b, w0 - -00000700 <.L35>: - 700: 31 48 78 mov.b [w1++], [w0] - 702: 00 00 e9 dec.w w0, w0 - 704: 7f 81 57 sub.w w15, #0x1f, w2 - 706: 82 0f 50 sub.w w0, w2, [w15] - 708: fb ff 3a bra NZ, . + 0xFFFFFFF8 - 70a: 82 da 20 mov.w #0xda8, w2 - 70c: 67 80 44 add.w w9, #0x7, w0 - 70e: e3 80 44 add.w w9, #0x3, w1 - -00000710 <.L37>: - 710: 32 48 78 mov.b [w2++], [w0] - 712: 00 00 e9 dec.w w0, w0 - 714: 81 0f 50 sub.w w0, w1, [w15] - 716: fc ff 3a bra NZ, . + 0xFFFFFFFA - 718: 25 00 20 mov.w #0x2, w5 - 71a: 84 00 20 mov.w #0x8, w4 - 71c: 89 00 78 mov.w w9, w1 - 71e: 5f a9 97 mov.w [w15-38], w2 - 720: ef a9 97 mov.w [w15-36], w3 - 722: 08 00 78 mov.w w8, w0 - 724: f9 07 07 rcall . + 0xFF4 - 726: a2 ff 37 bra . + 0xFFFFFF46 - -00000728 <.L27>: - 728: 8b 09 07 rcall . + 0x1318 - 72a: 89 00 78 mov.w w9, w1 - 72c: 0d 00 78 mov.w w13, w0 - -0000072e <.L32>: - 72e: 31 48 78 mov.b [w1++], [w0] - 730: 00 00 e9 dec.w w0, w0 - 732: 8a 0f 50 sub.w w0, w10, [w15] - 734: fc ff 3a bra NZ, . + 0xFFFFFFFA - 736: 5f b0 97 mov.w [w15-22], w0 - 738: ef b0 97 mov.w [w15-20], w1 - 73a: 7f b1 97 mov.w [w15-18], w2 - 73c: 8f b9 97 mov.w [w15-16], w3 - 73e: 42 fd 07 rcall . + 0xFFFFFA86 - 740: f7 08 07 rcall . + 0x11F0 - 742: 94 ff 37 bra . + 0xFFFFFF2A - -00000744 <.L29>: - 744: 7d 09 07 rcall . + 0x12FC - 746: 66 08 07 rcall . + 0x10CE - 748: 91 ff 37 bra . + 0xFFFFFF24 - -0000074a <.L25>: - 74a: 7a 09 07 rcall . + 0x12F6 - 74c: f0 08 07 rcall . + 0x11E2 - 74e: 8e ff 37 bra . + 0xFFFFFF1E - -00000750 <.L30>: - 750: 77 09 07 rcall . + 0x12F0 - 752: ec 08 07 rcall . + 0x11DA - 754: 8b ff 37 bra . + 0xFFFFFF18 - -00000756 <.L53>: - 756: 3d ff 07 rcall . + 0xFFFFFE7C - 758: 89 03 78 mov.w w9, w7 - 75a: 09 03 78 mov.w w9, w6 - 75c: 89 02 78 mov.w w9, w5 - 75e: 09 02 78 mov.w w9, w4 - 760: 89 00 78 mov.w w9, w1 - 762: 12 00 20 mov.w #0x1, w2 - 764: 03 00 20 mov.w #0x0, w3 - 766: 08 00 78 mov.w w8, w0 - 768: d4 06 07 rcall . + 0xDAA - 76a: 00 00 e0 cp0.w w0 - 76c: 66 ff 3d bra GE, . + 0xFFFFFECE - -0000076e <.L54>: - 76e: 31 ff 07 rcall . + 0xFFFFFE64 - 770: 41 00 20 mov.w #0x4, w1 - 772: f2 01 20 mov.w #0x1f, w2 - 774: 03 00 20 mov.w #0x0, w3 - 776: 08 00 78 mov.w w8, w0 - 778: 36 07 07 rcall . + 0xE6E - 77a: 31 00 20 mov.w #0x3, w1 - 77c: 12 00 20 mov.w #0x1, w2 - 77e: 03 00 20 mov.w #0x0, w3 - 780: 08 00 78 mov.w w8, w0 - 782: 31 07 07 rcall . + 0xE64 - 784: 00 00 e0 cp0.w w0 - 786: 65 ff 3d bra GE, . + 0xFFFFFECC - -00000788 <.L55>: - 788: 24 ff 07 rcall . + 0xFFFFFE4A - 78a: 08 00 78 mov.w w8, w0 - 78c: 0d 07 07 rcall . + 0xE1C - 78e: 00 00 e0 cp0.w w0 - 790: 64 ff 3d bra GE, . + 0xFFFFFECA - -00000792 <.L56>: - 792: 1f ff 07 rcall . + 0xFFFFFE40 - 794: 53 09 07 rcall . + 0x12A8 - 796: 20 fd 2f mov.w #0xffd2, w0 - 798: 0f 00 40 add.w w0, w15, w0 - 79a: 80 85 e8 inc2.w w0, w11 - 79c: fe 84 57 sub.w w15, #0x1e, w9 - 79e: 68 06 40 add.w w0, #0x8, w12 - 7a0: ef 86 57 sub.w w15, #0xf, w13 - 7a2: 77 85 57 sub.w w15, #0x17, w10 - 7a4: 64 07 40 add.w w0, #0x4, w14 - 7a6: 62 ff 37 bra . + 0xFFFFFEC6 - -000007a8 <_vListInitialise>: - 7a8: e4 00 40 add.w w0, #0x4, w1 - 7aa: 11 00 98 mov.w w1, [w0+2] - 7ac: 80 98 eb setm.w [w1++] - 7ae: 80 90 eb setm.w [w1--] - 7b0: 41 00 98 mov.w w1, [w0+8] - 7b2: 51 00 98 mov.w w1, [w0+10] - 7b4: 00 08 eb clr.w [w0] - 7b6: 00 00 06 return - -000007b8 <_vListInitialiseItem>: - 7b8: 80 00 eb clr.w w1 - 7ba: 51 00 98 mov.w w1, [w0+10] - 7bc: 00 00 06 return - -000007be <_vListInsertEnd>: - 7be: 10 01 90 mov.w [w0+2], w2 - 7c0: a2 01 90 mov.w [w2+4], w3 - 7c2: a3 00 98 mov.w w3, [w1+4] - 7c4: b2 00 98 mov.w w2, [w1+6] - 7c6: a2 01 90 mov.w [w2+4], w3 - 7c8: b1 01 98 mov.w w1, [w3+6] - 7ca: 21 01 98 mov.w w1, [w2+4] - 7cc: 11 00 98 mov.w w1, [w0+2] - 7ce: d0 00 98 mov.w w0, [w1+10] - 7d0: 10 08 e8 inc.w [w0], [w0] - 7d2: 00 00 06 return - -000007d4 <_vListInsert>: - 7d4: 80 01 78 mov.w w0, w3 - 7d6: 11 02 be mov.d [w1], w4 - 7d8: e1 0f 42 add.w w4, #0x1, [w15] - 7da: e0 8f 4a addc.w w5, #0x0, [w15] - 7dc: 18 00 32 bra Z, . + 0x32 - 7de: 64 01 40 add.w w0, #0x4, w2 - 7e0: 22 00 90 mov.w [w2+4], w0 - 7e2: b0 0f 52 sub.w w4, [w0++], [w15] - 7e4: a0 8f 5a subb.w w5, [w0--], [w15] - 7e6: 08 00 31 bra C, . + 0x12 - -000007e8 <.L16>: - 7e8: 22 00 90 mov.w [w2+4], w0 - 7ea: a0 00 98 mov.w w0, [w1+4] - 7ec: 31 00 98 mov.w w1, [w0+6] - 7ee: b2 00 98 mov.w w2, [w1+6] - 7f0: 21 01 98 mov.w w1, [w2+4] - 7f2: d3 00 98 mov.w w3, [w1+10] - 7f4: 93 09 e8 inc.w [w3], [w3] - 7f6: 00 00 06 return - -000007f8 <.L19>: - 7f8: 22 01 90 mov.w [w2+4], w2 - 7fa: 22 00 90 mov.w [w2+4], w0 - 7fc: b0 0f 52 sub.w w4, [w0++], [w15] - 7fe: a0 8f 5a subb.w w5, [w0--], [w15] - 800: f3 ff 39 bra NC, . + 0xFFFFFFE8 - 802: 22 01 90 mov.w [w2+4], w2 - 804: 22 00 90 mov.w [w2+4], w0 - 806: b0 0f 52 sub.w w4, [w0++], [w15] - 808: a0 8f 5a subb.w w5, [w0--], [w15] - 80a: f6 ff 31 bra C, . + 0xFFFFFFEE - 80c: ed ff 37 bra . + 0xFFFFFFDC - -0000080e <.L23>: - 80e: 50 01 90 mov.w [w0+10], w2 - 810: 22 00 90 mov.w [w2+4], w0 - 812: a0 00 98 mov.w w0, [w1+4] - 814: 31 00 98 mov.w w1, [w0+6] - 816: b2 00 98 mov.w w2, [w1+6] - 818: 21 01 98 mov.w w1, [w2+4] - 81a: d3 00 98 mov.w w3, [w1+10] - 81c: 93 09 e8 inc.w [w3], [w3] - 81e: 00 00 06 return - 820: eb ff 37 bra . + 0xFFFFFFD8 - -00000822 <_vListRemove>: - 822: 80 00 78 mov.w w0, w1 - 824: 20 00 90 mov.w [w0+4], w0 - 826: 31 01 90 mov.w [w1+6], w2 - 828: 32 00 98 mov.w w2, [w0+6] - 82a: b1 01 90 mov.w [w1+6], w3 - 82c: a0 01 98 mov.w w0, [w3+4] - 82e: 51 01 90 mov.w [w1+10], w2 - 830: 12 00 90 mov.w [w2+2], w0 - 832: 81 0f 50 sub.w w0, w1, [w15] - 834: 04 00 32 bra Z, . + 0xA - 836: 00 00 eb clr.w w0 - 838: d0 00 98 mov.w w0, [w1+10] - 83a: 12 09 e9 dec.w [w2], [w2] - 83c: 00 00 06 return - -0000083e <.L31>: - 83e: 13 01 98 mov.w w3, [w2+2] - 840: 00 00 eb clr.w w0 - 842: d0 00 98 mov.w w0, [w1+10] - 844: 12 09 e9 dec.w [w2], [w2] - 846: 00 00 06 return - 848: fa ff 37 bra . + 0xFFFFFFF6 - -0000084a <_xQueueCreate>: - 84a: 88 9f be mov.d w8, [w15++] - 84c: 8a 9f be mov.d w10, [w15++] - 84e: 8c 1f 78 mov.w w12, [w15++] - 850: 80 04 78 mov.w w0, w9 - 852: 01 05 78 mov.w w1, w10 - 854: 00 00 e0 cp0.w w0 - 856: 05 00 3a bra NZ, . + 0xC - -00000858 <.L2>: - 858: 00 00 20 mov.w #0x0, w0 - 85a: 4f 06 78 mov.w [--w15], w12 - 85c: 4f 05 be mov.d [--w15], w10 - 85e: 4f 04 be mov.d [--w15], w8 - 860: 00 00 06 return - -00000862 <.L10>: - 862: a0 02 20 mov.w #0x2a, w0 - 864: 0a 06 07 rcall . + 0xC16 - 866: 00 04 78 mov.w w0, w8 - 868: 00 00 e0 cp0.w w0 - 86a: f6 ff 32 bra Z, . + 0xFFFFFFEE - 86c: 0a c8 b9 mul.ss w9, w10, w0 - 86e: 00 06 78 mov.w w0, w12 - 870: 00 00 e8 inc.w w0, w0 - 872: 03 06 07 rcall . + 0xC08 - 874: 80 05 78 mov.w w0, w11 - 876: 00 0c 78 mov.w w0, [w8] - 878: 00 00 e0 cp0.w w0 - 87a: 18 00 32 bra Z, . + 0x32 - 87c: 0c 00 40 add.w w0, w12, w0 - 87e: 10 04 98 mov.w w0, [w8+2] - 880: 00 00 eb clr.w w0 - 882: 00 14 98 mov.w w0, [w8+32] - 884: 2b 04 98 mov.w w11, [w8+4] - 886: 09 00 e9 dec.w w9, w0 - 888: 00 d0 b9 mul.ss w10, w0, w0 - 88a: 00 80 45 add.w w11, w0, w0 - 88c: 30 04 98 mov.w w0, [w8+6] - 88e: 19 14 98 mov.w w9, [w8+34] - 890: 2a 14 98 mov.w w10, [w8+36] - 892: 00 80 eb setm.w w0 - 894: 30 14 98 mov.w w0, [w8+38] - 896: 40 14 98 mov.w w0, [w8+40] - 898: 68 00 44 add.w w8, #0x8, w0 - 89a: 86 ff 07 rcall . + 0xFFFFFF0E - 89c: 74 00 44 add.w w8, #0x14, w0 - 89e: 84 ff 07 rcall . + 0xFFFFFF0A - 8a0: 08 00 78 mov.w w8, w0 - 8a2: 4f 06 78 mov.w [--w15], w12 - 8a4: 4f 05 be mov.d [--w15], w10 - 8a6: 4f 04 be mov.d [--w15], w8 - 8a8: 00 00 06 return - 8aa: db ff 37 bra . + 0xFFFFFFB8 - -000008ac <.L5>: - 8ac: 08 00 78 mov.w w8, w0 - 8ae: 00 06 07 rcall . + 0xC02 - 8b0: 0b 00 78 mov.w w11, w0 - 8b2: 4f 06 78 mov.w [--w15], w12 - 8b4: 4f 05 be mov.d [--w15], w10 - 8b6: 4f 04 be mov.d [--w15], w8 - 8b8: 00 00 06 return - 8ba: d3 ff 37 bra . + 0xFFFFFFA8 - -000008bc <_uxQueueMessagesWaiting>: - 8bc: 88 1f 78 mov.w w8, [w15++] - 8be: 00 04 78 mov.w w0, w8 - 8c0: c1 05 07 rcall . + 0xB84 - 8c2: 08 14 90 mov.w [w8+32], w8 - 8c4: c2 05 07 rcall . + 0xB86 - 8c6: 08 00 78 mov.w w8, w0 - 8c8: 4f 04 78 mov.w [--w15], w8 - 8ca: 00 00 06 return - -000008cc <_vQueueDelete>: - 8cc: 88 1f 78 mov.w w8, [w15++] - 8ce: 00 04 78 mov.w w0, w8 - 8d0: 10 00 78 mov.w [w0], w0 - 8d2: ee 05 07 rcall . + 0xBDE - 8d4: 08 00 78 mov.w w8, w0 - 8d6: ec 05 07 rcall . + 0xBDA - 8d8: 4f 04 78 mov.w [--w15], w8 - 8da: 00 00 06 return - -000008dc <_prvCopyDataFromQueue>: - 8dc: 80 01 78 mov.w w0, w3 - 8de: 01 02 78 mov.w w1, w4 - 8e0: 10 00 e0 cp0.w [w0] - 8e2: 0a 00 32 bra Z, . + 0x16 - 8e4: 30 00 90 mov.w [w0+6], w0 - 8e6: 23 11 90 mov.w [w3+36], w2 - 8e8: 02 00 40 add.w w0, w2, w0 - 8ea: b0 01 98 mov.w w0, [w3+6] - 8ec: 93 00 90 mov.w [w3+2], w1 - 8ee: 81 0f 50 sub.w w0, w1, [w15] - 8f0: 04 00 31 bra C, . + 0xA - 8f2: b3 00 90 mov.w [w3+6], w1 - 8f4: 04 00 78 mov.w w4, w0 - 8f6: 48 fc 07 rcall . + 0xFFFFF892 - -000008f8 <.L26>: - 8f8: 00 00 06 return - -000008fa <.L28>: - 8fa: 13 00 78 mov.w [w3], w0 - 8fc: b0 01 98 mov.w w0, [w3+6] - 8fe: b3 00 90 mov.w [w3+6], w1 - 900: 04 00 78 mov.w w4, w0 - 902: 42 fc 07 rcall . + 0xFFFFF886 - 904: f9 ff 37 bra . + 0xFFFFFFF4 - -00000906 <_xQueueReceiveFromISR>: - 906: 88 9f be mov.d w8, [w15++] - 908: 00 04 78 mov.w w0, w8 - 90a: 82 04 78 mov.w w2, w9 - 90c: 00 10 90 mov.w [w0+32], w0 - 90e: 00 00 e0 cp0.w w0 - 910: 02 00 3a bra NZ, . + 0x6 - 912: 4f 04 be mov.d [--w15], w8 - 914: 00 00 06 return - -00000916 <.L42>: - 916: 08 00 78 mov.w w8, w0 - 918: e1 ff 07 rcall . + 0xFFFFFFC4 - 91a: 08 10 90 mov.w [w8+32], w0 - 91c: 00 00 e9 dec.w w0, w0 - 91e: 00 14 98 mov.w w0, [w8+32] - 920: 38 10 90 mov.w [w8+38], w0 - 922: e1 0f 40 add.w w0, #0x1, [w15] - 924: 06 00 32 bra Z, . + 0xE - 926: 00 00 e8 inc.w w0, w0 - 928: 30 14 98 mov.w w0, [w8+38] - 92a: 10 00 20 mov.w #0x1, w0 - 92c: 4f 04 be mov.d [--w15], w8 - 92e: 00 00 06 return - 930: f2 ff 37 bra . + 0xFFFFFFE6 - -00000932 <.L43>: - 932: 19 00 e0 cp0.w [w9] - 934: 03 00 3a bra NZ, . + 0x8 - 936: 48 00 90 mov.w [w8+8], w0 - 938: 00 00 e0 cp0.w w0 - 93a: 04 00 3a bra NZ, . + 0xA - -0000093c <.L36>: - 93c: 10 00 20 mov.w #0x1, w0 - 93e: 4f 04 be mov.d [--w15], w8 - 940: 00 00 06 return - 942: e9 ff 37 bra . + 0xFFFFFFD4 - -00000944 <.L44>: - 944: 68 00 44 add.w w8, #0x8, w0 - 946: b7 02 07 rcall . + 0x570 - 948: 00 00 e0 cp0.w w0 - 94a: f8 ff 32 bra Z, . + 0xFFFFFFF2 - 94c: 10 00 20 mov.w #0x1, w0 - 94e: 80 0c 78 mov.w w0, [w9] - 950: 4f 04 be mov.d [--w15], w8 - 952: 00 00 06 return - 954: e0 ff 37 bra . + 0xFFFFFFC2 - -00000956 <_prvCopyDataToQueue>: - 956: 88 1f 78 mov.w w8, [w15++] - 958: 00 04 78 mov.w w0, w8 - 95a: 02 00 78 mov.w w2, w0 - 95c: 28 11 90 mov.w [w8+36], w2 - 95e: 02 00 e0 cp0.w w2 - 960: 0d 00 32 bra Z, . + 0x1C - 962: 00 00 e0 cp0.w w0 - 964: 10 00 32 bra Z, . + 0x22 - 966: 38 00 90 mov.w [w8+6], w0 - 968: 0f fc 07 rcall . + 0xFFFFF820 - 96a: 38 00 90 mov.w [w8+6], w0 - 96c: a8 10 90 mov.w [w8+36], w1 - 96e: 01 00 50 sub.w w0, w1, w0 - 970: 30 04 98 mov.w w0, [w8+6] - 972: 98 0f 50 sub.w w0, [w8], [w15] - 974: 03 00 31 bra C, . + 0x8 - 976: 18 00 90 mov.w [w8+2], w0 - 978: 01 00 50 sub.w w0, w1, w0 - 97a: 30 04 98 mov.w w0, [w8+6] - -0000097c <.L48>: - 97c: 08 10 90 mov.w [w8+32], w0 - 97e: 00 00 e8 inc.w w0, w0 - 980: 00 14 98 mov.w w0, [w8+32] - 982: 4f 04 78 mov.w [--w15], w8 - 984: 00 00 06 return - -00000986 <.L56>: - 986: 28 00 90 mov.w [w8+4], w0 - 988: ff fb 07 rcall . + 0xFFFFF800 - 98a: 28 00 90 mov.w [w8+4], w0 - 98c: a8 10 90 mov.w [w8+36], w1 - 98e: 01 00 40 add.w w0, w1, w0 - 990: 20 04 98 mov.w w0, [w8+4] - 992: 98 00 90 mov.w [w8+2], w1 - 994: 81 0f 50 sub.w w0, w1, [w15] - 996: f2 ff 39 bra NC, . + 0xFFFFFFE6 - 998: 18 00 78 mov.w [w8], w0 - 99a: 20 04 98 mov.w w0, [w8+4] - 99c: 08 10 90 mov.w [w8+32], w0 - 99e: 00 00 e8 inc.w w0, w0 - 9a0: 00 14 98 mov.w w0, [w8+32] - 9a2: 4f 04 78 mov.w [--w15], w8 - 9a4: 00 00 06 return - 9a6: ef ff 37 bra . + 0xFFFFFFE0 - -000009a8 <_xQueueGenericSendFromISR>: - 9a8: 88 9f be mov.d w8, [w15++] - 9aa: 00 04 78 mov.w w0, w8 - 9ac: 01 02 78 mov.w w1, w4 - 9ae: 82 04 78 mov.w w2, w9 - 9b0: 03 01 78 mov.w w3, w2 - 9b2: 80 10 90 mov.w [w0+32], w1 - 9b4: 10 10 90 mov.w [w0+34], w0 - 9b6: 80 8f 50 sub.w w1, w0, [w15] - 9b8: 03 00 39 bra NC, . + 0x8 - -000009ba <.L60>: - 9ba: 09 00 78 mov.w w9, w0 - 9bc: 4f 04 be mov.d [--w15], w8 - 9be: 00 00 06 return - -000009c0 <.L72>: - 9c0: 84 00 78 mov.w w4, w1 - 9c2: 08 00 78 mov.w w8, w0 - 9c4: c8 ff 07 rcall . + 0xFFFFFF92 - 9c6: 48 10 90 mov.w [w8+40], w0 - 9c8: e1 0f 40 add.w w0, #0x1, [w15] - 9ca: 06 00 32 bra Z, . + 0xE - 9cc: 00 00 e8 inc.w w0, w0 - 9ce: 40 14 98 mov.w w0, [w8+40] - 9d0: 09 00 78 mov.w w9, w0 - 9d2: 4f 04 be mov.d [--w15], w8 - 9d4: 00 00 06 return - 9d6: f4 ff 37 bra . + 0xFFFFFFEA - -000009d8 <.L73>: - 9d8: 09 00 e0 cp0.w w9 - 9da: ef ff 3a bra NZ, . + 0xFFFFFFE0 - 9dc: 28 08 90 mov.w [w8+20], w0 - 9de: 00 00 e0 cp0.w w0 - 9e0: 04 00 3a bra NZ, . + 0xA - -000009e2 <.L65>: - 9e2: 00 00 20 mov.w #0x0, w0 - 9e4: 4f 04 be mov.d [--w15], w8 - 9e6: 00 00 06 return - 9e8: eb ff 37 bra . + 0xFFFFFFD8 - -000009ea <.L74>: - 9ea: 74 00 44 add.w w8, #0x14, w0 - 9ec: 64 02 07 rcall . + 0x4CA - 9ee: 11 00 20 mov.w #0x1, w1 - 9f0: 00 00 e0 cp0.w w0 - 9f2: f7 ff 32 bra Z, . + 0xFFFFFFF0 - 9f4: 01 00 78 mov.w w1, w0 - 9f6: 4f 04 be mov.d [--w15], w8 - 9f8: 00 00 06 return - 9fa: e2 ff 37 bra . + 0xFFFFFFC6 - -000009fc <_prvUnlockQueue>: - 9fc: 88 1f 78 mov.w w8, [w15++] - 9fe: 00 04 78 mov.w w0, w8 - a00: 21 05 07 rcall . + 0xA44 - a02: 48 10 90 mov.w [w8+40], w0 - a04: 00 00 e9 dec.w w0, w0 - a06: 40 14 98 mov.w w0, [w8+40] - a08: e1 0f 40 add.w w0, #0x1, [w15] - a0a: 05 00 34 bra LE, . + 0xC - a0c: 00 80 eb setm.w w0 - a0e: 40 14 98 mov.w w0, [w8+40] - a10: 28 08 90 mov.w [w8+20], w0 - a12: 00 00 e0 cp0.w w0 - a14: 18 00 3a bra NZ, . + 0x32 - -00000a16 <.L78>: - a16: 19 05 07 rcall . + 0xA34 - a18: 15 05 07 rcall . + 0xA2C - a1a: 38 10 90 mov.w [w8+38], w0 - a1c: 00 00 e9 dec.w w0, w0 - a1e: 30 14 98 mov.w w0, [w8+38] - a20: e1 0f 40 add.w w0, #0x1, [w15] - a22: 05 00 34 bra LE, . + 0xC - a24: 00 80 eb setm.w w0 - a26: 30 14 98 mov.w w0, [w8+38] - a28: 48 00 90 mov.w [w8+8], w0 - a2a: 00 00 e0 cp0.w w0 - a2c: 03 00 3a bra NZ, . + 0x8 - -00000a2e <.L82>: - a2e: 0d 05 07 rcall . + 0xA1C - a30: 4f 04 78 mov.w [--w15], w8 - a32: 00 00 06 return - -00000a34 <.L89>: - a34: 68 00 44 add.w w8, #0x8, w0 - a36: 3f 02 07 rcall . + 0x480 - a38: 00 00 e0 cp0.w w0 - a3a: f9 ff 32 bra Z, . + 0xFFFFFFF4 - a3c: 99 02 07 rcall . + 0x534 - a3e: 05 05 07 rcall . + 0xA0C - a40: 4f 04 78 mov.w [--w15], w8 - a42: 00 00 06 return - a44: f7 ff 37 bra . + 0xFFFFFFF0 - -00000a46 <.L88>: - a46: 74 00 44 add.w w8, #0x14, w0 - a48: 36 02 07 rcall . + 0x46E - a4a: 00 00 e0 cp0.w w0 - a4c: e4 ff 32 bra Z, . + 0xFFFFFFCA - a4e: 90 02 07 rcall . + 0x522 - a50: e2 ff 37 bra . + 0xFFFFFFC6 - -00000a52 <_xQueueGenericReceive>: - a52: 0a 00 fa lnk #0xa - a54: 88 9f be mov.d w8, [w15++] - a56: 8a 9f be mov.d w10, [w15++] - a58: 8c 1f 78 mov.w w12, [w15++] - a5a: 80 04 78 mov.w w0, w9 - a5c: 81 05 78 mov.w w1, w11 - a5e: 92 bf 9f mov.w w2, [w15-14] - a60: a3 bf 9f mov.w w3, [w15-12] - a62: 04 06 78 mov.w w4, w12 - a64: f5 00 07 rcall . + 0x1EC - a66: 74 80 57 sub.w w15, #0x14, w0 - a68: 54 02 07 rcall . + 0x4AA - a6a: ec 04 07 rcall . + 0x9DA - a6c: 39 10 90 mov.w [w9+38], w0 - a6e: 00 00 e8 inc.w w0, w0 - a70: b0 14 98 mov.w w0, [w9+38] - a72: 49 10 90 mov.w [w9+40], w0 - a74: 00 00 e8 inc.w w0, w0 - a76: c0 14 98 mov.w w0, [w9+40] - a78: e8 04 07 rcall . + 0x9D2 - a7a: 1a 00 20 mov.w #0x1, w10 - -00000a7c <.L119>: - a7c: e3 04 07 rcall . + 0x9C8 - a7e: 09 14 90 mov.w [w9+32], w8 - a80: e4 04 07 rcall . + 0x9CA - a82: 08 00 e0 cp0.w w8 - a84: 05 00 3a bra NZ, . + 0xC - a86: 1f b9 97 mov.w [w15-14], w2 - a88: af b9 97 mov.w [w15-12], w3 - a8a: e0 0f 51 sub.w w2, #0x0, [w15] - a8c: e0 8f 59 subb.w w3, #0x0, [w15] - a8e: 21 00 3a bra NZ, . + 0x44 - -00000a90 <.L95>: - a90: 0a 00 e0 cp0.w w10 - a92: 0c 00 3a bra NZ, . + 0x1A - -00000a94 <.L102>: - a94: 1f b8 97 mov.w [w15-14], w0 - a96: af b8 97 mov.w [w15-12], w1 - a98: e0 0f 50 sub.w w0, #0x0, [w15] - a9a: e0 8f 58 subb.w w1, #0x0, [w15] - a9c: 44 00 32 bra Z, . + 0x8A - a9e: ee 80 57 sub.w w15, #0xe, w1 - aa0: 74 80 57 sub.w w15, #0x14, w0 - aa2: 3e 02 07 rcall . + 0x47E - aa4: 00 00 e0 cp0.w w0 - aa6: 3f 00 3a bra NZ, . + 0x80 - aa8: 00 85 eb setm.w w10 - aaa: e8 ff 37 bra . + 0xFFFFFFD2 - -00000aac <.L122>: - aac: cb 04 07 rcall . + 0x998 - aae: 09 10 90 mov.w [w9+32], w0 - ab0: 00 00 e0 cp0.w w0 - ab2: 2b 00 3a bra NZ, . + 0x58 - ab4: 00 05 78 mov.w w0, w10 - -00000ab6 <.L106>: - ab6: c9 04 07 rcall . + 0x994 - ab8: 0a 00 e0 cp0.w w10 - aba: ec ff 32 bra Z, . + 0xFFFFFFDA - abc: e1 0f 45 add.w w10, #0x1, [w15] - abe: de ff 32 bra Z, . + 0xFFFFFFBE - ac0: 09 00 78 mov.w w9, w0 - ac2: 9c ff 07 rcall . + 0xFFFFFF3A - ac4: 20 01 07 rcall . + 0x242 - ac6: 0a 00 78 mov.w w10, w0 - ac8: 4f 06 78 mov.w [--w15], w12 - aca: 4f 05 be mov.d [--w15], w10 - acc: 4f 04 be mov.d [--w15], w8 - ace: 00 80 fa ulnk - ad0: 00 00 06 return - -00000ad2 <.L121>: - ad2: 74 80 44 add.w w9, #0x14, w0 - ad4: d0 01 07 rcall . + 0x3A2 - ad6: b6 04 07 rcall . + 0x96E - ad8: 09 00 78 mov.w w9, w0 - ada: 90 ff 07 rcall . + 0xFFFFFF22 - adc: 14 01 07 rcall . + 0x22A - ade: 00 00 e0 cp0.w w0 - ae0: 03 00 3a bra NZ, . + 0x8 - ae2: ca 13 02 call 0x13ca <_vPortYield> - ae4: 00 00 00 - ae6: 00 00 00 nop - -00000ae8 <.L98>: - ae8: 09 10 90 mov.w [w9+32], w0 - aea: 00 00 e0 cp0.w w0 - aec: 01 00 3a bra NZ, . + 0x4 - aee: 00 05 78 mov.w w0, w10 - -00000af0 <.L100>: - af0: af 00 07 rcall . + 0x160 - af2: a8 04 07 rcall . + 0x952 - af4: 39 10 90 mov.w [w9+38], w0 - af6: 00 00 e8 inc.w w0, w0 - af8: b0 14 98 mov.w w0, [w9+38] - afa: 49 10 90 mov.w [w9+40], w0 - afc: 00 00 e8 inc.w w0, w0 - afe: c0 14 98 mov.w w0, [w9+40] - b00: a4 04 07 rcall . + 0x94A - b02: a3 04 07 rcall . + 0x948 - b04: 0a 00 e0 cp0.w w10 - b06: c6 ff 32 bra Z, . + 0xFFFFFF8E - b08: d1 ff 37 bra . + 0xFFFFFFA4 - -00000b0a <.L104>: - b0a: 39 04 90 mov.w [w9+6], w8 - b0c: 8b 00 78 mov.w w11, w1 - b0e: 09 00 78 mov.w w9, w0 - b10: e5 fe 07 rcall . + 0xFFFFFDCC - b12: 0c 00 e0 cp0.w w12 - b14: 13 00 3a bra NZ, . + 0x28 - b16: 09 10 90 mov.w [w9+32], w0 - b18: 00 00 e9 dec.w w0, w0 - b1a: 80 14 98 mov.w w0, [w9+32] - b1c: 39 10 90 mov.w [w9+38], w0 - b1e: 00 00 e8 inc.w w0, w0 - b20: b0 14 98 mov.w w0, [w9+38] - b22: 1a 00 20 mov.w #0x1, w10 - b24: c8 ff 37 bra . + 0xFFFFFF92 - -00000b26 <.L110>: - b26: 00 05 eb clr.w w10 - b28: 09 00 78 mov.w w9, w0 - b2a: 68 ff 07 rcall . + 0xFFFFFED2 - b2c: ec 00 07 rcall . + 0x1DA - b2e: 0a 00 78 mov.w w10, w0 - b30: 4f 06 78 mov.w [--w15], w12 - b32: 4f 05 be mov.d [--w15], w10 - b34: 4f 04 be mov.d [--w15], w8 - b36: 00 80 fa ulnk - b38: 00 00 06 return - b3a: cb ff 37 bra . + 0xFFFFFF98 - -00000b3c <.L107>: - b3c: b8 04 98 mov.w w8, [w9+6] - b3e: 49 10 90 mov.w [w9+40], w0 - b40: 00 00 e8 inc.w w0, w0 - b42: c0 14 98 mov.w w0, [w9+40] - b44: 1a 00 20 mov.w #0x1, w10 - b46: b7 ff 37 bra . + 0xFFFFFF70 - -00000b48 <_xQueueGenericSend>: - b48: 0a 00 fa lnk #0xa - b4a: 88 9f be mov.d w8, [w15++] - b4c: 8a 9f be mov.d w10, [w15++] - b4e: 8c 9f be mov.d w12, [w15++] - b50: 00 05 78 mov.w w0, w10 - b52: 01 06 78 mov.w w1, w12 - b54: 82 bf 9f mov.w w2, [w15-16] - b56: 93 bf 9f mov.w w3, [w15-14] - b58: 84 06 78 mov.w w4, w13 - b5a: 7a 00 07 rcall . + 0xF6 - b5c: 76 80 57 sub.w w15, #0x16, w0 - b5e: d9 01 07 rcall . + 0x3B4 - b60: 71 04 07 rcall . + 0x8E4 - b62: 3a 10 90 mov.w [w10+38], w0 - b64: 00 00 e8 inc.w w0, w0 - b66: 30 15 98 mov.w w0, [w10+38] - b68: 4a 10 90 mov.w [w10+40], w0 - b6a: 00 00 e8 inc.w w0, w0 - b6c: 40 15 98 mov.w w0, [w10+40] - b6e: 6d 04 07 rcall . + 0x8DC - b70: 1b 00 20 mov.w #0x1, w11 - -00000b72 <.L150>: - b72: 68 04 07 rcall . + 0x8D2 - b74: 8a 14 90 mov.w [w10+32], w9 - b76: 1a 14 90 mov.w [w10+34], w8 - b78: 68 04 07 rcall . + 0x8D2 - b7a: 88 8f 54 sub.w w9, w8, [w15] - b7c: 28 00 32 bra Z, . + 0x52 - -00000b7e <.L128>: - b7e: 0b 00 e0 cp0.w w11 - b80: 12 00 3a bra NZ, . + 0x26 - -00000b82 <.L135>: - b82: 0f b8 97 mov.w [w15-16], w0 - b84: 9f b8 97 mov.w [w15-14], w1 - b86: e0 0f 50 sub.w w0, #0x0, [w15] - b88: e0 8f 58 subb.w w1, #0x0, [w15] - b8a: 4b 00 32 bra Z, . + 0x98 - b8c: f0 80 57 sub.w w15, #0x10, w1 - b8e: 76 80 57 sub.w w15, #0x16, w0 - b90: c7 01 07 rcall . + 0x390 - b92: 00 00 e0 cp0.w w0 - b94: 46 00 3a bra NZ, . + 0x8E - b96: 80 85 eb setm.w w11 - b98: 55 04 07 rcall . + 0x8AC - b9a: 8a 14 90 mov.w [w10+32], w9 - b9c: 1a 14 90 mov.w [w10+34], w8 - b9e: 55 04 07 rcall . + 0x8AC - ba0: 88 8f 54 sub.w w9, w8, [w15] - ba2: ed ff 3a bra NZ, . + 0xFFFFFFDC - ba4: 14 00 37 bra . + 0x2A - -00000ba6 <.L153>: - ba6: 4e 04 07 rcall . + 0x89E - ba8: 8a 10 90 mov.w [w10+32], w1 - baa: 1a 10 90 mov.w [w10+34], w0 - bac: 80 05 eb clr.w w11 - bae: 80 8f 50 sub.w w1, w0, [w15] - bb0: 2f 00 39 bra NC, . + 0x60 - -00000bb2 <.L139>: - bb2: 4b 04 07 rcall . + 0x898 - bb4: 0b 00 e0 cp0.w w11 - bb6: e5 ff 32 bra Z, . + 0xFFFFFFCC - bb8: e1 8f 45 add.w w11, #0x1, [w15] - bba: db ff 32 bra Z, . + 0xFFFFFFB8 - bbc: 0a 00 78 mov.w w10, w0 - bbe: 1e ff 07 rcall . + 0xFFFFFE3E - bc0: a2 00 07 rcall . + 0x146 - bc2: 0b 00 78 mov.w w11, w0 - bc4: 4f 06 be mov.d [--w15], w12 - bc6: 4f 05 be mov.d [--w15], w10 - bc8: 4f 04 be mov.d [--w15], w8 - bca: 00 80 fa ulnk - bcc: 00 00 06 return - -00000bce <.L152>: - bce: 0f b9 97 mov.w [w15-16], w2 - bd0: 9f b9 97 mov.w [w15-14], w3 - bd2: e0 0f 51 sub.w w2, #0x0, [w15] - bd4: e0 8f 59 subb.w w3, #0x0, [w15] - bd6: d3 ff 32 bra Z, . + 0xFFFFFFA8 - bd8: 68 00 45 add.w w10, #0x8, w0 - bda: 4d 01 07 rcall . + 0x29C - bdc: 33 04 07 rcall . + 0x868 - bde: 0a 00 78 mov.w w10, w0 - be0: 0d ff 07 rcall . + 0xFFFFFE1C - be2: 91 00 07 rcall . + 0x124 - be4: 00 00 e0 cp0.w w0 - be6: 03 00 3a bra NZ, . + 0x8 - be8: ca 13 02 call 0x13ca <_vPortYield> - bea: 00 00 00 - bec: 00 00 00 nop - -00000bee <.L131>: - bee: 8a 10 90 mov.w [w10+32], w1 - bf0: 1a 10 90 mov.w [w10+34], w0 - bf2: 80 8f 50 sub.w w1, w0, [w15] - bf4: 21 00 32 bra Z, . + 0x44 - bf6: 2c 00 07 rcall . + 0x5A - bf8: 25 04 07 rcall . + 0x84C - bfa: 3a 10 90 mov.w [w10+38], w0 - bfc: 00 00 e8 inc.w w0, w0 - bfe: 30 15 98 mov.w w0, [w10+38] - c00: 4a 10 90 mov.w [w10+40], w0 - c02: 00 00 e8 inc.w w0, w0 - c04: 40 15 98 mov.w w0, [w10+40] - c06: 21 04 07 rcall . + 0x844 - c08: 20 04 07 rcall . + 0x842 - -00000c0a <.L156>: - c0a: 0b 00 e0 cp0.w w11 - c0c: ba ff 32 bra Z, . + 0xFFFFFF76 - c0e: cb ff 37 bra . + 0xFFFFFF98 - -00000c10 <.L154>: - c10: 0d 01 78 mov.w w13, w2 - c12: 8c 00 78 mov.w w12, w1 - c14: 0a 00 78 mov.w w10, w0 - c16: 9f fe 07 rcall . + 0xFFFFFD40 - c18: 4a 10 90 mov.w [w10+40], w0 - c1a: 00 00 e8 inc.w w0, w0 - c1c: 40 15 98 mov.w w0, [w10+40] - c1e: 1b 00 20 mov.w #0x1, w11 - c20: c8 ff 37 bra . + 0xFFFFFF92 - -00000c22 <.L141>: - c22: 80 05 eb clr.w w11 - c24: 0a 00 78 mov.w w10, w0 - c26: ea fe 07 rcall . + 0xFFFFFDD6 - c28: 6e 00 07 rcall . + 0xDE - c2a: 0b 00 78 mov.w w11, w0 - c2c: 4f 06 be mov.d [--w15], w12 - c2e: 4f 05 be mov.d [--w15], w10 - c30: 4f 04 be mov.d [--w15], w8 - c32: 00 80 fa ulnk - c34: 00 00 06 return - c36: cb ff 37 bra . + 0xFFFFFF98 - -00000c38 <.L155>: - c38: 80 05 eb clr.w w11 - c3a: 0a 00 07 rcall . + 0x16 - c3c: 03 04 07 rcall . + 0x808 - c3e: 3a 10 90 mov.w [w10+38], w0 - c40: 00 00 e8 inc.w w0, w0 - c42: 30 15 98 mov.w w0, [w10+38] - c44: 4a 10 90 mov.w [w10+40], w0 - c46: 00 00 e8 inc.w w0, w0 - c48: 40 15 98 mov.w w0, [w10+40] - c4a: ff 03 07 rcall . + 0x800 - c4c: fe 03 07 rcall . + 0x7FE - c4e: dd ff 37 bra . + 0xFFFFFFBC - -00000c50 <_vTaskSuspendAll>: - c50: f9 03 07 rcall . + 0x7F4 - c52: 10 2d ec inc.w 0xd10 - c54: fa 03 37 bra . + 0x7F6 - -00000c56 <_vTaskEndScheduler>: - c56: 42 a0 a8 bset.b 0x42, #0x5 - c58: 16 2d ef clr.w 0xd16 - c5a: b6 03 37 bra . + 0x76E - -00000c5c <_vTaskIncrementTick>: - c5c: 88 9f be mov.d w8, [w15++] - c5e: 8a 1f 78 mov.w w10, [w15++] - c60: 10 0d e2 cp0.w 0xd10 - c62: 1e 00 3a bra NZ, . + 0x3E - c64: 40 68 80 mov.w 0xd08, w0 - c66: 51 68 80 mov.w 0xd0a, w1 - c68: 61 00 40 add.w w0, #0x1, w0 - c6a: e0 80 48 addc.w w1, #0x0, w1 - c6c: 40 68 88 mov.w w0, 0xd08 - c6e: 51 68 88 mov.w w1, 0xd0a - c70: 40 68 80 mov.w 0xd08, w0 - c72: 51 68 80 mov.w 0xd0a, w1 - c74: e0 0f 50 sub.w w0, #0x0, [w15] - c76: e0 8f 58 subb.w w1, #0x0, [w15] - c78: 18 00 32 bra Z, . + 0x32 - c7a: 40 69 80 mov.w 0xd28, w0 - c7c: 10 00 e0 cp0.w [w0] - c7e: 0d 00 32 bra Z, . + 0x1C - -00000c80 <.L14>: - c80: 40 69 80 mov.w 0xd28, w0 - c82: 40 00 90 mov.w [w0+8], w0 - c84: 40 00 90 mov.w [w0+8], w0 - c86: 00 04 78 mov.w w0, w8 - c88: 00 00 e0 cp0.w w0 - c8a: 07 00 32 bra Z, . + 0x10 - c8c: 42 68 80 mov.w 0xd08, w2 - c8e: 53 68 80 mov.w 0xd0a, w3 - c90: a0 00 90 mov.w [w0+4], w1 - c92: 10 00 90 mov.w [w0+2], w0 - c94: 82 0f 50 sub.w w0, w2, [w15] - c96: 83 8f 58 subb.w w1, w3, [w15] - c98: 11 00 36 bra LEU, . + 0x24 - -00000c9a <.L24>: - c9a: 4f 05 78 mov.w [--w15], w10 - c9c: 4f 04 be mov.d [--w15], w8 - c9e: 00 00 06 return - -00000ca0 <.L10>: - ca0: 12 2d ec inc.w 0xd12 - ca2: 4f 05 78 mov.w [--w15], w10 - ca4: 4f 04 be mov.d [--w15], w8 - ca6: 00 00 06 return - ca8: fb ff 37 bra . + 0xFFFFFFF8 - -00000caa <.L28>: - caa: 40 69 80 mov.w 0xd28, w0 - cac: 31 69 80 mov.w 0xd26, w1 - cae: 41 69 88 mov.w w1, 0xd28 - cb0: 30 69 88 mov.w w0, 0xd26 - cb2: 0c 2d ec inc.w 0xd0c - cb4: 40 69 80 mov.w 0xd28, w0 - cb6: 10 00 e0 cp0.w [w0] - cb8: e3 ff 3a bra NZ, . + 0xFFFFFFC8 - cba: ef ff 37 bra . + 0xFFFFFFE0 - -00000cbc <.L25>: - cbc: 2a d4 20 mov.w #0xd42, w10 - -00000cbe <.L17>: - cbe: 88 84 e8 inc2.w w8, w9 - cc0: 09 00 78 mov.w w9, w0 - cc2: af fd 07 rcall . + 0xFFFFFB60 - cc4: 48 08 90 mov.w [w8+24], w0 - cc6: 00 00 e0 cp0.w w0 - cc8: 02 00 32 bra Z, . + 0x6 - cca: 6e 00 44 add.w w8, #0xe, w0 - ccc: aa fd 07 rcall . + 0xFFFFFB56 - -00000cce <.L18>: - cce: d8 08 90 mov.w [w8+26], w1 - cd0: 70 68 80 mov.w 0xd0e, w0 - cd2: 80 8f 50 sub.w w1, w0, [w15] - cd4: 01 00 36 bra LEU, . + 0x4 - cd6: 71 68 88 mov.w w1, 0xd0e - -00000cd8 <.L20>: - cd8: 6c 08 b9 mul.su w1, #0xc, w0 - cda: 00 00 45 add.w w10, w0, w0 - cdc: 89 00 78 mov.w w9, w1 - cde: 6f fd 07 rcall . + 0xFFFFFAE0 - ce0: 40 69 80 mov.w 0xd28, w0 - ce2: 10 00 e0 cp0.w [w0] - ce4: da ff 32 bra Z, . + 0xFFFFFFB6 - ce6: 40 69 80 mov.w 0xd28, w0 - ce8: 40 00 90 mov.w [w0+8], w0 - cea: 40 04 90 mov.w [w0+8], w8 - cec: 08 00 e0 cp0.w w8 - cee: d5 ff 32 bra Z, . + 0xFFFFFFAC - cf0: 42 68 80 mov.w 0xd08, w2 - cf2: 53 68 80 mov.w 0xd0a, w3 - cf4: 18 00 90 mov.w [w8+2], w0 - cf6: a8 00 90 mov.w [w8+4], w1 - cf8: 82 0f 50 sub.w w0, w2, [w15] - cfa: 83 8f 58 subb.w w1, w3, [w15] - cfc: e0 ff 36 bra LEU, . + 0xFFFFFFC2 - cfe: 4f 05 78 mov.w [--w15], w10 - d00: 4f 04 be mov.d [--w15], w8 - d02: 00 00 06 return - d04: cd ff 37 bra . + 0xFFFFFF9C - -00000d06 <_xTaskResumeAll>: - d06: 88 9f be mov.d w8, [w15++] - d08: 8a 1f 78 mov.w w10, [w15++] - d0a: 9c 03 07 rcall . + 0x73A - d0c: 10 2d ed dec.w 0xd10 - d0e: 80 68 80 mov.w 0xd10, w0 - d10: 00 00 e0 cp0.w w0 - d12: 33 00 3a bra NZ, . + 0x68 - d14: 14 0d e2 cp0.w 0xd14 - d16: 31 00 32 bra Z, . + 0x64 - d18: 00 05 78 mov.w w0, w10 - -00000d1a <.L57>: - d1a: 1a 0d e2 cp0.w 0xd1a - d1c: 1b 00 32 bra Z, . + 0x38 - -00000d1e <.L59>: - d1e: 10 69 80 mov.w 0xd22, w0 - d20: 40 04 90 mov.w [w0+8], w8 - d22: 08 00 e0 cp0.w w8 - d24: 17 00 32 bra Z, . + 0x30 - d26: 6e 00 44 add.w w8, #0xe, w0 - d28: 7c fd 07 rcall . + 0xFFFFFAFA - d2a: 88 84 e8 inc2.w w8, w9 - d2c: 09 00 78 mov.w w9, w0 - d2e: 79 fd 07 rcall . + 0xFFFFFAF4 - d30: d8 08 90 mov.w [w8+26], w1 - d32: 70 68 80 mov.w 0xd0e, w0 - d34: 80 8f 50 sub.w w1, w0, [w15] - d36: 01 00 36 bra LEU, . + 0x4 - d38: 71 68 88 mov.w w1, 0xd0e - -00000d3a <.L37>: - d3a: 6c 09 b9 mul.su w1, #0xc, w2 - d3c: 20 d4 20 mov.w #0xd42, w0 - d3e: 02 00 40 add.w w0, w2, w0 - d40: 89 00 78 mov.w w9, w1 - d42: 3d fd 07 rcall . + 0xFFFFFA7C - d44: d0 6d 80 mov.w 0xdba, w0 - d46: d8 08 90 mov.w [w8+26], w1 - d48: 50 08 90 mov.w [w0+26], w0 - d4a: 80 8f 50 sub.w w1, w0, [w15] - d4c: e6 ff 39 bra NC, . + 0xFFFFFFCE - d4e: 1a 00 20 mov.w #0x1, w10 - d50: 1a 0d e2 cp0.w 0xd1a - d52: e5 ff 3a bra NZ, . + 0xFFFFFFCC - -00000d54 <.L40>: - d54: 12 0d e2 cp0.w 0xd12 - d56: 0c 00 32 bra Z, . + 0x1A - d58: 12 0d e2 cp0.w 0xd12 - d5a: 16 00 3a bra NZ, . + 0x2E - -00000d5c <.L45>: - d5c: 06 2d ef clr.w 0xd06 - d5e: ca 13 02 call 0x13ca <_vPortYield> - d60: 00 00 00 - d62: 00 00 00 nop - d64: 18 00 20 mov.w #0x1, w8 - d66: 71 03 07 rcall . + 0x6E4 - d68: 08 00 78 mov.w w8, w0 - d6a: 4f 05 78 mov.w [--w15], w10 - d6c: 4f 04 be mov.d [--w15], w8 - d6e: 00 00 06 return - -00000d70 <.L60>: - d70: e1 0f 55 sub.w w10, #0x1, [w15] - d72: f4 ff 32 bra Z, . + 0xFFFFFFEA - d74: 30 68 80 mov.w 0xd06, w0 - d76: e1 0f 50 sub.w w0, #0x1, [w15] - d78: f1 ff 32 bra Z, . + 0xFFFFFFE4 - -00000d7a <.L32>: - d7a: 00 04 eb clr.w w8 - d7c: 66 03 07 rcall . + 0x6CE - d7e: 08 00 78 mov.w w8, w0 - d80: 4f 05 78 mov.w [--w15], w10 - d82: 4f 04 be mov.d [--w15], w8 - d84: 00 00 06 return - d86: f4 ff 37 bra . + 0xFFFFFFEA - -00000d88 <.L52>: - d88: 69 ff 07 rcall . + 0xFFFFFED4 - d8a: 12 2d ed dec.w 0xd12 - d8c: 12 0d e2 cp0.w 0xd12 - d8e: e6 ff 32 bra Z, . + 0xFFFFFFCE - d90: 65 ff 07 rcall . + 0xFFFFFECC - d92: 12 2d ed dec.w 0xd12 - d94: 12 0d e2 cp0.w 0xd12 - d96: f8 ff 3a bra NZ, . + 0xFFFFFFF2 - d98: e1 ff 37 bra . + 0xFFFFFFC4 - -00000d9a <_vTaskDelayUntil>: - d9a: 88 9f be mov.d w8, [w15++] - d9c: 8a 1f 78 mov.w w10, [w15++] - d9e: 00 05 78 mov.w w0, w10 - da0: 02 04 be mov.d w2, w8 - da2: 56 ff 07 rcall . + 0xFFFFFEAE - da4: 1a 01 be mov.d [w10], w2 - da6: 02 04 44 add.w w8, w2, w8 - da8: 83 84 4c addc.w w9, w3, w9 - daa: 40 68 80 mov.w 0xd08, w0 - dac: 51 68 80 mov.w 0xd0a, w1 - dae: 80 0f 51 sub.w w2, w0, [w15] - db0: 81 8f 59 subb.w w3, w1, [w15] - db2: 10 00 36 bra LEU, . + 0x22 - db4: 88 0f 51 sub.w w2, w8, [w15] - db6: 89 8f 59 subb.w w3, w9, [w15] - db8: 10 00 3e bra GTU, . + 0x22 - -00000dba <.L66>: - dba: 00 00 eb clr.w w0 - dbc: 08 8d be mov.d w8, [w10] - dbe: 00 00 e0 cp0.w w0 - dc0: 15 00 3a bra NZ, . + 0x2C - -00000dc2 <.L71>: - dc2: a1 ff 07 rcall . + 0xFFFFFF44 - dc4: 00 00 e0 cp0.w w0 - dc6: 03 00 3a bra NZ, . + 0x8 - dc8: ca 13 02 call 0x13ca <_vPortYield> - dca: 00 00 00 - dcc: 00 00 00 nop - -00000dce <.L77>: - dce: 4f 05 78 mov.w [--w15], w10 - dd0: 4f 04 be mov.d [--w15], w8 - dd2: 00 00 06 return - -00000dd4 <.L64>: - dd4: 88 0f 51 sub.w w2, w8, [w15] - dd6: 89 8f 59 subb.w w3, w9, [w15] - dd8: 05 00 3e bra GTU, . + 0xC - -00000dda <.L78>: - dda: 40 68 80 mov.w 0xd08, w0 - ddc: 51 68 80 mov.w 0xd0a, w1 - dde: 80 0f 54 sub.w w8, w0, [w15] - de0: 81 8f 5c subb.w w9, w1, [w15] - de2: eb ff 36 bra LEU, . + 0xFFFFFFD8 - -00000de4 <.L68>: - de4: 10 00 20 mov.w #0x1, w0 - de6: 08 8d be mov.d w8, [w10] - de8: 00 00 e0 cp0.w w0 - dea: eb ff 32 bra Z, . + 0xFFFFFFD8 - -00000dec <.L80>: - dec: ba 8d ec inc2.w 0xdba, WREG - dee: 19 fd 07 rcall . + 0xFFFFFA34 - df0: d0 6d 80 mov.w 0xdba, w0 - df2: 18 00 98 mov.w w8, [w0+2] - df4: 29 00 98 mov.w w9, [w0+4] - df6: 40 68 80 mov.w 0xd08, w0 - df8: 51 68 80 mov.w 0xd0a, w1 - dfa: 80 0f 54 sub.w w8, w0, [w15] - dfc: 81 8f 5c subb.w w9, w1, [w15] - dfe: 05 00 39 bra NC, . + 0xC - e00: d1 6d 80 mov.w 0xdba, w1 - e02: 40 69 80 mov.w 0xd28, w0 - e04: 81 80 e8 inc2.w w1, w1 - e06: e6 fc 07 rcall . + 0xFFFFF9CE - e08: dc ff 37 bra . + 0xFFFFFFBA - -00000e0a <.L81>: - e0a: d1 6d 80 mov.w 0xdba, w1 - e0c: 30 69 80 mov.w 0xd26, w0 - e0e: 81 80 e8 inc2.w w1, w1 - e10: e1 fc 07 rcall . + 0xFFFFF9C4 - e12: d7 ff 37 bra . + 0xFFFFFFB0 - -00000e14 <_xTaskGetTickCount>: - e14: 88 9f be mov.d w8, [w15++] - e16: 16 03 07 rcall . + 0x62E - e18: 48 68 80 mov.w 0xd08, w8 - e1a: 59 68 80 mov.w 0xd0a, w9 - e1c: 16 03 07 rcall . + 0x62E - e1e: 08 00 be mov.d w8, w0 - e20: 4f 04 be mov.d [--w15], w8 - e22: 00 00 06 return - -00000e24 <_uxTaskGetNumberOfTasks>: - e24: 88 1f 78 mov.w w8, [w15++] - e26: 0e 03 07 rcall . + 0x61E - e28: a8 68 80 mov.w 0xd14, w8 - e2a: 0f 03 07 rcall . + 0x620 - e2c: 08 00 78 mov.w w8, w0 - e2e: 4f 04 78 mov.w [--w15], w8 - e30: 00 00 06 return - -00000e32 <_vTaskSwitchContext>: - e32: 10 0d e2 cp0.w 0xd10 - e34: 03 00 32 bra Z, . + 0x8 - e36: 10 00 20 mov.w #0x1, w0 - e38: 30 68 88 mov.w w0, 0xd06 - e3a: 00 00 06 return - -00000e3c <.L92>: - e3c: 70 68 80 mov.w 0xd0e, w0 - e3e: 6c 00 b9 mul.su w0, #0xc, w0 - e40: 22 d4 20 mov.w #0xd42, w2 - e42: 62 00 78 mov.w [w2+w0], w0 - e44: 00 00 e0 cp0.w w0 - e46: 06 00 3a bra NZ, . + 0xE - -00000e48 <.L100>: - e48: 0e 2d ed dec.w 0xd0e - e4a: 70 68 80 mov.w 0xd0e, w0 - e4c: 6c 00 b9 mul.su w0, #0xc, w0 - e4e: 62 00 78 mov.w [w2+w0], w0 - e50: 00 00 e0 cp0.w w0 - e52: fa ff 32 bra Z, . + 0xFFFFFFF6 - -00000e54 <.L96>: - e54: 70 68 80 mov.w 0xd0e, w0 - e56: 6c 00 b9 mul.su w0, #0xc, w0 - e58: 00 01 41 add.w w2, w0, w2 - e5a: 92 00 90 mov.w [w2+2], w1 - e5c: a1 00 90 mov.w [w1+4], w1 - e5e: 11 01 98 mov.w w1, [w2+2] - e60: 64 00 41 add.w w2, #0x4, w0 - e62: 80 8f 50 sub.w w1, w0, [w15] - e64: 03 00 32 bra Z, . + 0x8 - e66: c1 00 90 mov.w [w1+8], w1 - e68: d1 6d 88 mov.w w1, 0xdba - e6a: 00 00 06 return - -00000e6c <.L103>: - e6c: a1 00 90 mov.w [w1+4], w1 - e6e: 11 01 98 mov.w w1, [w2+2] - e70: c1 00 90 mov.w [w1+8], w1 - e72: d1 6d 88 mov.w w1, 0xdba - e74: 00 00 06 return - -00000e76 <_vTaskPlaceOnEventList>: - e76: 88 9f be mov.d w8, [w15++] - e78: 02 04 be mov.d w2, w8 - e7a: d1 6d 80 mov.w 0xdba, w1 - e7c: ee 80 40 add.w w1, #0xe, w1 - e7e: aa fc 07 rcall . + 0xFFFFF956 - e80: ba 8d ec inc2.w 0xdba, WREG - e82: cf fc 07 rcall . + 0xFFFFF9A0 - e84: 40 68 80 mov.w 0xd08, w0 - e86: 51 68 80 mov.w 0xd0a, w1 - e88: 00 01 44 add.w w8, w0, w2 - e8a: 81 81 4c addc.w w9, w1, w3 - e8c: d0 6d 80 mov.w 0xdba, w0 - e8e: 12 00 98 mov.w w2, [w0+2] - e90: 23 00 98 mov.w w3, [w0+4] - e92: 40 68 80 mov.w 0xd08, w0 - e94: 51 68 80 mov.w 0xd0a, w1 - e96: 80 0f 51 sub.w w2, w0, [w15] - e98: 81 8f 59 subb.w w3, w1, [w15] - e9a: 06 00 31 bra C, . + 0xE - e9c: d1 6d 80 mov.w 0xdba, w1 - e9e: 30 69 80 mov.w 0xd26, w0 - ea0: 81 80 e8 inc2.w w1, w1 - ea2: 98 fc 07 rcall . + 0xFFFFF932 - ea4: 4f 04 be mov.d [--w15], w8 - ea6: 00 00 06 return - -00000ea8 <.L106>: - ea8: d1 6d 80 mov.w 0xdba, w1 - eaa: 40 69 80 mov.w 0xd28, w0 - eac: 81 80 e8 inc2.w w1, w1 - eae: 92 fc 07 rcall . + 0xFFFFF926 - eb0: 4f 04 be mov.d [--w15], w8 - eb2: 00 00 06 return - eb4: f9 ff 37 bra . + 0xFFFFFFF4 - -00000eb6 <_xTaskRemoveFromEventList>: - eb6: 88 9f be mov.d w8, [w15++] - eb8: 90 00 78 mov.w [w0], w1 - eba: 01 00 e0 cp0.w w1 - ebc: 20 00 3a bra NZ, . + 0x42 - ebe: 81 04 78 mov.w w1, w9 - -00000ec0 <.L116>: - ec0: 6e 84 44 add.w w9, #0xe, w8 - ec2: 08 00 78 mov.w w8, w0 - ec4: ae fc 07 rcall . + 0xFFFFF95E - ec6: 10 0d e2 cp0.w 0xd10 - ec8: 16 00 3a bra NZ, . + 0x2E - eca: 09 84 e8 inc2.w w9, w8 - ecc: 08 00 78 mov.w w8, w0 - ece: a9 fc 07 rcall . + 0xFFFFF954 - ed0: d9 08 90 mov.w [w9+26], w1 - ed2: 70 68 80 mov.w 0xd0e, w0 - ed4: 80 8f 50 sub.w w1, w0, [w15] - ed6: 16 00 3e bra GTU, . + 0x2E - ed8: 6c 09 b9 mul.su w1, #0xc, w2 - eda: 20 d4 20 mov.w #0xd42, w0 - edc: 02 00 40 add.w w0, w2, w0 - ede: 88 00 78 mov.w w8, w1 - ee0: 6e fc 07 rcall . + 0xFFFFF8DE - -00000ee2 <.L121>: - ee2: d0 6d 80 mov.w 0xdba, w0 - ee4: 00 01 eb clr.w w2 - ee6: d9 08 90 mov.w [w9+26], w1 - ee8: 50 08 90 mov.w [w0+26], w0 - eea: 80 8f 50 sub.w w1, w0, [w15] - eec: 01 00 39 bra NC, . + 0x4 - eee: 12 00 20 mov.w #0x1, w2 - -00000ef0 <.L122>: - ef0: 02 00 78 mov.w w2, w0 - ef2: 4f 04 be mov.d [--w15], w8 - ef4: 00 00 06 return - -00000ef6 <.L117>: - ef6: 88 00 78 mov.w w8, w1 - ef8: a0 d1 20 mov.w #0xd1a, w0 - efa: 61 fc 07 rcall . + 0xFFFFF8C4 - efc: f2 ff 37 bra . + 0xFFFFFFE6 - -00000efe <.L114>: - efe: 40 00 90 mov.w [w0+8], w0 - f00: c0 04 90 mov.w [w0+8], w9 - f02: de ff 37 bra . + 0xFFFFFFBE - -00000f04 <.L125>: - f04: 71 68 88 mov.w w1, 0xd0e - f06: 6c 09 b9 mul.su w1, #0xc, w2 - f08: 20 d4 20 mov.w #0xd42, w0 - f0a: 02 00 40 add.w w0, w2, w0 - f0c: 88 00 78 mov.w w8, w1 - f0e: 57 fc 07 rcall . + 0xFFFFF8B0 - f10: e8 ff 37 bra . + 0xFFFFFFD2 - -00000f12 <_vTaskSetTimeOutState>: - f12: 61 68 80 mov.w 0xd0c, w1 - f14: 01 08 78 mov.w w1, [w0] - f16: 42 68 80 mov.w 0xd08, w2 - f18: 53 68 80 mov.w 0xd0a, w3 - f1a: 12 00 98 mov.w w2, [w0+2] - f1c: 23 00 98 mov.w w3, [w0+4] - f1e: 00 00 06 return - -00000f20 <_xTaskCheckForTimeOut>: - f20: 00 03 be mov.d w0, w6 - f22: 60 68 80 mov.w 0xd0c, w0 - f24: 96 0f 10 subr.w w0, [w6], [w15] - f26: 19 00 32 bra Z, . + 0x34 - f28: 40 68 80 mov.w 0xd08, w0 - f2a: 51 68 80 mov.w 0xd0a, w1 - f2c: 16 01 90 mov.w [w6+2], w2 - f2e: a6 01 90 mov.w [w6+4], w3 - f30: 80 0f 51 sub.w w2, w0, [w15] - f32: 81 8f 59 subb.w w3, w1, [w15] - f34: 08 00 36 bra LEU, . + 0x12 - f36: 40 68 80 mov.w 0xd08, w0 - f38: 51 68 80 mov.w 0xd0a, w1 - f3a: 17 02 be mov.d [w7], w4 - f3c: 02 00 50 sub.w w0, w2, w0 - f3e: 83 80 58 subb.w w1, w3, w1 - f40: 84 0f 50 sub.w w0, w4, [w15] - f42: 85 8f 58 subb.w w1, w5, [w15] - f44: 01 00 39 bra NC, . + 0x4 - -00000f46 <.L134>: - f46: 10 00 05 retlw.w #0x1, w0 - -00000f48 <.L140>: - f48: 40 68 80 mov.w 0xd08, w0 - f4a: 51 68 80 mov.w 0xd0a, w1 - f4c: 02 00 50 sub.w w0, w2, w0 - f4e: 83 80 58 subb.w w1, w3, w1 - f50: 80 1b 52 sub.w w4, w0, [w7++] - f52: 81 93 5a subb.w w5, w1, [w7--] - f54: 06 00 78 mov.w w6, w0 - f56: dd ff 07 rcall . + 0xFFFFFFBC - f58: 00 00 05 retlw.w #0x0, w0 - -00000f5a <.L138>: - f5a: 16 01 90 mov.w [w6+2], w2 - f5c: a6 01 90 mov.w [w6+4], w3 - f5e: 40 68 80 mov.w 0xd08, w0 - f60: 51 68 80 mov.w 0xd0a, w1 - f62: 17 02 be mov.d [w7], w4 - f64: 02 00 50 sub.w w0, w2, w0 - f66: 83 80 58 subb.w w1, w3, w1 - f68: 84 0f 50 sub.w w0, w4, [w15] - f6a: 85 8f 58 subb.w w1, w5, [w15] - f6c: ec ff 31 bra C, . + 0xFFFFFFDA - f6e: ec ff 37 bra . + 0xFFFFFFDA - -00000f70 <_vTaskMissedYield>: - f70: 10 00 20 mov.w #0x1, w0 - f72: 30 68 88 mov.w w0, 0xd06 - f74: 00 00 06 return - -00000f76 <_prvIdleTask>: - f76: ff ff 37 bra . - -00000f78 <_xTaskCreate>: - f78: e6 87 47 add.w w15, #0x6, w15 - f7a: 88 9f be mov.d w8, [w15++] - f7c: 8a 9f be mov.d w10, [w15++] - f7e: 8c 9f be mov.d w12, [w15++] - f80: 8e 1f 78 mov.w w14, [w15++] - f82: 00 07 78 mov.w w0, w14 - f84: 01 05 78 mov.w w1, w10 - f86: 02 04 78 mov.w w2, w8 - f88: 83 06 78 mov.w w3, w13 - f8a: 04 06 78 mov.w w4, w12 - f8c: 85 bf 9f mov.w w5, [w15-16] - f8e: 20 02 20 mov.w #0x22, w0 - f90: 74 02 07 rcall . + 0x4EA - f92: 80 04 78 mov.w w0, w9 - f94: 00 80 eb setm.w w0 - f96: 09 00 e0 cp0.w w9 - f98: 49 00 32 bra Z, . + 0x94 - f9a: 08 04 44 add.w w8, w8, w8 - f9c: 08 00 78 mov.w w8, w0 - f9e: 6d 02 07 rcall . + 0x4DC - fa0: e0 0c 98 mov.w w0, [w9+28] - fa2: 00 00 e0 cp0.w w0 - fa4: 84 00 32 bra Z, . + 0x10A - fa6: 08 01 78 mov.w w8, w2 - fa8: 51 0a 20 mov.w #0xa5, w1 - faa: f5 f8 07 rcall . + 0xFFFFF1EC - fac: 7e 80 44 add.w w9, #0x1e, w0 - fae: 42 00 20 mov.w #0x4, w2 - fb0: 8a 00 78 mov.w w10, w1 - fb2: f8 f8 07 rcall . + 0xFFFFF1F2 - fb4: 00 40 eb clr.b w0 - fb6: 90 64 98 mov.b w0, [w9+33] - fb8: 30 00 20 mov.w #0x3, w0 - fba: 3a 00 20 mov.w #0x3, w10 - fbc: 0b 00 20 mov.w #0x0, w11 - fbe: 80 0f 56 sub.w w12, w0, [w15] - fc0: 3b 00 36 bra LEU, . + 0x78 - fc2: d0 0c 98 mov.w w0, [w9+26] - fc4: 09 80 e8 inc2.w w9, w0 - fc6: f0 b7 9f mov.w w0, [w15-18] - fc8: f7 fb 07 rcall . + 0xFFFFF7F0 - fca: 6e 84 44 add.w w9, #0xe, w8 - fcc: 08 00 78 mov.w w8, w0 - fce: f4 fb 07 rcall . + 0xFFFFF7EA - fd0: d9 04 98 mov.w w9, [w9+10] - fd2: 64 00 15 subr.w w10, #0x4, w0 - fd4: e0 80 1d subbr.w w11, #0x0, w1 - fd6: 00 8c be mov.d w0, [w8] - fd8: b9 0c 98 mov.w w9, [w9+22] - fda: 69 08 90 mov.w [w9+28], w0 - fdc: 0d 01 78 mov.w w13, w2 - fde: 8e 00 78 mov.w w14, w1 - fe0: af 01 07 rcall . + 0x360 - fe2: 80 0c 78 mov.w w0, [w9] - fe4: 2f 02 07 rcall . + 0x460 - fe6: 14 2d ec inc.w 0xd14 - fe8: a0 68 80 mov.w 0xd14, w0 - fea: e1 0f 50 sub.w w0, #0x1, [w15] - fec: 4c 00 32 bra Z, . + 0x9A - -00000fee <.L161>: - fee: 2b d4 20 mov.w #0xd42, w11 - ff0: 16 0d e2 cp0.w 0xd16 - ff2: 43 00 32 bra Z, . + 0x88 - -00000ff4 <.L165>: - ff4: d9 08 90 mov.w [w9+26], w1 - ff6: c0 68 80 mov.w 0xd18, w0 - ff8: 80 8f 50 sub.w w1, w0, [w15] - ffa: 01 00 36 bra LEU, . + 0x4 - ffc: c1 68 88 mov.w w1, 0xd18 - -00000ffe <.L168>: - ffe: 70 68 80 mov.w 0xd0e, w0 - 1000: 80 8f 50 sub.w w1, w0, [w15] - 1002: 01 00 36 bra LEU, . + 0x4 - 1004: 71 68 88 mov.w w1, 0xd0e - -00001006 <.L170>: - 1006: 6c 08 b9 mul.su w1, #0xc, w0 - 1008: 00 80 45 add.w w11, w0, w0 - 100a: ff b0 97 mov.w [w15-18], w1 - 100c: d8 fb 07 rcall . + 0xFFFFF7B2 - 100e: 1d 02 07 rcall . + 0x43C - 1010: 0f b8 97 mov.w [w15-16], w0 - 1012: 00 00 e0 cp0.w w0 - 1014: 01 00 32 bra Z, . + 0x4 - 1016: 09 08 78 mov.w w9, [w0] - -00001018 <.L172>: - 1018: 16 0d e2 cp0.w 0xd16 - 101a: 27 00 32 bra Z, . + 0x50 - 101c: d0 6d 80 mov.w 0xdba, w0 - 101e: 50 08 90 mov.w [w0+26], w0 - 1020: 8c 0f 50 sub.w w0, w12, [w15] - 1022: 23 00 31 bra C, . + 0x48 - 1024: ca 13 02 call 0x13ca <_vPortYield> - 1026: 00 00 00 - 1028: 00 00 00 nop - 102a: 10 00 20 mov.w #0x1, w0 - -0000102c <.L155>: - 102c: 4f 07 78 mov.w [--w15], w14 - 102e: 4f 06 be mov.d [--w15], w12 - 1030: 4f 05 be mov.d [--w15], w10 - 1032: 4f 04 be mov.d [--w15], w8 - 1034: 6f 00 b1 sub.w #0x6, w15 - 1036: 00 00 06 return - -00001038 <.L184>: - 1038: 61 65 b8 mul.uu w12, #0x1, w10 - 103a: 0c 00 78 mov.w w12, w0 - 103c: d0 0c 98 mov.w w0, [w9+26] - 103e: 09 80 e8 inc2.w w9, w0 - 1040: f0 b7 9f mov.w w0, [w15-18] - 1042: ba fb 07 rcall . + 0xFFFFF776 - 1044: 6e 84 44 add.w w9, #0xe, w8 - 1046: 08 00 78 mov.w w8, w0 - 1048: b7 fb 07 rcall . + 0xFFFFF770 - 104a: d9 04 98 mov.w w9, [w9+10] - 104c: 64 00 15 subr.w w10, #0x4, w0 - 104e: e0 80 1d subbr.w w11, #0x0, w1 - 1050: 00 8c be mov.d w0, [w8] - 1052: b9 0c 98 mov.w w9, [w9+22] - 1054: 69 08 90 mov.w [w9+28], w0 - 1056: 0d 01 78 mov.w w13, w2 - 1058: 8e 00 78 mov.w w14, w1 - 105a: 72 01 07 rcall . + 0x2E6 - 105c: 80 0c 78 mov.w w0, [w9] - 105e: f2 01 07 rcall . + 0x3E6 - 1060: 14 2d ec inc.w 0xd14 - 1062: a0 68 80 mov.w 0xd14, w0 - 1064: e1 0f 50 sub.w w0, #0x1, [w15] - 1066: c3 ff 3a bra NZ, . + 0xFFFFFF88 - 1068: 0e 00 37 bra . + 0x1E - -0000106a <.L174>: - 106a: 10 00 20 mov.w #0x1, w0 - 106c: 4f 07 78 mov.w [--w15], w14 - 106e: 4f 06 be mov.d [--w15], w12 - 1070: 4f 05 be mov.d [--w15], w10 - 1072: 4f 04 be mov.d [--w15], w8 - 1074: 6f 00 b1 sub.w #0x6, w15 - 1076: 00 00 06 return - 1078: df ff 37 bra . + 0xFFFFFFC0 - -0000107a <.L186>: - 107a: d0 6d 80 mov.w 0xdba, w0 - 107c: 50 08 90 mov.w [w0+26], w0 - 107e: 80 0f 56 sub.w w12, w0, [w15] - 1080: b9 ff 39 bra NC, . + 0xFFFFFF74 - 1082: d9 6d 88 mov.w w9, 0xdba - 1084: b7 ff 37 bra . + 0xFFFFFF70 - -00001086 <.L185>: - 1086: d9 6d 88 mov.w w9, 0xdba - 1088: 2b d4 20 mov.w #0xd42, w11 - 108a: 0b 04 78 mov.w w11, w8 - 108c: 2a d7 20 mov.w #0xd72, w10 - -0000108e <.L163>: - 108e: 08 00 78 mov.w w8, w0 - 1090: 8b fb 07 rcall . + 0xFFFFF718 - 1092: 6c 04 44 add.w w8, #0xc, w8 - 1094: 88 0f 55 sub.w w10, w8, [w15] - 1096: fb ff 3a bra NZ, . + 0xFFFFFFF8 - 1098: 60 d3 20 mov.w #0xd36, w0 - 109a: 86 fb 07 rcall . + 0xFFFFF70E - 109c: a0 d2 20 mov.w #0xd2a, w0 - 109e: 84 fb 07 rcall . + 0xFFFFF70A - 10a0: a0 d1 20 mov.w #0xd1a, w0 - 10a2: 82 fb 07 rcall . + 0xFFFFF706 - 10a4: 60 d3 20 mov.w #0xd36, w0 - 10a6: 40 69 88 mov.w w0, 0xd28 - 10a8: a0 d2 20 mov.w #0xd2a, w0 - 10aa: 30 69 88 mov.w w0, 0xd26 - 10ac: a3 ff 37 bra . + 0xFFFFFF48 - -000010ae <.L183>: - 10ae: 09 00 78 mov.w w9, w0 - 10b0: ff 01 07 rcall . + 0x400 - 10b2: 00 80 eb setm.w w0 - 10b4: 4f 07 78 mov.w [--w15], w14 - 10b6: 4f 06 be mov.d [--w15], w12 - 10b8: 4f 05 be mov.d [--w15], w10 - 10ba: 4f 04 be mov.d [--w15], w8 - 10bc: 6f 00 b1 sub.w #0x6, w15 - 10be: 00 00 06 return - 10c0: bb ff 37 bra . + 0xFFFFFF78 - -000010c2 <_vTaskStartScheduler>: - 10c2: 80 02 eb clr.w w5 - 10c4: 05 02 78 mov.w w5, w4 - 10c6: 85 01 78 mov.w w5, w3 - 10c8: 92 06 20 mov.w #0x69, w2 - 10ca: 01 a5 29 mov.w #0x9a50, w1 - 10cc: 60 f7 20 mov.w #0xf76, w0 - 10ce: 54 ff 07 rcall . + 0xFFFFFEAA - 10d0: e1 0f 50 sub.w w0, #0x1, [w15] - 10d2: 01 00 32 bra Z, . + 0x4 - 10d4: 00 00 06 return - -000010d6 <.L194>: - 10d6: 42 a0 a8 bset.b 0x42, #0x5 - 10d8: b0 68 88 mov.w w0, 0xd16 - 10da: 08 2d ef clr.w 0xd08 - 10dc: 0a 2d ef clr.w 0xd0a - 10de: 44 01 37 bra . + 0x28A - -000010e0 <_vCoRoutineAddToDelayedList>: - 10e0: 88 9f be mov.d w8, [w15++] - 10e2: 8a 1f 78 mov.w w10, [w15++] - 10e4: 00 04 be mov.d w0, w8 - 10e6: 02 05 78 mov.w w2, w10 - 10e8: a0 6b 80 mov.w 0xd74, w0 - 10ea: b1 6b 80 mov.w 0xd76, w1 - 10ec: 08 04 40 add.w w0, w8, w8 - 10ee: 89 84 48 addc.w w1, w9, w9 - 10f0: bc 8d ec inc2.w 0xdbc, WREG - 10f2: 97 fb 07 rcall . + 0xFFFFF730 - 10f4: e2 6d 80 mov.w 0xdbc, w2 - 10f6: 18 01 98 mov.w w8, [w2+2] - 10f8: 29 01 98 mov.w w9, [w2+4] - 10fa: a0 6b 80 mov.w 0xd74, w0 - 10fc: b1 6b 80 mov.w 0xd76, w1 - 10fe: 80 0f 54 sub.w w8, w0, [w15] - 1100: 81 8f 5c subb.w w9, w1, [w15] - 1102: 0c 00 31 bra C, . + 0x1A - 1104: 82 80 e8 inc2.w w2, w1 - 1106: 60 6c 80 mov.w 0xd8c, w0 - 1108: 65 fb 07 rcall . + 0xFFFFF6CC - -0000110a <.L4>: - 110a: 0a 00 e0 cp0.w w10 - 110c: 04 00 32 bra Z, . + 0xA - 110e: e1 6d 80 mov.w 0xdbc, w1 - 1110: ee 80 40 add.w w1, #0xe, w1 - 1112: 0a 00 78 mov.w w10, w0 - 1114: 5f fb 07 rcall . + 0xFFFFF6C0 - -00001116 <.L7>: - 1116: 4f 05 78 mov.w [--w15], w10 - 1118: 4f 04 be mov.d [--w15], w8 - 111a: 00 00 06 return - -0000111c <.L2>: - 111c: 82 80 e8 inc2.w w2, w1 - 111e: 70 6c 80 mov.w 0xd8e, w0 - 1120: 59 fb 07 rcall . + 0xFFFFF6B4 - 1122: f3 ff 37 bra . + 0xFFFFFFE8 - -00001124 <_vCoRoutineSchedule>: - 1124: 88 9f be mov.d w8, [w15++] - 1126: 8a 1f 78 mov.w w10, [w15++] - 1128: 8a da 20 mov.w #0xda8, w10 - 112a: 80 0d e2 cp0.w 0xd80 - 112c: 16 00 32 bra Z, . + 0x2E - -0000112e <.L12>: - 112e: 42 a0 a8 bset.b 0x42, #0x5 - 1130: 00 6c 80 mov.w 0xd80, w0 - 1132: 00 00 e0 cp0.w w0 - 1134: 7f 00 3a bra NZ, . + 0x100 - 1136: 00 04 78 mov.w w0, w8 - -00001138 <.L15>: - 1138: 6e 00 44 add.w w8, #0xe, w0 - 113a: 73 fb 07 rcall . + 0xFFFFF6E8 - 113c: 42 a0 a9 bclr.b 0x42, #0x5 - 113e: 88 84 e8 inc2.w w8, w9 - 1140: 09 00 78 mov.w w9, w0 - 1142: 6f fb 07 rcall . + 0xFFFFF6E0 - 1144: d8 08 90 mov.w [w8+26], w1 - 1146: 90 6b 80 mov.w 0xd72, w0 - 1148: 80 8f 50 sub.w w1, w0, [w15] - 114a: 01 00 36 bra LEU, . + 0x4 - 114c: 91 6b 88 mov.w w1, 0xd72 - -0000114e <.L16>: - 114e: 6c 08 b9 mul.su w1, #0xc, w0 - 1150: 00 00 45 add.w w10, w0, w0 - 1152: 89 00 78 mov.w w9, w1 - 1154: 34 fb 07 rcall . + 0xFFFFF66A - 1156: 80 0d e2 cp0.w 0xd80 - 1158: ea ff 3a bra NZ, . + 0xFFFFFFD6 - -0000115a <.L11>: - 115a: 5c fe 07 rcall . + 0xFFFFFCBA - 115c: e2 6b 80 mov.w 0xd7c, w2 - 115e: f3 6b 80 mov.w 0xd7e, w3 - 1160: 02 00 50 sub.w w0, w2, w0 - 1162: 83 80 58 subb.w w1, w3, w1 - 1164: c0 6b 88 mov.w w0, 0xd78 - 1166: d1 6b 88 mov.w w1, 0xd7a - -00001168 <.L54>: - 1168: c0 6b 80 mov.w 0xd78, w0 - 116a: d1 6b 80 mov.w 0xd7a, w1 - 116c: e0 0f 50 sub.w w0, #0x0, [w15] - 116e: e0 8f 58 subb.w w1, #0x0, [w15] - 1170: 44 00 32 bra Z, . + 0x8A - -00001172 <.L19>: - 1172: a4 6b 80 mov.w 0xd74, w4 - 1174: b5 6b 80 mov.w 0xd76, w5 - 1176: 61 01 42 add.w w4, #0x1, w2 - 1178: e0 81 4a addc.w w5, #0x0, w3 - 117a: a2 6b 88 mov.w w2, 0xd74 - 117c: b3 6b 88 mov.w w3, 0xd76 - 117e: 61 00 50 sub.w w0, #0x1, w0 - 1180: e0 80 58 subb.w w1, #0x0, w1 - 1182: c0 6b 88 mov.w w0, 0xd78 - 1184: d1 6b 88 mov.w w1, 0xd7a - 1186: e0 0f 51 sub.w w2, #0x0, [w15] - 1188: e0 8f 59 subb.w w3, #0x0, [w15] - 118a: 04 00 3a bra NZ, . + 0xA - 118c: 70 6c 80 mov.w 0xd8e, w0 - 118e: 65 6c 80 mov.w 0xd8c, w5 - 1190: 75 6c 88 mov.w w5, 0xd8e - 1192: 60 6c 88 mov.w w0, 0xd8c - -00001194 <.L20>: - 1194: 70 6c 80 mov.w 0xd8e, w0 - 1196: 10 00 e0 cp0.w [w0] - 1198: e7 ff 32 bra Z, . + 0xFFFFFFD0 - 119a: 40 00 90 mov.w [w0+8], w0 - 119c: 40 00 90 mov.w [w0+8], w0 - 119e: 00 04 78 mov.w w0, w8 - 11a0: 00 00 e0 cp0.w w0 - 11a2: e2 ff 32 bra Z, . + 0xFFFFFFC6 - 11a4: a0 00 90 mov.w [w0+4], w1 - 11a6: 10 00 90 mov.w [w0+2], w0 - 11a8: 80 0f 51 sub.w w2, w0, [w15] - 11aa: 81 8f 59 subb.w w3, w1, [w15] - 11ac: dd ff 39 bra NC, . + 0xFFFFFFBC - -000011ae <.L51>: - 11ae: 42 a0 a8 bset.b 0x42, #0x5 - 11b0: 88 84 e8 inc2.w w8, w9 - 11b2: 09 00 78 mov.w w9, w0 - 11b4: 36 fb 07 rcall . + 0xFFFFF66E - 11b6: 48 08 90 mov.w [w8+24], w0 - 11b8: 00 00 e0 cp0.w w0 - 11ba: 02 00 32 bra Z, . + 0x6 - 11bc: 6e 00 44 add.w w8, #0xe, w0 - 11be: 31 fb 07 rcall . + 0xFFFFF664 - -000011c0 <.L25>: - 11c0: 42 a0 a9 bclr.b 0x42, #0x5 - 11c2: d8 08 90 mov.w [w8+26], w1 - 11c4: 90 6b 80 mov.w 0xd72, w0 - 11c6: 80 8f 50 sub.w w1, w0, [w15] - 11c8: 01 00 36 bra LEU, . + 0x4 - 11ca: 91 6b 88 mov.w w1, 0xd72 - -000011cc <.L27>: - 11cc: 6c 08 b9 mul.su w1, #0xc, w0 - 11ce: 00 00 45 add.w w10, w0, w0 - 11d0: 89 00 78 mov.w w9, w1 - 11d2: f5 fa 07 rcall . + 0xFFFFF5EC - 11d4: 70 6c 80 mov.w 0xd8e, w0 - 11d6: 10 00 e0 cp0.w [w0] - 11d8: c7 ff 32 bra Z, . + 0xFFFFFF90 - 11da: 40 00 90 mov.w [w0+8], w0 - 11dc: 40 04 90 mov.w [w0+8], w8 - 11de: 08 00 e0 cp0.w w8 - 11e0: c3 ff 32 bra Z, . + 0xFFFFFF88 - 11e2: 18 01 90 mov.w [w8+2], w2 - 11e4: a8 01 90 mov.w [w8+4], w3 - 11e6: a0 6b 80 mov.w 0xd74, w0 - 11e8: b1 6b 80 mov.w 0xd76, w1 - 11ea: 80 0f 51 sub.w w2, w0, [w15] - 11ec: 81 8f 59 subb.w w3, w1, [w15] - 11ee: df ff 36 bra LEU, . + 0xFFFFFFC0 - 11f0: c0 6b 80 mov.w 0xd78, w0 - 11f2: d1 6b 80 mov.w 0xd7a, w1 - 11f4: e0 0f 50 sub.w w0, #0x0, [w15] - 11f6: e0 8f 58 subb.w w1, #0x0, [w15] - 11f8: bc ff 3a bra NZ, . + 0xFFFFFF7A - -000011fa <.L57>: - 11fa: a0 6b 80 mov.w 0xd74, w0 - 11fc: b1 6b 80 mov.w 0xd76, w1 - 11fe: e0 6b 88 mov.w w0, 0xd7c - 1200: f1 6b 88 mov.w w1, 0xd7e - 1202: 94 6b 80 mov.w 0xd72, w4 - 1204: 6c 20 b9 mul.su w4, #0xc, w0 - 1206: 80 00 78 mov.w w0, w1 - 1208: 0a 01 40 add.w w0, w10, w2 - 120a: 92 02 78 mov.w [w2], w5 - 120c: 05 00 e0 cp0.w w5 - 120e: 16 00 3a bra NZ, . + 0x2E - 1210: 04 00 e0 cp0.w w4 - 1212: 0d 00 32 bra Z, . + 0x1C - 1214: c0 d9 20 mov.w #0xd9c, w0 - 1216: 00 80 40 add.w w1, w0, w0 - 1218: 84 01 78 mov.w w4, w3 - 121a: 85 00 78 mov.w w5, w1 - -0000121c <.L34>: - 121c: 83 01 e9 dec.w w3, w3 - 121e: 00 01 78 mov.w w0, w2 - 1220: 10 00 e0 cp0.w [w0] - 1222: 0b 00 3a bra NZ, . + 0x18 - 1224: 81 00 e8 inc.w w1, w1 - 1226: 6c 00 50 sub.w w0, #0xc, w0 - 1228: 84 8f 50 sub.w w1, w4, [w15] - 122a: f8 ff 3a bra NZ, . + 0xFFFFFFF2 - 122c: 93 6b 88 mov.w w3, 0xd72 - -0000122e <.L42>: - 122e: 4f 05 78 mov.w [--w15], w10 - 1230: 4f 04 be mov.d [--w15], w8 - 1232: 00 00 06 return - -00001234 <.L13>: - 1234: 40 6c 80 mov.w 0xd88, w0 - 1236: 40 04 90 mov.w [w0+8], w8 - 1238: 7f ff 37 bra . + 0xFFFFFF00 - -0000123a <.L58>: - 123a: 93 6b 88 mov.w w3, 0xd72 - -0000123c <.L32>: - 123c: 92 00 90 mov.w [w2+2], w1 - 123e: a1 00 90 mov.w [w1+4], w1 - 1240: 11 01 98 mov.w w1, [w2+2] - 1242: 64 00 41 add.w w2, #0x4, w0 - 1244: 80 8f 50 sub.w w1, w0, [w15] - 1246: 09 00 32 bra Z, . + 0x14 - 1248: 41 00 90 mov.w [w1+8], w0 - 124a: e0 6d 88 mov.w w0, 0xdbc - 124c: e0 08 90 mov.w [w0+28], w1 - 124e: 10 01 78 mov.w [w0], w2 - 1250: 02 00 01 call w2 - -00001252 <.L60>: - 1252: 4f 05 78 mov.w [--w15], w10 - 1254: 4f 04 be mov.d [--w15], w8 - 1256: 00 00 06 return - 1258: ed ff 37 bra . + 0xFFFFFFDC - -0000125a <.L59>: - 125a: a1 00 90 mov.w [w1+4], w1 - 125c: 11 01 98 mov.w w1, [w2+2] - 125e: 41 00 90 mov.w [w1+8], w0 - 1260: e0 6d 88 mov.w w0, 0xdbc - 1262: e0 08 90 mov.w [w0+28], w1 - 1264: 10 01 78 mov.w [w0], w2 - 1266: 02 00 01 call w2 - 1268: f4 ff 37 bra . + 0xFFFFFFEA - -0000126a <_xCoRoutineCreate>: - 126a: 88 9f be mov.d w8, [w15++] - 126c: 8a 9f be mov.d w10, [w15++] - 126e: 80 05 78 mov.w w0, w11 - 1270: 02 04 78 mov.w w2, w8 - 1272: 00 02 20 mov.w #0x20, w0 - 1274: 02 01 07 rcall . + 0x206 - 1276: 80 04 78 mov.w w0, w9 - 1278: 00 80 eb setm.w w0 - 127a: 09 00 e0 cp0.w w9 - 127c: 1d 00 32 bra Z, . + 0x3C - 127e: bc 0d e2 cp0.w 0xdbc - 1280: 26 00 32 bra Z, . + 0x4E - 1282: 00 00 eb clr.w w0 - 1284: f0 0c 98 mov.w w0, [w9+30] - 1286: 00 80 eb setm.w w0 - 1288: d0 0c 98 mov.w w0, [w9+26] - 128a: e8 0c 98 mov.w w8, [w9+28] - 128c: 09 05 78 mov.w w9, w10 - 128e: 0b 1d 78 mov.w w11, [w10++] - 1290: 0a 00 78 mov.w w10, w0 - 1292: 92 fa 07 rcall . + 0xFFFFF526 - 1294: 6e 84 44 add.w w9, #0xe, w8 - 1296: 08 00 78 mov.w w8, w0 - 1298: 8f fa 07 rcall . + 0xFFFFF520 - 129a: d9 04 98 mov.w w9, [w9+10] - 129c: b9 0c 98 mov.w w9, [w9+22] - 129e: 50 00 20 mov.w #0x5, w0 - 12a0: f1 ff 2f mov.w #0xffff, w1 - 12a2: 00 8c be mov.d w0, [w8] - 12a4: d9 08 90 mov.w [w9+26], w1 - 12a6: 90 6b 80 mov.w 0xd72, w0 - 12a8: 80 8f 50 sub.w w1, w0, [w15] - 12aa: 09 00 3e bra GTU, . + 0x14 - -000012ac <.L69>: - 12ac: 6c 09 b9 mul.su w1, #0xc, w2 - 12ae: 80 da 20 mov.w #0xda8, w0 - 12b0: 02 00 40 add.w w0, w2, w0 - 12b2: 8a 00 78 mov.w w10, w1 - 12b4: 84 fa 07 rcall . + 0xFFFFF50A - 12b6: 10 00 20 mov.w #0x1, w0 - -000012b8 <.L66>: - 12b8: 4f 05 be mov.d [--w15], w10 - 12ba: 4f 04 be mov.d [--w15], w8 - 12bc: 00 00 06 return - -000012be <.L74>: - 12be: 91 6b 88 mov.w w1, 0xd72 - 12c0: 6c 09 b9 mul.su w1, #0xc, w2 - 12c2: 80 da 20 mov.w #0xda8, w0 - 12c4: 02 00 40 add.w w0, w2, w0 - 12c6: 8a 00 78 mov.w w10, w1 - 12c8: 7a fa 07 rcall . + 0xFFFFF4F6 - 12ca: 10 00 20 mov.w #0x1, w0 - 12cc: f5 ff 37 bra . + 0xFFFFFFEC - -000012ce <.L73>: - 12ce: e9 6d 88 mov.w w9, 0xdbc - 12d0: c0 d9 20 mov.w #0xd9c, w0 - 12d2: 6a fa 07 rcall . + 0xFFFFF4D6 - 12d4: 00 d9 20 mov.w #0xd90, w0 - 12d6: 68 fa 07 rcall . + 0xFFFFF4D2 - 12d8: 00 d8 20 mov.w #0xd80, w0 - 12da: 66 fa 07 rcall . + 0xFFFFF4CE - 12dc: c0 d9 20 mov.w #0xd9c, w0 - 12de: 70 6c 88 mov.w w0, 0xd8e - 12e0: 00 d9 20 mov.w #0xd90, w0 - 12e2: 60 6c 88 mov.w w0, 0xd8c - 12e4: 00 00 eb clr.w w0 - 12e6: f0 0c 98 mov.w w0, [w9+30] - 12e8: 00 80 eb setm.w w0 - 12ea: d0 0c 98 mov.w w0, [w9+26] - 12ec: e8 0c 98 mov.w w8, [w9+28] - 12ee: 09 05 78 mov.w w9, w10 - 12f0: 0b 1d 78 mov.w w11, [w10++] - 12f2: 0a 00 78 mov.w w10, w0 - 12f4: 61 fa 07 rcall . + 0xFFFFF4C4 - 12f6: 6e 84 44 add.w w9, #0xe, w8 - 12f8: 08 00 78 mov.w w8, w0 - 12fa: 5e fa 07 rcall . + 0xFFFFF4BE - 12fc: d9 04 98 mov.w w9, [w9+10] - 12fe: b9 0c 98 mov.w w9, [w9+22] - 1300: 50 00 20 mov.w #0x5, w0 - 1302: f1 ff 2f mov.w #0xffff, w1 - 1304: 00 8c be mov.d w0, [w8] - 1306: d9 08 90 mov.w [w9+26], w1 - 1308: 90 6b 80 mov.w 0xd72, w0 - 130a: 80 8f 50 sub.w w1, w0, [w15] - 130c: cf ff 36 bra LEU, . + 0xFFFFFFA0 - 130e: d7 ff 37 bra . + 0xFFFFFFB0 - -00001310 <_xCoRoutineRemoveFromEventList>: - 1310: 88 9f be mov.d w8, [w15++] - 1312: 90 00 78 mov.w [w0], w1 - 1314: 01 00 e0 cp0.w w1 - 1316: 12 00 32 bra Z, . + 0x26 - 1318: 40 00 90 mov.w [w0+8], w0 - 131a: c0 04 90 mov.w [w0+8], w9 - -0000131c <.L79>: - 131c: 6e 84 44 add.w w9, #0xe, w8 - 131e: 08 00 78 mov.w w8, w0 - 1320: 80 fa 07 rcall . + 0xFFFFF502 - 1322: 88 00 78 mov.w w8, w1 - 1324: 00 d8 20 mov.w #0xd80, w0 - 1326: 4b fa 07 rcall . + 0xFFFFF498 - 1328: 00 01 eb clr.w w2 - 132a: d9 08 90 mov.w [w9+26], w1 - 132c: e0 6d 80 mov.w 0xdbc, w0 - 132e: 50 08 90 mov.w [w0+26], w0 - 1330: 80 8f 50 sub.w w1, w0, [w15] - 1332: 01 00 39 bra NC, . + 0x4 - 1334: 12 00 20 mov.w #0x1, w2 - -00001336 <.L80>: - 1336: 02 00 78 mov.w w2, w0 - 1338: 4f 04 be mov.d [--w15], w8 - 133a: 00 00 06 return - -0000133c <.L83>: - 133c: 81 04 78 mov.w w1, w9 - 133e: ee ff 37 bra . + 0xFFFFFFDE - -00001340 <_pxPortInitialiseStack>: - 1340: 01 08 78 mov.w w1, [w0] - 1342: 80 00 eb clr.w w1 - 1344: 11 00 98 mov.w w1, [w0+2] - 1346: 21 00 98 mov.w w1, [w0+4] - 1348: 32 00 98 mov.w w2, [w0+6] - 134a: e8 00 40 add.w w0, #0x8, w1 - 134c: 60 a5 29 mov.w #0x9a56, w0 - 134e: c2 a8 29 mov.w #0x9a8c, w2 - -00001350 <.L2>: - 1350: b0 18 78 mov.w [w0++], [w1++] - 1352: 80 0f 51 sub.w w2, w0, [w15] - 1354: fd ff 3a bra NZ, . + 0xFFFFFFFC - 1356: 20 02 80 mov.w 0x44, w0 - 1358: 80 08 78 mov.w w0, [w1] - 135a: 34 c0 bf mov.b 0x34, WREG - 135c: 00 80 fb ze w0, w0 - 135e: 90 00 98 mov.w w0, [w1+2] - 1360: 00 00 eb clr.w w0 - 1362: a0 00 98 mov.w w0, [w1+4] - 1364: 66 80 40 add.w w1, #0x6, w0 - 1366: 00 00 06 return - -00001368 <_xPortStartScheduler>: - 1368: 00 00 eb clr.w w0 - 136a: 20 08 88 mov.w w0, 0x104 - 136c: 00 08 88 mov.w w0, 0x100 - 136e: c0 12 20 mov.w #0x12c, w0 - 1370: 10 08 88 mov.w w0, 0x102 - 1372: 95 c0 bf mov.b 0x95, WREG - 1374: f1 c8 b3 mov.b #0x8f, w1 - 1376: 01 40 60 and.b w0, w1, w0 - 1378: 00 44 a0 bset.b w0, #0x4 - 137a: 95 e0 b7 mov.b WREG, 0x95 - 137c: 84 60 a9 bclr.b 0x84, #0x3 - 137e: 8c 60 a8 bset.b 0x8c, #0x3 - 1380: 04 c1 bf mov.b 0x104, WREG - 1382: f1 cc b3 mov.b #0xcf, w1 - 1384: 01 40 60 and.b w0, w1, w0 - 1386: 00 44 a0 bset.b w0, #0x4 - 1388: 04 e1 b7 mov.b WREG, 0x104 - 138a: 05 e1 a8 bset.b 0x105, #0x7 - 138c: d0 6d 80 mov.w 0xdba, w0 - 138e: 90 07 78 mov.w [w0], w15 - 1390: 4f 00 78 mov.w [--w15], w0 - 1392: f0 6d 88 mov.w w0, 0xdbe - 1394: 34 00 f9 pop 0x34 - 1396: 44 00 f9 pop 0x44 - 1398: 40 00 f9 pop 0x40 - 139a: 3e 00 f9 pop 0x3e - 139c: 3c 00 f9 pop 0x3c - 139e: 3a 00 f9 pop 0x3a - 13a0: 38 00 f9 pop 0x38 - 13a2: 2c 00 f9 pop 0x2c - 13a4: 2a 00 f9 pop 0x2a - 13a6: 28 00 f9 pop 0x28 - 13a8: 26 00 f9 pop 0x26 - 13aa: 24 00 f9 pop 0x24 - 13ac: 22 00 f9 pop 0x22 - 13ae: 32 00 f9 pop 0x32 - 13b0: 36 00 f9 pop 0x36 - 13b2: 4f 07 78 mov.w [--w15], w14 - 13b4: 4f 06 be mov.d [--w15], w12 - 13b6: 4f 05 be mov.d [--w15], w10 - 13b8: 4f 04 be mov.d [--w15], w8 - 13ba: 4f 03 be mov.d [--w15], w6 - 13bc: 4f 02 be mov.d [--w15], w4 - 13be: 4f 01 be mov.d [--w15], w2 - 13c0: 4f 00 be mov.d [--w15], w0 - 13c2: 42 00 f9 pop 0x42 - 13c4: 00 00 06 return - 13c6: 10 00 05 retlw.w #0x1, w0 - -000013c8 <_vPortEndScheduler>: - 13c8: 00 00 06 return - -000013ca <_vPortYield>: - 13ca: 42 00 f8 push 0x42 - 13cc: 80 1f 78 mov.w w0, [w15++] - 13ce: 00 02 20 mov.w #0x20, w0 - 13d0: 10 02 88 mov.w w0, 0x42 - 13d2: 81 1f 78 mov.w w1, [w15++] - 13d4: 82 9f be mov.d w2, [w15++] - 13d6: 84 9f be mov.d w4, [w15++] - 13d8: 86 9f be mov.d w6, [w15++] - 13da: 88 9f be mov.d w8, [w15++] - 13dc: 8a 9f be mov.d w10, [w15++] - 13de: 8c 9f be mov.d w12, [w15++] - 13e0: 8e 1f 78 mov.w w14, [w15++] - 13e2: 36 00 f8 push 0x36 - 13e4: 32 00 f8 push 0x32 - 13e6: 22 00 f8 push 0x22 - 13e8: 24 00 f8 push 0x24 - 13ea: 26 00 f8 push 0x26 - 13ec: 28 00 f8 push 0x28 - 13ee: 2a 00 f8 push 0x2a - 13f0: 2c 00 f8 push 0x2c - 13f2: 38 00 f8 push 0x38 - 13f4: 3a 00 f8 push 0x3a - 13f6: 3c 00 f8 push 0x3c - 13f8: 3e 00 f8 push 0x3e - 13fa: 40 00 f8 push 0x40 - 13fc: 44 00 f8 push 0x44 - 13fe: 34 00 f8 push 0x34 - 1400: f0 6d 80 mov.w 0xdbe, w0 - 1402: 80 1f 78 mov.w w0, [w15++] - 1404: d0 6d 80 mov.w 0xdba, w0 - 1406: 0f 08 78 mov.w w15, [w0] - 1408: 14 fd 07 rcall . + 0xFFFFFA2A - 140a: d0 6d 80 mov.w 0xdba, w0 - 140c: 90 07 78 mov.w [w0], w15 - 140e: 4f 00 78 mov.w [--w15], w0 - 1410: f0 6d 88 mov.w w0, 0xdbe - 1412: 34 00 f9 pop 0x34 - 1414: 44 00 f9 pop 0x44 - 1416: 40 00 f9 pop 0x40 - 1418: 3e 00 f9 pop 0x3e - 141a: 3c 00 f9 pop 0x3c - 141c: 3a 00 f9 pop 0x3a - 141e: 38 00 f9 pop 0x38 - 1420: 2c 00 f9 pop 0x2c - 1422: 2a 00 f9 pop 0x2a - 1424: 28 00 f9 pop 0x28 - 1426: 26 00 f9 pop 0x26 - 1428: 24 00 f9 pop 0x24 - 142a: 22 00 f9 pop 0x22 - 142c: 32 00 f9 pop 0x32 - 142e: 36 00 f9 pop 0x36 - 1430: 4f 07 78 mov.w [--w15], w14 - 1432: 4f 06 be mov.d [--w15], w12 - 1434: 4f 05 be mov.d [--w15], w10 - 1436: 4f 04 be mov.d [--w15], w8 - 1438: 4f 03 be mov.d [--w15], w6 - 143a: 4f 02 be mov.d [--w15], w4 - 143c: 4f 01 be mov.d [--w15], w2 - 143e: 4f 00 be mov.d [--w15], w0 - 1440: 42 00 f9 pop 0x42 - 1442: 00 00 06 return - -00001444 <_vPortEnterCritical>: - 1444: 42 a0 a8 bset.b 0x42, #0x5 - 1446: be 2d ec inc.w 0xdbe - 1448: 00 00 06 return - -0000144a <_vPortExitCritical>: - 144a: be 0d ed dec.w 0xdbe, WREG - 144c: f0 6d 88 mov.w w0, 0xdbe - 144e: 01 00 3a bra NZ, . + 0x4 - 1450: 42 a0 a9 bclr.b 0x42, #0x5 - -00001452 <.L28>: - 1452: 00 00 06 return - -00001454 <__T1Interrupt>: - 1454: 36 00 f8 push 0x36 - 1456: 80 9f be mov.d w0, [w15++] - 1458: 82 9f be mov.d w2, [w15++] - 145a: 84 9f be mov.d w4, [w15++] - 145c: 86 9f be mov.d w6, [w15++] - 145e: 34 00 f8 push 0x34 - 1460: 00 c0 b3 mov.b #0x0, w0 - 1462: a0 01 88 mov.w w0, 0x34 - 1464: fb fb 07 rcall . + 0xFFFFF7F8 - 1466: 84 60 a9 bclr.b 0x84, #0x3 - 1468: b0 ff 07 rcall . + 0xFFFFFF62 - 146a: 00 00 00 nop - 146c: 34 00 f9 pop 0x34 - 146e: 4f 03 be mov.d [--w15], w6 - 1470: 4f 02 be mov.d [--w15], w4 - 1472: 4f 01 be mov.d [--w15], w2 - 1474: 4f 00 be mov.d [--w15], w0 - 1476: 36 00 f9 pop 0x36 - 1478: 00 40 06 retfie - -0000147a <_pvPortMalloc>: - 147a: 88 1f 78 mov.w w8, [w15++] - 147c: 00 04 78 mov.w w0, w8 - 147e: 00 08 a3 btst.z w0, #0x0 - 1480: 02 00 32 bra Z, . + 0x6 - 1482: 00 00 a1 bclr.w w0, #0x0 - 1484: 00 84 e8 inc2.w w0, w8 - -00001486 <.L2>: - 1486: e4 fb 07 rcall . + 0xFFFFF7CA - 1488: 02 40 80 mov.w 0x800, w2 - 148a: 82 00 44 add.w w8, w2, w1 - 148c: f0 4f 20 mov.w #0x4ff, w0 - 148e: 80 8f 50 sub.w w1, w0, [w15] - 1490: 05 00 36 bra LEU, . + 0xC - -00001492 <.L4>: - 1492: 00 04 eb clr.w w8 - 1494: 38 fc 07 rcall . + 0xFFFFF872 - 1496: 08 00 78 mov.w w8, w0 - 1498: 4f 04 78 mov.w [--w15], w8 - 149a: 00 00 06 return - -0000149c <.L10>: - 149c: 81 0f 51 sub.w w2, w1, [w15] - 149e: f9 ff 31 bra C, . + 0xFFFFFFF4 - 14a0: 60 80 20 mov.w #0x806, w0 - 14a2: 00 04 41 add.w w2, w0, w8 - 14a4: 01 40 88 mov.w w1, 0x800 - 14a6: 2f fc 07 rcall . + 0xFFFFF860 - 14a8: 08 00 78 mov.w w8, w0 - 14aa: 4f 04 78 mov.w [--w15], w8 - 14ac: 00 00 06 return - 14ae: f6 ff 37 bra . + 0xFFFFFFEE - -000014b0 <_vPortFree>: - 14b0: 00 00 06 return - -000014b2 <_vPortInitialiseBlocks>: - 14b2: 00 28 ef clr.w 0x800 - 14b4: 00 00 06 return - -000014b6 <_canOpenChannel>: - 14b6: 80 80 eb setm.w w1 - 14b8: 00 00 e0 cp0.w w0 - 14ba: 29 00 3a bra NZ, . + 0x54 - 14bc: f0 8f 2f mov.w #0xf8ff, w0 - 14be: 90 23 b6 and.w 0x390 - 14c0: 91 43 a8 bset.b 0x391, #0x2 - 14c2: 01 08 20 mov.w #0x80, w1 - -000014c4 <.L5>: - 14c4: 80 1c 80 mov.w 0x390, w0 - 14c6: 00 0e b2 and.w #0xe0, w0 - 14c8: 81 0f 50 sub.w w0, w1, [w15] - 14ca: fc ff 3a bra NZ, . + 0xFFFFFFFA - 14cc: 92 23 ef clr.w 0x392 - 14ce: 50 08 20 mov.w #0x85, w0 - 14d0: a0 1c 88 mov.w w0, 0x394 - 14d2: 00 80 22 mov.w #0x2800, w0 - 14d4: 90 23 b7 ior.w 0x390 - 14d6: c2 ff 21 mov.w #0x1ffc, w2 - 14d8: 82 19 88 mov.w w2, 0x330 - 14da: f1 ff 20 mov.w #0xfff, w1 - 14dc: 91 19 88 mov.w w1, 0x332 - 14de: 00 c0 2f mov.w #0xfc00, w0 - 14e0: a0 19 88 mov.w w0, 0x334 - 14e2: c2 19 88 mov.w w2, 0x338 - 14e4: d1 19 88 mov.w w1, 0x33a - 14e6: e0 19 88 mov.w w0, 0x33c - 14e8: 02 18 88 mov.w w2, 0x300 - 14ea: 11 18 88 mov.w w1, 0x302 - 14ec: 20 18 88 mov.w w0, 0x304 - 14ee: 42 18 88 mov.w w2, 0x308 - 14f0: 51 18 88 mov.w w1, 0x30a - 14f2: 60 18 88 mov.w w0, 0x30c - 14f4: 82 18 88 mov.w w2, 0x310 - 14f6: 91 18 88 mov.w w1, 0x312 - 14f8: a0 18 88 mov.w w0, 0x314 - 14fa: c2 18 88 mov.w w2, 0x318 - 14fc: d1 18 88 mov.w w1, 0x31a - 14fe: e0 18 88 mov.w w0, 0x31c - 1500: 02 19 88 mov.w w2, 0x320 - 1502: 11 19 88 mov.w w1, 0x322 - 1504: 20 19 88 mov.w w0, 0x324 - 1506: 42 19 88 mov.w w2, 0x328 - 1508: 51 19 88 mov.w w1, 0x32a - 150a: 60 19 88 mov.w w0, 0x32c - 150c: 71 77 27 mov.w #0x7777, w1 - -0000150e <.L4>: - 150e: 01 00 78 mov.w w1, w0 - 1510: 00 00 06 return - -00001512 <_canSetBusParams>: - 1512: 02 00 fa lnk #0x2 - 1514: 88 1f 78 mov.w w8, [w15++] - 1516: 01 04 78 mov.w w1, w8 - 1518: e7 bf 9f mov.w w7, [w15-4] - 151a: e7 ff 2f mov.w #0xfffe, w7 - 151c: 71 77 27 mov.w #0x7777, w1 - 151e: 81 0f 50 sub.w w0, w1, [w15] - 1520: 04 00 32 bra Z, . + 0xA - -00001522 <.L15>: - 1522: 07 00 78 mov.w w7, w0 - 1524: 4f 04 78 mov.w [--w15], w8 - 1526: 00 80 fa ulnk - 1528: 00 00 06 return - -0000152a <.L31>: - 152a: e1 0f 51 sub.w w2, #0x1, [w15] - 152c: e0 8f 59 subb.w w3, #0x0, [w15] - 152e: 21 00 32 bra Z, . + 0x44 - 1530: 88 00 e9 dec.w w8, w1 - 1532: 04 02 e9 dec.w w4, w4 - 1534: 05 00 e9 dec.w w5, w0 - 1536: d7 ff 2f mov.w #0xfffd, w7 - 1538: e7 8f 50 sub.w w1, #0x7, [w15] - 153a: f3 ff 3e bra GTU, . + 0xFFFFFFE8 - 153c: c7 ff 2f mov.w #0xfffc, w7 - 153e: e7 0f 52 sub.w w4, #0x7, [w15] - 1540: f0 ff 3e bra GTU, . + 0xFFFFFFE2 - 1542: b7 ff 2f mov.w #0xfffb, w7 - 1544: e3 0f 50 sub.w w0, #0x3, [w15] - 1546: ed ff 3e bra GTU, . + 0xFFFFFFDC - 1548: e1 0f 53 sub.w w6, #0x1, [w15] - 154a: 26 00 3a bra NZ, . + 0x4E - -0000154c <.L25>: - 154c: 46 00 dd sl.w w0, #0x6, w0 - 154e: 00 0c b2 and.w #0xc0, w0 - 1550: 92 23 b7 ior.w 0x392 - 1552: 43 09 dd sl.w w1, #0x3, w2 - 1554: 82 03 b2 and.w #0x38, w2 - 1556: 48 20 dd sl.w w4, #0x8, w0 - 1558: 01 70 20 mov.w #0x700, w1 - 155a: 01 00 60 and.w w0, w1, w0 - 155c: 80 00 71 ior.w w2, w0, w1 - 155e: 45 30 dd sl.w w6, #0x5, w0 - 1560: 00 04 b2 and.w #0x40, w0 - 1562: 00 80 70 ior.w w1, w0, w0 - 1564: 94 23 b7 ior.w 0x394 - 1566: 80 03 eb clr.w w7 - -00001568 <.L34>: - 1568: 07 00 78 mov.w w7, w0 - 156a: 4f 04 78 mov.w [--w15], w8 - 156c: 00 80 fa ulnk - 156e: 00 00 06 return - 1570: dc ff 37 bra . + 0xFFFFFFBA - -00001572 <.L32>: - 1572: 16 00 20 mov.w #0x1, w6 - 1574: 86 00 78 mov.w w6, w1 - 1576: 24 00 20 mov.w #0x2, w4 - 1578: 06 00 78 mov.w w6, w0 - 157a: 46 00 dd sl.w w0, #0x6, w0 - 157c: 00 0c b2 and.w #0xc0, w0 - 157e: 92 23 b7 ior.w 0x392 - 1580: 43 09 dd sl.w w1, #0x3, w2 - 1582: 82 03 b2 and.w #0x38, w2 - 1584: 48 20 dd sl.w w4, #0x8, w0 - 1586: 01 70 20 mov.w #0x700, w1 - 1588: 01 00 60 and.w w0, w1, w0 - 158a: 80 00 71 ior.w w2, w0, w1 - 158c: 45 30 dd sl.w w6, #0x5, w0 - 158e: 00 04 b2 and.w #0x40, w0 - 1590: 00 80 70 ior.w w1, w0, w0 - 1592: 94 23 b7 ior.w 0x394 - 1594: 80 03 eb clr.w w7 - 1596: e8 ff 37 bra . + 0xFFFFFFD2 - -00001598 <.L33>: - 1598: a7 ff 2f mov.w #0xfffa, w7 - 159a: e3 0f 53 sub.w w6, #0x3, [w15] - 159c: d7 ff 32 bra Z, . + 0xFFFFFFB0 - 159e: 07 00 78 mov.w w7, w0 - 15a0: 4f 04 78 mov.w [--w15], w8 - 15a2: 00 80 fa ulnk - 15a4: 00 00 06 return - 15a6: c1 ff 37 bra . + 0xFFFFFF84 - -000015a8 <_canBusOn>: - 15a8: 00 81 eb setm.w w2 - 15aa: 71 77 27 mov.w #0x7777, w1 - 15ac: 81 0f 50 sub.w w0, w1, [w15] - 15ae: 02 00 32 bra Z, . + 0x6 - 15b0: 02 00 78 mov.w w2, w0 - 15b2: 00 00 06 return - -000015b4 <.L47>: - 15b4: f0 8f 2f mov.w #0xf8ff, w0 - 15b6: 90 23 b6 and.w 0x390 - -000015b8 <.L41>: - 15b8: 80 1c 80 mov.w 0x390, w0 - 15ba: 00 0e b2 and.w #0xe0, w0 - 15bc: fd ff 3a bra NZ, . + 0xFFFFFFFC - 15be: 00 00 78 mov.w w0, w0 - 15c0: 00 00 06 return - 15c2: f8 ff 37 bra . + 0xFFFFFFF2 - -000015c4 <_canBusOff>: - 15c4: 00 81 eb setm.w w2 - 15c6: 71 77 27 mov.w #0x7777, w1 - 15c8: 81 0f 50 sub.w w0, w1, [w15] - 15ca: 02 00 32 bra Z, . + 0x6 - 15cc: 02 00 78 mov.w w2, w0 - 15ce: 00 00 06 return - -000015d0 <.L60>: - 15d0: f0 8f 2f mov.w #0xf8ff, w0 - 15d2: 90 23 b6 and.w 0x390 - 15d4: 91 03 a8 bset.b 0x391, #0x0 - 15d6: 01 02 20 mov.w #0x20, w1 - -000015d8 <.L54>: - 15d8: 80 1c 80 mov.w 0x390, w0 - 15da: 00 0e b2 and.w #0xe0, w0 - 15dc: 81 0f 50 sub.w w0, w1, [w15] - 15de: fc ff 3a bra NZ, . + 0xFFFFFFFA - 15e0: 00 00 20 mov.w #0x0, w0 - 15e2: 00 00 06 return - 15e4: f5 ff 37 bra . + 0xFFFFFFEC - -000015e6 <_canAccept>: - 15e6: 01 02 78 mov.w w1, w4 - 15e8: 71 77 27 mov.w #0x7777, w1 - 15ea: 81 0f 50 sub.w w0, w1, [w15] - 15ec: 02 00 32 bra Z, . + 0x6 - -000015ee <.L64>: - 15ee: 00 80 eb setm.w w0 - 15f0: 00 00 06 return - -000015f2 <.L74>: - 15f2: e4 0f 52 sub.w w4, #0x4, [w15] - 15f4: 26 00 32 bra Z, . + 0x4E - 15f6: 0c 00 3e bra GTU, . + 0x1A - 15f8: e3 0f 52 sub.w w4, #0x3, [w15] - 15fa: f9 ff 3a bra NZ, . + 0xFFFFFFF4 - 15fc: 30 00 2e mov.w #0xe003, w0 - 15fe: 00 23 b6 and.w 0x300 - 1600: 42 18 dd sl.w w3, #0x2, w0 - 1602: ce 11 de lsr.w w2, #0xe, w3 - 1604: 83 01 70 ior.w w0, w3, w3 - 1606: 42 11 dd sl.w w2, #0x2, w2 - 1608: c0 ff 21 mov.w #0x1ffc, w0 - 160a: 00 00 61 and.w w2, w0, w0 - 160c: 00 23 b7 ior.w 0x300 - 160e: 00 00 05 retlw.w #0x0, w0 - -00001610 <.L70>: - 1610: e5 0f 52 sub.w w4, #0x5, [w15] - 1612: 21 00 32 bra Z, . + 0x44 - 1614: e6 0f 52 sub.w w4, #0x6, [w15] - 1616: eb ff 3a bra NZ, . + 0xFFFFFFD8 - 1618: 30 00 2e mov.w #0xe003, w0 - 161a: 30 23 b6 and.w 0x330 - 161c: 40 9a de asr.w w3, #0x0, w4 - 161e: cf a2 de asr.w w4, #0xf, w5 - 1620: c0 ff 21 mov.w #0x1ffc, w0 - 1622: 00 00 62 and.w w4, w0, w0 - 1624: 30 23 b7 ior.w 0x330 - 1626: 00 00 2f mov.w #0xf000, w0 - 1628: 32 23 b6 and.w 0x332 - 162a: c6 9a de asr.w w3, #0x6, w5 - 162c: 4a 18 dd sl.w w3, #0xa, w0 - 162e: 46 12 de lsr.w w2, #0x6, w4 - 1630: 04 02 70 ior.w w0, w4, w4 - 1632: f0 ff 20 mov.w #0xfff, w0 - 1634: 00 00 62 and.w w4, w0, w0 - 1636: 32 23 b7 ior.w 0x332 - 1638: f0 3f 20 mov.w #0x3ff, w0 - 163a: 34 23 b6 and.w 0x334 - 163c: 4a 10 dd sl.w w2, #0xa, w0 - 163e: 34 23 b7 ior.w 0x334 - 1640: 00 00 05 retlw.w #0x0, w0 - -00001642 <.L67>: - 1642: 30 00 2e mov.w #0xe003, w0 - 1644: 30 23 b6 and.w 0x330 - 1646: 42 18 dd sl.w w3, #0x2, w0 - 1648: ce 11 de lsr.w w2, #0xe, w3 - 164a: 83 01 70 ior.w w0, w3, w3 - 164c: 42 11 dd sl.w w2, #0x2, w2 - 164e: c0 ff 21 mov.w #0x1ffc, w0 - 1650: 00 00 61 and.w w2, w0, w0 - 1652: 30 23 b7 ior.w 0x330 - 1654: 00 00 05 retlw.w #0x0, w0 - -00001656 <.L68>: - 1656: 30 00 2e mov.w #0xe003, w0 - 1658: 00 23 b6 and.w 0x300 - 165a: 40 9a de asr.w w3, #0x0, w4 - 165c: cf a2 de asr.w w4, #0xf, w5 - 165e: c0 ff 21 mov.w #0x1ffc, w0 - 1660: 00 00 62 and.w w4, w0, w0 - 1662: 00 23 b7 ior.w 0x300 - 1664: 00 00 2f mov.w #0xf000, w0 - 1666: 02 23 b6 and.w 0x302 - 1668: c6 9a de asr.w w3, #0x6, w5 - 166a: 4a 18 dd sl.w w3, #0xa, w0 - 166c: 46 12 de lsr.w w2, #0x6, w4 - 166e: 04 02 70 ior.w w0, w4, w4 - 1670: f0 ff 20 mov.w #0xfff, w0 - 1672: 00 00 62 and.w w4, w0, w0 - 1674: 02 23 b7 ior.w 0x302 - 1676: f0 3f 20 mov.w #0x3ff, w0 - 1678: 04 23 b6 and.w 0x304 - 167a: 4a 10 dd sl.w w2, #0xa, w0 - 167c: 04 23 b7 ior.w 0x304 - 167e: 00 00 05 retlw.w #0x0, w0 - -00001680 <_canRead>: - 1680: 88 9f be mov.d w8, [w15++] - 1682: 01 04 78 mov.w w1, w8 - 1684: 82 03 78 mov.w w2, w7 - 1686: 83 04 78 mov.w w3, w9 - 1688: 71 77 27 mov.w #0x7777, w1 - 168a: 81 0f 50 sub.w w0, w1, [w15] - 168c: 03 00 32 bra Z, . + 0x8 - -0000168e <.L77>: - 168e: 00 80 eb setm.w w0 - 1690: 4f 04 be mov.d [--w15], w8 - 1692: 00 00 06 return - -00001694 <.L92>: - 1694: 8e e3 ab btst.b 0x38e, #0x7 - 1696: fb ff 32 bra Z, . + 0xFFFFFFF8 - 1698: 80 03 ab btst.b 0x380, #0x0 - 169a: 26 00 3a bra NZ, . + 0x4E - 169c: 20 00 20 mov.w #0x2, w0 - 169e: 00 0a 78 mov.w w0, [w4] - 16a0: 00 1c 80 mov.w 0x380, w0 - 16a2: 43 00 dd sl.w w0, #0x3, w0 - 16a4: 45 00 de lsr.w w0, #0x5, w0 - 16a6: 01 00 20 mov.w #0x0, w1 - 16a8: 00 8c be mov.d w0, [w8] - -000016aa <.L82>: - 16aa: 20 1c 80 mov.w 0x384, w0 - 16ac: 6f 00 60 and.w w0, #0xf, w0 - 16ae: 80 0c 78 mov.w w0, [w9] - 16b0: e4 0f 50 sub.w w0, #0x4, [w15] - 16b2: 0a 00 3e bra GTU, . + 0x16 - 16b4: e3 0f 50 sub.w w0, #0x3, [w15] - 16b6: 10 00 31 bra C, . + 0x22 - 16b8: e1 0f 50 sub.w w0, #0x1, [w15] - 16ba: 10 00 31 bra C, . + 0x22 - -000016bc <.L83>: - 16bc: 8e e3 a9 bclr.b 0x38e, #0x7 - 16be: 70 1c 80 mov.w 0x38e, w0 - 16c0: 00 00 eb clr.w w0 - -000016c2 <.L93>: - 16c2: 4f 04 be mov.d [--w15], w8 - 16c4: 00 00 06 return - 16c6: e6 ff 37 bra . + 0xFFFFFFCE - -000016c8 <.L88>: - 16c8: e6 0f 50 sub.w w0, #0x6, [w15] - 16ca: 04 00 36 bra LEU, . + 0xA - 16cc: e8 0f 50 sub.w w0, #0x8, [w15] - 16ce: f6 ff 3e bra GTU, . + 0xFFFFFFEE - 16d0: 60 1c 80 mov.w 0x38c, w0 - 16d2: b0 03 98 mov.w w0, [w7+6] - -000016d4 <.L86>: - 16d4: 55 1c 80 mov.w 0x38a, w5 - 16d6: a5 03 98 mov.w w5, [w7+4] - -000016d8 <.L85>: - 16d8: 40 1c 80 mov.w 0x388, w0 - 16da: 90 03 98 mov.w w0, [w7+2] - -000016dc <.L84>: - 16dc: 35 1c 80 mov.w 0x386, w5 - 16de: 85 0b 78 mov.w w5, [w7] - 16e0: 8e e3 a9 bclr.b 0x38e, #0x7 - 16e2: 70 1c 80 mov.w 0x38e, w0 - 16e4: 00 00 eb clr.w w0 - 16e6: ed ff 37 bra . + 0xFFFFFFDC - -000016e8 <.L80>: - 16e8: 40 00 20 mov.w #0x4, w0 - 16ea: 00 0a 78 mov.w w0, [w4] - 16ec: 02 1c 80 mov.w 0x380, w2 - 16ee: 10 1c 80 mov.w 0x382, w0 - 16f0: 24 1c 80 mov.w 0x384, w4 - 16f2: c6 ff 21 mov.w #0x1ffc, w6 - 16f4: 06 01 61 and.w w2, w6, w2 - 16f6: 03 00 20 mov.w #0x0, w3 - 16f8: c0 11 dd sl.w w2, #0x0, w3 - 16fa: 02 00 20 mov.w #0x0, w2 - 16fc: f6 ff 20 mov.w #0xfff, w6 - 16fe: 06 00 60 and.w w0, w6, w0 - 1700: 01 00 20 mov.w #0x0, w1 - 1702: c6 0a dd sl.w w1, #0x6, w5 - 1704: ca 00 de lsr.w w0, #0xa, w1 - 1706: 81 80 72 ior.w w5, w1, w1 - 1708: 46 00 dd sl.w w0, #0x6, w0 - 170a: 00 01 71 ior.w w2, w0, w2 - 170c: 81 81 71 ior.w w3, w1, w3 - 170e: 4a 22 de lsr.w w4, #0xa, w4 - 1710: 05 00 20 mov.w #0x0, w5 - 1712: 04 1c 71 ior.w w2, w4, [w8++] - 1714: 05 94 71 ior.w w3, w5, [w8--] - 1716: c9 ff 37 bra . + 0xFFFFFF94 - -00001718 <_canWrite>: - 1718: 88 9f be mov.d w8, [w15++] - 171a: 02 03 be mov.d w2, w6 - 171c: 81 04 78 mov.w w1, w9 - 171e: 04 04 78 mov.w w4, w8 - 1720: 71 77 27 mov.w #0x7777, w1 - 1722: 81 0f 50 sub.w w0, w1, [w15] - 1724: 03 00 32 bra Z, . + 0x8 - -00001726 <.L97>: - 1726: 00 80 eb setm.w w0 - 1728: 4f 04 be mov.d [--w15], w8 - 172a: 00 00 06 return - -0000172c <.L117>: - 172c: 6e c3 bf mov.b 0x36e, WREG - 172e: 00 38 a3 btst.z w0, #0x3 - 1730: fa ff 3a bra NZ, . + 0xFFFFFFF6 - 1732: e8 0f 52 sub.w w4, #0x8, [w15] - 1734: f8 ff 3e bra GTU, . + 0xFFFFFFF2 - 1736: e2 8f 52 sub.w w5, #0x2, [w15] - 1738: 40 00 32 bra Z, . + 0x82 - 173a: e4 8f 52 sub.w w5, #0x4, [w15] - 173c: f4 ff 3a bra NZ, . + 0xFFFFFFEA - 173e: 43 20 dd sl.w w4, #0x3, w0 - 1740: 80 07 b2 and.w #0x78, w0 - 1742: ca 30 dd sl.w w6, #0xa, w1 - 1744: 01 00 70 ior.w w0, w1, w0 - 1746: 20 1b 88 mov.w w0, 0x364 - 1748: 4a 38 dd sl.w w7, #0xa, w0 - 174a: 46 31 de lsr.w w6, #0x6, w2 - 174c: 02 01 70 ior.w w0, w2, w2 - 174e: c6 b9 de asr.w w7, #0x6, w3 - 1750: f2 0f b2 and.w #0xff, w2 - 1752: ce 39 dd sl.w w7, #0xe, w3 - 1754: 42 30 de lsr.w w6, #0x2, w0 - 1756: 00 80 71 ior.w w3, w0, w0 - 1758: c2 b8 de asr.w w7, #0x2, w1 - 175a: 04 00 2f mov.w #0xf000, w4 - 175c: 04 00 60 and.w w0, w4, w0 - 175e: 00 01 71 ior.w w2, w0, w2 - 1760: 12 1b 88 mov.w w2, 0x362 - 1762: 40 b8 de asr.w w7, #0x0, w0 - 1764: cf 80 de asr.w w0, #0xf, w1 - 1766: c0 0f b2 and.w #0xfc, w0 - 1768: c3 38 dd sl.w w7, #0x3, w1 - 176a: 4d 31 de lsr.w w6, #0xd, w2 - 176c: 02 81 70 ior.w w1, w2, w2 - 176e: cd b9 de asr.w w7, #0xd, w3 - 1770: 04 80 2f mov.w #0xf800, w4 - 1772: 04 01 61 and.w w2, w4, w2 - 1774: 02 00 70 ior.w w0, w2, w0 - 1776: 00 00 a0 bset.w w0, #0x0 - 1778: 00 1b 88 mov.w w0, 0x360 - -0000177a <.L103>: - 177a: e4 0f 54 sub.w w8, #0x4, [w15] - 177c: 11 00 3e bra GTU, . + 0x24 - 177e: e3 0f 54 sub.w w8, #0x3, [w15] - 1780: 17 00 31 bra C, . + 0x30 - 1782: e1 0f 54 sub.w w8, #0x1, [w15] - 1784: 17 00 31 bra C, . + 0x30 - -00001786 <.L104>: - 1786: 6e 63 a8 bset.b 0x36e, #0x3 - 1788: 80 00 eb clr.w w1 - 178a: 42 06 20 mov.w #0x64, w2 - -0000178c <.L110>: - 178c: 81 00 e8 inc.w w1, w1 - 178e: 6e c3 bf mov.b 0x36e, WREG - 1790: 00 38 a3 btst.z w0, #0x3 - 1792: 02 00 32 bra Z, . + 0x6 - 1794: 82 8f 50 sub.w w1, w2, [w15] - 1796: fa ff 3a bra NZ, . + 0xFFFFFFF6 - -00001798 <.L111>: - 1798: 00 00 eb clr.w w0 - 179a: 4f 04 be mov.d [--w15], w8 - 179c: 00 00 06 return - 179e: c6 ff 37 bra . + 0xFFFFFF8E - -000017a0 <.L109>: - 17a0: e6 0f 54 sub.w w8, #0x6, [w15] - 17a2: 04 00 36 bra LEU, . + 0xA - 17a4: e8 0f 54 sub.w w8, #0x8, [w15] - 17a6: ef ff 3e bra GTU, . + 0xFFFFFFE0 - 17a8: b9 01 90 mov.w [w9+6], w3 - 17aa: 63 1b 88 mov.w w3, 0x36c - -000017ac <.L107>: - 17ac: 29 00 90 mov.w [w9+4], w0 - 17ae: 50 1b 88 mov.w w0, 0x36a - -000017b0 <.L106>: - 17b0: 99 00 90 mov.w [w9+2], w1 - 17b2: 41 1b 88 mov.w w1, 0x368 - -000017b4 <.L105>: - 17b4: 99 04 78 mov.w [w9], w9 - 17b6: 39 1b 88 mov.w w9, 0x366 - 17b8: e6 ff 37 bra . + 0xFFFFFFCE - -000017ba <.L101>: - 17ba: 42 39 dd sl.w w7, #0x2, w2 - 17bc: ce 31 de lsr.w w6, #0xe, w3 - 17be: 83 01 71 ior.w w2, w3, w3 - 17c0: 42 31 dd sl.w w6, #0x2, w2 - 17c2: c2 0f b2 and.w #0xfc, w2 - 17c4: 45 38 dd sl.w w7, #0x5, w0 - 17c6: cb 30 de lsr.w w6, #0xb, w1 - 17c8: 81 00 70 ior.w w0, w1, w1 - 17ca: 45 30 dd sl.w w6, #0x5, w0 - 17cc: 04 80 2f mov.w #0xf800, w4 - 17ce: 04 00 60 and.w w0, w4, w0 - 17d0: 00 01 71 ior.w w2, w0, w2 - 17d2: 02 1b 88 mov.w w2, 0x360 - 17d4: 43 40 dd sl.w w8, #0x3, w0 - 17d6: 80 07 b2 and.w #0x78, w0 - 17d8: 20 1b 88 mov.w w0, 0x364 - 17da: cf ff 37 bra . + 0xFFFFFFA0 - -000017dc <_aic_on>: - 17dc: a7 00 07 rcall . + 0x150 - 17de: 92 00 37 bra . + 0x126 - -000017e0 <_aic_off>: - 17e0: 60 00 b8 mul.uu w0, #0x0, w0 - 17e2: a6 00 07 rcall . + 0x14E - 17e4: 15 00 07 rcall . + 0x2C - 17e6: a3 00 07 rcall . + 0x148 - 17e8: 8d 00 37 bra . + 0x11C - -000017ea <_aic_initialize>: - 17ea: 88 9f be mov.d w8, [w15++] - 17ec: 8a 9f be mov.d w10, [w15++] - 17ee: 00 04 be mov.d w0, w8 - 17f0: 06 05 be mov.d w6, w10 - 17f2: 90 00 07 rcall . + 0x122 - 17f4: 0a 01 be mov.d w10, w2 - 17f6: 08 00 be mov.d w8, w0 - 17f8: 29 00 07 rcall . + 0x54 - 17fa: 08 00 be mov.d w8, w0 - 17fc: 06 00 07 rcall . + 0xE - 17fe: 08 00 be mov.d w8, w0 - 1800: 1b 00 07 rcall . + 0x38 - 1802: 4f 05 be mov.d [--w15], w10 - 1804: 4f 04 be mov.d [--w15], w8 - 1806: 00 00 06 return - -00001808 <_aic_finalize>: - 1808: eb ff 37 bra . + 0xFFFFFFD8 - -0000180a <_brake_initialize>: - 180a: ca 42 a8 bset.b 0x2ca, #0x2 - 180c: c6 42 a9 bclr.b 0x2c6, #0x2 - 180e: 00 00 06 return - -00001810 <_brake_apply>: - 1810: ca 42 a8 bset.b 0x2ca, #0x2 - 1812: 00 00 06 return - -00001814 <_brake_release>: - 1814: ca 42 a9 bclr.b 0x2ca, #0x2 - 1816: 00 00 06 return - -00001818 <__QEIInterrupt>: - 1818: 34 00 f8 push 0x34 - 181a: 88 1f 78 mov.w w8, [w15++] - 181c: 08 c0 b3 mov.b #0x0, w8 - 181e: a8 01 88 mov.w w8, 0x34 - 1820: 4f 04 78 mov.w [--w15], w8 - 1822: 23 61 ab btst.b 0x123, #0x3 - 1824: 04 00 32 bra Z, . + 0xA - 1826: b0 2d ec inc.w 0xdb0 - 1828: 89 00 a9 bclr.b 0x89, #0x0 - 182a: 34 00 f9 pop 0x34 - 182c: 00 40 06 retfie - -0000182e <.L2>: - 182e: b0 2d ed dec.w 0xdb0 - 1830: 89 00 a9 bclr.b 0x89, #0x0 - 1832: 34 00 f9 pop 0x34 - 1834: 00 40 06 retfie - 1836: fb ff 37 bra . + 0xFFFFFFF8 - -00001838 <_index_initialize>: - 1838: a8 62 a8 bset.b 0x2a8, #0x3 - 183a: 00 00 06 return - -0000183c <_index_finalize>: - 183c: a8 62 a9 bclr.b 0x2a8, #0x3 - 183e: 00 00 06 return - -00001840 <_index_read>: - 1840: 23 c1 bf mov.b 0x123, WREG - 1842: 44 00 de lsr.w w0, #0x4, w0 - 1844: 61 00 60 and.w w0, #0x1, w0 - 1846: 00 80 fb ze w0, w0 - 1848: 01 00 20 mov.w #0x0, w1 - 184a: 00 00 06 return - -0000184c <_encoder_initialize>: - 184c: 92 6d 88 mov.w w2, 0xdb2 - 184e: a3 6d 88 mov.w w3, 0xdb4 - 1850: ac 2d ef clr.w 0xdac - 1852: ae 2d ef clr.w 0xdae - 1854: b0 2d ef clr.w 0xdb0 - 1856: f0 ff 27 mov.w #0x7fff, w0 - 1858: 40 09 88 mov.w w0, 0x128 - 185a: 00 1a 20 mov.w #0x1a0, w0 - 185c: 20 09 88 mov.w w0, 0x124 - 185e: 00 70 20 mov.w #0x700, w0 - 1860: 10 09 88 mov.w w0, 0x122 - 1862: 00 03 20 mov.w #0x30, w0 - 1864: a8 22 b7 ior.w 0x2a8 - 1866: 89 00 a9 bclr.b 0x89, #0x0 - 1868: 91 00 a8 bset.b 0x91, #0x0 - 186a: 70 c0 b3 mov.b #0x7, w0 - 186c: a8 60 b7 ior.b 0xa8 - 186e: 00 00 06 return - -00001870 <_encoder_finalize>: - 1870: 60 00 b8 mul.uu w0, #0x0, w0 - 1872: 90 6d 88 mov.w w0, 0xdb2 - 1874: a1 6d 88 mov.w w1, 0xdb4 - 1876: 60 6d 88 mov.w w0, 0xdac - 1878: 71 6d 88 mov.w w1, 0xdae - 187a: f0 fc 2f mov.w #0xffcf, w0 - 187c: a8 22 b6 and.w 0x2a8 - 187e: 00 00 06 return - -00001880 <_encoder_get_count>: - 1880: 80 6d 80 mov.w 0xdb0, w0 - 1882: 31 09 80 mov.w 0x126, w1 - 1884: 82 6d 80 mov.w 0xdb0, w2 - 1886: 80 0f 51 sub.w w2, w0, [w15] - 1888: fb ff 3a bra NZ, . + 0xFFFFFFF8 - 188a: 61 0a b8 mul.uu w1, #0x1, w4 - 188c: 04 00 42 add.w w4, w4, w0 - 188e: 85 80 4a addc.w w5, w5, w1 - 1890: cf 91 de asr.w w2, #0xf, w3 - 1892: c0 11 dd sl.w w2, #0x0, w3 - 1894: 02 00 20 mov.w #0x0, w2 - 1896: 02 00 70 ior.w w0, w2, w0 - 1898: 83 80 70 ior.w w1, w3, w1 - 189a: 02 02 72 ior.w w4, w2, w4 - 189c: 83 82 72 ior.w w5, w3, w5 - 189e: 44 6d 88 mov.w w4, 0xda8 - 18a0: 55 6d 88 mov.w w5, 0xdaa - 18a2: 81 80 d1 asr.w w1, w1 - 18a4: 00 80 d3 rrc.w w0, w0 - 18a6: 62 6d 80 mov.w 0xdac, w2 - 18a8: 73 6d 80 mov.w 0xdae, w3 - 18aa: 02 00 50 sub.w w0, w2, w0 - 18ac: 83 80 58 subb.w w1, w3, w1 - 18ae: 00 00 06 return - -000018b0 <_encoder_get_count_and_clear>: - 18b0: e7 ff 07 rcall . + 0xFFFFFFD0 - 18b2: 62 6d 80 mov.w 0xdac, w2 - 18b4: 73 6d 80 mov.w 0xdae, w3 - 18b6: 00 01 41 add.w w2, w0, w2 - 18b8: 81 81 49 addc.w w3, w1, w3 - 18ba: 62 6d 88 mov.w w2, 0xdac - 18bc: 73 6d 88 mov.w w3, 0xdae - 18be: 00 00 06 return - -000018c0 <_encoder_read>: - 18c0: 88 9f be mov.d w8, [w15++] - 18c2: de ff 07 rcall . + 0xFFFFFFBE - 18c4: aa f4 07 rcall . + 0xFFFFE956 - 18c6: 00 04 be mov.d w0, w8 - 18c8: 90 6d 80 mov.w 0xdb2, w0 - 18ca: a1 6d 80 mov.w 0xdb4, w1 - 18cc: a6 f4 07 rcall . + 0xFFFFE94E - 18ce: 00 01 be mov.d w0, w2 - 18d0: 08 00 be mov.d w8, w0 - 18d2: ce f4 07 rcall . + 0xFFFFE99E - 18d4: 00 01 be mov.d w0, w2 - 18d6: 0f f5 07 rcall . + 0xFFFFEA20 - 18d8: b2 fd 20 mov.w #0xfdb, w2 - 18da: 93 04 24 mov.w #0x4049, w3 - 18dc: 69 f5 07 rcall . + 0xFFFFEAD4 - 18de: 4f 04 be mov.d [--w15], w8 - 18e0: 00 00 06 return - -000018e2 <_encoder_read_and_clear>: - 18e2: 88 9f be mov.d w8, [w15++] - 18e4: e5 ff 07 rcall . + 0xFFFFFFCC - 18e6: 99 f4 07 rcall . + 0xFFFFE934 - 18e8: 00 04 be mov.d w0, w8 - 18ea: 90 6d 80 mov.w 0xdb2, w0 - 18ec: a1 6d 80 mov.w 0xdb4, w1 - 18ee: 95 f4 07 rcall . + 0xFFFFE92C - 18f0: 00 01 be mov.d w0, w2 - 18f2: 08 00 be mov.d w8, w0 - 18f4: bd f4 07 rcall . + 0xFFFFE97C - 18f6: 00 01 be mov.d w0, w2 - 18f8: fe f4 07 rcall . + 0xFFFFE9FE - 18fa: b2 fd 20 mov.w #0xfdb, w2 - 18fc: 93 04 24 mov.w #0x4049, w3 - 18fe: 58 f5 07 rcall . + 0xFFFFEAB2 - 1900: 4f 04 be mov.d [--w15], w8 - 1902: 00 00 06 return - -00001904 <_encoder_clear>: - 1904: bd ff 07 rcall . + 0xFFFFFF7C - 1906: 62 6d 80 mov.w 0xdac, w2 - 1908: 73 6d 80 mov.w 0xdae, w3 - 190a: 00 01 41 add.w w2, w0, w2 - 190c: 81 81 49 addc.w w3, w1, w3 - 190e: 62 6d 88 mov.w w2, 0xdac - 1910: 73 6d 88 mov.w w3, 0xdae - 1912: 00 00 06 return - -00001914 <_motor_initialize>: - 1914: 04 00 be mov.d w4, w0 - 1916: b2 6d 88 mov.w w2, 0xdb6 - 1918: c3 6d 88 mov.w w3, 0xdb8 - 191a: 2c 00 07 rcall . + 0x5A - 191c: 29 00 07 rcall . + 0x54 - 191e: 80 01 78 mov.w w0, w3 - 1920: 00 01 eb clr.w w2 - 1922: 60 00 b8 mul.uu w0, #0x0, w0 - 1924: 7a 00 37 bra . + 0xF6 - -00001926 <_motor_finalize>: - 1926: b6 2d ef clr.w 0xdb6 - 1928: b8 2d ef clr.w 0xdb8 - 192a: 00 00 06 return - -0000192c <_motor_on>: - 192c: 6e 00 37 bra . + 0xDE - -0000192e <_motor_off>: - 192e: 70 00 37 bra . + 0xE2 - -00001930 <_motor_set>: - 1930: 88 9f be mov.d w8, [w15++] - 1932: 8a 9f be mov.d w10, [w15++] - 1934: 00 01 be mov.d w0, w2 - 1936: b8 6d 80 mov.w 0xdb6, w8 - 1938: c9 6d 80 mov.w 0xdb8, w9 - 193a: 08 00 be mov.d w8, w0 - 193c: dc f4 07 rcall . + 0xFFFFE9BA - 193e: 00 05 be mov.d w0, w10 - 1940: 08 01 be mov.d w8, w2 - 1942: 08 00 be mov.d w8, w0 - 1944: d8 f4 07 rcall . + 0xFFFFE9B2 - 1946: 00 01 be mov.d w0, w2 - 1948: 0a 00 be mov.d w10, w0 - 194a: 92 f4 07 rcall . + 0xFFFFE926 - 194c: 00 04 be mov.d w0, w8 - 194e: 36 00 07 rcall . + 0x6E - 1950: 08 00 be mov.d w8, w0 - 1952: 4f 05 be mov.d [--w15], w10 - 1954: 4f 04 be mov.d [--w15], w8 - 1956: 00 00 06 return - -00001958 <_pwm_set_count>: - 1958: 00 01 78 mov.w w0, w2 - 195a: b0 f9 2f mov.w #0xff9b, w0 - 195c: 00 00 41 add.w w2, w0, w0 - 195e: a1 f9 27 mov.w #0x7f9a, w1 - 1960: 81 0f 50 sub.w w0, w1, [w15] - 1962: 03 00 36 bra LEU, . + 0x8 - 1964: f0 4a 20 mov.w #0x4af, w0 - 1966: 20 0e 88 mov.w w0, 0x1c4 - 1968: 00 00 06 return - -0000196a <.L2>: - 196a: 02 00 e9 dec.w w2, w0 - 196c: 20 0e 88 mov.w w0, 0x1c4 - 196e: 00 00 06 return - -00001970 <_pwm_get_count>: - 1970: c4 01 ec inc.w 0x1c4, WREG - 1972: 00 00 06 return - -00001974 <_pwm_set_freq>: - 1974: 02 00 fa lnk #0x2 - 1976: 00 01 be mov.d w0, w2 - 1978: 00 b0 21 mov.w #0x1b00, w0 - 197a: 71 bb 24 mov.w #0x4bb7, w1 - 197c: 79 f4 07 rcall . + 0xFFFFE8F4 - 197e: 4c f5 07 rcall . + 0xFFFFEA9A - 1980: f0 bf 9f mov.w w0, [w15-2] - 1982: 7f b8 97 mov.w [w15-2], w0 - 1984: e9 ff 07 rcall . + 0xFFFFFFD4 - 1986: 00 80 fa ulnk - 1988: 00 00 06 return - -0000198a <_pwm_get_freq>: - 198a: 88 1f 78 mov.w w8, [w15++] - 198c: 28 0e 80 mov.w 0x1c4, w8 - 198e: 08 04 e8 inc.w w8, w8 - 1990: 61 40 b9 mul.su w8, #0x1, w0 - 1992: 43 f4 07 rcall . + 0xFFFFE888 - 1994: 08 00 e0 cp0.w w8 - 1996: 06 00 35 bra LT, . + 0xE - 1998: 00 01 be mov.d w0, w2 - 199a: 00 b0 21 mov.w #0x1b00, w0 - 199c: 71 bb 24 mov.w #0x4bb7, w1 - 199e: 68 f4 07 rcall . + 0xFFFFE8D2 - 19a0: 4f 04 78 mov.w [--w15], w8 - 19a2: 00 00 06 return - -000019a4 <.L20>: - 19a4: 02 00 20 mov.w #0x0, w2 - 19a6: 03 78 24 mov.w #0x4780, w3 - 19a8: a6 f4 07 rcall . + 0xFFFFE94E - 19aa: 00 01 be mov.d w0, w2 - 19ac: 00 b0 21 mov.w #0x1b00, w0 - 19ae: 71 bb 24 mov.w #0x4bb7, w1 - 19b0: 5f f4 07 rcall . + 0xFFFFE8C0 - 19b2: 4f 04 78 mov.w [--w15], w8 - 19b4: 00 00 06 return - 19b6: f6 ff 37 bra . + 0xFFFFFFEE - -000019b8 <_pwm_set_duty>: - 19b8: b0 0e 88 mov.w w0, 0x1d6 - 19ba: 00 00 06 return - -000019bc <_pwm_set_duty_float>: - 19bc: 88 9f be mov.d w8, [w15++] - 19be: 8a 1f 78 mov.w w10, [w15++] - 19c0: 00 04 be mov.d w0, w8 - 19c2: d6 ff 07 rcall . + 0xFFFFFFAE - 19c4: 00 05 78 mov.w w0, w10 - 19c6: 08 01 be mov.d w8, w2 - 19c8: 08 00 be mov.d w8, w0 - 19ca: 95 f4 07 rcall . + 0xFFFFE92C - 19cc: 00 04 be mov.d w0, w8 - 19ce: 61 50 b9 mul.su w10, #0x1, w0 - 19d0: 24 f4 07 rcall . + 0xFFFFE84A - 19d2: 0a 00 e0 cp0.w w10 - 19d4: 0b 00 35 bra LT, . + 0x18 - 19d6: 00 01 be mov.d w0, w2 - 19d8: 08 00 be mov.d w8, w0 - 19da: ea f4 07 rcall . + 0xFFFFE9D6 - 19dc: 3e f5 07 rcall . + 0xFFFFEA7E - 19de: 00 04 78 mov.w w0, w8 - 19e0: eb ff 07 rcall . + 0xFFFFFFD8 - 19e2: 09 00 20 mov.w #0x0, w9 - 19e4: 08 00 be mov.d w8, w0 - 19e6: 4f 05 78 mov.w [--w15], w10 - 19e8: 4f 04 be mov.d [--w15], w8 - 19ea: 00 00 06 return - -000019ec <.L31>: - 19ec: 02 00 20 mov.w #0x0, w2 - 19ee: 03 78 24 mov.w #0x4780, w3 - 19f0: 82 f4 07 rcall . + 0xFFFFE906 - 19f2: 00 01 be mov.d w0, w2 - 19f4: 08 00 be mov.d w8, w0 - 19f6: dc f4 07 rcall . + 0xFFFFE9BA - 19f8: 30 f5 07 rcall . + 0xFFFFEA62 - 19fa: 00 04 78 mov.w w0, w8 - 19fc: dd ff 07 rcall . + 0xFFFFFFBC - 19fe: 09 00 20 mov.w #0x0, w9 - 1a00: 08 00 be mov.d w8, w0 - 1a02: 4f 05 78 mov.w [--w15], w10 - 1a04: 4f 04 be mov.d [--w15], w8 - 1a06: 00 00 06 return - 1a08: f1 ff 37 bra . + 0xFFFFFFE4 - -00001a0a <_pwm_on>: - 1a0a: 00 30 20 mov.w #0x300, w0 - 1a0c: a0 0e 88 mov.w w0, 0x1d4 - 1a0e: 00 00 06 return - -00001a10 <_pwm_off>: - 1a10: e0 fe 2f mov.w #0xffee, w0 - 1a12: d4 21 b6 and.w 0x1d4 - 1a14: f0 cf 2f mov.w #0xfcff, w0 - 1a16: d4 21 b6 and.w 0x1d4 - 1a18: 00 00 06 return - -00001a1a <_pwm_initialize>: - 1a1a: 88 1f 78 mov.w w8, [w15++] - 1a1c: 03 04 78 mov.w w3, w8 - 1a1e: f8 ff 07 rcall . + 0xFFFFFFF2 - 1a20: 08 00 78 mov.w w8, w0 - 1a22: 9a ff 07 rcall . + 0xFFFFFF36 - 1a24: 00 00 20 mov.w #0x0, w0 - 1a26: 01 f0 23 mov.w #0x3f00, w1 - 1a28: c9 ff 07 rcall . + 0xFFFFFF94 - 1a2a: 20 f0 20 mov.w #0xf02, w0 - 1a2c: 50 0e 88 mov.w w0, 0x1ca - 1a2e: f0 00 20 mov.w #0xf, w0 - 1a30: 60 0e 88 mov.w w0, 0x1cc - 1a32: d0 01 a9 bclr.b 0x1d0, #0x0 - 1a34: 00 0f 2a mov.w #0xa0f0, w0 - 1a36: 00 0e 88 mov.w w0, 0x1c0 - 1a38: 4f 04 78 mov.w [--w15], w8 - 1a3a: 00 00 06 return - -00001a3c <_wdt_initialize>: - 1a3c: 40 a7 a8 bset.b 0x740, #0x5 - 1a3e: 00 00 06 return - -00001a40 <_wdt_ping>: - 1a40: 00 60 fe clrwdt - 1a42: 00 00 06 return - -00001a44 <_wdt_finalize>: - 1a44: 40 a7 a9 bclr.b 0x740, #0x5 - 1a46: 00 00 06 return -Disassembly of section __FOSC: - -00f80000 <__FOSC>: - f80000: ff ff 00 nop -Disassembly of section __FWDT: - -00f80002 <__FWDT>: - f80002: e3 7f 00 nop -Disassembly of section __FBORPOR: - -00f80004 <__FBORPOR>: - f80004: 7f fb 00 nop -Disassembly of section .ivt: - -00000004 <.ivt>: - 4: d0 1a 00 nop - 6: d0 1a 00 nop - 8: d0 1a 00 nop - a: d0 1a 00 nop - c: d0 1a 00 nop - e: d0 1a 00 nop - 10: d0 1a 00 nop - 12: d0 1a 00 nop - 14: d0 1a 00 nop - 16: d0 1a 00 nop - 18: d0 1a 00 nop - 1a: 54 14 00 nop - 1c: d0 1a 00 nop - 1e: d0 1a 00 nop - 20: d0 1a 00 nop - 22: d0 1a 00 nop - 24: d0 1a 00 nop - 26: d0 1a 00 nop - 28: d0 1a 00 nop - 2a: d0 1a 00 nop - 2c: d0 1a 00 nop - 2e: d0 1a 00 nop - 30: d0 1a 00 nop - 32: d0 1a 00 nop - 34: d0 1a 00 nop - 36: d0 1a 00 nop - 38: d0 1a 00 nop - 3a: d0 1a 00 nop - 3c: d0 1a 00 nop - 3e: d0 1a 00 nop - 40: d0 1a 00 nop - 42: d0 1a 00 nop - 44: d0 1a 00 nop - 46: d0 1a 00 nop - 48: d0 1a 00 nop - 4a: d0 1a 00 nop - 4c: d0 1a 00 nop - 4e: d0 1a 00 nop - 50: d0 1a 00 nop - 52: d0 1a 00 nop - 54: d0 1a 00 nop - 56: d0 1a 00 nop - 58: d0 1a 00 nop - 5a: d0 1a 00 nop - 5c: d0 1a 00 nop - 5e: d0 1a 00 nop - 60: d0 1a 00 nop - 62: d0 1a 00 nop - 64: 18 18 00 nop - 66: d0 1a 00 nop - 68: d0 1a 00 nop - 6a: d0 1a 00 nop - 6c: d0 1a 00 nop - 6e: d0 1a 00 nop - 70: d0 1a 00 nop - 72: d0 1a 00 nop - 74: d0 1a 00 nop - 76: d0 1a 00 nop - 78: d0 1a 00 nop - 7a: d0 1a 00 nop - 7c: d0 1a 00 nop - 7e: d0 1a 00 nop -Disassembly of section .aivt: - -00000084 <.aivt>: - 84: d0 1a 00 nop - 86: d0 1a 00 nop - 88: d0 1a 00 nop - 8a: d0 1a 00 nop - 8c: d0 1a 00 nop - 8e: d0 1a 00 nop - 90: d0 1a 00 nop - 92: d0 1a 00 nop - 94: d0 1a 00 nop - 96: d0 1a 00 nop - 98: d0 1a 00 nop - 9a: 54 14 00 nop - 9c: d0 1a 00 nop - 9e: d0 1a 00 nop - a0: d0 1a 00 nop - a2: d0 1a 00 nop - a4: d0 1a 00 nop - a6: d0 1a 00 nop - a8: d0 1a 00 nop - aa: d0 1a 00 nop - ac: d0 1a 00 nop - ae: d0 1a 00 nop - b0: d0 1a 00 nop - b2: d0 1a 00 nop - b4: d0 1a 00 nop - b6: d0 1a 00 nop - b8: d0 1a 00 nop - ba: d0 1a 00 nop - bc: d0 1a 00 nop - be: d0 1a 00 nop - c0: d0 1a 00 nop - c2: d0 1a 00 nop - c4: d0 1a 00 nop - c6: d0 1a 00 nop - c8: d0 1a 00 nop - ca: d0 1a 00 nop - cc: d0 1a 00 nop - ce: d0 1a 00 nop - d0: d0 1a 00 nop - d2: d0 1a 00 nop - d4: d0 1a 00 nop - d6: d0 1a 00 nop - d8: d0 1a 00 nop - da: d0 1a 00 nop - dc: d0 1a 00 nop - de: d0 1a 00 nop - e0: d0 1a 00 nop - e2: d0 1a 00 nop - e4: 18 18 00 nop - e6: d0 1a 00 nop - e8: d0 1a 00 nop - ea: d0 1a 00 nop - ec: d0 1a 00 nop - ee: d0 1a 00 nop - f0: d0 1a 00 nop - f2: d0 1a 00 nop - f4: d0 1a 00 nop - f6: d0 1a 00 nop - f8: d0 1a 00 nop - fa: d0 1a 00 nop - fc: d0 1a 00 nop - fe: d0 1a 00 nop -Disassembly of section .const: - -00009a48 <.LC0>: - 9a48: 44 41 .word 0x4144 - 9a4a: 45 4d .word 0x4d45 - 9a4c: 4f 4e .word 0x4e4f - 9a4e: 00 00 .word 0 - -00009a50 <.LC0>: - 9a50: 49 44 .word 0x4449 - 9a52: 4c 45 .word 0x454c - 9a54: 00 00 .word 0 - -00009a56 <_xInitialStack.2713>: - 9a56: 11 11 .word 0x1111 - 9a58: 22 22 .word 0x2222 - 9a5a: 33 33 .word 0x3333 - 9a5c: 44 44 .word 0x4444 - 9a5e: 55 55 .word 0x5555 - 9a60: 66 66 .word 0x6666 - 9a62: 77 77 .word 0x7777 - 9a64: 88 88 .word 0x8888 - 9a66: 99 99 .word 0x9999 - 9a68: aa aa .word 0xaaaa - 9a6a: bb bb .word 0xbbbb - 9a6c: cc cc .word 0xcccc - 9a6e: dd dd .word 0xdddd - 9a70: ee ee .word 0xeeee - 9a72: ce cd .word 0xcdce - 9a74: ac ab .word 0xabac - 9a76: 02 02 .word 0x202 - 9a78: 03 03 .word 0x303 - 9a7a: 04 04 .word 0x404 - 9a7c: 05 05 .word 0x505 - 9a7e: 06 06 .word 0x606 - 9a80: 07 07 .word 0x707 - 9a82: 08 08 .word 0x808 - 9a84: 0a 09 .word 0x90a - 9a86: 10 10 .word 0x1010 - 9a88: 10 11 .word 0x1110 - 9a8a: 12 12 .word 0x1212 -Disassembly of section .dinit: - -00001a8c <.dinit>: - 1a8c: ba 0d 00 nop - 1a8e: 02 00 00 nop - 1a90: 02 00 00 nop - 1a92: 00 00 00 nop - 1a94: 06 0d 00 nop - 1a96: 6c 00 00 nop - 1a98: 00 00 00 nop - 1a9a: bc 0d 00 nop - 1a9c: 02 00 00 nop - 1a9e: 02 00 00 nop - 1aa0: 00 00 00 nop - 1aa2: 72 0d 00 nop - 1aa4: 36 00 00 nop - 1aa6: 00 00 00 nop - 1aa8: be 0d 00 nop - 1aaa: 02 00 00 nop - 1aac: 02 00 00 nop - 1aae: ef 00 00 nop - 1ab0: 00 08 00 nop - 1ab2: 06 05 00 nop - 1ab4: 00 00 00 nop - 1ab6: a8 0d 00 nop - 1ab8: 08 00 00 nop - 1aba: 02 00 00 nop - ... - 1ac2: b0 0d 00 nop - 1ac4: 06 00 00 nop - 1ac6: 00 00 00 nop - 1ac8: b6 0d 00 nop - 1aca: 04 00 00 nop - ... -Disassembly of section .isr: - -00001ad0 <__DefaultInterrupt>: - 1ad0: 00 00 fe reset diff --git a/FreeRTOS1/croutine.c b/FreeRTOS1/croutine.c deleted file mode 100644 index b8c1868..0000000 --- a/FreeRTOS1/croutine.c +++ /dev/null @@ -1,352 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -#include "FreeRTOS.h" -#include "task.h" -#include "croutine.h" - -/* Lists for ready and blocked co-routines. --------------------*/ -static xList pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /*< Prioritised ready co-routines. */ -static xList xDelayedCoRoutineList1; /*< Delayed co-routines. */ -static xList xDelayedCoRoutineList2; /*< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */ -static xList * pxDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used. */ -static xList * pxOverflowDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */ -static xList xPendingReadyList; /*< Holds co-routines that have been readied by an external event. They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */ - -/* Other file private variables. --------------------------------*/ -corCRCB * pxCurrentCoRoutine = NULL; -static unsigned portBASE_TYPE uxTopCoRoutineReadyPriority = 0; -static portTickType xCoRoutineTickCount = 0; - -/* The initial state of the co-routine when it is created. */ -#define corINITIAL_STATE ( 0 ) - -/* - * Place the co-routine represented by pxCRCB into the appropriate ready queue - * for the priority. It is inserted at the end of the list. - * - * This macro accesses the co-routine ready lists and therefore must not be - * used from within an ISR. - */ -#define prvAddCoRoutineToReadyQueue( pxCRCB ) \ -{ \ - if( pxCRCB->uxPriority > uxTopCoRoutineReadyPriority ) \ - { \ - uxTopCoRoutineReadyPriority = pxCRCB->uxPriority; \ - } \ - vListInsertEnd( ( xList * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \ -} - -/* - * Utility to ready all the lists used by the scheduler. This is called - * automatically upon the creation of the first co-routine. - */ -static void prvInitialiseCoRoutineLists( void ); - -/* - * Co-routines that are readied by an interrupt cannot be placed directly into - * the ready lists (there is no mutual exclusion). Instead they are placed in - * in the pending ready list in order that they can later be moved to the ready - * list by the co-routine scheduler. - */ -static inline void prvCheckPendingReadyList( void ); - -/* - * Macro that looks at the list of co-routines that are currently delayed to - * see if any require waking. - * - * Co-routines are stored in the queue in the order of their wake time - - * meaning once one co-routine has been found whose timer has not expired - * we need not look any further down the list. - */ -static inline void prvCheckDelayedList( void ); - -/*-----------------------------------------------------------*/ - -signed portBASE_TYPE xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, unsigned portBASE_TYPE uxPriority, unsigned portBASE_TYPE uxIndex ) -{ -signed portBASE_TYPE xReturn; -corCRCB *pxCoRoutine; - - /* Allocate the memory that will store the co-routine control block. */ - pxCoRoutine = ( corCRCB * ) pvPortMalloc( sizeof( corCRCB ) ); - if( pxCoRoutine ) - { - /* If pxCurrentCoRoutine is NULL then this is the first co-routine to - be created and the co-routine data structures need initialising. */ - if( pxCurrentCoRoutine == NULL ) - { - pxCurrentCoRoutine = pxCoRoutine; - prvInitialiseCoRoutineLists(); - } - - /* Check the priority is within limits. */ - if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES ) - { - uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1; - } - - /* Fill out the co-routine control block from the function parameters. */ - pxCoRoutine->uxState = corINITIAL_STATE; - pxCoRoutine->uxPriority = uxPriority; - pxCoRoutine->uxIndex = uxIndex; - pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode; - - /* Initialise all the other co-routine control block parameters. */ - vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); - vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); - - /* Set the co-routine control block as a link back from the xListItem. - This is so we can get back to the containing CRCB from a generic item - in a list. */ - listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine ); - listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine ); - - /* Event lists are always in priority order. */ - listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) uxPriority ); - - /* Now the co-routine has been initialised it can be added to the ready - list at the correct priority. */ - prvAddCoRoutineToReadyQueue( pxCoRoutine ); - - xReturn = pdPASS; - } - else - { - xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; - } - - return xReturn; -} -/*-----------------------------------------------------------*/ - -void vCoRoutineAddToDelayedList( portTickType xTicksToDelay, xList *pxEventList ) -{ -portTickType xTimeToWake; - - /* Calculate the time to wake - this may overflow but this is - not a problem. */ - xTimeToWake = xCoRoutineTickCount + xTicksToDelay; - - /* We must remove ourselves from the ready list before adding - ourselves to the blocked list as the same list item is used for - both lists. */ - vListRemove( ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); - - /* The list item will be inserted in wake time order. */ - listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake ); - - if( xTimeToWake < xCoRoutineTickCount ) - { - /* Wake time has overflowed. Place this item in the - overflow list. */ - vListInsert( ( xList * ) pxOverflowDelayedCoRoutineList, ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); - } - else - { - /* The wake time has not overflowed, so we can use the - current block list. */ - vListInsert( ( xList * ) pxDelayedCoRoutineList, ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); - } - - if( pxEventList ) - { - /* Also add the co-routine to an event list. If this is done then the - function must be called with interrupts disabled. */ - vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) ); - } -} -/*-----------------------------------------------------------*/ - -static inline void prvCheckPendingReadyList( void ) -{ - /* Are there any co-routines waiting to get moved to the ready list? These - are co-routines that have been readied by an ISR. The ISR cannot access - the ready lists itself. */ - while( !listLIST_IS_EMPTY( &xPendingReadyList ) ) - { - corCRCB *pxUnblockedCRCB; - - /* The pending ready list can be accessed by an ISR. */ - portDISABLE_INTERRUPTS(); - { - pxUnblockedCRCB = ( corCRCB * ) listGET_OWNER_OF_HEAD_ENTRY( (&xPendingReadyList) ); - vListRemove( &( pxUnblockedCRCB->xEventListItem ) ); - } - portENABLE_INTERRUPTS(); - - vListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); - prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); - } -} -/*-----------------------------------------------------------*/ - -static inline void prvCheckDelayedList( void ) -{ -static portTickType xLastTickCount, xPassedTicks; -corCRCB *pxCRCB; - - xPassedTicks = xTaskGetTickCount() - xLastTickCount; - while( xPassedTicks ) - { - xCoRoutineTickCount++; - xPassedTicks--; - - /* If the tick count has overflowed we need to swap the ready lists. */ - if( xCoRoutineTickCount == 0 ) - { - xList * pxTemp; - - /* Tick count has overflowed so we need to swap the delay lists. If there are - any items in pxDelayedCoRoutineList here then there is an error! */ - pxTemp = pxDelayedCoRoutineList; - pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList; - pxOverflowDelayedCoRoutineList = pxTemp; - } - - /* See if this tick has made a timeout expire. */ - while( ( pxCRCB = ( corCRCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ) ) != NULL ) - { - if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) - { - /* Timeout not yet expired. */ - break; - } - - portDISABLE_INTERRUPTS(); - { - /* The event could have occurred just before this critical - section. If this is the case then the generic list item will - have been moved to the pending ready list and the following - line is still valid. Also the pvContainer parameter will have - been set to NULL so the following lines are also valid. */ - vListRemove( &( pxCRCB->xGenericListItem ) ); - - /* Is the co-routine waiting on an event also? */ - if( pxCRCB->xEventListItem.pvContainer ) - { - vListRemove( &( pxCRCB->xEventListItem ) ); - } - } - portENABLE_INTERRUPTS(); - - prvAddCoRoutineToReadyQueue( pxCRCB ); - } - } - - xLastTickCount = xCoRoutineTickCount; -} -/*-----------------------------------------------------------*/ - -void vCoRoutineSchedule( void ) -{ - /* See if any co-routines readied by events need moving to the ready lists. */ - prvCheckPendingReadyList(); - - /* See if any delayed co-routines have timed out. */ - prvCheckDelayedList(); - - /* Find the highest priority queue that contains ready co-routines. */ - while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) ) - { - if( uxTopCoRoutineReadyPriority == 0 ) - { - /* No more co-routines to check. */ - return; - } - --uxTopCoRoutineReadyPriority; - } - - /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines - of the same priority get an equal share of the processor time. */ - listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ); - - /* Call the co-routine. */ - ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex ); - - return; -} -/*-----------------------------------------------------------*/ - -static void prvInitialiseCoRoutineLists( void ) -{ -unsigned portBASE_TYPE uxPriority; - - for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ ) - { - vListInitialise( ( xList * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); - } - - vListInitialise( ( xList * ) &xDelayedCoRoutineList1 ); - vListInitialise( ( xList * ) &xDelayedCoRoutineList2 ); - vListInitialise( ( xList * ) &xPendingReadyList ); - - /* Start with pxDelayedCoRoutineList using list1 and the - pxOverflowDelayedCoRoutineList using list2. */ - pxDelayedCoRoutineList = &xDelayedCoRoutineList1; - pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2; -} -/*-----------------------------------------------------------*/ - -signed portBASE_TYPE xCoRoutineRemoveFromEventList( const xList *pxEventList ) -{ -corCRCB *pxUnblockedCRCB; -signed portBASE_TYPE xReturn; - - /* This function is called from within an interrupt. It can only access - event lists and the pending ready list. */ - pxUnblockedCRCB = ( corCRCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); - vListRemove( &( pxUnblockedCRCB->xEventListItem ) ); - vListInsertEnd( ( xList * ) &( xPendingReadyList ), &( pxUnblockedCRCB->xEventListItem ) ); - - if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - - return xReturn; -} - diff --git a/FreeRTOS1/include/FreeRTOS.h b/FreeRTOS1/include/FreeRTOS.h deleted file mode 100644 index ee963a4..0000000 --- a/FreeRTOS1/include/FreeRTOS.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -#ifndef INC_FREERTOS_H -#define INC_FREERTOS_H - - -/* - * Include the generic headers required for the FreeRTOS port being used. - */ -#include - -/* Basic FreeRTOS definitions. */ -#include "projdefs.h" - -/* Application specific configuration options. */ -#include "FreeRTOSConfig.h" - -/* Definitions specific to the port being used. */ -#include "portable.h" - - - - - - - -/* - * Check all the required application specific macros have been defined. - * These macros are application specific and (as downloaded) are defined - * within FreeRTOSConfig.h. - */ - -#ifndef configUSE_PREEMPTION - #error Missing definition: configUSE_PREEMPTION should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef configUSE_IDLE_HOOK - #error Missing definition: configUSE_IDLE_HOOK should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef configUSE_TICK_HOOK - #error Missing definition: configUSE_TICK_HOOK should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef configUSE_CO_ROUTINES - #error Missing definition: configUSE_CO_ROUTINES should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef INCLUDE_vTaskPrioritySet - #error Missing definition: INCLUDE_vTaskPrioritySet should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef INCLUDE_uxTaskPriorityGet - #error Missing definition: INCLUDE_uxTaskPriorityGet should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef INCLUDE_vTaskDelete - #error Missing definition: INCLUDE_vTaskDelete should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef INCLUDE_vTaskCleanUpResources - #error Missing definition: INCLUDE_vTaskCleanUpResources should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef INCLUDE_vTaskSuspend - #error Missing definition: INCLUDE_vTaskSuspend should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef INCLUDE_vTaskDelayUntil - #error Missing definition: INCLUDE_vTaskDelayUntil should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef INCLUDE_vTaskDelay - #error Missing definition: INCLUDE_vTaskDelay should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef configUSE_16_BIT_TICKS - #error Missing definition: configUSE_16_BIT_TICKS should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef configUSE_RECURSIVE_MUTEXES - #define configUSE_RECURSIVE_MUTEXES 0 -#endif - -#ifndef configUSE_MUTEXES - #define configUSE_MUTEXES 0 -#endif - -#ifndef configUSE_COUNTING_SEMAPHORES - #define configUSE_COUNTING_SEMAPHORES 0 -#endif - -#ifndef configUSE_ALTERNATIVE_API - #define configUSE_ALTERNATIVE_API 0 -#endif - -#if ( configUSE_MUTEXES == 1 ) - /* xTaskGetCurrentTaskHandle is used by the priority inheritance mechanism - within the mutex implementation so must be available if mutexes are used. */ - #undef INCLUDE_xTaskGetCurrentTaskHandle - #define INCLUDE_xTaskGetCurrentTaskHandle 1 -#else - #ifndef INCLUDE_xTaskGetCurrentTaskHandle - #define INCLUDE_xTaskGetCurrentTaskHandle 0 - #endif -#endif - -#endif /* INC_FREERTOS_H */ diff --git a/FreeRTOS1/include/croutine.h b/FreeRTOS1/include/croutine.h deleted file mode 100644 index 0ba1725..0000000 --- a/FreeRTOS1/include/croutine.h +++ /dev/null @@ -1,730 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ -#ifndef CO_ROUTINE_H -#define CO_ROUTINE_H - -#include "list.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Used to hide the implementation of the co-routine control block. The -control block structure however has to be included in the header due to -the macro implementation of the co-routine functionality. */ -typedef void * xCoRoutineHandle; - -/* Defines the prototype to which co-routine functions must conform. */ -typedef void (*crCOROUTINE_CODE)( xCoRoutineHandle, unsigned portBASE_TYPE ); - -typedef struct corCoRoutineControlBlock -{ - crCOROUTINE_CODE pxCoRoutineFunction; - xListItem xGenericListItem; /*< List item used to place the CRCB in ready and blocked queues. */ - xListItem xEventListItem; /*< List item used to place the CRCB in event lists. */ - unsigned portBASE_TYPE uxPriority; /*< The priority of the co-routine in relation to other co-routines. */ - unsigned portBASE_TYPE uxIndex; /*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ - unsigned portSHORT uxState; /*< Used internally by the co-routine implementation. */ -} corCRCB; /* Co-routine control block. Note must be identical in size down to uxPriority with tskTCB. */ - -/** - * croutine. h - *
- portBASE_TYPE xCoRoutineCreate(
-                                 crCOROUTINE_CODE pxCoRoutineCode,
-                                 unsigned portBASE_TYPE uxPriority,
-                                 unsigned portBASE_TYPE uxIndex
-                               );
- * - * Create a new co-routine and add it to the list of co-routines that are - * ready to run. - * - * @param pxCoRoutineCode Pointer to the co-routine function. Co-routine - * functions require special syntax - see the co-routine section of the WEB - * documentation for more information. - * - * @param uxPriority The priority with respect to other co-routines at which - * the co-routine will run. - * - * @param uxIndex Used to distinguish between different co-routines that - * execute the same function. See the example below and the co-routine section - * of the WEB documentation for further information. - * - * @return pdPASS if the co-routine was successfully created and added to a ready - * list, otherwise an error code defined with ProjDefs.h. - * - * Example usage: -
- // Co-routine to be created.
- void vFlashCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
- {
- // Variables in co-routines must be declared static if they must maintain value across a blocking call.
- // This may not be necessary for const variables.
- static const char cLedToFlash[ 2 ] = { 5, 6 };
- static const portTickType xTimeToDelay[ 2 ] = { 200, 400 };
-
-     // Must start every co-routine with a call to crSTART();
-     crSTART( xHandle );
-
-     for( ;; )
-     {
-         // This co-routine just delays for a fixed period, then toggles
-         // an LED.  Two co-routines are created using this function, so
-         // the uxIndex parameter is used to tell the co-routine which
-         // LED to flash and how long to delay.  This assumes xQueue has
-         // already been created.
-         vParTestToggleLED( cLedToFlash[ uxIndex ] );
-         crDELAY( xHandle, uxFlashRates[ uxIndex ] );
-     }
-
-     // Must end every co-routine with a call to crEND();
-     crEND();
- }
-
- // Function that creates two co-routines.
- void vOtherFunction( void )
- {
- unsigned char ucParameterToPass;
- xTaskHandle xHandle;
-		
-     // Create two co-routines at priority 0.  The first is given index 0
-     // so (from the code above) toggles LED 5 every 200 ticks.  The second
-     // is given index 1 so toggles LED 6 every 400 ticks.
-     for( uxIndex = 0; uxIndex < 2; uxIndex++ )
-     {
-         xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex );
-     }
- }
-   
- * \defgroup xCoRoutineCreate xCoRoutineCreate - * \ingroup Tasks - */ -signed portBASE_TYPE xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, unsigned portBASE_TYPE uxPriority, unsigned portBASE_TYPE uxIndex ); - - -/** - * croutine. h - *
- void vCoRoutineSchedule( void );
- * - * Run a co-routine. - * - * vCoRoutineSchedule() executes the highest priority co-routine that is able - * to run. The co-routine will execute until it either blocks, yields or is - * preempted by a task. Co-routines execute cooperatively so one - * co-routine cannot be preempted by another, but can be preempted by a task. - * - * If an application comprises of both tasks and co-routines then - * vCoRoutineSchedule should be called from the idle task (in an idle task - * hook). - * - * Example usage: -
- // This idle task hook will schedule a co-routine each time it is called.
- // The rest of the idle task will execute between co-routine calls.
- void vApplicationIdleHook( void )
- {
-	vCoRoutineSchedule();
- }
-
- // Alternatively, if you do not require any other part of the idle task to
- // execute, the idle task hook can call vCoRoutineScheduler() within an
- // infinite loop.
- void vApplicationIdleHook( void )
- {
-    for( ;; )
-    {
-        vCoRoutineSchedule();
-    }
- }
- 
- * \defgroup vCoRoutineSchedule vCoRoutineSchedule - * \ingroup Tasks - */ -void vCoRoutineSchedule( void ); - -/** - * croutine. h - *
- crSTART( xCoRoutineHandle xHandle );
- * - * This macro MUST always be called at the start of a co-routine function. - * - * Example usage: -
- // Co-routine to be created.
- void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
- {
- // Variables in co-routines must be declared static if they must maintain value across a blocking call.
- static portLONG ulAVariable;
-
-     // Must start every co-routine with a call to crSTART();
-     crSTART( xHandle );
-
-     for( ;; )
-     {
-          // Co-routine functionality goes here.
-     }
-
-     // Must end every co-routine with a call to crEND();
-     crEND();
- }
- * \defgroup crSTART crSTART - * \ingroup Tasks - */ -#define crSTART( pxCRCB ) switch( ( ( corCRCB * )pxCRCB )->uxState ) { case 0: - -/** - * croutine. h - *
- crEND();
- * - * This macro MUST always be called at the end of a co-routine function. - * - * Example usage: -
- // Co-routine to be created.
- void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
- {
- // Variables in co-routines must be declared static if they must maintain value across a blocking call.
- static portLONG ulAVariable;
-
-     // Must start every co-routine with a call to crSTART();
-     crSTART( xHandle );
-
-     for( ;; )
-     {
-          // Co-routine functionality goes here.
-     }
-
-     // Must end every co-routine with a call to crEND();
-     crEND();
- }
- * \defgroup crSTART crSTART - * \ingroup Tasks - */ -#define crEND() } - -/* - * These macros are intended for internal use by the co-routine implementation - * only. The macros should not be used directly by application writers. - */ -#define crSET_STATE0( xHandle ) ( ( corCRCB * )xHandle)->uxState = (__LINE__ * 2); return; case (__LINE__ * 2): -#define crSET_STATE1( xHandle ) ( ( corCRCB * )xHandle)->uxState = ((__LINE__ * 2)+1); return; case ((__LINE__ * 2)+1): - -/** - * croutine. h - *
- crDELAY( xCoRoutineHandle xHandle, portTickType xTicksToDelay );
- * - * Delay a co-routine for a fixed period of time. - * - * crDELAY can only be called from the co-routine function itself - not - * from within a function called by the co-routine function. This is because - * co-routines do not maintain their own stack. - * - * @param xHandle The handle of the co-routine to delay. This is the xHandle - * parameter of the co-routine function. - * - * @param xTickToDelay The number of ticks that the co-routine should delay - * for. The actual amount of time this equates to is defined by - * configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant portTICK_RATE_MS - * can be used to convert ticks to milliseconds. - * - * Example usage: -
- // Co-routine to be created.
- void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
- {
- // Variables in co-routines must be declared static if they must maintain value across a blocking call.
- // This may not be necessary for const variables.
- // We are to delay for 200ms.
- static const xTickType xDelayTime = 200 / portTICK_RATE_MS;
-
-     // Must start every co-routine with a call to crSTART();
-     crSTART( xHandle );
-
-     for( ;; )
-     {
-        // Delay for 200ms.
-        crDELAY( xHandle, xDelayTime );
-
-        // Do something here.
-     }
-
-     // Must end every co-routine with a call to crEND();
-     crEND();
- }
- * \defgroup crDELAY crDELAY - * \ingroup Tasks - */ -#define crDELAY( xHandle, xTicksToDelay ) \ - if( xTicksToDelay > 0 ) \ - { \ - vCoRoutineAddToDelayedList( xTicksToDelay, NULL ); \ - } \ - crSET_STATE0( xHandle ); - -/** - *
- crQUEUE_SEND(
-                  xCoRoutineHandle xHandle,
-                  xQueueHandle pxQueue,
-                  void *pvItemToQueue,
-                  portTickType xTicksToWait,
-                  portBASE_TYPE *pxResult
-             )
- * - * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine - * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. - * - * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas - * xQueueSend() and xQueueReceive() can only be used from tasks. - * - * crQUEUE_SEND can only be called from the co-routine function itself - not - * from within a function called by the co-routine function. This is because - * co-routines do not maintain their own stack. - * - * See the co-routine section of the WEB documentation for information on - * passing data between tasks and co-routines and between ISR's and - * co-routines. - * - * @param xHandle The handle of the calling co-routine. This is the xHandle - * parameter of the co-routine function. - * - * @param pxQueue The handle of the queue on which the data will be posted. - * The handle is obtained as the return value when the queue is created using - * the xQueueCreate() API function. - * - * @param pvItemToQueue A pointer to the data being posted onto the queue. - * The number of bytes of each queued item is specified when the queue is - * created. This number of bytes is copied from pvItemToQueue into the queue - * itself. - * - * @param xTickToDelay The number of ticks that the co-routine should block - * to wait for space to become available on the queue, should space not be - * available immediately. The actual amount of time this equates to is defined - * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant - * portTICK_RATE_MS can be used to convert ticks to milliseconds (see example - * below). - * - * @param pxResult The variable pointed to by pxResult will be set to pdPASS if - * data was successfully posted onto the queue, otherwise it will be set to an - * error defined within ProjDefs.h. - * - * Example usage: -
- // Co-routine function that blocks for a fixed period then posts a number onto
- // a queue.
- static void prvCoRoutineFlashTask( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
- {
- // Variables in co-routines must be declared static if they must maintain value across a blocking call.
- static portBASE_TYPE xNumberToPost = 0;
- static portBASE_TYPE xResult;
-
-    // Co-routines must begin with a call to crSTART().
-    crSTART( xHandle );
-
-    for( ;; )
-    {
-        // This assumes the queue has already been created.
-        crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult );
-
-        if( xResult != pdPASS )
-        {
-            // The message was not posted!
-        }
-
-        // Increment the number to be posted onto the queue.
-        xNumberToPost++;
-
-        // Delay for 100 ticks.
-        crDELAY( xHandle, 100 );
-    }
-
-    // Co-routines must end with a call to crEND().
-    crEND();
- }
- * \defgroup crQUEUE_SEND crQUEUE_SEND - * \ingroup Tasks - */ -#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult ) \ -{ \ - *pxResult = xQueueCRSend( pxQueue, pvItemToQueue, xTicksToWait ); \ - if( *pxResult == errQUEUE_BLOCKED ) \ - { \ - crSET_STATE0( xHandle ); \ - *pxResult = xQueueCRSend( pxQueue, pvItemToQueue, 0 ); \ - } \ - if( *pxResult == errQUEUE_YIELD ) \ - { \ - crSET_STATE1( xHandle ); \ - *pxResult = pdPASS; \ - } \ -} - -/** - * croutine. h - *
-  crQUEUE_RECEIVE(
-                     xCoRoutineHandle xHandle,
-                     xQueueHandle pxQueue,
-                     void *pvBuffer,
-                     portTickType xTicksToWait,
-                     portBASE_TYPE *pxResult
-                 )
- * - * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine - * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. - * - * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas - * xQueueSend() and xQueueReceive() can only be used from tasks. - * - * crQUEUE_RECEIVE can only be called from the co-routine function itself - not - * from within a function called by the co-routine function. This is because - * co-routines do not maintain their own stack. - * - * See the co-routine section of the WEB documentation for information on - * passing data between tasks and co-routines and between ISR's and - * co-routines. - * - * @param xHandle The handle of the calling co-routine. This is the xHandle - * parameter of the co-routine function. - * - * @param pxQueue The handle of the queue from which the data will be received. - * The handle is obtained as the return value when the queue is created using - * the xQueueCreate() API function. - * - * @param pvBuffer The buffer into which the received item is to be copied. - * The number of bytes of each queued item is specified when the queue is - * created. This number of bytes is copied into pvBuffer. - * - * @param xTickToDelay The number of ticks that the co-routine should block - * to wait for data to become available from the queue, should data not be - * available immediately. The actual amount of time this equates to is defined - * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant - * portTICK_RATE_MS can be used to convert ticks to milliseconds (see the - * crQUEUE_SEND example). - * - * @param pxResult The variable pointed to by pxResult will be set to pdPASS if - * data was successfully retrieved from the queue, otherwise it will be set to - * an error code as defined within ProjDefs.h. - * - * Example usage: -
- // A co-routine receives the number of an LED to flash from a queue.  It
- // blocks on the queue until the number is received.
- static void prvCoRoutineFlashWorkTask( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
- {
- // Variables in co-routines must be declared static if they must maintain value across a blocking call.
- static portBASE_TYPE xResult;
- static unsigned portBASE_TYPE uxLEDToFlash;
-
-    // All co-routines must start with a call to crSTART().
-    crSTART( xHandle );
-
-    for( ;; )
-    {
-        // Wait for data to become available on the queue.
-        crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
-
-        if( xResult == pdPASS )
-        {
-            // We received the LED to flash - flash it!
-            vParTestToggleLED( uxLEDToFlash );
-        }
-    }
-
-    crEND();
- }
- * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE - * \ingroup Tasks - */ -#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult ) \ -{ \ - *pxResult = xQueueCRReceive( pxQueue, pvBuffer, xTicksToWait ); \ - if( *pxResult == errQUEUE_BLOCKED ) \ - { \ - crSET_STATE0( xHandle ); \ - *pxResult = xQueueCRReceive( pxQueue, pvBuffer, 0 ); \ - } \ - if( *pxResult == errQUEUE_YIELD ) \ - { \ - crSET_STATE1( xHandle ); \ - *pxResult = pdPASS; \ - } \ -} - -/** - * croutine. h - *
-  crQUEUE_SEND_FROM_ISR(
-                            xQueueHandle pxQueue,
-                            void *pvItemToQueue,
-                            portBASE_TYPE xCoRoutinePreviouslyWoken
-                       )
- * - * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the - * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() - * functions used by tasks. - * - * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to - * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and - * xQueueReceiveFromISR() can only be used to pass data between a task and and - * ISR. - * - * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue - * that is being used from within a co-routine. - * - * See the co-routine section of the WEB documentation for information on - * passing data between tasks and co-routines and between ISR's and - * co-routines. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto - * the same queue multiple times from a single interrupt. The first call - * should always pass in pdFALSE. Subsequent calls should pass in - * the value returned from the previous call. - * - * @return pdTRUE if a co-routine was woken by posting onto the queue. This is - * used by the ISR to determine if a context switch may be required following - * the ISR. - * - * Example usage: -
- // A co-routine that blocks on a queue waiting for characters to be received.
- static void vReceivingCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
- {
- portCHAR cRxedChar;
- portBASE_TYPE xResult;
-
-     // All co-routines must start with a call to crSTART().
-     crSTART( xHandle );
-
-     for( ;; )
-     {
-         // Wait for data to become available on the queue.  This assumes the
-         // queue xCommsRxQueue has already been created!
-         crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
-
-         // Was a character received?
-         if( xResult == pdPASS )
-         {
-             // Process the character here.
-         }
-     }
-
-     // All co-routines must end with a call to crEND().
-     crEND();
- }
-
- // An ISR that uses a queue to send characters received on a serial port to
- // a co-routine.
- void vUART_ISR( void )
- {
- portCHAR cRxedChar;
- portBASE_TYPE xCRWokenByPost = pdFALSE;
-
-     // We loop around reading characters until there are none left in the UART.
-     while( UART_RX_REG_NOT_EMPTY() )
-     {
-         // Obtain the character from the UART.
-         cRxedChar = UART_RX_REG;
-
-         // Post the character onto a queue.  xCRWokenByPost will be pdFALSE
-         // the first time around the loop.  If the post causes a co-routine
-         // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE.
-         // In this manner we can ensure that if more than one co-routine is
-         // blocked on the queue only one is woken by this ISR no matter how
-         // many characters are posted to the queue.
-         xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost );
-     }
- }
- * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR - * \ingroup Tasks - */ -#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) xQueueCRSendFromISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) - - -/** - * croutine. h - *
-  crQUEUE_SEND_FROM_ISR(
-                            xQueueHandle pxQueue,
-                            void *pvBuffer,
-                            portBASE_TYPE * pxCoRoutineWoken
-                       )
- * - * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the - * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() - * functions used by tasks. - * - * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to - * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and - * xQueueReceiveFromISR() can only be used to pass data between a task and and - * ISR. - * - * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data - * from a queue that is being used from within a co-routine (a co-routine - * posted to the queue). - * - * See the co-routine section of the WEB documentation for information on - * passing data between tasks and co-routines and between ISR's and - * co-routines. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvBuffer A pointer to a buffer into which the received item will be - * placed. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from the queue into - * pvBuffer. - * - * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become - * available on the queue. If crQUEUE_RECEIVE_FROM_ISR causes such a - * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise - * *pxCoRoutineWoken will remain unchanged. - * - * @return pdTRUE an item was successfully received from the queue, otherwise - * pdFALSE. - * - * Example usage: -
- // A co-routine that posts a character to a queue then blocks for a fixed
- // period.  The character is incremented each time.
- static void vSendingCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
- {
- // cChar holds its value while this co-routine is blocked and must therefore
- // be declared static.
- static portCHAR cCharToTx = 'a';
- portBASE_TYPE xResult;
-
-     // All co-routines must start with a call to crSTART().
-     crSTART( xHandle );
-
-     for( ;; )
-     {
-         // Send the next character to the queue.
-         crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult );
-
-         if( xResult == pdPASS )
-         {
-             // The character was successfully posted to the queue.
-         }
-		 else
-		 {
-			// Could not post the character to the queue.
-		 }
-
-         // Enable the UART Tx interrupt to cause an interrupt in this
-		 // hypothetical UART.  The interrupt will obtain the character
-		 // from the queue and send it.
-		 ENABLE_RX_INTERRUPT();
-
-		 // Increment to the next character then block for a fixed period.
-		 // cCharToTx will maintain its value across the delay as it is
-		 // declared static.
-		 cCharToTx++;
-		 if( cCharToTx > 'x' )
-		 {
-			cCharToTx = 'a';
-		 }
-		 crDELAY( 100 );
-     }
-
-     // All co-routines must end with a call to crEND().
-     crEND();
- }
-
- // An ISR that uses a queue to receive characters to send on a UART.
- void vUART_ISR( void )
- {
- portCHAR cCharToTx;
- portBASE_TYPE xCRWokenByPost = pdFALSE;
-
-     while( UART_TX_REG_EMPTY() )
-     {
-         // Are there any characters in the queue waiting to be sent?
-		 // xCRWokenByPost will automatically be set to pdTRUE if a co-routine
-		 // is woken by the post - ensuring that only a single co-routine is
-		 // woken no matter how many times we go around this loop.
-         if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) )
-		 {
-			 SEND_CHARACTER( cCharToTx );
-		 }
-     }
- }
- * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR - * \ingroup Tasks - */ -#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) xQueueCRReceiveFromISR( pxQueue, pvBuffer, pxCoRoutineWoken ) - -/* - * This function is intended for internal use by the co-routine macros only. - * The macro nature of the co-routine implementation requires that the - * prototype appears here. The function should not be used by application - * writers. - * - * Removes the current co-routine from its ready list and places it in the - * appropriate delayed list. - */ -void vCoRoutineAddToDelayedList( portTickType xTicksToDelay, xList *pxEventList ); - -/* - * This function is intended for internal use by the queue implementation only. - * The function should not be used by application writers. - * - * Removes the highest priority co-routine from the event list and places it in - * the pending ready list. - */ -signed portBASE_TYPE xCoRoutineRemoveFromEventList( const xList *pxEventList ); - -#ifdef __cplusplus -} -#endif - -#endif /* CO_ROUTINE_H */ diff --git a/FreeRTOS1/include/list.h b/FreeRTOS1/include/list.h deleted file mode 100644 index 78fe086..0000000 --- a/FreeRTOS1/include/list.h +++ /dev/null @@ -1,294 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -/* - * This is the list implementation used by the scheduler. While it is tailored - * heavily for the schedulers needs, it is also available for use by - * application code. - * - * xLists can only store pointers to xListItems. Each xListItem contains a - * numeric value (xItemValue). Most of the time the lists are sorted in - * descending item value order. - * - * Lists are created already containing one list item. The value of this - * item is the maximum possible that can be stored, it is therefore always at - * the end of the list and acts as a marker. The list member pxHead always - * points to this marker - even though it is at the tail of the list. This - * is because the tail contains a wrap back pointer to the true head of - * the list. - * - * In addition to it's value, each list item contains a pointer to the next - * item in the list (pxNext), a pointer to the list it is in (pxContainer) - * and a pointer to back to the object that contains it. These later two - * pointers are included for efficiency of list manipulation. There is - * effectively a two way link between the object containing the list item and - * the list item itself. - * - * - * \page ListIntroduction List Implementation - * \ingroup FreeRTOSIntro - */ - -/* - Changes from V4.3.1 - - + Included local const within listGET_OWNER_OF_NEXT_ENTRY() to assist - compiler with optimisation. Thanks B.R. -*/ - -#ifndef LIST_H -#define LIST_H - -#ifdef __cplusplus -extern "C" { -#endif -/* - * Definition of the only type of object that a list can contain. - */ -struct xLIST_ITEM -{ - portTickType xItemValue; /*< The value being listed. In most cases this is used to sort the list in descending order. */ - volatile struct xLIST_ITEM * pxNext; /*< Pointer to the next xListItem in the list. */ - volatile struct xLIST_ITEM * pxPrevious;/*< Pointer to the previous xListItem in the list. */ - void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ - void * pvContainer; /*< Pointer to the list in which this list item is placed (if any). */ -}; -typedef struct xLIST_ITEM xListItem; /* For some reason lint wants this as two separate definitions. */ - -struct xMINI_LIST_ITEM -{ - portTickType xItemValue; - volatile struct xLIST_ITEM *pxNext; - volatile struct xLIST_ITEM *pxPrevious; -}; -typedef struct xMINI_LIST_ITEM xMiniListItem; - -/* - * Definition of the type of queue used by the scheduler. - */ -typedef struct xLIST -{ - volatile unsigned portBASE_TYPE uxNumberOfItems; - volatile xListItem * pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to pvListGetOwnerOfNextEntry (). */ - volatile xMiniListItem xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ -} xList; - -/* - * Access macro to set the owner of a list item. The owner of a list item - * is the object (usually a TCB) that contains the list item. - * - * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER - * \ingroup LinkedList - */ -#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( pxListItem )->pvOwner = ( void * ) pxOwner - -/* - * Access macro to set the value of the list item. In most cases the value is - * used to sort the list in descending order. - * - * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE - * \ingroup LinkedList - */ -#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( pxListItem )->xItemValue = xValue - -/* - * Access macro the retrieve the value of the list item. The value can - * represent anything - for example a the priority of a task, or the time at - * which a task should be unblocked. - * - * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE - * \ingroup LinkedList - */ -#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) - -/* - * Access macro to determine if a list contains any items. The macro will - * only have the value true if the list is empty. - * - * \page listLIST_IS_EMPTY listLIST_IS_EMPTY - * \ingroup LinkedList - */ -#define listLIST_IS_EMPTY( pxList ) ( ( pxList )->uxNumberOfItems == ( unsigned portBASE_TYPE ) 0 ) - -/* - * Access macro to return the number of items in the list. - */ -#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) - -/* - * Access function to obtain the owner of the next entry in a list. - * - * The list member pxIndex is used to walk through a list. Calling - * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list - * and returns that entries pxOwner parameter. Using multiple calls to this - * function it is therefore possible to move through every item contained in - * a list. - * - * The pxOwner parameter of a list item is a pointer to the object that owns - * the list item. In the scheduler this is normally a task control block. - * The pxOwner parameter effectively creates a two way link between the list - * item and its owner. - * - * @param pxList The list from which the next item owner is to be returned. - * - * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY - * \ingroup LinkedList - */ -#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ -{ \ -xList * const pxConstList = pxList; \ - /* Increment the index to the next item and return the item, ensuring */ \ - /* we don't return the marker used at the end of the list. */ \ - ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ - if( ( pxConstList )->pxIndex == ( xListItem * ) &( ( pxConstList )->xListEnd ) ) \ - { \ - ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ - } \ - pxTCB = ( pxConstList )->pxIndex->pvOwner; \ -} - - -/* - * Access function to obtain the owner of the first entry in a list. Lists - * are normally sorted in ascending item value order. - * - * This function returns the pxOwner member of the first item in the list. - * The pxOwner parameter of a list item is a pointer to the object that owns - * the list item. In the scheduler this is normally a task control block. - * The pxOwner parameter effectively creates a two way link between the list - * item and its owner. - * - * @param pxList The list from which the owner of the head item is to be - * returned. - * - * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY - * \ingroup LinkedList - */ -#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( ( pxList->uxNumberOfItems != ( unsigned portBASE_TYPE ) 0 ) ? ( (&( pxList->xListEnd ))->pxNext->pvOwner ) : ( NULL ) ) - -/* - * Check to see if a list item is within a list. The list item maintains a - * "container" pointer that points to the list it is in. All this macro does - * is check to see if the container and the list match. - * - * @param pxList The list we want to know if the list item is within. - * @param pxListItem The list item we want to know if is in the list. - * @return pdTRUE is the list item is in the list, otherwise pdFALSE. - * pointer against - */ -#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( pxListItem )->pvContainer == ( void * ) pxList ) - -/* - * Must be called before a list is used! This initialises all the members - * of the list structure and inserts the xListEnd item into the list as a - * marker to the back of the list. - * - * @param pxList Pointer to the list being initialised. - * - * \page vListInitialise vListInitialise - * \ingroup LinkedList - */ -void vListInitialise( xList *pxList ); - -/* - * Must be called before a list item is used. This sets the list container to - * null so the item does not think that it is already contained in a list. - * - * @param pxItem Pointer to the list item being initialised. - * - * \page vListInitialiseItem vListInitialiseItem - * \ingroup LinkedList - */ -void vListInitialiseItem( xListItem *pxItem ); - -/* - * Insert a list item into a list. The item will be inserted into the list in - * a position determined by its item value (descending item value order). - * - * @param pxList The list into which the item is to be inserted. - * - * @param pxNewListItem The item to that is to be placed in the list. - * - * \page vListInsert vListInsert - * \ingroup LinkedList - */ -void vListInsert( xList *pxList, xListItem *pxNewListItem ); - -/* - * Insert a list item into a list. The item will be inserted in a position - * such that it will be the last item within the list returned by multiple - * calls to listGET_OWNER_OF_NEXT_ENTRY. - * - * The list member pvIndex is used to walk through a list. Calling - * listGET_OWNER_OF_NEXT_ENTRY increments pvIndex to the next item in the list. - * Placing an item in a list using vListInsertEnd effectively places the item - * in the list position pointed to by pvIndex. This means that every other - * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before - * the pvIndex parameter again points to the item being inserted. - * - * @param pxList The list into which the item is to be inserted. - * - * @param pxNewListItem The list item to be inserted into the list. - * - * \page vListInsertEnd vListInsertEnd - * \ingroup LinkedList - */ -void vListInsertEnd( xList *pxList, xListItem *pxNewListItem ); - -/* - * Remove an item from a list. The list item has a pointer to the list that - * it is in, so only the list item need be passed into the function. - * - * @param vListRemove The item to be removed. The item will remove itself from - * the list pointed to by it's pxContainer parameter. - * - * \page vListRemove vListRemove - * \ingroup LinkedList - */ -void vListRemove( xListItem *pxItemToRemove ); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/FreeRTOS1/include/portable.h b/FreeRTOS1/include/portable.h deleted file mode 100644 index 2acf92b..0000000 --- a/FreeRTOS1/include/portable.h +++ /dev/null @@ -1,271 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http:www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -/*----------------------------------------------------------- - * Portable layer API. Each function must be defined for each port. - *----------------------------------------------------------*/ - -#ifndef PORTABLE_H -#define PORTABLE_H - -/* Include the macro file relevant to the port being used. */ - -#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT - #include "..\..\source\portable\owatcom\16bitdos\pc\portmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT - #include "..\..\source\portable\owatcom\16bitdos\flsh186\portmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef GCC_MEGA_AVR - #include "../portable/GCC/ATMega323/portmacro.h" -#endif - -#ifdef IAR_MEGA_AVR - #include "../portable/IAR/ATMega323/portmacro.h" -#endif - -#ifdef MPLAB_PIC24_PORT - #include "..\..\Source\portable\MPLAB\PIC24_dsPIC\portmacro.h" -#endif - -#ifdef MPLAB_DSPIC_PORT - #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" -#endif - -#ifdef AIC_DSPIC_PORT -#include "../../FreeRTOS/portable/AIC-2.0.0/portmacro.h" -#endif - -#ifdef MPLAB_PIC18F_PORT - #include "..\..\source\portable\MPLAB\PIC18F\portmacro.h" -#endif - -#ifdef MPLAB_PIC32MX_PORT - #include "..\..\Source\portable\MPLAB\PIC32MX\portmacro.h" -#endif - -#ifdef _FEDPICC - #include "libFreeRTOS/Include/portmacro.h" -#endif - -#ifdef SDCC_CYGNAL - #include "../../Source/portable/SDCC/Cygnal/portmacro.h" -#endif - -#ifdef GCC_ARM7 - #include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" -#endif - -#ifdef GCC_ARM7_ECLIPSE - #include "portmacro.h" -#endif - -#ifdef ROWLEY_LPC23xx - #include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" -#endif - -#ifdef GCC_MSP430 - #include "../../Source/portable/GCC/MSP430F449/portmacro.h" -#endif - -#ifdef ROWLEY_MSP430 - #include "../../Source/portable/Rowley/MSP430F449/portmacro.h" -#endif - -#ifdef KEIL_ARM7 - #include "..\..\Source\portable\Keil\ARM7\portmacro.h" -#endif - -#ifdef SAM7_GCC - #include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" -#endif - -#ifdef SAM7_IAR - #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" -#endif - -#ifdef LPC2000_IAR - #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" -#endif - -#ifdef STR71X_IAR - #include "..\..\Source\portable\IAR\STR71x\portmacro.h" -#endif - -#ifdef STR75X_IAR - #include "..\..\Source\portable\IAR\STR75x\portmacro.h" -#endif - -#ifdef STR75X_GCC - #include "..\..\Source\portable\GCC\STR75x\portmacro.h" -#endif - -#ifdef STR91X_IAR - #include "..\..\Source\portable\IAR\STR91x\portmacro.h" -#endif - -#ifdef GCC_H8S - #include "../../Source/portable/GCC/H8S2329/portmacro.h" -#endif - -#ifdef GCC_AT91FR40008 - #include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" -#endif - -#ifdef RVDS_ARMCM3_LM3S102 - #include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" -#endif - -#ifdef GCC_ARMCM3_LM3S102 - #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" -#endif - -#ifdef GCC_ARMCM3 - #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" -#endif - -#ifdef IAR_ARM_CM3 - #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" -#endif - -#ifdef IAR_ARMCM3_LM - #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" -#endif - -#ifdef HCS12_CODE_WARRIOR - #include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" -#endif - -#ifdef MICROBLAZE_GCC - #include "../../Source/portable/GCC/MicroBlaze/portmacro.h" -#endif - -#ifdef TERN_EE - #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" -#endif - -#ifdef GCC_HCS12 - #include "../../Source/portable/GCC/HCS12/portmacro.h" -#endif - -#ifdef GCC_MCF5235 - #include "../../Source/portable/GCC/MCF5235/portmacro.h" -#endif - -#ifdef BCC_INDUSTRIAL_PC_PORT - /* A short file name has to be used in place of the normal - FreeRTOSConfig.h when using the Borland compiler. */ - #include "frconfig.h" - #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef BCC_FLASH_LITE_186_PORT - /* A short file name has to be used in place of the normal - FreeRTOSConfig.h when using the Borland compiler. */ - #include "frconfig.h" - #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef __GNUC__ - #ifdef __AVR32_AVR32A__ - #include "portmacro.h" - #endif -#endif - -#ifdef __ICCAVR32__ - #ifdef __CORE__ - #if __CORE__ == __AVR32A__ - #include "portmacro.h" - #endif - #endif -#endif - -#ifdef __91467D - #include "portmacro.h" -#endif - -#ifdef __96340 - #include "portmacro.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif -/* - * Setup the stack of a new task so it is ready to be placed under the - * scheduler control. The registers have to be placed on the stack in - * the order that the port expects to find them. - */ -portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ); - -/* - * Map to the memory management routines required for the port. - */ -void *pvPortMalloc( size_t xSize ); -void vPortFree( void *pv ); -void vPortInitialiseBlocks( void ); - -/* - * Setup the hardware ready for the scheduler to take control. This generally - * sets up a tick interrupt and sets timers for the correct tick frequency. - */ -portBASE_TYPE xPortStartScheduler( void ); - -/* - * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so - * the hardware is left in its original condition after the scheduler stops - * executing. - */ -void vPortEndScheduler( void ); - -#ifdef __cplusplus -} -#endif - -#endif /* PORTABLE_H */ - diff --git a/FreeRTOS1/include/projdefs.h b/FreeRTOS1/include/projdefs.h deleted file mode 100644 index 44a523a..0000000 --- a/FreeRTOS1/include/projdefs.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -#ifndef PROJDEFS_H -#define PROJDEFS_H - -/* Defines to prototype to which task functions must conform. */ -typedef void (*pdTASK_CODE)( void * ); - -#define pdTRUE ( 1 ) -#define pdFALSE ( 0 ) - -#define pdPASS ( 1 ) -#define pdFAIL ( 0 ) -#define errQUEUE_EMPTY ( 0 ) -#define errQUEUE_FULL ( 0 ) - -/* Error definitions. */ -#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) -#define errNO_TASK_TO_RUN ( -2 ) -#define errQUEUE_BLOCKED ( -4 ) -#define errQUEUE_YIELD ( -5 ) - -#endif /* PROJDEFS_H */ - - - diff --git a/FreeRTOS1/include/queue.h b/FreeRTOS1/include/queue.h deleted file mode 100644 index be561ad..0000000 --- a/FreeRTOS1/include/queue.h +++ /dev/null @@ -1,1222 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -#ifndef QUEUE_H -#define QUEUE_H - -#ifdef __cplusplus -extern "C" { -#endif -typedef void * xQueueHandle; - -/* For internal use only. */ -#define queueSEND_TO_BACK ( 0 ) -#define queueSEND_TO_FRONT ( 1 ) - - -/** - * queue. h - *
- xQueueHandle xQueueCreate(
-                              unsigned portBASE_TYPE uxQueueLength,
-                              unsigned portBASE_TYPE uxItemSize
-                          );
- * 
- * - * Creates a new queue instance. This allocates the storage required by the - * new queue and returns a handle for the queue. - * - * @param uxQueueLength The maximum number of items that the queue can contain. - * - * @param uxItemSize The number of bytes each item in the queue will require. - * Items are queued by copy, not by reference, so this is the number of bytes - * that will be copied for each posted item. Each item on the queue must be - * the same size. - * - * @return If the queue is successfully create then a handle to the newly - * created queue is returned. If the queue cannot be created then 0 is - * returned. - * - * Example usage: -
- struct AMessage
- {
-    portCHAR ucMessageID;
-    portCHAR ucData[ 20 ];
- };
-
- void vATask( void *pvParameters )
- {
- xQueueHandle xQueue1, xQueue2;
-
-    // Create a queue capable of containing 10 unsigned long values.
-    xQueue1 = xQueueCreate( 10, sizeof( unsigned portLONG ) );
-    if( xQueue1 == 0 )
-    {
-        // Queue was not created and must not be used.
-    }
-
-    // Create a queue capable of containing 10 pointers to AMessage structures.
-    // These should be passed by pointer as they contain a lot of data.
-    xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
-    if( xQueue2 == 0 )
-    {
-        // Queue was not created and must not be used.
-    }
-
-    // ... Rest of task code.
- }
- 
- * \defgroup xQueueCreate xQueueCreate - * \ingroup QueueManagement - */ -xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize ); - -/** - * queue. h - *
- portBASE_TYPE xQueueSendToToFront(
-                                   xQueueHandle xQueue,
-                                   const void * pvItemToQueue,
-                                   portTickType xTicksToWait
-                               );
- * 
- * - * This is a macro that calls xQueueGenericSend(). - * - * Post an item to the front of a queue. The item is queued by copy, not by - * reference. This function must not be called from an interrupt service - * routine. See xQueueSendFromISR () for an alternative which may be used - * in an ISR. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for space to become available on the queue, should it already - * be full. The call will return immediately if this is set to 0. The - * time is defined in tick periods so the constant portTICK_RATE_MS - * should be used to convert to real time if this is required. - * - * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. - * - * Example usage: -
- struct AMessage
- {
-    portCHAR ucMessageID;
-    portCHAR ucData[ 20 ];
- } xMessage;
-
- unsigned portLONG ulVar = 10UL;
-
- void vATask( void *pvParameters )
- {
- xQueueHandle xQueue1, xQueue2;
- struct AMessage *pxMessage;
-
-    // Create a queue capable of containing 10 unsigned long values.
-    xQueue1 = xQueueCreate( 10, sizeof( unsigned portLONG ) );
-
-    // Create a queue capable of containing 10 pointers to AMessage structures.
-    // These should be passed by pointer as they contain a lot of data.
-    xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
-
-    // ...
-
-    if( xQueue1 != 0 )
-    {
-        // Send an unsigned long.  Wait for 10 ticks for space to become
-        // available if necessary.
-        if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS )
-        {
-            // Failed to post the message, even after 10 ticks.
-        }
-    }
-
-    if( xQueue2 != 0 )
-    {
-        // Send a pointer to a struct AMessage object.  Don't block if the
-        // queue is already full.
-        pxMessage = & xMessage;
-        xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 );
-    }
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueueSend xQueueSend - * \ingroup QueueManagement - */ -#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, queueSEND_TO_FRONT ) - -/** - * queue. h - *
- portBASE_TYPE xQueueSendToBack(
-                                   xQueueHandle xQueue,
-                                   const void * pvItemToQueue,
-                                   portTickType xTicksToWait
-                               );
- * 
- * - * This is a macro that calls xQueueGenericSend(). - * - * Post an item to the back of a queue. The item is queued by copy, not by - * reference. This function must not be called from an interrupt service - * routine. See xQueueSendFromISR () for an alternative which may be used - * in an ISR. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for space to become available on the queue, should it already - * be full. The call will return immediately if this is set to 0. The - * time is defined in tick periods so the constant portTICK_RATE_MS - * should be used to convert to real time if this is required. - * - * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. - * - * Example usage: -
- struct AMessage
- {
-    portCHAR ucMessageID;
-    portCHAR ucData[ 20 ];
- } xMessage;
-
- unsigned portLONG ulVar = 10UL;
-
- void vATask( void *pvParameters )
- {
- xQueueHandle xQueue1, xQueue2;
- struct AMessage *pxMessage;
-
-    // Create a queue capable of containing 10 unsigned long values.
-    xQueue1 = xQueueCreate( 10, sizeof( unsigned portLONG ) );
-
-    // Create a queue capable of containing 10 pointers to AMessage structures.
-    // These should be passed by pointer as they contain a lot of data.
-    xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
-
-    // ...
-
-    if( xQueue1 != 0 )
-    {
-        // Send an unsigned long.  Wait for 10 ticks for space to become
-        // available if necessary.
-        if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS )
-        {
-            // Failed to post the message, even after 10 ticks.
-        }
-    }
-
-    if( xQueue2 != 0 )
-    {
-        // Send a pointer to a struct AMessage object.  Don't block if the
-        // queue is already full.
-        pxMessage = & xMessage;
-        xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 );
-    }
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueueSend xQueueSend - * \ingroup QueueManagement - */ -#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, queueSEND_TO_BACK ) - -/** - * queue. h - *
- portBASE_TYPE xQueueSend(
-                              xQueueHandle xQueue,
-                              const void * pvItemToQueue,
-                              portTickType xTicksToWait
-                         );
- * 
- * - * This is a macro that calls xQueueGenericSend(). It is included for - * backward compatibility with versions of FreeRTOS.org that did not - * include the xQueueSendToFront() and xQueueSendToBack() macros. It is - * equivalent to xQueueSendToBack(). - * - * Post an item on a queue. The item is queued by copy, not by reference. - * This function must not be called from an interrupt service routine. - * See xQueueSendFromISR () for an alternative which may be used in an ISR. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for space to become available on the queue, should it already - * be full. The call will return immediately if this is set to 0. The - * time is defined in tick periods so the constant portTICK_RATE_MS - * should be used to convert to real time if this is required. - * - * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. - * - * Example usage: -
- struct AMessage
- {
-    portCHAR ucMessageID;
-    portCHAR ucData[ 20 ];
- } xMessage;
-
- unsigned portLONG ulVar = 10UL;
-
- void vATask( void *pvParameters )
- {
- xQueueHandle xQueue1, xQueue2;
- struct AMessage *pxMessage;
-
-    // Create a queue capable of containing 10 unsigned long values.
-    xQueue1 = xQueueCreate( 10, sizeof( unsigned portLONG ) );
-
-    // Create a queue capable of containing 10 pointers to AMessage structures.
-    // These should be passed by pointer as they contain a lot of data.
-    xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
-
-    // ...
-
-    if( xQueue1 != 0 )
-    {
-        // Send an unsigned long.  Wait for 10 ticks for space to become
-        // available if necessary.
-        if( xQueueSend( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS )
-        {
-            // Failed to post the message, even after 10 ticks.
-        }
-    }
-
-    if( xQueue2 != 0 )
-    {
-        // Send a pointer to a struct AMessage object.  Don't block if the
-        // queue is already full.
-        pxMessage = & xMessage;
-        xQueueSend( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 );
-    }
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueueSend xQueueSend - * \ingroup QueueManagement - */ -#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, queueSEND_TO_BACK ) - - -/** - * queue. h - *
- portBASE_TYPE xQueueGenericSend(
-									xQueueHandle xQueue,
-									const void * pvItemToQueue,
-									portTickType xTicksToWait
-									portBASE_TYPE xCopyPosition
-								);
- * 
- * - * It is preferred that the macros xQueueSend(), xQueueSendToFront() and - * xQueueSendToBack() are used in place of calling this function directly. - * - * Post an item on a queue. The item is queued by copy, not by reference. - * This function must not be called from an interrupt service routine. - * See xQueueSendFromISR () for an alternative which may be used in an ISR. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for space to become available on the queue, should it already - * be full. The call will return immediately if this is set to 0. The - * time is defined in tick periods so the constant portTICK_RATE_MS - * should be used to convert to real time if this is required. - * - * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the - * item at the back of the queue, or queueSEND_TO_FRONT to place the item - * at the front of the queue (for high priority messages). - * - * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. - * - * Example usage: -
- struct AMessage
- {
-    portCHAR ucMessageID;
-    portCHAR ucData[ 20 ];
- } xMessage;
-
- unsigned portLONG ulVar = 10UL;
-
- void vATask( void *pvParameters )
- {
- xQueueHandle xQueue1, xQueue2;
- struct AMessage *pxMessage;
-
-    // Create a queue capable of containing 10 unsigned long values.
-    xQueue1 = xQueueCreate( 10, sizeof( unsigned portLONG ) );
-
-    // Create a queue capable of containing 10 pointers to AMessage structures.
-    // These should be passed by pointer as they contain a lot of data.
-    xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
-
-    // ...
-
-    if( xQueue1 != 0 )
-    {
-        // Send an unsigned long.  Wait for 10 ticks for space to become
-        // available if necessary.
-        if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( portTickType ) 10, queueSEND_TO_BACK ) != pdPASS )
-        {
-            // Failed to post the message, even after 10 ticks.
-        }
-    }
-
-    if( xQueue2 != 0 )
-    {
-        // Send a pointer to a struct AMessage object.  Don't block if the
-        // queue is already full.
-        pxMessage = & xMessage;
-        xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0, queueSEND_TO_BACK );
-    }
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueueSend xQueueSend - * \ingroup QueueManagement - */ -signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ); - -/** - * queue. h - *
- portBASE_TYPE xQueuePeek(
-                             xQueueHandle xQueue,
-                             void *pvBuffer,
-                             portTickType xTicksToWait
-                         );
- * - * This is a macro that calls the xQueueGenericReceive() function. - * - * Receive an item from a queue without removing the item from the queue. - * The item is received by copy so a buffer of adequate size must be - * provided. The number of bytes copied into the buffer was defined when - * the queue was created. - * - * Successfully received items remain on the queue so will be returned again - * by the next call, or a call to xQueueReceive(). - * - * This macro must not be used in an interrupt service routine. - * - * @param pxQueue The handle to the queue from which the item is to be - * received. - * - * @param pvBuffer Pointer to the buffer into which the received item will - * be copied. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for an item to receive should the queue be empty at the time - * of the call. The time is defined in tick periods so the constant - * portTICK_RATE_MS should be used to convert to real time if this is required. - * - * @return pdTRUE if an item was successfully received from the queue, - * otherwise pdFALSE. - * - * Example usage: -
- struct AMessage
- {
-    portCHAR ucMessageID;
-    portCHAR ucData[ 20 ];
- } xMessage;
-
- xQueueHandle xQueue;
-
- // Task to create a queue and post a value.
- void vATask( void *pvParameters )
- {
- struct AMessage *pxMessage;
-
-    // Create a queue capable of containing 10 pointers to AMessage structures.
-    // These should be passed by pointer as they contain a lot of data.
-    xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
-    if( xQueue == 0 )
-    {
-        // Failed to create the queue.
-    }
-
-    // ...
-
-    // Send a pointer to a struct AMessage object.  Don't block if the
-    // queue is already full.
-    pxMessage = & xMessage;
-    xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 );
-
-	// ... Rest of task code.
- }
-
- // Task to peek the data from the queue.
- void vADifferentTask( void *pvParameters )
- {
- struct AMessage *pxRxedMessage;
-
-    if( xQueue != 0 )
-    {
-        // Peek a message on the created queue.  Block for 10 ticks if a
-        // message is not immediately available.
-        if( xQueuePeek( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) )
-        {
-            // pcRxedMessage now points to the struct AMessage variable posted
-            // by vATask, but the item still remains on the queue.
-        }
-    }
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueueReceive xQueueReceive - * \ingroup QueueManagement - */ -#define xQueuePeek( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( xQueue, pvBuffer, xTicksToWait, pdTRUE ) - -/** - * queue. h - *
- portBASE_TYPE xQueueReceive(
-                                 xQueueHandle xQueue,
-                                 void *pvBuffer,
-                                 portTickType xTicksToWait
-                            );
- * - * This is a macro that calls the xQueueGenericReceive() function. - * - * Receive an item from a queue. The item is received by copy so a buffer of - * adequate size must be provided. The number of bytes copied into the buffer - * was defined when the queue was created. - * - * Successfully received items are removed from the queue. - * - * This function must not be used in an interrupt service routine. See - * xQueueReceiveFromISR for an alternative that can. - * - * @param pxQueue The handle to the queue from which the item is to be - * received. - * - * @param pvBuffer Pointer to the buffer into which the received item will - * be copied. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for an item to receive should the queue be empty at the time - * of the call. The time is defined in tick periods so the constant - * portTICK_RATE_MS should be used to convert to real time if this is required. - * - * @return pdTRUE if an item was successfully received from the queue, - * otherwise pdFALSE. - * - * Example usage: -
- struct AMessage
- {
-    portCHAR ucMessageID;
-    portCHAR ucData[ 20 ];
- } xMessage;
-
- xQueueHandle xQueue;
-
- // Task to create a queue and post a value.
- void vATask( void *pvParameters )
- {
- struct AMessage *pxMessage;
-
-    // Create a queue capable of containing 10 pointers to AMessage structures.
-    // These should be passed by pointer as they contain a lot of data.
-    xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
-    if( xQueue == 0 )
-    {
-        // Failed to create the queue.
-    }
-
-    // ...
-
-    // Send a pointer to a struct AMessage object.  Don't block if the
-    // queue is already full.
-    pxMessage = & xMessage;
-    xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 );
-
-	// ... Rest of task code.
- }
-
- // Task to receive from the queue.
- void vADifferentTask( void *pvParameters )
- {
- struct AMessage *pxRxedMessage;
-
-    if( xQueue != 0 )
-    {
-        // Receive a message on the created queue.  Block for 10 ticks if a
-        // message is not immediately available.
-        if( xQueueReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) )
-        {
-            // pcRxedMessage now points to the struct AMessage variable posted
-            // by vATask.
-        }
-    }
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueueReceive xQueueReceive - * \ingroup QueueManagement - */ -#define xQueueReceive( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( xQueue, pvBuffer, xTicksToWait, pdFALSE ) - - -/** - * queue. h - *
- portBASE_TYPE xQueueGenericReceive(
-                                       xQueueHandle xQueue,
-                                       void *pvBuffer,
-                                       portTickType xTicksToWait
-                                       portBASE_TYPE xJustPeek
-                                    );
- * - * It is preferred that the macro xQueueReceive() be used rather than calling - * this function directly. - * - * Receive an item from a queue. The item is received by copy so a buffer of - * adequate size must be provided. The number of bytes copied into the buffer - * was defined when the queue was created. - * - * This function must not be used in an interrupt service routine. See - * xQueueReceiveFromISR for an alternative that can. - * - * @param pxQueue The handle to the queue from which the item is to be - * received. - * - * @param pvBuffer Pointer to the buffer into which the received item will - * be copied. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for an item to receive should the queue be empty at the time - * of the call. The time is defined in tick periods so the constant - * portTICK_RATE_MS should be used to convert to real time if this is required. - * - * @param xJustPeek When set to true, the item received from the queue is not - * actually removed from the queue - meaning a subsequent call to - * xQueueReceive() will return the same item. When set to false, the item - * being received from the queue is also removed from the queue. - * - * @return pdTRUE if an item was successfully received from the queue, - * otherwise pdFALSE. - * - * Example usage: -
- struct AMessage
- {
-    portCHAR ucMessageID;
-    portCHAR ucData[ 20 ];
- } xMessage;
-
- xQueueHandle xQueue;
-
- // Task to create a queue and post a value.
- void vATask( void *pvParameters )
- {
- struct AMessage *pxMessage;
-
-    // Create a queue capable of containing 10 pointers to AMessage structures.
-    // These should be passed by pointer as they contain a lot of data.
-    xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
-    if( xQueue == 0 )
-    {
-        // Failed to create the queue.
-    }
-
-    // ...
-
-    // Send a pointer to a struct AMessage object.  Don't block if the
-    // queue is already full.
-    pxMessage = & xMessage;
-    xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 );
-
-	// ... Rest of task code.
- }
-
- // Task to receive from the queue.
- void vADifferentTask( void *pvParameters )
- {
- struct AMessage *pxRxedMessage;
-
-    if( xQueue != 0 )
-    {
-        // Receive a message on the created queue.  Block for 10 ticks if a
-        // message is not immediately available.
-        if( xQueueGenericReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) )
-        {
-            // pcRxedMessage now points to the struct AMessage variable posted
-            // by vATask.
-        }
-    }
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueueReceive xQueueReceive - * \ingroup QueueManagement - */ -signed portBASE_TYPE xQueueGenericReceive( xQueueHandle xQueue, const void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeek ); - -/** - * queue. h - *
unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue );
- * - * Return the number of messages stored in a queue. - * - * @param xQueue A handle to the queue being queried. - * - * @return The number of messages available in the queue. - * - * \page uxQueueMessagesWaiting uxQueueMessagesWaiting - * \ingroup QueueManagement - */ -unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue ); - -/** - * queue. h - *
void vQueueDelete( xQueueHandle xQueue );
- * - * Delete a queue - freeing all the memory allocated for storing of items - * placed on the queue. - * - * @param xQueue A handle to the queue to be deleted. - * - * \page vQueueDelete vQueueDelete - * \ingroup QueueManagement - */ -void vQueueDelete( xQueueHandle xQueue ); - -/** - * queue. h - *
- portBASE_TYPE xQueueSendToFrontFromISR(
-                                         xQueueHandle pxQueue,
-                                         const void *pvItemToQueue,
-                                         portBASE_TYPE xTaskPreviouslyWoken
-                                      );
- 
- * - * This is a macro that calls xQueueGenericSendFromISR(). - * - * Post an item to the front of a queue. It is safe to use this macro from - * within an interrupt service routine. - * - * Items are queued by copy not reference so it is preferable to only - * queue small items, especially when called from an ISR. In most cases - * it would be preferable to store a pointer to the item being queued. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param cTaskPreviouslyWoken This is included so an ISR can post onto - * the same queue multiple times from a single interrupt. The first call - * should always pass in pdFALSE. Subsequent calls should pass in - * the value returned from the previous call. See the file serial .c in the - * PC port for a good example of this mechanism. - * - * @return pdTRUE if a task was woken by posting onto the queue. This is - * used by the ISR to determine if a context switch may be required following - * the ISR. - * - * Example usage for buffered IO (where the ISR can obtain more than one value - * per call): -
- void vBufferISR( void )
- {
- portCHAR cIn;
- portBASE_TYPE xTaskWokenByPost;
-
-    // We have not woken a task at the start of the ISR.
-    cTaskWokenByPost = pdFALSE;
-
-    // Loop until the buffer is empty.
-    do
-    {
-        // Obtain a byte from the buffer.
-        cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );						
-
-        // Post the byte.  The first time round the loop cTaskWokenByPost
-        // will be pdFALSE.  If the queue send causes a task to wake we do
-        // not want the task to run until we have finished the ISR, so
-        // xQueueSendFromISR does not cause a context switch.  Also we
-        // don't want subsequent posts to wake any other tasks, so we store
-        // the return value back into cTaskWokenByPost so xQueueSendFromISR
-        // knows not to wake any task the next iteration of the loop.
-        xTaskWokenByPost = xQueueSendToFrontFromISR( xRxQueue, &cIn, cTaskWokenByPost );
-
-    } while( portINPUT_BYTE( BUFFER_COUNT ) );
-
-    // Now the buffer is empty we can switch context if necessary.
-    if( cTaskWokenByPost )
-    {
-        taskYIELD ();
-    }
- }
- 
- * - * \defgroup xQueueSendFromISR xQueueSendFromISR - * \ingroup QueueManagement - */ -#define xQueueSendToFrontFromISR( pxQueue, pvItemToQueue, xTaskPreviouslyWoken ) xQueueGenericSendFromISR( pxQueue, pvItemToQueue, xTaskPreviouslyWoken, queueSEND_TO_FRONT ) - - -/** - * queue. h - *
- portBASE_TYPE xQueueSendToBackFromISR(
-                                         xQueueHandle pxQueue,
-                                         const void *pvItemToQueue,
-                                         portBASE_TYPE xTaskPreviouslyWoken
-                                      );
- 
- * - * This is a macro that calls xQueueGenericSendFromISR(). - * - * Post an item to the back of a queue. It is safe to use this macro from - * within an interrupt service routine. - * - * Items are queued by copy not reference so it is preferable to only - * queue small items, especially when called from an ISR. In most cases - * it would be preferable to store a pointer to the item being queued. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param cTaskPreviouslyWoken This is included so an ISR can post onto - * the same queue multiple times from a single interrupt. The first call - * should always pass in pdFALSE. Subsequent calls should pass in - * the value returned from the previous call. See the file serial .c in the - * PC port for a good example of this mechanism. - * - * @return pdTRUE if a task was woken by posting onto the queue. This is - * used by the ISR to determine if a context switch may be required following - * the ISR. - * - * Example usage for buffered IO (where the ISR can obtain more than one value - * per call): -
- void vBufferISR( void )
- {
- portCHAR cIn;
- portBASE_TYPE xTaskWokenByPost;
-
-    // We have not woken a task at the start of the ISR.
-    cTaskWokenByPost = pdFALSE;
-
-    // Loop until the buffer is empty.
-    do
-    {
-        // Obtain a byte from the buffer.
-        cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );						
-
-        // Post the byte.  The first time round the loop cTaskWokenByPost
-        // will be pdFALSE.  If the queue send causes a task to wake we do
-        // not want the task to run until we have finished the ISR, so
-        // xQueueSendFromISR does not cause a context switch.  Also we
-        // don't want subsequent posts to wake any other tasks, so we store
-        // the return value back into cTaskWokenByPost so xQueueSendFromISR
-        // knows not to wake any task the next iteration of the loop.
-        xTaskWokenByPost = xQueueSendToBackFromISR( xRxQueue, &cIn, cTaskWokenByPost );
-
-    } while( portINPUT_BYTE( BUFFER_COUNT ) );
-
-    // Now the buffer is empty we can switch context if necessary.
-    if( cTaskWokenByPost )
-    {
-        taskYIELD ();
-    }
- }
- 
- * - * \defgroup xQueueSendFromISR xQueueSendFromISR - * \ingroup QueueManagement - */ -#define xQueueSendToBackFromISR( pxQueue, pvItemToQueue, xTaskPreviouslyWoken ) xQueueGenericSendFromISR( pxQueue, pvItemToQueue, xTaskPreviouslyWoken, queueSEND_TO_BACK ) - - -/** - * queue. h - *
- portBASE_TYPE xQueueSendFromISR(
-                                     xQueueHandle pxQueue,
-                                     const void *pvItemToQueue,
-                                     portBASE_TYPE xTaskPreviouslyWoken
-                                );
- 
- * - * This is a macro that calls xQueueGenericSendFromISR(). It is included - * for backward compatibility with versions of FreeRTOS.org that did not - * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR() - * macros. - * - * Post an item to the back of a queue. It is safe to use this function from - * within an interrupt service routine. - * - * Items are queued by copy not reference so it is preferable to only - * queue small items, especially when called from an ISR. In most cases - * it would be preferable to store a pointer to the item being queued. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param cTaskPreviouslyWoken This is included so an ISR can post onto - * the same queue multiple times from a single interrupt. The first call - * should always pass in pdFALSE. Subsequent calls should pass in - * the value returned from the previous call. See the file serial .c in the - * PC port for a good example of this mechanism. - * - * @return pdTRUE if a task was woken by posting onto the queue. This is - * used by the ISR to determine if a context switch may be required following - * the ISR. - * - * Example usage for buffered IO (where the ISR can obtain more than one value - * per call): -
- void vBufferISR( void )
- {
- portCHAR cIn;
- portBASE_TYPE xTaskWokenByPost;
-
-    // We have not woken a task at the start of the ISR.
-    cTaskWokenByPost = pdFALSE;
-
-    // Loop until the buffer is empty.
-    do
-    {
-        // Obtain a byte from the buffer.
-        cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );						
-
-        // Post the byte.  The first time round the loop cTaskWokenByPost
-        // will be pdFALSE.  If the queue send causes a task to wake we do
-        // not want the task to run until we have finished the ISR, so
-        // xQueueSendFromISR does not cause a context switch.  Also we
-        // don't want subsequent posts to wake any other tasks, so we store
-        // the return value back into cTaskWokenByPost so xQueueSendFromISR
-        // knows not to wake any task the next iteration of the loop.
-        xTaskWokenByPost = xQueueSendFromISR( xRxQueue, &cIn, cTaskWokenByPost );
-
-    } while( portINPUT_BYTE( BUFFER_COUNT ) );
-
-    // Now the buffer is empty we can switch context if necessary.
-    if( cTaskWokenByPost )
-    {
-        taskYIELD ();
-    }
- }
- 
- * - * \defgroup xQueueSendFromISR xQueueSendFromISR - * \ingroup QueueManagement - */ -#define xQueueSendFromISR( pxQueue, pvItemToQueue, xTaskPreviouslyWoken ) xQueueGenericSendFromISR( pxQueue, pvItemToQueue, xTaskPreviouslyWoken, queueSEND_TO_BACK ) - -/** - * queue. h - *
- portBASE_TYPE xQueueGenericSendFromISR(
-                                           xQueueHandle pxQueue,
-                                           const void *pvItemToQueue,
-                                           portBASE_TYPE xTaskPreviouslyWoken
-										   portBASE_TYPE xCopyPosition
-                                       );
- 
- * - * It is preferred that the macros xQueueSendFromISR(), - * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place - * of calling this function directly. - * - * Post an item on a queue. It is safe to use this function from within an - * interrupt service routine. - * - * Items are queued by copy not reference so it is preferable to only - * queue small items, especially when called from an ISR. In most cases - * it would be preferable to store a pointer to the item being queued. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param cTaskPreviouslyWoken This is included so an ISR can post onto - * the same queue multiple times from a single interrupt. The first call - * should always pass in pdFALSE. Subsequent calls should pass in - * the value returned from the previous call. See the file serial .c in the - * PC port for a good example of this mechanism. - * - * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the - * item at the back of the queue, or queueSEND_TO_FRONT to place the item - * at the front of the queue (for high priority messages). - * - * @return pdTRUE if a task was woken by posting onto the queue. This is - * used by the ISR to determine if a context switch may be required following - * the ISR. - * - * Example usage for buffered IO (where the ISR can obtain more than one value - * per call): -
- void vBufferISR( void )
- {
- portCHAR cIn;
- portBASE_TYPE xTaskWokenByPost;
-
-    // We have not woken a task at the start of the ISR.
-    cTaskWokenByPost = pdFALSE;
-
-    // Loop until the buffer is empty.
-    do
-    {
-        // Obtain a byte from the buffer.
-        cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );						
-
-        // Post the byte.  The first time round the loop cTaskWokenByPost
-        // will be pdFALSE.  If the queue send causes a task to wake we do
-        // not want the task to run until we have finished the ISR, so
-        // xQueueSendFromISR does not cause a context switch.  Also we
-        // don't want subsequent posts to wake any other tasks, so we store
-        // the return value back into cTaskWokenByPost so xQueueSendFromISR
-        // knows not to wake any task the next iteration of the loop.
-        xTaskWokenByPost = xQueueGenericSendFromISR( xRxQueue, &cIn, cTaskWokenByPost, queueSEND_TO_BACK );
-
-    } while( portINPUT_BYTE( BUFFER_COUNT ) );
-
-    // Now the buffer is empty we can switch context if necessary.
-    if( cTaskWokenByPost )
-    {
-        taskYIELD ();
-    }
- }
- 
- * - * \defgroup xQueueSendFromISR xQueueSendFromISR - * \ingroup QueueManagement - */ -signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE xTaskPreviouslyWoken, portBASE_TYPE xCopyPosition ); - -/** - * queue. h - *
- portBASE_TYPE xQueueReceiveFromISR(
-                                       xQueueHandle pxQueue,
-                                       void *pvBuffer,
-                                       portBASE_TYPE *pxTaskWoken
-                                   );
- * 
- * - * Receive an item from a queue. It is safe to use this function from within an - * interrupt service routine. - * - * @param pxQueue The handle to the queue from which the item is to be - * received. - * - * @param pvBuffer Pointer to the buffer into which the received item will - * be copied. - * - * @param pxTaskWoken A task may be blocked waiting for space to become - * available on the queue. If xQueueReceiveFromISR causes such a task to - * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will - * remain unchanged. - * - * @return pdTRUE if an item was successfully received from the queue, - * otherwise pdFALSE. - * - * Example usage: -
-
- xQueueHandle xQueue;
-
- // Function to create a queue and post some values.
- void vAFunction( void *pvParameters )
- {
- portCHAR cValueToPost;
- const portTickType xBlockTime = ( portTickType )0xff;
-
-    // Create a queue capable of containing 10 characters.
-    xQueue = xQueueCreate( 10, sizeof( portCHAR ) );
-    if( xQueue == 0 )
-    {
-        // Failed to create the queue.
-    }
-
-    // ...
-
-    // Post some characters that will be used within an ISR.  If the queue
-    // is full then this task will block for xBlockTime ticks.
-    cValueToPost = 'a';
-    xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
-    cValueToPost = 'b';
-    xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
-
-    // ... keep posting characters ... this task may block when the queue
-    // becomes full.
-
-    cValueToPost = 'c';
-    xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
- }
-
- // ISR that outputs all the characters received on the queue.
- void vISR_Routine( void )
- {
- portBASE_TYPE xTaskWokenByReceive = pdFALSE;
- portCHAR cRxedChar;
-
-    while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) )
-    {
-        // A character was received.  Output the character now.
-        vOutputCharacter( cRxedChar );
-
-        // If removing the character from the queue woke the task that was
-        // posting onto the queue cTaskWokenByReceive will have been set to
-        // pdTRUE.  No matter how many times this loop iterates only one
-        // task will be woken.
-    }
-
-    if( cTaskWokenByPost != ( portCHAR ) pdFALSE;
-    {
-        taskYIELD ();
-    }
- }
- 
- * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR - * \ingroup QueueManagement - */ -signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, const void * const pvBuffer, signed portBASE_TYPE *pxTaskWoken ); - -/* - * xQueueAltGenericSend() is an alternative version of xQueueGenericSend(). - * Likewise xQueueAltGenericReceive() is an alternative version of - * xQueueGenericReceive(). - * - * The source code that implements the alternative (Alt) API is much - * simpler because it executes everything from within a critical section. - * This is the approach taken by many other RTOSes, but FreeRTOS.org has the - * preferred fully featured API too. The fully featured API has more - * complex code that takes longer to execute, but makes much less use of - * critical sections. Therefore the alternative API sacrifices interrupt - * responsiveness to gain execution speed, whereas the fully featured API - * sacrifices execution speed to ensure better interrupt responsiveness. - */ -signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ); -signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, const void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ); -#define xQueueAltSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( xQueue, pvItemToQueue, xTicksToWait, queueSEND_TO_FRONT ) -#define xQueueAltSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( xQueue, pvItemToQueue, xTicksToWait, queueSEND_TO_BACK ) -#define xQueueAltReceive( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( xQueue, pvBuffer, xTicksToWait, pdFALSE ) -#define xQueueAltPeek( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( xQueue, pvBuffer, xTicksToWait, pdTRUE ) - -/* - * The functions defined above are for passing data to and from tasks. The - * functions below are the equivalents for passing data to and from - * co-routines. - * - * These functions are called from the co-routine macro implementation and - * should not be called directly from application code. Instead use the macro - * wrappers defined within croutine.h. - */ -signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken ); -signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken ); -signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait ); -signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait ); - -/* - * For internal use only. Use xSemaphoreCreateMutex() or - * xSemaphoreCreateCounting() instead of calling these functions directly. - */ -xQueueHandle xQueueCreateMutex( void ); -xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ); - -/* - * For internal use only. Use xSemaphoreTakeMutexRecursive() or - * xSemaphoreGiveMutexRecursive() instead of calling these functions directly. - */ -portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime ); -portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle xMutex ); - -#ifdef __cplusplus -} -#endif - -#endif /* QUEUE_H */ - diff --git a/FreeRTOS1/include/semphr.h b/FreeRTOS1/include/semphr.h deleted file mode 100644 index c9641e3..0000000 --- a/FreeRTOS1/include/semphr.h +++ /dev/null @@ -1,698 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -#ifndef SEMAPHORE_H -#define SEMAPHORE_H - -#include "queue.h" - -typedef xQueueHandle xSemaphoreHandle; - -#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( unsigned portCHAR ) 1 ) -#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( unsigned portCHAR ) 0 ) -#define semGIVE_BLOCK_TIME ( ( portTickType ) 0 ) - - -/** - * semphr. h - *
vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore )
- * - * Macro that implements a semaphore by using the existing queue mechanism. - * The queue length is 1 as this is a binary semaphore. The data size is 0 - * as we don't want to actually store any data - we just want to know if the - * queue is empty or full. - * - * This type of semaphore can be used for pure synchronisation between tasks or - * between an interrupt and a task. The semaphore need not be given back once - * obtained, so one task/interrupt can continuously 'give' the semaphore while - * another continuously 'takes' the semaphore. For this reason this type of - * semaphore does not use a priority inheritance mechanism. For an alternative - * that does use priority inheritance see xSemaphoreCreateMutex(). - * - * @param xSemaphore Handle to the created semaphore. Should be of type xSemaphoreHandle. - * - * Example usage: -
- xSemaphoreHandle xSemaphore;
-
- void vATask( void * pvParameters )
- {
-    // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
-    // This is a macro so pass the variable in directly.
-    vSemaphoreCreateBinary( xSemaphore );
-
-    if( xSemaphore != NULL )
-    {
-        // The semaphore was created successfully.
-        // The semaphore can now be used.  
-    }
- }
- 
- * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary - * \ingroup Semaphores - */ -#define vSemaphoreCreateBinary( xSemaphore ) { \ - xSemaphore = xQueueCreate( ( unsigned portBASE_TYPE ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH ); \ - if( xSemaphore != NULL ) \ - { \ - xSemaphoreGive( xSemaphore ); \ - } \ - } - -/** - * semphr. h - * xSemaphoreTake( - * xSemaphoreHandle xSemaphore, - * portTickType xBlockTime - * ) - * - * Macro to obtain a semaphore. The semaphore must have previously been - * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or - * xSemaphoreCreateCounting(). - * - * @param xSemaphore A handle to the semaphore being taken - obtained when - * the semaphore was created. - * - * @param xBlockTime The time in ticks to wait for the semaphore to become - * available. The macro portTICK_RATE_MS can be used to convert this to a - * real time. A block time of zero can be used to poll the semaphore. A block - * time of portMAX_DELAY can be used to block indefinitely (provided - * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). - * - * @return pdTRUE if the semaphore was obtained. pdFALSE - * if xBlockTime expired without the semaphore becoming available. - * - * Example usage: -
- xSemaphoreHandle xSemaphore = NULL;
-
- // A task that creates a semaphore.
- void vATask( void * pvParameters )
- {
-    // Create the semaphore to guard a shared resource.
-    vSemaphoreCreateBinary( xSemaphore );
- }
-
- // A task that uses the semaphore.
- void vAnotherTask( void * pvParameters )
- {
-    // ... Do other things.
-
-    if( xSemaphore != NULL )
-    {
-        // See if we can obtain the semaphore.  If the semaphore is not available
-        // wait 10 ticks to see if it becomes free.	
-        if( xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) == pdTRUE )
-        {
-            // We were able to obtain the semaphore and can now access the
-            // shared resource.
-
-            // ...
-
-            // We have finished accessing the shared resource.  Release the 
-            // semaphore.
-            xSemaphoreGive( xSemaphore );
-        }
-        else
-        {
-            // We could not obtain the semaphore and can therefore not access
-            // the shared resource safely.
-        }
-    }
- }
- 
- * \defgroup xSemaphoreTake xSemaphoreTake - * \ingroup Semaphores - */ -#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueGenericReceive( ( xQueueHandle ) xSemaphore, NULL, xBlockTime, pdFALSE ) - -/** - * semphr. h - * xSemaphoreTakeRecursive( - * xSemaphoreHandle xMutex, - * portTickType xBlockTime - * ) - * - * Macro to recursively obtain, or 'take', a mutex type semaphore. - * The mutex must have previously been created using a call to - * xSemaphoreCreateRecursiveMutex(); - * - * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this - * macro to be available. - * - * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * @param xMutex A handle to the mutex being obtained. This is the - * handle returned by xSemaphoreCreateRecursiveMutex(); - * - * @param xBlockTime The time in ticks to wait for the semaphore to become - * available. The macro portTICK_RATE_MS can be used to convert this to a - * real time. A block time of zero can be used to poll the semaphore. If - * the task already owns the semaphore then xSemaphoreTakeRecursive() will - * return immediately no matter what the value of xBlockTime. - * - * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime - * expired without the semaphore becoming available. - * - * Example usage: -
- xSemaphoreHandle xMutex = NULL;
-
- // A task that creates a mutex.
- void vATask( void * pvParameters )
- {
-    // Create the mutex to guard a shared resource.
-    xMutex = xSemaphoreCreateRecursiveMutex();
- }
-
- // A task that uses the mutex.
- void vAnotherTask( void * pvParameters )
- {
-    // ... Do other things.
-
-    if( xMutex != NULL )
-    {
-        // See if we can obtain the mutex.  If the mutex is not available
-        // wait 10 ticks to see if it becomes free.	
-        if( xSemaphoreTakeRecursive( xSemaphore, ( portTickType ) 10 ) == pdTRUE )
-        {
-            // We were able to obtain the mutex and can now access the
-            // shared resource.
-
-            // ...
-            // For some reason due to the nature of the code further calls to 
-			// xSemaphoreTakeRecursive() are made on the same mutex.  In real
-			// code these would not be just sequential calls as this would make
-			// no sense.  Instead the calls are likely to be buried inside
-			// a more complex call structure.
-            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
-            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
-
-            // The mutex has now been 'taken' three times, so will not be 
-			// available to another task until it has also been given back
-			// three times.  Again it is unlikely that real code would have
-			// these calls sequentially, but instead buried in a more complex
-			// call structure.  This is just for illustrative purposes.
-            xSemaphoreGiveRecursive( xMutex );
-			xSemaphoreGiveRecursive( xMutex );
-			xSemaphoreGiveRecursive( xMutex );
-
-			// Now the mutex can be taken by other tasks.
-        }
-        else
-        {
-            // We could not obtain the mutex and can therefore not access
-            // the shared resource safely.
-        }
-    }
- }
- 
- * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive - * \ingroup Semaphores - */ -#define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( xMutex, xBlockTime ) - - -/* - * xSemaphoreAltTake() is an alternative version of xSemaphoreTake(). - * - * The source code that implements the alternative (Alt) API is much - * simpler because it executes everything from within a critical section. - * This is the approach taken by many other RTOSes, but FreeRTOS.org has the - * preferred fully featured API too. The fully featured API has more - * complex code that takes longer to execute, but makes much less use of - * critical sections. Therefore the alternative API sacrifices interrupt - * responsiveness to gain execution speed, whereas the fully featured API - * sacrifices execution speed to ensure better interrupt responsiveness. - */ -#define xSemaphoreAltTake( xSemaphore, xBlockTime ) xQueueAltGenericReceive( ( xQueueHandle ) xSemaphore, NULL, xBlockTime, pdFALSE ) - -/** - * semphr. h - *
xSemaphoreGive( xSemaphoreHandle xSemaphore )
- * - * Macro to release a semaphore. The semaphore must have previously been - * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or - * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). - * - * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for - * an alternative which can be used from an ISR. - * - * This macro must also not be used on semaphores created using - * xSemaphoreCreateRecursiveMutex(). - * - * @param xSemaphore A handle to the semaphore being released. This is the - * handle returned when the semaphore was created. - * - * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. - * Semaphores are implemented using queues. An error can occur if there is - * no space on the queue to post a message - indicating that the - * semaphore was not first obtained correctly. - * - * Example usage: -
- xSemaphoreHandle xSemaphore = NULL;
-
- void vATask( void * pvParameters )
- {
-    // Create the semaphore to guard a shared resource.
-    vSemaphoreCreateBinary( xSemaphore );
-
-    if( xSemaphore != NULL )
-    {
-        if( xSemaphoreGive( xSemaphore ) != pdTRUE )
-        {
-            // We would expect this call to fail because we cannot give
-            // a semaphore without first "taking" it!
-        }
-
-        // Obtain the semaphore - don't block if the semaphore is not
-        // immediately available.
-        if( xSemaphoreTake( xSemaphore, ( portTickType ) 0 ) )
-        {
-            // We now have the semaphore and can access the shared resource.
-
-            // ...
-
-            // We have finished accessing the shared resource so can free the
-            // semaphore.
-            if( xSemaphoreGive( xSemaphore ) != pdTRUE )
-            {
-                // We would not expect this call to fail because we must have
-                // obtained the semaphore to get here.
-            }
-        }
-    }
- }
- 
- * \defgroup xSemaphoreGive xSemaphoreGive - * \ingroup Semaphores - */ -#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( xQueueHandle ) xSemaphore, NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) - -/** - * semphr. h - *
xSemaphoreGiveRecursive( xSemaphoreHandle xMutex )
- * - * Macro to recursively release, or 'give', a mutex type semaphore. - * The mutex must have previously been created using a call to - * xSemaphoreCreateRecursiveMutex(); - * - * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this - * macro to be available. - * - * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * @param xMutex A handle to the mutex being released, or 'given'. This is the - * handle returned by xSemaphoreCreateMutex(); - * - * @return pdTRUE if the semaphore was given. - * - * Example usage: -
- xSemaphoreHandle xMutex = NULL;
-
- // A task that creates a mutex.
- void vATask( void * pvParameters )
- {
-    // Create the mutex to guard a shared resource.
-    xMutex = xSemaphoreCreateRecursiveMutex();
- }
-
- // A task that uses the mutex.
- void vAnotherTask( void * pvParameters )
- {
-    // ... Do other things.
-
-    if( xMutex != NULL )
-    {
-        // See if we can obtain the mutex.  If the mutex is not available
-        // wait 10 ticks to see if it becomes free.	
-        if( xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ) == pdTRUE )
-        {
-            // We were able to obtain the mutex and can now access the
-            // shared resource.
-
-            // ...
-            // For some reason due to the nature of the code further calls to 
-			// xSemaphoreTakeRecursive() are made on the same mutex.  In real
-			// code these would not be just sequential calls as this would make
-			// no sense.  Instead the calls are likely to be buried inside
-			// a more complex call structure.
-            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
-            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
-
-            // The mutex has now been 'taken' three times, so will not be 
-			// available to another task until it has also been given back
-			// three times.  Again it is unlikely that real code would have
-			// these calls sequentially, it would be more likely that the calls
-			// to xSemaphoreGiveRecursive() would be called as a call stack
-			// unwound.  This is just for demonstrative purposes.
-            xSemaphoreGiveRecursive( xMutex );
-			xSemaphoreGiveRecursive( xMutex );
-			xSemaphoreGiveRecursive( xMutex );
-
-			// Now the mutex can be taken by other tasks.
-        }
-        else
-        {
-            // We could not obtain the mutex and can therefore not access
-            // the shared resource safely.
-        }
-    }
- }
- 
- * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive - * \ingroup Semaphores - */ -#define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( xMutex ) - -/* - * xSemaphoreAltGive() is an alternative version of xSemaphoreGive(). - * - * The source code that implements the alternative (Alt) API is much - * simpler because it executes everything from within a critical section. - * This is the approach taken by many other RTOSes, but FreeRTOS.org has the - * preferred fully featured API too. The fully featured API has more - * complex code that takes longer to execute, but makes much less use of - * critical sections. Therefore the alternative API sacrifices interrupt - * responsiveness to gain execution speed, whereas the fully featured API - * sacrifices execution speed to ensure better interrupt responsiveness. - */ -#define xSemaphoreAltGive( xSemaphore ) xQueueAltGenericSend( ( xQueueHandle ) xSemaphore, NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) - -/** - * semphr. h - *
- xSemaphoreGiveFromISR( 
-                          xSemaphoreHandle xSemaphore, 
-                          portSHORT sTaskPreviouslyWoken 
-                      )
- * - * Macro to release a semaphore. The semaphore must have previously been - * created with a call to vSemaphoreCreateBinary() or xSemaphoreCreateCounting(). - * - * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) - * must not be used with this macro. - * - * This macro can be used from an ISR. - * - * @param xSemaphore A handle to the semaphore being released. This is the - * handle returned when the semaphore was created. - * - * @param sTaskPreviouslyWoken This is included so an ISR can make multiple calls - * to xSemaphoreGiveFromISR () from a single interrupt. The first call - * should always pass in pdFALSE. Subsequent calls should pass in - * the value returned from the previous call. See the file serial .c in the - * PC port for a good example of using xSemaphoreGiveFromISR (). - * - * @return pdTRUE if a task was woken by releasing the semaphore. This is - * used by the ISR to determine if a context switch may be required following - * the ISR. - * - * Example usage: -
- #define LONG_TIME 0xffff
- #define TICKS_TO_WAIT	10
- xSemaphoreHandle xSemaphore = NULL;
-
- // Repetitive task.
- void vATask( void * pvParameters )
- {
-    for( ;; )
-    {
-        // We want this task to run every 10 ticks of a timer.  The semaphore 
-        // was created before this task was started.
-
-        // Block waiting for the semaphore to become available.
-        if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )
-        {
-            // It is time to execute.
-
-            // ...
-
-            // We have finished our task.  Return to the top of the loop where
-            // we will block on the semaphore until it is time to execute 
-            // again.  Note when using the semaphore for synchronisation with an
-			// ISR in this manner there is no need to 'give' the semaphore back.
-        }
-    }
- }
-
- // Timer ISR
- void vTimerISR( void * pvParameters )
- {
- static unsigned portCHAR ucLocalTickCount = 0;
- static portBASE_TYPE xTaskWoken;
-
-    // A timer tick has occurred.
-
-    // ... Do other time functions.
-
-    // Is it time for vATask () to run?
-	xTaskWoken = pdFALSE;
-    ucLocalTickCount++;
-    if( ucLocalTickCount >= TICKS_TO_WAIT )
-    {
-        // Unblock the task by releasing the semaphore.
-        xTaskWoken = xSemaphoreGiveFromISR( xSemaphore, xTaskWoken );
-
-        // Reset the count so we release the semaphore again in 10 ticks time.
-        ucLocalTickCount = 0;
-    }
-
-    if( xTaskWoken != pdFALSE )
-    {
-        // We can force a context switch here.  Context switching from an
-        // ISR uses port specific syntax.  Check the demo task for your port
-        // to find the syntax required.
-    }
- }
- 
- * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR - * \ingroup Semaphores - */ -#define xSemaphoreGiveFromISR( xSemaphore, xTaskPreviouslyWoken ) xQueueGenericSendFromISR( ( xQueueHandle ) xSemaphore, NULL, xTaskPreviouslyWoken, queueSEND_TO_BACK ) - -/** - * semphr. h - *
xSemaphoreHandle xSemaphoreCreateMutex( void )
- * - * Macro that implements a mutex semaphore by using the existing queue - * mechanism. - * - * Mutexes created using this macro can be accessed using the xSemaphoreTake() - * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and - * xSemaphoreGiveRecursive() macros should not be used. - * - * This type of semaphore uses a priority inheritance mechanism so a task - * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the - * semaphore it is no longer required. - * - * Mutex type semaphores cannot be used from within interrupt service routines. - * - * See xSemaphoreCreateBinary() for an alternative implementation that can be - * used for pure synchronisation (where one task or interrupt always 'gives' the - * semaphore and another always 'takes' the semaphore) and from within interrupt - * service routines. - * - * @return xSemaphore Handle to the created mutex semaphore. Should be of type - * xSemaphoreHandle. - * - * Example usage: -
- xSemaphoreHandle xSemaphore;
-
- void vATask( void * pvParameters )
- {
-    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
-    // This is a macro so pass the variable in directly.
-    xSemaphore = xSemaphoreCreateMutex();
-
-    if( xSemaphore != NULL )
-    {
-        // The semaphore was created successfully.
-        // The semaphore can now be used.  
-    }
- }
- 
- * \defgroup vSemaphoreCreateMutex vSemaphoreCreateMutex - * \ingroup Semaphores - */ -#define xSemaphoreCreateMutex() xQueueCreateMutex() - - -/** - * semphr. h - *
xSemaphoreHandle xSemaphoreCreateRecursiveMutex( void )
- * - * Macro that implements a recursive mutex by using the existing queue - * mechanism. - * - * Mutexes created using this macro can be accessed using the - * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The - * xSemaphoreTake() and xSemaphoreGive() macros should not be used. - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * This type of semaphore uses a priority inheritance mechanism so a task - * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the - * semaphore it is no longer required. - * - * Mutex type semaphores cannot be used from within interrupt service routines. - * - * See xSemaphoreCreateBinary() for an alternative implementation that can be - * used for pure synchronisation (where one task or interrupt always 'gives' the - * semaphore and another always 'takes' the semaphore) and from within interrupt - * service routines. - * - * @return xSemaphore Handle to the created mutex semaphore. Should be of type - * xSemaphoreHandle. - * - * Example usage: -
- xSemaphoreHandle xSemaphore;
-
- void vATask( void * pvParameters )
- {
-    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
-    // This is a macro so pass the variable in directly.
-    xSemaphore = xSemaphoreCreateRecursiveMutex();
-
-    if( xSemaphore != NULL )
-    {
-        // The semaphore was created successfully.
-        // The semaphore can now be used.  
-    }
- }
- 
- * \defgroup vSemaphoreCreateMutex vSemaphoreCreateMutex - * \ingroup Semaphores - */ -#define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex() - -/** - * semphr. h - *
xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount )
- * - * Macro that creates a counting semaphore by using the existing - * queue mechanism. - * - * Counting semaphores are typically used for two things: - * - * 1) Counting events. - * - * In this usage scenario an event handler will 'give' a semaphore each time - * an event occurs (incrementing the semaphore count value), and a handler - * task will 'take' a semaphore each time it processes an event - * (decrementing the semaphore count value). The count value is therefore - * the difference between the number of events that have occurred and the - * number that have been processed. In this case it is desirable for the - * initial count value to be zero. - * - * 2) Resource management. - * - * In this usage scenario the count value indicates the number of resources - * available. To obtain control of a resource a task must first obtain a - * semaphore - decrementing the semaphore count value. When the count value - * reaches zero there are no free resources. When a task finishes with the - * resource it 'gives' the semaphore back - incrementing the semaphore count - * value. In this case it is desirable for the initial count value to be - * equal to the maximum count value, indicating that all resources are free. - * - * @param uxMaxCount The maximum count value that can be reached. When the - * semaphore reaches this value it can no longer be 'given'. - * - * @param uxInitialCount The count value assigned to the semaphore when it is - * created. - * - * @return Handle to the created semaphore. Null if the semaphore could not be - * created. - * - * Example usage: -
- xSemaphoreHandle xSemaphore;
-
- void vATask( void * pvParameters )
- {
- xSemaphoreHandle xSemaphore = NULL;
-
-    // Semaphore cannot be used before a call to xSemaphoreCreateCounting().
-    // The max value to which the semaphore can count should be 10, and the
-    // initial value assigned to the count should be 0.
-    xSemaphore = xSemaphoreCreateCounting( 10, 0 );
-
-    if( xSemaphore != NULL )
-    {
-        // The semaphore was created successfully.
-        // The semaphore can now be used.  
-    }
- }
- 
- * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting - * \ingroup Semaphores - */ -#define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( uxMaxCount, uxInitialCount ) - - -#endif /* SEMAPHORE_H */ - - diff --git a/FreeRTOS1/include/task.h b/FreeRTOS1/include/task.h deleted file mode 100644 index 595d6ab..0000000 --- a/FreeRTOS1/include/task.h +++ /dev/null @@ -1,995 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -/* -Changes since V4.3.1: - - + Added xTaskGetSchedulerState() function. -*/ - -#ifndef TASK_H -#define TASK_H - -#include "portable.h" -#include "list.h" - -#ifdef __cplusplus -extern "C" { -#endif -/*----------------------------------------------------------- - * MACROS AND DEFINITIONS - *----------------------------------------------------------*/ - -#define tskKERNEL_VERSION_NUMBER "V4.7.2" - -/** - * task. h - * - * Type by which tasks are referenced. For example, a call to xTaskCreate - * returns (via a pointer parameter) an xTaskHandle variable that can then - * be used as a parameter to vTaskDelete to delete the task. - * - * \page xTaskHandle xTaskHandle - * \ingroup Tasks - */ -typedef void * xTaskHandle; - -/* - * Used internally only. - */ -typedef struct xTIME_OUT -{ - portBASE_TYPE xOverflowCount; - portTickType xTimeOnEntering; -} xTimeOutType; - -/* - * Defines the priority used by the idle task. This must not be modified. - * - * \ingroup TaskUtils - */ -#define tskIDLE_PRIORITY ( ( unsigned portBASE_TYPE ) 0 ) - -/** - * task. h - * - * Macro for forcing a context switch. - * - * \page taskYIELD taskYIELD - * \ingroup SchedulerControl - */ -#define taskYIELD() portYIELD() - -/** - * task. h - * - * Macro to mark the start of a critical code region. Preemptive context - * switches cannot occur when in a critical region. - * - * NOTE: This may alter the stack (depending on the portable implementation) - * so must be used with care! - * - * \page taskENTER_CRITICAL taskENTER_CRITICAL - * \ingroup SchedulerControl - */ -#define taskENTER_CRITICAL() portENTER_CRITICAL() - -/** - * task. h - * - * Macro to mark the end of a critical code region. Preemptive context - * switches cannot occur when in a critical region. - * - * NOTE: This may alter the stack (depending on the portable implementation) - * so must be used with care! - * - * \page taskEXIT_CRITICAL taskEXIT_CRITICAL - * \ingroup SchedulerControl - */ -#define taskEXIT_CRITICAL() portEXIT_CRITICAL() - -/** - * task. h - * - * Macro to disable all maskable interrupts. - * - * \page taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS - * \ingroup SchedulerControl - */ -#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() - -/** - * task. h - * - * Macro to enable microcontroller interrupts. - * - * \page taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS - * \ingroup SchedulerControl - */ -#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS() - -/* Definitions returned by xTaskGetSchedulerState(). */ -#define taskSCHEDULER_NOT_STARTED 0 -#define taskSCHEDULER_RUNNING 1 -#define taskSCHEDULER_SUSPENDED 2 - -/*----------------------------------------------------------- - * TASK CREATION API - *----------------------------------------------------------*/ - -/** - * task. h - *
- portBASE_TYPE xTaskCreate(
-                              pdTASK_CODE pvTaskCode,
-                              const portCHAR * const pcName,
-                              unsigned portSHORT usStackDepth,
-                              void *pvParameters,
-                              unsigned portBASE_TYPE uxPriority,
-                              xTaskHandle *pvCreatedTask
-                          );
- * - * Create a new task and add it to the list of tasks that are ready to run. - * - * @param pvTaskCode Pointer to the task entry function. Tasks - * must be implemented to never return (i.e. continuous loop). - * - * @param pcName A descriptive name for the task. This is mainly used to - * facilitate debugging. Max length defined by tskMAX_TASK_NAME_LEN - default - * is 16. - * - * @param usStackDepth The size of the task stack specified as the number of - * variables the stack can hold - not the number of bytes. For example, if - * the stack is 16 bits wide and usStackDepth is defined as 100, 200 bytes - * will be allocated for stack storage. - * - * @param pvParameters Pointer that will be used as the parameter for the task - * being created. - * - * @param uxPriority The priority at which the task should run. - * - * @param pvCreatedTask Used to pass back a handle by which the created task - * can be referenced. - * - * @return pdPASS if the task was successfully created and added to a ready - * list, otherwise an error code defined in the file errors. h - * - * Example usage: -
- // Task to be created.
- void vTaskCode( void * pvParameters )
- {
-     for( ;; )
-     {
-         // Task code goes here.
-     }
- }
-
- // Function that creates a task.
- void vOtherFunction( void )
- {
- unsigned char ucParameterToPass;
- xTaskHandle xHandle;
-		
-     // Create the task, storing the handle.
-     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
-		
-     // Use the handle to delete the task.
-     vTaskDelete( xHandle );
- }
-   
- * \defgroup xTaskCreate xTaskCreate - * \ingroup Tasks - */ -signed portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode, const signed portCHAR * const pcName, unsigned portSHORT usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pvCreatedTask ); - -/** - * task. h - *
void vTaskDelete( xTaskHandle pxTask );
- * - * INCLUDE_vTaskDelete must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Remove a task from the RTOS real time kernels management. The task being - * deleted will be removed from all ready, blocked, suspended and event lists. - * - * NOTE: The idle task is responsible for freeing the kernel allocated - * memory from tasks that have been deleted. It is therefore important that - * the idle task is not starved of microcontroller processing time if your - * application makes any calls to vTaskDelete (). Memory allocated by the - * task code is not automatically freed, and should be freed before the task - * is deleted. - * - * See the demo application file death.c for sample code that utilises - * vTaskDelete (). - * - * @param pxTask The handle of the task to be deleted. Passing NULL will - * cause the calling task to be deleted. - * - * Example usage: -
- void vOtherFunction( void )
- {
- xTaskHandle xHandle;
-		
-     // Create the task, storing the handle.
-     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
-		
-     // Use the handle to delete the task.
-     vTaskDelete( xHandle );
- }
-   
- * \defgroup vTaskDelete vTaskDelete - * \ingroup Tasks - */ -void vTaskDelete( xTaskHandle pxTask ); - - -/*----------------------------------------------------------- - * TASK CONTROL API - *----------------------------------------------------------*/ - -/** - * task. h - *
void vTaskDelay( portTickType xTicksToDelay );
- * - * Delay a task for a given number of ticks. The actual time that the - * task remains blocked depends on the tick rate. The constant - * portTICK_RATE_MS can be used to calculate real time from the tick - * rate - with the resolution of one tick period. - * - * INCLUDE_vTaskDelay must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * @param xTicksToDelay The amount of time, in tick periods, that - * the calling task should block. - * - * Example usage: -
- // Wait 10 ticks before performing an action.
- // NOTE:
- // This is for demonstration only and would be better achieved
- // using vTaskDelayUntil ().
- void vTaskFunction( void * pvParameters )
- {
- portTickType xDelay, xNextTime;
-
-     // Calc the time at which we want to perform the action
-     // next.
-     xNextTime = xTaskGetTickCount () + ( portTickType ) 10;
-
-     for( ;; )
-     {
-         xDelay = xNextTime - xTaskGetTickCount ();
-         xNextTime += ( portTickType ) 10;
-
-         // Guard against overflow
-         if( xDelay <= ( portTickType ) 10 )
-         {
-             vTaskDelay( xDelay );
-         }
-
-         // Perform action here.
-     }
- }
-   
- * \defgroup vTaskDelay vTaskDelay - * \ingroup TaskCtrl - */ -void vTaskDelay( portTickType xTicksToDelay ); - -/** - * task. h - *
void vTaskDelayUntil( portTickType *pxPreviousWakeTime, portTickType xTimeIncrement );
- * - * INCLUDE_vTaskDelayUntil must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Delay a task until a specified time. This function can be used by cyclical - * tasks to ensure a constant execution frequency. - * - * This function differs from vTaskDelay () in one important aspect: vTaskDelay () will - * cause a task to block for the specified number of ticks from the time vTaskDelay () is - * called. It is therefore difficult to use vTaskDelay () by itself to generate a fixed - * execution frequency as the time between a task starting to execute and that task - * calling vTaskDelay () may not be fixed [the task may take a different path though the - * code between calls, or may get interrupted or preempted a different number of times - * each time it executes]. - * - * Whereas vTaskDelay () specifies a wake time relative to the time at which the function - * is called, vTaskDelayUntil () specifies the absolute (exact) time at which it wishes to - * unblock. - * - * The constant portTICK_RATE_MS can be used to calculate real time from the tick - * rate - with the resolution of one tick period. - * - * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the - * task was last unblocked. The variable must be initialised with the current time - * prior to its first use (see the example below). Following this the variable is - * automatically updated within vTaskDelayUntil (). - * - * @param xTimeIncrement The cycle time period. The task will be unblocked at - * time *pxPreviousWakeTime + xTimeIncrement. Calling vTaskDelayUntil with the - * same xTimeIncrement parameter value will cause the task to execute with - * a fixed interface period. - * - * Example usage: -
- // Perform an action every 10 ticks.
- void vTaskFunction( void * pvParameters )
- {
- portTickType xLastWakeTime;
- const portTickType xFrequency = 10;
-
-     // Initialise the xLastWakeTime variable with the current time.
-     xLastWakeTime = xTaskGetTickCount ();
-     for( ;; )
-     {
-         // Wait for the next cycle.
-         vTaskDelayUntil( &xLastWakeTime, xFrequency );
-
-         // Perform action here.
-     }
- }
-   
- * \defgroup vTaskDelayUntil vTaskDelayUntil - * \ingroup TaskCtrl - */ -void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement ); - -/** - * task. h - *
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );
- * - * INCLUDE_xTaskPriorityGet must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Obtain the priority of any task. - * - * @param pxTask Handle of the task to be queried. Passing a NULL - * handle results in the priority of the calling task being returned. - * - * @return The priority of pxTask. - * - * Example usage: -
- void vAFunction( void )
- {
- xTaskHandle xHandle;
-		
-     // Create a task, storing the handle.
-     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
-		
-     // ...
-
-     // Use the handle to obtain the priority of the created task.
-     // It was created with tskIDLE_PRIORITY, but may have changed
-     // it itself.
-     if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY )
-     {
-         // The task has changed it's priority.
-     }
-
-     // ...
-
-     // Is our priority higher than the created task?
-     if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) )
-     {
-         // Our priority (obtained using NULL handle) is higher.
-     }
- }
-   
- * \defgroup uxTaskPriorityGet uxTaskPriorityGet - * \ingroup TaskCtrl - */ -unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask ); - -/** - * task. h - *
void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority );
- * - * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Set the priority of any task. - * - * A context switch will occur before the function returns if the priority - * being set is higher than the currently executing task. - * - * @param pxTask Handle to the task for which the priority is being set. - * Passing a NULL handle results in the priority of the calling task being set. - * - * @param uxNewPriority The priority to which the task will be set. - * - * Example usage: -
- void vAFunction( void )
- {
- xTaskHandle xHandle;
-		
-     // Create a task, storing the handle.
-     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
-
-     // ...
-
-     // Use the handle to raise the priority of the created task.
-     vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );
-
-     // ...
-
-     // Use a NULL handle to raise our priority to the same value.
-     vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 );
- }
-   
- * \defgroup vTaskPrioritySet vTaskPrioritySet - * \ingroup TaskCtrl - */ -void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ); - -/** - * task. h - *
void vTaskSuspend( xTaskHandle pxTaskToSuspend );
- * - * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Suspend any task. When suspended a task will never get any microcontroller - * processing time, no matter what its priority. - * - * Calls to vTaskSuspend are not accumulative - - * i.e. calling vTaskSuspend () twice on the same task still only requires one - * call to vTaskResume () to ready the suspended task. - * - * @param pxTaskToSuspend Handle to the task being suspended. Passing a NULL - * handle will cause the calling task to be suspended. - * - * Example usage: -
- void vAFunction( void )
- {
- xTaskHandle xHandle;
-		
-     // Create a task, storing the handle.
-     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
-		
-     // ...
-
-     // Use the handle to suspend the created task.
-     vTaskSuspend( xHandle );
-
-     // ...
-		
-     // The created task will not run during this period, unless
-     // another task calls vTaskResume( xHandle ).
-		
-     //...
-		
-
-     // Suspend ourselves.
-     vTaskSuspend( NULL );
-
-     // We cannot get here unless another task calls vTaskResume
-     // with our handle as the parameter.
- }
-   
- * \defgroup vTaskSuspend vTaskSuspend - * \ingroup TaskCtrl - */ -void vTaskSuspend( xTaskHandle pxTaskToSuspend ); - -/** - * task. h - *
void vTaskResume( xTaskHandle pxTaskToResume );
- * - * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Resumes a suspended task. - * - * A task that has been suspended by one of more calls to vTaskSuspend () - * will be made available for running again by a single call to - * vTaskResume (). - * - * @param pxTaskToResume Handle to the task being readied. - * - * Example usage: -
- void vAFunction( void )
- {
- xTaskHandle xHandle;
-		
-     // Create a task, storing the handle.
-     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
-		
-     // ...
-
-     // Use the handle to suspend the created task.
-     vTaskSuspend( xHandle );
-
-     // ...
-	
-     // The created task will not run during this period, unless
-     // another task calls vTaskResume( xHandle ).
-		
-     //...
-		
-
-     // Resume the suspended task ourselves.
-     vTaskResume( xHandle );
-
-     // The created task will once again get microcontroller processing
-     // time in accordance with it priority within the system.
- }
-   
- * \defgroup vTaskResume vTaskResume - * \ingroup TaskCtrl - */ -void vTaskResume( xTaskHandle pxTaskToResume ); - -/** - * task. h - *
void xTaskResumeFromISR( xTaskHandle pxTaskToResume );
- * - * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be - * available. See the configuration section for more information. - * - * An implementation of vTaskResume() that can be called from within an ISR. - * - * A task that has been suspended by one of more calls to vTaskSuspend () - * will be made available for running again by a single call to - * xTaskResumeFromISR (). - * - * @param pxTaskToResume Handle to the task being readied. - * - * \defgroup vTaskResumeFromISR vTaskResumeFromISR - * \ingroup TaskCtrl - */ -portBASE_TYPE xTaskResumeFromISR( xTaskHandle pxTaskToResume ); - -/*----------------------------------------------------------- - * SCHEDULER CONTROL - *----------------------------------------------------------*/ - -/** - * task. h - *
void vTaskStartScheduler( void );
- * - * Starts the real time kernel tick processing. After calling the kernel - * has control over which tasks are executed and when. This function - * does not return until an executing task calls vTaskEndScheduler (). - * - * At least one task should be created via a call to xTaskCreate () - * before calling vTaskStartScheduler (). The idle task is created - * automatically when the first application task is created. - * - * See the demo application file main.c for an example of creating - * tasks and starting the kernel. - * - * Example usage: -
- void vAFunction( void )
- {
-     // Create at least one task before starting the kernel.
-     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
-
-     // Start the real time kernel with preemption.
-     vTaskStartScheduler ();
-
-     // Will not get here unless a task calls vTaskEndScheduler ()
- }
-   
- * - * \defgroup vTaskStartScheduler vTaskStartScheduler - * \ingroup SchedulerControl - */ -void vTaskStartScheduler( void ); - -/** - * task. h - *
void vTaskEndScheduler( void );
- * - * Stops the real time kernel tick. All created tasks will be automatically - * deleted and multitasking (either preemptive or cooperative) will - * stop. Execution then resumes from the point where vTaskStartScheduler () - * was called, as if vTaskStartScheduler () had just returned. - * - * See the demo application file main. c in the demo/PC directory for an - * example that uses vTaskEndScheduler (). - * - * vTaskEndScheduler () requires an exit function to be defined within the - * portable layer (see vPortEndScheduler () in port. c for the PC port). This - * performs hardware specific operations such as stopping the kernel tick. - * - * vTaskEndScheduler () will cause all of the resources allocated by the - * kernel to be freed - but will not free resources allocated by application - * tasks. - * - * Example usage: -
- void vTaskCode( void * pvParameters )
- {
-     for( ;; )
-     {
-         // Task code goes here.
-
-         // At some point we want to end the real time kernel processing
-         // so call ...
-         vTaskEndScheduler ();
-     }
- }
-
- void vAFunction( void )
- {
-     // Create at least one task before starting the kernel.
-     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
-
-     // Start the real time kernel with preemption.
-     vTaskStartScheduler ();
-
-     // Will only get here when the vTaskCode () task has called
-     // vTaskEndScheduler ().  When we get here we are back to single task
-     // execution.
- }
-   
- * - * \defgroup vTaskEndScheduler vTaskEndScheduler - * \ingroup SchedulerControl - */ -void vTaskEndScheduler( void ); - -/** - * task. h - *
void vTaskSuspendAll( void );
- * - * Suspends all real time kernel activity while keeping interrupts (including the - * kernel tick) enabled. - * - * After calling vTaskSuspendAll () the calling task will continue to execute - * without risk of being swapped out until a call to xTaskResumeAll () has been - * made. - * - * Example usage: -
- void vTask1( void * pvParameters )
- {
-     for( ;; )
-     {
-         // Task code goes here.
-
-         // ...
-
-         // At some point the task wants to perform a long operation during
-         // which it does not want to get swapped out.  It cannot use
-         // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
-         // operation may cause interrupts to be missed - including the
-         // ticks.
-
-         // Prevent the real time kernel swapping out the task.
-         vTaskSuspendAll ();
-
-         // Perform the operation here.  There is no need to use critical
-         // sections as we have all the microcontroller processing time.
-         // During this time interrupts will still operate and the kernel
-         // tick count will be maintained.
-
-         // ...
-
-         // The operation is complete.  Restart the kernel.
-         xTaskResumeAll ();
-     }
- }
-   
- * \defgroup vTaskSuspendAll vTaskSuspendAll - * \ingroup SchedulerControl - */ -void vTaskSuspendAll( void ); - -/** - * task. h - *
portCHAR xTaskResumeAll( void );
- * - * Resumes real time kernel activity following a call to vTaskSuspendAll (). - * After a call to vTaskSuspendAll () the kernel will take control of which - * task is executing at any time. - * - * @return If resuming the scheduler caused a context switch then pdTRUE is - * returned, otherwise pdFALSE is returned. - * - * Example usage: -
- void vTask1( void * pvParameters )
- {
-     for( ;; )
-     {
-         // Task code goes here.
-
-         // ...
-
-         // At some point the task wants to perform a long operation during
-         // which it does not want to get swapped out.  It cannot use
-         // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
-         // operation may cause interrupts to be missed - including the
-         // ticks.
-
-         // Prevent the real time kernel swapping out the task.
-         vTaskSuspendAll ();
-
-         // Perform the operation here.  There is no need to use critical
-         // sections as we have all the microcontroller processing time.
-         // During this time interrupts will still operate and the real
-         // time kernel tick count will be maintained.
-
-         // ...
-
-         // The operation is complete.  Restart the kernel.  We want to force
-         // a context switch - but there is no point if resuming the scheduler
-         // caused a context switch already.
-         if( !xTaskResumeAll () )
-         {
-              taskYIELD ();
-         }
-     }
- }
-   
- * \defgroup xTaskResumeAll xTaskResumeAll - * \ingroup SchedulerControl - */ -signed portBASE_TYPE xTaskResumeAll( void ); - - -/*----------------------------------------------------------- - * TASK UTILITIES - *----------------------------------------------------------*/ - -/** - * task. h - *
volatile portTickType xTaskGetTickCount( void );
- * - * @return The count of ticks since vTaskStartScheduler was called. - * - * \page xTaskGetTickCount xTaskGetTickCount - * \ingroup TaskUtils - */ -portTickType xTaskGetTickCount( void ); - -/** - * task. h - *
unsigned portSHORT uxTaskGetNumberOfTasks( void );
- * - * @return The number of tasks that the real time kernel is currently managing. - * This includes all ready, blocked and suspended tasks. A task that - * has been deleted but not yet freed by the idle task will also be - * included in the count. - * - * \page uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks - * \ingroup TaskUtils - */ -unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void ); - -/** - * task. h - *
void vTaskList( portCHAR *pcWriteBuffer );
- * - * configUSE_TRACE_FACILITY, INCLUDE_vTaskDelete and INCLUDE_vTaskSuspend - * must all be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * NOTE: This function will disable interrupts for its duration. It is - * not intended for normal application runtime use but as a debug aid. - * - * Lists all the current tasks, along with their current state and stack - * usage high water mark. - * - * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or - * suspended ('S'). - * - * @param pcWriteBuffer A buffer into which the above mentioned details - * will be written, in ascii form. This buffer is assumed to be large - * enough to contain the generated report. Approximately 40 bytes per - * task should be sufficient. - * - * \page vTaskList vTaskList - * \ingroup TaskUtils - */ -void vTaskList( signed portCHAR *pcWriteBuffer ); - -/** - * task. h - *
void vTaskStartTrace( portCHAR * pcBuffer, unsigned portBASE_TYPE uxBufferSize );
- * - * Starts a real time kernel activity trace. The trace logs the identity of - * which task is running when. - * - * The trace file is stored in binary format. A separate DOS utility called - * convtrce.exe is used to convert this into a tab delimited text file which - * can be viewed and plotted in a spread sheet. - * - * @param pcBuffer The buffer into which the trace will be written. - * - * @param ulBufferSize The size of pcBuffer in bytes. The trace will continue - * until either the buffer in full, or ulTaskEndTrace () is called. - * - * \page vTaskStartTrace vTaskStartTrace - * \ingroup TaskUtils - */ -void vTaskStartTrace( signed portCHAR * pcBuffer, unsigned portLONG ulBufferSize ); - -/** - * task. h - *
unsigned portLONG ulTaskEndTrace( void );
- * - * Stops a kernel activity trace. See vTaskStartTrace (). - * - * @return The number of bytes that have been written into the trace buffer. - * - * \page usTaskEndTrace usTaskEndTrace - * \ingroup TaskUtils - */ -unsigned portLONG ulTaskEndTrace( void ); - - -/*----------------------------------------------------------- - * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES - *----------------------------------------------------------*/ - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY - * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS - * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * Called from the real time kernel tick (either preemptive or cooperative), - * this increments the tick count and checks if any tasks that are blocked - * for a finite period required removing from a blocked list and placing on - * a ready list. - */ -inline void vTaskIncrementTick( void ); - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN - * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. - * - * Removes the calling task from the ready list and places it both - * on the list of tasks waiting for a particular event, and the - * list of delayed tasks. The task will be removed from both lists - * and replaced on the ready list should either the event occur (and - * there be no higher priority tasks waiting on the same event) or - * the delay period expires. - * - * @param pxEventList The list containing tasks that are blocked waiting - * for the event to occur. - * - * @param xTicksToWait The maximum amount of time that the task should wait - * for the event to occur. This is specified in kernel ticks,the constant - * portTICK_RATE_MS can be used to convert kernel ticks into a real time - * period. - */ -void vTaskPlaceOnEventList( const xList * const pxEventList, portTickType xTicksToWait ); - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN - * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. - * - * Removes a task from both the specified event list and the list of blocked - * tasks, and places it on a ready queue. - * - * xTaskRemoveFromEventList () will be called if either an event occurs to - * unblock a task, or the block timeout period expires. - * - * @return pdTRUE if the task being removed has a higher priority than the task - * making the call, otherwise pdFALSE. - */ -signed portBASE_TYPE xTaskRemoveFromEventList( const xList * const pxEventList ); - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN - * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * INCLUDE_vTaskCleanUpResources and INCLUDE_vTaskSuspend must be defined as 1 - * for this function to be available. - * See the configuration section for more information. - * - * Empties the ready and delayed queues of task control blocks, freeing the - * memory allocated for the task control block and task stacks as it goes. - */ -void vTaskCleanUpResources( void ); - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY - * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS - * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * Sets the pointer to the current TCB to the TCB of the highest priority task - * that is ready to run. - */ -inline void vTaskSwitchContext( void ); - -/* - * Return the handle of the calling task. - */ -xTaskHandle xTaskGetCurrentTaskHandle( void ); - -/* - * Capture the current time status for future reference. - */ -void vTaskSetTimeOutState( xTimeOutType * const pxTimeOut ); - -/* - * Compare the time status now with that previously captured to see if the - * timeout has expired. - */ -portBASE_TYPE xTaskCheckForTimeOut( xTimeOutType * const pxTimeOut, portTickType * const pxTicksToWait ); - -/* - * Shortcut used by the queue implementation to prevent unnecessary call to - * taskYIELD(); - */ -void vTaskMissedYield( void ); - -/* - * Returns the scheduler state as taskSCHEDULER_RUNNING, - * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED. - */ -portBASE_TYPE xTaskGetSchedulerState( void ); - -/* - * Raises the priority of the mutex holder to that of the calling task should - * the mutex holder have a priority less than the calling task. - */ -void vTaskPriorityInherit( xTaskHandle * const pxMutexHolder ); - -/* - * Set the priority of a task back to its proper priority in the case that it - * inherited a higher priority while it was holding a semaphore. - */ -void vTaskPriorityDisinherit( xTaskHandle * const pxMutexHolder ); - -#ifdef __cplusplus -} -#endif -#endif /* TASK_H */ - - - diff --git a/FreeRTOS1/list.c b/FreeRTOS1/list.c deleted file mode 100644 index c44c2ce..0000000 --- a/FreeRTOS1/list.c +++ /dev/null @@ -1,211 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -/* -Changes from V1.2.0 - - + Removed the volatile modifier from the function parameters. This was - only ever included to prevent compiler warnings. Now warnings are - removed by casting parameters where the calls are made. - - + prvListGetOwnerOfNextEntry() and prvListGetOwnerOfHeadEntry() have been - removed from the c file and added as macros to the h file. - - + uxNumberOfItems has been added to the list structure. This removes the - need for a pointer comparison when checking if a list is empty, and so - is slightly faster. - - + Removed the NULL check in vListRemove(). This makes the call faster but - necessitates any application code utilising the list implementation to - ensure NULL pointers are not passed. - -Changes from V2.0.0 - - + Double linked the lists to allow faster removal item removal. - -Changes from V2.6.1 - - + Make use of the new portBASE_TYPE definition where ever appropriate. - -Changes from V3.0.0 - - + API changes as described on the FreeRTOS.org WEB site. - -Changes from V3.2.4 - - + Removed the pxHead member of the xList structure. This always pointed - to the same place so has been removed to free a few bytes of RAM. - - + Introduced the xMiniListItem structure that does not include the - xListItem members that are not required by the xListEnd member of a list. - Again this was done to reduce RAM usage. - - + Changed the volatile definitions of some structure members to clean up - the code where the list structures are used. - -Changes from V4.0.4 - - + Optimised vListInsert() in the case when the wake time is the maximum - tick count value. -*/ - -#include -#include "FreeRTOS.h" -#include "list.h" - -/*----------------------------------------------------------- - * PUBLIC LIST API documented in list.h - *----------------------------------------------------------*/ - -void vListInitialise( xList *pxList ) -{ - /* The list structure contains a list item which is used to mark the - end of the list. To initialise the list the list end is inserted - as the only list entry. */ - pxList->pxIndex = ( xListItem * ) &( pxList->xListEnd ); - - /* The list end value is the highest possible value in the list to - ensure it remains at the end of the list. */ - pxList->xListEnd.xItemValue = portMAX_DELAY; - - /* The list end next and previous pointers point to itself so we know - when the list is empty. */ - pxList->xListEnd.pxNext = ( xListItem * ) &( pxList->xListEnd ); - pxList->xListEnd.pxPrevious = ( xListItem * ) &( pxList->xListEnd ); - - pxList->uxNumberOfItems = 0; -} -/*-----------------------------------------------------------*/ - -void vListInitialiseItem( xListItem *pxItem ) -{ - /* Make sure the list item is not recorded as being on a list. */ - pxItem->pvContainer = NULL; -} -/*-----------------------------------------------------------*/ - -void vListInsertEnd( xList *pxList, xListItem *pxNewListItem ) -{ -volatile xListItem * pxIndex; - - /* Insert a new list item into pxList, but rather than sort the list, - makes the new list item the last item to be removed by a call to - pvListGetOwnerOfNextEntry. This means it has to be the item pointed to by - the pxIndex member. */ - pxIndex = pxList->pxIndex; - - pxNewListItem->pxNext = pxIndex->pxNext; - pxNewListItem->pxPrevious = pxList->pxIndex; - pxIndex->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem; - pxIndex->pxNext = ( volatile xListItem * ) pxNewListItem; - pxList->pxIndex = ( volatile xListItem * ) pxNewListItem; - - /* Remember which list the item is in. */ - pxNewListItem->pvContainer = ( void * ) pxList; - - ( pxList->uxNumberOfItems )++; -} -/*-----------------------------------------------------------*/ - -void vListInsert( xList *pxList, xListItem *pxNewListItem ) -{ -volatile xListItem *pxIterator; -portTickType xValueOfInsertion; - - /* Insert the new list item into the list, sorted in ulListItem order. */ - xValueOfInsertion = pxNewListItem->xItemValue; - - /* If the list already contains a list item with the same item value then - the new list item should be placed after it. This ensures that TCB's which - are stored in ready lists (all of which have the same ulListItem value) - get an equal share of the CPU. However, if the xItemValue is the same as - the back marker the iteration loop below will not end. This means we need - to guard against this by checking the value first and modifying the - algorithm slightly if necessary. */ - if( xValueOfInsertion == portMAX_DELAY ) - { - pxIterator = pxList->xListEnd.pxPrevious; - } - else - { - for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) - { - /* There is nothing to do here, we are just iterating to the - wanted insertion position. */ - } - } - - pxNewListItem->pxNext = pxIterator->pxNext; - pxNewListItem->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem; - pxNewListItem->pxPrevious = pxIterator; - pxIterator->pxNext = ( volatile xListItem * ) pxNewListItem; - - /* Remember which list the item is in. This allows fast removal of the - item later. */ - pxNewListItem->pvContainer = ( void * ) pxList; - - ( pxList->uxNumberOfItems )++; -} -/*-----------------------------------------------------------*/ - -void vListRemove( xListItem *pxItemToRemove ) -{ -xList * pxList; - - pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; - pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; - - /* The list item knows which list it is in. Obtain the list from the list - item. */ - pxList = ( xList * ) pxItemToRemove->pvContainer; - - /* Make sure the index is left pointing to a valid item. */ - if( pxList->pxIndex == pxItemToRemove ) - { - pxList->pxIndex = pxItemToRemove->pxPrevious; - } - - pxItemToRemove->pvContainer = NULL; - ( pxList->uxNumberOfItems )--; -} -/*-----------------------------------------------------------*/ - diff --git a/FreeRTOS1/portable/AIC-2.0.0/port.c b/FreeRTOS1/portable/AIC-2.0.0/port.c deleted file mode 100644 index 1b6c02d..0000000 --- a/FreeRTOS1/portable/AIC-2.0.0/port.c +++ /dev/null @@ -1,325 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -/* - Changes from V4.2.1 - - + Introduced the configKERNEL_INTERRUPT_PRIORITY definition. -*/ - -/*----------------------------------------------------------- - * Implementation of functions defined in portable.h for the PIC24 port. - *----------------------------------------------------------*/ - -/* Scheduler include files. */ -#include "FreeRTOS.h" -#include "task.h" - -/* Hardware specifics. */ -#define portBIT_SET 1 -#define portTIMER_PRESCALE 8 -#define portINITIAL_SR 0 - -/* Defined for backward compatability with project created prior to -FreeRTOS.org V4.3.0. */ -#ifndef configKERNEL_INTERRUPT_PRIORITY - #define configKERNEL_INTERRUPT_PRIORITY 1 -#endif - -/* The program counter is only 23 bits. */ -#define portUNUSED_PR_BITS 0x7f - -/* Records the nesting depth of calls to portENTER_CRITICAL(). */ -unsigned portBASE_TYPE uxCriticalNesting = 0xef; - -#if configKERNEL_INTERRUPT_PRIORITY != 1 - #error If configKERNEL_INTERRUPT_PRIORITY is not 1 then the #32 in the following macros needs changing to equal the portINTERRUPT_BITS value, which is ( configKERNEL_INTERRUPT_PRIORITY << 5 ) -#endif - - -#define portRESTORE_CONTEXT() \ - asm volatile( "MOV _pxCurrentTCB, W0 \n" /* Restore the stack pointer for the task. */ \ - "MOV [W0], W15 \n" \ - "POP W0 \n" /* Restore the critical nesting counter for the task. */ \ - "MOV W0, _uxCriticalNesting \n" \ - "POP PSVPAG \n" \ - "POP CORCON \n" \ - "POP DOENDH \n" \ - "POP DOENDL \n" \ - "POP DOSTARTH \n" \ - "POP DOSTARTL \n" \ - "POP DCOUNT \n" \ - "POP ACCBU \n" \ - "POP ACCBH \n" \ - "POP ACCBL \n" \ - "POP ACCAU \n" \ - "POP ACCAH \n" \ - "POP ACCAL \n" \ - "POP TBLPAG \n" \ - "POP RCOUNT \n" /* Restore the registers from the stack. */ \ - "POP W14 \n" \ - "POP.D W12 \n" \ - "POP.D W10 \n" \ - "POP.D W8 \n" \ - "POP.D W6 \n" \ - "POP.D W4 \n" \ - "POP.D W2 \n" \ - "POP.D W0 \n" \ - "POP SR " ); - - -#define portSAVE_CONTEXT() \ - asm volatile( "PUSH SR \n" /* Save the SR used by the task.... */ \ - "PUSH W0 \n" /* ....then disable interrupts. */ \ - "MOV #32, W0 \n" \ - "MOV W0, SR \n" \ - "PUSH W1 \n" /* Save registers to the stack. */ \ - "PUSH.D W2 \n" \ - "PUSH.D W4 \n" \ - "PUSH.D W6 \n" \ - "PUSH.D W8 \n" \ - "PUSH.D W10 \n" \ - "PUSH.D W12 \n" \ - "PUSH W14 \n" \ - "PUSH RCOUNT \n" \ - "PUSH TBLPAG \n" \ - "PUSH ACCAL \n" \ - "PUSH ACCAH \n" \ - "PUSH ACCAU \n" \ - "PUSH ACCBL \n" \ - "PUSH ACCBH \n" \ - "PUSH ACCBU \n" \ - "PUSH DCOUNT \n" \ - "PUSH DOSTARTL \n" \ - "PUSH DOSTARTH \n" \ - "PUSH DOENDL \n" \ - "PUSH DOENDH \n" \ - "PUSH CORCON \n" \ - "PUSH PSVPAG \n" \ - "MOV _uxCriticalNesting, W0 \n" /* Save the critical nesting counter for the task. */ \ - "PUSH W0 \n" \ - "MOV _pxCurrentTCB, W0 \n" /* Save the new top of stack into the TCB. */ \ - "MOV W15, [W0] " ); - -/* - * Setup the timer used to generate the tick interrupt. - */ -static void prvSetupTimerInterrupt( void ); - -/* - * See header file for description. - */ -portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) -{ -unsigned portSHORT usCode; -portBASE_TYPE i; - -const portSTACK_TYPE xInitialStack[] = -{ - 0x1111, /* W1 */ - 0x2222, /* W2 */ - 0x3333, /* W3 */ - 0x4444, /* W4 */ - 0x5555, /* W5 */ - 0x6666, /* W6 */ - 0x7777, /* W7 */ - 0x8888, /* W8 */ - 0x9999, /* W9 */ - 0xaaaa, /* W10 */ - 0xbbbb, /* W11 */ - 0xcccc, /* W12 */ - 0xdddd, /* W13 */ - 0xeeee, /* W14 */ - 0xcdce, /* RCOUNT */ - 0xabac, /* TBLPAG */ - - /* dsPIC specific registers. */ - 0x0202, /* ACCAL */ - 0x0303, /* ACCAH */ - 0x0404, /* ACCAU */ - 0x0505, /* ACCBL */ - 0x0606, /* ACCBH */ - 0x0707, /* ACCBU */ - 0x0808, /* DCOUNT */ - 0x090a, /* DOSTARTL */ - 0x1010, /* DOSTARTH */ - 0x1110, /* DOENDL */ - 0x1212, /* DOENDH */ -}; - - /* Setup the stack as if a yield had occurred. - - Save the low bytes of the program counter. */ - usCode = ( unsigned portSHORT ) pxCode; - *pxTopOfStack = ( portSTACK_TYPE ) usCode; - pxTopOfStack++; - - /* Save the high byte of the program counter. This will always be zero - here as it is passed in a 16bit pointer. If the address is greater than - 16 bits then the pointer will point to a jump table. */ - *pxTopOfStack = ( portSTACK_TYPE ) 0; - pxTopOfStack++; - - /* Status register with interrupts enabled. */ - *pxTopOfStack = portINITIAL_SR; - pxTopOfStack++; - - /* Parameters are passed in W0. */ - *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; - pxTopOfStack++; - - for( i = 0; i < ( sizeof( xInitialStack ) / sizeof( portSTACK_TYPE ) ); i++ ) - { - *pxTopOfStack = xInitialStack[ i ]; - pxTopOfStack++; - } - - *pxTopOfStack = CORCON; - pxTopOfStack++; - *pxTopOfStack = PSVPAG; - pxTopOfStack++; - - /* Finally the critical nesting depth. */ - *pxTopOfStack = 0x00; - pxTopOfStack++; - - return pxTopOfStack; -} -/*-----------------------------------------------------------*/ - -portBASE_TYPE xPortStartScheduler( void ) -{ - /* Setup a timer for the tick ISR. */ - prvSetupTimerInterrupt(); - - /* Restore the context of the first task to run. */ - portRESTORE_CONTEXT(); - - /* Simulate the end of the yield function. */ - asm volatile ( "return" ); - - /* Should not reach here. */ - return pdTRUE; -} -/*-----------------------------------------------------------*/ - -void vPortEndScheduler( void ) -{ - /* It is unlikely that the scheduler for the PIC port will get stopped - once running. If required disable the tick interrupt here, then return - to xPortStartScheduler(). */ -} -/*-----------------------------------------------------------*/ - -/* - * Manual context switch. This is similar to the tick context switch, - * but does not increment the tick count. It must be identical to the - * tick context switch in how it stores the stack of a task. - */ -void vPortYield( void ) -{ - portSAVE_CONTEXT(); - vTaskSwitchContext(); - portRESTORE_CONTEXT(); -} -/*-----------------------------------------------------------*/ - -/* - * Setup a timer for a regular tick. - */ -static void prvSetupTimerInterrupt( void ) -{ -const unsigned portLONG ulCompareMatch = ( configCPU_CLOCK_HZ / portTIMER_PRESCALE ) / configTICK_RATE_HZ; - - /* Prescale of 8. */ - T1CON = 0; - TMR1 = 0; - - PR1 = ( unsigned portSHORT ) ulCompareMatch; - - /* Setup timer 1 interrupt priority. */ - IPC0bits.T1IP = configKERNEL_INTERRUPT_PRIORITY; - - /* Clear the interrupt as a starting condition. */ - IFS0bits.T1IF = 0; - - /* Enable the interrupt. */ - IEC0bits.T1IE = 1; - - /* Setup the prescale value. */ -// T1CONbits.TCKPS0 = 1; -// T1CONbits.TCKPS1 = 0; - T1CONbits.TCKPS = 1; - - /* Start the timer. */ - T1CONbits.TON = 1; -} -/*-----------------------------------------------------------*/ - -void vPortEnterCritical( void ) -{ - portDISABLE_INTERRUPTS(); - uxCriticalNesting++; -} -/*-----------------------------------------------------------*/ - -void vPortExitCritical( void ) -{ - uxCriticalNesting--; - if( uxCriticalNesting == 0 ) - { - portENABLE_INTERRUPTS(); - } -} -/*-----------------------------------------------------------*/ - -void __attribute__((__interrupt__, auto_psv)) _T1Interrupt( void ) -{ - vTaskIncrementTick(); - - /* Clear the timer interrupt. */ - IFS0bits.T1IF = 0; - - #if configUSE_PREEMPTION == 1 - portYIELD(); - #endif -} diff --git a/FreeRTOS1/portable/AIC-2.0.0/portmacro.h b/FreeRTOS1/portable/AIC-2.0.0/portmacro.h deleted file mode 100644 index d71c58f..0000000 --- a/FreeRTOS1/portable/AIC-2.0.0/portmacro.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -#ifndef PORTMACRO_H -#define PORTMACRO_H - -#ifdef __cplusplus -extern "C" { -#endif - -/*----------------------------------------------------------- - * Port specific definitions. - * - * The settings in this file configure FreeRTOS correctly for the - * given hardware and compiler. - * - * These settings should not be altered. - *----------------------------------------------------------- - */ - -/* Type definitions. */ -#define portCHAR char -#define portFLOAT float -#define portDOUBLE double -#define portLONG long -#define portSHORT short -#define portSTACK_TYPE unsigned short -#define portBASE_TYPE short - -#if( configUSE_16_BIT_TICKS == 1 ) - typedef unsigned portSHORT portTickType; - #define portMAX_DELAY ( portTickType ) 0xffff -#else - typedef unsigned portLONG portTickType; - #define portMAX_DELAY ( portTickType ) 0xffffffff -#endif -/*-----------------------------------------------------------*/ - -/* Hardware specifics. */ -#define portBYTE_ALIGNMENT 2 -#define portSTACK_GROWTH 1 -#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ ) -/*-----------------------------------------------------------*/ - -/* Critical section management. */ -#define portINTERRUPT_BITS ( ( unsigned portSHORT ) configKERNEL_INTERRUPT_PRIORITY << ( unsigned portSHORT ) 5 ) - -#define portDISABLE_INTERRUPTS() SR |= portINTERRUPT_BITS -#define portENABLE_INTERRUPTS() SR &= ~portINTERRUPT_BITS - -/* Note that exiting a critical sectino will set the IPL bits to 0, nomatter -what their value was prior to entering the critical section. */ -extern void vPortEnterCritical( void ); -extern void vPortExitCritical( void ); -#define portENTER_CRITICAL() vPortEnterCritical() -#define portEXIT_CRITICAL() vPortExitCritical() -/*-----------------------------------------------------------*/ - -/* Task utilities. */ -extern void vPortYield( void ); -#define portYIELD() asm volatile ( "CALL _vPortYield \n" \ - "NOP " ); -/*-----------------------------------------------------------*/ - -/* Task function macros as described on the FreeRTOS.org WEB site. */ -#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) -#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) -/*-----------------------------------------------------------*/ - -/* Compiler specifics. */ -#define inline - -#define portNOP() asm volatile ( "NOP" ) - -#ifdef __cplusplus -} -#endif - -#endif /* PORTMACRO_H */ - diff --git a/FreeRTOS1/portable/MemMang/heap_1.c b/FreeRTOS1/portable/MemMang/heap_1.c deleted file mode 100644 index cb27c4c..0000000 --- a/FreeRTOS1/portable/MemMang/heap_1.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -/* - -Changes between V2.5.1 and V2.5.1 - - + The memory pool has been defined within a struct to ensure correct memory - alignment on 32bit systems. - -Changes between V2.6.1 and V3.0.0 - - + An overflow check has been added to ensure the next free byte variable - does not wrap around. -*/ - - -/* - * The simplest possible implementation of pvPortMalloc(). Note that this - * implementation does NOT allow allocated memory to be freed again. - * - * See heap_2.c and heap_3.c for alternative implementations, and the memory - * management pages of http://www.FreeRTOS.org for more information. - */ -#include -#include "FreeRTOS.h" -#include "task.h" - -/* Setup the correct byte alignment mask for the defined byte alignment. */ - -#if portBYTE_ALIGNMENT == 8 - #define heapBYTE_ALIGNMENT_MASK ( ( size_t ) 0x0007 ) -#endif - -#if portBYTE_ALIGNMENT == 4 - #define heapBYTE_ALIGNMENT_MASK ( ( size_t ) 0x0003 ) -#endif - -#if portBYTE_ALIGNMENT == 2 - #define heapBYTE_ALIGNMENT_MASK ( ( size_t ) 0x0001 ) -#endif - -#if portBYTE_ALIGNMENT == 1 - #define heapBYTE_ALIGNMENT_MASK ( ( size_t ) 0x0000 ) -#endif - -#ifndef heapBYTE_ALIGNMENT_MASK - #error "Invalid portBYTE_ALIGNMENT definition" -#endif - -/* Allocate the memory for the heap. The struct is used to force byte -alignment without using any non-portable code. */ -static struct xRTOS_HEAP -{ - unsigned portLONG ulDummy; - unsigned portCHAR ucHeap[ configTOTAL_HEAP_SIZE ]; -} xHeap; - -static size_t xNextFreeByte = ( size_t ) 0; -/*-----------------------------------------------------------*/ - -void *pvPortMalloc( size_t xWantedSize ) -{ -void *pvReturn = NULL; - - /* Ensure that blocks are always aligned to the required number of bytes. */ - #if portBYTE_ALIGNMENT != 1 - if( xWantedSize & heapBYTE_ALIGNMENT_MASK ) - { - /* Byte alignment required. */ - xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & heapBYTE_ALIGNMENT_MASK ) ); - } - #endif - - vTaskSuspendAll(); - { - /* Check there is enough room left for the allocation. */ - if( ( ( xNextFreeByte + xWantedSize ) < configTOTAL_HEAP_SIZE ) && - ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) )/* Check for overflow. */ - { - /* Return the next free byte then increment the index past this - block. */ - pvReturn = &( xHeap.ucHeap[ xNextFreeByte ] ); - xNextFreeByte += xWantedSize; - } - } - xTaskResumeAll(); - - return pvReturn; -} -/*-----------------------------------------------------------*/ - -void vPortFree( void *pv ) -{ - /* Memory cannot be freed using this scheme. See heap_2.c and heap_3.c - for alternative implementations, and the memory management pages of - http://www.FreeRTOS.org for more information. */ - ( void ) pv; -} -/*-----------------------------------------------------------*/ - -void vPortInitialiseBlocks( void ) -{ - /* Only required when static memory is not cleared. */ - xNextFreeByte = ( size_t ) 0; -} - - diff --git a/FreeRTOS1/portable/MemMang/heap_2.c b/FreeRTOS1/portable/MemMang/heap_2.c deleted file mode 100644 index c783988..0000000 --- a/FreeRTOS1/portable/MemMang/heap_2.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -/* - * A sample implementation of pvPortMalloc() and vPortFree() that permits - * allocated blocks to be freed, but does not combine adjacent free blocks - * into a single larger block. - * - * See heap_1.c and heap_3.c for alternative implementations, and the memory - * management pages of http://www.FreeRTOS.org for more information. - */ -#include - -#include "FreeRTOS.h" -#include "task.h" - -/* Setup the correct byte alignment mask for the defined byte alignment. */ - -#if portBYTE_ALIGNMENT == 8 - #define heapBYTE_ALIGNMENT_MASK ( ( size_t ) 0x0007 ) -#endif - -#if portBYTE_ALIGNMENT == 4 - #define heapBYTE_ALIGNMENT_MASK ( ( size_t ) 0x0003 ) -#endif - -#if portBYTE_ALIGNMENT == 2 - #define heapBYTE_ALIGNMENT_MASK ( ( size_t ) 0x0001 ) -#endif - -#if portBYTE_ALIGNMENT == 1 - #define heapBYTE_ALIGNMENT_MASK ( ( size_t ) 0x0000 ) -#endif - -#ifndef heapBYTE_ALIGNMENT_MASK - #error "Invalid portBYTE_ALIGNMENT definition" -#endif - -/* Allocate the memory for the heap. The struct is used to force byte -alignment without using any non-portable code. */ -static struct xRTOS_HEAP -{ - unsigned portLONG ulDummy; - unsigned portCHAR ucHeap[ configTOTAL_HEAP_SIZE ]; -} xHeap; - -/* Define the linked list structure. This is used to link free blocks in order -of their size. */ -typedef struct A_BLOCK_LINK -{ - struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */ - size_t xBlockSize; /*<< The size of the free block. */ -} xBlockLink; - - -static const unsigned portSHORT heapSTRUCT_SIZE = ( sizeof( xBlockLink ) + ( sizeof( xBlockLink ) % portBYTE_ALIGNMENT ) ); -#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( heapSTRUCT_SIZE * 2 ) ) - -/* Create a couple of list links to mark the start and end of the list. */ -static xBlockLink xStart, xEnd; - -/* STATIC FUNCTIONS ARE DEFINED AS MACROS TO MINIMIZE THE FUNCTION CALL DEPTH. */ - -/* - * Insert a block into the list of free blocks - which is ordered by size of - * the block. Small blocks at the start of the list and large blocks at the end - * of the list. - */ -#define prvInsertBlockIntoFreeList( pxBlockToInsert ) \ -{ \ -xBlockLink *pxIterator; \ -size_t xBlockSize; \ - \ - xBlockSize = pxBlockToInsert->xBlockSize; \ - \ - /* Iterate through the list until a block is found that has a larger size */ \ - /* than the block we are inserting. */ \ - for( pxIterator = &xStart; pxIterator->pxNextFreeBlock->xBlockSize < xBlockSize; pxIterator = pxIterator->pxNextFreeBlock ) \ - { \ - /* There is nothing to do here - just iterate to the correct position. */ \ - } \ - \ - /* Update the list to include the block being inserted in the correct */ \ - /* position. */ \ - pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; \ - pxIterator->pxNextFreeBlock = pxBlockToInsert; \ -} -/*-----------------------------------------------------------*/ - -#define prvHeapInit() \ -{ \ -xBlockLink *pxFirstFreeBlock; \ - \ - /* xStart is used to hold a pointer to the first item in the list of free */ \ - /* blocks. The void cast is used to prevent compiler warnings. */ \ - xStart.pxNextFreeBlock = ( void * ) xHeap.ucHeap; \ - xStart.xBlockSize = ( size_t ) 0; \ - \ - /* xEnd is used to mark the end of the list of free blocks. */ \ - xEnd.xBlockSize = configTOTAL_HEAP_SIZE; \ - xEnd.pxNextFreeBlock = NULL; \ - \ - /* To start with there is a single free block that is sized to take up the \ - entire heap space. */ \ - pxFirstFreeBlock = ( void * ) xHeap.ucHeap; \ - pxFirstFreeBlock->xBlockSize = configTOTAL_HEAP_SIZE; \ - pxFirstFreeBlock->pxNextFreeBlock = &xEnd; \ -} -/*-----------------------------------------------------------*/ - -void *pvPortMalloc( size_t xWantedSize ) -{ -xBlockLink *pxBlock, *pxPreviousBlock, *pxNewBlockLink; -static portBASE_TYPE xHeapHasBeenInitialised = pdFALSE; -void *pvReturn = NULL; - - vTaskSuspendAll(); - { - /* If this is the first call to malloc then the heap will require - initialisation to setup the list of free blocks. */ - if( xHeapHasBeenInitialised == pdFALSE ) - { - prvHeapInit(); - xHeapHasBeenInitialised = pdTRUE; - } - - /* The wanted size is increased so it can contain a xBlockLink - structure in addition to the requested amount of bytes. */ - if( xWantedSize > 0 ) - { - xWantedSize += heapSTRUCT_SIZE; - - /* Ensure that blocks are always aligned to the required number of bytes. */ - if( xWantedSize & heapBYTE_ALIGNMENT_MASK ) - { - /* Byte alignment required. */ - xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & heapBYTE_ALIGNMENT_MASK ) ); - } - } - - if( ( xWantedSize > 0 ) && ( xWantedSize < configTOTAL_HEAP_SIZE ) ) - { - /* Blocks are stored in byte order - traverse the list from the start - (smallest) block until one of adequate size is found. */ - pxPreviousBlock = &xStart; - pxBlock = xStart.pxNextFreeBlock; - while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock ) ) - { - pxPreviousBlock = pxBlock; - pxBlock = pxBlock->pxNextFreeBlock; - } - - /* If we found the end marker then a block of adequate size was not found. */ - if( pxBlock != &xEnd ) - { - /* Return the memory space - jumping over the xBlockLink structure - at its start. */ - pvReturn = ( void * ) ( ( ( unsigned portCHAR * ) pxPreviousBlock->pxNextFreeBlock ) + heapSTRUCT_SIZE ); - - /* This block is being returned for use so must be taken our of the - list of free blocks. */ - pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; - - /* If the block is larger than required it can be split into two. */ - if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) - { - /* This block is to be split into two. Create a new block - following the number of bytes requested. The void cast is - used to prevent byte alignment warnings from the compiler. */ - pxNewBlockLink = ( void * ) ( ( ( unsigned portCHAR * ) pxBlock ) + xWantedSize ); - - /* Calculate the sizes of two blocks split from the single - block. */ - pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; - pxBlock->xBlockSize = xWantedSize; - - /* Insert the new block into the list of free blocks. */ - prvInsertBlockIntoFreeList( ( pxNewBlockLink ) ); - } - } - } - } - xTaskResumeAll(); - - return pvReturn; -} -/*-----------------------------------------------------------*/ - -void vPortFree( void *pv ) -{ -unsigned portCHAR *puc = ( unsigned portCHAR * ) pv; -xBlockLink *pxLink; - - if( pv ) - { - /* The memory being freed will have an xBlockLink structure immediately - before it. */ - puc -= heapSTRUCT_SIZE; - - /* This casting is to keep the compiler from issuing warnings. */ - pxLink = ( void * ) puc; - - vTaskSuspendAll(); - { - /* Add this block to the list of free blocks. */ - prvInsertBlockIntoFreeList( ( ( xBlockLink * ) pxLink ) ); - } - xTaskResumeAll(); - } -} -/*-----------------------------------------------------------*/ - diff --git a/FreeRTOS1/portable/MemMang/heap_3.c b/FreeRTOS1/portable/MemMang/heap_3.c deleted file mode 100644 index 6ae5e1d..0000000 --- a/FreeRTOS1/portable/MemMang/heap_3.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - - -/* - * Implementation of pvPortMalloc() and vPortFree() that relies on the - * compilers own malloc() and free() implementations. - * - * This file can only be used if the linker is configured to to generate - * a heap memory area. - * - * See heap_2.c and heap_1.c for alternative implementations, and the memory - * management pages of http://www.FreeRTOS.org for more information. - */ - -#include - -#include "FreeRTOS.h" -#include "task.h" - -/*-----------------------------------------------------------*/ - -void *pvPortMalloc( size_t xWantedSize ) -{ -void *pvReturn; - - vTaskSuspendAll(); - { - pvReturn = malloc( xWantedSize ); - } - xTaskResumeAll(); - - return pvReturn; -} -/*-----------------------------------------------------------*/ - -void vPortFree( void *pv ) -{ - if( pv ) - { - vTaskSuspendAll(); - { - free( pv ); - } - xTaskResumeAll(); - } -} - - - diff --git a/FreeRTOS1/portable/readme.txt b/FreeRTOS1/portable/readme.txt deleted file mode 100644 index a20d687..0000000 --- a/FreeRTOS1/portable/readme.txt +++ /dev/null @@ -1,19 +0,0 @@ -Each real time kernel port consists of three files that contain the core kernel -components and are common to every port, and one or more files that are -specific to a particular microcontroller and/or compiler. - - -+ The FreeRTOS/Source/Portable/MemMang directory contains the three sample -memory allocators as described on the http://www.FreeRTOS.org WEB site. - -+ The other directories each contain files specific to a particular -microcontroller or compiler. - - - -For example, if you are interested in the GCC port for the ATMega323 -microcontroller then the port specific files are contained in -FreeRTOS/Source/Portable/GCC/ATMega323 directory. If this is the only -port you are interested in then all the other directories can be -ignored. - diff --git a/FreeRTOS1/queue.c b/FreeRTOS1/queue.c deleted file mode 100644 index a5c7591..0000000 --- a/FreeRTOS1/queue.c +++ /dev/null @@ -1,1322 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -#include -#include -#include "FreeRTOS.h" -#include "task.h" -#include "croutine.h" - -/*----------------------------------------------------------- - * PUBLIC LIST API documented in list.h - *----------------------------------------------------------*/ - -/* Constants used with the cRxLock and cTxLock structure members. */ -#define queueUNLOCKED ( ( signed portBASE_TYPE ) -1 ) -#define queueERRONEOUS_UNBLOCK ( -1 ) - -/* For internal use only. */ -#define queueSEND_TO_BACK ( 0 ) -#define queueSEND_TO_FRONT ( 1 ) - -/* Effectively make a union out of the xQUEUE structure. */ -#define pxMutexHolder pcTail -#define uxQueueType pcHead -#define uxRecursiveCallCount pcReadFrom -#define queueQUEUE_IS_MUTEX NULL - -/* Semaphores do not actually store or copy data, so have an items size of -zero. */ -#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( 0 ) -#define queueDONT_BLOCK ( ( portTickType ) 0 ) -#define queueMUTEX_GIVE_BLOCK_TIME ( ( portTickType ) 0 ) -/* - * Definition of the queue used by the scheduler. - * Items are queued by copy, not reference. - */ -typedef struct QueueDefinition -{ - signed portCHAR *pcHead; /*< Points to the beginning of the queue storage area. */ - signed portCHAR *pcTail; /*< Points to the byte at the end of the queue storage area. Once more byte is allocated than necessary to store the queue items, this is used as a marker. */ - - signed portCHAR *pcWriteTo; /*< Points to the free next place in the storage area. */ - signed portCHAR *pcReadFrom; /*< Points to the last place that a queued item was read from. */ - - xList xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ - xList xTasksWaitingToReceive; /*< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */ - - volatile unsigned portBASE_TYPE uxMessagesWaiting;/*< The number of items currently in the queue. */ - unsigned portBASE_TYPE uxLength; /*< The length of the queue defined as the number of items it will hold, not the number of bytes. */ - unsigned portBASE_TYPE uxItemSize; /*< The size of each items that the queue will hold. */ - - signed portBASE_TYPE xRxLock; /*< Stores the number of items received from the queue (removed from the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ - signed portBASE_TYPE xTxLock; /*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ -} xQUEUE; -/*-----------------------------------------------------------*/ - -/* - * Inside this file xQueueHandle is a pointer to a xQUEUE structure. - * To keep the definition private the API header file defines it as a - * pointer to void. - */ -typedef xQUEUE * xQueueHandle; - -/* - * Prototypes for public functions are included here so we don't have to - * include the API header file (as it defines xQueueHandle differently). These - * functions are documented in the API header file. - */ -xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize ); -signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ); -unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle pxQueue ); -void vQueueDelete( xQueueHandle xQueue ); -signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE xTaskPreviouslyWoken, portBASE_TYPE xCopyPosition ); -signed portBASE_TYPE xQueueGenericReceive( xQueueHandle pxQueue, const void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ); -signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, const void * const pvBuffer, signed portBASE_TYPE *pxTaskWoken ); -xQueueHandle xQueueCreateMutex( void ); -xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ); -portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime ); -portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle xMutex ); -signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ); -signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, const void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ); - -#if configUSE_CO_ROUTINES == 1 - signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken ); - signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken ); - signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait ); - signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait ); -#endif - -/* - * Unlocks a queue locked by a call to prvLockQueue. Locking a queue does not - * prevent an ISR from adding or removing items to the queue, but does prevent - * an ISR from removing tasks from the queue event lists. If an ISR finds a - * queue is locked it will instead increment the appropriate queue lock count - * to indicate that a task may require unblocking. When the queue in unlocked - * these lock counts are inspected, and the appropriate action taken. - */ -static void prvUnlockQueue( xQueueHandle pxQueue ); - -/* - * Uses a critical section to determine if there is any data in a queue. - * - * @return pdTRUE if the queue contains no items, otherwise pdFALSE. - */ -static signed portBASE_TYPE prvIsQueueEmpty( const xQueueHandle pxQueue ); - -/* - * Uses a critical section to determine if there is any space in a queue. - * - * @return pdTRUE if there is no space, otherwise pdFALSE; - */ -static signed portBASE_TYPE prvIsQueueFull( const xQueueHandle pxQueue ); - -/* - * Copies an item into the queue, either at the front of the queue or the - * back of the queue. - */ -static void prvCopyDataToQueue( xQUEUE *pxQueue, const void *pvItemToQueue, portBASE_TYPE xPosition ); - -/* - * Copies an item out of a queue. - */ -static void prvCopyDataFromQueue( xQUEUE * const pxQueue, const void *pvBuffer ); -/*-----------------------------------------------------------*/ - -/* - * Macro to mark a queue as locked. Locking a queue prevents an ISR from - * accessing the queue event lists. - */ -#define prvLockQueue( pxQueue ) \ -{ \ - taskENTER_CRITICAL(); \ - ++( pxQueue->xRxLock ); \ - ++( pxQueue->xTxLock ); \ - taskEXIT_CRITICAL(); \ -} -/*-----------------------------------------------------------*/ - - -/*----------------------------------------------------------- - * PUBLIC QUEUE MANAGEMENT API documented in queue.h - *----------------------------------------------------------*/ - -xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize ) -{ -xQUEUE *pxNewQueue; -size_t xQueueSizeInBytes; - - /* Allocate the new queue structure. */ - if( uxQueueLength > ( unsigned portBASE_TYPE ) 0 ) - { - pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) ); - if( pxNewQueue != NULL ) - { - /* Create the list of pointers to queue items. The queue is one byte - longer than asked for to make wrap checking easier/faster. */ - xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ) + ( size_t ) 1; - - pxNewQueue->pcHead = ( signed portCHAR * ) pvPortMalloc( xQueueSizeInBytes ); - if( pxNewQueue->pcHead != NULL ) - { - /* Initialise the queue members as described above where the - queue type is defined. */ - pxNewQueue->pcTail = pxNewQueue->pcHead + ( uxQueueLength * uxItemSize ); - pxNewQueue->uxMessagesWaiting = 0; - pxNewQueue->pcWriteTo = pxNewQueue->pcHead; - pxNewQueue->pcReadFrom = pxNewQueue->pcHead + ( ( uxQueueLength - 1 ) * uxItemSize ); - pxNewQueue->uxLength = uxQueueLength; - pxNewQueue->uxItemSize = uxItemSize; - pxNewQueue->xRxLock = queueUNLOCKED; - pxNewQueue->xTxLock = queueUNLOCKED; - - /* Likewise ensure the event queues start with the correct state. */ - vListInitialise( &( pxNewQueue->xTasksWaitingToSend ) ); - vListInitialise( &( pxNewQueue->xTasksWaitingToReceive ) ); - - return pxNewQueue; - } - else - { - vPortFree( pxNewQueue ); - } - } - } - - /* Will only reach here if we could not allocate enough memory or no memory - was required. */ - return NULL; -} -/*-----------------------------------------------------------*/ - -#if ( configUSE_MUTEXES == 1 ) - - xQueueHandle xQueueCreateMutex( void ) - { - xQUEUE *pxNewQueue; - - /* Allocate the new queue structure. */ - pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) ); - if( pxNewQueue != NULL ) - { - /* Information required for priority inheritance. */ - pxNewQueue->pxMutexHolder = NULL; - pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX; - - /* Queues used as a mutex no data is actually copied into or out - of the queue. */ - pxNewQueue->pcWriteTo = NULL; - pxNewQueue->pcReadFrom = NULL; - - /* Each mutex has a length of 1 (like a binary semaphore) and - an item size of 0 as nothing is actually copied into or out - of the mutex. */ - pxNewQueue->uxMessagesWaiting = 0; - pxNewQueue->uxLength = 1; - pxNewQueue->uxItemSize = 0; - pxNewQueue->xRxLock = queueUNLOCKED; - pxNewQueue->xTxLock = queueUNLOCKED; - - /* Ensure the event queues start with the correct state. */ - vListInitialise( &( pxNewQueue->xTasksWaitingToSend ) ); - vListInitialise( &( pxNewQueue->xTasksWaitingToReceive ) ); - - /* Start with the semaphore in the expected state. */ - xQueueGenericSend( pxNewQueue, NULL, 0, queueSEND_TO_BACK ); - } - - return pxNewQueue; - } - -#endif /* configUSE_MUTEXES */ -/*-----------------------------------------------------------*/ - -#if configUSE_RECURSIVE_MUTEXES == 1 - - portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex ) - { - portBASE_TYPE xReturn; - - /* If this is the task that holds the mutex then pxMutexHolder will not - change outside of this task. If this task does not hold the mutex then - pxMutexHolder can never coincidentally equal the tasks handle, and as - this is the only condition we are interested in it does not matter if - pxMutexHolder is accessed simultaneously by another task. Therefore no - mutual exclusion is required to test the pxMutexHolder variable. */ - if( pxMutex->pxMutexHolder == xTaskGetCurrentTaskHandle() ) - { - /* uxRecursiveCallCount cannot be zero if pxMutexHolder is equal to - the task handle, therefore no underflow check is required. Also, - uxRecursiveCallCount is only modified by the mutex holder, and as - there can only be one, no mutual exclusion is required to modify the - uxRecursiveCallCount member. */ - ( pxMutex->uxRecursiveCallCount )--; - - /* Have we unwound the call count? */ - if( pxMutex->uxRecursiveCallCount == 0 ) - { - /* Return the mutex. This will automatically unblock any other - task that might be waiting to access the mutex. */ - xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK ); - } - - xReturn = pdPASS; - } - else - { - /* We cannot give the mutex because we are not the holder. */ - xReturn = pdFAIL; - } - - return xReturn; - } - -#endif /* configUSE_RECURSIVE_MUTEXES */ -/*-----------------------------------------------------------*/ - -#if configUSE_RECURSIVE_MUTEXES == 1 - - portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle pxMutex, portTickType xBlockTime ) - { - portBASE_TYPE xReturn; - - /* Comments regarding mutual exclusion as per those within - xQueueGiveMutexRecursive(). */ - - if( pxMutex->pxMutexHolder == xTaskGetCurrentTaskHandle() ) - { - ( pxMutex->uxRecursiveCallCount )++; - xReturn = pdPASS; - } - else - { - xReturn = xQueueGenericReceive( pxMutex, NULL, xBlockTime, pdFALSE ); - - /* pdPASS will only be returned if we successfully obtained the mutex, - we may have blocked to reach here. */ - if( xReturn == pdPASS ) - { - ( pxMutex->uxRecursiveCallCount )++; - } - } - - return xReturn; - } - -#endif /* configUSE_RECURSIVE_MUTEXES */ -/*-----------------------------------------------------------*/ - -#if configUSE_COUNTING_SEMAPHORES == 1 - - xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ) - { - xQueueHandle pxHandle; - - pxHandle = xQueueCreate( ( unsigned portBASE_TYPE ) uxCountValue, queueSEMAPHORE_QUEUE_ITEM_LENGTH ); - - if( pxHandle != NULL ) - { - pxHandle->uxMessagesWaiting = uxInitialCount; - } - - return pxHandle; - } - -#endif /* configUSE_COUNTING_SEMAPHORES */ -/*-----------------------------------------------------------*/ - -signed portBASE_TYPE xQueueGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) -{ -signed portBASE_TYPE xReturn = pdPASS; -xTimeOutType xTimeOut; - - /* Make sure other tasks do not access the queue. */ - vTaskSuspendAll(); - - /* Capture the current time status for future reference. */ - vTaskSetTimeOutState( &xTimeOut ); - - /* It is important that this is the only thread/ISR that modifies the - ready or delayed lists until xTaskResumeAll() is called. Places where - the ready/delayed lists are modified include: - - + vTaskDelay() - Nothing can call vTaskDelay as the scheduler is - suspended, vTaskDelay() cannot be called from an ISR. - + vTaskPrioritySet() - Has a critical section around the access. - + vTaskSwitchContext() - This will not get executed while the scheduler - is suspended. - + prvCheckDelayedTasks() - This will not get executed while the - scheduler is suspended. - + xTaskCreate() - Has a critical section around the access. - + vTaskResume() - Has a critical section around the access. - + xTaskResumeAll() - Has a critical section around the access. - + xTaskRemoveFromEventList - Checks to see if the scheduler is - suspended. If so then the TCB being removed from the event is - removed from the event and added to the xPendingReadyList. - */ - - /* Make sure interrupts do not access the queue event list. */ - prvLockQueue( pxQueue ); - - /* It is important that interrupts to not access the event list of the - queue being modified here. Places where the event list is modified - include: - - + xQueueGenericSendFromISR(). This checks the lock on the queue to see - if it has access. If the queue is locked then the Tx lock count is - incremented to signify that a task waiting for data can be made ready - once the queue lock is removed. If the queue is not locked then - a task can be moved from the event list, but will not be removed - from the delayed list or placed in the ready list until the scheduler - is unlocked. - - + xQueueReceiveFromISR(). As per xQueueGenericSendFromISR(). - */ - - /* If the queue is already full we may have to block. */ - do - { - if( prvIsQueueFull( pxQueue ) ) - { - /* The queue is full - do we want to block or just leave without - posting? */ - if( xTicksToWait > ( portTickType ) 0 ) - { - /* We are going to place ourselves on the xTasksWaitingToSend event - list, and will get woken should the delay expire, or space become - available on the queue. - - As detailed above we do not require mutual exclusion on the event - list as nothing else can modify it or the ready lists while we - have the scheduler suspended and queue locked. - - It is possible that an ISR has removed data from the queue since we - checked if any was available. If this is the case then the data - will have been copied from the queue, and the queue variables - updated, but the event list will not yet have been checked to see if - anything is waiting as the queue is locked. */ - vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); - - /* Force a context switch now as we are blocked. We can do - this from within a critical section as the task we are - switching to has its own context. When we return here (i.e. we - unblock) we will leave the critical section as normal. - - It is possible that an ISR has caused an event on an unrelated and - unlocked queue. If this was the case then the event list for that - queue will have been updated but the ready lists left unchanged - - instead the readied task will have been added to the pending ready - list. */ - taskENTER_CRITICAL(); - { - /* We can safely unlock the queue and scheduler here as - interrupts are disabled. We must not yield with anything - locked, but we can yield from within a critical section. - - Tasks that have been placed on the pending ready list cannot - be tasks that are waiting for events on this queue. See - in comment xTaskRemoveFromEventList(). */ - prvUnlockQueue( pxQueue ); - - /* Resuming the scheduler may cause a yield. If so then there - is no point yielding again here. */ - if( !xTaskResumeAll() ) - { - taskYIELD(); - } - - /* We want to check to see if the queue is still full - before leaving the critical section. This is to prevent - this task placing an item into the queue due to an - interrupt making space on the queue between critical - sections (when there might be a higher priority task - blocked on the queue that cannot run yet because the - scheduler gets suspended). */ - if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) - { - /* We unblocked but there is no space in the queue, - we probably timed out. */ - xReturn = errQUEUE_FULL; - } - - /* Before leaving the critical section we have to ensure - exclusive access again. */ - vTaskSuspendAll(); - prvLockQueue( pxQueue ); - } - taskEXIT_CRITICAL(); - } - } - - /* If xReturn is errQUEUE_FULL then we unblocked when the queue - was still full. Don't check it again now as it is possible that - an interrupt has removed an item from the queue since we left the - critical section and we don't want to write to the queue in case - there is a task of higher priority blocked waiting for space to - be available on the queue. If this is the case the higher priority - task will execute when the scheduler is unsupended. */ - if( xReturn != errQUEUE_FULL ) - { - /* When we are here it is possible that we unblocked as space became - available on the queue. It is also possible that an ISR posted to the - queue since we left the critical section, so it may be that again there - is no space. This would only happen if a task and ISR post onto the - same queue. */ - taskENTER_CRITICAL(); - { - if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) - { - /* There is room in the queue, copy the data into the queue. */ - prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); - xReturn = pdPASS; - - /* Update the TxLock count so prvUnlockQueue knows to check for - tasks waiting for data to become available in the queue. */ - ++( pxQueue->xTxLock ); - } - else - { - xReturn = errQUEUE_FULL; - } - } - taskEXIT_CRITICAL(); - } - - if( xReturn == errQUEUE_FULL ) - { - if( xTicksToWait > 0 ) - { - if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) - { - xReturn = queueERRONEOUS_UNBLOCK; - } - } - } - } - while( xReturn == queueERRONEOUS_UNBLOCK ); - - prvUnlockQueue( pxQueue ); - xTaskResumeAll(); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -#if configUSE_ALTERNATIVE_API == 1 - - signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) - { - signed portBASE_TYPE xReturn; - xTimeOutType xTimeOut; - - /* The source code that implements the alternative (Alt) API is much - simpler because it executes everything from within a critical section. - This is the approach taken by many other RTOSes, but FreeRTOS.org has the - preferred fully featured API too. The fully featured API has more - complex code that takes longer to execute, but makes much less use of - critical sections. Therefore the alternative API sacrifices interrupt - responsiveness to gain execution speed, whereas the fully featured API - sacrifices execution speed to ensure better interrupt responsiveness. */ - - taskENTER_CRITICAL(); - { - /* Capture the current time status for future reference. */ - vTaskSetTimeOutState( &xTimeOut ); - - /* If the queue is already full we may have to block. */ - do - { - if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) - { - /* The queue is full - do we want to block or just leave without - posting? */ - if( xTicksToWait > ( portTickType ) 0 ) - { - /* We are going to place ourselves on the xTasksWaitingToSend - event list, and will get woken should the delay expire, or - space become available on the queue. */ - vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); - - /* Force a context switch now as we are blocked. We can do - this from within a critical section as the task we are - switching to has its own context. When we return here (i.e. - we unblock) we will leave the critical section as normal. */ - taskYIELD(); - } - } - - if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) - { - /* There is room in the queue, copy the data into the queue. */ - prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); - xReturn = pdPASS; - - if( !listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority. */ - taskYIELD(); - } - } - } - else - { - xReturn = errQUEUE_FULL; - - if( xTicksToWait > 0 ) - { - if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) - { - /* Another task must have accessed the queue between - this task unblocking and actually executing. */ - xReturn = queueERRONEOUS_UNBLOCK; - } - } - } - } - while( xReturn == queueERRONEOUS_UNBLOCK ); - } - taskEXIT_CRITICAL(); - - return xReturn; - } - -#endif /* configUSE_ALTERNATIVE_API */ -/*-----------------------------------------------------------*/ - -#if configUSE_ALTERNATIVE_API == 1 - - signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, const void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) - { - signed portBASE_TYPE xReturn = pdTRUE; - xTimeOutType xTimeOut; - signed portCHAR *pcOriginalReadPosition; - - /* The source code that implements the alternative (Alt) API is much - simpler because it executes everything from within a critical section. - This is the approach taken by many other RTOSes, but FreeRTOS.org has the - preferred fully featured API too. The fully featured API has more - complex code that takes longer to execute, but makes much less use of - critical sections. Therefore the alternative API sacrifices interrupt - responsiveness to gain execution speed, whereas the fully featured API - sacrifices execution speed to ensure better interrupt responsiveness. */ - - taskENTER_CRITICAL(); - { - /* Capture the current time status for future reference. */ - vTaskSetTimeOutState( &xTimeOut ); - - do - { - /* If there are no messages in the queue we may have to block. */ - if( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 ) - { - /* There are no messages in the queue, do we want to block or just - leave with nothing? */ - if( xTicksToWait > ( portTickType ) 0 ) - { - #if ( configUSE_MUTEXES == 1 ) - { - if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) - { - vTaskPriorityInherit( ( void * const ) pxQueue->pxMutexHolder ); - } - } - #endif - - vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); - taskYIELD(); - } - } - - if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) - { - /* Remember our read position in case we are just peeking. */ - pcOriginalReadPosition = pxQueue->pcReadFrom; - - prvCopyDataFromQueue( pxQueue, pvBuffer ); - - if( xJustPeeking == pdFALSE ) - { - /* We are actually removing data. */ - --( pxQueue->uxMessagesWaiting ); - - #if ( configUSE_MUTEXES == 1 ) - { - if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) - { - /* Record the information required to implement - priority inheritance should it become necessary. */ - pxQueue->pxMutexHolder = xTaskGetCurrentTaskHandle(); - } - } - #endif - - if( !listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - /* The task waiting has a higher priority. */ - taskYIELD(); - } - } - } - else - { - /* We are not removing the data, so reset our read - pointer. */ - pxQueue->pcReadFrom = pcOriginalReadPosition; - } - - xReturn = pdPASS; - } - else - { - xReturn = errQUEUE_EMPTY; - - if( xTicksToWait > 0 ) - { - if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) - { - xReturn = queueERRONEOUS_UNBLOCK; - } - } - } - - } while( xReturn == queueERRONEOUS_UNBLOCK ); - } - taskEXIT_CRITICAL(); - - return xReturn; - } - -#endif /* configUSE_ALTERNATIVE_API */ -/*-----------------------------------------------------------*/ - -signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE xTaskPreviouslyWoken, portBASE_TYPE xCopyPosition ) -{ - /* Similar to xQueueGenericSend, except we don't block if there is no room - in the queue. Also we don't directly wake a task that was blocked on a - queue read, instead we return a flag to say whether a context switch is - required or not (i.e. has a task with a higher priority than us been woken - by this post). */ - if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) - { - prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); - - /* If the queue is locked we do not alter the event list. This will - be done when the queue is unlocked later. */ - if( pxQueue->xTxLock == queueUNLOCKED ) - { - /* We only want to wake one task per ISR, so check that a task has - not already been woken. */ - if( !xTaskPreviouslyWoken ) - { - if( !listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority so record that a - context switch is required. */ - return pdTRUE; - } - } - } - } - else - { - /* Increment the lock count so the task that unlocks the queue - knows that data was posted while it was locked. */ - ++( pxQueue->xTxLock ); - } - } - - return xTaskPreviouslyWoken; -} -/*-----------------------------------------------------------*/ - -signed portBASE_TYPE xQueueGenericReceive( xQueueHandle pxQueue, const void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) -{ -signed portBASE_TYPE xReturn = pdTRUE; -xTimeOutType xTimeOut; -signed portCHAR *pcOriginalReadPosition; - - /* This function is very similar to xQueueGenericSend(). See comments - within xQueueGenericSend() for a more detailed explanation. - - Make sure other tasks do not access the queue. */ - vTaskSuspendAll(); - - /* Capture the current time status for future reference. */ - vTaskSetTimeOutState( &xTimeOut ); - - /* Make sure interrupts do not access the queue. */ - prvLockQueue( pxQueue ); - - do - { - /* If there are no messages in the queue we may have to block. */ - if( prvIsQueueEmpty( pxQueue ) ) - { - /* There are no messages in the queue, do we want to block or just - leave with nothing? */ - if( xTicksToWait > ( portTickType ) 0 ) - { - #if ( configUSE_MUTEXES == 1 ) - { - if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) - { - portENTER_CRITICAL(); - vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder ); - portEXIT_CRITICAL(); - } - } - #endif - - vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); - taskENTER_CRITICAL(); - { - prvUnlockQueue( pxQueue ); - if( !xTaskResumeAll() ) - { - taskYIELD(); - } - - if( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 ) - { - /* We unblocked but the queue is empty. We probably - timed out. */ - xReturn = errQUEUE_EMPTY; - } - - vTaskSuspendAll(); - prvLockQueue( pxQueue ); - } - taskEXIT_CRITICAL(); - } - } - - if( xReturn != errQUEUE_EMPTY ) - { - taskENTER_CRITICAL(); - { - if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) - { - /* Remember our read position in case we are just peeking. */ - pcOriginalReadPosition = pxQueue->pcReadFrom; - - prvCopyDataFromQueue( pxQueue, pvBuffer ); - - if( xJustPeeking == pdFALSE ) - { - /* We are actually removing data. */ - --( pxQueue->uxMessagesWaiting ); - - /* Increment the lock count so prvUnlockQueue knows to check for - tasks waiting for space to become available on the queue. */ - ++( pxQueue->xRxLock ); - - #if ( configUSE_MUTEXES == 1 ) - { - if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) - { - /* Record the information required to implement - priority inheritance should it become necessary. */ - pxQueue->pxMutexHolder = xTaskGetCurrentTaskHandle(); - } - } - #endif - } - else - { - /* We are not removing the data, so reset our read - pointer. */ - pxQueue->pcReadFrom = pcOriginalReadPosition; - - /* The data is being left in the queue, so increment the - lock count so prvUnlockQueue knows to check for other - tasks waiting for the data to be available. */ - ++( pxQueue->xTxLock ); - } - - xReturn = pdPASS; - } - else - { - xReturn = errQUEUE_EMPTY; - } - } - taskEXIT_CRITICAL(); - } - - if( xReturn == errQUEUE_EMPTY ) - { - if( xTicksToWait > 0 ) - { - if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) - { - xReturn = queueERRONEOUS_UNBLOCK; - } - } - } - } while( xReturn == queueERRONEOUS_UNBLOCK ); - - /* We no longer require exclusive access to the queue. */ - prvUnlockQueue( pxQueue ); - xTaskResumeAll(); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, const void * const pvBuffer, signed portBASE_TYPE *pxTaskWoken ) -{ -signed portBASE_TYPE xReturn; - - /* We cannot block from an ISR, so check there is data available. */ - if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) - { - prvCopyDataFromQueue( pxQueue, pvBuffer ); - --( pxQueue->uxMessagesWaiting ); - - /* If the queue is locked we will not modify the event list. Instead - we update the lock count so the task that unlocks the queue will know - that an ISR has removed data while the queue was locked. */ - if( pxQueue->xRxLock == queueUNLOCKED ) - { - /* We only want to wake one task per ISR, so check that a task has - not already been woken. */ - if( !( *pxTaskWoken ) ) - { - if( !listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - /* The task waiting has a higher priority than us so - force a context switch. */ - *pxTaskWoken = pdTRUE; - } - } - } - } - else - { - /* Increment the lock count so the task that unlocks the queue - knows that data was removed while it was locked. */ - ++( pxQueue->xRxLock ); - } - - xReturn = pdPASS; - } - else - { - xReturn = pdFAIL; - } - - return xReturn; -} -/*-----------------------------------------------------------*/ - -unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle pxQueue ) -{ -unsigned portBASE_TYPE uxReturn; - - taskENTER_CRITICAL(); - uxReturn = pxQueue->uxMessagesWaiting; - taskEXIT_CRITICAL(); - - return uxReturn; -} -/*-----------------------------------------------------------*/ - -void vQueueDelete( xQueueHandle pxQueue ) -{ - vPortFree( pxQueue->pcHead ); - vPortFree( pxQueue ); -} -/*-----------------------------------------------------------*/ - -static void prvCopyDataToQueue( xQUEUE *pxQueue, const void *pvItemToQueue, portBASE_TYPE xPosition ) -{ - if( pxQueue->uxItemSize == 0 ) - { - #if ( configUSE_MUTEXES == 1 ) - { - if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) - { - /* The mutex is no longer being held. */ - vTaskPriorityDisinherit( ( void * ) pxQueue->pxMutexHolder ); - pxQueue->pxMutexHolder = NULL; - } - } - #endif - } - else if( xPosition == queueSEND_TO_BACK ) - { - memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( unsigned ) pxQueue->uxItemSize ); - pxQueue->pcWriteTo += pxQueue->uxItemSize; - if( pxQueue->pcWriteTo >= pxQueue->pcTail ) - { - pxQueue->pcWriteTo = pxQueue->pcHead; - } - } - else - { - memcpy( ( void * ) pxQueue->pcReadFrom, pvItemToQueue, ( unsigned ) pxQueue->uxItemSize ); - pxQueue->pcReadFrom -= pxQueue->uxItemSize; - if( pxQueue->pcReadFrom < pxQueue->pcHead ) - { - pxQueue->pcReadFrom = ( pxQueue->pcTail - pxQueue->uxItemSize ); - } - } - - ++( pxQueue->uxMessagesWaiting ); -} -/*-----------------------------------------------------------*/ - -static void prvCopyDataFromQueue( xQUEUE * const pxQueue, const void *pvBuffer ) -{ - if( pxQueue->uxQueueType != queueQUEUE_IS_MUTEX ) - { - pxQueue->pcReadFrom += pxQueue->uxItemSize; - if( pxQueue->pcReadFrom >= pxQueue->pcTail ) - { - pxQueue->pcReadFrom = pxQueue->pcHead; - } - memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); - } -} -/*-----------------------------------------------------------*/ - -static void prvUnlockQueue( xQueueHandle pxQueue ) -{ - /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ - - /* The lock counts contains the number of extra data items placed or - removed from the queue while the queue was locked. When a queue is - locked items can be added or removed, but the event lists cannot be - updated. */ - taskENTER_CRITICAL(); - { - --( pxQueue->xTxLock ); - - /* See if data was added to the queue while it was locked. */ - if( pxQueue->xTxLock > queueUNLOCKED ) - { - pxQueue->xTxLock = queueUNLOCKED; - - /* Data was posted while the queue was locked. Are any tasks - blocked waiting for data to become available? */ - if( !listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) ) - { - /* Tasks that are removed from the event list will get added to - the pending ready list as the scheduler is still suspended. */ - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority so record that a - context switch is required. */ - vTaskMissedYield(); - } - } - } - } - taskEXIT_CRITICAL(); - - /* Do the same for the Rx lock. */ - taskENTER_CRITICAL(); - { - --( pxQueue->xRxLock ); - - if( pxQueue->xRxLock > queueUNLOCKED ) - { - pxQueue->xRxLock = queueUNLOCKED; - - if( !listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - vTaskMissedYield(); - } - } - } - } - taskEXIT_CRITICAL(); -} -/*-----------------------------------------------------------*/ - -static signed portBASE_TYPE prvIsQueueEmpty( const xQueueHandle pxQueue ) -{ -signed portBASE_TYPE xReturn; - - taskENTER_CRITICAL(); - xReturn = ( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 ); - taskEXIT_CRITICAL(); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -static signed portBASE_TYPE prvIsQueueFull( const xQueueHandle pxQueue ) -{ -signed portBASE_TYPE xReturn; - - taskENTER_CRITICAL(); - xReturn = ( pxQueue->uxMessagesWaiting == pxQueue->uxLength ); - taskEXIT_CRITICAL(); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -#if configUSE_CO_ROUTINES == 1 -signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait ) -{ -signed portBASE_TYPE xReturn; - - /* If the queue is already full we may have to block. A critical section - is required to prevent an interrupt removing something from the queue - between the check to see if the queue is full and blocking on the queue. */ - portDISABLE_INTERRUPTS(); - { - if( prvIsQueueFull( pxQueue ) ) - { - /* The queue is full - do we want to block or just leave without - posting? */ - if( xTicksToWait > ( portTickType ) 0 ) - { - /* As this is called from a coroutine we cannot block directly, but - return indicating that we need to block. */ - vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) ); - portENABLE_INTERRUPTS(); - return errQUEUE_BLOCKED; - } - else - { - portENABLE_INTERRUPTS(); - return errQUEUE_FULL; - } - } - } - portENABLE_INTERRUPTS(); - - portNOP(); - - portDISABLE_INTERRUPTS(); - { - if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) - { - /* There is room in the queue, copy the data into the queue. */ - prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); - xReturn = pdPASS; - - /* Were any co-routines waiting for data to become available? */ - if( !listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) ) - { - /* In this instance the co-routine could be placed directly - into the ready list as we are within a critical section. - Instead the same pending ready list mechanism is used as if - the event were caused from within an interrupt. */ - if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The co-routine waiting has a higher priority so record - that a yield might be appropriate. */ - xReturn = errQUEUE_YIELD; - } - } - } - else - { - xReturn = errQUEUE_FULL; - } - } - portENABLE_INTERRUPTS(); - - return xReturn; -} -#endif -/*-----------------------------------------------------------*/ - -#if configUSE_CO_ROUTINES == 1 -signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait ) -{ -signed portBASE_TYPE xReturn; - - /* If the queue is already empty we may have to block. A critical section - is required to prevent an interrupt adding something to the queue - between the check to see if the queue is empty and blocking on the queue. */ - portDISABLE_INTERRUPTS(); - { - if( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 ) - { - /* There are no messages in the queue, do we want to block or just - leave with nothing? */ - if( xTicksToWait > ( portTickType ) 0 ) - { - /* As this is a co-routine we cannot block directly, but return - indicating that we need to block. */ - vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) ); - portENABLE_INTERRUPTS(); - return errQUEUE_BLOCKED; - } - else - { - portENABLE_INTERRUPTS(); - return errQUEUE_FULL; - } - } - } - portENABLE_INTERRUPTS(); - - portNOP(); - - portDISABLE_INTERRUPTS(); - { - if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) - { - /* Data is available from the queue. */ - pxQueue->pcReadFrom += pxQueue->uxItemSize; - if( pxQueue->pcReadFrom >= pxQueue->pcTail ) - { - pxQueue->pcReadFrom = pxQueue->pcHead; - } - --( pxQueue->uxMessagesWaiting ); - memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); - - xReturn = pdPASS; - - /* Were any co-routines waiting for space to become available? */ - if( !listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) ) - { - /* In this instance the co-routine could be placed directly - into the ready list as we are within a critical section. - Instead the same pending ready list mechanism is used as if - the event were caused from within an interrupt. */ - if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - xReturn = errQUEUE_YIELD; - } - } - } - else - { - xReturn = pdFAIL; - } - } - portENABLE_INTERRUPTS(); - - return xReturn; -} -#endif -/*-----------------------------------------------------------*/ - - - -#if configUSE_CO_ROUTINES == 1 -signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken ) -{ - /* Cannot block within an ISR so if there is no space on the queue then - exit without doing anything. */ - if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) - { - prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); - - /* We only want to wake one co-routine per ISR, so check that a - co-routine has not already been woken. */ - if( !xCoRoutinePreviouslyWoken ) - { - if( !listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) ) - { - if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - return pdTRUE; - } - } - } - } - - return xCoRoutinePreviouslyWoken; -} -#endif -/*-----------------------------------------------------------*/ - -#if configUSE_CO_ROUTINES == 1 -signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxCoRoutineWoken ) -{ -signed portBASE_TYPE xReturn; - - /* We cannot block from an ISR, so check there is data available. If - not then just leave without doing anything. */ - if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) - { - /* Copy the data from the queue. */ - pxQueue->pcReadFrom += pxQueue->uxItemSize; - if( pxQueue->pcReadFrom >= pxQueue->pcTail ) - { - pxQueue->pcReadFrom = pxQueue->pcHead; - } - --( pxQueue->uxMessagesWaiting ); - memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); - - if( !( *pxCoRoutineWoken ) ) - { - if( !listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) ) - { - if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - *pxCoRoutineWoken = pdTRUE; - } - } - } - - xReturn = pdPASS; - } - else - { - xReturn = pdFAIL; - } - - return xReturn; -} -#endif -/*-----------------------------------------------------------*/ - diff --git a/FreeRTOS1/readme.txt b/FreeRTOS1/readme.txt deleted file mode 100644 index 01a8781..0000000 --- a/FreeRTOS1/readme.txt +++ /dev/null @@ -1,15 +0,0 @@ -Each real time kernel port consists of three files that contain the core kernel -components and are common to every port, and one or more files that are -specific to a particular microcontroller and or compiler. - -+ The FreeRTOS/Source directory contains the three files that are common to -every port. The kernel is contained within these three files. - -+ The FreeRTOS/Source/Portable directory contains the files that are specific to -a particular microcontroller and or compiler. - -+ The FreeRTOS/Source/include directory contains the real time kernel header -files. - -See the readme file in the FreeRTOS/Source/Portable directory for more -information. \ No newline at end of file diff --git a/FreeRTOS1/tasks.c b/FreeRTOS1/tasks.c deleted file mode 100644 index cc43e7e..0000000 --- a/FreeRTOS1/tasks.c +++ /dev/null @@ -1,2046 +0,0 @@ -/* - FreeRTOS.org V4.7.2 - Copyright (C) 2003-2008 Richard Barry. - - This file is part of the FreeRTOS.org distribution. - - FreeRTOS.org is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - FreeRTOS.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with FreeRTOS.org; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes FreeRTOS.org, without being obliged to provide - the source code for any proprietary components. See the licensing section - of http://www.FreeRTOS.org for full details of how and when the exception - can be applied. - - *************************************************************************** - - Please ensure to read the configuration and relevant port sections of the - online documentation. - - +++ http://www.FreeRTOS.org +++ - Documentation, latest information, license and contact details. - - +++ http://www.SafeRTOS.com +++ - A version that is certified for use in safety critical systems. - - +++ http://www.OpenRTOS.com +++ - Commercial support, development, porting, licensing and training services. - - *************************************************************************** -*/ - -/* -Changes from V1.00: - - + Call to portRESTORE_CONTEXT has been removed. The first context - switch is now performed within sPortStartScheduler(). - -Changes from V1.01: - - + More use of 8bit data types. - + Function name prefixes changed where the data type returned has changed. - + configUSE_TRACE_FACILITY is no longer defined by default. - -Changes from V1.2.0 - - + Introduced ucTopReadyPriority. This tracks the highest priority ready - queue that contains a valid TCB and thus makes the context switch - slightly faster. - - + prvAddTaskToReadyQueue() has been made a macro. - -Changes from V1.2.6 - - + Added conditional compilation directives. - + Extended API. - + Rearranged function order. - + Creating a task now causes a context switch if the task being created - has a higher priority than the calling task - assuming the kernel is - running. - + vTaskDelete() now only causes a context switch if the calling task is - the task being deleted. - -Changes from V2.0.0 - - + Allow the type of the tick count to be 16 or 32 bits. - + Introduce xPendingReadyList feature to allow the time interrupts have to - be disabled to be minimised. - + Remove the #if( INCLUDE_vTaskSuspendAll ) statements. vTaskSuspendAll() - is now always included as it is used by the scheduler itself. - -Changes from V2.1.0 - - + Bug fix - pxCurrentTCB is now initialised before the call to - prvInitializeTaskLists(). Previously pxCurrentTCB could be accessed - while null. - -Changed from V2.1.1 - - + Change to where lStackSize is declared within sTaskCreate() to prevent - compiler warnings with 8051 port. - -Changes from V2.2.0 - - + Explicit use of 'signed' qualifier on portCHAR types added. - + Changed odd calculation of initial pxTopOfStack value when - portSTACK_GROWTH < 0. - + Removed pcVersionNumber definition. - -Changes from V2.5.3 - - + cTaskResumeAll() modified to ensure it can be called prior to the task - lists being initialised. - -Changes from V2.5.5 - - + Added API function vTaskDelayUntil(). - + Added INCLUDE_vTaskDelay conditional compilation. - -Changes from V2.6.0 - - + Updated the vWriteTraceToBuffer macro to always be 4 byte aligned so it - can be used on ARM architectures. - + tskMAX_TASK_NAME_LEN definition replaced with the port specific - configMAX_TASK_NAME_LEN definition. - + Removed the call to strcpy when copying across the task name into the - TCB. - + Added ucTasksDeleted variable to prevent vTaskSuspendAll() being called - too often in the idle task. - -Changes between V3.0.0 and V2.6.1 - - + When resuming the scheduler a yield is performed if either a tick has - been missed, or a task is moved from the pending ready list into a ready - list. Previously a yield was not performed on this second condition. - + Introduced the type portBASE_TYPE. This necessitates several API - changes. - + Removed the sUsingPreemption variable. The constant defined in - portmacro.h is now used directly. - + The idle task can now include an optional hook function - and no longer - completes its time slice if other tasks with equal priority to it are - ready to run. - + See the FreeRTOS.org documentation for more information on V2.x.x to - V3.x.x modifications. - -Changes from V3.1.1 - - + Modified vTaskPrioritySet() and vTaskResume() to allow these functions to - be called while the scheduler is suspended. - + Corrected the task ordering within event lists. - -Changes from V3.2.0 - - + Added function xTaskGetCurrentTaskHandle(). - -Changes from V3.2.4 - - + Changed the volatile declarations on some variables to reflect the - changes to the list definitions. - + Changed the order of the TCB definition so there is commonality between - the task control block and a co-routine control block. - + Allow the scheduler to be started even if no tasks other than the idle - task has been created. This allows co-routines to run even when no tasks - have been created. - + The need for a context switch is now signalled if a task woken by an - event has a priority greater or equal to the currently running task. - Previously this was only greater than. - -Changes from V4.0.0 - - + Added the xMissedYield handling. - -Changes from V4.0.1 - - + The function vTaskList() now suspends the scheduler rather than disabling - interrupts during the creation of the task list. - + Allow a task to delete itself by passing in its own handle. Previously - this could only be done by passing in NULL. - + The tick hook function is now called only within a tick isr. Previously - it was also called when the tick function was called during the scheduler - unlocking process. - -Changes from V4.0.3 - - + Extra checks have been placed in vTaskPrioritySet() to avoid unnecessary - yields. - -Changed from V4.0.4 - - + Bug fix: The 'value' of the event list item is updated when the priority - of a task is changed. Previously only the priority of the TCB itself was - changed. - + When resuming a task a check is first made to see if the task is actually - suspended. - + vTaskPrioritySet() and vTaskResume() no longer use the event list item. - This has not been necessary since V4.0.1 when the xMissedYield handling - was added. - + Implement xTaskResumeFromISR(). - -Changes from V4.0.5 - - + Added utility functions and xOverflowCount variable to facilitate the - queue.c changes. - -Changes from V4.1.2 - - + Tasks that block on events with a timeout of portMAX_DELAY are now - blocked indefinitely if configINCLUDE_vTaskSuspend is defined. - Previously portMAX_DELAY was just the longest block time possible. - -Changes from V4.1.3 - - + Very small change made to xTaskCheckForTimeout() as a result of the - SafeRTOS testing. This corrects the case where the function can return an - invalid value - but only in an extremely unlikely scenario. - -Changes since V4.3.1: - - + Added xTaskGetSchedulerState() function. - + Added prvIsTaskSuspended() to take into account the Occurrence of - vTaskResume() or vTaskResumeFromISR() being called passing in the - handle of a task that appears in the Suspended list only because it - is blocked on an event without a timeout being specified. - + Updated xTaskCheckForTimeout() to take into account that tasks blocked - using the Suspended list should never time out. -*/ - -#include -#include -#include - -#include "FreeRTOS.h" -#include "task.h" - -/* - * Macro to define the amount of stack available to the idle task. - */ -#define tskIDLE_STACK_SIZE configMINIMAL_STACK_SIZE - - -/* - * Default a definitions for backwards compatibility with old - * portmacro.h files. - */ -#ifndef configMAX_TASK_NAME_LEN - #define configMAX_TASK_NAME_LEN 16 -#endif - -#ifndef configIDLE_SHOULD_YIELD - #define configIDLE_SHOULD_YIELD 1 -#endif - -#if configMAX_TASK_NAME_LEN < 1 - #undef configMAX_TASK_NAME_LEN - #define configMAX_TASK_NAME_LEN 1 -#endif - -#ifndef INCLUDE_xTaskResumeFromISR - #define INCLUDE_xTaskResumeFromISR 1 -#endif - -#ifndef INCLUDE_xTaskGetSchedulerState - #define INCLUDE_xTaskGetSchedulerState 0 -#endif - -/* - * Task control block. A task control block (TCB) is allocated to each task, - * and stores the context of the task. - */ -typedef struct tskTaskControlBlock -{ - volatile portSTACK_TYPE *pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE STRUCT. */ - xListItem xGenericListItem; /*< List item used to place the TCB in ready and blocked queues. */ - xListItem xEventListItem; /*< List item used to place the TCB in event lists. */ - unsigned portBASE_TYPE uxPriority; /*< The priority of the task where 0 is the lowest priority. */ - portSTACK_TYPE *pxStack; /*< Points to the start of the stack. */ - signed portCHAR pcTaskName[ configMAX_TASK_NAME_LEN ];/*< Descriptive name given to the task when created. Facilitates debugging only. */ - - #if ( configUSE_TRACE_FACILITY == 1 ) - unsigned portBASE_TYPE uxTCBNumber; /*< This is used for tracing the scheduler and making debugging easier only. */ - #endif - - #if ( configUSE_MUTEXES == 1 ) - unsigned portBASE_TYPE uxBasePriority; - #endif - -} tskTCB; - -/*lint -e956 */ - -tskTCB * volatile pxCurrentTCB = NULL; - -/* Lists for ready and blocked tasks. --------------------*/ - -static xList pxReadyTasksLists[ configMAX_PRIORITIES ]; /*< Prioritised ready tasks. */ -static xList xDelayedTaskList1; /*< Delayed tasks. */ -static xList xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ -static xList * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */ -static xList * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ -static xList xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready queue when the scheduler is resumed. */ - -#if ( INCLUDE_vTaskDelete == 1 ) - - static volatile xList xTasksWaitingTermination; /*< Tasks that have been deleted - but the their memory not yet freed. */ - static volatile unsigned portBASE_TYPE uxTasksDeleted = ( unsigned portBASE_TYPE ) 0; - -#endif - -#if ( INCLUDE_vTaskSuspend == 1 ) - - static xList xSuspendedTaskList; /*< Tasks that are currently suspended. */ - -#endif - -/* File private variables. --------------------------------*/ -static volatile unsigned portBASE_TYPE uxCurrentNumberOfTasks = ( unsigned portBASE_TYPE ) 0; -static volatile portTickType xTickCount = ( portTickType ) 0; -static unsigned portBASE_TYPE uxTopUsedPriority = tskIDLE_PRIORITY; -static volatile unsigned portBASE_TYPE uxTopReadyPriority = tskIDLE_PRIORITY; -static volatile signed portBASE_TYPE xSchedulerRunning = pdFALSE; -static volatile unsigned portBASE_TYPE uxSchedulerSuspended = ( unsigned portBASE_TYPE ) pdFALSE; -static volatile unsigned portBASE_TYPE uxMissedTicks = ( unsigned portBASE_TYPE ) 0; -static volatile portBASE_TYPE xMissedYield = ( portBASE_TYPE ) pdFALSE; -static volatile portBASE_TYPE xNumOfOverflows = ( portBASE_TYPE ) 0; -/* Debugging and trace facilities private variables and macros. ------------*/ - -/* - * The value used to fill the stack of a task when the task is created. This - * is used purely for checking the high water mark for tasks. - */ -#define tskSTACK_FILL_BYTE ( 0xa5 ) - -/* - * Macros used by vListTask to indicate which state a task is in. - */ -#define tskBLOCKED_CHAR ( ( signed portCHAR ) 'B' ) -#define tskREADY_CHAR ( ( signed portCHAR ) 'R' ) -#define tskDELETED_CHAR ( ( signed portCHAR ) 'D' ) -#define tskSUSPENDED_CHAR ( ( signed portCHAR ) 'S' ) - -/* - * Macros and private variables used by the trace facility. - */ -#if ( configUSE_TRACE_FACILITY == 1 ) - - #define tskSIZE_OF_EACH_TRACE_LINE ( ( unsigned portLONG ) ( sizeof( unsigned portLONG ) + sizeof( unsigned portLONG ) ) ) - static volatile signed portCHAR * volatile pcTraceBuffer; - static signed portCHAR *pcTraceBufferStart; - static signed portCHAR *pcTraceBufferEnd; - static signed portBASE_TYPE xTracing = pdFALSE; - -#endif - -/* - * Macro that writes a trace of scheduler activity to a buffer. This trace - * shows which task is running when and is very useful as a debugging tool. - * As this macro is called each context switch it is a good idea to undefine - * it if not using the facility. - */ -#if ( configUSE_TRACE_FACILITY == 1 ) - - #define vWriteTraceToBuffer() \ - { \ - if( xTracing ) \ - { \ - static unsigned portBASE_TYPE uxPreviousTask = 255; \ - \ - if( uxPreviousTask != pxCurrentTCB->uxTCBNumber ) \ - { \ - if( ( pcTraceBuffer + tskSIZE_OF_EACH_TRACE_LINE ) < pcTraceBufferEnd ) \ - { \ - uxPreviousTask = pxCurrentTCB->uxTCBNumber; \ - *( unsigned portLONG * ) pcTraceBuffer = ( unsigned portLONG ) xTickCount; \ - pcTraceBuffer += sizeof( unsigned portLONG ); \ - *( unsigned portLONG * ) pcTraceBuffer = ( unsigned portLONG ) uxPreviousTask; \ - pcTraceBuffer += sizeof( unsigned portLONG ); \ - } \ - else \ - { \ - xTracing = pdFALSE; \ - } \ - } \ - } \ - } - -#else - - #define vWriteTraceToBuffer() - -#endif - - -/* - * Place the task represented by pxTCB into the appropriate ready queue for - * the task. It is inserted at the end of the list. One quirk of this is - * that if the task being inserted is at the same priority as the currently - * executing task, then it will only be rescheduled after the currently - * executing task has been rescheduled. - */ -#define prvAddTaskToReadyQueue( pxTCB ) \ -{ \ - if( pxTCB->uxPriority > uxTopReadyPriority ) \ - { \ - uxTopReadyPriority = pxTCB->uxPriority; \ - } \ - vListInsertEnd( ( xList * ) &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xGenericListItem ) ); \ -} - -/* - * Macro that looks at the list of tasks that are currently delayed to see if - * any require waking. - * - * Tasks are stored in the queue in the order of their wake time - meaning - * once one tasks has been found whose timer has not expired we need not look - * any further down the list. - */ -#define prvCheckDelayedTasks() \ -{ \ -register tskTCB *pxTCB; \ - \ - while( ( pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ) ) != NULL ) \ - { \ - if( xTickCount < listGET_LIST_ITEM_VALUE( &( pxTCB->xGenericListItem ) ) ) \ - { \ - break; \ - } \ - vListRemove( &( pxTCB->xGenericListItem ) ); \ - /* Is the task waiting on an event also? */ \ - if( pxTCB->xEventListItem.pvContainer ) \ - { \ - vListRemove( &( pxTCB->xEventListItem ) ); \ - } \ - prvAddTaskToReadyQueue( pxTCB ); \ - } \ -} - -/* - * Several functions take an xTaskHandle parameter that can optionally be NULL, - * where NULL is used to indicate that the handle of the currently executing - * task should be used in place of the parameter. This macro simply checks to - * see if the parameter is NULL and returns a pointer to the appropriate TCB. - */ -#define prvGetTCBFromHandle( pxHandle ) ( ( pxHandle == NULL ) ? ( tskTCB * ) pxCurrentTCB : ( tskTCB * ) pxHandle ) - - -/* File private functions. --------------------------------*/ - -/* - * Utility to ready a TCB for a given task. Mainly just copies the parameters - * into the TCB structure. - */ -static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed portCHAR * const pcName, unsigned portBASE_TYPE uxPriority ); - -/* - * Utility to ready all the lists used by the scheduler. This is called - * automatically upon the creation of the first task. - */ -static void prvInitialiseTaskLists( void ); - -/* - * The idle task, which as all tasks is implemented as a never ending loop. - * The idle task is automatically created and added to the ready lists upon - * creation of the first user task. - * - * The portTASK_FUNCTION_PROTO() macro is used to allow port/compiler specific - * language extensions. The equivalent prototype for this function is: - * - * void prvIdleTask( void *pvParameters ); - * - */ -static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ); - -/* - * Utility to free all memory allocated by the scheduler to hold a TCB, - * including the stack pointed to by the TCB. - * - * This does not free memory allocated by the task itself (i.e. memory - * allocated by calls to pvPortMalloc from within the tasks application code). - */ -#if ( ( INCLUDE_vTaskDelete == 1 ) || ( INCLUDE_vTaskCleanUpResources == 1 ) ) - static void prvDeleteTCB( tskTCB *pxTCB ); -#endif - -/* - * Used only by the idle task. This checks to see if anything has been placed - * in the list of tasks waiting to be deleted. If so the task is cleaned up - * and its TCB deleted. - */ -static void prvCheckTasksWaitingTermination( void ); - -/* - * Allocates memory from the heap for a TCB and associated stack. Checks the - * allocation was successful. - */ -static tskTCB *prvAllocateTCBAndStack( unsigned portSHORT usStackDepth ); - -/* - * Called from vTaskList. vListTasks details all the tasks currently under - * control of the scheduler. The tasks may be in one of a number of lists. - * prvListTaskWithinSingleList accepts a list and details the tasks from - * within just that list. - * - * THIS FUNCTION IS INTENDED FOR DEBUGGING ONLY, AND SHOULD NOT BE CALLED FROM - * NORMAL APPLICATION CODE. - */ -#if ( configUSE_TRACE_FACILITY == 1 ) - - static void prvListTaskWithinSingleList( const signed portCHAR *pcWriteBuffer, xList *pxList, signed portCHAR cStatus ); - -#endif - -/* - * When a task is created, the stack of the task is filled with a known value. - * This function determines the 'high water mark' of the task stack by - * determining how much of the stack remains at the original preset value. - */ -#if ( configUSE_TRACE_FACILITY == 1 ) - - unsigned portSHORT usTaskCheckFreeStackSpace( const unsigned portCHAR * pucStackByte ); - -#endif - -/* - * Checks that a task being resumed (unsuspended) is actually in the Suspended - * state. - */ -#if ( INCLUDE_vTaskSuspend == 1 ) - - static portBASE_TYPE prvIsTaskSuspended( const tskTCB * const pxTCB ); - -#endif - -/*lint +e956 */ - - - - - -/*----------------------------------------------------------- - * TASK CREATION API documented in task.h - *----------------------------------------------------------*/ - -signed portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode, const signed portCHAR * const pcName, unsigned portSHORT usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask ) -{ -signed portBASE_TYPE xReturn; -tskTCB * pxNewTCB; -#if ( configUSE_TRACE_FACILITY == 1 ) - static unsigned portBASE_TYPE uxTaskNumber = 0; /*lint !e956 Static is deliberate - this is guarded before use. */ -#endif - - /* Allocate the memory required by the TCB and stack for the new task. - checking that the allocation was successful. */ - pxNewTCB = prvAllocateTCBAndStack( usStackDepth ); - - if( pxNewTCB != NULL ) - { - portSTACK_TYPE *pxTopOfStack; - - /* Setup the newly allocated TCB with the initial state of the task. */ - prvInitialiseTCBVariables( pxNewTCB, pcName, uxPriority ); - - /* Calculate the top of stack address. This depends on whether the - stack grows from high memory to low (as per the 80x86) or visa versa. - portSTACK_GROWTH is used to make the result positive or negative as - required by the port. */ - #if portSTACK_GROWTH < 0 - { - pxTopOfStack = pxNewTCB->pxStack + ( usStackDepth - 1 ); - } - #else - { - pxTopOfStack = pxNewTCB->pxStack; - } - #endif - - /* Initialize the TCB stack to look as if the task was already running, - but had been interrupted by the scheduler. The return address is set - to the start of the task function. Once the stack has been initialised - the top of stack variable is updated. */ - pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pvTaskCode, pvParameters ); - - /* We are going to manipulate the task queues to add this task to a - ready list, so must make sure no interrupts occur. */ - portENTER_CRITICAL(); - { - uxCurrentNumberOfTasks++; - if( uxCurrentNumberOfTasks == ( unsigned portBASE_TYPE ) 1 ) - { - /* As this is the first task it must also be the current task. */ - pxCurrentTCB = pxNewTCB; - - /* This is the first task to be created so do the preliminary - initialisation required. We will not recover if this call - fails, but we will report the failure. */ - prvInitialiseTaskLists(); - } - else - { - /* If the scheduler is not already running, make this task the - current task if it is the highest priority task to be created - so far. */ - if( xSchedulerRunning == pdFALSE ) - { - if( pxCurrentTCB->uxPriority <= uxPriority ) - { - pxCurrentTCB = pxNewTCB; - } - } - } - - /* Remember the top priority to make context switching faster. Use - the priority in pxNewTCB as this has been capped to a valid value. */ - if( pxNewTCB->uxPriority > uxTopUsedPriority ) - { - uxTopUsedPriority = pxNewTCB->uxPriority; - } - - #if ( configUSE_TRACE_FACILITY == 1 ) - { - /* Add a counter into the TCB for tracing only. */ - pxNewTCB->uxTCBNumber = uxTaskNumber; - uxTaskNumber++; - } - #endif - - prvAddTaskToReadyQueue( pxNewTCB ); - - xReturn = pdPASS; - } - portEXIT_CRITICAL(); - } - else - { - xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; - } - - if( xReturn == pdPASS ) - { - if( ( void * ) pxCreatedTask != NULL ) - { - /* Pass the TCB out - in an anonymous way. The calling function/ - task can use this as a handle to delete the task later if - required.*/ - *pxCreatedTask = ( xTaskHandle ) pxNewTCB; - } - - if( xSchedulerRunning != pdFALSE ) - { - /* If the created task is of a higher priority than the current task - then it should run now. */ - if( pxCurrentTCB->uxPriority < uxPriority ) - { - taskYIELD(); - } - } - } - - return xReturn; -} -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskDelete == 1 ) - - void vTaskDelete( xTaskHandle pxTaskToDelete ) - { - tskTCB *pxTCB; - - taskENTER_CRITICAL(); - { - /* Ensure a yield is performed if the current task is being - deleted. */ - if( pxTaskToDelete == pxCurrentTCB ) - { - pxTaskToDelete = NULL; - } - - /* If null is passed in here then we are deleting ourselves. */ - pxTCB = prvGetTCBFromHandle( pxTaskToDelete ); - - /* Remove task from the ready list and place in the termination list. - This will stop the task from be scheduled. The idle task will check - the termination list and free up any memory allocated by the - scheduler for the TCB and stack. */ - vListRemove( &( pxTCB->xGenericListItem ) ); - - /* Is the task waiting on an event also? */ - if( pxTCB->xEventListItem.pvContainer ) - { - vListRemove( &( pxTCB->xEventListItem ) ); - } - - vListInsertEnd( ( xList * ) &xTasksWaitingTermination, &( pxTCB->xGenericListItem ) ); - - /* Increment the ucTasksDeleted variable so the idle task knows - there is a task that has been deleted and that it should therefore - check the xTasksWaitingTermination list. */ - ++uxTasksDeleted; - } - taskEXIT_CRITICAL(); - - /* Force a reschedule if we have just deleted the current task. */ - if( xSchedulerRunning != pdFALSE ) - { - if( ( void * ) pxTaskToDelete == NULL ) - { - taskYIELD(); - } - } - } - -#endif - - - - - - -/*----------------------------------------------------------- - * TASK CONTROL API documented in task.h - *----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskDelayUntil == 1 ) - - void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement ) - { - portTickType xTimeToWake; - portBASE_TYPE xAlreadyYielded, xShouldDelay = pdFALSE; - - vTaskSuspendAll(); - { - /* Generate the tick time at which the task wants to wake. */ - xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; - - if( xTickCount < *pxPreviousWakeTime ) - { - /* The tick count has overflowed since this function was - lasted called. In this case the only time we should ever - actually delay is if the wake time has also overflowed, - and the wake time is greater than the tick time. When this - is the case it is as if neither time had overflowed. */ - if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xTickCount ) ) - { - xShouldDelay = pdTRUE; - } - } - else - { - /* The tick time has not overflowed. In this case we will - delay if either the wake time has overflowed, and/or the - tick time is less than the wake time. */ - if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xTickCount ) ) - { - xShouldDelay = pdTRUE; - } - } - - /* Update the wake time ready for the next call. */ - *pxPreviousWakeTime = xTimeToWake; - - if( xShouldDelay ) - { - /* We must remove ourselves from the ready list before adding - ourselves to the blocked list as the same list item is used for - both lists. */ - vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); - - /* The list item will be inserted in wake time order. */ - listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake ); - - if( xTimeToWake < xTickCount ) - { - /* Wake time has overflowed. Place this item in the - overflow list. */ - vListInsert( ( xList * ) pxOverflowDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); - } - else - { - /* The wake time has not overflowed, so we can use the - current block list. */ - vListInsert( ( xList * ) pxDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); - } - } - } - xAlreadyYielded = xTaskResumeAll(); - - /* Force a reschedule if xTaskResumeAll has not already done so, we may - have put ourselves to sleep. */ - if( !xAlreadyYielded ) - { - taskYIELD(); - } - } - -#endif -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskDelay == 1 ) - - void vTaskDelay( portTickType xTicksToDelay ) - { - portTickType xTimeToWake; - signed portBASE_TYPE xAlreadyYielded = pdFALSE; - - /* A delay time of zero just forces a reschedule. */ - if( xTicksToDelay > ( portTickType ) 0 ) - { - vTaskSuspendAll(); - { - /* A task that is removed from the event list while the - scheduler is suspended will not get placed in the ready - list or removed from the blocked list until the scheduler - is resumed. - - This task cannot be in an event list as it is the currently - executing task. */ - - /* Calculate the time to wake - this may overflow but this is - not a problem. */ - xTimeToWake = xTickCount + xTicksToDelay; - - /* We must remove ourselves from the ready list before adding - ourselves to the blocked list as the same list item is used for - both lists. */ - vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); - - /* The list item will be inserted in wake time order. */ - listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake ); - - if( xTimeToWake < xTickCount ) - { - /* Wake time has overflowed. Place this item in the - overflow list. */ - vListInsert( ( xList * ) pxOverflowDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); - } - else - { - /* The wake time has not overflowed, so we can use the - current block list. */ - vListInsert( ( xList * ) pxDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); - } - } - xAlreadyYielded = xTaskResumeAll(); - } - - /* Force a reschedule if xTaskResumeAll has not already done so, we may - have put ourselves to sleep. */ - if( !xAlreadyYielded ) - { - taskYIELD(); - } - } - -#endif -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_uxTaskPriorityGet == 1 ) - - unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask ) - { - tskTCB *pxTCB; - unsigned portBASE_TYPE uxReturn; - - taskENTER_CRITICAL(); - { - /* If null is passed in here then we are changing the - priority of the calling function. */ - pxTCB = prvGetTCBFromHandle( pxTask ); - uxReturn = pxTCB->uxPriority; - } - taskEXIT_CRITICAL(); - - return uxReturn; - } - -#endif -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskPrioritySet == 1 ) - - void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ) - { - tskTCB *pxTCB; - unsigned portBASE_TYPE uxCurrentPriority, xYieldRequired = pdFALSE; - - /* Ensure the new priority is valid. */ - if( uxNewPriority >= configMAX_PRIORITIES ) - { - uxNewPriority = configMAX_PRIORITIES - 1; - } - - taskENTER_CRITICAL(); - { - /* If null is passed in here then we are changing the - priority of the calling function. */ - pxTCB = prvGetTCBFromHandle( pxTask ); - - #if ( configUSE_MUTEXES == 1 ) - { - uxCurrentPriority = pxTCB->uxBasePriority; - } - #else - { - uxCurrentPriority = pxTCB->uxPriority; - } - #endif - - if( uxCurrentPriority != uxNewPriority ) - { - /* The priority change may have readied a task of higher - priority than the calling task. */ - if( uxNewPriority > uxCurrentPriority ) - { - if( pxTask != NULL ) - { - /* The priority of another task is being raised. If we - were raising the priority of the currently running task - there would be no need to switch as it must have already - been the highest priority task. */ - xYieldRequired = pdTRUE; - } - } - else if( pxTask == NULL ) - { - /* Setting our own priority down means there may now be another - task of higher priority that is ready to execute. */ - xYieldRequired = pdTRUE; - } - - - - #if ( configUSE_MUTEXES == 1 ) - { - /* Only change the priority being used if the task is not - currently using an inherited priority. */ - if( pxTCB->uxBasePriority == pxTCB->uxPriority ) - { - pxTCB->uxPriority = uxNewPriority; - } - - /* The base priority gets set whatever. */ - pxTCB->uxBasePriority = uxNewPriority; - } - #else - { - pxTCB->uxPriority = uxNewPriority; - } - #endif - - listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( configMAX_PRIORITIES - ( portTickType ) uxNewPriority ) ); - - /* If the task is in the blocked or suspended list we need do - nothing more than change it's priority variable. However, if - the task is in a ready list it needs to be removed and placed - in the queue appropriate to its new priority. */ - if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxCurrentPriority ] ), &( pxTCB->xGenericListItem ) ) ) - { - /* The task is currently in its ready list - remove before adding - it to it's new ready list. As we are in a critical section we - can do this even if the scheduler is suspended. */ - vListRemove( &( pxTCB->xGenericListItem ) ); - prvAddTaskToReadyQueue( pxTCB ); - } - - if( xYieldRequired == pdTRUE ) - { - taskYIELD(); - } - } - } - taskEXIT_CRITICAL(); - } - -#endif -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskSuspend == 1 ) - - void vTaskSuspend( xTaskHandle pxTaskToSuspend ) - { - tskTCB *pxTCB; - - taskENTER_CRITICAL(); - { - /* Ensure a yield is performed if the current task is being - suspended. */ - if( pxTaskToSuspend == pxCurrentTCB ) - { - pxTaskToSuspend = NULL; - } - - /* If null is passed in here then we are suspending ourselves. */ - pxTCB = prvGetTCBFromHandle( pxTaskToSuspend ); - - /* Remove task from the ready/delayed list and place in the suspended list. */ - vListRemove( &( pxTCB->xGenericListItem ) ); - - /* Is the task waiting on an event also? */ - if( pxTCB->xEventListItem.pvContainer ) - { - vListRemove( &( pxTCB->xEventListItem ) ); - } - - vListInsertEnd( ( xList * ) &xSuspendedTaskList, &( pxTCB->xGenericListItem ) ); - } - taskEXIT_CRITICAL(); - - /* We may have just suspended the current task. */ - if( ( void * ) pxTaskToSuspend == NULL ) - { - taskYIELD(); - } - } - -#endif -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskSuspend == 1 ) - - static portBASE_TYPE prvIsTaskSuspended( const tskTCB * const pxTCB ) - { - portBASE_TYPE xReturn = pdFALSE; - - /* Is the task we are attempting to resume actually in the - suspended list? */ - if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xGenericListItem ) ) != pdFALSE ) - { - /* Has the task already been resumed from within an ISR? */ - if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) != pdTRUE ) - { - /* Is it in the suspended list because it is in the - Suspended state? It is possible to be in the suspended - list because it is blocked on a task with no timeout - specified. */ - if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) == pdTRUE ) - { - xReturn = pdTRUE; - } - } - } - - return xReturn; - } - -#endif -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskSuspend == 1 ) - - void vTaskResume( xTaskHandle pxTaskToResume ) - { - tskTCB *pxTCB; - - /* Remove the task from whichever list it is currently in, and place - it in the ready list. */ - pxTCB = ( tskTCB * ) pxTaskToResume; - - /* The parameter cannot be NULL as it is impossible to resume the - currently executing task. */ - if( pxTCB != NULL ) - { - taskENTER_CRITICAL(); - { - if( prvIsTaskSuspended( pxTCB ) == pdTRUE ) - { - /* As we are in a critical section we can access the ready - lists even if the scheduler is suspended. */ - vListRemove( &( pxTCB->xGenericListItem ) ); - prvAddTaskToReadyQueue( pxTCB ); - - /* We may have just resumed a higher priority task. */ - if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) - { - /* This yield may not cause the task just resumed to run, but - will leave the lists in the correct state for the next yield. */ - taskYIELD(); - } - } - } - taskEXIT_CRITICAL(); - } - } - -#endif - -/*-----------------------------------------------------------*/ - -#if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) - - portBASE_TYPE xTaskResumeFromISR( xTaskHandle pxTaskToResume ) - { - portBASE_TYPE xYieldRequired = pdFALSE; - tskTCB *pxTCB; - - pxTCB = ( tskTCB * ) pxTaskToResume; - - if( prvIsTaskSuspended( pxTCB ) == pdTRUE ) - { - if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) - { - xYieldRequired = ( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ); - vListRemove( &( pxTCB->xGenericListItem ) ); - prvAddTaskToReadyQueue( pxTCB ); - } - else - { - /* We cannot access the delayed or ready lists, so will hold this - task pending until the scheduler is resumed, at which point a - yield will be performed if necessary. */ - vListInsertEnd( ( xList * ) &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); - } - } - - return xYieldRequired; - } - -#endif - - - - -/*----------------------------------------------------------- - * PUBLIC SCHEDULER CONTROL documented in task.h - *----------------------------------------------------------*/ - - -void vTaskStartScheduler( void ) -{ -portBASE_TYPE xReturn; - - /* Add the idle task at the lowest priority. */ - xReturn = xTaskCreate( prvIdleTask, ( signed portCHAR * ) "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, tskIDLE_PRIORITY, ( xTaskHandle * ) NULL ); - - if( xReturn == pdPASS ) - { - /* Interrupts are turned off here, to ensure a tick does not occur - before or during the call to xPortStartScheduler(). The stacks of - the created tasks contain a status word with interrupts switched on - so interrupts will automatically get re-enabled when the first task - starts to run. - - STEPPING THROUGH HERE USING A DEBUGGER CAN CAUSE BIG PROBLEMS IF THE - DEBUGGER ALLOWS INTERRUPTS TO BE PROCESSED. */ - portDISABLE_INTERRUPTS(); - - xSchedulerRunning = pdTRUE; - xTickCount = ( portTickType ) 0; - - /* Setting up the timer tick is hardware specific and thus in the - portable interface. */ - if( xPortStartScheduler() ) - { - /* Should not reach here as if the scheduler is running the - function will not return. */ - } - else - { - /* Should only reach here if a task calls xTaskEndScheduler(). */ - } - } -} -/*-----------------------------------------------------------*/ - -void vTaskEndScheduler( void ) -{ - /* Stop the scheduler interrupts and call the portable scheduler end - routine so the original ISRs can be restored if necessary. The port - layer must ensure interrupts enable bit is left in the correct state. */ - portDISABLE_INTERRUPTS(); - xSchedulerRunning = pdFALSE; - vPortEndScheduler(); -} -/*----------------------------------------------------------*/ - -void vTaskSuspendAll( void ) -{ - portENTER_CRITICAL(); - ++uxSchedulerSuspended; - portEXIT_CRITICAL(); -} -/*----------------------------------------------------------*/ - -signed portBASE_TYPE xTaskResumeAll( void ) -{ -register tskTCB *pxTCB; -signed portBASE_TYPE xAlreadyYielded = pdFALSE; - - /* It is possible that an ISR caused a task to be removed from an event - list while the scheduler was suspended. If this was the case then the - removed task will have been added to the xPendingReadyList. Once the - scheduler has been resumed it is safe to move all the pending ready - tasks from this list into their appropriate ready list. */ - portENTER_CRITICAL(); - { - --uxSchedulerSuspended; - - if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) - { - if( uxCurrentNumberOfTasks > ( unsigned portBASE_TYPE ) 0 ) - { - portBASE_TYPE xYieldRequired = pdFALSE; - - /* Move any readied tasks from the pending list into the - appropriate ready list. */ - while( ( pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( ( xList * ) &xPendingReadyList ) ) ) != NULL ) - { - vListRemove( &( pxTCB->xEventListItem ) ); - vListRemove( &( pxTCB->xGenericListItem ) ); - prvAddTaskToReadyQueue( pxTCB ); - - /* If we have moved a task that has a priority higher than - the current task then we should yield. */ - if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) - { - xYieldRequired = pdTRUE; - } - } - - /* If any ticks occurred while the scheduler was suspended then - they should be processed now. This ensures the tick count does not - slip, and that any delayed tasks are resumed at the correct time. */ - if( uxMissedTicks > ( unsigned portBASE_TYPE ) 0 ) - { - while( uxMissedTicks > ( unsigned portBASE_TYPE ) 0 ) - { - vTaskIncrementTick(); - --uxMissedTicks; - } - - /* As we have processed some ticks it is appropriate to yield - to ensure the highest priority task that is ready to run is - the task actually running. */ - #if configUSE_PREEMPTION == 1 - { - xYieldRequired = pdTRUE; - } - #endif - } - - if( ( xYieldRequired == pdTRUE ) || ( xMissedYield == pdTRUE ) ) - { - xAlreadyYielded = pdTRUE; - xMissedYield = pdFALSE; - taskYIELD(); - } - } - } - } - portEXIT_CRITICAL(); - - return xAlreadyYielded; -} - - - - - - -/*----------------------------------------------------------- - * PUBLIC TASK UTILITIES documented in task.h - *----------------------------------------------------------*/ - - - -portTickType xTaskGetTickCount( void ) -{ -portTickType xTicks; - - /* Critical section required if running on a 16 bit processor. */ - taskENTER_CRITICAL(); - { - xTicks = xTickCount; - } - taskEXIT_CRITICAL(); - - return xTicks; -} -/*-----------------------------------------------------------*/ - -unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void ) -{ -unsigned portBASE_TYPE uxNumberOfTasks; - - taskENTER_CRITICAL(); - uxNumberOfTasks = uxCurrentNumberOfTasks; - taskEXIT_CRITICAL(); - - return uxNumberOfTasks; -} -/*-----------------------------------------------------------*/ - -#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_vTaskDelete == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) - - void vTaskList( signed portCHAR *pcWriteBuffer ) - { - unsigned portBASE_TYPE uxQueue; - - /* This is a VERY costly function that should be used for debug only. - It leaves interrupts disabled for a LONG time. */ - - vTaskSuspendAll(); - { - /* Run through all the lists that could potentially contain a TCB and - report the task name, state and stack high water mark. */ - - pcWriteBuffer[ 0 ] = ( signed portCHAR ) 0x00; - strcat( ( portCHAR * ) pcWriteBuffer, ( const portCHAR * ) "\r\n" ); - - uxQueue = uxTopUsedPriority + 1; - - do - { - uxQueue--; - - if( !listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxQueue ] ) ) ) - { - prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) &( pxReadyTasksLists[ uxQueue ] ), tskREADY_CHAR ); - } - }while( uxQueue > ( unsigned portSHORT ) tskIDLE_PRIORITY ); - - if( !listLIST_IS_EMPTY( pxDelayedTaskList ) ) - { - prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) pxDelayedTaskList, tskBLOCKED_CHAR ); - } - - if( !listLIST_IS_EMPTY( pxOverflowDelayedTaskList ) ) - { - prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) pxOverflowDelayedTaskList, tskBLOCKED_CHAR ); - } - - if( !listLIST_IS_EMPTY( &xTasksWaitingTermination ) ) - { - prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) &xTasksWaitingTermination, tskDELETED_CHAR ); - } - - if( !listLIST_IS_EMPTY( &xSuspendedTaskList ) ) - { - prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) &xSuspendedTaskList, tskSUSPENDED_CHAR ); - } - } - xTaskResumeAll(); - } - -#endif -/*----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - void vTaskStartTrace( signed portCHAR * pcBuffer, unsigned portLONG ulBufferSize ) - { - portENTER_CRITICAL(); - { - pcTraceBuffer = ( signed portCHAR * )pcBuffer; - pcTraceBufferStart = pcBuffer; - pcTraceBufferEnd = pcBuffer + ( ulBufferSize - tskSIZE_OF_EACH_TRACE_LINE ); - xTracing = pdTRUE; - } - portEXIT_CRITICAL(); - } - -#endif -/*----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - unsigned portLONG ulTaskEndTrace( void ) - { - unsigned portLONG ulBufferLength; - - portENTER_CRITICAL(); - xTracing = pdFALSE; - portEXIT_CRITICAL(); - - ulBufferLength = ( unsigned portLONG ) ( pcTraceBuffer - pcTraceBufferStart ); - - return ulBufferLength; - } - -#endif - - - -/*----------------------------------------------------------- - * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES - * documented in task.h - *----------------------------------------------------------*/ - - -inline void vTaskIncrementTick( void ) -{ - /* Called by the portable layer each time a tick interrupt occurs. - Increments the tick then checks to see if the new tick value will cause any - tasks to be unblocked. */ - if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) - { - ++xTickCount; - if( xTickCount == ( portTickType ) 0 ) - { - xList *pxTemp; - - /* Tick count has overflowed so we need to swap the delay lists. - If there are any items in pxDelayedTaskList here then there is - an error! */ - pxTemp = pxDelayedTaskList; - pxDelayedTaskList = pxOverflowDelayedTaskList; - pxOverflowDelayedTaskList = pxTemp; - xNumOfOverflows++; - } - - /* See if this tick has made a timeout expire. */ - prvCheckDelayedTasks(); - } - else - { - ++uxMissedTicks; - - /* The tick hook gets called at regular intervals, even if the - scheduler is locked. */ - #if ( configUSE_TICK_HOOK == 1 ) - { - extern void vApplicationTickHook( void ); - - vApplicationTickHook(); - } - #endif - } - - #if ( configUSE_TICK_HOOK == 1 ) - { - extern void vApplicationTickHook( void ); - - /* Guard against the tick hook being called when the missed tick - count is being unwound (when the scheduler is being unlocked. */ - if( uxMissedTicks == 0 ) - { - vApplicationTickHook(); - } - } - #endif -} -/*-----------------------------------------------------------*/ - -#if ( ( INCLUDE_vTaskCleanUpResources == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) - - void vTaskCleanUpResources( void ) - { - unsigned portSHORT usQueue; - volatile tskTCB *pxTCB; - - usQueue = ( unsigned portSHORT ) uxTopUsedPriority + ( unsigned portSHORT ) 1; - - /* Remove any TCB's from the ready queues. */ - do - { - usQueue--; - - while( !listLIST_IS_EMPTY( &( pxReadyTasksLists[ usQueue ] ) ) ) - { - listGET_OWNER_OF_NEXT_ENTRY( pxTCB, &( pxReadyTasksLists[ usQueue ] ) ); - vListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ); - - prvDeleteTCB( ( tskTCB * ) pxTCB ); - } - }while( usQueue > ( unsigned portSHORT ) tskIDLE_PRIORITY ); - - /* Remove any TCB's from the delayed queue. */ - while( !listLIST_IS_EMPTY( &xDelayedTaskList1 ) ) - { - listGET_OWNER_OF_NEXT_ENTRY( pxTCB, &xDelayedTaskList1 ); - vListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ); - - prvDeleteTCB( ( tskTCB * ) pxTCB ); - } - - /* Remove any TCB's from the overflow delayed queue. */ - while( !listLIST_IS_EMPTY( &xDelayedTaskList2 ) ) - { - listGET_OWNER_OF_NEXT_ENTRY( pxTCB, &xDelayedTaskList2 ); - vListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ); - - prvDeleteTCB( ( tskTCB * ) pxTCB ); - } - - while( !listLIST_IS_EMPTY( &xSuspendedTaskList ) ) - { - listGET_OWNER_OF_NEXT_ENTRY( pxTCB, &xSuspendedTaskList ); - vListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ); - - prvDeleteTCB( ( tskTCB * ) pxTCB ); - } - } - -#endif -/*-----------------------------------------------------------*/ - -void vTaskSwitchContext( void ) -{ - if( uxSchedulerSuspended != ( unsigned portBASE_TYPE ) pdFALSE ) - { - /* The scheduler is currently suspended - do not allow a context - switch. */ - xMissedYield = pdTRUE; - return; - } - - /* Find the highest priority queue that contains ready tasks. */ - while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopReadyPriority ] ) ) ) - { - --uxTopReadyPriority; - } - - /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the tasks of the - same priority get an equal share of the processor time. */ - listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopReadyPriority ] ) ); - vWriteTraceToBuffer(); -} -/*-----------------------------------------------------------*/ - -void vTaskPlaceOnEventList( const xList * const pxEventList, portTickType xTicksToWait ) -{ -portTickType xTimeToWake; - - /* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE - SCHEDULER SUSPENDED. */ - - /* Place the event list item of the TCB in the appropriate event list. - This is placed in the list in priority order so the highest priority task - is the first to be woken by the event. */ - vListInsert( ( xList * ) pxEventList, ( xListItem * ) &( pxCurrentTCB->xEventListItem ) ); - - /* We must remove ourselves from the ready list before adding ourselves - to the blocked list as the same list item is used for both lists. We have - exclusive access to the ready lists as the scheduler is locked. */ - vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); - - - #if ( INCLUDE_vTaskSuspend == 1 ) - { - if( xTicksToWait == portMAX_DELAY ) - { - /* Add ourselves to the suspended task list instead of a delayed task - list to ensure we are not woken by a timing event. We will block - indefinitely. */ - vListInsertEnd( ( xList * ) &xSuspendedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); - } - else - { - /* Calculate the time at which the task should be woken if the event does - not occur. This may overflow but this doesn't matter. */ - xTimeToWake = xTickCount + xTicksToWait; - - listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake ); - - if( xTimeToWake < xTickCount ) - { - /* Wake time has overflowed. Place this item in the overflow list. */ - vListInsert( ( xList * ) pxOverflowDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); - } - else - { - /* The wake time has not overflowed, so we can use the current block list. */ - vListInsert( ( xList * ) pxDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); - } - } - } - #else - { - /* Calculate the time at which the task should be woken if the event does - not occur. This may overflow but this doesn't matter. */ - xTimeToWake = xTickCount + xTicksToWait; - - listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake ); - - if( xTimeToWake < xTickCount ) - { - /* Wake time has overflowed. Place this item in the overflow list. */ - vListInsert( ( xList * ) pxOverflowDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); - } - else - { - /* The wake time has not overflowed, so we can use the current block list. */ - vListInsert( ( xList * ) pxDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); - } - } - #endif -} -/*-----------------------------------------------------------*/ - -signed portBASE_TYPE xTaskRemoveFromEventList( const xList * const pxEventList ) -{ -tskTCB *pxUnblockedTCB; -portBASE_TYPE xReturn; - - /* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE - SCHEDULER SUSPENDED. It can also be called from within an ISR. */ - - /* The event list is sorted in priority order, so we can remove the - first in the list, remove the TCB from the delayed list, and add - it to the ready list. - - If an event is for a queue that is locked then this function will never - get called - the lock count on the queue will get modified instead. This - means we can always expect exclusive access to the event list here. */ - pxUnblockedTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); - vListRemove( &( pxUnblockedTCB->xEventListItem ) ); - - if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) - { - vListRemove( &( pxUnblockedTCB->xGenericListItem ) ); - prvAddTaskToReadyQueue( pxUnblockedTCB ); - } - else - { - /* We cannot access the delayed or ready lists, so will hold this - task pending until the scheduler is resumed. */ - vListInsertEnd( ( xList * ) &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) ); - } - - if( pxUnblockedTCB->uxPriority >= pxCurrentTCB->uxPriority ) - { - /* Return true if the task removed from the event list has - a higher priority than the calling task. This allows - the calling task to know if it should force a context - switch now. */ - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - - return xReturn; -} -/*-----------------------------------------------------------*/ - -void vTaskSetTimeOutState( xTimeOutType * const pxTimeOut ) -{ - pxTimeOut->xOverflowCount = xNumOfOverflows; - pxTimeOut->xTimeOnEntering = xTickCount; -} -/*-----------------------------------------------------------*/ - -portBASE_TYPE xTaskCheckForTimeOut( xTimeOutType * const pxTimeOut, portTickType * const pxTicksToWait ) -{ -portBASE_TYPE xReturn; - - #if ( INCLUDE_vTaskSuspend == 1 ) - /* If INCLUDE_vTaskSuspend is set to 1 and the block time specified is - the maximum block time then the task should block indefinitely, and - therefore never time out. */ - if( *pxTicksToWait == portMAX_DELAY ) - { - xReturn = pdFALSE; - } - else /* We are not blocking indefinitely, perform the checks below. */ - #endif - - if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xTickCount >= pxTimeOut->xTimeOnEntering ) ) - { - /* The tick count is greater than the time at which vTaskSetTimeout() - was called, but has also overflowed since vTaskSetTimeOut() was called. - It must have wrapped all the way around and gone past us again. This - passed since vTaskSetTimeout() was called. */ - xReturn = pdTRUE; - } - else if( ( xTickCount - pxTimeOut->xTimeOnEntering ) < *pxTicksToWait ) - { - /* Not a genuine timeout. Adjust parameters for time remaining. */ - *pxTicksToWait -= ( xTickCount - pxTimeOut->xTimeOnEntering ); - vTaskSetTimeOutState( pxTimeOut ); - xReturn = pdFALSE; - } - else - { - xReturn = pdTRUE; - } - - return xReturn; -} -/*-----------------------------------------------------------*/ - -void vTaskMissedYield( void ) -{ - xMissedYield = pdTRUE; -} - -/* - * ----------------------------------------------------------- - * The Idle task. - * ---------------------------------------------------------- - * - * The portTASK_FUNCTION() macro is used to allow port/compiler specific - * language extensions. The equivalent prototype for this function is: - * - * void prvIdleTask( void *pvParameters ); - * - */ -static portTASK_FUNCTION( prvIdleTask, pvParameters ) -{ - /* Stop warnings. */ - ( void ) pvParameters; - - for( ;; ) - { - /* See if any tasks have been deleted. */ - prvCheckTasksWaitingTermination(); - - #if ( configUSE_PREEMPTION == 0 ) - { - /* If we are not using preemption we keep forcing a task switch to - see if any other task has become available. If we are using - preemption we don't need to do this as any task becoming available - will automatically get the processor anyway. */ - taskYIELD(); - } - #endif - - #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) - { - /* When using preemption tasks of equal priority will be - timesliced. If a task that is sharing the idle priority is ready - to run then the idle task should yield before the end of the - timeslice. - - A critical region is not required here as we are just reading from - the list, and an occasional incorrect value will not matter. If - the ready list at the idle priority contains more than one task - then a task other than the idle task is ready to execute. */ - if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( unsigned portBASE_TYPE ) 1 ) - { - taskYIELD(); - } - } - #endif - - #if ( configUSE_IDLE_HOOK == 1 ) - { - extern void vApplicationIdleHook( void ); - - /* Call the user defined function from within the idle task. This - allows the application designer to add background functionality - without the overhead of a separate task. - NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, - CALL A FUNCTION THAT MIGHT BLOCK. */ - vApplicationIdleHook(); - } - #endif - } -} /*lint !e715 pvParameters is not accessed but all task functions require the same prototype. */ - - - - - - - -/*----------------------------------------------------------- - * File private functions documented at the top of the file. - *----------------------------------------------------------*/ - - - -static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed portCHAR * const pcName, unsigned portBASE_TYPE uxPriority ) -{ - /* Store the function name in the TCB. */ - strncpy( ( char * ) pxTCB->pcTaskName, ( const char * ) pcName, ( unsigned portSHORT ) configMAX_TASK_NAME_LEN ); - pxTCB->pcTaskName[ ( unsigned portSHORT ) configMAX_TASK_NAME_LEN - ( unsigned portSHORT ) 1 ] = '\0'; - - /* This is used as an array index so must ensure it's not too large. */ - if( uxPriority >= configMAX_PRIORITIES ) - { - uxPriority = configMAX_PRIORITIES - 1; - } - - pxTCB->uxPriority = uxPriority; - #if ( configUSE_MUTEXES == 1 ) - { - pxTCB->uxBasePriority = uxPriority; - } - #endif - - vListInitialiseItem( &( pxTCB->xGenericListItem ) ); - vListInitialiseItem( &( pxTCB->xEventListItem ) ); - - /* Set the pxTCB as a link back from the xListItem. This is so we can get - back to the containing TCB from a generic item in a list. */ - listSET_LIST_ITEM_OWNER( &( pxTCB->xGenericListItem ), pxTCB ); - - /* Event lists are always in priority order. */ - listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) uxPriority ); - listSET_LIST_ITEM_OWNER( &( pxTCB->xEventListItem ), pxTCB ); -} -/*-----------------------------------------------------------*/ - -static void prvInitialiseTaskLists( void ) -{ -unsigned portBASE_TYPE uxPriority; - - for( uxPriority = 0; uxPriority < configMAX_PRIORITIES; uxPriority++ ) - { - vListInitialise( ( xList * ) &( pxReadyTasksLists[ uxPriority ] ) ); - } - - vListInitialise( ( xList * ) &xDelayedTaskList1 ); - vListInitialise( ( xList * ) &xDelayedTaskList2 ); - vListInitialise( ( xList * ) &xPendingReadyList ); - - #if ( INCLUDE_vTaskDelete == 1 ) - { - vListInitialise( ( xList * ) &xTasksWaitingTermination ); - } - #endif - - #if ( INCLUDE_vTaskSuspend == 1 ) - { - vListInitialise( ( xList * ) &xSuspendedTaskList ); - } - #endif - - /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList - using list2. */ - pxDelayedTaskList = &xDelayedTaskList1; - pxOverflowDelayedTaskList = &xDelayedTaskList2; -} -/*-----------------------------------------------------------*/ - -static void prvCheckTasksWaitingTermination( void ) -{ - #if ( INCLUDE_vTaskDelete == 1 ) - { - portBASE_TYPE xListIsEmpty; - - /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called - too often in the idle task. */ - if( uxTasksDeleted > ( unsigned portBASE_TYPE ) 0 ) - { - vTaskSuspendAll(); - xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination ); - xTaskResumeAll(); - - if( !xListIsEmpty ) - { - tskTCB *pxTCB; - - portENTER_CRITICAL(); - { - pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( ( xList * ) &xTasksWaitingTermination ) ); - vListRemove( &( pxTCB->xGenericListItem ) ); - --uxCurrentNumberOfTasks; - --uxTasksDeleted; - } - portEXIT_CRITICAL(); - - prvDeleteTCB( pxTCB ); - } - } - } - #endif -} -/*-----------------------------------------------------------*/ - -static tskTCB *prvAllocateTCBAndStack( unsigned portSHORT usStackDepth ) -{ -tskTCB *pxNewTCB; - - /* Allocate space for the TCB. Where the memory comes from depends on - the implementation of the port malloc function. */ - pxNewTCB = ( tskTCB * ) pvPortMalloc( sizeof( tskTCB ) ); - - if( pxNewTCB != NULL ) - { - /* Allocate space for the stack used by the task being created. - The base of the stack memory stored in the TCB so the task can - be deleted later if required. */ - pxNewTCB->pxStack = ( portSTACK_TYPE * ) pvPortMalloc( ( ( size_t )usStackDepth ) * sizeof( portSTACK_TYPE ) ); - - if( pxNewTCB->pxStack == NULL ) - { - /* Could not allocate the stack. Delete the allocated TCB. */ - vPortFree( pxNewTCB ); - pxNewTCB = NULL; - } - else - { - /* Just to help debugging. */ - memset( pxNewTCB->pxStack, tskSTACK_FILL_BYTE, usStackDepth * sizeof( portSTACK_TYPE ) ); - } - } - - return pxNewTCB; -} -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - static void prvListTaskWithinSingleList( const signed portCHAR *pcWriteBuffer, xList *pxList, signed portCHAR cStatus ) - { - volatile tskTCB *pxNextTCB, *pxFirstTCB; - static portCHAR pcStatusString[ 50 ]; - unsigned portSHORT usStackRemaining; - - /* Write the details of all the TCB's in pxList into the buffer. */ - listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); - do - { - listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); - usStackRemaining = usTaskCheckFreeStackSpace( ( unsigned portCHAR * ) pxNextTCB->pxStack ); - sprintf( pcStatusString, ( portCHAR * ) "%s\t\t%c\t%u\t%u\t%u\r\n", pxNextTCB->pcTaskName, cStatus, ( unsigned int ) pxNextTCB->uxPriority, usStackRemaining, ( unsigned int ) pxNextTCB->uxTCBNumber ); - strcat( ( portCHAR * ) pcWriteBuffer, ( portCHAR * ) pcStatusString ); - - } while( pxNextTCB != pxFirstTCB ); - } - -#endif -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - unsigned portSHORT usTaskCheckFreeStackSpace( const unsigned portCHAR * pucStackByte ) - { - register unsigned portSHORT usCount = 0; - - while( *pucStackByte == tskSTACK_FILL_BYTE ) - { - pucStackByte -= portSTACK_GROWTH; - usCount++; - } - - usCount /= sizeof( portSTACK_TYPE ); - - return usCount; - } -#endif -/*-----------------------------------------------------------*/ - - - -#if ( ( INCLUDE_vTaskDelete == 1 ) || ( INCLUDE_vTaskCleanUpResources == 1 ) ) - - static void prvDeleteTCB( tskTCB *pxTCB ) - { - /* Free up the memory allocated by the scheduler for the task. It is up to - the task to free any memory allocated at the application level. */ - vPortFree( pxTCB->pxStack ); - vPortFree( pxTCB ); - } - -#endif - - -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) - - xTaskHandle xTaskGetCurrentTaskHandle( void ) - { - xTaskHandle xReturn; - - portENTER_CRITICAL(); - { - xReturn = ( xTaskHandle ) pxCurrentTCB; - } - portEXIT_CRITICAL(); - - return xReturn; - } - -#endif - -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_xTaskGetSchedulerState == 1 ) - - portBASE_TYPE xTaskGetSchedulerState( void ) - { - portBASE_TYPE xReturn; - - if( xSchedulerRunning == pdFALSE ) - { - xReturn = taskSCHEDULER_NOT_STARTED; - } - else - { - if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) - { - xReturn = taskSCHEDULER_RUNNING; - } - else - { - xReturn = taskSCHEDULER_SUSPENDED; - } - } - - return xReturn; - } - -#endif - -#if ( configUSE_MUTEXES == 1 ) - - void vTaskPriorityInherit( xTaskHandle * const pxMutexHolder ) - { - tskTCB * const pxTCB = ( tskTCB * ) pxMutexHolder; - - if( pxTCB->uxPriority < pxCurrentTCB->uxPriority ) - { - /* Adjust the mutex holder state to account for its new priority. */ - listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) pxCurrentTCB->uxPriority ); - - /* If the task being modified is in the ready state it will need to - be moved in to a new list. */ - if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xGenericListItem ) ) ) - { - vListRemove( &( pxTCB->xGenericListItem ) ); - - /* Inherit the priority before being moved into the new list. */ - pxTCB->uxPriority = pxCurrentTCB->uxPriority; - prvAddTaskToReadyQueue( pxTCB ); - } - else - { - /* Just inherit the priority. */ - pxTCB->uxPriority = pxCurrentTCB->uxPriority; - } - } - } - -#endif - -#if ( configUSE_MUTEXES == 1 ) - - void vTaskPriorityDisinherit( xTaskHandle * const pxMutexHolder ) - { - tskTCB * const pxTCB = ( tskTCB * ) pxMutexHolder; - - if( pxMutexHolder != NULL ) - { - if( pxTCB->uxPriority != pxTCB->uxBasePriority ) - { - /* We must be the running task to be able to give the mutex back. - Remove ourselves from the ready list we currently appear in. */ - vListRemove( &( pxTCB->xGenericListItem ) ); - - /* Disinherit the priority before adding ourselves into the new - ready list. */ - pxTCB->uxPriority = pxTCB->uxBasePriority; - listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) pxTCB->uxPriority ); - prvAddTaskToReadyQueue( pxTCB ); - } - } - } - -#endif - - - - - diff --git a/Makefile b/Makefile index 2d510f5..82eb159 100644 --- a/Makefile +++ b/Makefile @@ -12,8 +12,9 @@ export CCGLD=-T p30f4012.gld export OSROOT=/usr/src/FreeRTOS/Source export OSFILES=$(OSROOT)/list.c $(OSROOT)/queue.c $(OSROOT)/tasks.c \ $(OSROOT)/croutine.c $(OSROOT)/portable/MPLAB/PIC24_dsPIC/port.c \ + $(OSROOT)/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S \ $(OSROOT)/portable/MemMang/heap_1.c -export OSOBJS=list.o queue.o tasks.o croutine.o port.o heap_1.o +export OSOBJS=list.o queue.o tasks.o croutine.o port.o portasm_dsPIC.o heap_1.o export OSINCDIR=-I$(OSROOT)/include -I$(OSROOT)/portable/MPLAB/PIC24_ds_PIC export OSFLAGS=-DMPLAB_DSPIC_PORT -DTCKPS0=TCKPS -DTCKPS1=TSYNC diff --git a/TODO b/TODO deleted file mode 100644 index f9f5558..0000000 --- a/TODO +++ /dev/null @@ -1 +0,0 @@ -Update freeRTOS. diff --git a/c~ b/c~ new file mode 100644 index 0000000..83eb549 --- /dev/null +++ b/c~ @@ -0,0 +1,286 @@ +2012.04.20 Started aic-2.3.0. + Reworked source tree. + Capacitor involucre sizes made invisible in schematics. + Created a workaround to fix a incompatibility between + pic30-gcc 3.01 and FreeRTOS. See the hack 1 in the Hacks + file. + +2009.02.09 Started aic-2.2.0. + aic-2.2.* uses the irs21094 MOSFET driver. + +2008.08.26 Started aic-2.1.0. + aic-2.1.* uses the LT1162 MOSFET driver. + +2006.06.11 Started aic-2.0.0. + aic-2.*.* uses the dsPIC30F4012 processor. + aic-2.0.* uses the MAX5062 MOSFET driver. + +2006.06.11 Inicio do projeto aic-2.0.0 + +2008.02.15 Incluido destrutor virtual na classe AIC_COMM. + + Alterada a implementacao da serializacao de valores double + em AIC_UDP::send_command(). + + Corrigido bug no processamento dos argumentos dos comandos + AIC_USER0, AIC_USER1, AIC_USER2 e AIC_USER3. + + Incluido o diretorio /usr/src/linux/include, na variavel de + ambiente CINCLUDE. + +2007.12.05 Criada a classe Sputtering na biblioteca, para suportar a + aplicacao de controle do sputtering. + +2007.11.28 Criadas constantes com os bits de flags do pacote de status + da AIC. + + Processamento de comandos enviados para a AIC alterado para + suportar comandos definidos pelo usuario. + +2007.11.27 Modificado o arquivo lib/aicio/pwm.a51 para nao utilizar o + acelerador matematico, que estava gerando problemas de + reentrancia. + + Alterado o arquivo doc/Makefile para utilizar os nomes dos + arquivos de layout gerados pela nova versao (20060321) do + PCB. + + Criados os programas SputPIDweb, SputPIDDaemon e sputtering. + + Renomeado o programa SputDaemon para SputWeb. + + Criada a versao 1.6.1 + + +2006.02.24 Incluidos os esquematicos e o layout do PCB no arquivo de + documentacao em pdf. + +2006.01.19 Criado o programa DoorWeb. + +2006.01.11 Criado o target upload nos Makefiles, para fazer o upload + dos programas nas AICs. + +2006.01.09 Criado o programa DoorOpen. + +2005.12.15 Removido o arquivo lib/aicio/motor.a51. As variaveis globais + estao agora definidas em lib/aicio/motor.c. + + +2005.12.14 Corrigido o problema na funcao pwm_set_duty(), que nao + funcionava em tempo real. Os registradores do banco 1 nao + podem ser utilizados em rotinas de interrupcao. + + Corrigido um bug na rotina native_initialize do PWM. Estava + sendo dado um push de um registrador do banco 1, quando + deveria ser do banco 0. + + Criado o identificador de comando MOTOR_REF, para enviar + para a AIC a referencia para o PID implementadod pelo + programa PIDDaemon. + + +2005.11.25 Alterado o "dominio" do pacote AIC para br.ufrgs.ece. + + Criada a versao 1.6.0 + + +2005.10.19 Criado o programa CmdDaemon, semelhante ao IODaemon, mas + apenas recebe comandos, sem enviar dados de sensores. + +2005.09.25 Reestruturados os Makefiles. Agora os Makefiles nos + diretorios utilizam as variaveis definidas no Makefile no + diretorio principal, ao inves de redefini-las. As + redefinicoes sao feitas apenas nas (poucas) vezes em que sao + necessarias. + + Criada a versao 1.5.1 + + Removidas as declaracoes de variaveis globais em arquivos em + Assembly e criada uma funcao dummy para defini-las nos + arquivos C, ja' que nao e' possivel emitir Assembly in-line + fora de funcoes. + +2005.09.02 Criado o programa EncoderRtRead para teste do encoder em + tempo real utilizando as funcoes de ponto flutuante, ou + seja, obtendo a leitura em radianos. + +2005.08.31 Incluido suporte para ponto-flutuante. Implementadas em C as + funcoes de interface que utilizam ponto flutuante. + + Criados os programas EncoderRtTest para teste do encoder em + tempo real. + + Criado o programa MotorRtTest para teste do motor em tempo + real, utilizando as funcoes de ponto flutante. + +2005.08.30 Criado o programa PwmRtTest, para teste do PWM em tempo real + em C. + + Incluidas no aicio.h consantes com a frequencia de + referencia, frequencia de chaveamento, delay de turn-off e + contagens maximas e minimas do PWM. + +2005.08.13 Programas de tempo real modificados para utilizar a API do + RTAI (Real Time Application Interface) para a TINI, ao inves + de implementar diretamente todo o tratamento de tempo real. + + Criada versao 1.5.0 + +2005.08.12 Criado o programa DoorDaemon, para implementar a abertura de + uma porta conectada no sinal de freio da AIC atraves da + Internet, utilizando um protocolo CHAP com sha-1. + +2005.06.03 Criada versao 1.4.2 + + Criada a biblioteca aicio.mpp.lib, com funcoes implementadas + que podem ser chamadas a partir de modulos de tempo real em + C para acessar o hardware da AIC. Codigos fontes dos metodos + nativos que acessam o hardware modificados para usarem a + biblioteca aicio.mpp.lib. + + Criado o programa PID, que implementa em tempo real o + prototipo de um controlador PID, com transferencia de + referencias e variaveis de saida entre a interface com o + usuario e o modulo de tempo real. + + Criados os programas BrakeRtTest e IndexRtTest para de teste + do freio e do indice em tempo real em C. + +2005.01.06 Criada versao 1.4.1 + +2004.12.05 Corrigido bug nas inicializacao das classes AIC_CAN e + AIC_HOST_CAN que violava o padrao ISO C++ e impedia estas + classes de serem compiladas com o g++ 3.4.3. + +2004.11.29 Criada versao 1.4.0 + +2004.09.28 Alterados os nomes das classes utilizadas para sinalizar + excecoes. Foram removidos os prefixos que podem ser + deduzidos a partir da hierarquia de classes. + + Corrigido o log dos comandos no IODaemon no modo debug. + Agora e' logado o codigo do comando em decimal. + + Corrigido bug na classe HostCAN, que fazia com que a + filtragem das mensagens nao funcionasse. O centro de + mensagens 15 foi desabilitado. A recepcao de mensagens + passou a funcionar no modo WriteOver. + + Corrigido bug nos metodos Encoder::read() e + Encoder::readAndClear(). O calculo da conversao de numero de + pulsos para radianos estava errado. + + Removido o flag canWANT_EXCLUSIVE dos construtores das + classes AIC_CAN e AIC_HOST_CAN. Com isto pode-se + compartilhar a placa PCICAN entre aplicacoes. + + Criado buffer de mensagens estatico nas classes AIC_CAN e + AIC_HOST_CAN para armazenar as mensagens destinada as outras + instancias da classe. + +2004.06.28 Criada documentacao on-line para a biblioteca em C++ e em + Java utilizando o Doxygen. + + Eliminada a documentacao utilizando o javadoc. + +2004.06.18 Ajustados os Makefiles para criar os arquivos .runinfo + utilizados pelo RTAI-3.x. + + Removido o periodo do programa pid. Agora o controlador + executa com ciclo livre, temporizado pelo processo de + amostragem. + + Criado um destructor virtual para a classe AIC. A falta + deste destructor causava erro de segmentacao quando da + destruicao do objeto. + + Alterados programas em C++ para permitirem a passagem na + linha de comando do numero da porta de status a ser + utilizada (porta de comando no caso do aicd). + +2004.05.26 Criados os programas BrakeApply e BrakeRelease. + +2004.05.18 Criada a macro RESTORE_STRETCH, utilizada nas biblotecas + nativas para retornar o strech ao valor original. + + Criadas versoes das macros SET_STRETCH e RESTORE_STRETCH que + nao geram codigo. Atraves de compilacao condicional as + versoes que nao geram codigo sao utilizadas quando o valor + de strech e' negativo. Esta caracteristica e' utilizada para + utilizar o valor de stretch default da TINI. + + Alterados o esquematico e o layout do PCB para utilizar + 6N137 ao inves de 6N136. + + Alterados os Makefiles dos programas que necessitam do + suporte do RTAI para funcionarem com o RTAI-3.x. + +2004.03.24 Alterados programas de teste e aplicativos em Java para + eliminar excessoes de endereco invalido, que nao sao mais + geradas pela classe AIC. + + Metodos das classes Brake, Index, Encoder e PWM + implementados em Assembly como metodos nativos. + + Criada versao 1.3.0. + +2004.03.08 Consolidadas as constantes definindo enderecos dos + dispositivos na AIC na classe PLD. Consolidadas as + constantes definindo bits do registrador de controle na + classe CtrlRegister. + +2004.01.11 Passou a ser utilizado o header iostream ao inves de + iostream.h, conforme o novo padrao de C++. Esta adaptacao + foi necessaria para compilacao com o GCC 3.3.2. + +2003.12.31 Alterados os codigos identificadores de comandos e status, + por estarem relacionados com a prioridade das mensgens no + barramento CAN. Os novos codigos conferem uma prioridade + mais adequada aos diversos tipos de mensagens. Alterada a + documentacao para refletir as mudancas nos protocolos. + + Programas em C++ alterados para utilizar comunicacao CAN por + default. A comunicacao por UDP e' suportada atraves de opcao + na linha de comando. + +2003.12.30 Alterado o protocolo de aplicacao de ASCII para binario, com + alteracao no prototipo das funcoes de baixo nivel para + transmissao e recepcao de comandos e status. + + Criada versao 1.2.0. + +2003.12.28 Documentados os protocolos de aplicacao e classes das + bibliotecas. + +2003.12.23 IODaemon alterado para utilizar comunicacao CAN por default. + A comunicacao por UDP e' suportada atraves de opcao na linha + de comando. + +2003.12.22 Criada documentacao das classes em AIC.jar no formado + javadoc. Alterado o Makefile para criar documentacao em + doc/javadocs. + +2003.12.21 Programas em C++ alterados para utilizarem comunicacao por + CAN por default e por UDP quando compilados com USE_UDP + definido. Makefiles alterados para compilar duas versoes dos + programas. + +2003.12.18 Alteradas as classes utilizadas para representar excessoes. + + Criada uma hierarquia mais detalhada. + +2003.12.17 Alteracao na classe AIC_HOST, que tornou-se virtual. + + Criadas classes AIC_HOST_UDP e AIC_HOST_CAN, derivadas de + AIC_HOST. + +2003.12.16 Alteracao da classe AIC, que tornou-se virtual. + + Criadas classes AIC_UDP e AIC_CAN, derivadas de AIC. + +2003.12.15 Alteracao na classe Host, que tornou-se abstrata. + + Criadas classes HostUDP e HostCAN, derivadas de Host. + +2002.xx.xx Started aic-1.0.0. + aic-1.0.0 uses the TINI DS390 processor. \ No newline at end of file diff --git a/doc/aic-0.5080.drill.gcode b/doc/aic-0.5080.drill.gcode new file mode 100644 index 0000000..91bbf85 --- /dev/null +++ b/doc/aic-0.5080.drill.gcode @@ -0,0 +1,83 @@ +(Created by G-code exporter) +(Wed Jul 15 16:09:51 2015) +(Units: mm) +(Board size: 180.34 x 104.14 mm) +(Drill file: 70 drills) +(Drill diameter: 0.508000 mm) +#100=2.000000 (safe Z) +#104=-2.000000 (drill depth) +(---------------------------------) +G17 G21 G90 G64 P0.003 M3 S3000 M7 F50.000000 +G0 Z#100 +G81 X38.735000 Y60.325000 Z#104 R#100 +G81 X36.830000 Y63.500000 Z#104 R#100 +G81 X41.910000 Y67.310000 Z#104 R#100 +G81 X51.435000 Y68.580000 Z#104 R#100 +G81 X51.435000 Y74.930000 Z#104 R#100 +G81 X58.420000 Y76.200000 Z#104 R#100 +G81 X59.055000 Y74.930000 Z#104 R#100 +G81 X59.055000 Y77.470000 Z#104 R#100 +G81 X67.945000 Y74.930000 Z#104 R#100 +G81 X72.390000 Y74.930000 Z#104 R#100 +G81 X79.375000 Y67.945000 Z#104 R#100 +G81 X85.725000 Y66.040000 Z#104 R#100 +G81 X87.630000 Y64.770000 Z#104 R#100 +G81 X88.900000 Y66.040000 Z#104 R#100 +G81 X92.710000 Y67.945000 Z#104 R#100 +G81 X91.440000 Y73.025000 Z#104 R#100 +G81 X90.805000 Y74.295000 Z#104 R#100 +G81 X84.455000 Y75.565000 Z#104 R#100 +G81 X86.995000 Y80.645000 Z#104 R#100 +G81 X84.455000 Y83.185000 Z#104 R#100 +G81 X74.295000 Y93.980000 Z#104 R#100 +G81 X69.850000 Y92.710000 Z#104 R#100 +G81 X67.945000 Y87.630000 Z#104 R#100 +G81 X63.500000 Y86.360000 Z#104 R#100 +G81 X59.055000 Y98.425000 Z#104 R#100 +G81 X67.945000 Y99.695000 Z#104 R#100 +G81 X71.755000 Y99.695000 Z#104 R#100 +G81 X74.295000 Y101.600000 Z#104 R#100 +G81 X78.105000 Y99.695000 Z#104 R#100 +G81 X95.250000 Y94.615000 Z#104 R#100 +G81 X101.600000 Y80.645000 Z#104 R#100 +G81 X107.950000 Y76.835000 Z#104 R#100 +G81 X105.410000 Y69.850000 Z#104 R#100 +G81 X102.870000 Y68.580000 Z#104 R#100 +G81 X100.330000 Y67.945000 Z#104 R#100 +G81 X100.330000 Y69.850000 Z#104 R#100 +G81 X97.790000 Y63.500000 Z#104 R#100 +G81 X95.885000 Y59.690000 Z#104 R#100 +G81 X90.805000 Y60.960000 Z#104 R#100 +G81 X88.900000 Y46.355000 Z#104 R#100 +G81 X100.330000 Y33.020000 Z#104 R#100 +G81 X108.585000 Y41.910000 Z#104 R#100 +G81 X123.190000 Y56.515000 Z#104 R#100 +G81 X123.190000 Y60.960000 Z#104 R#100 +G81 X129.540000 Y66.040000 Z#104 R#100 +G81 X129.540000 Y73.025000 Z#104 R#100 +G81 X139.700000 Y56.515000 Z#104 R#100 +G81 X154.305000 Y71.120000 Z#104 R#100 +G81 X156.845000 Y68.580000 Z#104 R#100 +G81 X158.115000 Y69.850000 Z#104 R#100 +G81 X154.305000 Y75.565000 Z#104 R#100 +G81 X127.000000 Y93.980000 Z#104 R#100 +G81 X117.475000 Y99.695000 Z#104 R#100 +G81 X57.785000 Y66.040000 Z#104 R#100 +G81 X55.245000 Y59.690000 Z#104 R#100 +G81 X45.085000 Y81.915000 Z#104 R#100 +G81 X46.355000 Y82.550000 Z#104 R#100 +G81 X45.085000 Y89.535000 Z#104 R#100 +G81 X41.275000 Y90.805000 Z#104 R#100 +G81 X37.465000 Y88.265000 Z#104 R#100 +G81 X24.765000 Y81.915000 Z#104 R#100 +G81 X29.845000 Y74.930000 Z#104 R#100 +G81 X87.630000 Y23.495000 Z#104 R#100 +G81 X123.190000 Y10.795000 Z#104 R#100 +G81 X125.730000 Y12.065000 Z#104 R#100 +G81 X128.270000 Y13.335000 Z#104 R#100 +G81 X138.430000 Y13.335000 Z#104 R#100 +G81 X139.700000 Y12.065000 Z#104 R#100 +G81 X140.970000 Y10.795000 Z#104 R#100 +G81 X140.970000 Y34.290000 Z#104 R#100 +M5 M9 M2 +(end, total distance 711.14mm = 28.00in) diff --git a/doc/aic-0.7112.drill.gcode b/doc/aic-0.7112.drill.gcode new file mode 100644 index 0000000..e1d2fdf --- /dev/null +++ b/doc/aic-0.7112.drill.gcode @@ -0,0 +1,149 @@ +(Created by G-code exporter) +(Wed Jul 15 16:09:51 2015) +(Units: mm) +(Board size: 180.34 x 104.14 mm) +(Drill file: 136 drills) +(Drill diameter: 0.711200 mm) +#100=2.000000 (safe Z) +#104=-2.000000 (drill depth) +(---------------------------------) +G17 G21 G90 G64 P0.003 M3 S3000 M7 F50.000000 +G0 Z#100 +G81 X29.845000 Y7.620000 Z#104 R#100 +G81 X34.290000 Y7.620000 Z#104 R#100 +G81 X34.290000 Y12.700000 Z#104 R#100 +G81 X29.845000 Y12.700000 Z#104 R#100 +G81 X40.005000 Y12.700000 Z#104 R#100 +G81 X40.005000 Y7.620000 Z#104 R#100 +G81 X40.005000 Y71.120000 Z#104 R#100 +G81 X37.465000 Y71.120000 Z#104 R#100 +G81 X34.925000 Y71.120000 Z#104 R#100 +G81 X32.385000 Y71.120000 Z#104 R#100 +G81 X29.845000 Y71.120000 Z#104 R#100 +G81 X27.305000 Y71.120000 Z#104 R#100 +G81 X24.765000 Y71.120000 Z#104 R#100 +G81 X24.765000 Y78.740000 Z#104 R#100 +G81 X27.305000 Y78.740000 Z#104 R#100 +G81 X29.845000 Y78.740000 Z#104 R#100 +G81 X32.385000 Y78.740000 Z#104 R#100 +G81 X34.925000 Y78.740000 Z#104 R#100 +G81 X37.465000 Y78.740000 Z#104 R#100 +G81 X40.005000 Y78.740000 Z#104 R#100 +G81 X42.545000 Y78.740000 Z#104 R#100 +G81 X45.085000 Y78.740000 Z#104 R#100 +G81 X47.625000 Y78.740000 Z#104 R#100 +G81 X50.165000 Y78.740000 Z#104 R#100 +G81 X52.705000 Y78.740000 Z#104 R#100 +G81 X55.245000 Y78.740000 Z#104 R#100 +G81 X57.785000 Y78.740000 Z#104 R#100 +G81 X63.500000 Y77.470000 Z#104 R#100 +G81 X63.500000 Y72.390000 Z#104 R#100 +G81 X57.785000 Y71.120000 Z#104 R#100 +G81 X55.245000 Y71.120000 Z#104 R#100 +G81 X52.705000 Y71.120000 Z#104 R#100 +G81 X50.165000 Y71.120000 Z#104 R#100 +G81 X47.625000 Y71.120000 Z#104 R#100 +G81 X45.085000 Y71.120000 Z#104 R#100 +G81 X42.545000 Y71.120000 Z#104 R#100 +G81 X50.165000 Y85.090000 Z#104 R#100 +G81 X52.705000 Y85.090000 Z#104 R#100 +G81 X55.245000 Y85.090000 Z#104 R#100 +G81 X57.785000 Y85.090000 Z#104 R#100 +G81 X57.785000 Y92.710000 Z#104 R#100 +G81 X55.245000 Y92.710000 Z#104 R#100 +G81 X52.705000 Y92.710000 Z#104 R#100 +G81 X50.165000 Y92.710000 Z#104 R#100 +G81 X51.435000 Y96.520000 Z#104 R#100 +G81 X56.515000 Y96.520000 Z#104 R#100 +G81 X78.105000 Y92.710000 Z#104 R#100 +G81 X80.645000 Y92.710000 Z#104 R#100 +G81 X83.185000 Y92.710000 Z#104 R#100 +G81 X85.725000 Y92.710000 Z#104 R#100 +G81 X84.455000 Y96.520000 Z#104 R#100 +G81 X79.375000 Y96.520000 Z#104 R#100 +G81 X80.645000 Y85.090000 Z#104 R#100 +G81 X78.105000 Y85.090000 Z#104 R#100 +G81 X83.185000 Y85.090000 Z#104 R#100 +G81 X85.725000 Y85.090000 Z#104 R#100 +G81 X85.725000 Y78.740000 Z#104 R#100 +G81 X83.185000 Y78.740000 Z#104 R#100 +G81 X80.645000 Y78.740000 Z#104 R#100 +G81 X78.105000 Y78.740000 Z#104 R#100 +G81 X78.105000 Y71.120000 Z#104 R#100 +G81 X80.645000 Y71.120000 Z#104 R#100 +G81 X83.185000 Y71.120000 Z#104 R#100 +G81 X85.725000 Y71.120000 Z#104 R#100 +G81 X91.440000 Y71.120000 Z#104 R#100 +G81 X93.980000 Y71.120000 Z#104 R#100 +G81 X96.520000 Y71.120000 Z#104 R#100 +G81 X99.060000 Y71.120000 Z#104 R#100 +G81 X101.600000 Y71.120000 Z#104 R#100 +G81 X104.140000 Y71.120000 Z#104 R#100 +G81 X106.680000 Y71.120000 Z#104 R#100 +G81 X109.220000 Y71.120000 Z#104 R#100 +G81 X115.570000 Y71.120000 Z#104 R#100 +G81 X118.110000 Y71.120000 Z#104 R#100 +G81 X120.650000 Y71.120000 Z#104 R#100 +G81 X123.190000 Y71.120000 Z#104 R#100 +G81 X125.730000 Y71.120000 Z#104 R#100 +G81 X128.270000 Y71.120000 Z#104 R#100 +G81 X130.810000 Y71.120000 Z#104 R#100 +G81 X135.255000 Y72.390000 Z#104 R#100 +G81 X135.255000 Y77.470000 Z#104 R#100 +G81 X130.810000 Y78.740000 Z#104 R#100 +G81 X128.270000 Y78.740000 Z#104 R#100 +G81 X125.730000 Y78.740000 Z#104 R#100 +G81 X123.190000 Y78.740000 Z#104 R#100 +G81 X120.650000 Y78.740000 Z#104 R#100 +G81 X118.110000 Y78.740000 Z#104 R#100 +G81 X115.570000 Y78.740000 Z#104 R#100 +G81 X115.570000 Y85.090000 Z#104 R#100 +G81 X118.110000 Y85.090000 Z#104 R#100 +G81 X120.650000 Y85.090000 Z#104 R#100 +G81 X123.190000 Y85.090000 Z#104 R#100 +G81 X123.190000 Y92.710000 Z#104 R#100 +G81 X120.650000 Y92.710000 Z#104 R#100 +G81 X118.110000 Y92.710000 Z#104 R#100 +G81 X115.570000 Y92.710000 Z#104 R#100 +G81 X116.840000 Y96.520000 Z#104 R#100 +G81 X121.920000 Y96.520000 Z#104 R#100 +G81 X130.175000 Y96.520000 Z#104 R#100 +G81 X135.255000 Y96.520000 Z#104 R#100 +G81 X135.255000 Y90.805000 Z#104 R#100 +G81 X130.175000 Y90.805000 Z#104 R#100 +G81 X109.220000 Y78.740000 Z#104 R#100 +G81 X106.680000 Y78.740000 Z#104 R#100 +G81 X104.140000 Y78.740000 Z#104 R#100 +G81 X101.600000 Y78.740000 Z#104 R#100 +G81 X99.060000 Y78.740000 Z#104 R#100 +G81 X96.520000 Y78.740000 Z#104 R#100 +G81 X93.980000 Y78.740000 Z#104 R#100 +G81 X91.440000 Y78.740000 Z#104 R#100 +G81 X32.385000 Y85.090000 Z#104 R#100 +G81 X29.845000 Y85.090000 Z#104 R#100 +G81 X27.305000 Y85.090000 Z#104 R#100 +G81 X24.765000 Y85.090000 Z#104 R#100 +G81 X24.765000 Y92.710000 Z#104 R#100 +G81 X27.305000 Y92.710000 Z#104 R#100 +G81 X29.845000 Y92.710000 Z#104 R#100 +G81 X32.385000 Y92.710000 Z#104 R#100 +G81 X31.115000 Y96.520000 Z#104 R#100 +G81 X26.035000 Y96.520000 Z#104 R#100 +G81 X115.570000 Y22.860000 Z#104 R#100 +G81 X118.110000 Y22.860000 Z#104 R#100 +G81 X120.650000 Y22.860000 Z#104 R#100 +G81 X123.190000 Y22.860000 Z#104 R#100 +G81 X125.730000 Y22.860000 Z#104 R#100 +G81 X128.270000 Y22.860000 Z#104 R#100 +G81 X130.810000 Y22.860000 Z#104 R#100 +G81 X135.255000 Y21.590000 Z#104 R#100 +G81 X135.255000 Y16.510000 Z#104 R#100 +G81 X130.810000 Y15.240000 Z#104 R#100 +G81 X128.270000 Y15.240000 Z#104 R#100 +G81 X125.730000 Y15.240000 Z#104 R#100 +G81 X123.190000 Y15.240000 Z#104 R#100 +G81 X120.650000 Y15.240000 Z#104 R#100 +G81 X118.110000 Y15.240000 Z#104 R#100 +G81 X115.570000 Y15.240000 Z#104 R#100 +M5 M9 M2 +(end, total distance 749.14mm = 29.49in) diff --git a/doc/aic-0.7620.drill.gcode b/doc/aic-0.7620.drill.gcode new file mode 100644 index 0000000..08493ec --- /dev/null +++ b/doc/aic-0.7620.drill.gcode @@ -0,0 +1,121 @@ +(Created by G-code exporter) +(Wed Jul 15 16:09:51 2015) +(Units: mm) +(Board size: 180.34 x 104.14 mm) +(Drill file: 108 drills) +(Drill diameter: 0.762000 mm) +#100=2.000000 (safe Z) +#104=-2.000000 (drill depth) +(---------------------------------) +G17 G21 G90 G64 P0.003 M3 S3000 M7 F50.000000 +G0 Z#100 +G81 X14.605000 Y13.335000 Z#104 R#100 +G81 X14.605000 Y15.875000 Z#104 R#100 +G81 X14.605000 Y18.415000 Z#104 R#100 +G81 X14.605000 Y20.955000 Z#104 R#100 +G81 X14.605000 Y23.495000 Z#104 R#100 +G81 X14.605000 Y26.035000 Z#104 R#100 +G81 X14.605000 Y28.575000 Z#104 R#100 +G81 X14.605000 Y31.115000 Z#104 R#100 +G81 X14.605000 Y33.655000 Z#104 R#100 +G81 X14.605000 Y36.195000 Z#104 R#100 +G81 X14.605000 Y38.735000 Z#104 R#100 +G81 X14.605000 Y41.275000 Z#104 R#100 +G81 X14.605000 Y43.815000 Z#104 R#100 +G81 X14.605000 Y46.355000 Z#104 R#100 +G81 X14.605000 Y48.895000 Z#104 R#100 +G81 X14.605000 Y51.435000 Z#104 R#100 +G81 X14.605000 Y53.975000 Z#104 R#100 +G81 X14.605000 Y56.515000 Z#104 R#100 +G81 X14.605000 Y59.055000 Z#104 R#100 +G81 X14.605000 Y61.595000 Z#104 R#100 +G81 X17.145000 Y61.595000 Z#104 R#100 +G81 X17.145000 Y59.055000 Z#104 R#100 +G81 X19.685000 Y59.055000 Z#104 R#100 +G81 X19.685000 Y61.595000 Z#104 R#100 +G81 X19.685000 Y64.135000 Z#104 R#100 +G81 X17.145000 Y64.135000 Z#104 R#100 +G81 X17.145000 Y66.675000 Z#104 R#100 +G81 X19.685000 Y66.675000 Z#104 R#100 +G81 X19.685000 Y69.215000 Z#104 R#100 +G81 X17.145000 Y69.215000 Z#104 R#100 +G81 X14.605000 Y69.215000 Z#104 R#100 +G81 X14.605000 Y66.675000 Z#104 R#100 +G81 X14.605000 Y64.135000 Z#104 R#100 +G81 X14.605000 Y71.755000 Z#104 R#100 +G81 X14.605000 Y74.295000 Z#104 R#100 +G81 X14.605000 Y76.835000 Z#104 R#100 +G81 X17.145000 Y76.835000 Z#104 R#100 +G81 X19.685000 Y76.835000 Z#104 R#100 +G81 X19.685000 Y79.375000 Z#104 R#100 +G81 X17.145000 Y79.375000 Z#104 R#100 +G81 X17.145000 Y81.915000 Z#104 R#100 +G81 X19.685000 Y81.915000 Z#104 R#100 +G81 X19.685000 Y84.455000 Z#104 R#100 +G81 X19.685000 Y86.995000 Z#104 R#100 +G81 X17.145000 Y86.995000 Z#104 R#100 +G81 X17.145000 Y84.455000 Z#104 R#100 +G81 X14.605000 Y84.455000 Z#104 R#100 +G81 X14.605000 Y86.995000 Z#104 R#100 +G81 X14.605000 Y89.535000 Z#104 R#100 +G81 X14.605000 Y92.075000 Z#104 R#100 +G81 X17.145000 Y92.075000 Z#104 R#100 +G81 X19.685000 Y92.075000 Z#104 R#100 +G81 X19.685000 Y89.535000 Z#104 R#100 +G81 X17.145000 Y89.535000 Z#104 R#100 +G81 X14.605000 Y81.915000 Z#104 R#100 +G81 X14.605000 Y79.375000 Z#104 R#100 +G81 X17.145000 Y74.295000 Z#104 R#100 +G81 X17.145000 Y71.755000 Z#104 R#100 +G81 X19.685000 Y71.755000 Z#104 R#100 +G81 X19.685000 Y74.295000 Z#104 R#100 +G81 X19.685000 Y56.515000 Z#104 R#100 +G81 X17.145000 Y56.515000 Z#104 R#100 +G81 X17.145000 Y53.975000 Z#104 R#100 +G81 X19.685000 Y53.975000 Z#104 R#100 +G81 X19.685000 Y51.435000 Z#104 R#100 +G81 X19.685000 Y48.895000 Z#104 R#100 +G81 X17.145000 Y48.895000 Z#104 R#100 +G81 X17.145000 Y51.435000 Z#104 R#100 +G81 X17.145000 Y46.355000 Z#104 R#100 +G81 X17.145000 Y43.815000 Z#104 R#100 +G81 X19.685000 Y43.815000 Z#104 R#100 +G81 X19.685000 Y46.355000 Z#104 R#100 +G81 X19.685000 Y41.275000 Z#104 R#100 +G81 X17.145000 Y41.275000 Z#104 R#100 +G81 X17.145000 Y38.735000 Z#104 R#100 +G81 X17.145000 Y36.195000 Z#104 R#100 +G81 X19.685000 Y36.195000 Z#104 R#100 +G81 X19.685000 Y38.735000 Z#104 R#100 +G81 X19.685000 Y33.655000 Z#104 R#100 +G81 X19.685000 Y31.115000 Z#104 R#100 +G81 X17.145000 Y31.115000 Z#104 R#100 +G81 X17.145000 Y33.655000 Z#104 R#100 +G81 X17.145000 Y28.575000 Z#104 R#100 +G81 X19.685000 Y28.575000 Z#104 R#100 +G81 X19.685000 Y26.035000 Z#104 R#100 +G81 X19.685000 Y23.495000 Z#104 R#100 +G81 X17.145000 Y23.495000 Z#104 R#100 +G81 X17.145000 Y26.035000 Z#104 R#100 +G81 X17.145000 Y20.955000 Z#104 R#100 +G81 X17.145000 Y18.415000 Z#104 R#100 +G81 X17.145000 Y15.875000 Z#104 R#100 +G81 X17.145000 Y13.335000 Z#104 R#100 +G81 X19.685000 Y13.335000 Z#104 R#100 +G81 X19.685000 Y15.875000 Z#104 R#100 +G81 X19.685000 Y18.415000 Z#104 R#100 +G81 X19.685000 Y20.955000 Z#104 R#100 +G81 X111.125000 Y44.450000 Z#104 R#100 +G81 X111.125000 Y54.610000 Z#104 R#100 +G81 X121.285000 Y54.610000 Z#104 R#100 +G81 X125.095000 Y54.610000 Z#104 R#100 +G81 X125.095000 Y44.450000 Z#104 R#100 +G81 X121.285000 Y44.450000 Z#104 R#100 +G81 X125.095000 Y34.290000 Z#104 R#100 +G81 X135.255000 Y34.290000 Z#104 R#100 +G81 X135.255000 Y44.450000 Z#104 R#100 +G81 X135.255000 Y54.610000 Z#104 R#100 +G81 X135.255000 Y66.040000 Z#104 R#100 +G81 X125.095000 Y66.040000 Z#104 R#100 +M5 M9 M2 +(end, total distance 478.38mm = 18.83in) diff --git a/doc/aic-0.8890.drill.gcode b/doc/aic-0.8890.drill.gcode new file mode 100644 index 0000000..c46fc09 --- /dev/null +++ b/doc/aic-0.8890.drill.gcode @@ -0,0 +1,142 @@ +(Created by G-code exporter) +(Wed Jul 15 16:09:51 2015) +(Units: mm) +(Board size: 180.34 x 104.14 mm) +(Drill file: 129 drills) +(Drill diameter: 0.889000 mm) +#100=2.000000 (safe Z) +#104=-2.000000 (drill depth) +(---------------------------------) +G17 G21 G90 G64 P0.003 M3 S3000 M7 F50.000000 +G0 Z#100 +G81 X24.130000 Y7.620000 Z#104 R#100 +G81 X24.130000 Y10.160000 Z#104 R#100 +G81 X24.130000 Y15.240000 Z#104 R#100 +G81 X24.130000 Y17.780000 Z#104 R#100 +G81 X26.670000 Y15.240000 Z#104 R#100 +G81 X40.005000 Y17.780000 Z#104 R#100 +G81 X41.910000 Y15.875000 Z#104 R#100 +G81 X53.975000 Y10.160000 Z#104 R#100 +G81 X70.485000 Y15.240000 Z#104 R#100 +G81 X78.740000 Y21.590000 Z#104 R#100 +G81 X80.645000 Y19.685000 Z#104 R#100 +G81 X82.550000 Y17.780000 Z#104 R#100 +G81 X85.725000 Y10.160000 Z#104 R#100 +G81 X116.205000 Y24.765000 Z#104 R#100 +G81 X116.205000 Y27.940000 Z#104 R#100 +G81 X118.745000 Y27.940000 Z#104 R#100 +G81 X118.745000 Y31.750000 Z#104 R#100 +G81 X116.205000 Y31.750000 Z#104 R#100 +G81 X116.205000 Y34.290000 Z#104 R#100 +G81 X118.745000 Y34.290000 Z#104 R#100 +G81 X121.285000 Y39.370000 Z#104 R#100 +G81 X125.095000 Y39.370000 Z#104 R#100 +G81 X127.635000 Y39.370000 Z#104 R#100 +G81 X132.080000 Y34.290000 Z#104 R#100 +G81 X135.255000 Y31.750000 Z#104 R#100 +G81 X135.255000 Y27.940000 Z#104 R#100 +G81 X132.080000 Y24.765000 Z#104 R#100 +G81 X125.095000 Y27.940000 Z#104 R#100 +G81 X123.190000 Y29.845000 Z#104 R#100 +G81 X123.190000 Y24.765000 Z#104 R#100 +G81 X119.380000 Y20.320000 Z#104 R#100 +G81 X130.810000 Y7.620000 Z#104 R#100 +G81 X135.255000 Y39.370000 Z#104 R#100 +G81 X135.255000 Y49.530000 Z#104 R#100 +G81 X135.255000 Y59.690000 Z#104 R#100 +G81 X135.255000 Y62.230000 Z#104 R#100 +G81 X132.715000 Y59.690000 Z#104 R#100 +G81 X139.700000 Y62.230000 Z#104 R#100 +G81 X141.605000 Y57.785000 Z#104 R#100 +G81 X139.700000 Y72.390000 Z#104 R#100 +G81 X132.715000 Y76.835000 Z#104 R#100 +G81 X131.445000 Y85.090000 Z#104 R#100 +G81 X128.905000 Y85.090000 Z#104 R#100 +G81 X139.700000 Y85.090000 Z#104 R#100 +G81 X141.605000 Y88.265000 Z#104 R#100 +G81 X160.020000 Y78.105000 Z#104 R#100 +G81 X160.020000 Y75.336400 Z#104 R#100 +G81 X160.020000 Y72.567800 Z#104 R#100 +G81 X160.020000 Y69.799200 Z#104 R#100 +G81 X160.020000 Y67.030600 Z#104 R#100 +G81 X162.560000 Y68.427600 Z#104 R#100 +G81 X162.560000 Y71.196200 Z#104 R#100 +G81 X162.560000 Y73.964800 Z#104 R#100 +G81 X162.560000 Y76.733400 Z#104 R#100 +G81 X125.095000 Y59.690000 Z#104 R#100 +G81 X118.745000 Y59.690000 Z#104 R#100 +G81 X116.205000 Y59.690000 Z#104 R#100 +G81 X113.665000 Y59.690000 Z#104 R#100 +G81 X118.745000 Y62.230000 Z#104 R#100 +G81 X118.745000 Y66.040000 Z#104 R#100 +G81 X116.205000 Y66.040000 Z#104 R#100 +G81 X111.760000 Y66.040000 Z#104 R#100 +G81 X109.855000 Y66.040000 Z#104 R#100 +G81 X107.315000 Y66.040000 Z#104 R#100 +G81 X101.600000 Y66.040000 Z#104 R#100 +G81 X99.060000 Y66.040000 Z#104 R#100 +G81 X93.345000 Y66.040000 Z#104 R#100 +G81 X88.900000 Y67.945000 Z#104 R#100 +G81 X83.185000 Y66.040000 Z#104 R#100 +G81 X81.915000 Y67.945000 Z#104 R#100 +G81 X78.740000 Y66.040000 Z#104 R#100 +G81 X78.740000 Y62.230000 Z#104 R#100 +G81 X82.550000 Y62.230000 Z#104 R#100 +G81 X72.390000 Y69.850000 Z#104 R#100 +G81 X67.945000 Y69.850000 Z#104 R#100 +G81 X68.580000 Y66.040000 Z#104 R#100 +G81 X63.500000 Y66.040000 Z#104 R#100 +G81 X60.325000 Y62.230000 Z#104 R#100 +G81 X53.340000 Y66.040000 Z#104 R#100 +G81 X48.895000 Y66.040000 Z#104 R#100 +G81 X48.895000 Y62.230000 Z#104 R#100 +G81 X38.735000 Y66.040000 Z#104 R#100 +G81 X34.290000 Y66.040000 Z#104 R#100 +G81 X27.305000 Y64.135000 Z#104 R#100 +G81 X24.130000 Y66.040000 Z#104 R#100 +G81 X24.130000 Y76.835000 Z#104 R#100 +G81 X37.465000 Y83.820000 Z#104 R#100 +G81 X41.275000 Y83.820000 Z#104 R#100 +G81 X45.085000 Y83.820000 Z#104 R#100 +G81 X48.260000 Y86.360000 Z#104 R#100 +G81 X45.085000 Y93.980000 Z#104 R#100 +G81 X41.275000 Y93.980000 Z#104 R#100 +G81 X37.465000 Y93.980000 Z#104 R#100 +G81 X60.325000 Y81.915000 Z#104 R#100 +G81 X63.500000 Y83.820000 Z#104 R#100 +G81 X67.945000 Y83.820000 Z#104 R#100 +G81 X67.945000 Y80.010000 Z#104 R#100 +G81 X72.390000 Y80.010000 Z#104 R#100 +G81 X72.390000 Y83.820000 Z#104 R#100 +G81 X76.200000 Y86.360000 Z#104 R#100 +G81 X72.390000 Y93.980000 Z#104 R#100 +G81 X67.945000 Y93.980000 Z#104 R#100 +G81 X63.500000 Y93.980000 Z#104 R#100 +G81 X88.900000 Y96.520000 Z#104 R#100 +G81 X92.710000 Y93.980000 Z#104 R#100 +G81 X97.155000 Y96.520000 Z#104 R#100 +G81 X100.330000 Y92.710000 Z#104 R#100 +G81 X100.330000 Y90.170000 Z#104 R#100 +G81 X101.600000 Y85.090000 Z#104 R#100 +G81 X99.060000 Y85.090000 Z#104 R#100 +G81 X103.505000 Y81.915000 Z#104 R#100 +G81 X106.680000 Y85.090000 Z#104 R#100 +G81 X109.220000 Y85.090000 Z#104 R#100 +G81 X109.220000 Y81.915000 Z#104 R#100 +G81 X113.665000 Y76.835000 Z#104 R#100 +G81 X111.760000 Y73.025000 Z#104 R#100 +G81 X105.410000 Y88.900000 Z#104 R#100 +G81 X106.680000 Y91.440000 Z#104 R#100 +G81 X109.220000 Y91.440000 Z#104 R#100 +G81 X111.760000 Y96.520000 Z#104 R#100 +G81 X92.710000 Y83.820000 Z#104 R#100 +G81 X70.485000 Y57.785000 Z#104 R#100 +G81 X53.975000 Y36.195000 Z#104 R#100 +G81 X111.125000 Y39.370000 Z#104 R#100 +G81 X111.125000 Y49.530000 Z#104 R#100 +G81 X113.665000 Y52.705000 Z#104 R#100 +G81 X121.285000 Y49.530000 Z#104 R#100 +G81 X125.095000 Y49.530000 Z#104 R#100 +G81 X125.095000 Y47.625000 Z#104 R#100 +M5 M9 M2 +(end, total distance 949.65mm = 37.39in) diff --git a/doc/aic-bottom.gcode b/doc/aic-bottom.gcode new file mode 100644 index 0000000..e4b2d84 --- /dev/null +++ b/doc/aic-bottom.gcode @@ -0,0 +1,8980 @@ +(Created by G-code exporter) +(Wed Jul 15 16:09:51 2015) +(Units: mm) +(Board size: 180.34 x 104.14 mm) +(Accuracy 600 dpi) +(Tool diameter: 0.200000 mm) +#100=2.000000 (safe Z) +#101=-0.050000 (cutting depth) +#102=25.000000 (plunge feedrate) +#103=50.000000 (feedrate) +(with predrilling) +(---------------------------------) +G17 G21 G90 G64 P0.003 M3 S3000 M7 +G0 Z#100 +(polygon 1) +G0 X129.286000 Y104.140000 (start point) +G1 Z#101 F#102 +F#103 +G1 X129.286000 Y104.055333 +G1 X129.455333 Y103.886000 +G1 X170.222333 Y103.886000 +G1 X170.391667 Y104.055333 +G1 X170.391667 Y104.140000 +G1 X129.286000 Y104.140000 +G0 Z#100 +(polygon end, distance 82.52) +(polygon 2) +G0 X74.125667 Y102.192667 (start point) +G1 Z#101 F#102 +F#103 +G1 X73.871667 Y101.981000 +G1 X73.660000 Y101.727000 +G1 X73.660000 Y101.473000 +G1 X73.787000 Y101.219000 +G1 X74.041000 Y101.007333 +G1 X74.041000 Y94.530333 +G1 X73.787000 Y94.318667 +G1 X73.660000 Y94.064667 +G1 X73.660000 Y93.810667 +G1 X73.871667 Y93.556667 +G1 X74.125667 Y93.345000 +G1 X74.422000 Y93.345000 +G1 X74.676000 Y93.556667 +G1 X74.887667 Y93.810667 +G1 X74.887667 Y94.064667 +G1 X74.760667 Y94.318667 +G1 X74.506667 Y94.530333 +G1 X74.506667 Y101.007333 +G1 X74.760667 Y101.219000 +G1 X74.887667 Y101.473000 +G1 X74.887667 Y101.727000 +G1 X74.676000 Y101.981000 +G1 X74.422000 Y102.192667 +G1 X74.125667 Y102.192667 +G0 Z#100 +(polygon end, distance 19.67) +(polygon 3) +G0 X61.510333 Y101.811667 (start point) +G1 Z#101 F#102 +F#103 +G1 X58.843333 Y99.187000 +G1 X58.801000 Y98.975333 +G1 X58.547000 Y98.763667 +G1 X58.420000 Y98.509667 +G1 X58.420000 Y98.255667 +G1 X58.631667 Y98.001667 +G1 X58.885667 Y97.790000 +G1 X59.182000 Y97.790000 +G1 X59.436000 Y98.001667 +G1 X59.647667 Y98.255667 +G1 X59.647667 Y98.509667 +G1 X59.520667 Y98.763667 +G1 X59.266667 Y98.975333 +G1 X61.679667 Y101.346000 +G1 X69.723000 Y101.346000 +G1 X71.162333 Y99.949000 +G1 X71.120000 Y99.525667 +G1 X71.331667 Y99.271667 +G1 X71.585667 Y99.060000 +G1 X71.882000 Y99.060000 +G1 X72.136000 Y99.271667 +G1 X72.347667 Y99.525667 +G1 X72.347667 Y99.822000 +G1 X72.136000 Y100.076000 +G1 X71.882000 Y100.287667 +G1 X71.501000 Y100.245333 +G1 X69.892333 Y101.811667 +G1 X61.510333 Y101.811667 +G0 Z#100 +(polygon end, distance 34.76) +(polygon 4) +G0 X76.750333 Y101.811667 (start point) +G1 Z#101 F#102 +F#103 +G1 X75.946000 Y101.007333 +G1 X75.946000 Y93.387333 +G1 X75.438000 Y92.921667 +G1 X70.400333 Y92.921667 +G1 X70.188667 Y93.175667 +G1 X69.934667 Y93.302667 +G1 X69.680667 Y93.302667 +G1 X69.426667 Y93.091000 +G1 X69.215000 Y92.837000 +G1 X69.215000 Y92.540667 +G1 X69.426667 Y92.286667 +G1 X69.680667 Y92.075000 +G1 X69.934667 Y92.075000 +G1 X70.188667 Y92.202000 +G1 X70.400333 Y92.456000 +G1 X75.607333 Y92.456000 +G1 X76.411667 Y93.260333 +G1 X76.411667 Y100.880333 +G1 X76.919667 Y101.346000 +G1 X135.763000 Y101.346000 +G1 X136.906000 Y100.245333 +G1 X136.906000 Y92.794667 +G1 X135.678333 Y91.524667 +G1 X135.339667 Y91.651667 +G1 X134.958667 Y91.609333 +G1 X134.620000 Y91.397667 +G1 X134.408333 Y91.059000 +G1 X134.408333 Y90.508667 +G1 X134.620000 Y90.170000 +G1 X134.958667 Y89.958333 +G1 X135.509000 Y89.958333 +G1 X135.847667 Y90.170000 +G1 X136.059333 Y90.508667 +G1 X136.101667 Y90.889667 +G1 X135.974667 Y91.186000 +G1 X137.371667 Y92.625333 +G1 X137.371667 Y100.372333 +G1 X135.932333 Y101.811667 +G1 X76.750333 Y101.811667 +G0 Z#100 +(polygon end, distance 178.06) +(polygon 5) +G0 X67.775667 Y100.287667 (start point) +G1 Z#101 F#102 +F#103 +G1 X67.521667 Y100.076000 +G1 X67.310000 Y99.822000 +G1 X67.310000 Y99.568000 +G1 X67.437000 Y99.314000 +G1 X67.691000 Y99.102333 +G1 X67.691000 Y94.784333 +G1 X67.310000 Y94.572667 +G1 X67.098333 Y94.234000 +G1 X67.098333 Y93.683667 +G1 X67.310000 Y93.345000 +G1 X67.648667 Y93.133333 +G1 X68.199000 Y93.133333 +G1 X68.537667 Y93.345000 +G1 X68.749333 Y93.683667 +G1 X68.749333 Y94.234000 +G1 X68.537667 Y94.572667 +G1 X68.156667 Y94.784333 +G1 X68.156667 Y99.102333 +G1 X68.410667 Y99.314000 +G1 X68.537667 Y99.568000 +G1 X68.537667 Y99.822000 +G1 X68.326000 Y100.076000 +G1 X68.072000 Y100.287667 +G1 X67.775667 Y100.287667 +G0 Z#100 +(polygon end, distance 16.91) +(polygon 6) +G0 X77.935667 Y100.287667 (start point) +G1 Z#101 F#102 +F#103 +G1 X77.681667 Y100.076000 +G1 X77.470000 Y99.822000 +G1 X77.470000 Y99.525667 +G1 X77.681667 Y99.271667 +G1 X77.935667 Y99.060000 +G1 X78.189667 Y99.060000 +G1 X78.443667 Y99.187000 +G1 X78.655333 Y99.441000 +G1 X116.882333 Y99.441000 +G1 X117.094000 Y99.187000 +G1 X117.348000 Y99.060000 +G1 X117.602000 Y99.060000 +G1 X117.856000 Y99.271667 +G1 X118.067667 Y99.525667 +G1 X118.067667 Y99.822000 +G1 X117.856000 Y100.076000 +G1 X117.602000 Y100.287667 +G1 X117.348000 Y100.287667 +G1 X117.094000 Y100.160667 +G1 X116.882333 Y99.906667 +G1 X78.655333 Y99.906667 +G1 X78.443667 Y100.160667 +G1 X78.189667 Y100.287667 +G1 X77.935667 Y100.287667 +G0 Z#100 +(polygon end, distance 83.17) +(polygon 7) +G0 X79.798333 Y99.356333 (start point) +G1 Z#101 F#102 +F#103 +G1 X79.375000 Y99.144667 +G1 X78.570667 Y98.298000 +G1 X78.401333 Y97.959333 +G1 X78.401333 Y95.631000 +G1 X77.258333 Y94.445667 +G1 X77.131333 Y94.064667 +G1 X77.173667 Y92.413667 +G1 X77.427667 Y92.032667 +G1 X77.808667 Y91.778667 +G1 X78.359000 Y91.778667 +G1 X78.740000 Y92.032667 +G1 X78.994000 Y92.413667 +G1 X79.036333 Y93.556667 +G1 X80.137000 Y94.699667 +G1 X80.264000 Y94.953667 +G1 X80.348667 Y97.409000 +G1 X86.614000 Y97.451333 +G1 X87.630000 Y96.393000 +G1 X87.757000 Y95.927333 +G1 X88.011000 Y95.631000 +G1 X88.307333 Y95.377000 +G1 X88.730667 Y95.250000 +G1 X89.027000 Y95.250000 +G1 X89.450333 Y95.377000 +G1 X89.662000 Y95.546333 +G1 X96.350667 Y95.546333 +G1 X96.562333 Y95.377000 +G1 X96.985667 Y95.250000 +G1 X97.282000 Y95.250000 +G1 X97.705333 Y95.377000 +G1 X97.917000 Y95.546333 +G1 X108.246333 Y95.546333 +G1 X108.288667 Y91.143667 +G1 X108.542667 Y90.762667 +G1 X108.923667 Y90.508667 +G1 X109.474000 Y90.508667 +G1 X109.855000 Y90.762667 +G1 X110.109000 Y91.143667 +G1 X110.151333 Y95.546333 +G1 X110.955667 Y95.546333 +G1 X111.167333 Y95.377000 +G1 X111.590667 Y95.250000 +G1 X111.887000 Y95.250000 +G1 X112.310333 Y95.377000 +G1 X112.522000 Y95.546333 +G1 X117.094000 Y95.588667 +G1 X117.686667 Y95.631000 +G1 X117.686667 Y96.054333 +G1 X119.126000 Y97.451333 +G1 X127.889000 Y97.451333 +G1 X129.286000 Y96.012000 +G1 X129.286000 Y95.631000 +G1 X129.921000 Y95.588667 +G1 X130.386667 Y95.588667 +G1 X131.021667 Y95.631000 +G1 X131.064000 Y96.266000 +G1 X131.064000 Y96.731667 +G1 X131.021667 Y97.366667 +G1 X130.640667 Y97.366667 +G1 X128.778000 Y99.187000 +G1 X128.439333 Y99.356333 +G1 X118.533333 Y99.356333 +G1 X118.194667 Y99.187000 +G1 X116.416667 Y97.451333 +G1 X112.522000 Y97.451333 +G1 X112.310333 Y97.620667 +G1 X111.887000 Y97.747667 +G1 X111.590667 Y97.747667 +G1 X111.167333 Y97.620667 +G1 X110.955667 Y97.451333 +G1 X97.917000 Y97.451333 +G1 X97.705333 Y97.620667 +G1 X97.282000 Y97.747667 +G1 X96.985667 Y97.747667 +G1 X96.562333 Y97.620667 +G1 X96.350667 Y97.451333 +G1 X89.662000 Y97.451333 +G1 X89.450333 Y97.620667 +G1 X88.984667 Y97.747667 +G1 X87.503000 Y99.187000 +G1 X87.164333 Y99.356333 +G1 X79.798333 Y99.356333 +G0 Z#100 +(polygon end, distance 134.79) +(polygon 8) +G0 X43.053000 Y98.848333 (start point) +G1 Z#101 F#102 +F#103 +G1 X42.799000 Y98.679000 +G1 X41.105667 Y96.943333 +G1 X31.834667 Y96.943333 +G1 X31.496000 Y97.282000 +G1 X31.157333 Y97.366667 +G1 X30.776333 Y97.324333 +G1 X30.437667 Y97.070333 +G1 X30.268333 Y96.774000 +G1 X30.268333 Y96.223667 +G1 X30.437667 Y95.927333 +G1 X30.776333 Y95.673333 +G1 X31.157333 Y95.631000 +G1 X31.496000 Y95.715667 +G1 X31.834667 Y96.054333 +G1 X40.809333 Y96.054333 +G1 X40.809333 Y94.699667 +G1 X40.470667 Y94.361000 +G1 X40.386000 Y94.022333 +G1 X40.428333 Y93.641333 +G1 X40.682333 Y93.302667 +G1 X40.978667 Y93.133333 +G1 X41.529000 Y93.133333 +G1 X41.825333 Y93.302667 +G1 X42.079333 Y93.641333 +G1 X42.121667 Y94.022333 +G1 X42.037000 Y94.361000 +G1 X41.698333 Y94.699667 +G1 X41.698333 Y96.308333 +G1 X43.307000 Y97.959333 +G1 X54.440667 Y97.959333 +G1 X55.626000 Y96.731667 +G1 X55.668333 Y96.223667 +G1 X55.880000 Y95.885000 +G1 X56.218667 Y95.673333 +G1 X56.726667 Y95.631000 +G1 X57.319333 Y95.080667 +G1 X57.319333 Y93.429667 +G1 X57.023000 Y93.133333 +G1 X55.964667 Y93.133333 +G1 X55.626000 Y93.472000 +G1 X55.287333 Y93.556667 +G1 X54.906333 Y93.514333 +G1 X54.567667 Y93.260333 +G1 X54.398333 Y92.964000 +G1 X54.398333 Y92.413667 +G1 X54.567667 Y92.117333 +G1 X54.906333 Y91.863333 +G1 X55.287333 Y91.821000 +G1 X55.626000 Y91.905667 +G1 X55.964667 Y92.244333 +G1 X57.023000 Y92.244333 +G1 X57.361667 Y91.905667 +G1 X57.700333 Y91.821000 +G1 X57.996667 Y91.863333 +G1 X59.351333 Y90.466333 +G1 X59.605333 Y90.339333 +G1 X78.570667 Y90.339333 +G1 X82.719333 Y86.148333 +G1 X82.719333 Y85.809667 +G1 X82.380667 Y85.471000 +G1 X82.296000 Y85.132333 +G1 X82.338333 Y84.751333 +G1 X82.592333 Y84.412667 +G1 X82.888667 Y84.243333 +G1 X83.439000 Y84.243333 +G1 X83.735333 Y84.412667 +G1 X83.989333 Y84.751333 +G1 X84.031667 Y85.132333 +G1 X83.947000 Y85.471000 +G1 X83.608333 Y85.809667 +G1 X83.608333 Y86.402333 +G1 X83.523667 Y86.571667 +G1 X79.036333 Y91.101333 +G1 X78.782333 Y91.228333 +G1 X59.859333 Y91.228333 +G1 X58.589333 Y92.456000 +G1 X58.631667 Y92.752333 +G1 X58.547000 Y93.091000 +G1 X58.208333 Y93.429667 +G1 X58.208333 Y95.292333 +G1 X58.123667 Y95.461667 +G1 X57.361667 Y96.266000 +G1 X57.319333 Y96.774000 +G1 X57.107667 Y97.112667 +G1 X56.769000 Y97.324333 +G1 X56.261000 Y97.366667 +G1 X54.821667 Y98.763667 +G1 X54.652333 Y98.848333 +G1 X43.053000 Y98.848333 +G0 Z#100 +(polygon end, distance 140.50) +(polygon 9) +G0 X11.811000 Y98.763667 (start point) +G1 Z#101 F#102 +F#103 +G1 X11.430000 Y98.636667 +G1 X11.049000 Y98.425000 +G1 X10.668000 Y98.001667 +G1 X10.456333 Y97.536000 +G1 X10.456333 Y96.731667 +G1 X10.710333 Y96.181333 +G1 X11.176000 Y95.758000 +G1 X11.641667 Y95.546333 +G1 X12.446000 Y95.546333 +G1 X12.996333 Y95.800333 +G1 X13.419667 Y96.266000 +G1 X13.631333 Y96.731667 +G1 X13.631333 Y97.536000 +G1 X13.419667 Y98.001667 +G1 X12.996333 Y98.467333 +G1 X12.446000 Y98.721333 +G1 X11.811000 Y98.763667 +G0 Z#100 +(polygon end, distance 10.21) +(polygon 10) +G0 X165.481000 Y98.763667 (start point) +G1 Z#101 F#102 +F#103 +G1 X165.100000 Y98.636667 +G1 X164.719000 Y98.425000 +G1 X164.338000 Y98.001667 +G1 X164.126333 Y97.536000 +G1 X164.126333 Y96.731667 +G1 X164.380333 Y96.181333 +G1 X164.846000 Y95.758000 +G1 X165.311667 Y95.546333 +G1 X166.116000 Y95.546333 +G1 X166.666333 Y95.800333 +G1 X167.089667 Y96.266000 +G1 X167.301333 Y96.731667 +G1 X167.301333 Y97.536000 +G1 X167.089667 Y98.001667 +G1 X166.666333 Y98.467333 +G1 X166.116000 Y98.721333 +G1 X165.481000 Y98.763667 +G0 Z#100 +(polygon end, distance 10.21) +(polygon 11) +G0 X25.146000 Y97.366667 (start point) +G1 Z#101 F#102 +F#103 +G1 X25.146000 Y95.631000 +G1 X26.881667 Y95.631000 +G1 X26.881667 Y96.054333 +G1 X27.135667 Y96.054333 +G1 X28.871333 Y94.276333 +G1 X29.125333 Y94.149333 +G1 X31.538333 Y94.149333 +G1 X31.919333 Y93.810667 +G1 X31.919333 Y93.429667 +G1 X31.580667 Y93.091000 +G1 X31.496000 Y92.752333 +G1 X31.538333 Y92.371333 +G1 X31.792333 Y92.032667 +G1 X32.088667 Y91.863333 +G1 X32.639000 Y91.863333 +G1 X32.935333 Y92.032667 +G1 X33.189333 Y92.371333 +G1 X33.231667 Y92.752333 +G1 X33.147000 Y93.091000 +G1 X32.808333 Y93.429667 +G1 X32.808333 Y94.022333 +G1 X32.723667 Y94.191667 +G1 X32.046333 Y94.911333 +G1 X31.792333 Y95.038333 +G1 X29.337000 Y95.038333 +G1 X27.601333 Y96.816333 +G1 X27.347333 Y96.943333 +G1 X26.881667 Y96.943333 +G1 X26.881667 Y97.366667 +G1 X25.146000 Y97.366667 +G0 Z#100 +(polygon end, distance 24.63) +(polygon 12) +G0 X50.546000 Y97.366667 (start point) +G1 Z#101 F#102 +F#103 +G1 X50.546000 Y95.631000 +G1 X52.281667 Y95.631000 +G1 X52.281667 Y97.366667 +G1 X50.546000 Y97.366667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 13) +G0 X84.285667 Y97.366667 (start point) +G1 Z#101 F#102 +F#103 +G1 X84.031667 Y97.282000 +G1 X83.650667 Y96.901000 +G1 X83.566000 Y96.562333 +G1 X83.608333 Y96.181333 +G1 X83.862333 Y95.842667 +G1 X84.158667 Y95.673333 +G1 X84.709000 Y95.673333 +G1 X85.047667 Y95.885000 +G1 X85.259333 Y96.223667 +G1 X85.259333 Y96.774000 +G1 X85.047667 Y97.112667 +G1 X84.709000 Y97.324333 +G1 X84.285667 Y97.366667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 14) +G0 X121.750667 Y97.366667 (start point) +G1 Z#101 F#102 +F#103 +G1 X121.496667 Y97.282000 +G1 X121.115667 Y96.901000 +G1 X121.031000 Y96.562333 +G1 X121.073333 Y96.181333 +G1 X121.327333 Y95.842667 +G1 X121.623667 Y95.673333 +G1 X122.174000 Y95.673333 +G1 X122.512667 Y95.885000 +G1 X122.724333 Y96.223667 +G1 X122.724333 Y96.774000 +G1 X122.512667 Y97.112667 +G1 X122.174000 Y97.324333 +G1 X121.750667 Y97.366667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 15) +G0 X135.085667 Y97.366667 (start point) +G1 Z#101 F#102 +F#103 +G1 X134.831667 Y97.282000 +G1 X134.450667 Y96.901000 +G1 X134.366000 Y96.604667 +G1 X134.366000 Y96.350667 +G1 X134.493000 Y96.054333 +G1 X132.588000 Y94.191667 +G1 X127.550333 Y94.191667 +G1 X127.338667 Y94.445667 +G1 X127.084667 Y94.572667 +G1 X126.830667 Y94.572667 +G1 X126.576667 Y94.361000 +G1 X126.365000 Y94.107000 +G1 X126.365000 Y93.810667 +G1 X126.576667 Y93.556667 +G1 X126.830667 Y93.345000 +G1 X127.084667 Y93.345000 +G1 X127.338667 Y93.472000 +G1 X127.550333 Y93.726000 +G1 X132.757333 Y93.726000 +G1 X134.831667 Y95.758000 +G1 X135.128000 Y95.631000 +G1 X135.509000 Y95.673333 +G1 X135.847667 Y95.885000 +G1 X136.059333 Y96.223667 +G1 X136.059333 Y96.774000 +G1 X135.847667 Y97.112667 +G1 X135.509000 Y97.324333 +G1 X135.085667 Y97.366667 +G0 Z#100 +(polygon end, distance 24.14) +(polygon 16) +G0 X95.080667 Y95.207667 (start point) +G1 Z#101 F#102 +F#103 +G1 X94.826667 Y94.996000 +G1 X94.615000 Y94.742000 +G1 X94.615000 Y94.445667 +G1 X94.826667 Y94.191667 +G1 X95.080667 Y93.980000 +G1 X95.377000 Y93.980000 +G1 X95.631000 Y94.149333 +G1 X104.605667 Y94.149333 +G1 X106.214333 Y92.498333 +G1 X106.214333 Y92.286667 +G1 X105.791000 Y92.286667 +G1 X105.791000 Y90.551000 +G1 X107.526667 Y90.551000 +G1 X107.526667 Y92.286667 +G1 X107.103333 Y92.286667 +G1 X107.103333 Y92.752333 +G1 X106.976333 Y93.006333 +G1 X104.986667 Y94.953667 +G1 X104.817333 Y95.038333 +G1 X95.631000 Y95.038333 +G1 X95.377000 Y95.207667 +G1 X95.080667 Y95.207667 +G0 Z#100 +(polygon end, distance 33.28) +(polygon 17) +G0 X15.790333 Y94.826667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.351000 Y93.387333 +G1 X14.351000 Y92.921667 +G1 X13.716000 Y92.921667 +G1 X13.716000 Y91.186000 +G1 X15.451667 Y91.186000 +G1 X15.451667 Y92.921667 +G1 X14.816667 Y92.921667 +G1 X14.816667 Y93.260333 +G1 X15.959667 Y94.361000 +G1 X26.543000 Y94.361000 +G1 X27.051000 Y93.895333 +G1 X27.051000 Y93.514333 +G1 X26.670000 Y93.302667 +G1 X26.458333 Y92.964000 +G1 X26.458333 Y92.413667 +G1 X26.670000 Y92.075000 +G1 X27.008667 Y91.863333 +G1 X27.559000 Y91.863333 +G1 X27.897667 Y92.075000 +G1 X28.109333 Y92.413667 +G1 X28.109333 Y92.964000 +G1 X27.897667 Y93.302667 +G1 X27.516667 Y93.514333 +G1 X27.516667 Y94.022333 +G1 X26.712333 Y94.826667 +G1 X15.790333 Y94.826667 +G0 Z#100 +(polygon end, distance 40.04) +(polygon 18) +G0 X37.295667 Y94.826667 (start point) +G1 Z#101 F#102 +F#103 +G1 X37.041667 Y94.742000 +G1 X36.660667 Y94.361000 +G1 X36.576000 Y94.022333 +G1 X36.618333 Y93.641333 +G1 X36.872333 Y93.302667 +G1 X37.168667 Y93.133333 +G1 X37.719000 Y93.133333 +G1 X38.057667 Y93.345000 +G1 X38.269333 Y93.683667 +G1 X38.269333 Y94.234000 +G1 X38.057667 Y94.572667 +G1 X37.719000 Y94.784333 +G1 X37.295667 Y94.826667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 19) +G0 X44.196000 Y94.826667 (start point) +G1 Z#101 F#102 +F#103 +G1 X44.196000 Y93.091000 +G1 X45.931667 Y93.091000 +G1 X45.931667 Y94.826667 +G1 X44.196000 Y94.826667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 20) +G0 X62.611000 Y94.826667 (start point) +G1 Z#101 F#102 +F#103 +G1 X62.611000 Y93.091000 +G1 X64.346667 Y93.091000 +G1 X64.346667 Y94.826667 +G1 X62.611000 Y94.826667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 21) +G0 X72.220667 Y94.826667 (start point) +G1 Z#101 F#102 +F#103 +G1 X71.966667 Y94.742000 +G1 X71.585667 Y94.361000 +G1 X71.501000 Y94.022333 +G1 X71.543333 Y93.641333 +G1 X71.797333 Y93.302667 +G1 X72.093667 Y93.133333 +G1 X72.644000 Y93.133333 +G1 X72.982667 Y93.345000 +G1 X73.194333 Y93.683667 +G1 X73.194333 Y94.234000 +G1 X72.982667 Y94.572667 +G1 X72.644000 Y94.784333 +G1 X72.220667 Y94.826667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 22) +G0 X91.821000 Y94.826667 (start point) +G1 Z#101 F#102 +F#103 +G1 X91.821000 Y93.091000 +G1 X93.556667 Y93.091000 +G1 X93.556667 Y94.826667 +G1 X91.821000 Y94.826667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 23) +G0 X24.595667 Y93.556667 (start point) +G1 Z#101 F#102 +F#103 +G1 X24.341667 Y93.472000 +G1 X23.960667 Y93.091000 +G1 X23.876000 Y92.752333 +G1 X23.918333 Y92.371333 +G1 X24.172333 Y92.032667 +G1 X24.468667 Y91.863333 +G1 X25.019000 Y91.863333 +G1 X25.357667 Y92.075000 +G1 X25.569333 Y92.413667 +G1 X25.569333 Y92.964000 +G1 X25.357667 Y93.302667 +G1 X25.019000 Y93.514333 +G1 X24.595667 Y93.556667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 24) +G0 X29.675667 Y93.556667 (start point) +G1 Z#101 F#102 +F#103 +G1 X29.421667 Y93.472000 +G1 X29.040667 Y93.091000 +G1 X28.956000 Y92.752333 +G1 X28.998333 Y92.371333 +G1 X29.252333 Y92.032667 +G1 X29.591000 Y91.863333 +G1 X29.591000 Y90.889667 +G1 X28.490333 Y89.746667 +G1 X20.489333 Y89.746667 +G1 X20.277667 Y90.127667 +G1 X19.939000 Y90.339333 +G1 X19.388667 Y90.339333 +G1 X19.050000 Y90.127667 +G1 X18.838333 Y89.789000 +G1 X18.838333 Y89.238667 +G1 X19.007667 Y88.942333 +G1 X19.346333 Y88.688333 +G1 X18.584333 Y88.688333 +G1 X17.949333 Y89.281000 +G1 X17.991667 Y89.577333 +G1 X17.907000 Y89.916000 +G1 X17.568333 Y90.254667 +G1 X17.568333 Y91.313000 +G1 X17.907000 Y91.651667 +G1 X17.991667 Y91.990333 +G1 X17.949333 Y92.371333 +G1 X17.695333 Y92.710000 +G1 X17.399000 Y92.879333 +G1 X16.848667 Y92.879333 +G1 X16.552333 Y92.710000 +G1 X16.298333 Y92.371333 +G1 X16.256000 Y91.990333 +G1 X16.340667 Y91.651667 +G1 X16.679333 Y91.313000 +G1 X16.679333 Y90.254667 +G1 X16.340667 Y89.916000 +G1 X16.256000 Y89.577333 +G1 X16.298333 Y89.196333 +G1 X16.552333 Y88.857667 +G1 X16.848667 Y88.688333 +G1 X17.356667 Y88.646000 +G1 X18.161000 Y87.884000 +G1 X18.330333 Y87.799333 +G1 X19.346333 Y87.799333 +G1 X19.007667 Y87.545333 +G1 X18.838333 Y87.249000 +G1 X18.838333 Y86.698667 +G1 X19.050000 Y86.360000 +G1 X19.388667 Y86.148333 +G1 X19.939000 Y86.148333 +G1 X20.277667 Y86.360000 +G1 X20.489333 Y86.698667 +G1 X20.489333 Y87.249000 +G1 X20.320000 Y87.545333 +G1 X19.981333 Y87.799333 +G1 X20.150667 Y87.799333 +G1 X21.124333 Y86.783333 +G1 X21.124333 Y85.005333 +G1 X21.209000 Y84.836000 +G1 X23.156333 Y82.846333 +G1 X23.410333 Y82.719333 +G1 X33.697333 Y82.719333 +G1 X33.951333 Y82.846333 +G1 X36.957000 Y85.894333 +G1 X47.498000 Y85.894333 +G1 X47.836667 Y85.555667 +G1 X48.175333 Y85.471000 +G1 X48.556333 Y85.513333 +G1 X48.895000 Y85.767333 +G1 X49.064333 Y86.063667 +G1 X49.064333 Y86.614000 +G1 X48.895000 Y86.910333 +G1 X48.556333 Y87.164333 +G1 X48.175333 Y87.206667 +G1 X47.836667 Y87.122000 +G1 X47.498000 Y86.783333 +G1 X36.745333 Y86.783333 +G1 X36.491333 Y86.656333 +G1 X33.485667 Y83.608333 +G1 X30.268333 Y83.608333 +G1 X30.268333 Y84.328000 +G1 X30.607000 Y84.666667 +G1 X30.691667 Y85.005333 +G1 X30.649333 Y85.386333 +G1 X30.395333 Y85.725000 +G1 X30.099000 Y85.894333 +G1 X29.548667 Y85.894333 +G1 X29.252333 Y85.725000 +G1 X28.998333 Y85.386333 +G1 X28.956000 Y85.005333 +G1 X29.040667 Y84.666667 +G1 X29.379333 Y84.328000 +G1 X29.379333 Y83.608333 +G1 X23.664333 Y83.608333 +G1 X22.013333 Y85.217000 +G1 X22.013333 Y87.037333 +G1 X21.928667 Y87.206667 +G1 X20.616333 Y88.561333 +G1 X20.362333 Y88.688333 +G1 X19.981333 Y88.688333 +G1 X20.320000 Y88.942333 +G1 X20.489333 Y89.281000 +G1 X28.617333 Y89.281000 +G1 X30.056667 Y90.720333 +G1 X30.056667 Y91.863333 +G1 X30.437667 Y92.075000 +G1 X30.649333 Y92.413667 +G1 X30.649333 Y92.964000 +G1 X30.437667 Y93.302667 +G1 X30.099000 Y93.514333 +G1 X29.675667 Y93.556667 +G0 Z#100 +(polygon end, distance 123.64) +(polygon 25) +G0 X49.995667 Y93.556667 (start point) +G1 Z#101 F#102 +F#103 +G1 X49.741667 Y93.472000 +G1 X49.360667 Y93.091000 +G1 X49.276000 Y92.752333 +G1 X49.318333 Y92.371333 +G1 X49.572333 Y92.032667 +G1 X49.868667 Y91.863333 +G1 X50.419000 Y91.863333 +G1 X50.757667 Y92.075000 +G1 X50.969333 Y92.413667 +G1 X50.969333 Y92.964000 +G1 X50.757667 Y93.302667 +G1 X50.419000 Y93.514333 +G1 X49.995667 Y93.556667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 26) +G0 X52.535667 Y93.556667 (start point) +G1 Z#101 F#102 +F#103 +G1 X52.281667 Y93.472000 +G1 X51.900667 Y93.091000 +G1 X51.816000 Y92.752333 +G1 X51.858333 Y92.371333 +G1 X52.112333 Y92.032667 +G1 X52.451000 Y91.863333 +G1 X52.451000 Y91.482333 +G1 X51.943000 Y91.016667 +G1 X41.825333 Y91.016667 +G1 X41.613667 Y91.270667 +G1 X41.359667 Y91.397667 +G1 X41.148000 Y91.397667 +G1 X40.894000 Y91.270667 +G1 X40.682333 Y91.016667 +G1 X35.475333 Y91.016667 +G1 X32.131000 Y87.672333 +G1 X32.131000 Y85.936667 +G1 X31.496000 Y85.936667 +G1 X31.496000 Y84.201000 +G1 X33.231667 Y84.201000 +G1 X33.231667 Y85.936667 +G1 X32.596667 Y85.936667 +G1 X32.596667 Y87.503000 +G1 X35.602333 Y90.551000 +G1 X40.682333 Y90.551000 +G1 X40.894000 Y90.297000 +G1 X41.148000 Y90.170000 +G1 X41.359667 Y90.170000 +G1 X41.613667 Y90.297000 +G1 X41.825333 Y90.551000 +G1 X52.112333 Y90.551000 +G1 X52.916667 Y91.355333 +G1 X52.916667 Y91.863333 +G1 X53.297667 Y92.075000 +G1 X53.509333 Y92.413667 +G1 X53.509333 Y92.964000 +G1 X53.297667 Y93.302667 +G1 X52.959000 Y93.514333 +G1 X52.535667 Y93.556667 +G0 Z#100 +(polygon end, distance 60.03) +(polygon 27) +G0 X80.475667 Y93.556667 (start point) +G1 Z#101 F#102 +F#103 +G1 X80.221667 Y93.472000 +G1 X79.840667 Y93.091000 +G1 X79.756000 Y92.752333 +G1 X79.798333 Y92.371333 +G1 X80.052333 Y92.032667 +G1 X80.348667 Y91.863333 +G1 X80.899000 Y91.863333 +G1 X81.237667 Y92.075000 +G1 X81.449333 Y92.413667 +G1 X81.449333 Y92.964000 +G1 X81.237667 Y93.302667 +G1 X80.899000 Y93.514333 +G1 X80.475667 Y93.556667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 28) +G0 X83.015667 Y93.556667 (start point) +G1 Z#101 F#102 +F#103 +G1 X82.761667 Y93.472000 +G1 X82.380667 Y93.091000 +G1 X82.296000 Y92.752333 +G1 X82.338333 Y92.371333 +G1 X82.592333 Y92.032667 +G1 X82.888667 Y91.863333 +G1 X83.227333 Y91.821000 +G1 X83.566000 Y91.905667 +G1 X83.904667 Y92.244333 +G1 X84.963000 Y92.244333 +G1 X85.301667 Y91.905667 +G1 X85.640333 Y91.821000 +G1 X86.021333 Y91.863333 +G1 X86.360000 Y92.117333 +G1 X86.529333 Y92.413667 +G1 X86.529333 Y92.964000 +G1 X86.360000 Y93.260333 +G1 X86.021333 Y93.514333 +G1 X85.640333 Y93.556667 +G1 X85.301667 Y93.472000 +G1 X84.963000 Y93.133333 +G1 X83.904667 Y93.133333 +G1 X83.566000 Y93.472000 +G1 X83.269667 Y93.556667 +G1 X83.015667 Y93.556667 +G0 Z#100 +(polygon end, distance 11.13) +(polygon 29) +G0 X99.441000 Y93.556667 (start point) +G1 Z#101 F#102 +F#103 +G1 X99.441000 Y91.821000 +G1 X101.176667 Y91.821000 +G1 X101.176667 Y93.556667 +G1 X99.441000 Y93.556667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 30) +G0 X115.400667 Y93.556667 (start point) +G1 Z#101 F#102 +F#103 +G1 X115.146667 Y93.472000 +G1 X114.765667 Y93.091000 +G1 X114.681000 Y92.752333 +G1 X114.723333 Y92.371333 +G1 X114.977333 Y92.032667 +G1 X115.273667 Y91.863333 +G1 X115.824000 Y91.863333 +G1 X116.162667 Y92.075000 +G1 X116.374333 Y92.413667 +G1 X116.374333 Y92.964000 +G1 X116.162667 Y93.302667 +G1 X115.824000 Y93.514333 +G1 X115.400667 Y93.556667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 31) +G0 X117.940667 Y93.556667 (start point) +G1 Z#101 F#102 +F#103 +G1 X117.686667 Y93.472000 +G1 X117.305667 Y93.091000 +G1 X117.221000 Y92.752333 +G1 X117.263333 Y92.371333 +G1 X117.517333 Y92.032667 +G1 X117.813667 Y91.863333 +G1 X118.152333 Y91.821000 +G1 X118.491000 Y91.905667 +G1 X118.829667 Y92.244333 +G1 X119.888000 Y92.244333 +G1 X120.226667 Y91.905667 +G1 X120.565333 Y91.821000 +G1 X120.861667 Y91.863333 +G1 X124.756333 Y87.926333 +G1 X125.010333 Y87.799333 +G1 X140.843000 Y87.799333 +G1 X141.181667 Y87.460667 +G1 X141.520333 Y87.376000 +G1 X141.901333 Y87.418333 +G1 X142.240000 Y87.672333 +G1 X142.409333 Y87.968667 +G1 X142.409333 Y88.519000 +G1 X142.240000 Y88.815333 +G1 X141.901333 Y89.069333 +G1 X141.520333 Y89.111667 +G1 X141.181667 Y89.027000 +G1 X140.843000 Y88.688333 +G1 X125.222000 Y88.688333 +G1 X121.496667 Y92.456000 +G1 X121.454333 Y92.964000 +G1 X121.285000 Y93.260333 +G1 X120.946333 Y93.514333 +G1 X120.565333 Y93.556667 +G1 X120.226667 Y93.472000 +G1 X119.888000 Y93.133333 +G1 X118.829667 Y93.133333 +G1 X118.491000 Y93.472000 +G1 X118.194667 Y93.556667 +G1 X117.940667 Y93.556667 +G0 Z#100 +(polygon end, distance 57.32) +(polygon 32) +G0 X123.020667 Y93.556667 (start point) +G1 Z#101 F#102 +F#103 +G1 X122.766667 Y93.472000 +G1 X122.385667 Y93.091000 +G1 X122.301000 Y92.752333 +G1 X122.343333 Y92.371333 +G1 X122.597333 Y92.032667 +G1 X122.893667 Y91.863333 +G1 X123.444000 Y91.863333 +G1 X123.782667 Y92.075000 +G1 X123.994333 Y92.413667 +G1 X123.994333 Y92.964000 +G1 X123.782667 Y93.302667 +G1 X123.444000 Y93.514333 +G1 X123.020667 Y93.556667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 33) +G0 X19.515667 Y92.921667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y92.837000 +G1 X18.880667 Y92.456000 +G1 X18.796000 Y92.117333 +G1 X18.838333 Y91.736333 +G1 X19.092333 Y91.397667 +G1 X19.388667 Y91.228333 +G1 X19.939000 Y91.228333 +G1 X20.277667 Y91.440000 +G1 X20.489333 Y91.778667 +G1 X20.489333 Y92.329000 +G1 X20.277667 Y92.667667 +G1 X19.939000 Y92.879333 +G1 X19.515667 Y92.921667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 34) +G0 X129.286000 Y91.651667 (start point) +G1 Z#101 F#102 +F#103 +G1 X129.286000 Y89.916000 +G1 X131.021667 Y89.916000 +G1 X131.021667 Y91.651667 +G1 X129.286000 Y91.651667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 35) +G0 X100.160667 Y91.016667 (start point) +G1 Z#101 F#102 +F#103 +G1 X99.906667 Y90.932000 +G1 X99.525667 Y90.551000 +G1 X99.441000 Y90.212333 +G1 X99.483333 Y89.831333 +G1 X99.737333 Y89.492667 +G1 X100.033667 Y89.323333 +G1 X100.541667 Y89.281000 +G1 X101.346000 Y88.519000 +G1 X101.515333 Y88.434333 +G1 X104.648000 Y88.434333 +G1 X104.986667 Y88.095667 +G1 X105.325333 Y88.011000 +G1 X105.706333 Y88.053333 +G1 X106.045000 Y88.307333 +G1 X106.214333 Y88.603667 +G1 X106.214333 Y89.154000 +G1 X106.045000 Y89.450333 +G1 X105.706333 Y89.704333 +G1 X105.325333 Y89.746667 +G1 X104.986667 Y89.662000 +G1 X104.648000 Y89.323333 +G1 X101.727000 Y89.323333 +G1 X101.176667 Y89.916000 +G1 X101.134333 Y90.424000 +G1 X100.922667 Y90.762667 +G1 X100.584000 Y90.974333 +G1 X100.160667 Y91.016667 +G0 Z#100 +(polygon end, distance 17.21) +(polygon 36) +G0 X14.435667 Y90.381667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y90.297000 +G1 X13.800667 Y89.916000 +G1 X13.716000 Y89.577333 +G1 X13.758333 Y89.196333 +G1 X14.012333 Y88.857667 +G1 X14.308667 Y88.688333 +G1 X14.859000 Y88.688333 +G1 X15.197667 Y88.900000 +G1 X15.409333 Y89.238667 +G1 X15.409333 Y89.789000 +G1 X15.197667 Y90.127667 +G1 X14.859000 Y90.339333 +G1 X14.435667 Y90.381667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 37) +G0 X44.915667 Y90.127667 (start point) +G1 Z#101 F#102 +F#103 +G1 X44.661667 Y89.916000 +G1 X44.450000 Y89.662000 +G1 X44.450000 Y89.365667 +G1 X44.661667 Y89.111667 +G1 X44.915667 Y88.900000 +G1 X45.169667 Y88.900000 +G1 X45.423667 Y89.027000 +G1 X45.635333 Y89.281000 +G1 X77.385333 Y89.281000 +G1 X80.391000 Y86.233000 +G1 X80.391000 Y85.894333 +G1 X80.010000 Y85.682667 +G1 X79.798333 Y85.344000 +G1 X79.798333 Y84.793667 +G1 X80.010000 Y84.455000 +G1 X80.348667 Y84.243333 +G1 X80.899000 Y84.243333 +G1 X81.237667 Y84.455000 +G1 X81.449333 Y84.793667 +G1 X81.449333 Y85.344000 +G1 X81.237667 Y85.682667 +G1 X80.856667 Y85.894333 +G1 X80.856667 Y86.402333 +G1 X77.512333 Y89.746667 +G1 X45.635333 Y89.746667 +G1 X45.423667 Y90.000667 +G1 X45.169667 Y90.127667 +G1 X44.915667 Y90.127667 +G0 Z#100 +(polygon end, distance 81.76) +(polygon 38) +G0 X37.295667 Y88.857667 (start point) +G1 Z#101 F#102 +F#103 +G1 X37.041667 Y88.646000 +G1 X36.830000 Y88.392000 +G1 X36.830000 Y88.095667 +G1 X37.041667 Y87.841667 +G1 X37.295667 Y87.630000 +G1 X37.549667 Y87.630000 +G1 X37.803667 Y87.757000 +G1 X38.015333 Y88.011000 +G1 X51.943000 Y88.011000 +G1 X52.451000 Y87.545333 +G1 X52.451000 Y85.894333 +G1 X52.070000 Y85.682667 +G1 X51.858333 Y85.344000 +G1 X51.858333 Y84.793667 +G1 X52.070000 Y84.455000 +G1 X52.408667 Y84.243333 +G1 X52.959000 Y84.243333 +G1 X53.297667 Y84.455000 +G1 X53.509333 Y84.793667 +G1 X53.509333 Y85.344000 +G1 X53.297667 Y85.682667 +G1 X52.916667 Y85.894333 +G1 X52.916667 Y87.672333 +G1 X52.112333 Y88.476667 +G1 X38.015333 Y88.476667 +G1 X37.803667 Y88.730667 +G1 X37.549667 Y88.857667 +G1 X37.295667 Y88.857667 +G0 Z#100 +(polygon end, distance 41.56) +(polygon 39) +G0 X67.775667 Y88.222667 (start point) +G1 Z#101 F#102 +F#103 +G1 X67.521667 Y88.053333 +G1 X67.352333 Y87.841667 +G1 X55.160333 Y87.841667 +G1 X53.721000 Y86.402333 +G1 X53.721000 Y83.862333 +G1 X52.578000 Y82.761667 +G1 X46.905333 Y82.761667 +G1 X46.693667 Y83.015667 +G1 X46.439667 Y83.142667 +G1 X46.185667 Y83.142667 +G1 X45.931667 Y82.931000 +G1 X45.720000 Y82.677000 +G1 X45.720000 Y82.380667 +G1 X45.931667 Y82.126667 +G1 X46.185667 Y81.915000 +G1 X46.439667 Y81.915000 +G1 X46.693667 Y82.042000 +G1 X46.905333 Y82.296000 +G1 X52.747333 Y82.296000 +G1 X54.186667 Y83.735333 +G1 X54.186667 Y86.275333 +G1 X55.329667 Y87.376000 +G1 X67.352333 Y87.376000 +G1 X67.564000 Y87.122000 +G1 X67.818000 Y86.995000 +G1 X68.072000 Y86.995000 +G1 X68.326000 Y87.206667 +G1 X68.537667 Y87.460667 +G1 X68.537667 Y87.757000 +G1 X68.326000 Y88.011000 +G1 X68.072000 Y88.222667 +G1 X67.775667 Y88.222667 +G0 Z#100 +(polygon end, distance 54.77) +(polygon 40) +G0 X99.483333 Y87.926333 (start point) +G1 Z#101 F#102 +F#103 +G1 X99.060000 Y87.714667 +G1 X98.213333 Y86.825667 +G1 X98.086333 Y86.444667 +G1 X98.128667 Y84.793667 +G1 X98.382667 Y84.412667 +G1 X98.763667 Y84.158667 +G1 X99.314000 Y84.158667 +G1 X99.695000 Y84.412667 +G1 X99.949000 Y84.793667 +G1 X100.033667 Y85.979000 +G1 X103.081667 Y86.021333 +G1 X104.902000 Y84.243333 +G1 X105.283000 Y84.116333 +G1 X106.934000 Y84.158667 +G1 X107.315000 Y84.412667 +G1 X107.569000 Y84.793667 +G1 X107.569000 Y85.344000 +G1 X107.315000 Y85.725000 +G1 X106.934000 Y85.979000 +G1 X105.791000 Y86.021333 +G1 X104.013000 Y87.757000 +G1 X103.674333 Y87.926333 +G1 X99.483333 Y87.926333 +G0 Z#100 +(polygon end, distance 25.55) +(polygon 41) +G0 X14.435667 Y87.841667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y87.757000 +G1 X13.800667 Y87.376000 +G1 X13.716000 Y87.037333 +G1 X13.758333 Y86.656333 +G1 X14.012333 Y86.317667 +G1 X14.308667 Y86.148333 +G1 X14.859000 Y86.148333 +G1 X15.197667 Y86.360000 +G1 X15.409333 Y86.698667 +G1 X15.409333 Y87.249000 +G1 X15.197667 Y87.587667 +G1 X14.859000 Y87.799333 +G1 X14.435667 Y87.841667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 42) +G0 X16.975667 Y87.841667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y87.757000 +G1 X16.340667 Y87.376000 +G1 X16.256000 Y87.037333 +G1 X16.298333 Y86.656333 +G1 X16.552333 Y86.317667 +G1 X16.848667 Y86.148333 +G1 X17.399000 Y86.148333 +G1 X17.737667 Y86.360000 +G1 X17.949333 Y86.698667 +G1 X17.949333 Y87.249000 +G1 X17.737667 Y87.587667 +G1 X17.399000 Y87.799333 +G1 X16.975667 Y87.841667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 43) +G0 X75.988333 Y87.587667 (start point) +G1 Z#101 F#102 +F#103 +G1 X75.565000 Y87.418333 +G1 X75.311000 Y87.206667 +G1 X75.099333 Y86.952667 +G1 X64.092667 Y86.952667 +G1 X63.754000 Y87.164333 +G1 X63.203667 Y87.164333 +G1 X62.865000 Y86.952667 +G1 X62.653333 Y86.614000 +G1 X62.653333 Y86.063667 +G1 X62.865000 Y85.725000 +G1 X63.203667 Y85.513333 +G1 X63.754000 Y85.513333 +G1 X64.092667 Y85.725000 +G1 X75.099333 Y85.725000 +G1 X75.480333 Y85.301667 +G1 X75.861333 Y85.132333 +G1 X76.496333 Y85.132333 +G1 X76.877333 Y85.301667 +G1 X77.216000 Y85.640333 +G1 X77.385333 Y86.021333 +G1 X77.385333 Y86.656333 +G1 X77.216000 Y87.037333 +G1 X76.877333 Y87.376000 +G1 X76.496333 Y87.545333 +G1 X75.988333 Y87.587667 +G0 Z#100 +(polygon end, distance 32.57) +(polygon 44) +G0 X124.968000 Y87.418333 (start point) +G1 Z#101 F#102 +F#103 +G1 X124.714000 Y87.249000 +G1 X123.444000 Y85.936667 +G1 X122.301000 Y85.936667 +G1 X122.301000 Y84.201000 +G1 X124.036667 Y84.201000 +G1 X124.036667 Y85.344000 +G1 X125.264333 Y86.529333 +G1 X129.370667 Y86.529333 +G1 X130.556000 Y85.301667 +G1 X130.556000 Y84.201000 +G1 X132.291667 Y84.201000 +G1 X132.291667 Y84.624333 +G1 X138.938000 Y84.624333 +G1 X139.276667 Y84.285667 +G1 X139.615333 Y84.201000 +G1 X139.996333 Y84.243333 +G1 X140.335000 Y84.497333 +G1 X140.504333 Y84.793667 +G1 X140.504333 Y85.344000 +G1 X140.335000 Y85.640333 +G1 X139.996333 Y85.894333 +G1 X139.615333 Y85.936667 +G1 X139.276667 Y85.852000 +G1 X138.938000 Y85.513333 +G1 X132.291667 Y85.513333 +G1 X132.291667 Y85.936667 +G1 X131.148667 Y85.936667 +G1 X129.836333 Y87.291333 +G1 X129.582333 Y87.418333 +G1 X124.968000 Y87.418333 +G0 Z#100 +(polygon end, distance 44.81) +(polygon 45) +G0 X160.993667 Y86.825667 (start point) +G1 Z#101 F#102 +F#103 +G1 X160.612667 Y86.698667 +G1 X160.189333 Y86.487000 +G1 X159.723667 Y86.021333 +G1 X159.512000 Y85.598000 +G1 X159.385000 Y85.174667 +G1 X159.385000 Y84.709000 +G1 X159.512000 Y84.285667 +G1 X159.723667 Y83.862333 +G1 X160.189333 Y83.396667 +G1 X160.612667 Y83.185000 +G1 X161.036000 Y83.058000 +G1 X161.501667 Y83.058000 +G1 X161.925000 Y83.185000 +G1 X162.348333 Y83.396667 +G1 X162.814000 Y83.862333 +G1 X163.025667 Y84.285667 +G1 X163.152667 Y84.709000 +G1 X163.152667 Y85.174667 +G1 X163.025667 Y85.598000 +G1 X162.814000 Y86.021333 +G1 X162.348333 Y86.487000 +G1 X161.925000 Y86.698667 +G1 X161.501667 Y86.825667 +G1 X160.993667 Y86.825667 +G0 Z#100 +(polygon end, distance 11.82) +(polygon 46) +G0 X128.693333 Y86.021333 (start point) +G1 Z#101 F#102 +F#103 +G1 X128.270000 Y85.809667 +G1 X128.058333 Y85.513333 +G1 X127.931333 Y85.217000 +G1 X127.931333 Y83.608333 +G1 X128.100667 Y83.269667 +G1 X134.366000 Y76.962000 +G1 X134.366000 Y76.581000 +G1 X135.001000 Y76.538667 +G1 X135.466667 Y76.538667 +G1 X136.101667 Y76.581000 +G1 X136.144000 Y77.216000 +G1 X136.144000 Y77.681667 +G1 X136.101667 Y78.316667 +G1 X135.678333 Y78.316667 +G1 X129.836333 Y84.201000 +G1 X129.794000 Y85.344000 +G1 X129.540000 Y85.725000 +G1 X129.159000 Y85.979000 +G1 X128.693333 Y86.021333 +G0 Z#100 +(polygon end, distance 27.14) +(polygon 47) +G0 X24.595667 Y85.936667 (start point) +G1 Z#101 F#102 +F#103 +G1 X24.341667 Y85.852000 +G1 X23.960667 Y85.471000 +G1 X23.876000 Y85.132333 +G1 X23.918333 Y84.751333 +G1 X24.172333 Y84.412667 +G1 X24.468667 Y84.243333 +G1 X25.019000 Y84.243333 +G1 X25.357667 Y84.455000 +G1 X25.569333 Y84.793667 +G1 X25.569333 Y85.344000 +G1 X25.357667 Y85.682667 +G1 X25.019000 Y85.894333 +G1 X24.595667 Y85.936667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 48) +G0 X27.135667 Y85.936667 (start point) +G1 Z#101 F#102 +F#103 +G1 X26.881667 Y85.852000 +G1 X26.500667 Y85.471000 +G1 X26.416000 Y85.132333 +G1 X26.458333 Y84.751333 +G1 X26.712333 Y84.412667 +G1 X27.008667 Y84.243333 +G1 X27.559000 Y84.243333 +G1 X27.897667 Y84.455000 +G1 X28.109333 Y84.793667 +G1 X28.109333 Y85.344000 +G1 X27.897667 Y85.682667 +G1 X27.559000 Y85.894333 +G1 X27.135667 Y85.936667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 49) +G0 X49.995667 Y85.936667 (start point) +G1 Z#101 F#102 +F#103 +G1 X49.741667 Y85.852000 +G1 X49.360667 Y85.471000 +G1 X49.276000 Y85.132333 +G1 X49.318333 Y84.751333 +G1 X49.572333 Y84.412667 +G1 X49.868667 Y84.243333 +G1 X50.419000 Y84.243333 +G1 X50.757667 Y84.455000 +G1 X50.969333 Y84.793667 +G1 X50.969333 Y85.344000 +G1 X50.757667 Y85.682667 +G1 X50.419000 Y85.894333 +G1 X49.995667 Y85.936667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 50) +G0 X55.075667 Y85.936667 (start point) +G1 Z#101 F#102 +F#103 +G1 X54.821667 Y85.852000 +G1 X54.440667 Y85.471000 +G1 X54.356000 Y85.132333 +G1 X54.398333 Y84.751333 +G1 X54.652333 Y84.412667 +G1 X54.948667 Y84.243333 +G1 X55.499000 Y84.243333 +G1 X55.837667 Y84.455000 +G1 X56.049333 Y84.793667 +G1 X56.049333 Y85.344000 +G1 X55.837667 Y85.682667 +G1 X55.499000 Y85.894333 +G1 X55.075667 Y85.936667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 51) +G0 X56.896000 Y85.936667 (start point) +G1 Z#101 F#102 +F#103 +G1 X56.896000 Y84.201000 +G1 X58.631667 Y84.201000 +G1 X58.631667 Y85.936667 +G1 X56.896000 Y85.936667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 52) +G0 X77.935667 Y85.936667 (start point) +G1 Z#101 F#102 +F#103 +G1 X77.681667 Y85.852000 +G1 X77.300667 Y85.471000 +G1 X77.216000 Y85.132333 +G1 X77.258333 Y84.751333 +G1 X77.512333 Y84.412667 +G1 X77.808667 Y84.243333 +G1 X78.359000 Y84.243333 +G1 X78.697667 Y84.455000 +G1 X78.909333 Y84.793667 +G1 X78.909333 Y85.344000 +G1 X78.697667 Y85.682667 +G1 X78.359000 Y85.894333 +G1 X77.935667 Y85.936667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 53) +G0 X84.836000 Y85.936667 (start point) +G1 Z#101 F#102 +F#103 +G1 X84.836000 Y84.201000 +G1 X86.571667 Y84.201000 +G1 X86.571667 Y85.936667 +G1 X84.836000 Y85.936667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 54) +G0 X100.711000 Y85.936667 (start point) +G1 Z#101 F#102 +F#103 +G1 X100.711000 Y84.201000 +G1 X102.446667 Y84.201000 +G1 X102.446667 Y85.936667 +G1 X100.711000 Y85.936667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 55) +G0 X108.331000 Y85.936667 (start point) +G1 Z#101 F#102 +F#103 +G1 X108.331000 Y84.201000 +G1 X110.066667 Y84.201000 +G1 X110.066667 Y85.936667 +G1 X108.331000 Y85.936667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 56) +G0 X115.400667 Y85.936667 (start point) +G1 Z#101 F#102 +F#103 +G1 X115.146667 Y85.852000 +G1 X114.765667 Y85.471000 +G1 X114.681000 Y85.132333 +G1 X114.723333 Y84.751333 +G1 X114.977333 Y84.412667 +G1 X115.273667 Y84.243333 +G1 X115.824000 Y84.243333 +G1 X116.162667 Y84.455000 +G1 X116.374333 Y84.793667 +G1 X116.374333 Y85.344000 +G1 X116.162667 Y85.682667 +G1 X115.824000 Y85.894333 +G1 X115.400667 Y85.936667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 57) +G0 X117.940667 Y85.936667 (start point) +G1 Z#101 F#102 +F#103 +G1 X117.686667 Y85.852000 +G1 X117.305667 Y85.471000 +G1 X117.221000 Y85.132333 +G1 X117.263333 Y84.751333 +G1 X117.517333 Y84.412667 +G1 X117.813667 Y84.243333 +G1 X118.364000 Y84.243333 +G1 X118.702667 Y84.455000 +G1 X118.914333 Y84.793667 +G1 X118.914333 Y85.344000 +G1 X118.702667 Y85.682667 +G1 X118.364000 Y85.894333 +G1 X117.940667 Y85.936667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 58) +G0 X120.480667 Y85.936667 (start point) +G1 Z#101 F#102 +F#103 +G1 X120.226667 Y85.852000 +G1 X119.845667 Y85.471000 +G1 X119.761000 Y85.132333 +G1 X119.803333 Y84.751333 +G1 X120.057333 Y84.412667 +G1 X120.353667 Y84.243333 +G1 X120.904000 Y84.243333 +G1 X121.242667 Y84.455000 +G1 X121.454333 Y84.793667 +G1 X121.454333 Y85.344000 +G1 X121.242667 Y85.682667 +G1 X120.904000 Y85.894333 +G1 X120.480667 Y85.936667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 59) +G0 X14.435667 Y85.301667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y85.217000 +G1 X13.800667 Y84.836000 +G1 X13.716000 Y84.497333 +G1 X13.758333 Y84.116333 +G1 X14.012333 Y83.777667 +G1 X14.308667 Y83.608333 +G1 X14.859000 Y83.608333 +G1 X15.197667 Y83.820000 +G1 X15.409333 Y84.158667 +G1 X15.409333 Y84.709000 +G1 X15.197667 Y85.047667 +G1 X14.859000 Y85.259333 +G1 X14.435667 Y85.301667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 60) +G0 X16.975667 Y85.301667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y85.217000 +G1 X16.340667 Y84.836000 +G1 X16.256000 Y84.497333 +G1 X16.298333 Y84.116333 +G1 X16.552333 Y83.777667 +G1 X16.848667 Y83.608333 +G1 X17.399000 Y83.608333 +G1 X17.737667 Y83.820000 +G1 X17.949333 Y84.158667 +G1 X17.949333 Y84.709000 +G1 X17.737667 Y85.047667 +G1 X17.399000 Y85.259333 +G1 X16.975667 Y85.301667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 61) +G0 X19.515667 Y85.301667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y85.217000 +G1 X18.880667 Y84.836000 +G1 X18.796000 Y84.497333 +G1 X18.838333 Y84.116333 +G1 X19.092333 Y83.777667 +G1 X19.388667 Y83.608333 +G1 X19.939000 Y83.608333 +G1 X20.277667 Y83.820000 +G1 X20.489333 Y84.158667 +G1 X20.489333 Y84.709000 +G1 X20.277667 Y85.047667 +G1 X19.939000 Y85.259333 +G1 X19.515667 Y85.301667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 62) +G0 X62.780333 Y85.301667 (start point) +G1 Z#101 F#102 +F#103 +G1 X60.833000 Y83.396667 +G1 X56.430333 Y83.396667 +G1 X53.848000 Y80.856667 +G1 X32.935333 Y80.856667 +G1 X32.131000 Y80.052333 +G1 X32.131000 Y79.544333 +G1 X31.750000 Y79.332667 +G1 X31.538333 Y78.994000 +G1 X31.538333 Y78.443667 +G1 X31.750000 Y78.105000 +G1 X32.088667 Y77.893333 +G1 X32.639000 Y77.893333 +G1 X32.977667 Y78.105000 +G1 X33.189333 Y78.443667 +G1 X33.189333 Y78.994000 +G1 X32.977667 Y79.332667 +G1 X32.596667 Y79.544333 +G1 X32.596667 Y79.925333 +G1 X33.104667 Y80.391000 +G1 X54.017333 Y80.391000 +G1 X56.599667 Y82.931000 +G1 X61.002333 Y82.931000 +G1 X62.949667 Y84.836000 +G1 X71.035333 Y84.836000 +G1 X71.501000 Y84.328000 +G1 X71.501000 Y82.931000 +G1 X73.236667 Y82.931000 +G1 X73.236667 Y83.566000 +G1 X74.803000 Y83.566000 +G1 X75.480333 Y82.931000 +G1 X83.862333 Y82.931000 +G1 X84.074000 Y82.677000 +G1 X84.328000 Y82.550000 +G1 X84.582000 Y82.550000 +G1 X84.836000 Y82.761667 +G1 X85.047667 Y83.015667 +G1 X85.047667 Y83.312000 +G1 X84.836000 Y83.566000 +G1 X84.582000 Y83.777667 +G1 X84.328000 Y83.777667 +G1 X84.074000 Y83.650667 +G1 X83.862333 Y83.396667 +G1 X75.649667 Y83.396667 +G1 X74.972333 Y84.031667 +G1 X73.236667 Y84.031667 +G1 X73.236667 Y84.666667 +G1 X71.839667 Y84.666667 +G1 X71.162333 Y85.301667 +G1 X62.780333 Y85.301667 +G0 Z#100 +(polygon end, distance 119.95) +(polygon 63) +G0 X36.576000 Y84.666667 (start point) +G1 Z#101 F#102 +F#103 +G1 X36.576000 Y82.931000 +G1 X38.311667 Y82.931000 +G1 X38.311667 Y84.666667 +G1 X36.576000 Y84.666667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 64) +G0 X40.386000 Y84.666667 (start point) +G1 Z#101 F#102 +F#103 +G1 X40.386000 Y82.931000 +G1 X42.121667 Y82.931000 +G1 X42.121667 Y84.666667 +G1 X40.386000 Y84.666667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 65) +G0 X44.915667 Y84.666667 (start point) +G1 Z#101 F#102 +F#103 +G1 X44.661667 Y84.582000 +G1 X44.280667 Y84.201000 +G1 X44.196000 Y83.862333 +G1 X44.238333 Y83.481333 +G1 X44.492333 Y83.142667 +G1 X44.788667 Y82.973333 +G1 X45.339000 Y82.973333 +G1 X45.677667 Y83.185000 +G1 X45.889333 Y83.523667 +G1 X45.889333 Y84.074000 +G1 X45.677667 Y84.412667 +G1 X45.339000 Y84.624333 +G1 X44.915667 Y84.666667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 66) +G0 X63.330667 Y84.666667 (start point) +G1 Z#101 F#102 +F#103 +G1 X63.076667 Y84.582000 +G1 X62.695667 Y84.201000 +G1 X62.611000 Y83.862333 +G1 X62.653333 Y83.481333 +G1 X62.907333 Y83.142667 +G1 X63.203667 Y82.973333 +G1 X63.754000 Y82.973333 +G1 X64.092667 Y83.185000 +G1 X64.304333 Y83.566000 +G1 X67.056000 Y83.566000 +G1 X67.056000 Y82.931000 +G1 X68.791667 Y82.931000 +G1 X68.791667 Y84.666667 +G1 X67.056000 Y84.666667 +G1 X67.056000 Y84.031667 +G1 X64.304333 Y84.031667 +G1 X64.092667 Y84.412667 +G1 X63.754000 Y84.624333 +G1 X63.330667 Y84.666667 +G0 Z#100 +(polygon end, distance 16.93) +(polygon 67) +G0 X92.540667 Y84.666667 (start point) +G1 Z#101 F#102 +F#103 +G1 X92.329000 Y84.582000 +G1 X92.032667 Y84.370333 +G1 X91.863333 Y84.074000 +G1 X91.821000 Y83.735333 +G1 X91.905667 Y83.396667 +G1 X92.244333 Y83.058000 +G1 X92.244333 Y82.338333 +G1 X61.044667 Y82.338333 +G1 X60.706000 Y82.677000 +G1 X60.367333 Y82.761667 +G1 X59.986333 Y82.719333 +G1 X59.647667 Y82.465333 +G1 X59.478333 Y82.169000 +G1 X59.478333 Y81.618667 +G1 X59.647667 Y81.322333 +G1 X59.986333 Y81.068333 +G1 X60.367333 Y81.026000 +G1 X60.706000 Y81.110667 +G1 X61.044667 Y81.449333 +G1 X85.259333 Y81.449333 +G1 X85.259333 Y79.459667 +G1 X84.920667 Y79.121000 +G1 X84.836000 Y78.782333 +G1 X84.878333 Y78.401333 +G1 X85.132333 Y78.062667 +G1 X85.428667 Y77.893333 +G1 X85.979000 Y77.893333 +G1 X86.275333 Y78.062667 +G1 X86.529333 Y78.401333 +G1 X86.571667 Y78.782333 +G1 X86.487000 Y79.121000 +G1 X86.148333 Y79.459667 +G1 X86.148333 Y81.449333 +G1 X102.743000 Y81.449333 +G1 X103.081667 Y81.110667 +G1 X103.420333 Y81.026000 +G1 X103.801333 Y81.068333 +G1 X104.140000 Y81.322333 +G1 X104.182333 Y81.449333 +G1 X108.458000 Y81.449333 +G1 X108.796667 Y81.110667 +G1 X109.135333 Y81.026000 +G1 X109.516333 Y81.068333 +G1 X109.855000 Y81.322333 +G1 X110.024333 Y81.618667 +G1 X110.024333 Y82.169000 +G1 X109.855000 Y82.465333 +G1 X109.516333 Y82.719333 +G1 X109.135333 Y82.761667 +G1 X108.796667 Y82.677000 +G1 X108.458000 Y82.338333 +G1 X104.182333 Y82.338333 +G1 X104.140000 Y82.465333 +G1 X103.801333 Y82.719333 +G1 X103.420333 Y82.761667 +G1 X103.081667 Y82.677000 +G1 X102.743000 Y82.338333 +G1 X93.133333 Y82.338333 +G1 X93.133333 Y83.058000 +G1 X93.472000 Y83.396667 +G1 X93.556667 Y83.735333 +G1 X93.514333 Y84.116333 +G1 X93.260333 Y84.455000 +G1 X92.964000 Y84.624333 +G1 X92.540667 Y84.666667 +G0 Z#100 +(polygon end, distance 117.14) +(polygon 68) +G0 X14.435667 Y82.761667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y82.677000 +G1 X13.800667 Y82.296000 +G1 X13.716000 Y81.999667 +G1 X13.716000 Y81.745667 +G1 X13.843000 Y81.491667 +G1 X13.081000 Y80.687333 +G1 X13.081000 Y63.415333 +G1 X13.885333 Y62.611000 +G1 X20.193000 Y62.611000 +G1 X22.775333 Y60.071000 +G1 X38.142333 Y60.071000 +G1 X38.354000 Y59.817000 +G1 X38.608000 Y59.690000 +G1 X38.862000 Y59.690000 +G1 X39.116000 Y59.901667 +G1 X39.327667 Y60.155667 +G1 X39.327667 Y60.452000 +G1 X39.116000 Y60.706000 +G1 X38.862000 Y60.917667 +G1 X38.608000 Y60.917667 +G1 X38.354000 Y60.790667 +G1 X38.142333 Y60.536667 +G1 X22.944667 Y60.536667 +G1 X20.362333 Y63.076667 +G1 X14.054667 Y63.076667 +G1 X13.546667 Y63.542333 +G1 X13.546667 Y80.518000 +G1 X14.139333 Y81.153000 +G1 X14.478000 Y81.026000 +G1 X14.859000 Y81.068333 +G1 X15.197667 Y81.280000 +G1 X15.409333 Y81.618667 +G1 X15.409333 Y82.169000 +G1 X15.197667 Y82.507667 +G1 X14.859000 Y82.719333 +G1 X14.435667 Y82.761667 +G0 Z#100 +(polygon end, distance 96.80) +(polygon 69) +G0 X16.975667 Y82.761667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y82.677000 +G1 X16.340667 Y82.296000 +G1 X16.256000 Y81.957333 +G1 X16.298333 Y81.618667 +G1 X16.467667 Y81.322333 +G1 X16.764000 Y81.110667 +G1 X16.764000 Y80.137000 +G1 X16.467667 Y79.925333 +G1 X16.298333 Y79.629000 +G1 X16.256000 Y79.290333 +G1 X16.340667 Y78.951667 +G1 X16.764000 Y78.528333 +G1 X16.764000 Y78.443667 +G1 X15.113000 Y78.443667 +G1 X14.181667 Y77.554667 +G1 X13.800667 Y77.216000 +G1 X13.716000 Y76.877333 +G1 X13.758333 Y76.496333 +G1 X14.012333 Y76.157667 +G1 X14.308667 Y75.988333 +G1 X14.647333 Y75.946000 +G1 X14.986000 Y76.030667 +G1 X15.367000 Y76.411667 +G1 X15.451667 Y76.750333 +G1 X15.409333 Y77.131333 +G1 X15.113000 Y77.512333 +G1 X15.367000 Y77.724000 +G1 X20.193000 Y77.724000 +G1 X24.511000 Y73.363667 +G1 X24.426333 Y73.109667 +G1 X24.468667 Y72.728667 +G1 X24.722667 Y72.347667 +G1 X25.103667 Y72.093667 +G1 X39.031333 Y72.051333 +G1 X39.073667 Y70.823667 +G1 X39.327667 Y70.442667 +G1 X39.708667 Y70.188667 +G1 X40.259000 Y70.188667 +G1 X40.640000 Y70.442667 +G1 X40.894000 Y70.823667 +G1 X40.936333 Y72.051333 +G1 X59.266667 Y72.051333 +G1 X59.774667 Y71.585667 +G1 X60.113333 Y71.416333 +G1 X75.141667 Y71.416333 +G1 X76.327000 Y70.273333 +G1 X76.708000 Y70.146333 +G1 X78.359000 Y70.188667 +G1 X78.740000 Y70.442667 +G1 X78.994000 Y70.823667 +G1 X78.994000 Y71.374000 +G1 X78.740000 Y71.755000 +G1 X78.359000 Y72.009000 +G1 X77.216000 Y72.051333 +G1 X76.073000 Y73.152000 +G1 X75.734333 Y73.321333 +G1 X60.706000 Y73.321333 +G1 X60.198000 Y73.787000 +G1 X59.859333 Y73.956333 +G1 X56.176333 Y73.956333 +G1 X56.134000 Y78.994000 +G1 X55.880000 Y79.375000 +G1 X55.499000 Y79.629000 +G1 X54.948667 Y79.629000 +G1 X54.567667 Y79.375000 +G1 X54.313667 Y78.994000 +G1 X54.271333 Y73.956333 +G1 X25.230667 Y73.956333 +G1 X25.019000 Y73.871667 +G1 X20.404667 Y78.443667 +G1 X17.483667 Y78.443667 +G1 X17.483667 Y78.528333 +G1 X17.907000 Y78.951667 +G1 X17.991667 Y79.290333 +G1 X17.949333 Y79.629000 +G1 X17.780000 Y79.925333 +G1 X17.483667 Y80.137000 +G1 X17.483667 Y81.068333 +G1 X17.907000 Y81.491667 +G1 X17.991667 Y81.830333 +G1 X17.949333 Y82.211333 +G1 X17.695333 Y82.550000 +G1 X17.399000 Y82.719333 +G1 X16.975667 Y82.761667 +G0 Z#100 +(polygon end, distance 164.34) +(polygon 70) +G0 X19.515667 Y82.761667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y82.677000 +G1 X18.880667 Y82.296000 +G1 X18.796000 Y81.957333 +G1 X18.838333 Y81.576333 +G1 X19.092333 Y81.237667 +G1 X19.388667 Y81.068333 +G1 X19.939000 Y81.068333 +G1 X20.277667 Y81.280000 +G1 X20.489333 Y81.618667 +G1 X20.489333 Y82.169000 +G1 X20.277667 Y82.507667 +G1 X19.939000 Y82.719333 +G1 X19.515667 Y82.761667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 71) +G0 X24.595667 Y82.507667 (start point) +G1 Z#101 F#102 +F#103 +G1 X24.341667 Y82.296000 +G1 X24.130000 Y82.042000 +G1 X24.130000 Y81.745667 +G1 X24.341667 Y81.491667 +G1 X24.595667 Y81.280000 +G1 X24.849667 Y81.280000 +G1 X25.103667 Y81.407000 +G1 X25.315333 Y81.661000 +G1 X44.492333 Y81.661000 +G1 X44.704000 Y81.407000 +G1 X44.958000 Y81.280000 +G1 X45.212000 Y81.280000 +G1 X45.466000 Y81.491667 +G1 X45.677667 Y81.745667 +G1 X45.677667 Y82.042000 +G1 X45.466000 Y82.296000 +G1 X45.212000 Y82.507667 +G1 X44.958000 Y82.507667 +G1 X44.704000 Y82.380667 +G1 X44.492333 Y82.126667 +G1 X25.315333 Y82.126667 +G1 X25.103667 Y82.380667 +G1 X24.849667 Y82.507667 +G1 X24.595667 Y82.507667 +G0 Z#100 +(polygon end, distance 45.07) +(polygon 72) +G0 X86.825667 Y81.237667 (start point) +G1 Z#101 F#102 +F#103 +G1 X86.571667 Y81.026000 +G1 X86.360000 Y80.772000 +G1 X86.360000 Y80.475667 +G1 X86.571667 Y80.221667 +G1 X86.825667 Y80.010000 +G1 X87.079667 Y80.010000 +G1 X87.333667 Y80.137000 +G1 X87.545333 Y80.391000 +G1 X101.007333 Y80.391000 +G1 X101.219000 Y80.137000 +G1 X101.473000 Y80.010000 +G1 X101.727000 Y80.010000 +G1 X101.981000 Y80.221667 +G1 X102.192667 Y80.475667 +G1 X102.192667 Y80.772000 +G1 X101.981000 Y81.026000 +G1 X101.727000 Y81.237667 +G1 X101.473000 Y81.237667 +G1 X101.219000 Y81.110667 +G1 X101.007333 Y80.856667 +G1 X87.545333 Y80.856667 +G1 X87.333667 Y81.110667 +G1 X87.079667 Y81.237667 +G1 X86.825667 Y81.237667 +G0 Z#100 +(polygon end, distance 33.64) +(polygon 73) +G0 X67.056000 Y80.856667 (start point) +G1 Z#101 F#102 +F#103 +G1 X67.056000 Y79.121000 +G1 X68.791667 Y79.121000 +G1 X68.791667 Y79.756000 +G1 X69.723000 Y79.756000 +G1 X71.670333 Y77.851000 +G1 X74.803000 Y77.851000 +G1 X77.385333 Y75.311000 +G1 X83.862333 Y75.311000 +G1 X84.074000 Y75.057000 +G1 X84.328000 Y74.930000 +G1 X84.582000 Y74.930000 +G1 X84.836000 Y75.141667 +G1 X85.047667 Y75.395667 +G1 X85.047667 Y75.692000 +G1 X84.836000 Y75.946000 +G1 X84.582000 Y76.157667 +G1 X84.328000 Y76.157667 +G1 X84.074000 Y76.030667 +G1 X83.862333 Y75.776667 +G1 X77.554667 Y75.776667 +G1 X74.972333 Y78.316667 +G1 X71.839667 Y78.316667 +G1 X69.892333 Y80.221667 +G1 X68.791667 Y80.221667 +G1 X68.791667 Y80.856667 +G1 X67.056000 Y80.856667 +G0 Z#100 +(polygon end, distance 43.61) +(polygon 74) +G0 X71.501000 Y80.856667 (start point) +G1 Z#101 F#102 +F#103 +G1 X71.501000 Y79.121000 +G1 X73.236667 Y79.121000 +G1 X73.236667 Y79.756000 +G1 X74.845333 Y79.756000 +G1 X77.851000 Y76.708000 +G1 X77.851000 Y76.581000 +G1 X107.357333 Y76.581000 +G1 X107.569000 Y76.327000 +G1 X107.823000 Y76.200000 +G1 X108.077000 Y76.200000 +G1 X108.331000 Y76.411667 +G1 X108.542667 Y76.665667 +G1 X108.542667 Y76.962000 +G1 X108.331000 Y77.216000 +G1 X108.077000 Y77.427667 +G1 X107.823000 Y77.427667 +G1 X107.569000 Y77.300667 +G1 X107.357333 Y77.046667 +G1 X78.189667 Y77.046667 +G1 X74.972333 Y80.221667 +G1 X73.236667 Y80.221667 +G1 X73.236667 Y80.856667 +G1 X71.501000 Y80.856667 +G0 Z#100 +(polygon end, distance 80.78) +(polygon 75) +G0 X14.435667 Y80.221667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y80.137000 +G1 X13.800667 Y79.756000 +G1 X13.716000 Y79.417333 +G1 X13.758333 Y79.036333 +G1 X14.012333 Y78.697667 +G1 X14.308667 Y78.528333 +G1 X14.859000 Y78.528333 +G1 X15.197667 Y78.740000 +G1 X15.409333 Y79.078667 +G1 X15.409333 Y79.629000 +G1 X15.197667 Y79.967667 +G1 X14.859000 Y80.179333 +G1 X14.435667 Y80.221667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 76) +G0 X19.515667 Y80.221667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y80.137000 +G1 X18.880667 Y79.756000 +G1 X18.796000 Y79.417333 +G1 X18.838333 Y79.036333 +G1 X19.092333 Y78.697667 +G1 X19.388667 Y78.528333 +G1 X19.939000 Y78.528333 +G1 X20.277667 Y78.740000 +G1 X20.489333 Y79.078667 +G1 X20.489333 Y79.629000 +G1 X20.277667 Y79.967667 +G1 X19.939000 Y80.179333 +G1 X19.515667 Y80.221667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 77) +G0 X54.525333 Y80.221667 (start point) +G1 Z#101 F#102 +F#103 +G1 X53.721000 Y79.417333 +G1 X53.721000 Y77.554667 +G1 X53.255333 Y77.046667 +G1 X43.264667 Y77.046667 +G1 X42.756667 Y77.512333 +G1 X42.756667 Y77.893333 +G1 X43.137667 Y78.105000 +G1 X43.349333 Y78.443667 +G1 X43.349333 Y78.994000 +G1 X43.137667 Y79.332667 +G1 X42.799000 Y79.544333 +G1 X42.248667 Y79.544333 +G1 X41.910000 Y79.332667 +G1 X41.698333 Y78.994000 +G1 X41.698333 Y78.443667 +G1 X41.910000 Y78.105000 +G1 X42.291000 Y77.893333 +G1 X42.291000 Y77.385333 +G1 X43.095333 Y76.581000 +G1 X53.382333 Y76.581000 +G1 X54.186667 Y77.385333 +G1 X54.186667 Y79.290333 +G1 X54.694667 Y79.756000 +G1 X64.008000 Y79.756000 +G1 X65.955333 Y77.851000 +G1 X69.723000 Y77.851000 +G1 X71.035333 Y76.581000 +G1 X74.168000 Y76.581000 +G1 X76.750333 Y74.041000 +G1 X90.212333 Y74.041000 +G1 X90.424000 Y73.787000 +G1 X90.678000 Y73.660000 +G1 X90.932000 Y73.660000 +G1 X91.186000 Y73.871667 +G1 X91.397667 Y74.125667 +G1 X91.397667 Y74.422000 +G1 X91.186000 Y74.676000 +G1 X90.932000 Y74.887667 +G1 X90.678000 Y74.887667 +G1 X90.424000 Y74.760667 +G1 X90.212333 Y74.506667 +G1 X76.919667 Y74.506667 +G1 X74.337333 Y77.046667 +G1 X71.204667 Y77.046667 +G1 X69.892333 Y78.316667 +G1 X66.124667 Y78.316667 +G1 X64.177333 Y80.221667 +G1 X54.525333 Y80.221667 +G0 Z#100 +(polygon end, distance 114.56) +(polygon 78) +G0 X24.595667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X24.341667 Y79.502000 +G1 X23.960667 Y79.121000 +G1 X23.876000 Y78.782333 +G1 X23.918333 Y78.401333 +G1 X24.172333 Y78.062667 +G1 X24.468667 Y77.893333 +G1 X25.019000 Y77.893333 +G1 X25.357667 Y78.105000 +G1 X25.569333 Y78.443667 +G1 X25.569333 Y78.994000 +G1 X25.357667 Y79.332667 +G1 X25.019000 Y79.544333 +G1 X24.595667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 79) +G0 X27.135667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X26.881667 Y79.502000 +G1 X26.500667 Y79.121000 +G1 X26.416000 Y78.782333 +G1 X26.458333 Y78.401333 +G1 X26.712333 Y78.062667 +G1 X27.008667 Y77.893333 +G1 X27.559000 Y77.893333 +G1 X27.897667 Y78.105000 +G1 X28.109333 Y78.443667 +G1 X28.109333 Y78.994000 +G1 X27.897667 Y79.332667 +G1 X27.559000 Y79.544333 +G1 X27.135667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 80) +G0 X29.675667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X29.421667 Y79.502000 +G1 X29.040667 Y79.121000 +G1 X28.956000 Y78.782333 +G1 X28.998333 Y78.401333 +G1 X29.252333 Y78.062667 +G1 X29.548667 Y77.893333 +G1 X30.099000 Y77.893333 +G1 X30.437667 Y78.105000 +G1 X30.649333 Y78.443667 +G1 X30.649333 Y78.994000 +G1 X30.437667 Y79.332667 +G1 X30.099000 Y79.544333 +G1 X29.675667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 81) +G0 X34.755667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X34.501667 Y79.502000 +G1 X34.120667 Y79.121000 +G1 X34.036000 Y78.782333 +G1 X34.078333 Y78.401333 +G1 X34.332333 Y78.062667 +G1 X34.628667 Y77.893333 +G1 X35.179000 Y77.893333 +G1 X35.517667 Y78.105000 +G1 X35.729333 Y78.443667 +G1 X35.729333 Y78.994000 +G1 X35.517667 Y79.332667 +G1 X35.179000 Y79.544333 +G1 X34.755667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 82) +G0 X37.295667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X37.084000 Y79.502000 +G1 X36.787667 Y79.290333 +G1 X36.618333 Y78.994000 +G1 X36.576000 Y78.655333 +G1 X36.660667 Y78.316667 +G1 X36.999333 Y77.978000 +G1 X36.999333 Y77.597000 +G1 X36.618333 Y77.258333 +G1 X24.849667 Y77.258333 +G1 X24.511000 Y77.597000 +G1 X24.172333 Y77.681667 +G1 X23.791333 Y77.639333 +G1 X23.452667 Y77.385333 +G1 X23.283333 Y77.089000 +G1 X23.283333 Y76.538667 +G1 X23.452667 Y76.242333 +G1 X23.791333 Y75.988333 +G1 X24.172333 Y75.946000 +G1 X24.511000 Y76.030667 +G1 X24.849667 Y76.369333 +G1 X36.872333 Y76.369333 +G1 X37.041667 Y76.454000 +G1 X37.761333 Y77.131333 +G1 X37.888333 Y77.385333 +G1 X37.888333 Y77.978000 +G1 X38.227000 Y78.316667 +G1 X38.311667 Y78.655333 +G1 X38.269333 Y79.036333 +G1 X38.015333 Y79.375000 +G1 X37.719000 Y79.544333 +G1 X37.295667 Y79.586667 +G0 Z#100 +(polygon end, distance 35.74) +(polygon 83) +G0 X39.835667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X39.581667 Y79.502000 +G1 X39.200667 Y79.121000 +G1 X39.116000 Y78.782333 +G1 X39.158333 Y78.401333 +G1 X39.412333 Y78.062667 +G1 X39.708667 Y77.893333 +G1 X40.259000 Y77.893333 +G1 X40.597667 Y78.105000 +G1 X40.809333 Y78.443667 +G1 X40.809333 Y78.994000 +G1 X40.597667 Y79.332667 +G1 X40.259000 Y79.544333 +G1 X39.835667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 84) +G0 X44.915667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X44.661667 Y79.502000 +G1 X44.280667 Y79.121000 +G1 X44.196000 Y78.782333 +G1 X44.238333 Y78.401333 +G1 X44.492333 Y78.062667 +G1 X44.788667 Y77.893333 +G1 X45.339000 Y77.893333 +G1 X45.677667 Y78.105000 +G1 X45.889333 Y78.443667 +G1 X45.889333 Y78.994000 +G1 X45.677667 Y79.332667 +G1 X45.339000 Y79.544333 +G1 X44.915667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 85) +G0 X47.455667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X47.201667 Y79.502000 +G1 X46.820667 Y79.121000 +G1 X46.736000 Y78.782333 +G1 X46.778333 Y78.401333 +G1 X47.032333 Y78.062667 +G1 X47.328667 Y77.893333 +G1 X47.879000 Y77.893333 +G1 X48.217667 Y78.105000 +G1 X48.429333 Y78.443667 +G1 X48.429333 Y78.994000 +G1 X48.217667 Y79.332667 +G1 X47.879000 Y79.544333 +G1 X47.455667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 86) +G0 X49.995667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X49.741667 Y79.502000 +G1 X49.360667 Y79.121000 +G1 X49.276000 Y78.782333 +G1 X49.318333 Y78.401333 +G1 X49.572333 Y78.062667 +G1 X49.868667 Y77.893333 +G1 X50.419000 Y77.893333 +G1 X50.757667 Y78.105000 +G1 X50.969333 Y78.443667 +G1 X50.969333 Y78.994000 +G1 X50.757667 Y79.332667 +G1 X50.419000 Y79.544333 +G1 X49.995667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 87) +G0 X52.535667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X52.281667 Y79.502000 +G1 X51.900667 Y79.121000 +G1 X51.816000 Y78.782333 +G1 X51.858333 Y78.401333 +G1 X52.112333 Y78.062667 +G1 X52.408667 Y77.893333 +G1 X52.959000 Y77.893333 +G1 X53.297667 Y78.105000 +G1 X53.509333 Y78.443667 +G1 X53.509333 Y78.994000 +G1 X53.297667 Y79.332667 +G1 X52.959000 Y79.544333 +G1 X52.535667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 88) +G0 X57.615667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X57.361667 Y79.502000 +G1 X56.980667 Y79.121000 +G1 X56.896000 Y78.782333 +G1 X56.938333 Y78.401333 +G1 X57.192333 Y78.062667 +G1 X57.488667 Y77.893333 +G1 X58.039000 Y77.893333 +G1 X58.377667 Y78.105000 +G1 X58.589333 Y78.443667 +G1 X58.589333 Y78.994000 +G1 X58.377667 Y79.332667 +G1 X58.039000 Y79.544333 +G1 X57.615667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 89) +G0 X77.935667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X77.681667 Y79.502000 +G1 X77.300667 Y79.121000 +G1 X77.216000 Y78.782333 +G1 X77.258333 Y78.401333 +G1 X77.512333 Y78.062667 +G1 X77.808667 Y77.893333 +G1 X78.359000 Y77.893333 +G1 X78.697667 Y78.105000 +G1 X78.909333 Y78.443667 +G1 X78.909333 Y78.994000 +G1 X78.697667 Y79.332667 +G1 X78.359000 Y79.544333 +G1 X77.935667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 90) +G0 X80.475667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X80.221667 Y79.502000 +G1 X79.840667 Y79.121000 +G1 X79.756000 Y78.782333 +G1 X79.798333 Y78.401333 +G1 X80.052333 Y78.062667 +G1 X80.348667 Y77.893333 +G1 X80.899000 Y77.893333 +G1 X81.237667 Y78.105000 +G1 X81.449333 Y78.443667 +G1 X81.449333 Y78.994000 +G1 X81.237667 Y79.332667 +G1 X80.899000 Y79.544333 +G1 X80.475667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 91) +G0 X83.015667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X82.761667 Y79.502000 +G1 X82.380667 Y79.121000 +G1 X82.296000 Y78.782333 +G1 X82.338333 Y78.401333 +G1 X82.592333 Y78.062667 +G1 X82.888667 Y77.893333 +G1 X83.439000 Y77.893333 +G1 X83.777667 Y78.105000 +G1 X83.989333 Y78.443667 +G1 X83.989333 Y78.994000 +G1 X83.777667 Y79.332667 +G1 X83.439000 Y79.544333 +G1 X83.015667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 92) +G0 X91.270667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X91.016667 Y79.502000 +G1 X90.635667 Y79.121000 +G1 X90.551000 Y78.782333 +G1 X90.593333 Y78.401333 +G1 X90.847333 Y78.062667 +G1 X91.143667 Y77.893333 +G1 X91.694000 Y77.893333 +G1 X92.032667 Y78.105000 +G1 X92.244333 Y78.443667 +G1 X92.244333 Y78.994000 +G1 X92.032667 Y79.332667 +G1 X91.694000 Y79.544333 +G1 X91.270667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 93) +G0 X93.810667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X93.556667 Y79.502000 +G1 X93.175667 Y79.121000 +G1 X93.091000 Y78.782333 +G1 X93.133333 Y78.401333 +G1 X93.387333 Y78.062667 +G1 X93.683667 Y77.893333 +G1 X94.234000 Y77.893333 +G1 X94.572667 Y78.105000 +G1 X94.784333 Y78.443667 +G1 X94.784333 Y78.994000 +G1 X94.572667 Y79.332667 +G1 X94.234000 Y79.544333 +G1 X93.810667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 94) +G0 X96.350667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X96.096667 Y79.502000 +G1 X95.715667 Y79.121000 +G1 X95.631000 Y78.782333 +G1 X95.673333 Y78.401333 +G1 X95.927333 Y78.062667 +G1 X96.223667 Y77.893333 +G1 X96.774000 Y77.893333 +G1 X97.112667 Y78.105000 +G1 X97.324333 Y78.443667 +G1 X97.324333 Y78.994000 +G1 X97.112667 Y79.332667 +G1 X96.774000 Y79.544333 +G1 X96.350667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 95) +G0 X98.890667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X98.636667 Y79.502000 +G1 X98.255667 Y79.121000 +G1 X98.171000 Y78.782333 +G1 X98.213333 Y78.401333 +G1 X98.467333 Y78.062667 +G1 X98.763667 Y77.893333 +G1 X99.314000 Y77.893333 +G1 X99.652667 Y78.105000 +G1 X99.864333 Y78.443667 +G1 X99.864333 Y78.994000 +G1 X99.652667 Y79.332667 +G1 X99.314000 Y79.544333 +G1 X98.890667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 96) +G0 X101.430667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X101.176667 Y79.502000 +G1 X100.795667 Y79.121000 +G1 X100.711000 Y78.782333 +G1 X100.753333 Y78.401333 +G1 X101.007333 Y78.062667 +G1 X101.303667 Y77.893333 +G1 X101.854000 Y77.893333 +G1 X102.192667 Y78.105000 +G1 X102.404333 Y78.443667 +G1 X102.404333 Y78.994000 +G1 X102.192667 Y79.332667 +G1 X101.854000 Y79.544333 +G1 X101.430667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 97) +G0 X103.970667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X103.716667 Y79.502000 +G1 X103.335667 Y79.121000 +G1 X103.251000 Y78.782333 +G1 X103.293333 Y78.401333 +G1 X103.547333 Y78.062667 +G1 X103.843667 Y77.893333 +G1 X104.394000 Y77.893333 +G1 X104.732667 Y78.105000 +G1 X104.944333 Y78.443667 +G1 X104.944333 Y78.994000 +G1 X104.732667 Y79.332667 +G1 X104.394000 Y79.544333 +G1 X103.970667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 98) +G0 X106.510667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X106.256667 Y79.502000 +G1 X105.875667 Y79.121000 +G1 X105.791000 Y78.782333 +G1 X105.833333 Y78.401333 +G1 X106.087333 Y78.062667 +G1 X106.383667 Y77.893333 +G1 X106.934000 Y77.893333 +G1 X107.272667 Y78.105000 +G1 X107.484333 Y78.443667 +G1 X107.484333 Y78.994000 +G1 X107.272667 Y79.332667 +G1 X106.934000 Y79.544333 +G1 X106.510667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 99) +G0 X109.050667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X108.796667 Y79.502000 +G1 X108.415667 Y79.121000 +G1 X108.331000 Y78.782333 +G1 X108.373333 Y78.401333 +G1 X108.627333 Y78.062667 +G1 X108.923667 Y77.893333 +G1 X109.474000 Y77.893333 +G1 X109.812667 Y78.105000 +G1 X110.024333 Y78.443667 +G1 X110.024333 Y78.994000 +G1 X109.812667 Y79.332667 +G1 X109.474000 Y79.544333 +G1 X109.050667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 100) +G0 X115.400667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X115.146667 Y79.502000 +G1 X114.765667 Y79.121000 +G1 X114.681000 Y78.782333 +G1 X114.723333 Y78.401333 +G1 X114.977333 Y78.062667 +G1 X115.273667 Y77.893333 +G1 X115.824000 Y77.893333 +G1 X116.162667 Y78.105000 +G1 X116.374333 Y78.443667 +G1 X116.374333 Y78.994000 +G1 X116.162667 Y79.332667 +G1 X115.824000 Y79.544333 +G1 X115.400667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 101) +G0 X117.940667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X117.686667 Y79.502000 +G1 X117.305667 Y79.121000 +G1 X117.221000 Y78.782333 +G1 X117.263333 Y78.401333 +G1 X117.517333 Y78.062667 +G1 X117.813667 Y77.893333 +G1 X118.364000 Y77.893333 +G1 X118.702667 Y78.105000 +G1 X118.914333 Y78.443667 +G1 X118.914333 Y78.994000 +G1 X118.702667 Y79.332667 +G1 X118.364000 Y79.544333 +G1 X117.940667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 102) +G0 X120.480667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X120.226667 Y79.502000 +G1 X119.845667 Y79.121000 +G1 X119.761000 Y78.782333 +G1 X119.803333 Y78.401333 +G1 X120.057333 Y78.062667 +G1 X120.353667 Y77.893333 +G1 X120.904000 Y77.893333 +G1 X121.242667 Y78.105000 +G1 X121.454333 Y78.443667 +G1 X121.454333 Y78.994000 +G1 X121.242667 Y79.332667 +G1 X120.904000 Y79.544333 +G1 X120.480667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 103) +G0 X123.020667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X122.766667 Y79.502000 +G1 X122.385667 Y79.121000 +G1 X122.301000 Y78.782333 +G1 X122.343333 Y78.486000 +G1 X121.073333 Y77.258333 +G1 X114.384667 Y77.258333 +G1 X114.046000 Y77.597000 +G1 X113.707333 Y77.681667 +G1 X113.326333 Y77.639333 +G1 X112.987667 Y77.385333 +G1 X112.818333 Y77.089000 +G1 X112.818333 Y76.538667 +G1 X112.987667 Y76.242333 +G1 X113.326333 Y75.988333 +G1 X113.707333 Y75.946000 +G1 X114.046000 Y76.030667 +G1 X114.384667 Y76.369333 +G1 X121.327333 Y76.369333 +G1 X121.496667 Y76.454000 +G1 X122.936000 Y77.851000 +G1 X123.444000 Y77.893333 +G1 X123.782667 Y78.105000 +G1 X123.994333 Y78.443667 +G1 X123.994333 Y78.994000 +G1 X123.782667 Y79.332667 +G1 X123.444000 Y79.544333 +G1 X123.020667 Y79.586667 +G0 Z#100 +(polygon end, distance 26.63) +(polygon 104) +G0 X125.560667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X125.306667 Y79.502000 +G1 X124.925667 Y79.121000 +G1 X124.841000 Y78.782333 +G1 X124.883333 Y78.401333 +G1 X125.137333 Y78.062667 +G1 X125.433667 Y77.893333 +G1 X125.941667 Y77.851000 +G1 X127.381000 Y76.454000 +G1 X127.550333 Y76.369333 +G1 X131.953000 Y76.369333 +G1 X132.291667 Y76.030667 +G1 X132.630333 Y75.946000 +G1 X133.011333 Y75.988333 +G1 X133.350000 Y76.242333 +G1 X133.519333 Y76.538667 +G1 X133.519333 Y77.089000 +G1 X133.350000 Y77.385333 +G1 X133.011333 Y77.639333 +G1 X132.630333 Y77.681667 +G1 X132.291667 Y77.597000 +G1 X131.953000 Y77.258333 +G1 X127.762000 Y77.258333 +G1 X126.576667 Y78.486000 +G1 X126.534333 Y78.994000 +G1 X126.322667 Y79.332667 +G1 X125.984000 Y79.544333 +G1 X125.560667 Y79.586667 +G0 Z#100 +(polygon end, distance 21.55) +(polygon 105) +G0 X128.100667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X127.846667 Y79.502000 +G1 X127.465667 Y79.121000 +G1 X127.381000 Y78.782333 +G1 X127.423333 Y78.401333 +G1 X127.677333 Y78.062667 +G1 X127.973667 Y77.893333 +G1 X128.524000 Y77.893333 +G1 X128.862667 Y78.105000 +G1 X129.074333 Y78.443667 +G1 X129.074333 Y78.994000 +G1 X128.862667 Y79.332667 +G1 X128.524000 Y79.544333 +G1 X128.100667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 106) +G0 X130.640667 Y79.586667 (start point) +G1 Z#101 F#102 +F#103 +G1 X130.386667 Y79.502000 +G1 X130.005667 Y79.121000 +G1 X129.921000 Y78.782333 +G1 X129.963333 Y78.401333 +G1 X130.217333 Y78.062667 +G1 X130.513667 Y77.893333 +G1 X131.064000 Y77.893333 +G1 X131.402667 Y78.105000 +G1 X131.614333 Y78.443667 +G1 X131.614333 Y78.994000 +G1 X131.402667 Y79.332667 +G1 X131.064000 Y79.544333 +G1 X130.640667 Y79.586667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 107) +G0 X159.131000 Y78.951667 (start point) +G1 Z#101 F#102 +F#103 +G1 X159.131000 Y77.216000 +G1 X160.866667 Y77.216000 +G1 X160.866667 Y78.951667 +G1 X159.131000 Y78.951667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 108) +G0 X63.330667 Y78.316667 (start point) +G1 Z#101 F#102 +F#103 +G1 X63.076667 Y78.232000 +G1 X62.695667 Y77.851000 +G1 X62.611000 Y77.512333 +G1 X62.653333 Y77.131333 +G1 X62.907333 Y76.792667 +G1 X63.203667 Y76.623333 +G1 X63.754000 Y76.623333 +G1 X64.092667 Y76.835000 +G1 X64.304333 Y77.173667 +G1 X64.304333 Y77.724000 +G1 X64.092667 Y78.062667 +G1 X63.754000 Y78.274333 +G1 X63.330667 Y78.316667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 109) +G0 X58.885667 Y78.062667 (start point) +G1 Z#101 F#102 +F#103 +G1 X58.631667 Y77.851000 +G1 X58.420000 Y77.597000 +G1 X58.420000 Y77.300667 +G1 X58.631667 Y77.046667 +G1 X58.885667 Y76.835000 +G1 X59.139667 Y76.835000 +G1 X59.393667 Y76.962000 +G1 X59.605333 Y77.216000 +G1 X61.468000 Y77.216000 +G1 X62.780333 Y75.946000 +G1 X69.723000 Y75.946000 +G1 X71.035333 Y74.676000 +G1 X71.797333 Y74.676000 +G1 X72.009000 Y74.422000 +G1 X72.263000 Y74.295000 +G1 X72.517000 Y74.295000 +G1 X72.771000 Y74.506667 +G1 X72.982667 Y74.760667 +G1 X72.982667 Y75.057000 +G1 X72.771000 Y75.311000 +G1 X72.517000 Y75.522667 +G1 X72.263000 Y75.522667 +G1 X72.009000 Y75.395667 +G1 X71.797333 Y75.141667 +G1 X71.204667 Y75.141667 +G1 X69.892333 Y76.411667 +G1 X62.949667 Y76.411667 +G1 X61.637333 Y77.681667 +G1 X59.605333 Y77.681667 +G1 X59.393667 Y77.935667 +G1 X59.139667 Y78.062667 +G1 X58.885667 Y78.062667 +G0 Z#100 +(polygon end, distance 33.15) +(polygon 110) +G0 X16.975667 Y77.681667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y77.597000 +G1 X16.340667 Y77.216000 +G1 X16.256000 Y76.877333 +G1 X16.298333 Y76.496333 +G1 X16.552333 Y76.157667 +G1 X16.848667 Y75.988333 +G1 X17.399000 Y75.988333 +G1 X17.737667 Y76.200000 +G1 X17.949333 Y76.538667 +G1 X17.949333 Y77.089000 +G1 X17.737667 Y77.427667 +G1 X17.399000 Y77.639333 +G1 X16.975667 Y77.681667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 111) +G0 X19.515667 Y77.681667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y77.597000 +G1 X18.880667 Y77.216000 +G1 X18.796000 Y76.877333 +G1 X18.838333 Y76.496333 +G1 X19.092333 Y76.200000 +G1 X20.743333 Y74.633667 +G1 X20.743333 Y65.235667 +G1 X20.912667 Y64.897000 +G1 X22.436667 Y63.457667 +G1 X22.733000 Y63.288333 +G1 X26.373667 Y63.288333 +G1 X26.712333 Y62.992000 +G1 X27.178000 Y62.865000 +G1 X27.601333 Y62.907333 +G1 X27.982333 Y63.076667 +G1 X28.321000 Y63.415333 +G1 X28.490333 Y63.796333 +G1 X28.490333 Y64.431333 +G1 X28.321000 Y64.812333 +G1 X27.982333 Y65.151000 +G1 X27.601333 Y65.320333 +G1 X27.178000 Y65.362667 +G1 X26.712333 Y65.235667 +G1 X26.373667 Y64.939333 +G1 X23.198667 Y64.939333 +G1 X22.394333 Y65.659000 +G1 X22.394333 Y75.057000 +G1 X22.225000 Y75.395667 +G1 X20.574000 Y76.962000 +G1 X20.277667 Y77.427667 +G1 X19.939000 Y77.639333 +G1 X19.515667 Y77.681667 +G0 Z#100 +(polygon end, distance 43.72) +(polygon 112) +G0 X162.390667 Y77.597000 (start point) +G1 Z#101 F#102 +F#103 +G1 X162.136667 Y77.512333 +G1 X161.755667 Y77.131333 +G1 X161.671000 Y76.792667 +G1 X161.713333 Y76.411667 +G1 X161.967333 Y76.073000 +G1 X162.263667 Y75.903667 +G1 X162.814000 Y75.903667 +G1 X163.152667 Y76.115333 +G1 X163.364333 Y76.454000 +G1 X163.364333 Y77.004333 +G1 X163.152667 Y77.343000 +G1 X162.814000 Y77.554667 +G1 X162.390667 Y77.597000 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 113) +G0 X58.250667 Y76.792667 (start point) +G1 Z#101 F#102 +F#103 +G1 X57.996667 Y76.581000 +G1 X57.785000 Y76.327000 +G1 X57.785000 Y76.030667 +G1 X57.996667 Y75.776667 +G1 X58.250667 Y75.565000 +G1 X58.504667 Y75.565000 +G1 X58.758667 Y75.692000 +G1 X58.970333 Y75.946000 +G1 X61.468000 Y75.946000 +G1 X62.780333 Y74.676000 +G1 X67.352333 Y74.676000 +G1 X67.564000 Y74.422000 +G1 X67.818000 Y74.295000 +G1 X68.072000 Y74.295000 +G1 X68.326000 Y74.506667 +G1 X68.537667 Y74.760667 +G1 X68.537667 Y75.057000 +G1 X68.326000 Y75.311000 +G1 X68.072000 Y75.522667 +G1 X67.818000 Y75.522667 +G1 X67.564000 Y75.395667 +G1 X67.352333 Y75.141667 +G1 X62.949667 Y75.141667 +G1 X61.637333 Y76.411667 +G1 X58.970333 Y76.411667 +G1 X58.758667 Y76.665667 +G1 X58.504667 Y76.792667 +G1 X58.250667 Y76.792667 +G0 Z#100 +(polygon end, distance 24.50) +(polygon 114) +G0 X159.850667 Y76.200000 (start point) +G1 Z#101 F#102 +F#103 +G1 X159.596667 Y76.115333 +G1 X159.215667 Y75.734333 +G1 X159.131000 Y75.395667 +G1 X159.173333 Y75.014667 +G1 X159.427333 Y74.676000 +G1 X159.723667 Y74.506667 +G1 X160.274000 Y74.506667 +G1 X160.612667 Y74.718333 +G1 X160.824333 Y75.057000 +G1 X160.824333 Y75.607333 +G1 X160.612667 Y75.946000 +G1 X160.274000 Y76.157667 +G1 X159.850667 Y76.200000 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 115) +G0 X154.135667 Y76.157667 (start point) +G1 Z#101 F#102 +F#103 +G1 X153.881667 Y75.988333 +G1 X153.712333 Y75.776667 +G1 X109.770333 Y75.776667 +G1 X108.458000 Y74.506667 +G1 X94.530333 Y74.506667 +G1 X91.821000 Y71.839667 +G1 X91.524667 Y71.966667 +G1 X91.143667 Y71.924333 +G1 X90.805000 Y71.712667 +G1 X90.593333 Y71.374000 +G1 X90.593333 Y70.823667 +G1 X90.805000 Y70.485000 +G1 X91.143667 Y70.273333 +G1 X91.694000 Y70.273333 +G1 X92.032667 Y70.485000 +G1 X92.244333 Y70.823667 +G1 X92.286667 Y71.204667 +G1 X92.159667 Y71.543333 +G1 X94.699667 Y74.041000 +G1 X108.627333 Y74.041000 +G1 X109.939667 Y75.311000 +G1 X153.712333 Y75.311000 +G1 X153.924000 Y75.057000 +G1 X154.178000 Y74.930000 +G1 X154.432000 Y74.930000 +G1 X154.686000 Y75.141667 +G1 X154.897667 Y75.395667 +G1 X154.897667 Y75.692000 +G1 X154.686000 Y75.946000 +G1 X154.432000 Y76.157667 +G1 X154.135667 Y76.157667 +G0 Z#100 +(polygon end, distance 134.89) +(polygon 116) +G0 X29.675667 Y75.522667 (start point) +G1 Z#101 F#102 +F#103 +G1 X29.421667 Y75.311000 +G1 X29.210000 Y75.057000 +G1 X29.210000 Y74.760667 +G1 X29.421667 Y74.506667 +G1 X29.675667 Y74.295000 +G1 X29.929667 Y74.295000 +G1 X30.183667 Y74.422000 +G1 X30.395333 Y74.676000 +G1 X50.842333 Y74.676000 +G1 X51.054000 Y74.422000 +G1 X51.308000 Y74.295000 +G1 X51.562000 Y74.295000 +G1 X51.816000 Y74.506667 +G1 X52.027667 Y74.760667 +G1 X52.027667 Y75.057000 +G1 X51.816000 Y75.311000 +G1 X51.562000 Y75.522667 +G1 X51.308000 Y75.522667 +G1 X51.054000 Y75.395667 +G1 X50.842333 Y75.141667 +G1 X30.395333 Y75.141667 +G1 X30.183667 Y75.395667 +G1 X29.929667 Y75.522667 +G1 X29.675667 Y75.522667 +G0 Z#100 +(polygon end, distance 47.61) +(polygon 117) +G0 X58.885667 Y75.522667 (start point) +G1 Z#101 F#102 +F#103 +G1 X58.631667 Y75.311000 +G1 X58.420000 Y75.057000 +G1 X58.420000 Y74.760667 +G1 X58.631667 Y74.506667 +G1 X58.885667 Y74.295000 +G1 X59.139667 Y74.295000 +G1 X59.393667 Y74.422000 +G1 X59.605333 Y74.676000 +G1 X61.468000 Y74.676000 +G1 X62.780333 Y73.406000 +G1 X76.073000 Y73.406000 +G1 X76.750333 Y72.771000 +G1 X90.847333 Y72.771000 +G1 X91.059000 Y72.517000 +G1 X91.313000 Y72.390000 +G1 X91.567000 Y72.390000 +G1 X91.821000 Y72.601667 +G1 X92.032667 Y72.855667 +G1 X92.032667 Y73.152000 +G1 X91.821000 Y73.406000 +G1 X91.567000 Y73.617667 +G1 X91.313000 Y73.617667 +G1 X91.059000 Y73.490667 +G1 X90.847333 Y73.236667 +G1 X76.919667 Y73.236667 +G1 X76.242333 Y73.871667 +G1 X62.949667 Y73.871667 +G1 X61.637333 Y75.141667 +G1 X59.605333 Y75.141667 +G1 X59.393667 Y75.395667 +G1 X59.139667 Y75.522667 +G1 X58.885667 Y75.522667 +G0 Z#100 +(polygon end, distance 70.73) +(polygon 118) +G0 X14.435667 Y75.141667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y75.057000 +G1 X13.800667 Y74.676000 +G1 X13.716000 Y74.337333 +G1 X13.758333 Y73.956333 +G1 X14.012333 Y73.617667 +G1 X14.308667 Y73.448333 +G1 X14.859000 Y73.448333 +G1 X15.197667 Y73.660000 +G1 X15.409333 Y73.998667 +G1 X15.409333 Y74.549000 +G1 X15.197667 Y74.887667 +G1 X14.859000 Y75.099333 +G1 X14.435667 Y75.141667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 119) +G0 X16.975667 Y75.141667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y75.057000 +G1 X16.340667 Y74.676000 +G1 X16.256000 Y74.337333 +G1 X16.298333 Y73.956333 +G1 X16.552333 Y73.617667 +G1 X16.848667 Y73.448333 +G1 X17.399000 Y73.448333 +G1 X17.737667 Y73.660000 +G1 X17.949333 Y73.998667 +G1 X17.949333 Y74.549000 +G1 X17.737667 Y74.887667 +G1 X17.399000 Y75.099333 +G1 X16.975667 Y75.141667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 120) +G0 X19.515667 Y75.141667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y75.057000 +G1 X18.880667 Y74.676000 +G1 X18.796000 Y74.337333 +G1 X18.838333 Y73.956333 +G1 X19.092333 Y73.617667 +G1 X19.388667 Y73.448333 +G1 X19.939000 Y73.448333 +G1 X20.277667 Y73.660000 +G1 X20.489333 Y73.998667 +G1 X20.489333 Y74.549000 +G1 X20.277667 Y74.887667 +G1 X19.939000 Y75.099333 +G1 X19.515667 Y75.141667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 121) +G0 X162.390667 Y74.803000 (start point) +G1 Z#101 F#102 +F#103 +G1 X162.179000 Y74.718333 +G1 X161.882667 Y74.506667 +G1 X161.713333 Y74.168000 +G1 X155.998333 Y74.168000 +G1 X155.617333 Y74.506667 +G1 X110.405333 Y74.506667 +G1 X109.093000 Y73.236667 +G1 X95.800333 Y73.236667 +G1 X94.361000 Y71.839667 +G1 X94.064667 Y71.966667 +G1 X93.683667 Y71.924333 +G1 X93.345000 Y71.712667 +G1 X93.133333 Y71.374000 +G1 X93.133333 Y70.823667 +G1 X93.345000 Y70.485000 +G1 X93.683667 Y70.273333 +G1 X94.234000 Y70.273333 +G1 X94.572667 Y70.485000 +G1 X94.784333 Y70.823667 +G1 X94.826667 Y71.204667 +G1 X94.699667 Y71.543333 +G1 X95.969667 Y72.771000 +G1 X109.262333 Y72.771000 +G1 X110.574667 Y74.041000 +G1 X155.448000 Y74.041000 +G1 X155.829000 Y73.702333 +G1 X161.713333 Y73.702333 +G1 X161.925000 Y73.321333 +G1 X162.263667 Y73.109667 +G1 X162.814000 Y73.109667 +G1 X163.152667 Y73.321333 +G1 X163.364333 Y73.660000 +G1 X163.364333 Y74.210333 +G1 X163.152667 Y74.549000 +G1 X162.814000 Y74.760667 +G1 X162.390667 Y74.803000 +G0 Z#100 +(polygon end, distance 146.59) +(polygon 122) +G0 X111.548333 Y73.998667 (start point) +G1 Z#101 F#102 +F#103 +G1 X111.125000 Y73.787000 +G1 X110.913333 Y73.533000 +G1 X110.744000 Y73.194333 +G1 X110.744000 Y72.813333 +G1 X110.913333 Y72.474667 +G1 X111.125000 Y72.220667 +G1 X111.463667 Y72.051333 +G1 X117.898333 Y72.051333 +G1 X117.475000 Y71.839667 +G1 X117.221000 Y71.501000 +G1 X117.136333 Y71.204667 +G1 X117.178667 Y70.823667 +G1 X117.432667 Y70.442667 +G1 X117.813667 Y70.188667 +G1 X120.904000 Y70.188667 +G1 X121.285000 Y70.442667 +G1 X121.539000 Y70.823667 +G1 X121.581333 Y71.247000 +G1 X121.369667 Y71.712667 +G1 X119.210667 Y73.829333 +G1 X118.829667 Y73.956333 +G1 X111.548333 Y73.998667 +G0 Z#100 +(polygon end, distance 27.24) +(polygon 123) +G0 X129.370667 Y73.617667 (start point) +G1 Z#101 F#102 +F#103 +G1 X129.116667 Y73.448333 +G1 X128.947333 Y73.236667 +G1 X125.010333 Y73.236667 +G1 X123.571000 Y71.839667 +G1 X123.274667 Y71.966667 +G1 X122.893667 Y71.924333 +G1 X122.555000 Y71.712667 +G1 X122.343333 Y71.374000 +G1 X122.343333 Y70.823667 +G1 X122.555000 Y70.485000 +G1 X122.893667 Y70.273333 +G1 X123.444000 Y70.273333 +G1 X123.782667 Y70.485000 +G1 X123.994333 Y70.823667 +G1 X124.036667 Y71.204667 +G1 X123.909667 Y71.543333 +G1 X125.179667 Y72.771000 +G1 X128.947333 Y72.771000 +G1 X129.159000 Y72.517000 +G1 X129.413000 Y72.390000 +G1 X129.667000 Y72.390000 +G1 X129.921000 Y72.601667 +G1 X130.132667 Y72.855667 +G1 X130.132667 Y73.152000 +G1 X129.921000 Y73.406000 +G1 X129.667000 Y73.617667 +G1 X129.370667 Y73.617667 +G0 Z#100 +(polygon end, distance 19.78) +(polygon 124) +G0 X159.850667 Y73.406000 (start point) +G1 Z#101 F#102 +F#103 +G1 X159.596667 Y73.321333 +G1 X159.215667 Y72.940333 +G1 X159.131000 Y72.601667 +G1 X159.173333 Y72.220667 +G1 X159.427333 Y71.882000 +G1 X159.723667 Y71.712667 +G1 X160.274000 Y71.712667 +G1 X160.612667 Y71.924333 +G1 X160.824333 Y72.263000 +G1 X160.824333 Y72.813333 +G1 X160.612667 Y73.152000 +G1 X160.274000 Y73.363667 +G1 X159.850667 Y73.406000 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 125) +G0 X135.085667 Y73.236667 (start point) +G1 Z#101 F#102 +F#103 +G1 X134.831667 Y73.152000 +G1 X134.493000 Y72.813333 +G1 X131.995333 Y72.813333 +G1 X131.741333 Y72.686333 +G1 X131.064000 Y71.966667 +G1 X129.921000 Y71.966667 +G1 X129.921000 Y70.231000 +G1 X131.656667 Y70.231000 +G1 X131.656667 Y71.374000 +G1 X132.249333 Y71.924333 +G1 X134.493000 Y71.924333 +G1 X134.831667 Y71.585667 +G1 X135.170333 Y71.501000 +G1 X135.551333 Y71.543333 +G1 X135.890000 Y71.797333 +G1 X135.932333 Y71.924333 +G1 X138.938000 Y71.924333 +G1 X139.276667 Y71.585667 +G1 X139.615333 Y71.501000 +G1 X139.996333 Y71.543333 +G1 X140.335000 Y71.797333 +G1 X140.504333 Y72.093667 +G1 X140.504333 Y72.644000 +G1 X140.335000 Y72.940333 +G1 X139.996333 Y73.194333 +G1 X139.615333 Y73.236667 +G1 X139.276667 Y73.152000 +G1 X138.938000 Y72.813333 +G1 X135.974667 Y72.813333 +G1 X135.636000 Y73.152000 +G1 X135.339667 Y73.236667 +G1 X135.085667 Y73.236667 +G0 Z#100 +(polygon end, distance 26.61) +(polygon 126) +G0 X14.435667 Y72.601667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y72.517000 +G1 X13.800667 Y72.136000 +G1 X13.716000 Y71.797333 +G1 X13.758333 Y71.416333 +G1 X14.012333 Y71.077667 +G1 X14.308667 Y70.908333 +G1 X14.859000 Y70.908333 +G1 X15.197667 Y71.120000 +G1 X15.409333 Y71.458667 +G1 X15.409333 Y72.009000 +G1 X15.197667 Y72.347667 +G1 X14.859000 Y72.559333 +G1 X14.435667 Y72.601667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 127) +G0 X16.975667 Y72.601667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y72.517000 +G1 X16.340667 Y72.136000 +G1 X16.256000 Y71.797333 +G1 X16.298333 Y71.416333 +G1 X16.552333 Y71.077667 +G1 X16.848667 Y70.908333 +G1 X17.399000 Y70.908333 +G1 X17.737667 Y71.120000 +G1 X17.949333 Y71.458667 +G1 X17.949333 Y72.009000 +G1 X17.737667 Y72.347667 +G1 X17.399000 Y72.559333 +G1 X16.975667 Y72.601667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 128) +G0 X19.515667 Y72.601667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y72.517000 +G1 X18.880667 Y72.136000 +G1 X18.796000 Y71.797333 +G1 X18.838333 Y71.416333 +G1 X19.092333 Y71.077667 +G1 X19.388667 Y70.908333 +G1 X19.939000 Y70.908333 +G1 X20.277667 Y71.120000 +G1 X20.489333 Y71.458667 +G1 X20.489333 Y72.009000 +G1 X20.277667 Y72.347667 +G1 X19.939000 Y72.559333 +G1 X19.515667 Y72.601667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 129) +G0 X162.390667 Y72.051333 (start point) +G1 Z#101 F#102 +F#103 +G1 X162.136667 Y71.966667 +G1 X161.755667 Y71.585667 +G1 X161.713333 Y71.331667 +G1 X154.855333 Y71.331667 +G1 X154.643667 Y71.585667 +G1 X154.389667 Y71.712667 +G1 X154.135667 Y71.712667 +G1 X153.881667 Y71.501000 +G1 X153.670000 Y71.247000 +G1 X153.670000 Y70.950667 +G1 X153.881667 Y70.696667 +G1 X154.135667 Y70.485000 +G1 X154.389667 Y70.485000 +G1 X154.643667 Y70.612000 +G1 X154.855333 Y70.866000 +G1 X161.755667 Y70.866000 +G1 X161.925000 Y70.569667 +G1 X162.263667 Y70.358000 +G1 X162.814000 Y70.358000 +G1 X163.152667 Y70.569667 +G1 X163.364333 Y70.908333 +G1 X163.364333 Y71.458667 +G1 X163.152667 Y71.797333 +G1 X162.814000 Y72.009000 +G1 X162.390667 Y72.051333 +G0 Z#100 +(polygon end, distance 22.04) +(polygon 130) +G0 X24.595667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X24.341667 Y71.882000 +G1 X23.960667 Y71.501000 +G1 X23.876000 Y71.162333 +G1 X23.918333 Y70.781333 +G1 X24.172333 Y70.442667 +G1 X24.468667 Y70.273333 +G1 X25.019000 Y70.273333 +G1 X25.357667 Y70.485000 +G1 X25.569333 Y70.823667 +G1 X25.569333 Y71.374000 +G1 X25.357667 Y71.712667 +G1 X25.019000 Y71.924333 +G1 X24.595667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 131) +G0 X27.135667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X26.881667 Y71.882000 +G1 X26.500667 Y71.501000 +G1 X26.416000 Y71.162333 +G1 X26.458333 Y70.781333 +G1 X26.712333 Y70.442667 +G1 X27.008667 Y70.273333 +G1 X27.559000 Y70.273333 +G1 X27.897667 Y70.485000 +G1 X28.109333 Y70.823667 +G1 X28.109333 Y71.374000 +G1 X27.897667 Y71.712667 +G1 X27.559000 Y71.924333 +G1 X27.135667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 132) +G0 X29.675667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X29.421667 Y71.882000 +G1 X29.040667 Y71.501000 +G1 X28.956000 Y71.162333 +G1 X28.998333 Y70.781333 +G1 X29.252333 Y70.442667 +G1 X29.548667 Y70.273333 +G1 X30.099000 Y70.273333 +G1 X30.437667 Y70.485000 +G1 X30.649333 Y70.823667 +G1 X30.649333 Y71.374000 +G1 X30.437667 Y71.712667 +G1 X30.099000 Y71.924333 +G1 X29.675667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 133) +G0 X32.215667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X31.961667 Y71.882000 +G1 X31.580667 Y71.501000 +G1 X31.496000 Y71.162333 +G1 X31.538333 Y70.781333 +G1 X31.792333 Y70.442667 +G1 X32.088667 Y70.273333 +G1 X32.639000 Y70.273333 +G1 X32.977667 Y70.485000 +G1 X33.189333 Y70.823667 +G1 X33.189333 Y71.374000 +G1 X32.977667 Y71.712667 +G1 X32.639000 Y71.924333 +G1 X32.215667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 134) +G0 X34.755667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X34.501667 Y71.882000 +G1 X34.120667 Y71.501000 +G1 X34.036000 Y71.162333 +G1 X34.078333 Y70.781333 +G1 X34.332333 Y70.442667 +G1 X34.628667 Y70.273333 +G1 X35.179000 Y70.273333 +G1 X35.517667 Y70.485000 +G1 X35.729333 Y70.823667 +G1 X35.729333 Y71.374000 +G1 X35.517667 Y71.712667 +G1 X35.179000 Y71.924333 +G1 X34.755667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 135) +G0 X37.295667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X37.041667 Y71.882000 +G1 X36.660667 Y71.501000 +G1 X36.576000 Y71.162333 +G1 X36.618333 Y70.781333 +G1 X36.872333 Y70.442667 +G1 X37.168667 Y70.273333 +G1 X37.719000 Y70.273333 +G1 X38.057667 Y70.485000 +G1 X38.269333 Y70.823667 +G1 X38.269333 Y71.374000 +G1 X38.057667 Y71.712667 +G1 X37.719000 Y71.924333 +G1 X37.295667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 136) +G0 X42.375667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X42.121667 Y71.882000 +G1 X41.740667 Y71.501000 +G1 X41.656000 Y71.162333 +G1 X41.698333 Y70.781333 +G1 X41.952333 Y70.442667 +G1 X42.291000 Y70.273333 +G1 X42.291000 Y69.892333 +G1 X41.148000 Y68.791667 +G1 X25.315333 Y68.791667 +G1 X23.876000 Y67.352333 +G1 X23.876000 Y66.886667 +G1 X23.241000 Y66.886667 +G1 X23.241000 Y65.151000 +G1 X24.976667 Y65.151000 +G1 X24.976667 Y66.886667 +G1 X24.341667 Y66.886667 +G1 X24.341667 Y67.183000 +G1 X25.442333 Y68.326000 +G1 X41.317333 Y68.326000 +G1 X42.756667 Y69.765333 +G1 X42.756667 Y70.273333 +G1 X43.137667 Y70.485000 +G1 X43.349333 Y70.823667 +G1 X43.349333 Y71.374000 +G1 X43.137667 Y71.712667 +G1 X42.799000 Y71.924333 +G1 X42.375667 Y71.966667 +G0 Z#100 +(polygon end, distance 52.03) +(polygon 137) +G0 X44.915667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X44.661667 Y71.882000 +G1 X44.280667 Y71.501000 +G1 X44.196000 Y71.162333 +G1 X44.238333 Y70.781333 +G1 X44.492333 Y70.442667 +G1 X44.788667 Y70.273333 +G1 X45.339000 Y70.273333 +G1 X45.677667 Y70.485000 +G1 X45.889333 Y70.823667 +G1 X45.889333 Y71.374000 +G1 X45.677667 Y71.712667 +G1 X45.339000 Y71.924333 +G1 X44.915667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 138) +G0 X47.455667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X47.201667 Y71.882000 +G1 X46.820667 Y71.501000 +G1 X46.736000 Y71.162333 +G1 X46.778333 Y70.781333 +G1 X47.032333 Y70.442667 +G1 X47.328667 Y70.273333 +G1 X47.879000 Y70.273333 +G1 X48.217667 Y70.485000 +G1 X48.429333 Y70.823667 +G1 X48.429333 Y71.374000 +G1 X48.217667 Y71.712667 +G1 X47.879000 Y71.924333 +G1 X47.455667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 139) +G0 X49.995667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X49.741667 Y71.882000 +G1 X49.360667 Y71.501000 +G1 X49.276000 Y71.162333 +G1 X49.318333 Y70.781333 +G1 X49.572333 Y70.442667 +G1 X49.868667 Y70.273333 +G1 X50.419000 Y70.273333 +G1 X50.757667 Y70.485000 +G1 X50.969333 Y70.823667 +G1 X50.969333 Y71.374000 +G1 X50.757667 Y71.712667 +G1 X50.419000 Y71.924333 +G1 X49.995667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 140) +G0 X52.535667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X52.281667 Y71.882000 +G1 X51.900667 Y71.501000 +G1 X51.816000 Y71.162333 +G1 X51.858333 Y70.781333 +G1 X52.112333 Y70.442667 +G1 X52.408667 Y70.273333 +G1 X52.959000 Y70.273333 +G1 X53.297667 Y70.485000 +G1 X53.509333 Y70.823667 +G1 X53.509333 Y71.374000 +G1 X53.297667 Y71.712667 +G1 X52.959000 Y71.924333 +G1 X52.535667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 141) +G0 X55.075667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X54.821667 Y71.882000 +G1 X54.440667 Y71.501000 +G1 X54.356000 Y71.162333 +G1 X54.398333 Y70.781333 +G1 X54.652333 Y70.442667 +G1 X54.948667 Y70.273333 +G1 X55.499000 Y70.273333 +G1 X55.837667 Y70.485000 +G1 X56.049333 Y70.823667 +G1 X56.049333 Y71.374000 +G1 X55.837667 Y71.712667 +G1 X55.499000 Y71.924333 +G1 X55.075667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 142) +G0 X56.896000 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X56.896000 Y70.231000 +G1 X58.631667 Y70.231000 +G1 X58.631667 Y71.966667 +G1 X56.896000 Y71.966667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 143) +G0 X80.475667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X80.221667 Y71.882000 +G1 X79.840667 Y71.501000 +G1 X79.756000 Y71.162333 +G1 X79.798333 Y70.781333 +G1 X80.052333 Y70.442667 +G1 X80.348667 Y70.273333 +G1 X80.899000 Y70.273333 +G1 X81.237667 Y70.485000 +G1 X81.449333 Y70.823667 +G1 X81.449333 Y71.374000 +G1 X81.237667 Y71.712667 +G1 X80.899000 Y71.924333 +G1 X80.475667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 144) +G0 X83.015667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X82.761667 Y71.882000 +G1 X82.380667 Y71.501000 +G1 X82.296000 Y71.162333 +G1 X82.338333 Y70.781333 +G1 X82.592333 Y70.442667 +G1 X82.888667 Y70.273333 +G1 X83.439000 Y70.273333 +G1 X83.777667 Y70.485000 +G1 X83.989333 Y70.823667 +G1 X83.989333 Y71.374000 +G1 X83.777667 Y71.712667 +G1 X83.439000 Y71.924333 +G1 X83.015667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 145) +G0 X84.836000 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X84.836000 Y70.231000 +G1 X86.571667 Y70.231000 +G1 X86.571667 Y71.966667 +G1 X84.836000 Y71.966667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 146) +G0 X96.350667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X96.096667 Y71.882000 +G1 X95.715667 Y71.501000 +G1 X95.631000 Y71.162333 +G1 X95.673333 Y70.781333 +G1 X95.927333 Y70.442667 +G1 X96.223667 Y70.273333 +G1 X96.774000 Y70.273333 +G1 X97.112667 Y70.485000 +G1 X97.324333 Y70.823667 +G1 X97.324333 Y71.374000 +G1 X97.112667 Y71.712667 +G1 X96.774000 Y71.924333 +G1 X96.350667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 147) +G0 X98.890667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X98.636667 Y71.882000 +G1 X98.255667 Y71.501000 +G1 X98.171000 Y71.162333 +G1 X98.213333 Y70.781333 +G1 X98.467333 Y70.442667 +G1 X98.763667 Y70.273333 +G1 X99.314000 Y70.273333 +G1 X99.652667 Y70.485000 +G1 X99.864333 Y70.823667 +G1 X99.864333 Y71.374000 +G1 X99.652667 Y71.712667 +G1 X99.314000 Y71.924333 +G1 X98.890667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 148) +G0 X101.430667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X101.176667 Y71.882000 +G1 X100.795667 Y71.501000 +G1 X100.711000 Y71.162333 +G1 X100.753333 Y70.781333 +G1 X101.007333 Y70.442667 +G1 X101.303667 Y70.273333 +G1 X101.854000 Y70.273333 +G1 X102.192667 Y70.485000 +G1 X102.404333 Y70.823667 +G1 X102.404333 Y71.374000 +G1 X102.192667 Y71.712667 +G1 X101.854000 Y71.924333 +G1 X101.430667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 149) +G0 X103.970667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X103.716667 Y71.882000 +G1 X103.335667 Y71.501000 +G1 X103.251000 Y71.162333 +G1 X103.293333 Y70.781333 +G1 X103.547333 Y70.442667 +G1 X103.843667 Y70.273333 +G1 X104.394000 Y70.273333 +G1 X104.732667 Y70.485000 +G1 X104.944333 Y70.823667 +G1 X104.944333 Y71.374000 +G1 X104.732667 Y71.712667 +G1 X104.394000 Y71.924333 +G1 X103.970667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 150) +G0 X106.510667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X106.256667 Y71.882000 +G1 X105.875667 Y71.501000 +G1 X105.791000 Y71.162333 +G1 X105.833333 Y70.781333 +G1 X106.087333 Y70.442667 +G1 X106.383667 Y70.273333 +G1 X106.934000 Y70.273333 +G1 X107.272667 Y70.485000 +G1 X107.484333 Y70.823667 +G1 X107.484333 Y71.374000 +G1 X107.272667 Y71.712667 +G1 X106.934000 Y71.924333 +G1 X106.510667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 151) +G0 X108.331000 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X108.331000 Y70.231000 +G1 X110.066667 Y70.231000 +G1 X110.066667 Y71.966667 +G1 X108.331000 Y71.966667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 152) +G0 X115.400667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X115.146667 Y71.882000 +G1 X114.765667 Y71.501000 +G1 X114.681000 Y71.162333 +G1 X114.723333 Y70.781333 +G1 X114.977333 Y70.442667 +G1 X115.273667 Y70.273333 +G1 X115.824000 Y70.273333 +G1 X116.162667 Y70.485000 +G1 X116.374333 Y70.823667 +G1 X116.374333 Y71.374000 +G1 X116.162667 Y71.712667 +G1 X115.824000 Y71.924333 +G1 X115.400667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 153) +G0 X125.560667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X125.306667 Y71.882000 +G1 X124.925667 Y71.501000 +G1 X124.841000 Y71.162333 +G1 X124.883333 Y70.781333 +G1 X125.137333 Y70.442667 +G1 X125.433667 Y70.273333 +G1 X125.984000 Y70.273333 +G1 X126.322667 Y70.485000 +G1 X126.534333 Y70.823667 +G1 X126.534333 Y71.374000 +G1 X126.322667 Y71.712667 +G1 X125.984000 Y71.924333 +G1 X125.560667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 154) +G0 X128.100667 Y71.966667 (start point) +G1 Z#101 F#102 +F#103 +G1 X127.846667 Y71.882000 +G1 X127.465667 Y71.501000 +G1 X127.381000 Y71.162333 +G1 X127.423333 Y70.781333 +G1 X127.677333 Y70.442667 +G1 X127.973667 Y70.273333 +G1 X128.524000 Y70.273333 +G1 X128.862667 Y70.485000 +G1 X129.074333 Y70.823667 +G1 X129.074333 Y71.374000 +G1 X128.862667 Y71.712667 +G1 X128.524000 Y71.924333 +G1 X128.100667 Y71.966667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 155) +G0 X67.775667 Y70.696667 (start point) +G1 Z#101 F#102 +F#103 +G1 X67.521667 Y70.612000 +G1 X67.140667 Y70.231000 +G1 X67.056000 Y69.892333 +G1 X67.098333 Y69.511333 +G1 X67.352333 Y69.172667 +G1 X67.648667 Y69.003333 +G1 X68.199000 Y69.003333 +G1 X68.537667 Y69.215000 +G1 X68.749333 Y69.553667 +G1 X68.749333 Y70.104000 +G1 X68.537667 Y70.442667 +G1 X68.199000 Y70.654333 +G1 X67.775667 Y70.696667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 156) +G0 X72.220667 Y70.696667 (start point) +G1 Z#101 F#102 +F#103 +G1 X71.966667 Y70.612000 +G1 X71.585667 Y70.231000 +G1 X71.501000 Y69.892333 +G1 X71.543333 Y69.511333 +G1 X71.797333 Y69.172667 +G1 X72.093667 Y69.003333 +G1 X72.644000 Y69.003333 +G1 X72.982667 Y69.215000 +G1 X73.194333 Y69.553667 +G1 X73.194333 Y70.104000 +G1 X72.982667 Y70.442667 +G1 X72.644000 Y70.654333 +G1 X72.220667 Y70.696667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 157) +G0 X159.850667 Y70.654333 (start point) +G1 Z#101 F#102 +F#103 +G1 X159.596667 Y70.569667 +G1 X159.215667 Y70.188667 +G1 X159.131000 Y69.850000 +G1 X159.173333 Y69.469000 +G1 X159.427333 Y69.130333 +G1 X159.723667 Y68.961000 +G1 X160.274000 Y68.961000 +G1 X160.612667 Y69.172667 +G1 X160.824333 Y69.511333 +G1 X160.824333 Y70.061667 +G1 X160.612667 Y70.400333 +G1 X160.274000 Y70.612000 +G1 X159.850667 Y70.654333 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 158) +G0 X100.160667 Y70.442667 (start point) +G1 Z#101 F#102 +F#103 +G1 X99.906667 Y70.273333 +G1 X99.737333 Y70.061667 +G1 X78.655333 Y70.061667 +G1 X77.343000 Y68.791667 +G1 X51.985333 Y68.791667 +G1 X51.773667 Y69.045667 +G1 X51.519667 Y69.172667 +G1 X51.265667 Y69.172667 +G1 X51.011667 Y68.961000 +G1 X50.800000 Y68.707000 +G1 X50.800000 Y68.410667 +G1 X51.011667 Y68.156667 +G1 X51.265667 Y67.945000 +G1 X51.519667 Y67.945000 +G1 X51.773667 Y68.072000 +G1 X51.985333 Y68.326000 +G1 X77.512333 Y68.326000 +G1 X78.824667 Y69.596000 +G1 X99.737333 Y69.596000 +G1 X99.949000 Y69.342000 +G1 X100.203000 Y69.215000 +G1 X100.457000 Y69.215000 +G1 X100.711000 Y69.426667 +G1 X100.922667 Y69.680667 +G1 X100.922667 Y69.977000 +G1 X100.711000 Y70.231000 +G1 X100.457000 Y70.442667 +G1 X100.160667 Y70.442667 +G0 Z#100 +(polygon end, distance 103.25) +(polygon 159) +G0 X105.240667 Y70.442667 (start point) +G1 Z#101 F#102 +F#103 +G1 X104.986667 Y70.231000 +G1 X104.775000 Y69.977000 +G1 X104.775000 Y69.680667 +G1 X104.986667 Y69.426667 +G1 X105.240667 Y69.215000 +G1 X105.494667 Y69.215000 +G1 X105.748667 Y69.342000 +G1 X105.960333 Y69.596000 +G1 X157.522333 Y69.596000 +G1 X157.734000 Y69.342000 +G1 X157.988000 Y69.215000 +G1 X158.242000 Y69.215000 +G1 X158.496000 Y69.426667 +G1 X158.707667 Y69.680667 +G1 X158.707667 Y69.977000 +G1 X158.496000 Y70.231000 +G1 X158.242000 Y70.442667 +G1 X157.988000 Y70.442667 +G1 X157.734000 Y70.315667 +G1 X157.522333 Y70.061667 +G1 X105.960333 Y70.061667 +G1 X105.748667 Y70.315667 +G1 X105.494667 Y70.442667 +G1 X105.240667 Y70.442667 +G0 Z#100 +(polygon end, distance 109.84) +(polygon 160) +G0 X14.435667 Y70.061667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y69.977000 +G1 X13.800667 Y69.596000 +G1 X13.716000 Y69.257333 +G1 X13.758333 Y68.876333 +G1 X14.012333 Y68.537667 +G1 X14.308667 Y68.368333 +G1 X14.859000 Y68.368333 +G1 X15.197667 Y68.580000 +G1 X15.409333 Y68.918667 +G1 X15.409333 Y69.469000 +G1 X15.197667 Y69.807667 +G1 X14.859000 Y70.019333 +G1 X14.435667 Y70.061667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 161) +G0 X16.975667 Y70.061667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y69.977000 +G1 X16.340667 Y69.596000 +G1 X16.256000 Y69.257333 +G1 X16.298333 Y68.876333 +G1 X16.552333 Y68.537667 +G1 X16.848667 Y68.368333 +G1 X17.399000 Y68.368333 +G1 X17.737667 Y68.580000 +G1 X17.949333 Y68.918667 +G1 X17.949333 Y69.469000 +G1 X17.737667 Y69.807667 +G1 X17.399000 Y70.019333 +G1 X16.975667 Y70.061667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 162) +G0 X19.515667 Y70.061667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y69.977000 +G1 X18.880667 Y69.596000 +G1 X18.796000 Y69.257333 +G1 X18.838333 Y68.876333 +G1 X19.092333 Y68.537667 +G1 X19.388667 Y68.368333 +G1 X19.939000 Y68.368333 +G1 X20.277667 Y68.580000 +G1 X20.489333 Y68.918667 +G1 X20.489333 Y69.469000 +G1 X20.277667 Y69.807667 +G1 X19.939000 Y70.019333 +G1 X19.515667 Y70.061667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 163) +G0 X162.390667 Y69.257333 (start point) +G1 Z#101 F#102 +F#103 +G1 X162.136667 Y69.172667 +G1 X161.755667 Y68.791667 +G1 X161.671000 Y68.453000 +G1 X161.713333 Y68.072000 +G1 X161.967333 Y67.733333 +G1 X162.263667 Y67.564000 +G1 X162.814000 Y67.564000 +G1 X163.152667 Y67.775667 +G1 X163.364333 Y68.114333 +G1 X163.364333 Y68.664667 +G1 X163.152667 Y69.003333 +G1 X162.814000 Y69.215000 +G1 X162.390667 Y69.257333 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 164) +G0 X102.700667 Y69.172667 (start point) +G1 Z#101 F#102 +F#103 +G1 X102.446667 Y68.961000 +G1 X102.235000 Y68.707000 +G1 X102.235000 Y68.410667 +G1 X102.446667 Y68.156667 +G1 X102.700667 Y67.945000 +G1 X102.954667 Y67.945000 +G1 X103.208667 Y68.072000 +G1 X103.420333 Y68.326000 +G1 X156.252333 Y68.326000 +G1 X156.464000 Y68.072000 +G1 X156.718000 Y67.945000 +G1 X156.972000 Y67.945000 +G1 X157.226000 Y68.156667 +G1 X157.437667 Y68.410667 +G1 X157.437667 Y68.707000 +G1 X157.226000 Y68.961000 +G1 X156.972000 Y69.172667 +G1 X156.718000 Y69.172667 +G1 X156.464000 Y69.045667 +G1 X156.252333 Y68.791667 +G1 X103.420333 Y68.791667 +G1 X103.208667 Y69.045667 +G1 X102.954667 Y69.172667 +G1 X102.700667 Y69.172667 +G0 Z#100 +(polygon end, distance 112.38) +(polygon 165) +G0 X81.703333 Y69.130333 (start point) +G1 Z#101 F#102 +F#103 +G1 X81.322333 Y69.003333 +G1 X80.814333 Y68.495333 +G1 X80.687333 Y68.072000 +G1 X80.687333 Y67.775667 +G1 X80.814333 Y67.352333 +G1 X81.322333 Y66.844333 +G1 X81.788000 Y66.717333 +G1 X82.211333 Y66.759667 +G1 X82.634667 Y66.971333 +G1 X88.138000 Y66.971333 +G1 X88.561333 Y66.759667 +G1 X88.984667 Y66.717333 +G1 X89.450333 Y66.844333 +G1 X89.958333 Y67.352333 +G1 X90.085333 Y67.775667 +G1 X90.085333 Y68.072000 +G1 X89.958333 Y68.495333 +G1 X89.450333 Y69.003333 +G1 X88.984667 Y69.130333 +G1 X88.561333 Y69.088000 +G1 X88.138000 Y68.876333 +G1 X82.634667 Y68.876333 +G1 X82.211333 Y69.088000 +G1 X81.703333 Y69.130333 +G0 Z#100 +(polygon end, distance 21.77) +(polygon 166) +G0 X79.205667 Y68.537667 (start point) +G1 Z#101 F#102 +F#103 +G1 X78.951667 Y68.326000 +G1 X78.740000 Y68.072000 +G1 X78.782333 Y67.648667 +G1 X78.613000 Y67.521667 +G1 X42.460333 Y67.521667 +G1 X42.248667 Y67.775667 +G1 X41.994667 Y67.902667 +G1 X41.740667 Y67.902667 +G1 X41.486667 Y67.691000 +G1 X41.275000 Y67.437000 +G1 X41.275000 Y67.140667 +G1 X41.486667 Y66.886667 +G1 X41.740667 Y66.675000 +G1 X41.994667 Y66.675000 +G1 X42.248667 Y66.802000 +G1 X42.460333 Y67.056000 +G1 X78.782333 Y67.056000 +G1 X79.121000 Y67.352333 +G1 X79.502000 Y67.310000 +G1 X79.756000 Y67.521667 +G1 X79.967667 Y67.775667 +G1 X79.967667 Y68.072000 +G1 X79.756000 Y68.326000 +G1 X79.502000 Y68.537667 +G1 X79.205667 Y68.537667 +G0 Z#100 +(polygon end, distance 79.88) +(polygon 167) +G0 X92.540667 Y68.537667 (start point) +G1 Z#101 F#102 +F#103 +G1 X92.286667 Y68.326000 +G1 X92.075000 Y68.072000 +G1 X92.075000 Y67.775667 +G1 X92.286667 Y67.521667 +G1 X92.540667 Y67.310000 +G1 X92.794667 Y67.310000 +G1 X93.048667 Y67.437000 +G1 X93.260333 Y67.691000 +G1 X99.737333 Y67.691000 +G1 X99.949000 Y67.437000 +G1 X100.203000 Y67.310000 +G1 X100.457000 Y67.310000 +G1 X100.711000 Y67.521667 +G1 X100.922667 Y67.775667 +G1 X100.922667 Y68.072000 +G1 X100.711000 Y68.326000 +G1 X100.457000 Y68.537667 +G1 X100.203000 Y68.537667 +G1 X99.949000 Y68.410667 +G1 X99.737333 Y68.156667 +G1 X93.260333 Y68.156667 +G1 X93.048667 Y68.410667 +G1 X92.794667 Y68.537667 +G1 X92.540667 Y68.537667 +G0 Z#100 +(polygon end, distance 19.67) +(polygon 168) +G0 X159.808333 Y67.945000 (start point) +G1 Z#101 F#102 +F#103 +G1 X159.385000 Y67.733333 +G1 X159.173333 Y67.437000 +G1 X159.046333 Y67.140667 +G1 X159.046333 Y65.743667 +G1 X158.326667 Y65.066333 +G1 X126.026333 Y65.066333 +G1 X126.026333 Y66.167000 +G1 X125.899333 Y66.463333 +G1 X125.899333 Y66.844333 +G1 X125.518333 Y66.844333 +G1 X125.222000 Y66.971333 +G1 X124.925667 Y66.971333 +G1 X124.629333 Y66.844333 +G1 X124.248333 Y66.844333 +G1 X124.248333 Y66.463333 +G1 X124.121333 Y66.167000 +G1 X124.121333 Y65.066333 +G1 X117.136333 Y65.066333 +G1 X117.094000 Y66.294000 +G1 X116.840000 Y66.675000 +G1 X116.459000 Y66.929000 +G1 X115.908667 Y66.929000 +G1 X115.527667 Y66.675000 +G1 X115.273667 Y66.294000 +G1 X115.231333 Y65.066333 +G1 X114.046000 Y65.066333 +G1 X112.225667 Y66.844333 +G1 X111.844667 Y66.971333 +G1 X111.463667 Y66.929000 +G1 X111.082667 Y66.675000 +G1 X110.828667 Y66.294000 +G1 X110.786333 Y65.913000 +G1 X110.913333 Y65.532000 +G1 X113.030000 Y63.373000 +G1 X113.453333 Y63.161333 +G1 X158.919333 Y63.161333 +G1 X159.342667 Y63.373000 +G1 X160.824333 Y64.897000 +G1 X160.951333 Y65.278000 +G1 X160.909000 Y67.267667 +G1 X160.655000 Y67.648667 +G1 X160.274000 Y67.902667 +G1 X159.808333 Y67.945000 +G0 Z#100 +(polygon end, distance 114.53) +(polygon 169) +G0 X14.435667 Y67.521667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y67.437000 +G1 X13.800667 Y67.056000 +G1 X13.716000 Y66.717333 +G1 X13.758333 Y66.336333 +G1 X14.012333 Y65.997667 +G1 X14.308667 Y65.828333 +G1 X14.859000 Y65.828333 +G1 X15.197667 Y66.040000 +G1 X15.409333 Y66.378667 +G1 X15.409333 Y66.929000 +G1 X15.197667 Y67.267667 +G1 X14.859000 Y67.479333 +G1 X14.435667 Y67.521667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 170) +G0 X16.975667 Y67.521667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y67.437000 +G1 X16.340667 Y67.056000 +G1 X16.256000 Y66.717333 +G1 X16.298333 Y66.336333 +G1 X16.552333 Y65.997667 +G1 X16.848667 Y65.828333 +G1 X17.399000 Y65.828333 +G1 X17.737667 Y66.040000 +G1 X17.949333 Y66.378667 +G1 X17.949333 Y66.929000 +G1 X17.737667 Y67.267667 +G1 X17.399000 Y67.479333 +G1 X16.975667 Y67.521667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 171) +G0 X19.515667 Y67.521667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y67.437000 +G1 X18.880667 Y67.056000 +G1 X18.796000 Y66.717333 +G1 X18.838333 Y66.336333 +G1 X19.092333 Y65.997667 +G1 X19.388667 Y65.828333 +G1 X19.939000 Y65.828333 +G1 X20.277667 Y66.040000 +G1 X20.489333 Y66.378667 +G1 X20.489333 Y66.929000 +G1 X20.277667 Y67.267667 +G1 X19.939000 Y67.479333 +G1 X19.515667 Y67.521667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 172) +G0 X34.120667 Y66.886667 (start point) +G1 Z#101 F#102 +F#103 +G1 X33.909000 Y66.802000 +G1 X33.612667 Y66.590333 +G1 X33.443333 Y66.294000 +G1 X33.401000 Y65.955333 +G1 X33.485667 Y65.616667 +G1 X33.824333 Y65.278000 +G1 X33.824333 Y64.050333 +G1 X33.909000 Y63.881000 +G1 X35.856333 Y61.891333 +G1 X36.110333 Y61.764333 +G1 X48.175333 Y61.764333 +G1 X48.217667 Y61.637333 +G1 X48.556333 Y61.383333 +G1 X48.937333 Y61.341000 +G1 X49.276000 Y61.425667 +G1 X49.614667 Y61.764333 +G1 X59.605333 Y61.764333 +G1 X59.647667 Y61.637333 +G1 X59.986333 Y61.383333 +G1 X60.367333 Y61.341000 +G1 X60.706000 Y61.425667 +G1 X61.044667 Y61.764333 +G1 X77.978000 Y61.764333 +G1 X78.316667 Y61.425667 +G1 X78.655333 Y61.341000 +G1 X79.036333 Y61.383333 +G1 X79.375000 Y61.637333 +G1 X79.544333 Y61.933667 +G1 X79.544333 Y62.484000 +G1 X79.375000 Y62.780333 +G1 X79.036333 Y63.034333 +G1 X78.655333 Y63.076667 +G1 X78.316667 Y62.992000 +G1 X77.978000 Y62.653333 +G1 X61.002333 Y62.653333 +G1 X60.960000 Y62.780333 +G1 X60.621333 Y63.034333 +G1 X60.240333 Y63.076667 +G1 X59.901667 Y62.992000 +G1 X59.563000 Y62.653333 +G1 X49.572333 Y62.653333 +G1 X49.530000 Y62.780333 +G1 X49.191333 Y63.034333 +G1 X48.810333 Y63.076667 +G1 X48.471667 Y62.992000 +G1 X48.133000 Y62.653333 +G1 X36.322000 Y62.653333 +G1 X34.713333 Y64.304333 +G1 X34.713333 Y65.278000 +G1 X35.052000 Y65.616667 +G1 X35.136667 Y65.955333 +G1 X35.094333 Y66.336333 +G1 X34.840333 Y66.675000 +G1 X34.544000 Y66.844333 +G1 X34.120667 Y66.886667 +G0 Z#100 +(polygon end, distance 101.61) +(polygon 173) +G0 X37.846000 Y66.886667 (start point) +G1 Z#101 F#102 +F#103 +G1 X37.846000 Y65.151000 +G1 X39.581667 Y65.151000 +G1 X39.581667 Y66.886667 +G1 X37.846000 Y66.886667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 174) +G0 X48.725667 Y66.886667 (start point) +G1 Z#101 F#102 +F#103 +G1 X48.471667 Y66.802000 +G1 X48.090667 Y66.421000 +G1 X48.006000 Y66.082333 +G1 X48.048333 Y65.701333 +G1 X48.302333 Y65.362667 +G1 X48.598667 Y65.193333 +G1 X49.149000 Y65.193333 +G1 X49.487667 Y65.405000 +G1 X49.699333 Y65.743667 +G1 X49.699333 Y66.294000 +G1 X49.487667 Y66.632667 +G1 X49.149000 Y66.844333 +G1 X48.725667 Y66.886667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 175) +G0 X53.170667 Y66.886667 (start point) +G1 Z#101 F#102 +F#103 +G1 X52.916667 Y66.802000 +G1 X52.535667 Y66.421000 +G1 X52.451000 Y66.082333 +G1 X52.493333 Y65.701333 +G1 X52.747333 Y65.362667 +G1 X53.043667 Y65.193333 +G1 X53.594000 Y65.193333 +G1 X53.932667 Y65.405000 +G1 X54.144333 Y65.786000 +G1 X57.192333 Y65.786000 +G1 X57.404000 Y65.532000 +G1 X57.658000 Y65.405000 +G1 X57.912000 Y65.405000 +G1 X58.166000 Y65.616667 +G1 X58.377667 Y65.870667 +G1 X58.377667 Y66.167000 +G1 X58.166000 Y66.421000 +G1 X57.912000 Y66.632667 +G1 X57.658000 Y66.632667 +G1 X57.404000 Y66.505667 +G1 X57.192333 Y66.251667 +G1 X54.144333 Y66.251667 +G1 X53.932667 Y66.632667 +G1 X53.594000 Y66.844333 +G1 X53.170667 Y66.886667 +G0 Z#100 +(polygon end, distance 14.40) +(polygon 176) +G0 X62.611000 Y66.886667 (start point) +G1 Z#101 F#102 +F#103 +G1 X62.611000 Y65.151000 +G1 X64.346667 Y65.151000 +G1 X64.346667 Y65.786000 +G1 X67.691000 Y65.786000 +G1 X67.691000 Y65.151000 +G1 X69.088000 Y65.151000 +G1 X69.765333 Y64.516000 +G1 X87.037333 Y64.516000 +G1 X87.249000 Y64.262000 +G1 X87.503000 Y64.135000 +G1 X87.757000 Y64.135000 +G1 X88.011000 Y64.346667 +G1 X88.222667 Y64.600667 +G1 X88.222667 Y64.897000 +G1 X88.011000 Y65.151000 +G1 X87.757000 Y65.362667 +G1 X87.503000 Y65.362667 +G1 X87.249000 Y65.235667 +G1 X87.037333 Y64.981667 +G1 X69.934667 Y64.981667 +G1 X69.426667 Y65.447333 +G1 X69.426667 Y66.886667 +G1 X67.691000 Y66.886667 +G1 X67.691000 Y66.251667 +G1 X64.346667 Y66.251667 +G1 X64.346667 Y66.886667 +G1 X62.611000 Y66.886667 +G0 Z#100 +(polygon end, distance 58.36) +(polygon 177) +G0 X78.570667 Y66.886667 (start point) +G1 Z#101 F#102 +F#103 +G1 X78.316667 Y66.802000 +G1 X77.935667 Y66.421000 +G1 X77.851000 Y66.082333 +G1 X77.893333 Y65.701333 +G1 X78.147333 Y65.362667 +G1 X78.443667 Y65.193333 +G1 X78.994000 Y65.193333 +G1 X79.332667 Y65.405000 +G1 X79.544333 Y65.743667 +G1 X79.544333 Y66.294000 +G1 X79.332667 Y66.632667 +G1 X78.994000 Y66.844333 +G1 X78.570667 Y66.886667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 178) +G0 X83.015667 Y66.886667 (start point) +G1 Z#101 F#102 +F#103 +G1 X82.761667 Y66.802000 +G1 X82.380667 Y66.421000 +G1 X82.296000 Y66.082333 +G1 X82.338333 Y65.701333 +G1 X82.592333 Y65.362667 +G1 X82.888667 Y65.193333 +G1 X83.439000 Y65.193333 +G1 X83.777667 Y65.405000 +G1 X83.989333 Y65.743667 +G1 X83.989333 Y66.294000 +G1 X83.777667 Y66.632667 +G1 X83.439000 Y66.844333 +G1 X83.015667 Y66.886667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 179) +G0 X92.456000 Y66.886667 (start point) +G1 Z#101 F#102 +F#103 +G1 X92.456000 Y65.151000 +G1 X94.191667 Y65.151000 +G1 X94.191667 Y66.886667 +G1 X92.456000 Y66.886667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 180) +G0 X98.171000 Y66.886667 (start point) +G1 Z#101 F#102 +F#103 +G1 X98.171000 Y65.151000 +G1 X99.906667 Y65.151000 +G1 X99.906667 Y66.886667 +G1 X98.171000 Y66.886667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 181) +G0 X101.430667 Y66.886667 (start point) +G1 Z#101 F#102 +F#103 +G1 X101.176667 Y66.802000 +G1 X100.795667 Y66.421000 +G1 X100.711000 Y66.082333 +G1 X100.753333 Y65.701333 +G1 X101.007333 Y65.362667 +G1 X101.303667 Y65.193333 +G1 X101.854000 Y65.193333 +G1 X102.192667 Y65.405000 +G1 X102.404333 Y65.743667 +G1 X102.404333 Y66.294000 +G1 X102.192667 Y66.632667 +G1 X101.854000 Y66.844333 +G1 X101.430667 Y66.886667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 182) +G0 X106.426000 Y66.886667 (start point) +G1 Z#101 F#102 +F#103 +G1 X106.426000 Y65.151000 +G1 X108.161667 Y65.151000 +G1 X108.161667 Y66.886667 +G1 X106.426000 Y66.886667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 183) +G0 X109.685667 Y66.886667 (start point) +G1 Z#101 F#102 +F#103 +G1 X109.431667 Y66.802000 +G1 X109.050667 Y66.421000 +G1 X108.966000 Y66.082333 +G1 X109.008333 Y65.701333 +G1 X109.262333 Y65.362667 +G1 X109.558667 Y65.193333 +G1 X110.109000 Y65.193333 +G1 X110.447667 Y65.405000 +G1 X110.659333 Y65.743667 +G1 X110.659333 Y66.294000 +G1 X110.447667 Y66.632667 +G1 X110.109000 Y66.844333 +G1 X109.685667 Y66.886667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 184) +G0 X117.856000 Y66.886667 (start point) +G1 Z#101 F#102 +F#103 +G1 X117.856000 Y65.151000 +G1 X119.591667 Y65.151000 +G1 X119.591667 Y66.886667 +G1 X117.856000 Y66.886667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 185) +G0 X135.085667 Y66.844333 (start point) +G1 Z#101 F#102 +F#103 +G1 X134.831667 Y66.717333 +G1 X134.577667 Y66.505667 +G1 X134.450667 Y66.251667 +G1 X130.090333 Y66.251667 +G1 X129.878667 Y66.505667 +G1 X129.624667 Y66.632667 +G1 X129.370667 Y66.632667 +G1 X129.116667 Y66.421000 +G1 X128.905000 Y66.167000 +G1 X128.905000 Y65.870667 +G1 X129.116667 Y65.616667 +G1 X129.370667 Y65.405000 +G1 X129.624667 Y65.405000 +G1 X129.878667 Y65.532000 +G1 X130.090333 Y65.786000 +G1 X134.450667 Y65.786000 +G1 X134.577667 Y65.532000 +G1 X134.831667 Y65.320333 +G1 X135.128000 Y65.193333 +G1 X135.339667 Y65.193333 +G1 X135.636000 Y65.320333 +G1 X135.890000 Y65.532000 +G1 X136.059333 Y65.870667 +G1 X136.059333 Y66.167000 +G1 X135.890000 Y66.505667 +G1 X135.636000 Y66.717333 +G1 X135.339667 Y66.844333 +G1 X135.085667 Y66.844333 +G0 Z#100 +(polygon end, distance 16.74) +(polygon 186) +G0 X85.555667 Y66.632667 (start point) +G1 Z#101 F#102 +F#103 +G1 X85.301667 Y66.421000 +G1 X85.090000 Y66.167000 +G1 X85.090000 Y65.870667 +G1 X85.301667 Y65.616667 +G1 X85.555667 Y65.405000 +G1 X85.809667 Y65.405000 +G1 X86.063667 Y65.532000 +G1 X86.275333 Y65.786000 +G1 X88.307333 Y65.786000 +G1 X88.519000 Y65.532000 +G1 X88.773000 Y65.405000 +G1 X89.027000 Y65.405000 +G1 X89.281000 Y65.616667 +G1 X89.492667 Y65.870667 +G1 X89.492667 Y66.167000 +G1 X89.281000 Y66.421000 +G1 X89.027000 Y66.632667 +G1 X88.773000 Y66.632667 +G1 X88.519000 Y66.505667 +G1 X88.307333 Y66.251667 +G1 X86.275333 Y66.251667 +G1 X86.063667 Y66.505667 +G1 X85.809667 Y66.632667 +G1 X85.555667 Y66.632667 +G0 Z#100 +(polygon end, distance 10.78) +(polygon 187) +G0 X14.435667 Y64.981667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y64.897000 +G1 X13.800667 Y64.516000 +G1 X13.716000 Y64.177333 +G1 X13.758333 Y63.796333 +G1 X14.012333 Y63.457667 +G1 X14.308667 Y63.288333 +G1 X14.859000 Y63.288333 +G1 X15.197667 Y63.500000 +G1 X15.409333 Y63.838667 +G1 X15.409333 Y64.389000 +G1 X15.197667 Y64.727667 +G1 X14.859000 Y64.939333 +G1 X14.435667 Y64.981667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 188) +G0 X16.975667 Y64.981667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y64.897000 +G1 X16.340667 Y64.516000 +G1 X16.256000 Y64.177333 +G1 X16.298333 Y63.796333 +G1 X16.552333 Y63.457667 +G1 X16.848667 Y63.288333 +G1 X17.399000 Y63.288333 +G1 X17.737667 Y63.500000 +G1 X17.949333 Y63.838667 +G1 X17.949333 Y64.389000 +G1 X17.737667 Y64.727667 +G1 X17.399000 Y64.939333 +G1 X16.975667 Y64.981667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 189) +G0 X19.515667 Y64.981667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y64.897000 +G1 X18.880667 Y64.516000 +G1 X18.796000 Y64.177333 +G1 X18.838333 Y63.796333 +G1 X19.092333 Y63.457667 +G1 X19.388667 Y63.288333 +G1 X19.939000 Y63.288333 +G1 X20.277667 Y63.500000 +G1 X20.489333 Y63.838667 +G1 X20.489333 Y64.389000 +G1 X20.277667 Y64.727667 +G1 X19.939000 Y64.939333 +G1 X19.515667 Y64.981667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 190) +G0 X36.660667 Y64.092667 (start point) +G1 Z#101 F#102 +F#103 +G1 X36.406667 Y63.881000 +G1 X36.195000 Y63.627000 +G1 X36.195000 Y63.330667 +G1 X36.406667 Y63.076667 +G1 X36.660667 Y62.865000 +G1 X36.914667 Y62.865000 +G1 X37.168667 Y62.992000 +G1 X37.380333 Y63.246000 +G1 X97.197333 Y63.246000 +G1 X97.409000 Y62.992000 +G1 X97.663000 Y62.865000 +G1 X97.917000 Y62.865000 +G1 X98.171000 Y63.076667 +G1 X98.382667 Y63.330667 +G1 X98.382667 Y63.627000 +G1 X98.171000 Y63.881000 +G1 X97.917000 Y64.092667 +G1 X97.663000 Y64.092667 +G1 X97.409000 Y63.965667 +G1 X97.197333 Y63.711667 +G1 X37.380333 Y63.711667 +G1 X37.168667 Y63.965667 +G1 X36.914667 Y64.092667 +G1 X36.660667 Y64.092667 +G0 Z#100 +(polygon end, distance 126.35) +(polygon 191) +G0 X82.380667 Y63.076667 (start point) +G1 Z#101 F#102 +F#103 +G1 X82.126667 Y62.992000 +G1 X81.745667 Y62.611000 +G1 X81.661000 Y62.272333 +G1 X81.703333 Y61.891333 +G1 X81.957333 Y61.552667 +G1 X82.253667 Y61.383333 +G1 X82.592333 Y61.341000 +G1 X82.931000 Y61.425667 +G1 X83.269667 Y61.722000 +G1 X117.983000 Y61.722000 +G1 X118.321667 Y61.425667 +G1 X118.618000 Y61.341000 +G1 X118.829667 Y61.341000 +G1 X119.126000 Y61.425667 +G1 X119.464667 Y61.722000 +G1 X134.493000 Y61.722000 +G1 X134.831667 Y61.425667 +G1 X135.128000 Y61.341000 +G1 X135.339667 Y61.341000 +G1 X135.636000 Y61.425667 +G1 X135.974667 Y61.722000 +G1 X138.938000 Y61.722000 +G1 X139.276667 Y61.425667 +G1 X139.615333 Y61.341000 +G1 X139.996333 Y61.383333 +G1 X140.335000 Y61.637333 +G1 X140.504333 Y61.933667 +G1 X140.504333 Y62.484000 +G1 X140.335000 Y62.780333 +G1 X139.996333 Y63.034333 +G1 X139.615333 Y63.076667 +G1 X139.276667 Y62.992000 +G1 X138.938000 Y62.695667 +G1 X135.974667 Y62.695667 +G1 X135.636000 Y62.992000 +G1 X135.339667 Y63.076667 +G1 X135.128000 Y63.076667 +G1 X134.831667 Y62.992000 +G1 X134.493000 Y62.695667 +G1 X119.464667 Y62.695667 +G1 X119.126000 Y62.992000 +G1 X118.829667 Y63.076667 +G1 X118.618000 Y63.076667 +G1 X118.321667 Y62.992000 +G1 X117.983000 Y62.695667 +G1 X83.269667 Y62.695667 +G1 X82.931000 Y62.992000 +G1 X82.634667 Y63.076667 +G1 X82.380667 Y63.076667 +G0 Z#100 +(polygon end, distance 121.22) +(polygon 192) +G0 X14.435667 Y62.441667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y62.357000 +G1 X13.800667 Y61.976000 +G1 X13.716000 Y61.637333 +G1 X13.758333 Y61.256333 +G1 X14.012333 Y60.917667 +G1 X14.308667 Y60.748333 +G1 X14.859000 Y60.748333 +G1 X15.197667 Y60.960000 +G1 X15.409333 Y61.298667 +G1 X15.409333 Y61.849000 +G1 X15.197667 Y62.187667 +G1 X14.859000 Y62.399333 +G1 X14.435667 Y62.441667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 193) +G0 X16.975667 Y62.441667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y62.357000 +G1 X16.340667 Y61.976000 +G1 X16.256000 Y61.637333 +G1 X16.298333 Y61.256333 +G1 X16.552333 Y60.917667 +G1 X16.848667 Y60.748333 +G1 X17.399000 Y60.748333 +G1 X17.737667 Y60.960000 +G1 X17.949333 Y61.298667 +G1 X17.949333 Y61.849000 +G1 X17.737667 Y62.187667 +G1 X17.399000 Y62.399333 +G1 X16.975667 Y62.441667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 194) +G0 X19.515667 Y62.441667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y62.357000 +G1 X18.880667 Y61.976000 +G1 X18.796000 Y61.637333 +G1 X18.838333 Y61.256333 +G1 X19.092333 Y60.917667 +G1 X19.388667 Y60.748333 +G1 X19.939000 Y60.748333 +G1 X20.277667 Y60.960000 +G1 X20.489333 Y61.298667 +G1 X20.489333 Y61.849000 +G1 X20.277667 Y62.187667 +G1 X19.939000 Y62.399333 +G1 X19.515667 Y62.441667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 195) +G0 X160.993667 Y62.018333 (start point) +G1 Z#101 F#102 +F#103 +G1 X160.612667 Y61.891333 +G1 X160.189333 Y61.679667 +G1 X159.723667 Y61.214000 +G1 X159.512000 Y60.790667 +G1 X159.385000 Y60.367333 +G1 X159.385000 Y59.901667 +G1 X159.512000 Y59.478333 +G1 X159.723667 Y59.055000 +G1 X160.189333 Y58.589333 +G1 X160.612667 Y58.377667 +G1 X161.036000 Y58.250667 +G1 X161.501667 Y58.250667 +G1 X161.925000 Y58.377667 +G1 X162.348333 Y58.589333 +G1 X162.814000 Y59.055000 +G1 X163.025667 Y59.478333 +G1 X163.152667 Y59.901667 +G1 X163.152667 Y60.367333 +G1 X163.025667 Y60.790667 +G1 X162.814000 Y61.214000 +G1 X162.348333 Y61.679667 +G1 X161.925000 Y61.891333 +G1 X161.501667 Y62.018333 +G1 X160.993667 Y62.018333 +G0 Z#100 +(polygon end, distance 11.82) +(polygon 196) +G0 X90.635667 Y61.552667 (start point) +G1 Z#101 F#102 +F#103 +G1 X90.381667 Y61.341000 +G1 X90.170000 Y61.087000 +G1 X90.170000 Y60.790667 +G1 X90.381667 Y60.536667 +G1 X90.635667 Y60.325000 +G1 X90.889667 Y60.325000 +G1 X91.143667 Y60.452000 +G1 X91.355333 Y60.706000 +G1 X122.597333 Y60.706000 +G1 X122.809000 Y60.452000 +G1 X123.063000 Y60.325000 +G1 X123.317000 Y60.325000 +G1 X123.571000 Y60.536667 +G1 X123.782667 Y60.790667 +G1 X123.782667 Y61.087000 +G1 X123.571000 Y61.341000 +G1 X123.317000 Y61.552667 +G1 X123.063000 Y61.552667 +G1 X122.809000 Y61.425667 +G1 X122.597333 Y61.171667 +G1 X91.355333 Y61.171667 +G1 X91.143667 Y61.425667 +G1 X90.889667 Y61.552667 +G1 X90.635667 Y61.552667 +G0 Z#100 +(polygon end, distance 69.20) +(polygon 197) +G0 X113.495667 Y60.536667 (start point) +G1 Z#101 F#102 +F#103 +G1 X113.241667 Y60.452000 +G1 X112.860667 Y60.071000 +G1 X112.776000 Y59.732333 +G1 X112.818333 Y59.351333 +G1 X113.072333 Y59.012667 +G1 X113.368667 Y58.843333 +G1 X113.707333 Y58.801000 +G1 X114.046000 Y58.885667 +G1 X114.384667 Y59.224333 +G1 X115.443000 Y59.224333 +G1 X115.781667 Y58.885667 +G1 X116.120333 Y58.801000 +G1 X116.501333 Y58.843333 +G1 X116.840000 Y59.097333 +G1 X117.009333 Y59.393667 +G1 X117.009333 Y59.944000 +G1 X116.840000 Y60.240333 +G1 X116.501333 Y60.494333 +G1 X116.120333 Y60.536667 +G1 X115.781667 Y60.452000 +G1 X115.443000 Y60.113333 +G1 X114.384667 Y60.113333 +G1 X114.046000 Y60.452000 +G1 X113.749667 Y60.536667 +G1 X113.495667 Y60.536667 +G0 Z#100 +(polygon end, distance 11.13) +(polygon 198) +G0 X117.856000 Y60.536667 (start point) +G1 Z#101 F#102 +F#103 +G1 X117.856000 Y58.801000 +G1 X119.591667 Y58.801000 +G1 X119.591667 Y59.224333 +G1 X124.206000 Y59.224333 +G1 X124.206000 Y58.801000 +G1 X125.941667 Y58.801000 +G1 X125.941667 Y59.224333 +G1 X131.953000 Y59.224333 +G1 X132.291667 Y58.885667 +G1 X132.630333 Y58.801000 +G1 X133.011333 Y58.843333 +G1 X133.350000 Y59.097333 +G1 X133.519333 Y59.393667 +G1 X133.519333 Y59.944000 +G1 X133.350000 Y60.240333 +G1 X133.011333 Y60.494333 +G1 X132.630333 Y60.536667 +G1 X132.291667 Y60.452000 +G1 X131.953000 Y60.113333 +G1 X125.941667 Y60.113333 +G1 X125.941667 Y60.536667 +G1 X124.206000 Y60.536667 +G1 X124.206000 Y60.113333 +G1 X119.591667 Y60.113333 +G1 X119.591667 Y60.536667 +G1 X117.856000 Y60.536667 +G0 Z#100 +(polygon end, distance 36.97) +(polygon 199) +G0 X135.085667 Y60.536667 (start point) +G1 Z#101 F#102 +F#103 +G1 X134.831667 Y60.452000 +G1 X134.450667 Y60.071000 +G1 X134.366000 Y59.732333 +G1 X134.408333 Y59.351333 +G1 X134.662333 Y59.012667 +G1 X134.958667 Y58.843333 +G1 X135.509000 Y58.843333 +G1 X135.847667 Y59.055000 +G1 X136.059333 Y59.393667 +G1 X136.059333 Y59.944000 +G1 X135.847667 Y60.282667 +G1 X135.509000 Y60.494333 +G1 X135.085667 Y60.536667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 200) +G0 X55.075667 Y60.282667 (start point) +G1 Z#101 F#102 +F#103 +G1 X54.821667 Y60.071000 +G1 X54.610000 Y59.817000 +G1 X54.610000 Y59.520667 +G1 X54.821667 Y59.266667 +G1 X55.075667 Y59.055000 +G1 X55.329667 Y59.055000 +G1 X55.583667 Y59.182000 +G1 X55.795333 Y59.436000 +G1 X95.292333 Y59.436000 +G1 X95.504000 Y59.182000 +G1 X95.758000 Y59.055000 +G1 X96.012000 Y59.055000 +G1 X96.266000 Y59.266667 +G1 X96.477667 Y59.520667 +G1 X96.477667 Y59.817000 +G1 X96.266000 Y60.071000 +G1 X96.012000 Y60.282667 +G1 X95.758000 Y60.282667 +G1 X95.504000 Y60.155667 +G1 X95.292333 Y59.901667 +G1 X55.795333 Y59.901667 +G1 X55.583667 Y60.155667 +G1 X55.329667 Y60.282667 +G1 X55.075667 Y60.282667 +G0 Z#100 +(polygon end, distance 85.71) +(polygon 201) +G0 X14.435667 Y59.901667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y59.817000 +G1 X13.800667 Y59.436000 +G1 X13.716000 Y59.097333 +G1 X13.758333 Y58.716333 +G1 X14.012333 Y58.377667 +G1 X14.308667 Y58.208333 +G1 X14.859000 Y58.208333 +G1 X15.197667 Y58.420000 +G1 X15.409333 Y58.758667 +G1 X15.409333 Y59.309000 +G1 X15.197667 Y59.647667 +G1 X14.859000 Y59.859333 +G1 X14.435667 Y59.901667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 202) +G0 X16.975667 Y59.901667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y59.817000 +G1 X16.340667 Y59.436000 +G1 X16.256000 Y59.097333 +G1 X16.298333 Y58.716333 +G1 X16.552333 Y58.377667 +G1 X16.848667 Y58.208333 +G1 X17.399000 Y58.208333 +G1 X17.737667 Y58.420000 +G1 X17.949333 Y58.758667 +G1 X17.949333 Y59.309000 +G1 X17.737667 Y59.647667 +G1 X17.399000 Y59.859333 +G1 X16.975667 Y59.901667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 203) +G0 X19.515667 Y59.901667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y59.817000 +G1 X18.880667 Y59.436000 +G1 X18.796000 Y59.097333 +G1 X18.838333 Y58.716333 +G1 X19.092333 Y58.377667 +G1 X19.388667 Y58.208333 +G1 X19.939000 Y58.208333 +G1 X20.277667 Y58.420000 +G1 X20.489333 Y58.758667 +G1 X20.489333 Y59.309000 +G1 X20.277667 Y59.647667 +G1 X19.939000 Y59.859333 +G1 X19.515667 Y59.901667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 204) +G0 X141.435667 Y58.631667 (start point) +G1 Z#101 F#102 +F#103 +G1 X141.181667 Y58.547000 +G1 X140.843000 Y58.208333 +G1 X71.120000 Y58.208333 +G1 X70.950667 Y58.420000 +G1 X70.612000 Y58.589333 +G1 X70.315667 Y58.589333 +G1 X69.977000 Y58.420000 +G1 X69.765333 Y58.166000 +G1 X69.638333 Y57.869667 +G1 X69.638333 Y57.658000 +G1 X69.765333 Y57.361667 +G1 X69.977000 Y57.107667 +G1 X70.315667 Y56.938333 +G1 X62.145333 Y56.938333 +G1 X61.976000 Y56.853667 +G1 X58.716333 Y53.636333 +G1 X58.589333 Y53.382333 +G1 X58.589333 Y51.900667 +G1 X57.912000 Y51.900667 +G1 X57.912000 Y49.657000 +G1 X60.155667 Y49.657000 +G1 X60.155667 Y51.900667 +G1 X59.478333 Y51.900667 +G1 X59.478333 Y53.128333 +G1 X62.357000 Y56.049333 +G1 X109.050667 Y56.049333 +G1 X110.278333 Y54.779333 +G1 X110.278333 Y54.483000 +G1 X110.405333 Y54.186667 +G1 X110.617000 Y53.932667 +G1 X110.955667 Y53.763333 +G1 X111.209667 Y53.763333 +G1 X111.506000 Y53.890333 +G1 X111.760000 Y54.102000 +G1 X111.929333 Y54.440667 +G1 X111.929333 Y54.737000 +G1 X111.760000 Y55.075667 +G1 X111.506000 Y55.287333 +G1 X111.209667 Y55.414333 +G1 X110.913333 Y55.414333 +G1 X109.431667 Y56.853667 +G1 X109.262333 Y56.938333 +G1 X70.612000 Y56.938333 +G1 X70.950667 Y57.107667 +G1 X71.120000 Y57.319333 +G1 X140.843000 Y57.319333 +G1 X141.181667 Y56.980667 +G1 X141.520333 Y56.896000 +G1 X141.901333 Y56.938333 +G1 X142.240000 Y57.192333 +G1 X142.409333 Y57.488667 +G1 X142.409333 Y58.039000 +G1 X142.197667 Y58.377667 +G1 X141.859000 Y58.589333 +G1 X141.435667 Y58.631667 +G0 Z#100 +(polygon end, distance 269.54) +(polygon 205) +G0 X14.435667 Y57.361667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y57.277000 +G1 X13.800667 Y56.896000 +G1 X13.716000 Y56.557333 +G1 X13.758333 Y56.176333 +G1 X14.012333 Y55.837667 +G1 X14.308667 Y55.668333 +G1 X14.859000 Y55.668333 +G1 X15.197667 Y55.880000 +G1 X15.409333 Y56.218667 +G1 X15.409333 Y56.769000 +G1 X15.197667 Y57.107667 +G1 X14.859000 Y57.319333 +G1 X14.435667 Y57.361667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 206) +G0 X16.975667 Y57.361667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y57.277000 +G1 X16.340667 Y56.896000 +G1 X16.256000 Y56.557333 +G1 X16.298333 Y56.176333 +G1 X16.552333 Y55.837667 +G1 X16.848667 Y55.668333 +G1 X17.399000 Y55.668333 +G1 X17.737667 Y55.880000 +G1 X17.949333 Y56.218667 +G1 X17.949333 Y56.769000 +G1 X17.737667 Y57.107667 +G1 X17.399000 Y57.319333 +G1 X16.975667 Y57.361667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 207) +G0 X19.515667 Y57.361667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y57.277000 +G1 X18.880667 Y56.896000 +G1 X18.796000 Y56.557333 +G1 X18.838333 Y56.176333 +G1 X19.092333 Y55.837667 +G1 X19.388667 Y55.668333 +G1 X19.939000 Y55.668333 +G1 X20.277667 Y55.880000 +G1 X20.489333 Y56.218667 +G1 X20.489333 Y56.769000 +G1 X20.277667 Y57.107667 +G1 X19.939000 Y57.319333 +G1 X19.515667 Y57.361667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 208) +G0 X123.020667 Y57.107667 (start point) +G1 Z#101 F#102 +F#103 +G1 X122.766667 Y56.896000 +G1 X122.555000 Y56.642000 +G1 X122.555000 Y56.345667 +G1 X122.766667 Y56.091667 +G1 X123.020667 Y55.880000 +G1 X123.274667 Y55.880000 +G1 X123.528667 Y56.007000 +G1 X123.740333 Y56.261000 +G1 X139.107333 Y56.261000 +G1 X139.319000 Y56.007000 +G1 X139.573000 Y55.880000 +G1 X139.827000 Y55.880000 +G1 X140.081000 Y56.091667 +G1 X140.292667 Y56.345667 +G1 X140.292667 Y56.642000 +G1 X140.081000 Y56.896000 +G1 X139.827000 Y57.107667 +G1 X139.573000 Y57.107667 +G1 X139.319000 Y56.980667 +G1 X139.107333 Y56.726667 +G1 X123.740333 Y56.726667 +G1 X123.528667 Y56.980667 +G1 X123.274667 Y57.107667 +G1 X123.020667 Y57.107667 +G0 Z#100 +(polygon end, distance 37.45) +(polygon 209) +G0 X63.246000 Y55.541333 (start point) +G1 Z#101 F#102 +F#103 +G1 X62.738000 Y55.372000 +G1 X62.018333 Y54.821667 +G1 X60.494333 Y53.255333 +G1 X60.367333 Y52.789667 +G1 X60.409667 Y52.366333 +G1 X60.579000 Y51.985333 +G1 X60.536667 Y51.181000 +G1 X60.452000 Y50.757667 +G1 X60.536667 Y50.376667 +G1 X60.579000 Y49.233667 +G1 X60.367333 Y49.064333 +G1 X60.071000 Y49.191333 +G1 X23.706667 Y49.191333 +G1 X23.156333 Y48.937333 +G1 X22.733000 Y48.471667 +G1 X22.521333 Y48.006000 +G1 X22.521333 Y47.201667 +G1 X22.733000 Y46.736000 +G1 X23.156333 Y46.270333 +G1 X23.706667 Y46.016333 +G1 X60.071000 Y46.016333 +G1 X60.621333 Y46.270333 +G1 X61.044667 Y46.736000 +G1 X61.256333 Y47.201667 +G1 X62.357000 Y48.260000 +G1 X62.526333 Y48.598667 +G1 X62.611000 Y50.376667 +G1 X62.695667 Y50.800000 +G1 X62.611000 Y51.181000 +G1 X62.568667 Y52.027667 +G1 X63.034333 Y52.451000 +G1 X63.330667 Y52.366333 +G1 X95.504000 Y52.408667 +G1 X95.504000 Y51.265667 +G1 X95.377000 Y50.927000 +G1 X95.419333 Y50.461333 +G1 X95.588667 Y50.122667 +G1 X95.927333 Y49.826333 +G1 X96.181333 Y49.699333 +G1 X96.816333 Y49.699333 +G1 X97.070333 Y49.826333 +G1 X97.409000 Y50.122667 +G1 X97.578333 Y50.461333 +G1 X97.620667 Y50.927000 +G1 X97.493667 Y51.265667 +G1 X97.493667 Y52.239333 +G1 X112.903000 Y52.239333 +G1 X113.241667 Y51.900667 +G1 X113.580333 Y51.816000 +G1 X113.961333 Y51.858333 +G1 X114.300000 Y52.112333 +G1 X114.469333 Y52.408667 +G1 X114.469333 Y52.959000 +G1 X114.300000 Y53.255333 +G1 X113.961333 Y53.509333 +G1 X113.580333 Y53.551667 +G1 X113.241667 Y53.467000 +G1 X112.903000 Y53.128333 +G1 X97.747667 Y53.128333 +G1 X97.705333 Y53.636333 +G1 X97.536000 Y54.017333 +G1 X96.774000 Y54.821667 +G1 X96.435333 Y55.033333 +G1 X95.927333 Y55.372000 +G1 X95.419333 Y55.541333 +G1 X63.246000 Y55.541333 +G0 Z#100 +(polygon end, distance 203.01) +(polygon 210) +G0 X120.438333 Y55.414333 (start point) +G1 Z#101 F#102 +F#103 +G1 X120.438333 Y53.763333 +G1 X122.089333 Y53.763333 +G1 X122.089333 Y55.414333 +G1 X120.438333 Y55.414333 +G0 Z#100 +(polygon end, distance 6.60) +(polygon 211) +G0 X124.925667 Y55.414333 (start point) +G1 Z#101 F#102 +F#103 +G1 X124.587000 Y55.245000 +G1 X124.375333 Y54.991000 +G1 X124.248333 Y54.694667 +G1 X124.248333 Y54.483000 +G1 X124.375333 Y54.186667 +G1 X124.587000 Y53.932667 +G1 X124.925667 Y53.763333 +G1 X125.179667 Y53.763333 +G1 X125.476000 Y53.890333 +G1 X125.730000 Y54.102000 +G1 X125.899333 Y54.440667 +G1 X125.899333 Y54.737000 +G1 X125.730000 Y55.075667 +G1 X125.476000 Y55.287333 +G1 X125.179667 Y55.414333 +G1 X124.925667 Y55.414333 +G0 Z#100 +(polygon end, distance 5.14) +(polygon 212) +G0 X134.408333 Y55.414333 (start point) +G1 Z#101 F#102 +F#103 +G1 X134.408333 Y53.763333 +G1 X136.059333 Y53.763333 +G1 X136.059333 Y55.414333 +G1 X134.408333 Y55.414333 +G0 Z#100 +(polygon end, distance 6.60) +(polygon 213) +G0 X14.435667 Y54.821667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y54.737000 +G1 X13.800667 Y54.356000 +G1 X13.716000 Y54.017333 +G1 X13.758333 Y53.636333 +G1 X14.012333 Y53.297667 +G1 X14.308667 Y53.128333 +G1 X14.859000 Y53.128333 +G1 X15.197667 Y53.340000 +G1 X15.409333 Y53.678667 +G1 X15.409333 Y54.229000 +G1 X15.197667 Y54.567667 +G1 X14.859000 Y54.779333 +G1 X14.435667 Y54.821667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 214) +G0 X16.975667 Y54.821667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y54.737000 +G1 X16.340667 Y54.356000 +G1 X16.256000 Y54.017333 +G1 X16.298333 Y53.636333 +G1 X16.552333 Y53.297667 +G1 X16.848667 Y53.128333 +G1 X17.399000 Y53.128333 +G1 X17.737667 Y53.340000 +G1 X17.949333 Y53.678667 +G1 X17.949333 Y54.229000 +G1 X17.737667 Y54.567667 +G1 X17.399000 Y54.779333 +G1 X16.975667 Y54.821667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 215) +G0 X19.515667 Y54.821667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y54.737000 +G1 X18.880667 Y54.356000 +G1 X18.796000 Y54.017333 +G1 X18.838333 Y53.636333 +G1 X19.092333 Y53.297667 +G1 X19.388667 Y53.128333 +G1 X19.939000 Y53.128333 +G1 X20.277667 Y53.340000 +G1 X20.489333 Y53.678667 +G1 X20.489333 Y54.229000 +G1 X20.277667 Y54.567667 +G1 X19.939000 Y54.779333 +G1 X19.515667 Y54.821667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 216) +G0 X29.591000 Y54.059667 (start point) +G1 Z#101 F#102 +F#103 +G1 X29.252333 Y53.932667 +G1 X28.871333 Y53.678667 +G1 X28.575000 Y53.297667 +G1 X28.448000 Y52.832000 +G1 X28.490333 Y52.324000 +G1 X28.659667 Y51.943000 +G1 X29.083000 Y51.519667 +G1 X29.464000 Y51.350333 +G1 X30.183667 Y51.350333 +G1 X30.564667 Y51.519667 +G1 X30.988000 Y51.943000 +G1 X31.157333 Y52.324000 +G1 X31.157333 Y53.043667 +G1 X30.988000 Y53.424667 +G1 X30.564667 Y53.848000 +G1 X30.183667 Y54.017333 +G1 X29.591000 Y54.059667 +G0 Z#100 +(polygon end, distance 8.63) +(polygon 217) +G0 X38.608000 Y54.059667 (start point) +G1 Z#101 F#102 +F#103 +G1 X38.608000 Y51.308000 +G1 X41.359667 Y51.308000 +G1 X41.359667 Y54.059667 +G1 X38.608000 Y54.059667 +G0 Z#100 +(polygon end, distance 11.01) +(polygon 218) +G0 X164.253333 Y52.366333 (start point) +G1 Z#101 F#102 +F#103 +G1 X163.830000 Y52.154667 +G1 X163.576000 Y51.816000 +G1 X163.533667 Y51.646667 +G1 X149.140333 Y51.646667 +G1 X144.018000 Y46.566667 +G1 X89.450333 Y46.566667 +G1 X89.238667 Y46.820667 +G1 X88.984667 Y46.947667 +G1 X88.730667 Y46.947667 +G1 X88.476667 Y46.736000 +G1 X88.265000 Y46.482000 +G1 X88.265000 Y46.185667 +G1 X88.476667 Y45.931667 +G1 X88.730667 Y45.720000 +G1 X88.984667 Y45.720000 +G1 X89.238667 Y45.847000 +G1 X89.450333 Y46.101000 +G1 X144.187333 Y46.101000 +G1 X149.309667 Y51.181000 +G1 X163.533667 Y51.181000 +G1 X163.787667 Y50.757667 +G1 X164.168667 Y50.503667 +G1 X164.719000 Y50.503667 +G1 X165.100000 Y50.757667 +G1 X165.354000 Y51.138667 +G1 X165.354000 Y51.689000 +G1 X165.100000 Y52.070000 +G1 X164.719000 Y52.324000 +G1 X164.253333 Y52.366333 +G0 Z#100 +(polygon end, distance 161.13) +(polygon 219) +G0 X14.435667 Y52.281667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y52.197000 +G1 X13.800667 Y51.816000 +G1 X13.716000 Y51.477333 +G1 X13.758333 Y51.096333 +G1 X14.012333 Y50.757667 +G1 X14.308667 Y50.588333 +G1 X14.859000 Y50.588333 +G1 X15.197667 Y50.800000 +G1 X15.409333 Y51.138667 +G1 X15.409333 Y51.689000 +G1 X15.197667 Y52.027667 +G1 X14.859000 Y52.239333 +G1 X14.435667 Y52.281667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 220) +G0 X16.975667 Y52.281667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y52.197000 +G1 X16.340667 Y51.816000 +G1 X16.256000 Y51.477333 +G1 X16.298333 Y51.096333 +G1 X16.552333 Y50.757667 +G1 X16.848667 Y50.588333 +G1 X17.399000 Y50.588333 +G1 X17.737667 Y50.800000 +G1 X17.949333 Y51.138667 +G1 X17.949333 Y51.689000 +G1 X17.737667 Y52.027667 +G1 X17.399000 Y52.239333 +G1 X16.975667 Y52.281667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 221) +G0 X19.515667 Y52.281667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y52.197000 +G1 X18.880667 Y51.816000 +G1 X18.796000 Y51.477333 +G1 X18.838333 Y51.096333 +G1 X19.092333 Y50.757667 +G1 X19.388667 Y50.588333 +G1 X19.939000 Y50.588333 +G1 X20.277667 Y50.800000 +G1 X20.489333 Y51.138667 +G1 X20.489333 Y51.689000 +G1 X20.277667 Y52.027667 +G1 X19.939000 Y52.239333 +G1 X19.515667 Y52.281667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 222) +G0 X63.923333 Y51.900667 (start point) +G1 Z#101 F#102 +F#103 +G1 X63.711667 Y51.816000 +G1 X63.457667 Y51.689000 +G1 X63.161333 Y51.350333 +G1 X63.034333 Y51.096333 +G1 X63.034333 Y50.461333 +G1 X63.161333 Y50.207333 +G1 X63.457667 Y49.868667 +G1 X63.796333 Y49.699333 +G1 X64.431333 Y49.699333 +G1 X64.770000 Y49.868667 +G1 X65.066333 Y50.207333 +G1 X65.193333 Y50.461333 +G1 X65.193333 Y51.096333 +G1 X65.066333 Y51.350333 +G1 X64.770000 Y51.689000 +G1 X64.431333 Y51.858333 +G1 X63.923333 Y51.900667 +G0 Z#100 +(polygon end, distance 7.00) +(polygon 223) +G0 X90.297000 Y51.900667 (start point) +G1 Z#101 F#102 +F#103 +G1 X90.297000 Y49.657000 +G1 X90.974333 Y49.657000 +G1 X90.974333 Y48.810333 +G1 X91.059000 Y48.641000 +G1 X92.371333 Y47.286333 +G1 X92.625333 Y47.159333 +G1 X124.333000 Y47.159333 +G1 X124.671667 Y46.820667 +G1 X125.010333 Y46.736000 +G1 X125.391333 Y46.778333 +G1 X125.730000 Y47.032333 +G1 X125.899333 Y47.328667 +G1 X125.899333 Y47.879000 +G1 X125.730000 Y48.175333 +G1 X125.391333 Y48.429333 +G1 X125.010333 Y48.471667 +G1 X124.671667 Y48.387000 +G1 X124.333000 Y48.048333 +G1 X92.837000 Y48.048333 +G1 X91.863333 Y49.064333 +G1 X91.863333 Y49.657000 +G1 X92.540667 Y49.657000 +G1 X92.540667 Y51.900667 +G1 X90.297000 Y51.900667 +G0 Z#100 +(polygon end, distance 81.00) +(polygon 224) +G0 X93.768333 Y51.900667 (start point) +G1 Z#101 F#102 +F#103 +G1 X93.556667 Y51.816000 +G1 X93.302667 Y51.689000 +G1 X93.006333 Y51.350333 +G1 X92.879333 Y51.096333 +G1 X92.879333 Y50.461333 +G1 X93.006333 Y50.207333 +G1 X93.302667 Y49.868667 +G1 X93.641333 Y49.699333 +G1 X94.276333 Y49.699333 +G1 X94.615000 Y49.868667 +G1 X94.911333 Y50.207333 +G1 X95.038333 Y50.461333 +G1 X95.038333 Y51.096333 +G1 X94.911333 Y51.350333 +G1 X94.615000 Y51.689000 +G1 X94.276333 Y51.858333 +G1 X93.768333 Y51.900667 +G0 Z#100 +(polygon end, distance 7.00) +(polygon 225) +G0 X110.955667 Y50.376667 (start point) +G1 Z#101 F#102 +F#103 +G1 X110.701667 Y50.292000 +G1 X110.320667 Y49.911000 +G1 X110.236000 Y49.572333 +G1 X110.278333 Y49.191333 +G1 X110.532333 Y48.852667 +G1 X110.828667 Y48.683333 +G1 X111.379000 Y48.683333 +G1 X111.717667 Y48.895000 +G1 X111.929333 Y49.233667 +G1 X111.929333 Y49.784000 +G1 X111.717667 Y50.122667 +G1 X111.379000 Y50.334333 +G1 X110.955667 Y50.376667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 226) +G0 X120.396000 Y50.376667 (start point) +G1 Z#101 F#102 +F#103 +G1 X120.396000 Y48.641000 +G1 X122.131667 Y48.641000 +G1 X122.131667 Y50.376667 +G1 X120.396000 Y50.376667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 227) +G0 X124.925667 Y50.376667 (start point) +G1 Z#101 F#102 +F#103 +G1 X124.671667 Y50.292000 +G1 X124.290667 Y49.911000 +G1 X124.206000 Y49.572333 +G1 X124.248333 Y49.191333 +G1 X124.502333 Y48.852667 +G1 X124.798667 Y48.683333 +G1 X125.349000 Y48.683333 +G1 X125.687667 Y48.895000 +G1 X125.899333 Y49.233667 +G1 X125.899333 Y49.784000 +G1 X125.687667 Y50.122667 +G1 X125.349000 Y50.334333 +G1 X124.925667 Y50.376667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 228) +G0 X134.366000 Y50.376667 (start point) +G1 Z#101 F#102 +F#103 +G1 X134.366000 Y48.641000 +G1 X136.101667 Y48.641000 +G1 X136.101667 Y50.376667 +G1 X134.366000 Y50.376667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 229) +G0 X163.491333 Y49.826333 (start point) +G1 Z#101 F#102 +F#103 +G1 X163.491333 Y47.921333 +G1 X165.396333 Y47.921333 +G1 X165.396333 Y49.826333 +G1 X163.491333 Y49.826333 +G0 Z#100 +(polygon end, distance 7.62) +(polygon 230) +G0 X14.435667 Y49.741667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y49.657000 +G1 X13.800667 Y49.276000 +G1 X13.716000 Y48.937333 +G1 X13.758333 Y48.556333 +G1 X14.012333 Y48.217667 +G1 X14.308667 Y48.048333 +G1 X14.859000 Y48.048333 +G1 X15.197667 Y48.260000 +G1 X15.409333 Y48.598667 +G1 X15.409333 Y49.149000 +G1 X15.197667 Y49.487667 +G1 X14.859000 Y49.699333 +G1 X14.435667 Y49.741667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 231) +G0 X16.975667 Y49.741667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y49.657000 +G1 X16.340667 Y49.276000 +G1 X16.256000 Y48.937333 +G1 X16.298333 Y48.556333 +G1 X16.552333 Y48.217667 +G1 X16.848667 Y48.048333 +G1 X17.399000 Y48.048333 +G1 X17.737667 Y48.260000 +G1 X17.949333 Y48.598667 +G1 X17.949333 Y49.149000 +G1 X17.737667 Y49.487667 +G1 X17.399000 Y49.699333 +G1 X16.975667 Y49.741667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 232) +G0 X19.515667 Y49.741667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y49.657000 +G1 X18.880667 Y49.276000 +G1 X18.796000 Y48.937333 +G1 X18.838333 Y48.556333 +G1 X19.092333 Y48.217667 +G1 X19.388667 Y48.048333 +G1 X19.939000 Y48.048333 +G1 X20.277667 Y48.260000 +G1 X20.489333 Y48.598667 +G1 X20.489333 Y49.149000 +G1 X20.277667 Y49.487667 +G1 X19.939000 Y49.699333 +G1 X19.515667 Y49.741667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 233) +G0 X14.435667 Y47.201667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y47.117000 +G1 X13.800667 Y46.736000 +G1 X13.716000 Y46.397333 +G1 X13.758333 Y46.016333 +G1 X14.012333 Y45.677667 +G1 X14.308667 Y45.508333 +G1 X14.859000 Y45.508333 +G1 X15.197667 Y45.720000 +G1 X15.409333 Y46.058667 +G1 X15.409333 Y46.609000 +G1 X15.197667 Y46.947667 +G1 X14.859000 Y47.159333 +G1 X14.435667 Y47.201667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 234) +G0 X16.975667 Y47.201667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y47.117000 +G1 X16.340667 Y46.736000 +G1 X16.256000 Y46.397333 +G1 X16.298333 Y46.016333 +G1 X16.552333 Y45.677667 +G1 X16.848667 Y45.508333 +G1 X17.399000 Y45.508333 +G1 X17.737667 Y45.720000 +G1 X17.949333 Y46.058667 +G1 X17.949333 Y46.609000 +G1 X17.737667 Y46.947667 +G1 X17.399000 Y47.159333 +G1 X16.975667 Y47.201667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 235) +G0 X19.515667 Y47.201667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y47.117000 +G1 X18.880667 Y46.736000 +G1 X18.796000 Y46.397333 +G1 X18.838333 Y46.016333 +G1 X19.092333 Y45.677667 +G1 X19.388667 Y45.508333 +G1 X19.939000 Y45.508333 +G1 X20.277667 Y45.720000 +G1 X20.489333 Y46.058667 +G1 X20.489333 Y46.609000 +G1 X20.277667 Y46.947667 +G1 X19.939000 Y47.159333 +G1 X19.515667 Y47.201667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 236) +G0 X39.751000 Y45.423667 (start point) +G1 Z#101 F#102 +F#103 +G1 X39.370000 Y45.296667 +G1 X38.989000 Y45.085000 +G1 X38.608000 Y44.661667 +G1 X38.396333 Y44.196000 +G1 X38.396333 Y43.391667 +G1 X38.650333 Y42.841333 +G1 X39.116000 Y42.418000 +G1 X39.581667 Y42.206333 +G1 X94.361000 Y42.206333 +G1 X94.911333 Y42.460333 +G1 X95.334667 Y42.926000 +G1 X95.546333 Y43.391667 +G1 X95.546333 Y44.196000 +G1 X95.334667 Y44.661667 +G1 X94.911333 Y45.127333 +G1 X94.361000 Y45.381333 +G1 X39.751000 Y45.423667 +G0 Z#100 +(polygon end, distance 118.16) +(polygon 237) +G0 X110.278333 Y45.254333 (start point) +G1 Z#101 F#102 +F#103 +G1 X110.278333 Y43.603333 +G1 X111.929333 Y43.603333 +G1 X111.929333 Y45.254333 +G1 X110.278333 Y45.254333 +G0 Z#100 +(polygon end, distance 6.60) +(polygon 238) +G0 X121.115667 Y45.254333 (start point) +G1 Z#101 F#102 +F#103 +G1 X120.777000 Y45.085000 +G1 X120.565333 Y44.831000 +G1 X120.438333 Y44.534667 +G1 X120.438333 Y44.323000 +G1 X120.565333 Y44.026667 +G1 X120.777000 Y43.772667 +G1 X121.115667 Y43.603333 +G1 X121.369667 Y43.603333 +G1 X121.666000 Y43.730333 +G1 X121.920000 Y43.942000 +G1 X122.089333 Y44.280667 +G1 X122.089333 Y44.577000 +G1 X121.920000 Y44.915667 +G1 X121.666000 Y45.127333 +G1 X121.369667 Y45.254333 +G1 X121.115667 Y45.254333 +G0 Z#100 +(polygon end, distance 5.14) +(polygon 239) +G0 X124.248333 Y45.254333 (start point) +G1 Z#101 F#102 +F#103 +G1 X124.248333 Y43.603333 +G1 X125.899333 Y43.603333 +G1 X125.899333 Y45.254333 +G1 X124.248333 Y45.254333 +G0 Z#100 +(polygon end, distance 6.60) +(polygon 240) +G0 X135.085667 Y45.254333 (start point) +G1 Z#101 F#102 +F#103 +G1 X134.747000 Y45.085000 +G1 X134.535333 Y44.831000 +G1 X134.408333 Y44.534667 +G1 X134.408333 Y44.323000 +G1 X134.535333 Y44.026667 +G1 X134.747000 Y43.772667 +G1 X135.085667 Y43.603333 +G1 X135.339667 Y43.603333 +G1 X135.636000 Y43.730333 +G1 X135.890000 Y43.942000 +G1 X136.059333 Y44.280667 +G1 X136.059333 Y44.577000 +G1 X135.890000 Y44.915667 +G1 X135.636000 Y45.127333 +G1 X135.339667 Y45.254333 +G1 X135.085667 Y45.254333 +G0 Z#100 +(polygon end, distance 5.14) +(polygon 241) +G0 X14.435667 Y44.661667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y44.577000 +G1 X13.800667 Y44.196000 +G1 X13.716000 Y43.857333 +G1 X13.758333 Y43.476333 +G1 X14.012333 Y43.137667 +G1 X14.308667 Y42.968333 +G1 X14.859000 Y42.968333 +G1 X15.197667 Y43.180000 +G1 X15.409333 Y43.518667 +G1 X15.409333 Y44.069000 +G1 X15.197667 Y44.407667 +G1 X14.859000 Y44.619333 +G1 X14.435667 Y44.661667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 242) +G0 X16.975667 Y44.661667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y44.577000 +G1 X16.340667 Y44.196000 +G1 X16.256000 Y43.857333 +G1 X16.298333 Y43.476333 +G1 X16.552333 Y43.137667 +G1 X16.848667 Y42.968333 +G1 X17.399000 Y42.968333 +G1 X17.737667 Y43.180000 +G1 X17.949333 Y43.518667 +G1 X17.949333 Y44.069000 +G1 X17.737667 Y44.407667 +G1 X17.399000 Y44.619333 +G1 X16.975667 Y44.661667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 243) +G0 X19.515667 Y44.661667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y44.577000 +G1 X18.880667 Y44.196000 +G1 X18.796000 Y43.857333 +G1 X18.838333 Y43.476333 +G1 X19.092333 Y43.137667 +G1 X19.388667 Y42.968333 +G1 X19.939000 Y42.968333 +G1 X20.277667 Y43.180000 +G1 X20.489333 Y43.518667 +G1 X20.489333 Y44.069000 +G1 X20.277667 Y44.407667 +G1 X19.939000 Y44.619333 +G1 X19.515667 Y44.661667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 244) +G0 X164.253333 Y42.841333 (start point) +G1 Z#101 F#102 +F#103 +G1 X163.830000 Y42.629667 +G1 X163.576000 Y42.291000 +G1 X163.533667 Y42.121667 +G1 X109.135333 Y42.121667 +G1 X108.923667 Y42.375667 +G1 X108.669667 Y42.502667 +G1 X108.415667 Y42.502667 +G1 X108.161667 Y42.291000 +G1 X107.950000 Y42.037000 +G1 X107.950000 Y41.740667 +G1 X108.161667 Y41.486667 +G1 X108.415667 Y41.275000 +G1 X108.669667 Y41.275000 +G1 X108.923667 Y41.402000 +G1 X109.135333 Y41.656000 +G1 X163.533667 Y41.656000 +G1 X163.787667 Y41.232667 +G1 X164.168667 Y40.978667 +G1 X164.719000 Y40.978667 +G1 X165.100000 Y41.232667 +G1 X165.354000 Y41.613667 +G1 X165.354000 Y42.164000 +G1 X165.100000 Y42.545000 +G1 X164.719000 Y42.799000 +G1 X164.253333 Y42.841333 +G0 Z#100 +(polygon end, distance 117.58) +(polygon 245) +G0 X14.435667 Y42.121667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y42.037000 +G1 X13.800667 Y41.656000 +G1 X13.716000 Y41.317333 +G1 X13.758333 Y40.936333 +G1 X14.012333 Y40.597667 +G1 X14.308667 Y40.428333 +G1 X14.859000 Y40.428333 +G1 X15.197667 Y40.640000 +G1 X15.409333 Y40.978667 +G1 X15.409333 Y41.529000 +G1 X15.197667 Y41.867667 +G1 X14.859000 Y42.079333 +G1 X14.435667 Y42.121667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 246) +G0 X16.975667 Y42.121667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y42.037000 +G1 X16.340667 Y41.656000 +G1 X16.256000 Y41.317333 +G1 X16.298333 Y40.936333 +G1 X16.552333 Y40.597667 +G1 X16.848667 Y40.428333 +G1 X17.399000 Y40.428333 +G1 X17.737667 Y40.640000 +G1 X17.949333 Y40.978667 +G1 X17.949333 Y41.529000 +G1 X17.737667 Y41.867667 +G1 X17.399000 Y42.079333 +G1 X16.975667 Y42.121667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 247) +G0 X19.515667 Y42.121667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y42.037000 +G1 X18.880667 Y41.656000 +G1 X18.796000 Y41.317333 +G1 X18.838333 Y40.936333 +G1 X19.092333 Y40.597667 +G1 X19.388667 Y40.428333 +G1 X19.939000 Y40.428333 +G1 X20.277667 Y40.640000 +G1 X20.489333 Y40.978667 +G1 X20.489333 Y41.529000 +G1 X20.277667 Y41.867667 +G1 X19.939000 Y42.079333 +G1 X19.515667 Y42.121667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 248) +G0 X23.876000 Y41.613667 (start point) +G1 Z#101 F#102 +F#103 +G1 X23.495000 Y41.486667 +G1 X23.114000 Y41.275000 +G1 X22.733000 Y40.851667 +G1 X22.521333 Y40.428333 +G1 X21.844000 Y39.708667 +G1 X14.393333 Y39.708667 +G1 X14.054667 Y39.539333 +G1 X13.800667 Y39.327667 +G1 X13.589000 Y38.904333 +G1 X13.589000 Y38.523333 +G1 X13.800667 Y38.100000 +G1 X14.054667 Y37.888333 +G1 X14.393333 Y37.719000 +G1 X22.394333 Y37.719000 +G1 X22.733000 Y37.888333 +G1 X23.410333 Y38.523333 +G1 X23.706667 Y38.396333 +G1 X45.466000 Y38.396333 +G1 X46.016333 Y38.650333 +G1 X46.439667 Y39.116000 +G1 X46.651333 Y39.581667 +G1 X46.651333 Y40.386000 +G1 X46.439667 Y40.851667 +G1 X46.016333 Y41.317333 +G1 X45.466000 Y41.571333 +G1 X23.876000 Y41.613667 +G0 Z#100 +(polygon end, distance 70.34) +(polygon 249) +G0 X163.491333 Y40.301333 (start point) +G1 Z#101 F#102 +F#103 +G1 X163.491333 Y38.396333 +G1 X165.396333 Y38.396333 +G1 X165.396333 Y40.301333 +G1 X163.491333 Y40.301333 +G0 Z#100 +(polygon end, distance 7.62) +(polygon 250) +G0 X110.955667 Y40.216667 (start point) +G1 Z#101 F#102 +F#103 +G1 X110.701667 Y40.132000 +G1 X110.363000 Y39.793333 +G1 X62.145333 Y39.793333 +G1 X61.891333 Y39.666333 +G1 X58.674000 Y36.406667 +G1 X58.589333 Y36.237333 +G1 X58.589333 Y32.850667 +G1 X57.912000 Y32.850667 +G1 X57.912000 Y30.607000 +G1 X60.155667 Y30.607000 +G1 X60.155667 Y32.850667 +G1 X59.478333 Y32.850667 +G1 X59.478333 Y36.025667 +G1 X62.399333 Y38.904333 +G1 X110.363000 Y38.904333 +G1 X110.701667 Y38.565667 +G1 X111.040333 Y38.481000 +G1 X111.421333 Y38.523333 +G1 X111.760000 Y38.777333 +G1 X111.929333 Y39.073667 +G1 X111.929333 Y39.624000 +G1 X111.717667 Y39.962667 +G1 X111.379000 Y40.174333 +G1 X110.955667 Y40.216667 +G0 Z#100 +(polygon end, distance 124.48) +(polygon 251) +G0 X120.396000 Y40.216667 (start point) +G1 Z#101 F#102 +F#103 +G1 X120.396000 Y38.481000 +G1 X122.131667 Y38.481000 +G1 X122.131667 Y40.216667 +G1 X120.396000 Y40.216667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 252) +G0 X124.925667 Y40.216667 (start point) +G1 Z#101 F#102 +F#103 +G1 X124.671667 Y40.132000 +G1 X124.290667 Y39.751000 +G1 X124.206000 Y39.412333 +G1 X124.248333 Y39.031333 +G1 X124.502333 Y38.692667 +G1 X124.798667 Y38.523333 +G1 X125.349000 Y38.523333 +G1 X125.687667 Y38.735000 +G1 X125.899333 Y39.073667 +G1 X125.899333 Y39.624000 +G1 X125.687667 Y39.962667 +G1 X125.349000 Y40.174333 +G1 X124.925667 Y40.216667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 253) +G0 X127.465667 Y40.216667 (start point) +G1 Z#101 F#102 +F#103 +G1 X127.211667 Y40.132000 +G1 X126.830667 Y39.751000 +G1 X126.746000 Y39.412333 +G1 X126.788333 Y39.031333 +G1 X127.042333 Y38.692667 +G1 X127.338667 Y38.523333 +G1 X127.677333 Y38.481000 +G1 X128.016000 Y38.565667 +G1 X128.354667 Y38.904333 +G1 X134.366000 Y38.904333 +G1 X134.366000 Y38.481000 +G1 X136.101667 Y38.481000 +G1 X136.101667 Y40.216667 +G1 X134.366000 Y40.216667 +G1 X134.366000 Y39.793333 +G1 X128.354667 Y39.793333 +G1 X128.016000 Y40.132000 +G1 X127.719667 Y40.216667 +G1 X127.465667 Y40.216667 +G0 Z#100 +(polygon end, distance 22.59) +(polygon 254) +G0 X53.763333 Y37.422667 (start point) +G1 Z#101 F#102 +F#103 +G1 X53.424667 Y37.295667 +G1 X53.213000 Y37.168667 +G1 X14.393333 Y37.168667 +G1 X13.970000 Y36.957000 +G1 X13.758333 Y36.703000 +G1 X13.589000 Y36.364333 +G1 X13.589000 Y35.983333 +G1 X13.758333 Y35.644667 +G1 X13.970000 Y35.390667 +G1 X14.393333 Y35.179000 +G1 X53.170667 Y35.179000 +G1 X53.636333 Y34.967333 +G1 X54.271333 Y34.967333 +G1 X54.652333 Y35.136667 +G1 X54.991000 Y35.475333 +G1 X55.160333 Y35.856333 +G1 X55.160333 Y36.491333 +G1 X54.991000 Y36.872333 +G1 X54.652333 Y37.211000 +G1 X54.271333 Y37.380333 +G1 X53.763333 Y37.422667 +G0 Z#100 +(polygon end, distance 85.87) +(polygon 255) +G0 X117.263333 Y37.126333 (start point) +G1 Z#101 F#102 +F#103 +G1 X116.840000 Y36.914667 +G1 X115.358333 Y35.390667 +G1 X115.231333 Y35.009667 +G1 X115.273667 Y33.993667 +G1 X115.527667 Y33.612667 +G1 X115.908667 Y33.358667 +G1 X116.459000 Y33.358667 +G1 X116.840000 Y33.612667 +G1 X117.094000 Y33.993667 +G1 X117.136333 Y34.501667 +G1 X117.813667 Y35.221333 +G1 X123.444000 Y35.221333 +G1 X124.121333 Y34.501667 +G1 X124.121333 Y34.120667 +G1 X124.248333 Y33.824333 +G1 X124.248333 Y33.443333 +G1 X124.629333 Y33.443333 +G1 X124.925667 Y33.316333 +G1 X132.334000 Y33.316333 +G1 X132.672667 Y33.485667 +G1 X132.884333 Y33.739667 +G1 X133.053667 Y34.078333 +G1 X133.053667 Y34.459333 +G1 X132.884333 Y34.798000 +G1 X132.672667 Y35.052000 +G1 X132.334000 Y35.221333 +G1 X125.941667 Y35.221333 +G1 X125.899333 Y35.390667 +G1 X124.417667 Y36.914667 +G1 X123.994333 Y37.126333 +G1 X117.263333 Y37.126333 +G0 Z#100 +(polygon end, distance 42.17) +(polygon 256) +G0 X63.246000 Y36.533667 (start point) +G1 Z#101 F#102 +F#103 +G1 X62.949667 Y36.449000 +G1 X62.611000 Y36.279667 +G1 X62.272333 Y35.983333 +G1 X61.933667 Y35.771667 +G1 X60.536667 Y34.332333 +G1 X60.367333 Y33.951333 +G1 X60.367333 Y33.316333 +G1 X60.579000 Y32.850667 +G1 X60.536667 Y32.131000 +G1 X60.452000 Y31.707667 +G1 X60.536667 Y31.326667 +G1 X60.579000 Y30.141333 +G1 X60.113333 Y29.972000 +G1 X55.837667 Y25.738667 +G1 X27.516667 Y25.696333 +G1 X27.220333 Y25.569333 +G1 X23.368000 Y29.379333 +G1 X23.029333 Y29.548667 +G1 X14.393333 Y29.548667 +G1 X13.970000 Y29.337000 +G1 X13.758333 Y29.083000 +G1 X13.589000 Y28.744333 +G1 X13.589000 Y28.363333 +G1 X13.758333 Y28.024667 +G1 X13.970000 Y27.770667 +G1 X14.393333 Y27.559000 +G1 X22.479000 Y27.559000 +G1 X26.331333 Y23.664333 +G1 X26.585333 Y23.156333 +G1 X27.051000 Y22.733000 +G1 X27.516667 Y22.521333 +G1 X56.896000 Y22.521333 +G1 X57.319333 Y22.690667 +G1 X62.272333 Y27.601333 +G1 X62.526333 Y28.151667 +G1 X62.611000 Y31.326667 +G1 X62.695667 Y31.750000 +G1 X62.611000 Y32.131000 +G1 X62.568667 Y32.893000 +G1 X62.992000 Y33.274000 +G1 X95.504000 Y33.316333 +G1 X95.504000 Y32.215667 +G1 X95.377000 Y31.877000 +G1 X95.419333 Y31.411333 +G1 X95.588667 Y31.072667 +G1 X95.927333 Y30.776333 +G1 X96.181333 Y30.649333 +G1 X96.816333 Y30.649333 +G1 X97.155000 Y30.818667 +G1 X97.493667 Y31.199667 +G1 X97.493667 Y31.284333 +G1 X115.443000 Y31.284333 +G1 X115.781667 Y30.945667 +G1 X116.120333 Y30.861000 +G1 X116.501333 Y30.903333 +G1 X116.840000 Y31.157333 +G1 X117.009333 Y31.453667 +G1 X117.009333 Y32.004000 +G1 X116.840000 Y32.300333 +G1 X116.501333 Y32.554333 +G1 X116.120333 Y32.596667 +G1 X115.781667 Y32.512000 +G1 X115.443000 Y32.173333 +G1 X97.493667 Y32.173333 +G1 X97.493667 Y33.485667 +G1 X97.705333 Y33.951333 +G1 X97.705333 Y34.586333 +G1 X97.536000 Y34.967333 +G1 X96.774000 Y35.771667 +G1 X96.435333 Y35.983333 +G1 X96.096667 Y36.279667 +G1 X95.631000 Y36.491333 +G1 X63.246000 Y36.533667 +G0 Z#100 +(polygon end, distance 233.48) +(polygon 257) +G0 X117.856000 Y35.136667 (start point) +G1 Z#101 F#102 +F#103 +G1 X117.856000 Y33.401000 +G1 X119.591667 Y33.401000 +G1 X119.591667 Y35.136667 +G1 X117.856000 Y35.136667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 258) +G0 X135.085667 Y35.094333 (start point) +G1 Z#101 F#102 +F#103 +G1 X134.747000 Y34.925000 +G1 X134.535333 Y34.671000 +G1 X134.408333 Y34.374667 +G1 X134.408333 Y34.163000 +G1 X134.535333 Y33.866667 +G1 X134.747000 Y33.612667 +G1 X135.085667 Y33.443333 +G1 X135.339667 Y33.443333 +G1 X135.636000 Y33.570333 +G1 X135.890000 Y33.782000 +G1 X136.017000 Y34.036000 +G1 X140.377333 Y34.036000 +G1 X140.589000 Y33.782000 +G1 X140.843000 Y33.655000 +G1 X141.097000 Y33.655000 +G1 X141.351000 Y33.866667 +G1 X141.562667 Y34.120667 +G1 X141.562667 Y34.417000 +G1 X141.351000 Y34.671000 +G1 X141.097000 Y34.882667 +G1 X140.843000 Y34.882667 +G1 X140.589000 Y34.755667 +G1 X140.377333 Y34.501667 +G1 X136.017000 Y34.501667 +G1 X135.890000 Y34.755667 +G1 X135.636000 Y34.967333 +G1 X135.339667 Y35.094333 +G1 X135.085667 Y35.094333 +G0 Z#100 +(polygon end, distance 16.73) +(polygon 259) +G0 X14.393333 Y34.628667 (start point) +G1 Z#101 F#102 +F#103 +G1 X13.970000 Y34.417000 +G1 X13.758333 Y34.163000 +G1 X13.589000 Y33.824333 +G1 X13.589000 Y33.443333 +G1 X13.758333 Y33.104667 +G1 X13.970000 Y32.850667 +G1 X14.393333 Y32.639000 +G1 X28.490333 Y32.639000 +G1 X28.659667 Y32.258000 +G1 X34.163000 Y26.754667 +G1 X34.544000 Y26.585333 +G1 X41.359667 Y26.543000 +G1 X41.359667 Y29.294667 +G1 X35.433000 Y29.294667 +G1 X30.649333 Y34.120667 +G1 X30.437667 Y34.417000 +G1 X30.014333 Y34.628667 +G1 X14.393333 Y34.628667 +G0 Z#100 +(polygon end, distance 64.21) +(polygon 260) +G0 X100.160667 Y33.612667 (start point) +G1 Z#101 F#102 +F#103 +G1 X99.906667 Y33.401000 +G1 X99.695000 Y33.147000 +G1 X99.695000 Y32.850667 +G1 X99.906667 Y32.596667 +G1 X100.160667 Y32.385000 +G1 X100.414667 Y32.385000 +G1 X100.668667 Y32.512000 +G1 X100.880333 Y32.766000 +G1 X161.163000 Y32.766000 +G1 X161.840333 Y32.131000 +G1 X163.533667 Y32.131000 +G1 X163.787667 Y31.707667 +G1 X164.168667 Y31.453667 +G1 X164.719000 Y31.453667 +G1 X165.100000 Y31.707667 +G1 X165.354000 Y32.088667 +G1 X165.354000 Y32.639000 +G1 X165.100000 Y33.020000 +G1 X164.719000 Y33.274000 +G1 X164.168667 Y33.274000 +G1 X163.787667 Y33.020000 +G1 X163.533667 Y32.596667 +G1 X162.009667 Y32.596667 +G1 X161.332333 Y33.231667 +G1 X100.880333 Y33.231667 +G1 X100.668667 Y33.485667 +G1 X100.414667 Y33.612667 +G1 X100.160667 Y33.612667 +G0 Z#100 +(polygon end, distance 134.55) +(polygon 261) +G0 X63.923333 Y32.850667 (start point) +G1 Z#101 F#102 +F#103 +G1 X63.711667 Y32.766000 +G1 X63.457667 Y32.639000 +G1 X63.161333 Y32.300333 +G1 X63.034333 Y32.046333 +G1 X63.034333 Y31.411333 +G1 X63.161333 Y31.157333 +G1 X63.457667 Y30.818667 +G1 X63.796333 Y30.649333 +G1 X64.431333 Y30.649333 +G1 X64.770000 Y30.818667 +G1 X65.066333 Y31.157333 +G1 X65.193333 Y31.411333 +G1 X65.193333 Y32.046333 +G1 X65.066333 Y32.300333 +G1 X64.770000 Y32.639000 +G1 X64.431333 Y32.808333 +G1 X63.923333 Y32.850667 +G0 Z#100 +(polygon end, distance 7.00) +(polygon 262) +G0 X90.297000 Y32.850667 (start point) +G1 Z#101 F#102 +F#103 +G1 X90.297000 Y30.607000 +G1 X90.974333 Y30.607000 +G1 X90.974333 Y30.395333 +G1 X91.059000 Y30.226000 +G1 X91.736333 Y29.506333 +G1 X91.990333 Y29.379333 +G1 X122.428000 Y29.379333 +G1 X122.766667 Y29.040667 +G1 X123.105333 Y28.956000 +G1 X123.486333 Y28.998333 +G1 X123.825000 Y29.252333 +G1 X123.994333 Y29.548667 +G1 X123.994333 Y30.099000 +G1 X123.825000 Y30.395333 +G1 X123.486333 Y30.649333 +G1 X123.105333 Y30.691667 +G1 X122.766667 Y30.607000 +G1 X122.428000 Y30.268333 +G1 X92.202000 Y30.268333 +G1 X91.905667 Y30.607000 +G1 X92.540667 Y30.607000 +G1 X92.540667 Y32.850667 +G1 X90.297000 Y32.850667 +G0 Z#100 +(polygon end, distance 75.33) +(polygon 263) +G0 X93.768333 Y32.850667 (start point) +G1 Z#101 F#102 +F#103 +G1 X93.556667 Y32.766000 +G1 X93.302667 Y32.639000 +G1 X93.006333 Y32.300333 +G1 X92.879333 Y32.046333 +G1 X92.879333 Y31.411333 +G1 X93.006333 Y31.157333 +G1 X93.302667 Y30.818667 +G1 X93.641333 Y30.649333 +G1 X94.276333 Y30.649333 +G1 X94.615000 Y30.818667 +G1 X94.911333 Y31.157333 +G1 X95.038333 Y31.411333 +G1 X95.038333 Y32.046333 +G1 X94.911333 Y32.300333 +G1 X94.615000 Y32.639000 +G1 X94.276333 Y32.808333 +G1 X93.768333 Y32.850667 +G0 Z#100 +(polygon end, distance 7.00) +(polygon 264) +G0 X118.575667 Y32.596667 (start point) +G1 Z#101 F#102 +F#103 +G1 X118.321667 Y32.512000 +G1 X117.940667 Y32.131000 +G1 X117.856000 Y31.792333 +G1 X117.898333 Y31.411333 +G1 X118.152333 Y31.072667 +G1 X118.448667 Y30.903333 +G1 X118.787333 Y30.861000 +G1 X119.126000 Y30.945667 +G1 X119.464667 Y31.284333 +G1 X134.493000 Y31.284333 +G1 X134.831667 Y30.945667 +G1 X135.170333 Y30.861000 +G1 X135.551333 Y30.903333 +G1 X135.890000 Y31.157333 +G1 X136.059333 Y31.453667 +G1 X136.059333 Y32.004000 +G1 X135.890000 Y32.300333 +G1 X135.551333 Y32.554333 +G1 X135.170333 Y32.596667 +G1 X134.831667 Y32.512000 +G1 X134.493000 Y32.173333 +G1 X119.464667 Y32.173333 +G1 X119.126000 Y32.512000 +G1 X118.829667 Y32.596667 +G1 X118.575667 Y32.596667 +G0 Z#100 +(polygon end, distance 39.07) +(polygon 265) +G0 X23.876000 Y32.554333 (start point) +G1 Z#101 F#102 +F#103 +G1 X23.537333 Y32.427333 +G1 X23.368000 Y32.342667 +G1 X23.071667 Y32.088667 +G1 X14.393333 Y32.088667 +G1 X14.054667 Y31.919333 +G1 X13.800667 Y31.707667 +G1 X13.589000 Y31.284333 +G1 X13.589000 Y30.903333 +G1 X13.800667 Y30.480000 +G1 X14.054667 Y30.268333 +G1 X14.393333 Y30.099000 +G1 X23.071667 Y30.099000 +G1 X23.410333 Y29.802667 +G1 X23.791333 Y29.675667 +G1 X24.468667 Y29.675667 +G1 X24.934333 Y29.887333 +G1 X25.315333 Y30.268333 +G1 X25.527000 Y30.734000 +G1 X25.527000 Y31.453667 +G1 X25.315333 Y31.919333 +G1 X24.934333 Y32.300333 +G1 X24.468667 Y32.512000 +G1 X23.876000 Y32.554333 +G0 Z#100 +(polygon end, distance 27.01) +(polygon 266) +G0 X163.491333 Y30.776333 (start point) +G1 Z#101 F#102 +F#103 +G1 X163.491333 Y28.871333 +G1 X165.396333 Y28.871333 +G1 X165.396333 Y30.776333 +G1 X163.491333 Y30.776333 +G0 Z#100 +(polygon end, distance 7.62) +(polygon 267) +G0 X29.591000 Y29.294667 (start point) +G1 Z#101 F#102 +F#103 +G1 X29.252333 Y29.167667 +G1 X28.871333 Y28.913667 +G1 X28.575000 Y28.532667 +G1 X28.448000 Y28.067000 +G1 X28.490333 Y27.559000 +G1 X28.659667 Y27.178000 +G1 X29.083000 Y26.754667 +G1 X29.464000 Y26.585333 +G1 X30.183667 Y26.585333 +G1 X30.564667 Y26.754667 +G1 X30.988000 Y27.178000 +G1 X31.157333 Y27.559000 +G1 X31.157333 Y28.278667 +G1 X30.988000 Y28.659667 +G1 X30.564667 Y29.083000 +G1 X30.183667 Y29.252333 +G1 X29.591000 Y29.294667 +G0 Z#100 +(polygon end, distance 8.63) +(polygon 268) +G0 X116.035667 Y28.786667 (start point) +G1 Z#101 F#102 +F#103 +G1 X115.781667 Y28.702000 +G1 X115.400667 Y28.321000 +G1 X115.316000 Y27.982333 +G1 X115.358333 Y27.601333 +G1 X115.612333 Y27.262667 +G1 X115.908667 Y27.093333 +G1 X116.459000 Y27.093333 +G1 X116.797667 Y27.305000 +G1 X117.009333 Y27.643667 +G1 X117.009333 Y28.194000 +G1 X116.797667 Y28.532667 +G1 X116.459000 Y28.744333 +G1 X116.035667 Y28.786667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 269) +G0 X117.856000 Y28.786667 (start point) +G1 Z#101 F#102 +F#103 +G1 X117.856000 Y27.051000 +G1 X119.591667 Y27.051000 +G1 X119.591667 Y27.474333 +G1 X124.206000 Y27.474333 +G1 X124.206000 Y27.051000 +G1 X125.941667 Y27.051000 +G1 X125.941667 Y27.474333 +G1 X126.830667 Y27.474333 +G1 X127.804333 Y26.458333 +G1 X127.804333 Y23.579667 +G1 X127.465667 Y23.241000 +G1 X127.381000 Y22.902333 +G1 X127.423333 Y22.521333 +G1 X127.677333 Y22.182667 +G1 X127.973667 Y22.013333 +G1 X128.524000 Y22.013333 +G1 X128.820333 Y22.182667 +G1 X129.074333 Y22.521333 +G1 X129.116667 Y22.902333 +G1 X129.032000 Y23.241000 +G1 X128.693333 Y23.579667 +G1 X128.693333 Y26.712333 +G1 X128.608667 Y26.881667 +G1 X127.296333 Y28.236333 +G1 X127.042333 Y28.363333 +G1 X125.941667 Y28.363333 +G1 X125.941667 Y28.786667 +G1 X124.206000 Y28.786667 +G1 X124.206000 Y28.363333 +G1 X119.591667 Y28.363333 +G1 X119.591667 Y28.786667 +G1 X117.856000 Y28.786667 +G0 Z#100 +(polygon end, distance 36.72) +(polygon 270) +G0 X135.085667 Y28.786667 (start point) +G1 Z#101 F#102 +F#103 +G1 X134.831667 Y28.702000 +G1 X134.450667 Y28.321000 +G1 X134.366000 Y27.982333 +G1 X134.408333 Y27.601333 +G1 X134.662333 Y27.262667 +G1 X134.958667 Y27.093333 +G1 X135.509000 Y27.093333 +G1 X135.847667 Y27.305000 +G1 X136.059333 Y27.643667 +G1 X136.059333 Y28.194000 +G1 X135.847667 Y28.532667 +G1 X135.509000 Y28.744333 +G1 X135.085667 Y28.786667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 271) +G0 X14.393333 Y26.966333 (start point) +G1 Z#101 F#102 +F#103 +G1 X13.970000 Y26.754667 +G1 X13.716000 Y26.416000 +G1 X13.631333 Y26.119667 +G1 X13.673667 Y25.738667 +G1 X13.927667 Y25.357667 +G1 X14.308667 Y25.103667 +G1 X21.166667 Y25.061333 +G1 X23.156333 Y23.114000 +G1 X23.156333 Y18.796000 +G1 X22.733000 Y19.177000 +G1 X22.352000 Y19.346333 +G1 X14.308667 Y19.304000 +G1 X13.927667 Y19.050000 +G1 X13.673667 Y18.669000 +G1 X13.673667 Y18.118667 +G1 X13.927667 Y17.737667 +G1 X14.308667 Y17.483667 +G1 X21.801667 Y17.441333 +G1 X22.309667 Y16.975667 +G1 X22.648333 Y16.806333 +G1 X39.412333 Y16.806333 +G1 X39.666333 Y16.679333 +G1 X40.301333 Y16.679333 +G1 X40.640000 Y16.848667 +G1 X40.936333 Y17.187333 +G1 X41.063333 Y17.441333 +G1 X41.063333 Y18.076333 +G1 X40.936333 Y18.330333 +G1 X40.640000 Y18.669000 +G1 X40.301333 Y18.838333 +G1 X39.666333 Y18.838333 +G1 X39.412333 Y18.711333 +G1 X25.061333 Y18.711333 +G1 X25.061333 Y23.664333 +G1 X24.892000 Y24.003000 +G1 X22.182667 Y26.754667 +G1 X21.759333 Y26.966333 +G1 X14.393333 Y26.966333 +G0 Z#100 +(polygon end, distance 89.28) +(polygon 272) +G0 X131.868333 Y25.992667 (start point) +G1 Z#101 F#102 +F#103 +G1 X131.445000 Y25.823333 +G1 X131.191000 Y25.611667 +G1 X130.937000 Y25.315333 +G1 X130.810000 Y24.892000 +G1 X130.810000 Y24.595667 +G1 X130.937000 Y24.172333 +G1 X131.191000 Y23.876000 +G1 X131.487333 Y23.622000 +G1 X131.953000 Y23.495000 +G1 X134.366000 Y21.124333 +G1 X134.366000 Y20.701000 +G1 X135.001000 Y20.658667 +G1 X135.466667 Y20.658667 +G1 X136.101667 Y20.701000 +G1 X136.144000 Y21.336000 +G1 X136.144000 Y21.801667 +G1 X136.101667 Y22.436667 +G1 X135.678333 Y22.436667 +G1 X133.307667 Y24.849667 +G1 X133.180667 Y25.315333 +G1 X132.926667 Y25.611667 +G1 X132.630333 Y25.865667 +G1 X132.207000 Y25.992667 +G1 X131.868333 Y25.992667 +G0 Z#100 +(polygon end, distance 16.75) +(polygon 273) +G0 X116.035667 Y25.611667 (start point) +G1 Z#101 F#102 +F#103 +G1 X115.781667 Y25.527000 +G1 X115.400667 Y25.146000 +G1 X115.316000 Y24.807333 +G1 X115.358333 Y24.426333 +G1 X115.612333 Y24.087667 +G1 X115.908667 Y23.918333 +G1 X116.247333 Y23.876000 +G1 X116.586000 Y23.960667 +G1 X116.924667 Y24.299333 +G1 X122.428000 Y24.299333 +G1 X122.766667 Y23.960667 +G1 X123.105333 Y23.876000 +G1 X123.486333 Y23.918333 +G1 X123.825000 Y24.172333 +G1 X123.994333 Y24.468667 +G1 X123.994333 Y25.019000 +G1 X123.825000 Y25.315333 +G1 X123.486333 Y25.569333 +G1 X123.105333 Y25.611667 +G1 X122.766667 Y25.527000 +G1 X122.428000 Y25.188333 +G1 X116.924667 Y25.188333 +G1 X116.586000 Y25.527000 +G1 X116.289667 Y25.611667 +G1 X116.035667 Y25.611667 +G0 Z#100 +(polygon end, distance 20.02) +(polygon 274) +G0 X163.660667 Y25.061333 (start point) +G1 Z#101 F#102 +F#103 +G1 X163.237333 Y24.849667 +G1 X163.025667 Y24.595667 +G1 X162.856333 Y24.257000 +G1 X162.856333 Y23.876000 +G1 X163.025667 Y23.537333 +G1 X163.237333 Y23.283333 +G1 X163.660667 Y23.071667 +G1 X164.041667 Y23.071667 +G1 X164.465000 Y23.283333 +G1 X164.676667 Y23.537333 +G1 X164.846000 Y23.876000 +G1 X164.846000 Y24.257000 +G1 X164.634333 Y24.680333 +G1 X164.380333 Y24.892000 +G1 X164.041667 Y25.061333 +G1 X163.660667 Y25.061333 +G0 Z#100 +(polygon end, distance 6.25) +(polygon 275) +G0 X14.435667 Y24.341667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y24.257000 +G1 X13.800667 Y23.876000 +G1 X13.716000 Y23.537333 +G1 X13.758333 Y23.156333 +G1 X14.012333 Y22.817667 +G1 X14.308667 Y22.648333 +G1 X14.859000 Y22.648333 +G1 X15.197667 Y22.860000 +G1 X15.409333 Y23.198667 +G1 X15.409333 Y23.749000 +G1 X15.197667 Y24.087667 +G1 X14.859000 Y24.299333 +G1 X14.435667 Y24.341667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 276) +G0 X16.975667 Y24.341667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y24.257000 +G1 X16.340667 Y23.876000 +G1 X16.256000 Y23.537333 +G1 X16.298333 Y23.156333 +G1 X16.552333 Y22.817667 +G1 X16.848667 Y22.648333 +G1 X17.399000 Y22.648333 +G1 X17.737667 Y22.860000 +G1 X17.949333 Y23.198667 +G1 X17.949333 Y23.749000 +G1 X17.737667 Y24.087667 +G1 X17.399000 Y24.299333 +G1 X16.975667 Y24.341667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 277) +G0 X19.515667 Y24.341667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y24.257000 +G1 X18.880667 Y23.876000 +G1 X18.796000 Y23.537333 +G1 X18.838333 Y23.156333 +G1 X19.092333 Y22.817667 +G1 X19.388667 Y22.648333 +G1 X19.939000 Y22.648333 +G1 X20.277667 Y22.860000 +G1 X20.489333 Y23.198667 +G1 X20.489333 Y23.749000 +G1 X20.277667 Y24.087667 +G1 X19.939000 Y24.299333 +G1 X19.515667 Y24.341667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 278) +G0 X87.460667 Y24.087667 (start point) +G1 Z#101 F#102 +F#103 +G1 X87.206667 Y23.876000 +G1 X86.995000 Y23.622000 +G1 X86.995000 Y23.325667 +G1 X87.206667 Y23.071667 +G1 X87.460667 Y22.860000 +G1 X87.714667 Y22.860000 +G1 X87.968667 Y22.987000 +G1 X88.180333 Y23.241000 +G1 X111.633000 Y23.241000 +G1 X113.580333 Y21.336000 +G1 X131.953000 Y21.336000 +G1 X135.170333 Y18.161000 +G1 X165.523333 Y18.161000 +G1 X165.692667 Y17.822333 +G1 X166.031333 Y17.526000 +G1 X166.412333 Y17.483667 +G1 X166.751000 Y17.568333 +G1 X167.132000 Y17.949333 +G1 X167.216667 Y18.288000 +G1 X167.174333 Y18.669000 +G1 X166.920333 Y19.007667 +G1 X166.624000 Y19.177000 +G1 X166.073667 Y19.177000 +G1 X165.735000 Y18.965333 +G1 X165.523333 Y18.626667 +G1 X135.339667 Y18.626667 +G1 X132.122333 Y21.801667 +G1 X113.749667 Y21.801667 +G1 X111.802333 Y23.706667 +G1 X88.180333 Y23.706667 +G1 X87.968667 Y23.960667 +G1 X87.714667 Y24.087667 +G1 X87.460667 Y24.087667 +G0 Z#100 +(polygon end, distance 167.15) +(polygon 279) +G0 X115.400667 Y23.706667 (start point) +G1 Z#101 F#102 +F#103 +G1 X115.146667 Y23.622000 +G1 X114.765667 Y23.241000 +G1 X114.681000 Y22.902333 +G1 X114.723333 Y22.521333 +G1 X114.977333 Y22.182667 +G1 X115.273667 Y22.013333 +G1 X115.824000 Y22.013333 +G1 X116.162667 Y22.225000 +G1 X116.374333 Y22.563667 +G1 X116.374333 Y23.114000 +G1 X116.162667 Y23.452667 +G1 X115.824000 Y23.664333 +G1 X115.400667 Y23.706667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 280) +G0 X117.940667 Y23.706667 (start point) +G1 Z#101 F#102 +F#103 +G1 X117.686667 Y23.622000 +G1 X117.305667 Y23.241000 +G1 X117.221000 Y22.902333 +G1 X117.263333 Y22.521333 +G1 X117.517333 Y22.182667 +G1 X117.813667 Y22.013333 +G1 X118.364000 Y22.013333 +G1 X118.702667 Y22.225000 +G1 X118.914333 Y22.563667 +G1 X118.914333 Y23.114000 +G1 X118.702667 Y23.452667 +G1 X118.364000 Y23.664333 +G1 X117.940667 Y23.706667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 281) +G0 X120.480667 Y23.706667 (start point) +G1 Z#101 F#102 +F#103 +G1 X120.226667 Y23.622000 +G1 X119.845667 Y23.241000 +G1 X119.761000 Y22.902333 +G1 X119.803333 Y22.521333 +G1 X120.057333 Y22.182667 +G1 X120.353667 Y22.013333 +G1 X120.904000 Y22.013333 +G1 X121.242667 Y22.225000 +G1 X121.454333 Y22.563667 +G1 X121.454333 Y23.114000 +G1 X121.242667 Y23.452667 +G1 X120.904000 Y23.664333 +G1 X120.480667 Y23.706667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 282) +G0 X123.020667 Y23.706667 (start point) +G1 Z#101 F#102 +F#103 +G1 X122.766667 Y23.622000 +G1 X122.385667 Y23.241000 +G1 X122.301000 Y22.902333 +G1 X122.343333 Y22.521333 +G1 X122.597333 Y22.182667 +G1 X122.893667 Y22.013333 +G1 X123.444000 Y22.013333 +G1 X123.782667 Y22.225000 +G1 X123.994333 Y22.563667 +G1 X123.994333 Y23.114000 +G1 X123.782667 Y23.452667 +G1 X123.444000 Y23.664333 +G1 X123.020667 Y23.706667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 283) +G0 X125.560667 Y23.706667 (start point) +G1 Z#101 F#102 +F#103 +G1 X125.306667 Y23.622000 +G1 X124.925667 Y23.241000 +G1 X124.841000 Y22.902333 +G1 X124.883333 Y22.521333 +G1 X125.137333 Y22.182667 +G1 X125.433667 Y22.013333 +G1 X125.984000 Y22.013333 +G1 X126.322667 Y22.225000 +G1 X126.534333 Y22.563667 +G1 X126.534333 Y23.114000 +G1 X126.322667 Y23.452667 +G1 X125.984000 Y23.664333 +G1 X125.560667 Y23.706667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 284) +G0 X130.640667 Y23.706667 (start point) +G1 Z#101 F#102 +F#103 +G1 X130.386667 Y23.622000 +G1 X130.005667 Y23.241000 +G1 X129.921000 Y22.902333 +G1 X129.963333 Y22.521333 +G1 X130.217333 Y22.182667 +G1 X130.513667 Y22.013333 +G1 X131.064000 Y22.013333 +G1 X131.402667 Y22.225000 +G1 X131.614333 Y22.563667 +G1 X131.614333 Y23.114000 +G1 X131.402667 Y23.452667 +G1 X131.064000 Y23.664333 +G1 X130.640667 Y23.706667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 285) +G0 X165.481000 Y23.706667 (start point) +G1 Z#101 F#102 +F#103 +G1 X165.481000 Y21.971000 +G1 X167.216667 Y21.971000 +G1 X167.216667 Y23.706667 +G1 X165.481000 Y23.706667 +G0 Z#100 +(polygon end, distance 6.94) +(polygon 286) +G0 X78.570667 Y22.436667 (start point) +G1 Z#101 F#102 +F#103 +G1 X78.316667 Y22.352000 +G1 X77.978000 Y22.013333 +G1 X47.540333 Y22.013333 +G1 X47.371000 Y21.928667 +G1 X42.121667 Y16.721667 +G1 X41.613667 Y16.679333 +G1 X41.275000 Y16.467667 +G1 X41.063333 Y16.129000 +G1 X41.063333 Y15.663333 +G1 X27.347333 Y15.663333 +G1 X27.305000 Y15.790333 +G1 X26.966333 Y16.044333 +G1 X26.585333 Y16.086667 +G1 X26.246667 Y16.002000 +G1 X25.908000 Y15.663333 +G1 X24.976667 Y15.663333 +G1 X24.976667 Y16.086667 +G1 X23.241000 Y16.086667 +G1 X23.241000 Y14.351000 +G1 X24.976667 Y14.351000 +G1 X24.976667 Y14.774333 +G1 X25.950333 Y14.774333 +G1 X25.992667 Y14.647333 +G1 X26.331333 Y14.393333 +G1 X26.712333 Y14.351000 +G1 X27.051000 Y14.435667 +G1 X27.389667 Y14.774333 +G1 X41.317333 Y14.774333 +G1 X41.486667 Y14.859000 +G1 X41.656000 Y14.986000 +G1 X42.164000 Y15.028333 +G1 X42.502667 Y15.240000 +G1 X42.714333 Y15.578667 +G1 X42.756667 Y16.086667 +G1 X47.752000 Y21.124333 +G1 X77.978000 Y21.124333 +G1 X78.316667 Y20.785667 +G1 X78.655333 Y20.701000 +G1 X79.036333 Y20.743333 +G1 X79.375000 Y20.997333 +G1 X79.417333 Y21.124333 +G1 X93.810667 Y21.124333 +G1 X96.054333 Y18.838333 +G1 X96.054333 Y13.673667 +G1 X95.969667 Y13.673667 +G1 X95.588667 Y13.335000 +G1 X95.419333 Y12.996333 +G1 X95.419333 Y12.361333 +G1 X95.546333 Y12.107333 +G1 X95.842667 Y11.768667 +G1 X96.181333 Y11.599333 +G1 X96.816333 Y11.599333 +G1 X97.155000 Y11.768667 +G1 X97.451333 Y12.107333 +G1 X97.578333 Y12.361333 +G1 X97.578333 Y12.996333 +G1 X97.409000 Y13.335000 +G1 X97.028000 Y13.673667 +G1 X96.943333 Y13.673667 +G1 X96.943333 Y19.092333 +G1 X96.816333 Y19.346333 +G1 X94.191667 Y21.928667 +G1 X94.022333 Y22.013333 +G1 X79.459667 Y22.013333 +G1 X79.121000 Y22.352000 +G1 X78.824667 Y22.436667 +G1 X78.570667 Y22.436667 +G0 Z#100 +(polygon end, distance 175.00) +(polygon 287) +G0 X14.435667 Y21.801667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y21.717000 +G1 X13.800667 Y21.336000 +G1 X13.716000 Y20.997333 +G1 X13.758333 Y20.616333 +G1 X14.012333 Y20.277667 +G1 X14.308667 Y20.108333 +G1 X14.859000 Y20.108333 +G1 X15.197667 Y20.320000 +G1 X15.409333 Y20.658667 +G1 X15.409333 Y21.209000 +G1 X15.197667 Y21.547667 +G1 X14.859000 Y21.759333 +G1 X14.435667 Y21.801667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 288) +G0 X16.975667 Y21.801667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y21.717000 +G1 X16.340667 Y21.336000 +G1 X16.256000 Y20.997333 +G1 X16.298333 Y20.616333 +G1 X16.552333 Y20.277667 +G1 X16.848667 Y20.108333 +G1 X17.399000 Y20.108333 +G1 X17.737667 Y20.320000 +G1 X17.949333 Y20.658667 +G1 X17.949333 Y21.209000 +G1 X17.737667 Y21.547667 +G1 X17.399000 Y21.759333 +G1 X16.975667 Y21.801667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 289) +G0 X19.515667 Y21.801667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y21.717000 +G1 X18.880667 Y21.336000 +G1 X18.796000 Y20.997333 +G1 X18.838333 Y20.616333 +G1 X19.092333 Y20.277667 +G1 X19.388667 Y20.108333 +G1 X19.939000 Y20.108333 +G1 X20.277667 Y20.320000 +G1 X20.489333 Y20.658667 +G1 X20.489333 Y21.209000 +G1 X20.277667 Y21.547667 +G1 X19.939000 Y21.759333 +G1 X19.515667 Y21.801667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 290) +G0 X119.210667 Y21.166667 (start point) +G1 Z#101 F#102 +F#103 +G1 X118.956667 Y21.082000 +G1 X118.575667 Y20.701000 +G1 X118.491000 Y20.362333 +G1 X118.533333 Y20.066000 +G1 X115.231333 Y16.806333 +G1 X115.104333 Y16.552333 +G1 X115.104333 Y15.959667 +G1 X114.765667 Y15.621000 +G1 X114.681000 Y15.282333 +G1 X114.723333 Y14.901333 +G1 X114.977333 Y14.562667 +G1 X115.273667 Y14.393333 +G1 X115.824000 Y14.393333 +G1 X116.120333 Y14.562667 +G1 X116.374333 Y14.901333 +G1 X116.416667 Y15.282333 +G1 X116.332000 Y15.621000 +G1 X115.993333 Y15.959667 +G1 X115.993333 Y16.340667 +G1 X119.126000 Y19.431000 +G1 X119.634000 Y19.473333 +G1 X119.972667 Y19.685000 +G1 X120.184333 Y20.023667 +G1 X120.184333 Y20.574000 +G1 X119.972667 Y20.912667 +G1 X119.634000 Y21.124333 +G1 X119.210667 Y21.166667 +G0 Z#100 +(polygon end, distance 19.34) +(polygon 291) +G0 X80.433333 Y20.785667 (start point) +G1 Z#101 F#102 +F#103 +G1 X80.137000 Y20.658667 +G1 X49.233667 Y20.574000 +G1 X48.979667 Y20.447000 +G1 X42.121667 Y13.631333 +G1 X33.993667 Y13.589000 +G1 X33.612667 Y13.335000 +G1 X33.358667 Y12.954000 +G1 X33.358667 Y12.403667 +G1 X33.612667 Y12.022667 +G1 X33.993667 Y11.768667 +G1 X42.629667 Y11.726333 +G1 X43.010667 Y11.853333 +G1 X49.911000 Y18.711333 +G1 X80.052333 Y18.711333 +G1 X80.306333 Y18.584333 +G1 X80.941333 Y18.584333 +G1 X81.195333 Y18.711333 +G1 X91.694000 Y18.711333 +G1 X93.006333 Y17.356667 +G1 X93.006333 Y13.250333 +G1 X92.879333 Y12.996333 +G1 X92.879333 Y12.361333 +G1 X93.006333 Y12.107333 +G1 X93.006333 Y10.583333 +G1 X93.175667 Y10.244667 +G1 X94.615000 Y8.763000 +G1 X95.038333 Y8.551333 +G1 X117.644333 Y8.551333 +G1 X118.067667 Y8.763000 +G1 X121.454333 Y12.192000 +G1 X121.581333 Y12.573000 +G1 X121.539000 Y15.494000 +G1 X121.285000 Y15.875000 +G1 X120.904000 Y16.129000 +G1 X117.813667 Y16.129000 +G1 X117.432667 Y15.875000 +G1 X117.178667 Y15.494000 +G1 X117.178667 Y14.943667 +G1 X117.432667 Y14.562667 +G1 X117.813667 Y14.308667 +G1 X119.676333 Y14.266333 +G1 X119.676333 Y13.038667 +G1 X117.051667 Y10.456333 +G1 X95.588667 Y10.456333 +G1 X94.911333 Y11.176000 +G1 X94.911333 Y12.107333 +G1 X95.038333 Y12.361333 +G1 X95.038333 Y12.996333 +G1 X94.911333 Y13.250333 +G1 X94.911333 Y17.949333 +G1 X94.742000 Y18.288000 +G1 X92.667667 Y20.404667 +G1 X92.244333 Y20.616333 +G1 X81.195333 Y20.616333 +G1 X80.941333 Y20.743333 +G1 X80.433333 Y20.785667 +G0 Z#100 +(polygon end, distance 213.26) +(polygon 292) +G0 X82.380667 Y18.626667 (start point) +G1 Z#101 F#102 +F#103 +G1 X82.126667 Y18.542000 +G1 X81.788000 Y18.203333 +G1 X51.350333 Y18.203333 +G1 X51.096333 Y18.076333 +G1 X44.280667 Y11.218333 +G1 X32.554333 Y11.218333 +G1 X30.649333 Y13.081000 +G1 X30.226000 Y13.462000 +G1 X29.887333 Y13.546667 +G1 X29.506333 Y13.504333 +G1 X29.167667 Y13.250333 +G1 X29.125333 Y13.123333 +G1 X27.855333 Y13.123333 +G1 X27.601333 Y12.996333 +G1 X25.230667 Y10.583333 +G1 X24.976667 Y10.583333 +G1 X24.976667 Y11.006667 +G1 X23.241000 Y11.006667 +G1 X23.241000 Y9.271000 +G1 X24.976667 Y9.271000 +G1 X24.976667 Y9.694333 +G1 X25.442333 Y9.694333 +G1 X25.696333 Y9.821333 +G1 X28.067000 Y12.234333 +G1 X29.083000 Y12.234333 +G1 X29.421667 Y11.895667 +G1 X29.760333 Y11.811000 +G1 X30.099000 Y11.853333 +G1 X30.437667 Y12.065000 +G1 X32.131000 Y10.414000 +G1 X32.300333 Y10.329333 +G1 X44.492333 Y10.329333 +G1 X44.746333 Y10.456333 +G1 X51.562000 Y17.314333 +G1 X81.788000 Y17.314333 +G1 X82.126667 Y16.975667 +G1 X82.465333 Y16.891000 +G1 X82.846333 Y16.933333 +G1 X83.185000 Y17.187333 +G1 X83.227333 Y17.314333 +G1 X90.000667 Y17.314333 +G1 X90.974333 Y16.298333 +G1 X90.974333 Y13.800667 +G1 X90.297000 Y13.800667 +G1 X90.297000 Y11.557000 +G1 X90.974333 Y11.557000 +G1 X90.974333 Y10.075333 +G1 X91.059000 Y9.906000 +G1 X93.641333 Y7.281333 +G1 X93.895333 Y7.154333 +G1 X130.048000 Y7.154333 +G1 X130.386667 Y6.815667 +G1 X130.725333 Y6.731000 +G1 X131.106333 Y6.773333 +G1 X131.445000 Y7.027333 +G1 X131.614333 Y7.323667 +G1 X131.614333 Y7.874000 +G1 X131.445000 Y8.170333 +G1 X131.106333 Y8.424333 +G1 X130.725333 Y8.466667 +G1 X130.386667 Y8.382000 +G1 X130.048000 Y8.043333 +G1 X94.107000 Y8.043333 +G1 X91.863333 Y10.329333 +G1 X91.863333 Y11.557000 +G1 X92.540667 Y11.557000 +G1 X92.540667 Y13.800667 +G1 X91.863333 Y13.800667 +G1 X91.863333 Y16.552333 +G1 X91.778667 Y16.721667 +G1 X90.466333 Y18.076333 +G1 X90.212333 Y18.203333 +G1 X83.269667 Y18.203333 +G1 X82.931000 Y18.542000 +G1 X82.634667 Y18.626667 +G1 X82.380667 Y18.626667 +G0 Z#100 +(polygon end, distance 249.68) +(polygon 293) +G0 X163.660667 Y18.076333 (start point) +G1 Z#101 F#102 +F#103 +G1 X163.237333 Y17.864667 +G1 X163.025667 Y17.610667 +G1 X162.856333 Y17.272000 +G1 X162.856333 Y16.891000 +G1 X163.025667 Y16.552333 +G1 X163.237333 Y16.298333 +G1 X163.660667 Y16.086667 +G1 X164.041667 Y16.086667 +G1 X164.465000 Y16.298333 +G1 X164.676667 Y16.552333 +G1 X164.846000 Y16.891000 +G1 X164.846000 Y17.272000 +G1 X164.634333 Y17.695333 +G1 X164.380333 Y17.907000 +G1 X164.041667 Y18.076333 +G1 X163.660667 Y18.076333 +G0 Z#100 +(polygon end, distance 6.25) +(polygon 294) +G0 X135.085667 Y17.356667 (start point) +G1 Z#101 F#102 +F#103 +G1 X134.831667 Y17.272000 +G1 X134.450667 Y16.891000 +G1 X134.366000 Y16.552333 +G1 X134.408333 Y16.256000 +G1 X133.773333 Y15.663333 +G1 X131.656667 Y15.663333 +G1 X131.656667 Y16.086667 +G1 X129.921000 Y16.086667 +G1 X129.921000 Y14.351000 +G1 X131.656667 Y14.351000 +G1 X131.656667 Y14.774333 +G1 X134.027333 Y14.774333 +G1 X134.196667 Y14.859000 +G1 X135.001000 Y15.621000 +G1 X135.509000 Y15.663333 +G1 X135.847667 Y15.875000 +G1 X136.059333 Y16.213667 +G1 X136.059333 Y16.764000 +G1 X135.847667 Y17.102667 +G1 X135.509000 Y17.314333 +G1 X135.085667 Y17.356667 +G0 Z#100 +(polygon end, distance 17.24) +(polygon 295) +G0 X14.393333 Y16.848667 (start point) +G1 Z#101 F#102 +F#103 +G1 X13.970000 Y16.637000 +G1 X13.758333 Y16.383000 +G1 X13.589000 Y16.044333 +G1 X13.589000 Y15.663333 +G1 X13.758333 Y15.324667 +G1 X13.970000 Y15.070667 +G1 X14.393333 Y14.859000 +G1 X19.939000 Y14.859000 +G1 X21.209000 Y13.546667 +G1 X21.209000 Y8.678333 +G1 X21.378333 Y8.339667 +G1 X22.860000 Y6.815667 +G1 X23.283333 Y6.604000 +G1 X33.909000 Y6.604000 +G1 X36.830000 Y3.640667 +G1 X37.253333 Y3.429000 +G1 X43.857333 Y3.429000 +G1 X43.984333 Y3.259667 +G1 X44.365333 Y3.005667 +G1 X44.873333 Y2.836333 +G1 X45.254333 Y2.836333 +G1 X45.804667 Y3.005667 +G1 X46.185667 Y3.302000 +G1 X46.482000 Y3.683000 +G1 X46.651333 Y4.233333 +G1 X46.651333 Y4.614333 +G1 X46.482000 Y5.164667 +G1 X46.185667 Y5.545667 +G1 X45.804667 Y5.842000 +G1 X45.254333 Y6.011333 +G1 X44.873333 Y6.011333 +G1 X44.365333 Y5.842000 +G1 X43.984333 Y5.588000 +G1 X43.857333 Y5.418667 +G1 X37.803667 Y5.418667 +G1 X35.136667 Y8.128000 +G1 X35.136667 Y8.466667 +G1 X34.713333 Y8.466667 +G1 X34.417000 Y8.593667 +G1 X23.833667 Y8.593667 +G1 X23.198667 Y9.271000 +G1 X23.198667 Y14.139333 +G1 X22.987000 Y14.562667 +G1 X20.828000 Y16.679333 +G1 X20.489333 Y16.848667 +G1 X14.393333 Y16.848667 +G0 Z#100 +(polygon end, distance 84.91) +(polygon 296) +G0 X70.315667 Y16.086667 (start point) +G1 Z#101 F#102 +F#103 +G1 X70.061667 Y16.002000 +G1 X69.723000 Y15.663333 +G1 X59.605333 Y15.663333 +G1 X59.436000 Y15.578667 +G1 X58.716333 Y14.901333 +G1 X58.589333 Y14.647333 +G1 X58.589333 Y13.800667 +G1 X57.912000 Y13.800667 +G1 X57.912000 Y11.557000 +G1 X60.155667 Y11.557000 +G1 X60.155667 Y13.800667 +G1 X59.478333 Y13.800667 +G1 X59.478333 Y14.393333 +G1 X59.817000 Y14.774333 +G1 X69.723000 Y14.774333 +G1 X70.061667 Y14.435667 +G1 X70.400333 Y14.351000 +G1 X70.781333 Y14.393333 +G1 X71.120000 Y14.647333 +G1 X71.289333 Y14.943667 +G1 X71.289333 Y15.494000 +G1 X71.077667 Y15.832667 +G1 X70.739000 Y16.044333 +G1 X70.315667 Y16.086667 +G0 Z#100 +(polygon end, distance 36.02) +(polygon 297) +G0 X123.020667 Y16.086667 (start point) +G1 Z#101 F#102 +F#103 +G1 X122.766667 Y16.002000 +G1 X122.385667 Y15.621000 +G1 X122.301000 Y15.282333 +G1 X122.343333 Y14.901333 +G1 X122.597333 Y14.562667 +G1 X122.893667 Y14.393333 +G1 X123.444000 Y14.393333 +G1 X123.782667 Y14.605000 +G1 X123.994333 Y14.943667 +G1 X123.994333 Y15.494000 +G1 X123.782667 Y15.832667 +G1 X123.444000 Y16.044333 +G1 X123.020667 Y16.086667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 298) +G0 X125.560667 Y16.086667 (start point) +G1 Z#101 F#102 +F#103 +G1 X125.306667 Y16.002000 +G1 X124.925667 Y15.621000 +G1 X124.841000 Y15.282333 +G1 X124.883333 Y14.901333 +G1 X125.137333 Y14.562667 +G1 X125.433667 Y14.393333 +G1 X125.984000 Y14.393333 +G1 X126.322667 Y14.605000 +G1 X126.534333 Y14.943667 +G1 X126.534333 Y15.494000 +G1 X126.322667 Y15.832667 +G1 X125.984000 Y16.044333 +G1 X125.560667 Y16.086667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 299) +G0 X128.100667 Y16.086667 (start point) +G1 Z#101 F#102 +F#103 +G1 X127.846667 Y16.002000 +G1 X127.465667 Y15.621000 +G1 X127.381000 Y15.282333 +G1 X127.423333 Y14.901333 +G1 X127.677333 Y14.562667 +G1 X127.973667 Y14.393333 +G1 X128.524000 Y14.393333 +G1 X128.862667 Y14.605000 +G1 X129.074333 Y14.943667 +G1 X129.074333 Y15.494000 +G1 X128.862667 Y15.832667 +G1 X128.524000 Y16.044333 +G1 X128.100667 Y16.086667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 300) +G0 X14.435667 Y14.181667 (start point) +G1 Z#101 F#102 +F#103 +G1 X14.181667 Y14.097000 +G1 X13.800667 Y13.716000 +G1 X13.716000 Y13.377333 +G1 X13.758333 Y12.996333 +G1 X14.012333 Y12.657667 +G1 X14.308667 Y12.488333 +G1 X14.859000 Y12.488333 +G1 X15.197667 Y12.700000 +G1 X15.409333 Y13.038667 +G1 X15.409333 Y13.589000 +G1 X15.197667 Y13.927667 +G1 X14.859000 Y14.139333 +G1 X14.435667 Y14.181667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 301) +G0 X16.975667 Y14.181667 (start point) +G1 Z#101 F#102 +F#103 +G1 X16.721667 Y14.097000 +G1 X16.340667 Y13.716000 +G1 X16.256000 Y13.377333 +G1 X16.298333 Y12.996333 +G1 X16.552333 Y12.657667 +G1 X16.848667 Y12.488333 +G1 X17.399000 Y12.488333 +G1 X17.737667 Y12.700000 +G1 X17.949333 Y13.038667 +G1 X17.949333 Y13.589000 +G1 X17.737667 Y13.927667 +G1 X17.399000 Y14.139333 +G1 X16.975667 Y14.181667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 302) +G0 X19.515667 Y14.181667 (start point) +G1 Z#101 F#102 +F#103 +G1 X19.261667 Y14.097000 +G1 X18.880667 Y13.716000 +G1 X18.796000 Y13.377333 +G1 X18.838333 Y12.996333 +G1 X19.092333 Y12.657667 +G1 X19.388667 Y12.488333 +G1 X19.939000 Y12.488333 +G1 X20.277667 Y12.700000 +G1 X20.489333 Y13.038667 +G1 X20.489333 Y13.589000 +G1 X20.277667 Y13.927667 +G1 X19.939000 Y14.139333 +G1 X19.515667 Y14.181667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 303) +G0 X128.100667 Y13.927667 (start point) +G1 Z#101 F#102 +F#103 +G1 X127.846667 Y13.716000 +G1 X127.635000 Y13.462000 +G1 X127.635000 Y13.165667 +G1 X127.846667 Y12.911667 +G1 X128.100667 Y12.700000 +G1 X128.354667 Y12.700000 +G1 X128.608667 Y12.827000 +G1 X128.820333 Y13.081000 +G1 X137.837333 Y13.081000 +G1 X138.049000 Y12.827000 +G1 X138.303000 Y12.700000 +G1 X138.557000 Y12.700000 +G1 X138.811000 Y12.911667 +G1 X139.022667 Y13.165667 +G1 X139.022667 Y13.462000 +G1 X138.811000 Y13.716000 +G1 X138.557000 Y13.927667 +G1 X138.303000 Y13.927667 +G1 X138.049000 Y13.800667 +G1 X137.837333 Y13.546667 +G1 X128.820333 Y13.546667 +G1 X128.608667 Y13.800667 +G1 X128.354667 Y13.927667 +G1 X128.100667 Y13.927667 +G0 Z#100 +(polygon end, distance 24.75) +(polygon 304) +G0 X61.383333 Y13.800667 (start point) +G1 Z#101 F#102 +F#103 +G1 X61.171667 Y13.716000 +G1 X60.917667 Y13.589000 +G1 X60.621333 Y13.250333 +G1 X60.494333 Y12.996333 +G1 X60.452000 Y12.530667 +G1 X60.579000 Y12.192000 +G1 X60.579000 Y11.133667 +G1 X54.737000 Y11.133667 +G1 X54.271333 Y11.345333 +G1 X53.636333 Y11.345333 +G1 X53.255333 Y11.176000 +G1 X52.916667 Y10.837333 +G1 X52.747333 Y10.456333 +G1 X52.747333 Y9.821333 +G1 X52.916667 Y9.440333 +G1 X53.255333 Y9.101667 +G1 X53.636333 Y8.932333 +G1 X54.271333 Y8.932333 +G1 X54.737000 Y9.144000 +G1 X84.920667 Y9.144000 +G1 X85.386333 Y8.932333 +G1 X86.021333 Y8.932333 +G1 X86.402333 Y9.101667 +G1 X86.741000 Y9.440333 +G1 X86.910333 Y9.821333 +G1 X86.910333 Y10.456333 +G1 X86.741000 Y10.837333 +G1 X86.402333 Y11.176000 +G1 X86.021333 Y11.345333 +G1 X85.386333 Y11.345333 +G1 X84.920667 Y11.133667 +G1 X62.568667 Y11.133667 +G1 X62.568667 Y12.192000 +G1 X62.695667 Y12.530667 +G1 X62.653333 Y12.996333 +G1 X62.526333 Y13.250333 +G1 X62.230000 Y13.589000 +G1 X61.891333 Y13.758333 +G1 X61.383333 Y13.800667 +G0 Z#100 +(polygon end, distance 76.13) +(polygon 305) +G0 X63.923333 Y13.800667 (start point) +G1 Z#101 F#102 +F#103 +G1 X63.711667 Y13.716000 +G1 X63.457667 Y13.589000 +G1 X63.161333 Y13.250333 +G1 X63.034333 Y12.996333 +G1 X63.034333 Y12.361333 +G1 X63.161333 Y12.107333 +G1 X63.457667 Y11.768667 +G1 X63.796333 Y11.599333 +G1 X64.431333 Y11.599333 +G1 X64.770000 Y11.768667 +G1 X65.066333 Y12.107333 +G1 X65.193333 Y12.361333 +G1 X65.193333 Y12.996333 +G1 X65.066333 Y13.250333 +G1 X64.770000 Y13.589000 +G1 X64.431333 Y13.758333 +G1 X63.923333 Y13.800667 +G0 Z#100 +(polygon end, distance 7.00) +(polygon 306) +G0 X125.560667 Y12.657667 (start point) +G1 Z#101 F#102 +F#103 +G1 X125.306667 Y12.446000 +G1 X125.095000 Y12.192000 +G1 X125.095000 Y11.895667 +G1 X125.306667 Y11.641667 +G1 X125.560667 Y11.430000 +G1 X125.814667 Y11.430000 +G1 X126.068667 Y11.557000 +G1 X126.280333 Y11.811000 +G1 X139.107333 Y11.811000 +G1 X139.319000 Y11.557000 +G1 X139.573000 Y11.430000 +G1 X139.827000 Y11.430000 +G1 X140.081000 Y11.641667 +G1 X140.292667 Y11.895667 +G1 X140.292667 Y12.192000 +G1 X140.081000 Y12.446000 +G1 X139.827000 Y12.657667 +G1 X139.573000 Y12.657667 +G1 X139.319000 Y12.530667 +G1 X139.107333 Y12.276667 +G1 X126.280333 Y12.276667 +G1 X126.068667 Y12.530667 +G1 X125.814667 Y12.657667 +G1 X125.560667 Y12.657667 +G0 Z#100 +(polygon end, distance 32.37) +(polygon 307) +G0 X157.183667 Y12.657667 (start point) +G1 Z#101 F#102 +F#103 +G1 X156.887333 Y12.361333 +G1 X156.887333 Y12.192000 +G1 X156.718000 Y12.276667 +G1 X156.379333 Y12.276667 +G1 X156.083000 Y11.980333 +G1 X156.083000 Y11.599333 +G1 X156.379333 Y11.303000 +G1 X156.760333 Y11.303000 +G1 X156.887333 Y11.430000 +G1 X157.099000 Y11.303000 +G1 X157.649333 Y11.345333 +G1 X157.691667 Y11.133667 +G1 X157.861000 Y11.049000 +G1 X158.030333 Y11.091333 +G1 X158.115000 Y11.303000 +G1 X158.496000 Y11.303000 +G1 X158.792333 Y11.345333 +G1 X158.792333 Y10.964333 +G1 X158.961667 Y10.795000 +G1 X159.088667 Y10.795000 +G1 X159.258000 Y10.964333 +G1 X159.258000 Y11.303000 +G1 X159.469667 Y11.303000 +G1 X159.681333 Y11.472333 +G1 X159.893000 Y11.303000 +G1 X160.231667 Y11.303000 +G1 X160.401000 Y11.387667 +G1 X160.401000 Y11.091333 +G1 X160.697333 Y10.795000 +G1 X161.332333 Y10.795000 +G1 X161.501667 Y10.964333 +G1 X161.501667 Y11.091333 +G1 X161.374667 Y11.218333 +G1 X161.374667 Y12.107333 +G1 X161.205333 Y12.276667 +G1 X161.078333 Y12.276667 +G1 X160.909000 Y12.107333 +G1 X160.655000 Y12.276667 +G1 X160.401000 Y12.149667 +G1 X160.274000 Y12.276667 +G1 X159.893000 Y12.276667 +G1 X159.681333 Y12.107333 +G1 X159.469667 Y12.276667 +G1 X158.961667 Y12.276667 +G1 X158.792333 Y12.107333 +G1 X158.623000 Y12.276667 +G1 X158.496000 Y12.276667 +G1 X158.326667 Y12.107333 +G1 X158.326667 Y11.768667 +G1 X158.115000 Y11.768667 +G1 X158.115000 Y12.107333 +G1 X157.945667 Y12.276667 +G1 X157.861000 Y12.361333 +G1 X157.564667 Y12.657667 +G1 X157.183667 Y12.657667 +G0 Z#100 +(polygon end, distance 16.28) +(polygon 308) +G0 X145.118667 Y12.276667 (start point) +G1 Z#101 F#102 +F#103 +G1 X144.949333 Y12.107333 +G1 X144.949333 Y11.599333 +G1 X145.245667 Y11.303000 +G1 X145.796000 Y11.345333 +G1 X145.880667 Y11.472333 +G1 X146.050000 Y11.303000 +G1 X146.558000 Y11.303000 +G1 X146.727333 Y11.472333 +G1 X146.896667 Y11.303000 +G1 X147.489333 Y11.303000 +G1 X147.574000 Y11.091333 +G1 X147.743333 Y11.049000 +G1 X147.912667 Y11.133667 +G1 X147.955000 Y11.303000 +G1 X148.082000 Y11.303000 +G1 X148.251333 Y11.472333 +G1 X148.251333 Y11.726333 +G1 X148.336000 Y11.430000 +G1 X148.463000 Y11.303000 +G1 X148.590000 Y11.303000 +G1 X148.759333 Y11.430000 +G1 X148.886333 Y11.303000 +G1 X149.267333 Y11.303000 +G1 X149.394333 Y11.430000 +G1 X149.606000 Y11.303000 +G1 X150.241000 Y11.345333 +G1 X150.368000 Y11.472333 +G1 X150.368000 Y11.599333 +G1 X150.241000 Y11.726333 +G1 X150.241000 Y12.107333 +G1 X150.071667 Y12.276667 +G1 X149.944667 Y12.276667 +G1 X149.775333 Y12.107333 +G1 X149.775333 Y11.768667 +G1 X149.563667 Y11.768667 +G1 X149.563667 Y11.980333 +G1 X149.267333 Y12.276667 +G1 X148.759333 Y12.276667 +G1 X148.547667 Y12.065000 +G1 X148.336000 Y12.276667 +G1 X148.209000 Y12.276667 +G1 X147.997333 Y12.065000 +G1 X147.785667 Y12.276667 +G1 X146.896667 Y12.276667 +G1 X146.727333 Y12.107333 +G1 X146.558000 Y12.276667 +G1 X145.880667 Y12.234333 +G1 X145.796000 Y12.107333 +G1 X145.626667 Y12.276667 +G1 X145.457333 Y12.234333 +G1 X145.288000 Y12.234333 +G1 X145.118667 Y12.276667 +G0 Z#100 +(polygon end, distance 14.97) +(polygon 309) +G0 X145.796000 Y11.895667 (start point) +G1 Z#101 F#102 +F#103 +G1 X145.796000 Y11.726333 +G1 X145.880667 Y11.684000 +G1 X145.880667 Y11.853333 +G1 X145.796000 Y11.895667 +G0 Z#100 +(polygon end, distance 0.53) +(polygon 310) +G0 X150.622000 Y12.276667 (start point) +G1 Z#101 F#102 +F#103 +G1 X150.452667 Y12.107333 +G1 X150.452667 Y11.260667 +G1 X150.368000 Y11.260667 +G1 X150.198667 Y11.091333 +G1 X150.198667 Y10.964333 +G1 X150.368000 Y10.795000 +G1 X151.003000 Y10.795000 +G1 X151.172333 Y10.964333 +G1 X151.172333 Y11.091333 +G1 X151.003000 Y11.260667 +G1 X150.918333 Y11.260667 +G1 X150.918333 Y12.107333 +G1 X150.749000 Y12.276667 +G1 X150.622000 Y12.276667 +G0 Z#100 +(polygon end, distance 4.32) +(polygon 311) +G0 X151.595667 Y12.276667 (start point) +G1 Z#101 F#102 +F#103 +G1 X151.426333 Y12.107333 +G1 X151.426333 Y11.980333 +G1 X151.553333 Y11.853333 +G1 X151.553333 Y10.964333 +G1 X151.722667 Y10.795000 +G1 X151.849667 Y10.795000 +G1 X152.019000 Y10.964333 +G1 X152.019000 Y11.387667 +G1 X152.188333 Y11.303000 +G1 X152.611667 Y11.345333 +G1 X152.611667 Y11.218333 +G1 X152.781000 Y11.049000 +G1 X152.908000 Y11.049000 +G1 X153.077333 Y11.218333 +G1 X153.077333 Y11.430000 +G1 X153.289000 Y11.303000 +G1 X153.797000 Y11.345333 +G1 X153.881667 Y11.472333 +G1 X154.051000 Y11.303000 +G1 X154.516667 Y11.303000 +G1 X154.686000 Y11.387667 +G1 X154.686000 Y11.091333 +G1 X154.982333 Y10.795000 +G1 X155.617333 Y10.795000 +G1 X155.786667 Y10.964333 +G1 X155.786667 Y11.091333 +G1 X155.659667 Y11.218333 +G1 X155.659667 Y11.853333 +G1 X155.786667 Y11.980333 +G1 X155.786667 Y12.107333 +G1 X155.617333 Y12.276667 +G1 X154.982333 Y12.276667 +G1 X154.770667 Y12.107333 +G1 X154.516667 Y12.276667 +G1 X153.881667 Y12.234333 +G1 X153.797000 Y12.107333 +G1 X153.627667 Y12.276667 +G1 X153.458333 Y12.234333 +G1 X153.289000 Y12.234333 +G1 X153.077333 Y12.234333 +G1 X152.950333 Y12.234333 +G1 X152.738667 Y12.234333 +G1 X152.569333 Y12.234333 +G1 X152.061333 Y12.276667 +G1 X151.849667 Y12.149667 +G1 X151.722667 Y12.276667 +G1 X151.595667 Y12.276667 +G0 Z#100 +(polygon end, distance 13.27) +(polygon 312) +G0 X153.797000 Y11.895667 (start point) +G1 Z#101 F#102 +F#103 +G1 X153.797000 Y11.726333 +G1 X153.881667 Y11.684000 +G1 X153.881667 Y11.853333 +G1 X153.797000 Y11.895667 +G0 Z#100 +(polygon end, distance 0.53) +(polygon 313) +G0 X155.151667 Y11.811000 (start point) +G1 Z#101 F#102 +F#103 +G1 X155.151667 Y11.260667 +G1 X155.194000 Y11.557000 +G1 X155.151667 Y11.811000 +G0 Z#100 +(polygon end, distance 1.11) +(polygon 314) +G0 X123.020667 Y11.387667 (start point) +G1 Z#101 F#102 +F#103 +G1 X122.766667 Y11.176000 +G1 X122.555000 Y10.922000 +G1 X122.555000 Y10.625667 +G1 X122.766667 Y10.371667 +G1 X123.020667 Y10.160000 +G1 X123.274667 Y10.160000 +G1 X123.528667 Y10.287000 +G1 X123.740333 Y10.541000 +G1 X140.377333 Y10.541000 +G1 X140.589000 Y10.287000 +G1 X140.843000 Y10.160000 +G1 X141.097000 Y10.160000 +G1 X141.351000 Y10.371667 +G1 X141.562667 Y10.625667 +G1 X141.562667 Y10.922000 +G1 X141.351000 Y11.176000 +G1 X141.097000 Y11.387667 +G1 X140.843000 Y11.387667 +G1 X140.589000 Y11.260667 +G1 X140.377333 Y11.006667 +G1 X123.740333 Y11.006667 +G1 X123.528667 Y11.260667 +G1 X123.274667 Y11.387667 +G1 X123.020667 Y11.387667 +G0 Z#100 +(polygon end, distance 39.99) +(polygon 315) +G0 X149.352000 Y10.752667 (start point) +G1 Z#101 F#102 +F#103 +G1 X149.055667 Y10.456333 +G1 X149.055667 Y10.287000 +G1 X148.886333 Y10.371667 +G1 X148.420667 Y10.371667 +G1 X148.251333 Y10.244667 +G1 X148.124333 Y10.371667 +G1 X147.616333 Y10.371667 +G1 X147.320000 Y10.075333 +G1 X147.362333 Y9.652000 +G1 X147.616333 Y9.398000 +G1 X148.124333 Y9.398000 +G1 X148.336000 Y9.567333 +G1 X148.547667 Y9.398000 +G1 X148.928667 Y9.398000 +G1 X149.055667 Y9.525000 +G1 X149.225000 Y9.398000 +G1 X149.733000 Y9.398000 +G1 X150.029333 Y9.694333 +G1 X150.029333 Y9.567333 +G1 X150.198667 Y9.398000 +G1 X150.706667 Y9.398000 +G1 X151.003000 Y9.694333 +G1 X151.003000 Y9.906000 +G1 X151.341667 Y9.906000 +G1 X151.341667 Y9.059333 +G1 X151.511000 Y8.890000 +G1 X151.638000 Y8.890000 +G1 X151.807333 Y9.059333 +G1 X151.807333 Y10.202333 +G1 X151.638000 Y10.371667 +G1 X151.003000 Y10.371667 +G1 X150.876000 Y10.244667 +G1 X150.664333 Y10.371667 +G1 X150.029333 Y10.329333 +G1 X150.029333 Y10.456333 +G1 X149.733000 Y10.752667 +G1 X149.352000 Y10.752667 +G0 Z#100 +(polygon end, distance 13.40) +(polygon 316) +G0 X152.654000 Y10.371667 (start point) +G1 Z#101 F#102 +F#103 +G1 X152.484667 Y10.202333 +G1 X152.484667 Y9.863667 +G1 X152.273000 Y9.863667 +G1 X152.103667 Y9.694333 +G1 X152.103667 Y9.567333 +G1 X152.273000 Y9.398000 +G1 X152.950333 Y9.440333 +G1 X153.035000 Y9.525000 +G1 X153.246667 Y9.398000 +G1 X153.712333 Y9.440333 +G1 X153.797000 Y9.271000 +G1 X153.797000 Y9.059333 +G1 X153.966333 Y8.890000 +G1 X154.093333 Y8.890000 +G1 X154.262667 Y9.059333 +G1 X154.262667 Y9.313333 +G1 X154.347333 Y9.017000 +G1 X154.474333 Y8.890000 +G1 X154.601333 Y8.890000 +G1 X154.770667 Y9.059333 +G1 X154.770667 Y9.271000 +G1 X154.897667 Y9.482667 +G1 X155.067000 Y9.398000 +G1 X155.405667 Y9.398000 +G1 X155.659667 Y9.609667 +G1 X155.786667 Y9.440333 +G1 X156.040667 Y9.355667 +G1 X155.702000 Y9.355667 +G1 X155.532667 Y9.186333 +G1 X155.532667 Y9.059333 +G1 X155.702000 Y8.890000 +G1 X156.337000 Y8.890000 +G1 X156.506333 Y9.059333 +G1 X156.506333 Y10.202333 +G1 X156.337000 Y10.371667 +G1 X156.210000 Y10.371667 +G1 X156.040667 Y10.202333 +G1 X156.040667 Y9.863667 +G1 X155.871333 Y9.863667 +G1 X155.702000 Y9.779000 +G1 X155.702000 Y10.075333 +G1 X155.405667 Y10.371667 +G1 X154.897667 Y10.371667 +G1 X154.686000 Y10.160000 +G1 X154.474333 Y10.371667 +G1 X154.347333 Y10.371667 +G1 X154.178000 Y10.202333 +G1 X153.924000 Y10.371667 +G1 X153.712333 Y10.287000 +G1 X153.543000 Y10.371667 +G1 X153.077333 Y10.371667 +G1 X152.908000 Y10.202333 +G1 X152.781000 Y10.371667 +G1 X152.654000 Y10.371667 +G0 Z#100 +(polygon end, distance 15.04) +(polygon 317) +G0 X154.262667 Y9.948333 (start point) +G1 Z#101 F#102 +F#103 +G1 X154.262667 Y9.694333 +G1 X154.305000 Y9.821333 +G1 X154.262667 Y9.948333 +G0 Z#100 +(polygon end, distance 0.52) +(polygon 318) +G0 X157.353000 Y10.371667 (start point) +G1 Z#101 F#102 +F#103 +G1 X157.183667 Y10.202333 +G1 X157.183667 Y9.863667 +G1 X156.972000 Y9.863667 +G1 X156.802667 Y9.694333 +G1 X156.802667 Y9.567333 +G1 X156.972000 Y9.398000 +G1 X157.649333 Y9.440333 +G1 X157.776333 Y9.567333 +G1 X157.945667 Y9.398000 +G1 X158.453667 Y9.440333 +G1 X158.538333 Y9.271000 +G1 X158.538333 Y9.059333 +G1 X158.707667 Y8.890000 +G1 X158.834667 Y8.890000 +G1 X159.004000 Y9.059333 +G1 X159.004000 Y9.313333 +G1 X159.088667 Y9.017000 +G1 X159.215667 Y8.890000 +G1 X159.342667 Y8.890000 +G1 X159.512000 Y9.059333 +G1 X159.512000 Y9.482667 +G1 X159.681333 Y9.398000 +G1 X160.104667 Y9.398000 +G1 X160.274000 Y9.482667 +G1 X160.274000 Y9.059333 +G1 X160.443333 Y8.890000 +G1 X160.570333 Y8.890000 +G1 X160.739667 Y9.059333 +G1 X160.739667 Y9.567333 +G1 X161.036000 Y9.567333 +G1 X161.036000 Y9.059333 +G1 X161.205333 Y8.890000 +G1 X161.332333 Y8.890000 +G1 X161.501667 Y9.059333 +G1 X161.501667 Y10.202333 +G1 X161.332333 Y10.371667 +G1 X161.205333 Y10.371667 +G1 X160.866667 Y10.075333 +G1 X160.655000 Y10.329333 +G1 X160.485667 Y10.371667 +G1 X160.274000 Y10.244667 +G1 X160.147000 Y10.371667 +G1 X159.469667 Y10.329333 +G1 X159.342667 Y10.244667 +G1 X159.215667 Y10.371667 +G1 X159.088667 Y10.371667 +G1 X158.919333 Y10.202333 +G1 X158.665333 Y10.371667 +G1 X158.453667 Y10.287000 +G1 X158.284333 Y10.371667 +G1 X157.818667 Y10.371667 +G1 X157.649333 Y10.202333 +G1 X157.480000 Y10.371667 +G1 X157.353000 Y10.371667 +G0 Z#100 +(polygon end, distance 15.35) +(polygon 319) +G0 X157.649333 Y10.075333 (start point) +G1 Z#101 F#102 +F#103 +G1 X157.649333 Y9.948333 +G1 X157.691667 Y10.033000 +G1 X157.649333 Y10.075333 +G0 Z#100 +(polygon end, distance 0.28) +(polygon 320) +G0 X159.004000 Y9.948333 (start point) +G1 Z#101 F#102 +F#103 +G1 X159.004000 Y9.694333 +G1 X159.046333 Y9.821333 +G1 X159.004000 Y9.948333 +G0 Z#100 +(polygon end, distance 0.52) +(polygon 321) +G0 X11.811000 Y10.202333 (start point) +G1 Z#101 F#102 +F#103 +G1 X11.430000 Y10.075333 +G1 X11.049000 Y9.863667 +G1 X10.668000 Y9.440333 +G1 X10.456333 Y8.974667 +G1 X10.456333 Y7.831667 +G1 X10.710333 Y7.281333 +G1 X11.176000 Y6.858000 +G1 X11.641667 Y6.646333 +G1 X12.446000 Y6.646333 +G1 X12.996333 Y6.900333 +G1 X13.419667 Y7.366000 +G1 X13.631333 Y7.831667 +G1 X13.631333 Y8.974667 +G1 X13.419667 Y9.440333 +G1 X12.996333 Y9.906000 +G1 X12.446000 Y10.160000 +G1 X11.811000 Y10.202333 +G0 Z#100 +(polygon end, distance 10.89) +(polygon 322) +G0 X165.481000 Y10.202333 (start point) +G1 Z#101 F#102 +F#103 +G1 X165.100000 Y10.075333 +G1 X164.719000 Y9.863667 +G1 X164.338000 Y9.440333 +G1 X164.126333 Y8.974667 +G1 X164.126333 Y8.170333 +G1 X164.380333 Y7.620000 +G1 X164.846000 Y7.196667 +G1 X165.311667 Y6.985000 +G1 X166.116000 Y6.985000 +G1 X166.666333 Y7.239000 +G1 X167.089667 Y7.704667 +G1 X167.301333 Y8.170333 +G1 X167.301333 Y8.974667 +G1 X167.089667 Y9.440333 +G1 X166.666333 Y9.906000 +G1 X166.116000 Y10.160000 +G1 X165.481000 Y10.202333 +G0 Z#100 +(polygon end, distance 10.21) +(polygon 323) +G0 X158.834667 Y8.847667 (start point) +G1 Z#101 F#102 +F#103 +G1 X158.538333 Y8.551333 +G1 X158.538333 Y8.339667 +G1 X158.369000 Y8.466667 +G1 X157.988000 Y8.466667 +G1 X157.691667 Y8.170333 +G1 X157.691667 Y7.789333 +G1 X157.988000 Y7.493000 +G1 X158.369000 Y7.493000 +G1 X158.538333 Y7.662333 +G1 X158.707667 Y7.493000 +G1 X159.215667 Y7.493000 +G1 X159.427333 Y7.662333 +G1 X159.681333 Y7.493000 +G1 X160.104667 Y7.535333 +G1 X160.147000 Y7.323667 +G1 X160.316333 Y7.239000 +G1 X160.401000 Y7.281333 +G1 X160.697333 Y6.985000 +G1 X161.332333 Y6.985000 +G1 X161.501667 Y7.154333 +G1 X161.501667 Y7.281333 +G1 X161.374667 Y7.408333 +G1 X161.374667 Y8.043333 +G1 X161.501667 Y8.170333 +G1 X161.501667 Y8.297333 +G1 X161.332333 Y8.466667 +G1 X160.697333 Y8.466667 +G1 X160.570333 Y8.339667 +G1 X160.358667 Y8.466667 +G1 X160.147000 Y8.382000 +G1 X159.977667 Y8.466667 +G1 X159.512000 Y8.466667 +G1 X159.469667 Y8.636000 +G1 X159.215667 Y8.847667 +G1 X158.834667 Y8.847667 +G0 Z#100 +(polygon end, distance 10.92) +(polygon 324) +G0 X160.866667 Y8.001000 (start point) +G1 Z#101 F#102 +F#103 +G1 X160.866667 Y7.450667 +G1 X160.909000 Y7.747000 +G1 X160.866667 Y8.001000 +G0 Z#100 +(polygon end, distance 1.11) +(polygon 325) +G0 X39.835667 Y8.466667 (start point) +G1 Z#101 F#102 +F#103 +G1 X39.581667 Y8.382000 +G1 X39.200667 Y8.001000 +G1 X39.116000 Y7.662333 +G1 X39.158333 Y7.281333 +G1 X39.412333 Y6.942667 +G1 X39.708667 Y6.773333 +G1 X40.259000 Y6.773333 +G1 X40.597667 Y6.985000 +G1 X40.809333 Y7.323667 +G1 X40.809333 Y7.874000 +G1 X40.597667 Y8.212667 +G1 X40.259000 Y8.424333 +G1 X39.835667 Y8.466667 +G0 Z#100 +(polygon end, distance 5.43) +(polygon 326) +G0 X146.177000 Y8.466667 (start point) +G1 Z#101 F#102 +F#103 +G1 X146.007667 Y8.297333 +G1 X146.007667 Y7.408333 +G1 X146.177000 Y7.239000 +G1 X146.304000 Y7.239000 +G1 X146.473333 Y7.408333 +G1 X146.473333 Y7.620000 +G1 X146.685000 Y7.493000 +G1 X147.023667 Y7.535333 +G1 X147.108333 Y7.408333 +G1 X147.277667 Y7.239000 +G1 X147.489333 Y7.281333 +G1 X147.489333 Y7.154333 +G1 X147.658667 Y6.985000 +G1 X147.785667 Y6.985000 +G1 X147.955000 Y7.154333 +G1 X147.955000 Y7.366000 +G1 X148.082000 Y7.577667 +G1 X148.251333 Y7.493000 +G1 X148.759333 Y7.535333 +G1 X148.844000 Y7.662333 +G1 X149.013333 Y7.493000 +G1 X149.521333 Y7.493000 +G1 X149.733000 Y7.662333 +G1 X149.817667 Y7.577667 +G1 X149.648333 Y7.408333 +G1 X149.648333 Y7.281333 +G1 X149.944667 Y6.985000 +G1 X150.452667 Y6.985000 +G1 X150.749000 Y7.281333 +G1 X150.749000 Y7.662333 +G1 X150.579667 Y7.874000 +G1 X150.749000 Y8.043333 +G1 X150.749000 Y8.170333 +G1 X150.452667 Y8.466667 +G1 X149.944667 Y8.466667 +G1 X149.733000 Y8.297333 +G1 X149.479000 Y8.466667 +G1 X148.844000 Y8.424333 +G1 X148.759333 Y8.297333 +G1 X148.590000 Y8.466667 +G1 X148.420667 Y8.424333 +G1 X148.251333 Y8.424333 +G1 X148.082000 Y8.466667 +G1 X147.870333 Y8.255000 +G1 X147.658667 Y8.466667 +G1 X147.235333 Y8.424333 +G1 X147.066000 Y8.424333 +G1 X146.854333 Y8.424333 +G1 X146.685000 Y8.424333 +G1 X146.473333 Y8.424333 +G1 X146.346333 Y8.424333 +G1 X146.177000 Y8.466667 +G0 Z#100 +(polygon end, distance 14.19) +(polygon 327) +G0 X148.759333 Y8.085667 (start point) +G1 Z#101 F#102 +F#103 +G1 X148.759333 Y7.916333 +G1 X148.844000 Y7.874000 +G1 X148.844000 Y8.043333 +G1 X148.759333 Y8.085667 +G0 Z#100 +(polygon end, distance 0.53) +(polygon 328) +G0 X150.114000 Y8.001000 (start point) +G1 Z#101 F#102 +F#103 +G1 X150.241000 Y7.958667 +G1 X150.325667 Y8.001000 +G1 X150.114000 Y8.001000 +G0 Z#100 +(polygon end, distance 0.44) +(polygon 329) +G0 X150.071667 Y7.493000 (start point) +G1 Z#101 F#102 +F#103 +G1 X150.198667 Y7.450667 +G1 X150.283333 Y7.493000 +G1 X150.071667 Y7.493000 +G0 Z#100 +(polygon end, distance 0.44) +(polygon 330) +G0 X151.214667 Y8.466667 (start point) +G1 Z#101 F#102 +F#103 +G1 X151.045333 Y8.297333 +G1 X151.045333 Y7.789333 +G1 X151.341667 Y7.493000 +G1 X151.892000 Y7.535333 +G1 X152.019000 Y7.620000 +G1 X152.146000 Y7.493000 +G1 X152.527000 Y7.493000 +G1 X152.738667 Y7.662333 +G1 X152.738667 Y7.154333 +G1 X152.908000 Y6.985000 +G1 X153.035000 Y6.985000 +G1 X153.204333 Y7.154333 +G1 X153.204333 Y7.535333 +G1 X153.839333 Y7.493000 +G1 X154.051000 Y7.620000 +G1 X154.178000 Y7.493000 +G1 X154.559000 Y7.493000 +G1 X154.770667 Y7.662333 +G1 X154.982333 Y7.493000 +G1 X155.194000 Y7.493000 +G1 X155.194000 Y7.154333 +G1 X155.363333 Y6.985000 +G1 X155.490333 Y6.985000 +G1 X155.659667 Y7.154333 +G1 X155.659667 Y7.577667 +G1 X155.829000 Y7.493000 +G1 X156.294667 Y7.493000 +G1 X156.591000 Y7.789333 +G1 X156.591000 Y8.001000 +G1 X156.929667 Y8.001000 +G1 X156.929667 Y7.450667 +G1 X156.591000 Y7.450667 +G1 X156.421667 Y7.281333 +G1 X156.421667 Y7.154333 +G1 X156.591000 Y6.985000 +G1 X157.099000 Y6.985000 +G1 X157.395333 Y7.281333 +G1 X157.395333 Y8.170333 +G1 X157.099000 Y8.466667 +G1 X156.591000 Y8.466667 +G1 X156.464000 Y8.339667 +G1 X156.252333 Y8.466667 +G1 X154.982333 Y8.466667 +G1 X154.770667 Y8.297333 +G1 X154.559000 Y8.466667 +G1 X154.051000 Y8.466667 +G1 X153.881667 Y8.297333 +G1 X153.754667 Y8.466667 +G1 X153.627667 Y8.466667 +G1 X153.458333 Y8.297333 +G1 X153.458333 Y7.958667 +G1 X153.204333 Y7.916333 +G1 X153.204333 Y8.170333 +G1 X152.908000 Y8.466667 +G1 X152.738667 Y8.424333 +G1 X152.569333 Y8.424333 +G1 X152.146000 Y8.466667 +G1 X151.934333 Y8.255000 +G1 X151.722667 Y8.466667 +G1 X151.553333 Y8.424333 +G1 X151.384000 Y8.424333 +G1 X151.214667 Y8.466667 +G0 Z#100 +(polygon end, distance 20.35) +(polygon 331) +G0 X149.352000 Y6.561667 (start point) +G1 Z#101 F#102 +F#103 +G1 X148.674667 Y5.884333 +G1 X148.674667 Y5.376333 +G1 X148.971000 Y5.080000 +G1 X149.352000 Y5.080000 +G1 X149.563667 Y5.291667 +G1 X149.817667 Y5.080000 +G1 X150.198667 Y5.080000 +G1 X150.410333 Y5.249333 +G1 X150.622000 Y5.080000 +G1 X151.003000 Y5.080000 +G1 X151.214667 Y5.249333 +G1 X151.426333 Y5.080000 +G1 X151.934333 Y5.080000 +G1 X152.230667 Y5.376333 +G1 X152.230667 Y5.503333 +G1 X152.061333 Y5.672667 +G1 X151.934333 Y5.672667 +G1 X151.807333 Y5.545667 +G1 X151.595667 Y5.545667 +G1 X151.595667 Y5.588000 +G1 X152.230667 Y6.265333 +G1 X152.230667 Y6.392333 +G1 X152.061333 Y6.561667 +G1 X151.299333 Y6.561667 +G1 X151.130000 Y6.434667 +G1 X151.003000 Y6.561667 +G1 X150.622000 Y6.561667 +G1 X150.410333 Y6.392333 +G1 X150.198667 Y6.561667 +G1 X149.817667 Y6.561667 +G1 X149.648333 Y6.392333 +G1 X149.479000 Y6.561667 +G1 X149.352000 Y6.561667 +G0 Z#100 +(polygon end, distance 10.95) +(polygon 332) +G0 X149.479000 Y6.096000 (start point) +G1 Z#101 F#102 +F#103 +G1 X149.436667 Y6.011333 +G1 X149.521333 Y5.926667 +G1 X149.521333 Y6.096000 +G1 X149.479000 Y6.096000 +G0 Z#100 +(polygon end, distance 0.43) +(polygon 333) +G0 X151.299333 Y6.096000 (start point) +G1 Z#101 F#102 +F#103 +G1 X151.299333 Y5.969000 +G1 X151.426333 Y6.053667 +G1 X151.426333 Y6.096000 +G1 X151.299333 Y6.096000 +G0 Z#100 +(polygon end, distance 0.45) +(polygon 334) +G0 X152.823333 Y6.561667 (start point) +G1 Z#101 F#102 +F#103 +G1 X152.527000 Y6.265333 +G1 X152.527000 Y5.376333 +G1 X152.823333 Y5.080000 +G1 X152.950333 Y5.080000 +G1 X153.119667 Y5.249333 +G1 X153.119667 Y5.376333 +G1 X152.992667 Y5.503333 +G1 X152.992667 Y5.672667 +G1 X153.162000 Y5.588000 +G1 X153.627667 Y5.588000 +G1 X153.881667 Y5.799667 +G1 X153.881667 Y5.503333 +G1 X153.754667 Y5.376333 +G1 X153.754667 Y5.249333 +G1 X153.924000 Y5.080000 +G1 X154.051000 Y5.080000 +G1 X154.347333 Y5.376333 +G1 X154.347333 Y6.265333 +G1 X154.135667 Y6.519333 +G1 X153.966333 Y6.561667 +G1 X153.754667 Y6.434667 +G1 X153.627667 Y6.561667 +G1 X152.823333 Y6.561667 +G0 Z#100 +(polygon end, distance 7.57) +(polygon 335) +G0 X152.992667 Y6.138333 (start point) +G1 Z#101 F#102 +F#103 +G1 X152.992667 Y5.969000 +G1 X153.162000 Y6.053667 +G1 X153.458333 Y6.053667 +G1 X153.416000 Y6.096000 +G1 X152.992667 Y6.138333 +G0 Z#100 +(polygon end, distance 1.14) +(polygon 336) +G0 X154.940000 Y6.561667 (start point) +G1 Z#101 F#102 +F#103 +G1 X154.643667 Y6.265333 +G1 X154.643667 Y5.376333 +G1 X154.940000 Y5.080000 +G1 X155.321000 Y5.080000 +G1 X155.617333 Y5.376333 +G1 X155.617333 Y6.138333 +G1 X156.083000 Y6.096000 +G1 X156.210000 Y6.096000 +G1 X155.913667 Y5.757333 +G1 X155.913667 Y5.376333 +G1 X156.210000 Y5.080000 +G1 X156.718000 Y5.080000 +G1 X157.014333 Y5.376333 +G1 X157.014333 Y5.503333 +G1 X156.845000 Y5.672667 +G1 X156.718000 Y5.672667 +G1 X156.591000 Y5.545667 +G1 X156.379333 Y5.545667 +G1 X156.379333 Y5.630333 +G1 X156.929667 Y6.138333 +G1 X157.437667 Y6.096000 +G1 X157.564667 Y6.096000 +G1 X157.268333 Y5.757333 +G1 X157.268333 Y5.376333 +G1 X157.564667 Y5.080000 +G1 X158.072667 Y5.080000 +G1 X158.369000 Y5.376333 +G1 X158.369000 Y5.503333 +G1 X158.199667 Y5.672667 +G1 X158.072667 Y5.672667 +G1 X157.945667 Y5.545667 +G1 X157.734000 Y5.545667 +G1 X157.734000 Y5.588000 +G1 X158.369000 Y6.265333 +G1 X158.369000 Y6.392333 +G1 X158.199667 Y6.561667 +G1 X155.659667 Y6.561667 +G1 X155.490333 Y6.392333 +G1 X155.321000 Y6.561667 +G1 X154.940000 Y6.561667 +G0 Z#100 +(polygon end, distance 16.22) +(polygon 337) +G0 X159.215667 Y6.561667 (start point) +G1 Z#101 F#102 +F#103 +G1 X159.046333 Y6.392333 +G1 X159.046333 Y6.265333 +G1 X159.215667 Y6.096000 +G1 X159.554333 Y6.096000 +G1 X159.554333 Y5.545667 +G1 X159.215667 Y5.545667 +G1 X159.046333 Y5.376333 +G1 X159.046333 Y5.249333 +G1 X159.215667 Y5.080000 +G1 X159.723667 Y5.080000 +G1 X159.850667 Y5.207000 +G1 X160.020000 Y5.080000 +G1 X160.401000 Y5.080000 +G1 X160.570333 Y5.207000 +G1 X160.697333 Y5.080000 +G1 X161.205333 Y5.080000 +G1 X161.501667 Y5.376333 +G1 X161.501667 Y6.392333 +G1 X161.332333 Y6.561667 +G1 X161.205333 Y6.561667 +G1 X161.036000 Y6.392333 +G1 X161.036000 Y6.053667 +G1 X160.866667 Y6.053667 +G1 X160.866667 Y6.392333 +G1 X160.739667 Y6.519333 +G1 X160.062333 Y6.561667 +G1 X159.850667 Y6.434667 +G1 X159.723667 Y6.561667 +G1 X159.215667 Y6.561667 +G0 Z#100 +(polygon end, distance 9.30) +(polygon 338) +G0 X160.866667 Y5.588000 (start point) +G1 Z#101 F#102 +F#103 +G1 X160.951333 Y5.545667 +G1 X161.036000 Y5.588000 +G1 X160.866667 Y5.588000 +G0 Z#100 +(polygon end, distance 0.36) +(polygon 339) +G0 X158.369000 Y6.053667 (start point) +G1 Z#101 F#102 +F#103 +G1 X158.199667 Y5.884333 +G1 X158.199667 Y5.757333 +G1 X158.369000 Y5.588000 +G1 X159.004000 Y5.588000 +G1 X159.173333 Y5.757333 +G1 X159.173333 Y5.884333 +G1 X159.004000 Y6.053667 +G1 X158.369000 Y6.053667 +G0 Z#100 +(polygon end, distance 2.48) +(predrilling) +F#102 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X0.000000 Y0.000000 Z#101 R#100 +G81 X24.130000 Y7.620000 Z#101 R#100 +G81 X24.130000 Y10.160000 Z#101 R#100 +G81 X24.130000 Y15.240000 Z#101 R#100 +G81 X24.130000 Y17.780000 Z#101 R#100 +G81 X26.670000 Y15.240000 Z#101 R#100 +G81 X29.845000 Y12.700000 Z#101 R#100 +G81 X34.290000 Y12.700000 Z#101 R#100 +G81 X34.290000 Y7.620000 Z#101 R#100 +G81 X29.845000 Y7.620000 Z#101 R#100 +G81 X40.005000 Y7.620000 Z#101 R#100 +G81 X40.005000 Y12.700000 Z#101 R#100 +G81 X41.910000 Y15.875000 Z#101 R#100 +G81 X40.005000 Y17.780000 Z#101 R#100 +G81 X53.975000 Y10.160000 Z#101 R#100 +G81 X70.485000 Y15.240000 Z#101 R#100 +G81 X78.740000 Y21.590000 Z#101 R#100 +G81 X80.645000 Y19.685000 Z#101 R#100 +G81 X82.550000 Y17.780000 Z#101 R#100 +G81 X85.725000 Y10.160000 Z#101 R#100 +G81 X116.205000 Y24.765000 Z#101 R#100 +G81 X116.205000 Y27.940000 Z#101 R#100 +G81 X118.745000 Y27.940000 Z#101 R#100 +G81 X118.745000 Y31.750000 Z#101 R#100 +G81 X116.205000 Y31.750000 Z#101 R#100 +G81 X116.205000 Y34.290000 Z#101 R#100 +G81 X118.745000 Y34.290000 Z#101 R#100 +G81 X121.285000 Y39.370000 Z#101 R#100 +G81 X125.095000 Y39.370000 Z#101 R#100 +G81 X127.635000 Y39.370000 Z#101 R#100 +G81 X132.080000 Y34.290000 Z#101 R#100 +G81 X135.255000 Y31.750000 Z#101 R#100 +G81 X135.255000 Y27.940000 Z#101 R#100 +G81 X132.080000 Y24.765000 Z#101 R#100 +G81 X125.095000 Y27.940000 Z#101 R#100 +G81 X123.190000 Y29.845000 Z#101 R#100 +G81 X123.190000 Y24.765000 Z#101 R#100 +G81 X119.380000 Y20.320000 Z#101 R#100 +G81 X135.255000 Y16.510000 Z#101 R#100 +G81 X130.810000 Y7.620000 Z#101 R#100 +G81 X135.255000 Y39.370000 Z#101 R#100 +G81 X135.255000 Y49.530000 Z#101 R#100 +G81 X135.255000 Y59.690000 Z#101 R#100 +G81 X135.255000 Y62.230000 Z#101 R#100 +G81 X132.715000 Y59.690000 Z#101 R#100 +G81 X139.700000 Y62.230000 Z#101 R#100 +G81 X141.605000 Y57.785000 Z#101 R#100 +G81 X139.700000 Y72.390000 Z#101 R#100 +G81 X132.715000 Y76.835000 Z#101 R#100 +G81 X131.445000 Y85.090000 Z#101 R#100 +G81 X128.905000 Y85.090000 Z#101 R#100 +G81 X139.700000 Y85.090000 Z#101 R#100 +G81 X141.605000 Y88.265000 Z#101 R#100 +G81 X160.020000 Y78.105000 Z#101 R#100 +G81 X160.020000 Y75.336400 Z#101 R#100 +G81 X160.020000 Y72.567800 Z#101 R#100 +G81 X160.020000 Y69.799200 Z#101 R#100 +G81 X160.020000 Y67.030600 Z#101 R#100 +G81 X162.560000 Y68.427600 Z#101 R#100 +G81 X162.560000 Y71.196200 Z#101 R#100 +G81 X162.560000 Y73.964800 Z#101 R#100 +G81 X162.560000 Y76.733400 Z#101 R#100 +G81 X125.095000 Y59.690000 Z#101 R#100 +G81 X118.745000 Y59.690000 Z#101 R#100 +G81 X116.205000 Y59.690000 Z#101 R#100 +G81 X113.665000 Y59.690000 Z#101 R#100 +G81 X118.745000 Y62.230000 Z#101 R#100 +G81 X118.745000 Y66.040000 Z#101 R#100 +G81 X116.205000 Y66.040000 Z#101 R#100 +G81 X111.760000 Y66.040000 Z#101 R#100 +G81 X109.855000 Y66.040000 Z#101 R#100 +G81 X107.315000 Y66.040000 Z#101 R#100 +G81 X101.600000 Y66.040000 Z#101 R#100 +G81 X99.060000 Y66.040000 Z#101 R#100 +G81 X93.345000 Y66.040000 Z#101 R#100 +G81 X88.900000 Y67.945000 Z#101 R#100 +G81 X83.185000 Y66.040000 Z#101 R#100 +G81 X81.915000 Y67.945000 Z#101 R#100 +G81 X78.740000 Y66.040000 Z#101 R#100 +G81 X78.740000 Y62.230000 Z#101 R#100 +G81 X82.550000 Y62.230000 Z#101 R#100 +G81 X72.390000 Y69.850000 Z#101 R#100 +G81 X67.945000 Y69.850000 Z#101 R#100 +G81 X68.580000 Y66.040000 Z#101 R#100 +G81 X63.500000 Y66.040000 Z#101 R#100 +G81 X60.325000 Y62.230000 Z#101 R#100 +G81 X53.340000 Y66.040000 Z#101 R#100 +G81 X48.895000 Y66.040000 Z#101 R#100 +G81 X48.895000 Y62.230000 Z#101 R#100 +G81 X38.735000 Y66.040000 Z#101 R#100 +G81 X34.290000 Y66.040000 Z#101 R#100 +G81 X27.305000 Y64.135000 Z#101 R#100 +G81 X24.130000 Y66.040000 Z#101 R#100 +G81 X24.130000 Y76.835000 Z#101 R#100 +G81 X37.465000 Y83.820000 Z#101 R#100 +G81 X41.275000 Y83.820000 Z#101 R#100 +G81 X45.085000 Y83.820000 Z#101 R#100 +G81 X48.260000 Y86.360000 Z#101 R#100 +G81 X45.085000 Y93.980000 Z#101 R#100 +G81 X41.275000 Y93.980000 Z#101 R#100 +G81 X37.465000 Y93.980000 Z#101 R#100 +G81 X60.325000 Y81.915000 Z#101 R#100 +G81 X63.500000 Y83.820000 Z#101 R#100 +G81 X67.945000 Y83.820000 Z#101 R#100 +G81 X67.945000 Y80.010000 Z#101 R#100 +G81 X72.390000 Y80.010000 Z#101 R#100 +G81 X72.390000 Y83.820000 Z#101 R#100 +G81 X76.200000 Y86.360000 Z#101 R#100 +G81 X72.390000 Y93.980000 Z#101 R#100 +G81 X67.945000 Y93.980000 Z#101 R#100 +G81 X63.500000 Y93.980000 Z#101 R#100 +G81 X88.900000 Y96.520000 Z#101 R#100 +G81 X92.710000 Y93.980000 Z#101 R#100 +G81 X97.155000 Y96.520000 Z#101 R#100 +G81 X100.330000 Y92.710000 Z#101 R#100 +G81 X100.330000 Y90.170000 Z#101 R#100 +G81 X101.600000 Y85.090000 Z#101 R#100 +G81 X99.060000 Y85.090000 Z#101 R#100 +G81 X103.505000 Y81.915000 Z#101 R#100 +G81 X106.680000 Y85.090000 Z#101 R#100 +G81 X109.220000 Y85.090000 Z#101 R#100 +G81 X109.220000 Y81.915000 Z#101 R#100 +G81 X113.665000 Y76.835000 Z#101 R#100 +G81 X111.760000 Y73.025000 Z#101 R#100 +G81 X105.410000 Y88.900000 Z#101 R#100 +G81 X106.680000 Y91.440000 Z#101 R#100 +G81 X109.220000 Y91.440000 Z#101 R#100 +G81 X111.760000 Y96.520000 Z#101 R#100 +G81 X92.710000 Y83.820000 Z#101 R#100 +G81 X70.485000 Y57.785000 Z#101 R#100 +G81 X53.975000 Y36.195000 Z#101 R#100 +G81 X111.125000 Y39.370000 Z#101 R#100 +G81 X111.125000 Y49.530000 Z#101 R#100 +G81 X113.665000 Y52.705000 Z#101 R#100 +G81 X121.285000 Y49.530000 Z#101 R#100 +G81 X125.095000 Y49.530000 Z#101 R#100 +G81 X125.095000 Y47.625000 Z#101 R#100 +(443 predrills) +(milling distance 8817.39mm = 347.14in) +M5 M9 M2 diff --git a/doc/aic-bottom.gcode.png b/doc/aic-bottom.gcode.png new file mode 100644 index 0000000000000000000000000000000000000000..503e4bb019f04907c035142136da89383a79ee27 GIT binary patch literal 69487 zcmdRW_dk{4`?wKtQW-}^$w=}Xl^L=(9rGOL*x7rBkdcvj$SB92M-RuIA)5$gB!p}U zMOJ2{@1ytU{ds-Af5P{dUdMgS`?~M@y6N6eA0Mt4f80Eiz|3W{Zf1hr~YeTf%FHGt1n|to5@ev7^)ACERp1ZJ8pNkqS;$NJtF|3oP+Md$;au}42+sT-&&v~2V zzZTSWQqJp?hfI8i2;V7@QW=^$#rUe@6^^hNz(WVrd73=@t4=bAaS(m>J4YRp3bQLh z^Wt8p;1y6wBE@hV;S~zhf!}D2{x7<<+wz%`m`~rJL{! z7MJiHT_U=)=W7`}ov7nSKvrEps7Koq6uw6zy8R$a{6T@MJ(6^3L( zLVi6vKL%(-(Z8y~X z@}qHu2xZw^Zk1uo8xDaa$;HSf2M|=+rt1vJY!`X<9-pZRM zkVW&OVOZQHOgIZdxEP)_tQ3w=KL6wH!zyDYEN=FnNa@F@i0_a{w|^ot-}C9O&q5-_ ze!nkAD0?DmEK)y023AQSMS=EOKg0Pvei4wvY*^edrAbb+2!;8B=${LwdbCKo>;9V8 z$)84&U}4~$Ck{B(hF=Fxq5C=Rpj=!Fj{t|=)~|8bVt84fx-LgOVvZj^H{DYDW8i2! zr-8`4+dp;MPJ zz(=bJszWg=>3^WHz9vlTvHs;A_AEJNJel-9?r?TB^o(J-*3CL= z;{UKXs(>W_rk&X=5{{tA!N~*vxG|ltw)}m}7a3&pC+q6F@-d07iJnuMAm3Sw zGs1_)Kk-&R6FtuJtHTNllld<=qyII40S>Jjuw?(xuTE5>-HPD>{WW~W@cfGnqQi4e4$H*OP=WfXY>O2M%EZ7C3}oMzZ{)7ct&A zrp|d_-rPp%CK23vkhdA=rGh7L9(`yiLPKtqITWF+xYM>vx*Gntl8d|;K3LV>7Hj6R zoiTFtMCSKWg=-#C@Jlcsd2eaFVyW>rvpcy+3-*jX#a>6gA3tYH~R!id* zO2dz`8C;+Iz113LJ6qeg{@K2DmWW)iHB&1(Q@1mzR5U(k^JI*O0xRPN0_rTQVsI5= zxhg<)VavY_pwV~!f!PB4>Dc%+6JXFv_|~vx8iY|C#%0WgJ)58fvNc{a;5^NAx;rQy zH_&=lYzXxAY1>a5?HBzILhih?Ca?0W&x0C>xSrk3O%6n-HvboB4%=zHgX9f=eLue2 zRdyBwQ{I5~_nB^T^6t^R%BQt`_dKP>E?3wU=l|1)2Hr164f3WcJ!Sl*`}c>lw|~I{ zRXu2Puqfv&CF|fqAJiHU77cR>db1Ay8RG8$j++t)M!Z5}sI!H)0#Y%YRgIn(U+BO( zWHe&hCHJ5FAfDMauebEOoW{=s(U)$hGBo@#VtjB|t#k`NmFqBqS582|Oaq3_Q*~Ws z^svcUx}t+4JgEJ$^&mF0&%vDq3|3)^;zG(dlirslTTqEGnG}MNAxUpOG;rDFj<}=F zrjLS2aPTGSz$`WEj}nb^F8w?b0D0FG3$mWkvAij*GE@R`C+(5E6t`KNwcmUz9Zul8 zTH^=uW-2Yep%=Q5GD&b4Ws%?SaC83*iM}C{(nKUl^u3{QX(xXh$b*N!v@h!*PqYwb zxl^78k2G5eD{grUrwfvgke|F}*a#%Y_CSC9_f6ygyhklY-*X zZa?_eqNf`VCK{5CUYP>O;{>}EgD{o5zkazEV12q8m>xe@Z9z|ekdh_!Fq`R=IGwTH zaW2-wEj~zcSk-x@a<}5aNU@}4?X^KaFj#0vo5b0Y<8{h&gV$)dHUUr1$RT9^CMR!b z!k=c}P$58k4Nv&^i-7~~s?_tr1YHK#`4W!5OQrnI`9r!EALMhAY1s!IL0`DvQ>hm@ zD~gaf%j)N>uizIR(&C<*yz?@W2QsTt%A1XVjqq&t_@$nX#JHgPRH^)8JfZn=TJj|& z*QM$&A_EfKN+S!UdNAJI6JL`L-HMlRQs@#mW8u`}yHxV#?J~^X85elNCHFtQH7tXJ z5GR9%1-8hc2#tJ7M7IP}7(MxZh-}ss9oPX{-A~*Jzli#Aw4hc1RK~?W+00+=lo}be zpo+T|7uce6};%(?dF`Ld#vm$s0vCM;_>G<_*mbJ3t=jHNr zQ677H6>A0!ma_DSEP4`T)4Q*Bc(PaPfjVD>mi*bVHMY+?F4!tDMobnXlxG$~S}Qy% zj1Q@7^fU$LuUh^Cm;A6K(PvxH$K^Vy)c!WZ!gi1x?70dXDEAlFi{a|rh%g3?>0m5K zl)RQqQ&(u7u25S%jI;<%URD&eC=)yj=D+pXgT1H4ZZYb;s?)Io zOFsmpN-)5WOZ?s^_S|LoQm0Dv(p~)-ImC5pVMqVfx0%`_e9FFMHzh@7i{XTE(ga42 zM=E^EDqeW$uyk&Vh+R*C>FXuvQMT(6vr(yIti#ix);9TgE~}GyPm(sb+Z)uvuSVe0 zmxyQ#+jFWDbX(sCX1*sOLMFh(!r1B!5kNS%F;XVNW_%YJBCb+<%8tdAa(p+OatC{# z*l#~yPg_eA%5Qxp(;Nj&QNj-k(rW6e{Y?-u05m?bIw(H#ZNAk{tF7w}YT*e#Rm z5lv2`tXy=Zio$7K8$Zva;;8?n(q|Z;IL;Ic$bHu9P>0Kd0v#5<{^~Ek&(7Ffx~*Dt zrdwv>xg5XPQN5kqT4k*$_tM{|f7<+hI#j^3*LH5LXoTJ9h-%YeW3dozL37LszSyfM zf-6@zG)A`3*1+O4U!#XjfPnFiI-%AIQ9TmMF@a8vGlft{(h8TcJ-c+)s`opJZ?JCZ zeBqmouNfFk**AOVc-bfZ7Z3G4((RRX_TL+NhT}Eg^nTuZjfDk`e2K<=~`?_X~jWuh2;{D3;f-uxkQx zfVnZ_kZu6DRftC@r}yE>%4mNqmW)D|k(xAW*Z?3A^q5f!AAdVKWs}M-lUwD!{_N<9 z%%{^LtM>;o8{4O!&*_Kfp}+(`0s)eBbzBn@W_pzHM~R{s-lO;I@QIB11=_M8QZRS6 zn%I?O98RI9+$~C;WI3r6E=yDCrslszS3$iE$sQYinAEvh`SE^bC*pSHU`X+foH6K| ztI}D=)2q(TzGL=BZhtEPM4}#hv4aAADi?Z(3cK)&(~X(v(sbgMq_4Ai?41TIr#}(h zP?`(J;F@p&l3$S_+MUiSyxqmour{9_$_R89zcC%OLeP;hvO5=xTgk8{lbjp;faoSf z!z6<6Z7RxN^hfx*r=2_xP`Ep-uVYzD7Jb;USa$Z&%dvHb-Dm^k7?Yq-^1z^5%_k8F!ear|~VjHnx*3k^^Jf&cW^a_m?$)f1=*?ku!Ob`69N#Z&R_G27FE>NW<#7!zj1!U!KT(#_W)!+^9x9j>H zr087Xen+Q1p#ISiM}MR%(^164$W`U%&fjkdrHAwp+8rS)`IyAZ#(b&RO zV8lnU(D>~-F*j4y^+w<}*M3oXr4Gxs+>$R!!@4@TU+=lCx51+~ZuvhfeuZ~66T2g=snivs17;`Z^S!XFdL2}#Xg-RjkEaRn%v_0>k)BUz96b%UD!&!*0XEOHx5ir z6PT0a&V(u0{|jivqj(TTIn_U$%XDE*v)>N36aB;8nV4VdoZ*n{d@VYQS^gpMQP5yu z#=JYnhrN3Odkj{TdFZ7KPVLkJ9ne4lP-0*#gYGQlaS2fEX`8c3LBa2X6UIOZP?>z;71*1;08 z2Z(U~j8NHPDDVrWzMglp5L39Dn<_1?iV+BP|~#h(CnvdFK?ea z&${F`5kXInq%%tqBfvl3&<+N|SDX{0&p&(bW8$S877|Vmg);^K* zabJ6V8sWm5hXmX+4jc#Gr0lJ1nn{oM6X86c+C`8dvVu@HrF!Q#Mb6ObLd0wz`DNL4 zantboEq5`n&gGeREqZcEo#SX-$F_^UH&8`?EQUDh9?=BHK?$1=?@8lRXin)LcN1b# zt2V#V?1(ulQr|<$vmaN+lPCcJhIcoEyT3oC1F8JIMFpOt=Wpbm$!e_h^Bl$J5D(Wa zn%f8!e%Xw_o0xR+;k9(;Lp+eQbWf#k6q$G&ud;oT%^o*WK1ia^tKNpk2oc^T#;rl9 zwq85UCHKDe$@D%WlFm?It>&BY9S-EeeU;_H%i=#?qF{<*0x@V>{yHLBq||t^3G*!) zw)jVPS6nOb$;@3{*zYXE1Gf8A_|BZSLccCG|8~T4Rl>NYmKIiTnUh2LEet>spM3j0 z1LN`OhS@eFIP_a1u%0i8tp14TRkI;ddhuO}Uhxg>Cm_|dhv-Lnz@R3JSqh7bc&x87 z7MWi+t<>Eb`REiE1TK~i%``>9z}zwte+dh-&n_=M!u4_Or8Oa!kaTP*{G$iwvA`GX zonJ-jFNtx^GQ|0Tn@OFfKfL43C$5EMf0S}!e3H$zo@V3i37VIEQ!i_SQbgsBX+w4? zJc#QS6#Q|$UZ?5hckAbrk@6GH#)suhrOzObo9;cYpDO6Vs}ySZ(K=nyE|`=hWwWD5 zu|iW3%niuy(90%@d*K@V1Xj&@5EK?Qo*ymB@5c$cGQIk}y|{Zc@K=%L=}_tKbUq4q zqr7*}6aV4Z@KGmu-J()=IKK0U`*I$9Z^qYC%bFA1x>)nWsT|(m^pFT8rIaN>j=<~? z&ymy=B8gXI&842&8qr^+1t!q$ibh&TIU02YRJ=lZ79 z&;4vO)dN_|>imtoYEIE2h1>jsnHM$k;SFq1b`X)QrrYIav1rEFbL%h5ouKboe9q98 z`9fp&PU1Kh$yqmxAK92S&3pN=JnN!}KCGmOmr~jYPr!BynI$~wa*Q5?1uO+A0bM+7 zVc08cwB~j45NgOQnwe9?ulf(h^V`(5uof}LolJNceD9%n0v5)N8b$#IYq|;02`|FlhAz1UcCS>YIII2<6s#{k^82&0T7>uyOOxx+Tw15YMV42wykJi z?L<4q16jQ=@QjKyjnXDkC1&`3^w6I`6`S&bJGR)8*Kg>+-l{YO1E5oh!Wd|Nsjatt z!O3Mq?bzaZo6=Pkq^Pg5|1h_uZYGJ_5jNoWjt8up&Crz=q zD|neo!*-cZtV^Yq&Bbi(Jl|Q$3#za}a}qv(Ppj|i;3RJNFu#;_T9JbdSuNi2?Xh80 z)&cEN-}8M_&xHM+*JXb=x=5oRp&b>vNqj~(zI2Zm{rLl}>MbLkR1NG=S zgG-0x-4fns2;~@L{$+V3QlEqxoJ?0)gEUiCo5j_oG8|vHRgIPOqs_p-r-Em4|75EJ z%I?2>&PX*!mKbf$YuklJ?Tvf6G{={t1d3CPe*Z_gd=08qZ(NgXDf0 z3!+8Cw!FpTqw7dEWDJ#AFn|$8A`(p-Ph&n5pS^(leA5vs@HuC6+=B(nFB9IGn z`GwuLI?s_Tv4Jv?#?yd{o_IF0AbwE`Sb^TS2$H^lZxmb-PM7)-}uBQ z)1qnrf8)&dOCYyrJ{+DINAo<`>pM3oDf&P9Tv4?BDYY)9TGqBJ_=zIUh$Y^b^)Isu ztJhqgMDMqV_1j^HaNpnJl z#r(Ths|>rn-3PXaHMk=9v9*C3kU50U?CCFqA5Z;hQ}+kAEQMGJ|7$ioMqOZE(nAg5H)}*wzXZY2Dce2`5uY+3bJ<|DQJTKBN0@FTe}O^u_yG=%}YylUVwa-v+h|M~{QoSP|XzKHKpb>_Izq zdgL#vYY;C1Wy{G7-zqi=y}oydXMuy?m>sfT)M8-nKJqc9V0rtW%Pc-ssDVCgT|3#4I#)G05A*=8tm{;XrP%F91mg9!f@3a}Ut| z&5L_WztU<6s#&ULaiCTsRQhAKb=H$pEr3vE5O{X{l3_uVWs zVVm;TZ(iQchg;DzUihd3aMWbKLN_ZbjKJA30Ma})@oHV0f+E=4@>LztJtaP|`+lq2 zWR6xHI?MJ1vO*}%o87*N=c+oYPhD$z^?(P3^Z!DliJ2F{;HD*8lhD)OZa0y52Chl< zaU)4-goWPj>)RK>6ZBC?;L?=FYa6EA7IakW=IuQA<;2_m)p7lme;ADr%FBC>NZ^`c zQ1&Gx=TU1-7+P-cqpUc(FdCMWj7)selcIxD^;#PmHUo-heW1!j$Xt)1Y^DQ&3GQ2RN2_cqdL(IG7Ook6PVH_NPcD29)z=)9C#yJ-oL>IAun4_0b0+0e z<%KOz6qHC&|WYV*WMjwb29l&^Nk!*=XNx zqj_CMew9V!BO}rJ-F?Ufuy1UCL|&jD-7UNCg6HCc%JGSB_mT+ee!+}V`SgqhvqRn7 zOqILf0&ldEnjTcU=Zahdl&1_2y9J)Jb+-3v6}o>xDE|lW0Z`8Q-d9r>18|ZvFn(VS z1cO_+h1ogts~ga-#@`&>xmyT-c=sr+CB$0Ug?Qk}85{3&gycL4(AE0KxI2mKPor3E zW~k)kWzzj_%<&sqHUGjY^b$8z`S&o;0D_wWo*L5(eSw;10@CB-URS^`7joN>IfeZP z{9?qsK%{%fQ)on7pL}JA}U~exV>7jkEIB>{s!Z}=av-y>%}rA}J3VEWOg2K68;RVJh5gwCaF%3OW>`k;rN zvE5!KfcMuQw>OiAWz(+?Mpyocc)|EMEuAIsyM7xpei5KerJe;Ja8&#U0)1& z+@b2*_aj&OzWQ>Jq_k#VJN#a4m=wyF-0v3k@UZrU;stPvTiSH##>)cQqr2a`XimH) zZzDSx)t7x9Jg*IO`XmP|vWxNm{rpBFeQ_r?X7hiDvtp*|c`hb(zTEW{d{%o2^YF2L zz@#&xVSIML=z2Naq)G!&o{QYIEet`glfFgRCR}@6Yyx)aj~1Gn5G+|ibDYhN%P@+` zP8X8keQ;GPF&>j1$`ROIP4$(YafFvb_x4L9snv=2tu|qkyY$)0ZS8M+(OjBcmnkLAjN zAlv!_La~h$w5P09!8e}`G{8UbDjS_I*5cAf<51(X$>`Ks7k>@QcX;MP_)%?Oy5-|$ zF((xh|D1QU{ zVU7$IGX?=Z$b(lUphYxvO%#E+jmu5@ zGAdGI~upjz?jLO_hI;T zm6#wg_wNj%gq3L^$OnLdE4=T)Lr$voJTJHKOagW5oB7FMAM3%(?_V zR>Dxmu2(sbK=c*5d$lP&FB-=AyG(lxEOaq#nk^+&08MB@LU$i zkc51+bFUtd$>2!6R`KMUsovwPq&!Xr-f$j-_4oR?I?+;_8kF1t-V2jqwfC@W89p0*d^s{UFTWBYE9$+}yNjAe#<1`~x#y3_A-~;rGm~=uOx?ku(p#XyJ z{)tGPvOVwT?R0J?iC{<|i+b}>NKJ{xtwSmrmq6D!CWx}|+jk=Q2eiB~xP1rT8D%gV z>H=lMdeU2&tS>$@PfJb6%R$S{8z-i6ju$|WnTso?-!gX2CJ!($20rGCZPZIG|MNpz z7PLSojmq?3Q-_X@^jWxf`lE4l zUh0_G4ST15V2Y1c++#{w8T42)ag<=NYcy_{%|%lcw0}XISk)D%Wo?hBpCV)MznVmPZOwn#I- zK*fH3*o>U&E%_R^DCy?jgu#mOC*N*fQq40X5G>+tDO;tlxu|+J2BwVio!(kB4|?w> za(wsuvSWhRr&3qb=MOO4qt#E2^HYB=)Y*C+e|}?jqLNVLT3j5e&iWD zSB94sJ?9UGDj#cOUWHjsX9es!+9jbb2x$S_uDOLeus(ftVf^A&0rhFX38+p8O&oRk z@-&Qyl1(s6P%s7BpI>Z@qI_~)mzRP{i@Y}j6DjtPe^(nL@S;(3sxaDV;_`_tXSW!FPOUW{r1~vIDGmxjARL z)X+ThV&!8k%&TzA(eGCm_0k0O?)1umzN4x-#$fLAnyEVvbU)s+Q|2#%w=gi4+6}SR zv2$7^@gN#{`NEl65*L?{j|%O|X6`O&hpG)2z9wbd{x6>P%TEHD7p=t(cJSl=2Ao9FFL81X^BRbhV3eFMKJ^BOJ1_1W;}l~;h}y%nib^YqlIKW-ckwYkZTjW_vyi%BzLrWP$&M!1 znxpxk5mb_FJ^u@SoLOY=)QpC|0>1Ee_ufM^h}Jo_y|2E>z(}4P-du`~8c=0$VcL=W zxSX$-jrM{JFno zr-*(L0iCDCNKT(XpN9iPu`utgD-@rGT_5E3r7Z`GFhDnadD(3U`Dk}Q zq_hGxCiN~=#?@uRP93B@xhYftw{g;~?eHCFzrus~(vLBpnmF3M7;VasopEhyh7CM` zZnqsK=`M3ggn00l|tNofzR2K?rc@+7&_@`+|DhYj?Z5bHAi>sknB=`g0BsYAmj zrq4aA^*sGqqn*(n>Tx6EMgP~kM|&1xPk+CbTyJ_+5mc{>TYqwe^V3~;m?1ytF57!) zGcbZrc^ukhR1s1sIu~d>Rx91Ia{iV(;rzyR;!DP~{nE zs7o%n@KaU3RZC%zHqcxGVyR>(2D;1io;o~kKzm6C>c-taGHOK=IxpwAUaZ%FxdDES z6B>YrWj%Mp9gw%`4K>e3=7G#ts3=y=7V95F!N7R>;Nz}iLpa)3eR!nX7Ksuar{enA zDFHQE1-|1`?imqNq`abmIUL+r{&)qsAp1t`iZKwrY8@-BO?vaQI;)+<;$YwLvd)zR z3!9#igYnW;3?V>_|LwIeO2CPYRgop%S$kP20ZzT5L4dPq&&^S4I_Fe;U*kq}zBI2$ zp5mo=sfSEtY=koh^jpxx66_i+JZ=4+qnd!Jx7jqJ8s1S!9XZiQ@ictL42GcIM1 zU}c_=CQ&g9%FJ5@udo&agp->lVj4iy#wo>Ml-OcR-Bp0>6OF5fc~-}PN^XfOY`I@c zbEp8mURby4p3;ZDkCaa%wW|e76&$a8OLm_T0CR;JLWCEePb~MunAg)kTq&&hv+6fe&8-K9scy_OQ|ET@Vral1~+$s7MmFLIG(hQabc-mw24wSF$-wciDt~& z-#Rtq?3~E>vBN#5BpjHYtqC*__TZ8#+T*%B*8kBjw?x zG~y+1lR_J(cEnVs4%c^j0Hb9crewWMwl$iX9`udW=QCncD{QG6z+uUJ!ouA>f#;8B zIR=8qy_2y@1N2v(Ix)CEihulUO`#aTccHvfWUT#n^$VJWiI34##S1dXOaCF*_wQcC;<94-8PN-~^U{`IXvBr1AC-JD*A^xn z$CKGXzQ90o;_%_TR}!k$=!W0QhMYl9o)1zNZ>h>LE&r6J5Q`J;b<^deNF@3aB(0JV z6sWAJKez*T=%WrgUW$g6c&3@{S@~1U1sBSI)0Dbmx`UcK5Ni)TEnbL5V0Cc#>C^S+ zOxm7N7t~8Mhh|Ou{vL+Jq<{akKbA!3{={9&B47ZNjvBSB;qLR@N(xn@U=FYgQvf-% zj` zdlKi@GK7%0XAo2bbzhx!i}fG~5~9>orv#OP7<{`So8Zy*2i{h6u&0Kpppq8gC#yqB zqzl|BW(ZL1|NC+5>dS|(r+dAs=*3I&d1SvpZFD9i_beZR zhZAm}x_j;$?bliP>uqbk#7=(q&XWU>Pm^N0I?3DedVL<=pJ&BsK6Ogj9jv;70o-Nl z>_XkLj5lQb-Kt~Ua>F-Q&j_}LuPP3BL;Na$BL@rl$9Bv5qgv zcW+KJ;C=S5j0>P||0GClL-V_*D?SE8h< zk-+!GNqsC#ehJUD0;+5^`uT;Tq#oL|M%F*jjY4$in_F*UY@}`^T6Xr59hd&t>T3)C zC^>Q`)oXjb1QE_*h3_2V%gi>1YwNSrJAB`Uwv;nyKHzsbxe?P?PMM6(ydvOTV0C0uwO?(&l%m<)qOvtOFzkky5%U)R#OWRlaF@$+y=m7Z~T(Cb1h*R}3t+7^KuPix#K4Db9~sj91irTd6xM+7z(k3 z|LG4MKe88e$Lq3es2Ks~`Br!la?>8}Qjfy|AYtFC=gW%K&N=kAMyl9;+!>Fz%fnAy zHk?7VUC$mPIU@f!8dh3>SxzP?b-mR8PI-(n;t3#u$E+ zv@^?rQCsa8h}S0|QQsue&0lkdHR)azJbI?2>}*#|@s>9m`pf~YeY~1|QjHFlEI6tE z&{;ga#xR`-J(B~q(n)(5$sF)+Z)wssE2uYI63)=Wv5qST`<9eHvE6(n442 z&mQJ_6@Z00S(#(>Oq^U?hc>qf>>p3WKI>u^-f9ENTjfU1YldOt0^MaEhtt32iheFt zoxYDZg!UFOF;#QBrqKVMmgdt56N2Qe{wT&F?{t9Te(3Wf8?c>$F+z8@gzT2o)W4|_EID>W3n4i_cM%JHy+R!1Auv@N!ldKmcZ)t|a3IyK1 zX1ux;+Z5-*J?kEzC%$6fv6GW!zP|qTx#6qSU3@TFr_J=Wt>S8uKHG^D#p#bo{V78n z5Ux)ra}th}H>BtZ3Y~jW)hOeD(?invuuZ8oFLWJ^cmwy3vZmrk2W4ih*b*&2>60Pl zrRhe}FD~dOaW&BGXXCwaf*^^Q#MZ*Cq)z`Zx}S`CVfp$!$p#Z0wtw_O*X7v#8}EqP zSe08{jm}7-Qa!$=u6^oqfz_5T{4bIBp~i2d0ua`!m-At={-u_f{99;CVU(h!_vXi* zU6##*`|MUYaBT8ClFTWPi%h*VX}v4f=?{iRe3J~qU9zMXMjkqV!Lg?*NuhpUJh{Nb z*4;-BK;KF!y0}xS^`_iJZ+Nh@pUrO(Y41ST8h`11Rut^VMfzlPl8SpaI+H(;_F*>E zf&5DOf|a(I@RwAnr$&Ism0}z(g)f7H0vJ5t2Yr!h$(*V0d5hvWtyXu$YJ520B^{0q z+;U3O0b0wrp0SxXE0RtY_DJu4!&_DC9D}oRfl?7{Ujqo6&fMm>teT=H>)M@07X zy-pNN_)EG}C$E74u)k`_m}3|XGXmPVUnpL#n{ZB&}SA`*7TXF zS|kK^n_ih6zD&}?r3X|~I?fsD0LZ~x$C|Y9 zH8b5j7#av&9dnrY(Z$4wSNYxA(2AKsRzVWk8$^d)*6J^~;meKb`yhSmKzYdU4D)mi zPtRUXp}`&0LZOIeMMMVg*&TU#Vr2a$hb+Je ziG=W%?As^mpPx8=fPX7t~@ zJ81GrR{#tO4Jj$hKAn~j(bgA7-v~>;Z-9`+R^09{w?6U3b01QG1`?=Y?d4@1Sp7lw z1a`4T%OeoiDH1;M8*V5jyD!f&V_l(L1y8I@%jw~mTG4@}DN%e~p@F_T(a?AKQ*_ zs8XVc6%4!tCOp6}H>(^Efli(bqW-^b-SrJRHKpS}^lq>E7V$^$s`sq}(JL96kED9; z6okgVcvNaf4-%>TI$c(Bp6}_)gK~FIzlxz|Gx+zAs7FKZHdbc0z@$!}X?uSm`Dc0e zU-E`45y*0mrND`-9Ea*hf6p1mTG@?~eX*^#ajw$n!)b z8m-2S_;{;JEE~Oa`}mlmGZ8nna*bs|eae}w8Z{KVv^cK)qUQZ~p~K<2FBA;1mHzZ# zf?8LWOT&MA0Wi!2h2za6bXVJBEkl!}0`XY)pP+F{cb4FDO12zS5fXFtZ>k0JvH|`8a;Y_DDLzO!nfrGEg-Kk zRRbsNWRAggcUjkTGHG$kU#@KQqx1Eh;UkJo`X_(JIYh-_??sTPYr9HYIag!%^o@Yl z%}#PpQ|m$?w#LnCa^Bnx4d5!en5Dha=QrCZb=Ko^Y*;~}CWb2O%Iss7>^HNnl?q)p ztp|^wLoI_E&T&X0h@v<>OZuJyR}(4jzj1_KQCBrF*22%xqdbV%D7y7%_y!hA`uPZr z7d8|_wSBIPCs4EezM?(x4O0FU5F5*Qrw>0CgP`!;hK|iqnkC!7Wh~O-6%D^DeXsA0 z-;$KQnM`}g#EsKnT__>uk!I<#@uU|8+x+;v@k&}r+Y=|x3sAM_IPFSwZZyuM0IFk3 zSyNGnX$l$!d5!?DAxfFOYevS4`9x6;4$(9h10b0-3qM`HOa& z`zcltn=iDKBGAkSYPkfLx>MW0lv-2Z#mud_6sH&-gizXo@d`s?9(*BjHO+J5w4exs z^E&AB*_t9m<1|=#!|M?m&CEhSQbK*20`ley0NCf=G#nCC^I@kP7(Mhw$XrY!n||rq z%)G_Sy_w^EgzV7Nef3*X5`Q*3Vj3(%eRE$wA1Zm4i)C7p(6H8OHwAzK8a29qva%pH z-Z`d04T9;!UMmTZ`JR1_cSsq0Vd2p5(ViTXWP>bw`3bnyTFt<}sCt>X)~(4IYzU7W z(bnaq(TGHOZ+#h8QoeSEG0pT}jL8ZkqsXh(rr{wnC_%9rfC7@~)&wF+lZK1oCXIYh z{i`}bA0}=x#7h}_2Abrz$%!1{59GbJI~M;21-eh&ams$0wzytFU-mYG=nT+-|psbZOqo~Ro8Yj5j`!ub~X4eh{h&enPYkni&**Peg(0_0bG6*>qmZ1Pf{U55{JRZt7>I04|5FQeeb>cJ*oyXvvLT$p`@i;j+%xNVEn$za~|Sj%PtJjY%`+- z3+e{MfoaV->$}u>)6xfiq_XT9%Sm~&SqMv=9EdSTkEPS=J65m2sE793AOz3rV+nB- zj;R;A^JFSiJr*r&AZW6Z{(@y?%$&0?&X6>XlHJMRnrS+&#x#;KZ%xPbuKS;oC{odK zXxpqv2_ljy57G4WCmN_*23Jj$$}6UhrJmNj<)YP*^wjlz0(!}w6A3@TEVRAUeylU; zEUYfLF+N#eJoRphxkB{l`gXQe3=QvqK$e5-A2s~T$1S>(&hv5r&WDw!rZKrEn{~pc z@P$s`klu=j!`39fF>D#2A~u74=sc%@6#M`(QWey-^=>i2=+ySd*1JO_+OJXdv`q&+ z*6zRr;^eAQjCYNfPB?x*$`30)Al1%__EIl!c6M=h_t=Xeua|l+Klr+NvCx=$93Fv7 zEH;3S0ft$>v|cA0RwSZ!!;?H%*c_Z+<&YAx3#KT@=;Ekn*5L;$&%gJd#rg+g$Nl_o z4O6gUbaaAQrcdAHCUuol_#8*BWOi*Za{%lJVQ8KE}hRyNS z7@skPes3^}o41_O%&vXp9TdtRxTAl@a9e$ zr9T-PxnKq)yhQ#JL6&%nZ0O=|puBJ;SZ`CLe+1tLpmQ@SH)!=pHIl3lDCjL=?IwWl z9Vm5NzvLXZnqHLO!pkcl-H;%$qng#7pm49Use7 z3al;4u7V4uWrHPbeC|Rok~NB^T)%4yWiYnE;y&5wNl1j*9oYvgDw;u?8%g`QvwP!7 zy#Eyb^fjLS1x(9tf!ClDMwBt?{Jfsx@hflmuF*l^a9k?5Hv$$DhE^=0o6wz8cVY5F z;dho^Bmec81`7|jtK@TM(@Cmf0C`&>i$%>cLaLDi3 z9{bpokz9wDus&GaDoMc7G`LjFbj@1lbFut)<_q}`l&x3q=%DjmH!DStsK7>{auXjJ zJgcyOMyozAP2ovZF86_}{py|P+3itN4M$}ppE9+9zIdKxiJSSEBzGAd&L+J^EXCjq z@VNg5ECH{+={0p!wtWT! zKn$aU&d#*OOgZxW6ncH+t6rZtH({Hlqd)FBep(n%grkWOJE>9ubnVez((Ou8vakJ) zD_#do;)+nO%3A>_Zqmi$ zr{*#GC!Zi<0bB0e`N-pAE9vpHG4S3Z8NWieQ)$eh8hlL{HdIniyDroT?BW2s(w8y) z7XrSi3ACZSo~KwIyVJ7&lS&OB@7@B;;~+S#bkQ)`rGw`300I3#y!h8^;FIZ#qM(G* zc&(+Xo?OVZ)XE^P1R~LahE!ThB+}Ol!C3?vkSRu?P+e z)L;|k&6=Y_>T=p+dY&@Uw5FMH?OCHZ`+7Qi$m-fhIh2R=rA!|V|AO=_81&?&@;wygd4^;A?u3Xx zXg}SaKbzRROul~(dD&<_o1&nqh2O^HkI^&AV8PZlun(!-D6UarW6s=5sd>KpOxP}9dhG4DjF+c(-1@GCIvD*_Bzp5dO|V@o z`kJWr6^Y2mi+dkK@dJuP|DdqVf=?VFnR?LQR5T(o%^RoNItW1@Tr=rcf};MfqGDCW zi4DhF=_5pI%%6o?tRF_9lbGfXj8aeU;>8)Mefog|N<%|GkrRCz7GCK=TBZnBkCm^> zSl5f$-@SThTV&z3s@V1i=#bN`(frf5)y-c$!{1g#fdLU)Qypa^V2~2gLw};C`JjVF z`y~9=l2#GK>c4J=gI0_@korb*?(sD)0RV?AVg@&?!5|f@7;>EjF zvT8ge@W<_$V}I!$NTw7Es6sN$pxOUdAW=fwO$P59a3)RO9(`+?1W4hJk3;;EqH^_r zr1+|b{zy$Ts)K&LHt#z)=NWE@BRK%kJ9&94lxAxmis6Lf-p`640Jc(`3%NYlEpTif zi&};L8y=G3ew|28*falEqtCqZ%_(yy_8>akF#bHq-%H28!}qS+6!_F_pjV<^CZsTL|CRrDnBG31YK|-6p6r?@cu)v z0Mj!_GLfz31v6#2Jb?#)WC)nYp5^<$aus$sy#o!d4tz_~sA}qX72t5%vt~4V_!dF%?z3LBf7aprtzA}^QyfVMS>{5`+;j61@BaVWa zeF1pUB*LwYhTcN$R}b-3wG$zpgG>!wMZy1Mqwx(vI<4fVb-Lyu>+JE6E@2`j{231) z@|q&FF7<}kSfyTZn$i1K5CtrzVdu(B(md@*Aa2p!J>Kf~Vr7T&EB6|&M zi`GNT1<(`Fzbq6R>7XUhCUvoUwZ*!4e076;;S1fEf5EEuc&9U*aH3@p_lRLGeO_0l zWljt4JE#n$b3hy5n(zM;wXcZ6imTZ!wlj6-aS#qysKh!Qu35=OP{q$4ZJ89RjMDo5 zRqLdt2`+#T=#U2RuHsp)JpDJ3<$cBc*34T^dfs^s1}Du=p0;xo_(!y4B6e``$l3Uf z$FkZ@fz~o+`&?lby-Jh<_+OPs3d`4HK_CCE$=h|z_BAv&CYv~-XJgwN4qEt3b;TL- zArJ0Bi5O2mQC=CPpn?DW0@dHsz6N3!ihOX4D*T0yS_zkHr4uc5VyA^ANb=kLA2} zB3o?sc6g>j3+Tcx55%~C*KLE)kilo1^mm@mTrd|xDDtCU;3IFo{3>$sZY=gnw%rOJ z>ojK>_-dkvCTeuM0&ul$qG(U1VnG=!BJGmFyg$iR_0+JuG$~|{Y9SQyI87r}#@NR< z@Lx0aU#r)PA0L0?w9_F0(^*&>UCX_$%-=inMJK=rUE&M>+ z(%s3v;{Y>1*LU^&BePTSc8+F*AUl=~g6_X1v2d{vh2CGVWGegEtAhF_3+v{AHzxPl z&fJz#q6>aY*IZ2{t8WZv6CmaZ$F|OS9drO}yHcMiu9`#xH$OmRpa_+`bym9d4j>v` zX>zExz7tQFZT#lbf%XXP-FwJ%W1@|krg~2}Xe=)6(2iAnIi+4nar+=n8?nU(*_$OtbN>_%-1IyFLt8QS7>3S0 zO&W4cXmtcap!#!Aht=3S6sgW=tBgMMGVLS6Z9@@0pIcn0#A4RU?Oh|ecFc(hJ!)>a z4NMESrxeh$NABq!PulNjn4tQKf=!RRk)&ImSm(L%C{m3eL2E7!4UsOP!G@NN6;2r0 zXlTW?_!i@9%8|r~xswkt;wW^WtBuB+71hzx>aS0E!@Dkuc%6S&c;eW+Ixte&I<(}U zRu41DsAx>C-lJB$rL2(%S-`L(KI18~;>!+UgYWY3*IuU@k%F!=GrO{bCA z&ZbMwC;X{-$}+MoX}_4Fh(A8QnsTpWR|ql32?I#fp7A1gXT$nZ|0-%&+Y#x@UyYre z&*v0@LnF3PCVAh5UL|I<#i8W5{z=>Q7WB)0 zd-&Gw_xC7LW$`&O?0vE+HnG;XUVejasS$N@`A<`jbPu!#6`^W9Mj>aZc8bv1^01>1 zlhIF_l^q?=lUd3YG!=LXv@E{4IPaAMa>c71(6-)M?dLd%n@2&x-)JbjO7v)nltqX# zyfWsuU}lXJdz>D6xzKWCt_TEv>;N>K#_QzK^v?NoA8v{h?Rbv4=2b2iK|G1eb=lx9 z6zQZgN9>s5vk3+7xo2lHL7TVUHQUzHwe%>I$&&8x zzo@-!(-B_KO}7nLGxn$qu3~`}DCez}tukh8Sbr2MCy7f*S0x+z}1=V>=!;0)7 z449e#gwG5|_&F<7Z2m@oqpzU`lxVyvA+OW*S++|lUs@i^nJLP6UY^_ln}=ipv=I-q zo9J8bzZ*TmdUQ*x;Hwr!$tF$|iO!U^qq$+7LA1jW5;7aA6uP9Z;t_LPFcvYMABmWH ztjC%zQ6_|*$)c1|6UFgHmCm8BNGyJuEOfon>A3_y5-&%0BpsffXYaa^B3hO2{~%*M z(*JgEdP$JYE9Pnc#5@Be)FwSw*&nOheXn2VJPuhEMe2vQh;h};YA=}UFBpBbv7vv( zaPT$#-G8K)zUlsdhCxUyAT66z1PDq`KL#d!(v0yL8$t@v``Tr9;^;Vj?FxQ+VyJCf za!Y2XK-ggRt92ey{9mgAxIp%A*iZ(!Uy6NKcpL9l?A;A8#4C$_ui5-O?UJ_dKTm$g zcZ04%w#`nlP%-@cYq|X>j}|^7_&QAup@IL6+K0oYD$ka4^G}ofI_hN%BMd4}(vp$;=G?YRmTVT+((fES~ zO1Ze#G`e2&i1hp&QaswhOc_cdK_bf$KaX?V2#UX)e*H>@7uvSEX3sSA`-kU_b^p$uAwp0A$7W(~XM}tPRX>h;KP`vIDHSk2tj%VA9q{OyR^!cA znyAQoKhy5x6Irzh)~b%vTtmcDvC!H0q{GcK#gD3N!-Mirrs4t1wy@bKbeps6LvZO= z;)dzf=C!8lJ_cj%jY3a*ys)b9}%%uGo0?qX79@JO3C zmJ-Ccfq9QU=rr7e`Mhl>%HRQekRTv4VfuhT{VvS9Q60vR{xdl_uamVK&Hwvwwq`&m zbBouKi5)YKj6$b;t)2k3{!T&MP1WK%lf>=*A?z9j|NCq!@QXU?x17FYq)21%$hG!o ze;#E)W+iP`6yYOctvI)raoD_0g0koLS z|3M|YYL=F_?Rf7^4pakx(k`6(x2b8mM&0SDy#;WPNU?WW>s|xu@K&Zj-=m*UZ`t~= zIP7f65i2kC-}H~sM$ZE`+Rl$#?&@-Y7?vRZ%goGN;hkEKF$6VD5In2v;pKcD(g4B@ zldYw=>i0BRk97TF(+1bP#lm2@bE>cCyIVXnWV(UQf!^;FT6_S5JK%6?~PYimKi)jxARtrwGK+|B++8-Hm@ljfdUg{jHmaC?VEIilX^X82(WHt}d&lPE#D*o@zA8a} ztclW6$E3VrU2gKVkWGk)L;Omx90((D^k|F*xT@BJzf6@DV*6D`)wKHSP-ORk7v%RB&fd$fY6ciL|c+%lfC$>)#B?Z8j1iH`MPb zS_wxfueD^jL|*()=>lG&BWkN)#jD24ndinY5;qa%LlCK`4>T6Bp#_DSbG_Vk_L^5( z)KI_*8gX3vS|^^DuR(RUzhf`(10*i!f@g=8#WFTDnulo3cu6dPkj@ro1x^59)}SGh zz2R*hd($(MLf=?vZ!eA)N5NKB+B^?cKdLlj-?alRFzh>N>8~D(tpJnw0(g0SDuNeH~o2rm{aG;w^x5T%B6v`3d9TiB)-00w*4SP zb37%Uz%idvX2K{%K=%D*M50(`9!`Y7ELl7XJ)E99%LS8uU|<|q_3f`wR{m{QZ$;Mi3b=v+< zHVqwI*3%v+7ud|1MUO*G*h`1b>091%*;`Md_7&1~mK1>_4%K>OkN7h_*`r9* z(B18k7a@EG=W#01*2&}zX6joh-3l}K2j?28yHunN#Dn2eBGZei= z=efQlSv?LGRv)BjUw<7Fxb{&6nqy)q3xAIkK2^~YSMIvBPr@29&C^QW6g==oq{2|}Ar=>#7xxKc z)usqfL*Cz&#faTE&u~yHp8KegGNgzl)FoXWaS?oo#cenx5bC3IJWlGy{R?L^+ilDm z4g?(14#35J5!qF=&FQt5!su(fc~Q1uoStj#p5mA^CiK4N?m$a+HD(?h86HFHbQ21W zbvADr&ZqT$TbvQUm|pqvQ6{YGW*O5RauX$LZM5oTPM^W&TGBnp^}rLx3VsK4U0;7m z%~QGewEhOd&d;4u&|QWvB<&vY0vk@#k^hGU;B&toGS+YAfSzPFNHP?De^Ok?r2`tv z190|x`&ynPu^|kYoR>X)$+leNoV?m)05me`5}Ao``(&~hvVkL(5!Q5z`!FMghq_Az z51Z>*iZaKX@k8?=9{{mpv;*nTyc%=E`7PsEVR%DaMY)6bE!x6-NS#Y6HDEl}dFt() z7W-<&!|3_AmRr*N=SpU>Q)0QR`0ezGOmrU75?53r7o#D3NpZj z6t%n4EIJ3G{a5KtF~b0vM63;mxZz(mk3AFtx6^5K&>dqDk1t+Q_j+4V!Zn_1NO@F*8V@9IhBHkSz?vzkS?U4SsoA}W&Y&u59@ zIt}|fnfu6&jaitc)&W^J5a@55n+4nx}qQYn(8Kgt?)=x{a#e z7hiA6j$0Z%z1@JWr=1YC`g(A~hiCt>W!A*AD70$eS_;UdaIHw=Xj5_Zt0)nsDx;^A z6HAzK>Ae9s=H@5I{d-cftll8Yv+rXVlB#}1jXGGpjxZ0AqH~{_S8b_vOhxhyLE+kk z=MSF?Ni8y9bHesheV$%dYPmnhlpu~td_55dc^zCkxVHo_(8Gf2%z9@UnBG)6z6t2J zx9Q4>ZTE7TKawmzZY<*&ER;1-THGNVZRqbhc`p^KZj+F&S(V{KEI1}_-k&^ zC_3>7<6Zk%8*h-76NR1-L=n?V2sVg(U}Q+;i?U`Py3o**<)I%3+7pE?`j0~m=Hz7I z>5$-fuJznpJddgbHx44FH+`_w1$dYi^fGPS96#nAt7RAIB;mf;O1q&)HIiPd*GJi6%p@W)M=6#lVW@24AsFYaCuj0M2QtFOYr<`mSG0@?7;RSA_vpEkpSKJa!`gJPxR>5H$6iEGtLS{GIS-eo zjXV7IB;00O)vgI^xK#VHf;~+RJ5Lz-c8=DOjn#oPj2T4^@qd{jxnCg%B^}qp^ALeJ zcuKnF7Tr3>pw}EuWo@_MP+85}2W`c{eYcGMNT2o@I6m`yegwGpiR|5 z_Rn|L(u+jZ2mRX3G@;KLSaTi)VFrFX&uYl34{oE3)(I6nSugE}tIO7(J*hf!0~YV; z0d2T0so=QU)ZW@c{SOF@J|<7SWSs5ISP<_`sk!Nn>J%g@aLpw6oJZahV(OpsuOD!& z3|4wMcK-JEmeaqB$e7~v zHP)k;rV+{ic_u36q!GN#Rs`8Kh#&Cs?B6_WQufL4Nt!=Nqll@O?WC9GHh>MunLInm^qVKgplp!cy`JMEAe z;g`o&rW#3InPw@uAX*qY0{yVni&nm%)JBVvpCpvBoUif-QZ3DlJX))Zfz+p}qMh)r zTLA-(Uz2P1#^yTtAirp;+(l=`Cz~p}zioKy{Khs%%hv$rw7oY6lU8|A)JIr{ZcZ4i@}DBhx> zEX|kw z#Y!e4eS_m*5rF@VwXyLcc$-gvYC+)q0dn7)pXVQLyLR2<)qwfJ`it`>nGwFwz`9Yc z4cwOY1@lYylD?WG5X0g+W6;k>j2O(%w4idX7bJSZ#=ukyN4HN^XLRbK`}vn;T2x#; z!Wq}@Y$TnlUSru<^?&H|>pb~>>!v7hU`~pSctnRFzdYkfeC5sKJ*Q{EA&WU=^4(e7 zG|{qwwY5yWUOr8)E%%XlrAIU}cUgV1>3ds{+t%%FT;b5?T$dV~hxlLDHEQU1-~|z( zD!*j3-FOA4=6w#4p z&^|>V8qGyQ!JJQsOMgHfe`am$M3EkEQkz6pRY?U{xwhno&e}KX{!Dv9@ldXrJd*M` z+2h1@zyE5708Oxp8q^e+Aqg6}6O9S2(-11|D6@9Je+wq(?Auws9BzHW@w>EM72&~; zw`c@kY9DY2D$H@LU#=-d#S=`QJz+~_P{D1D)gx9H~u4iqEXbegEvAv)ucAj1&dqI(Fd`1Wk@dVpE z{jVor+Wz}Xfkqd)ItKi!>#4fXSN6cmukZ<_jm0tjlK=N#@MGwmz%(}B!EjhU@@E*) zhyQI5z&SR8j!F!)({uB#CkvlShYwXV`=NhCMMH+;C^Lfz`HyI zzV4~_Z%NFCxTQ7zSfu`PKp?UOz?6XH5 zNk?57Y40_20DW2%ZGHEaH+iaMz#(jids$-MQp};;&sDNhV7K<7#0@NjfI_;u ze&?IheS>Ta*ZVUdv6#C)c0HR>f{>>V@v~s3GyQL>*iEL@&nqzBK#8Z9^=+}VD7!9c z7O?3+nKotV`bmDCa=nvaM%FJ@5;J*ZC7)FiZ^deu|-#Y6nIX1;ry42O}JXM52wFaLD- z%Wxkn#R{isChQac$6b64!5Lk@zJu*u$W&{%+}pG_9hOt0sM-hhudF2T+rd2VctdI5zPUHACQo%bAcKqd_0}wPe^SHR z#oJtAE-g^`8QUC~a;^SCptY}zjX|j&Als(Q1DU_>CTc*>_e%^0gHcU?;fTD{(fy zI));cl#VQH%!5^+fZP==bb7%zWdE2Uvfb@PfxPP@4M5`h?Ac8 zvzCIRl1VbagC4hKco>FW81ydc-9sY?=$FKR*2P@f(j2l?P%-x%K(~ncZ-R4Jf)hZR z-t3bw7*mNRJg_;ku^Jj_1Il1xzia{W*eP3S_Sd^oztCi$QgbE7*l8LGjQXeqxHo1a zQ>1QP6H~|H(4d(k#*HQf!3PwY>v7Ue=Oh@Mh89J-S@R$aYgLOw_6XA3RXjHYFoxN~ zi2HAK(H$Ay*8er#Y#{Soyy`h1Q2|}{71y&yTVq2FR{eSCS183R0Q7Rwh2y`+c}OQ~ z+xsy)J`fi6kTu@9<@*Zhx%Q9y0xJ0cM0ac0p+;N}S|QkoP$GCpmDrH9@TCYb7`pT) zEqB{2GCLZ$?oE{J*}mPnc|E7($qX`3GGi++(tYemc0>z3=s}7%f?kpM!VQplRfS03 zISpFiu3wf2M*`qoQwEFVa+Pe`mTR$QCc;wjjfJ4UM&?gg+qQ9jkfYfJRR@CvSHB1# z+n0w%^g}VtUcwaZGsre|1}{kyhF^AoKaf%+wB=YLTwcoN$XNJ^#W9o~$JJg5yVfy2 zNek>?iGR~C2ioEhfW5;m9 zSY?3iLV(aq)obbSfOV$&#s71nJ$QzwFTAQzjo{b^f&Z zX(6RTLTdNp0ly1nv#PoNy%%%#-!)}5wHdyx8|tgkF?dgK{T7V2eiY3+@0Elsje>jXFI6a25BQAj`l2I z%4)2Vh3h6+jdwf9DJ-IF`JaqrJ7B$nkPCnn_}&W*!9*jdYxn1Hd3UPAh{DBLRCxh@Q+yQc<_ya!hqi1d<715R^JFD zK5n)dq5ansNw;*tQ`DQU2>zz?$%jyx7(iDWy{0G6!gG5Uy@%&&wXyT0;Lme&pF9wJ zRGtI1)khBn*HXQoYWJ(}^Y@tirvMNli6w(ylmg-b%}gY?jo7N|r~$}wG^;Y{AIozy zyOi>OIsr%3XQZ!7g%&7ak+?_wrJ~>#Anw*%Q1KD}oM!Lktp}v~4rmFksX$cl_M7KF z)@6k&3nQkYM+$bH(oBVFlrt`F-XHmD90 zL{n>Ys-$intXEc7AWJhaR@33{a)P!NzPW#rbF!_M*xVr7(bAu{NNADA5=wf>qyr*v zf02gm)t(iLk>rJGpe*R-Azx&Iie2Idrx2<4DJneh5vL>XkppP{%U7hcS4Yq%7^{(z z!#V@jU2Y_R$mWy!XC6{C7DM)Opf!bAhP`$b4Mi9&bpAqZ_zq{({hyb_%%yq&ODV8p zm}Al7j+Y@h4*{qL-gCzm>P>9sXrjJ4Z(W& zDuGQOmBvl817JY{nFJGZ5~c1U!8R4{h9!^%f7fP%zhCl)5Ko;?FpJx*Z7)F~hD@8s z_b-b)M1cl&;|p&`IUdrIK8Uh8d0SM;^*p_TTL&%cfL3jcy|U!QcrpE&E#{Hjz~EE@ z6y7M@_LQ1NPv8^MBzm^vmRQr+`z{P&1uzX35P!KCd^NbH!}Ix7tkFrbHP`CB~P z1gf~vR9%Ifgazay1fd^vNRJN}&*{w+u{fnfGZSdc@bJ5ZgUV?k}?+S1TC z{kkRJe?v7-oioh4vF8E8(0py6AzWoDkh-aC&c3ED^@O9yosT!!C|qGO(jy`diKz`i$jkyZ#>jz860i5jA&~e(pkQ-J z>T*Ye`cv!g6td?U;@k`v7P7doDcZ<)de!e~%yTs`w`A-hVeo4Dm*OA=-(vUR(RSy9 zKj}t*Eo_q7{SN5#SBkra01&%u@broXy-I;eH@ZZJyCzTkf9mBOvtdGKnAv`JKbrZ8 zgxVL>`TX@z?(6!ti17%0EOEhbQa19H%>nCZcrrXA{Sp07R!FTSMU;g?DsrHVL{KNI z@gbnU9fyJUoK&7v`qw3cS0D9VOnH#ai9;inz8^OF@aKC)wE=yM^?$vV(QkUI|BAp- z1`iOo!2%U)2mW>Ztpp;t`?kLZysDFi-y}1nyT2pnTi7n*@&3^jbVnxn5}7uh$NQ?* zYdt8@#Y^k`s3(yT`U-dp^O}VxR2qmrm6^rg3u%`b20_F=H@yd#|Mh!62l+U@xbZY**$I3e z=$34Yn}JfPFWfUTk)_&Pr|*VUPFOa+>+d7*TV^So1|PQOF_z7e=J;#G6OCMmv*QIebVyFWa2ljSK#UGb zUzEN>#>J&tJb3=`xl06c;0ayLNFQR(U&{n~98IZoZy7zDtjYsl8K2AroW9dG69FI{ z;>Lb#LjXOPuTpJkU8gD!q2zJV! z+9$^>85EFYUj^YO4zTa{DNx_E5*9%sqm}Erq!X4ezw0DBjV9&V$ZG z@KtkwYup45t)orp!olDvP5~u3kl%ka!9F*!bc`N-}-}@j{r2|{|b)EvY=0;|26sGP&z!IPF54( zi?{X7TENEmulh@*?+~pF5J?`vT|j z#_3w6cz2Tien5pO;5NH#=y+e-lum+T_haB1tVrJG0UWO)uP+{#o!3><{r z$>zG~h1_8)u`6EoU`Cehmhv4%DOo7sBMoTO5(hf358AtHoQf)??lu2gcFEo35>F7& zyvx(6q(5$?lMkiWpSqVc@WC~TiodX&*Hw+xz#BM7w$6fm!!~&?*T{5VpK=kKX4gJ+Dp>$k0sWQKy*?^B(%+FhLdQ5 zudx7kUg_XKxUpkHCEDf0OEsX&<%r#CMyd)VW`^G~*=p|((}A0N1(6Iwf}8HY;W77B z6T|!7Vg7YRUmhgVxa7glz8wyW?3Khvwvu9Q(HTP#Hjx#uLyXd-MAz7zL!P-5SFOI) zegW510eR>q-g4;5QN_9s)`}fNSf!H_kGwMWVs+G)ssRc4sbNgx_kE!+)wxx}GM1|E z#`Qn@LfAaIOi2Hag?m?$dtIR69x@=O!R(Bw7!rMb%3mG3S;toKo(lw3U2)m2<@}-N zUcoAZmI8;xP(KQ16^WG2=|cMYJbhFM5ko-_8{K$s{x$mqDKmf;3nuCxk2Ifg?(*!? zepEE>8jCpKc_#f343P}}_~u){p}IGFBX7l}={_Rl`kfg;4D$X>&$T|A;;WjlhTubN zXqy)%G>Ea07GU;d0xYDix$q9C-Pt_gcz3;-PhB`6Qn4+TmncJHrAruL8OInZ#^S)A z3yCL-68HvL&?p_fcJ`Dwrdt_*rFP38JIz=`2rwkKueZCnZq8Y3WeOSldB#juXUf^}7!CM4vu`j(9 zUP)Sm!ne*21}|iQ6Z9QrCHiV3>w7Pyq-Q7oh{3aTv9<`4!EeNZjCDW9Dx*5&?hkn;DNoP9t9EFR1VgH zO3swTZf-_#!Klc(WW@m4^x@Juy&=W}fR=H47pKe9M*ADb{$zfKco52aA(-CShW_T= z_W(vTBSjUnSp=VXTk`s@AdfYcZQ-r(;4Tdow{~$V-LC`U(Awf2$AioK*J69Y|M!{h zu^J*X3e963fdG8Jqc!vJh5#x)b0qZiipyy4-gJi!HH}+4*{}uvN=1NL-BVq(m4(GI z<#x+Ft)N0X2ojuK9=yy|jt^FPHqTdpgb0nDLLPt!EbE>`GCk5u#!pd|g$V7QSH(k$ z@K=xT;+qgnjqD;j@43m2p3>0;L3DLi=E-U_8Hylw)qNn7=$~&@+gTQ`+bFEs$)f6z zzNTo}6QAt+0E<|ELUYPD)&;V63x`G6d_k6ODFe*h*he>-oZ6FrAu_;#R0LUP!8^+Km6%V47`^3W9{; z|F8ffibNVW&CBUZAU$hp3C^c&N9Q@QPKTMP=_1-84>#8V|3*qM+LB7W_U4(!anNs0 zhvg;oil=4!ls1J~dh>}6B*EVQ(RIcMGOx9gfq{N4F+4xoVeZ)-Y9693NujZd1%&Tk zV=PXD{Gu?5H0Dm)qM$bjet*bMSZkK)rfmQSl0VSL{oL2+V!l|yn#J!bHyralJ$*cWv?4>&+FQZ8D>lJ@)*oVR|N88`t z0JAGQD$6etpt_IwS8lbyW4igpkN)@JG7E9ci}&DQcfLC#S$RvfNsCl9Ot|xu?VjTG ztN;;a_TV0BaIXk_)q4q|4T%;chsKyY5P;WwAI|ea+QPFkCrt2W5^DjZ1o}7icsfDX zW=DNoDP=?xAc*(j9KM9Y+H*tg{nEhu^%}M8)Qr-8|v)8Z-bo|Q82f>S`2B8<`}^e zs6q=B+alf0O^u-8X7?mxOyQ3WpcV;r5SdgP_d_vo9zVEucK1}hg-D=ivIhj^+R&;h zm~lrFrq_cc<@NR(OAR`1&csUPrATSTfLHYzcNWx8%cqb)tw(>!nh|B(u;0(RZ?p+% zXF8f4Jia&=QUUZOgFPijU#iudVzpC2D@=@JN%q7CE4e7hhhgd0UfzyF1||AjZ8|WMp~X@Zp-c z&YKqAmCDP4D(k(k!EFbh$FQMdTG}^tKMf3ar&cRI&-(*8^4y~I^nLW3F}dU-COtR8 z6qpIXz{|kkCgx>hsTd1E+6Hr-wsUbGy^5p4v z^-KKA+d+|16er~)|pG?wU5GN*~xhSv7hrX z)(R)rW`iK8($3Qn+U9NB>7ckQ6x94dKdQ%?LG{5Y%!4fh@;c7n`nt|N>636(RN|Un zvDyRt?8WlWET08I0*w51o^V33F}b#{H>9JlKNKw9Ur-XmXV4SUSjj;>0Rj7;Z_-I5 zC=x>a00F{{s%E3V_l;aQixw$k24qRRV)`{E>yvp)*;NKynBrAY^eZHTu|mu%hBwB` zQb}`0gEf=Lf?_X?5ae={t~s8LUCXUF+Cem5sph#(U>4gMd)zzgErwhD zqe1Qcuxs*}JbwfK+fs^l%Tnz93q&ZIvTRp8eOM@_U@1y>k(ln7XFq9B(?F@2wm4+c!DZied@5Zq6 z<_P7pPO104t<_p*Q^YNf*Zs3ZOIHdZBUfqul1aOytqKL#5a`QR7Q77`?~<(WC&OlH zozJu~op_WHa^2r?0GE?CP;L`ZX(Xwz3Z?F?bT&mjzbOcd71!G9p5 z>r;Nbcn$wb^Yb5W^WWs4h41q3<|cSGe(ifSkm4ozP>ZwxI4*Zwoc?6XXM`@iSyv^% zmy&X#KmDxY#IX6(R;8dwPy?7ZPj2&s>+)##gkafD8}d>x6et#3qnns!*e5F({DcF; zc1s46Fdu@hO%vlL*wQh;TT8$}Vqk`<6wEEuz)))FXgUQ?xb_d4tc1!KB#QOIb9*<3 zy2nD++4?NTY*F*L)z1xo`xZ*t_PJ=N9Ms9(3(qq6!@Z{@P(-3ZK5_@+bZiT0wRt2Ic8X zV@7yikyfYAk3Q&=zVRV6-IBi*{zjw~F++fH^p+^rgW}dcI*MbQ#wA6b%0q<-X^MSV zJDOW-vbB4Oy4?RC*1j?M`Adnw19wgceeuy!hm!SAPq`N zBcLK6ih$A$(hZ9GZM>iRect!~_hYVW&f06Oz0W!O?7eyq++5Gl;ZuU2)iY5PTYYXz zfNY8QjJE~D3^Dr*?4@5(xZLBKv_gEu*H^&L`iQ1_-fHuCOS6o}d!tOkHS~ZUpOS~d zlN4=Io{XbptRfeBj%c7^SEni(@|F9=ohGgG(i64oOZHp+>J9k@xIP4nl#iqr{&PPx z?70}gDJZ2#ingoQKyJ;|9AmVTbHNZ2Ap{X$VTE@h3-j$4Ejgv`FBT1765q>(2QX{F zPWxyS76w{|OClg&cftYh!9B-Fc)A7;R`?h~amAcDn}i4RXgvXq-tpdpab4A&krLv& z`5cjn%Zf;!1bvM6FLG;hO5C0zQWX8k7(q<4x36trulWg)EH-t+DOR~gRWVB6(l_ER zeW3{f&U}7Joi_^~8 zw8~Dm_?8Z>x$H-1>t&M3G zd9%oMdU)q18CEgpE0(*qJyS>C=cy1PlJaY&iR&%>;aoV^uQ5qZj{icg^YvJ{yEDl# zK24&>!zFNKyu7xx#0SQ3M;?i|E-xX0kA|_-O1z#ot;|U!BS z*!Qug$oj&7d5_vCD3jFP^xeZGJk+yVJ$6KoFMoWIu_*aX>3Hi;yr}!Pk<31feTSlo zbhy1BL(Dy%v23W?s=ldd1;UiT`rk?9Hbpoyoxi<$he*YKX#_E$!EH4nm~;9ANFKRS z#YKW+z6h3Z{864M#RldZT;UL2nR&(jjR{V2@5yn&`$9B8%i7m_Yr;j!}bj!<^hz;jkXHn$f05WZk#c z4{V2W6e8`42vAyQ1}A=HmYMi%f|~IHdp792wBi`xb7Aa_X(otk-}ub4b+pPq3S2aw z`ntw4_J0$_tc|bG3%Zmx$sTZ`c(C~gH9Ml@wH{4op?p6ON~CwN`8zc(+~jVP9sFu? zs1z+&hvN1q%~PRYm$|WBH=CA@LKJf0xol|6v(+iX!cb_Or(s;IT6KGr8=Sy%^S@wX zl)!~nqgY`y>@|A3mxj-!H6xb)|NF&k;Qx%{e|0F2RL=Lde@23Oz!Y##^50>|BS{GM zwL^jqoPN!UqcKdjaF&wKj)xkjqg2BWWhudLgAgZ< zKT2y!U?1~!MQ}m3{GJ`l$$RPNEXNNj-1|R@IO$(@PdmDv3xD=LB`KFEdxW(qmgY^{ z7q?{BoDk@arqj|DgxeG4xABc_)9r_D3?fWu41(2IBaHj_p0J|V);yJiZgkmM3MsCd zY8tW+EtJ~6%*u0b`5{pd?j)#U$N!SA$PQBF!dCB2OVO&q#^Kw!ls6(HnP$kg8Pp$k zRZ}WxBj|GH`cia<$nDj%&N?SAG)$ep@NLJ$+VqnTHKsy~$(?oS{O!=kh95LnZjme( zy#r0Fp6Z=Ozw=MrSeS`WdG8GUXt`&tLBcqoUG$$UX{4L_VE4*17mm54_AJs9FZbcA z1>tX!XCOqUHnWA1OxtRXQm2G`4;OS60wEL))qUidrzmj=c&NM>JqixGz7=akBoP`W zLtBLC7+=qYUjQG5d}=a_W~Uq*fWaPJY~S> zQ*#t4B9LCQ>tDe?JVYcI=tjpFH~&g9UaE>V1+?x~(6zF@^5tN8xP>G&!zi{akl8&AJORZ6cG)9u+y(F7OP`#M1UCvy|Y5y&!zF_P?J0{PBZ8g8^w7iZ(j#ic=8l(5}l z=i;6FGws^vaauELawT&0eDek&ALohqsxy;q1KB4F7l@EetL%gZyDXxFd4MM4263Z1#Xsb zJrO44oEp|jF?`%*yrPIa=`dXB`oLCX&dKuWKM-0p#&&PS&CTzvy<<`&vXPL%W4?LK zJr5p0h9HjA)zi=zf{ei7P=Bx)$e%|8%6_Wak`d-gp^P;vhgSFzfeTv^>aWD z*RE{j!;|EBI?2Y&OpZO2lu2sXDa!@a1C}6M%=gy-)}E)qRAkPJa~VMejBqz^rk(OZmJSJ(H8r&NZbG%=>rm(qz;+Cu22Q z)-=sxyEglk^@G7Hcx#T@wJmLE^c8zJMc}LM_?|yfRh8a8=DyW+oNXpCuhaC6`(kq| zVh>XluN1Da4i?5K7(BF8`U~J_zg&M^M8HV{A#eC8JmaAKa|jW<;j#P zr^dCLV*QzrDv%1}CCo;SBV$1!We4)6u7r-7gtVlH+N6fPW|OH})oA=t|A<|4_t7T~ zFd$Xb@ENt)Wb^tB>4yRZ4DOeJkVz z<`{OKkFpScyu8fP;H01BO&{d+G74F_t0&8B7X-6&%647w`U3br{ueW7-($dLG-v8P zPZu1GDdQiMPVY<#n)(Xx>U_mqkJYk7)ws&x6>^byUcG4<{^Gbxw_f^o!}A9V*?O<* zF@tRELA~RR{I8Art66D(j^oHAU+#v>U+NUMkJ0)lTc)AwFqvU&L!+%K`SO<#ZO5Sa zdLs0H;o8!KE}5>Ql5)ec3~a|&$Mj9n7)A{>2f}eWaD1R1T7!eUIyA5K8@Yz-FAm{bh-@mhzN8Y4R zOlM5cg5e|VWJOkb)rZKxroR2cLxm@Dsqhg#B9hr&Pw0$)pyrT(QgF-|-hp;c}R?rN4_z583twEE^d>j z`#U5w#(i~!2|<9PwHyG)^-=#%Cvz7E+)H$r5JGX#$H$}e4br?;mfU0ddNq)FoYsFw z21;17oVhNlNZtM)%B(cP5pKn>1j2o7cEv^$a0t{+?e}M`mlQDxgeX^{=6BR>K;&mO z)q8Nn*L07&kW3;gdJwJ9|-5$dg3!nR^ zf}lvZJ|7jBE>8nKGomr8=MyB_NmjQw9m0^awxw)68XX;%UNm|h0tGZ5`=o;lH0^A5Hdd$ zEph+0zga^G92NEI85)Lh1g>Nk%E)?|1n6X-VM{F>`%ipB|FnK?uZ5h@$&6`DGK? zV-sNYs=yIDZxk}-giwu=Svf=pu&`C}y zQWT_=4D+wt3EFK8#acK%Bu#vIL5BlNaGmHW13pTCQDLcRR&Q^giFZ?>?X-O^_4JlT z*uu!+55}FR%LYWrq&Pfh4n-4|nLx^Wg>Z$TpRq|tF<5S&W-r$Z?8`S7s|Au39fB~= zLZA?$E4nkVLr@+JABBG*rtT+KvZ5WwKptqh0X@JdtPEqpu8rWvA$T|GkV+EdPq`UD zo>CkImcW6lCR=*hk25FA10jJ#!>W}kdE=X+Qa?5q-p0q_u`PDNLBZOOhAaPGvC19G1q>U-bBI@kLVO0VvCN=Sf1YO57$r~2haKnR8KjM`ra?Pcbo6K&>F z0FwT|$6HKqiC06S91DvC! zS^Lf=*IVvatQUY?Jq8Qxw)$3+9u|7Y^lrirC@zko1h6au{KrQ*KY)LR57p0*mTYkV z_8`TmS}3k9$^g4q@Jszq`R$CX59RO?gn@Mk6oZGe&7b0th@Q^)Dftp|F)0SZ0i74N zYu&E(hWdqTO0PzJu~rLj;)o<-OTPBEpacR^fuhm<6mseN()2jF>*b#&DO9cNeE8c; z=oJO4^F=C7@Gjm~7r^5$J&ZR%j_$SiKS}r)SnDV*QUK>v5o=7-N5&ZGegTUwKnk9g zjdj3=5v(s@?I$-Cub2W?U=$eIM z^{lYmt#yN}PoWD9rQd-N^*|G;@n%tEoR2v2JtL2AssVCbSCrZYzetPKLBMCoGQ3M?&RH?H-xe-pU|fA_V4^Ff8o z$u(C%-F7Xm6mGD6x%bRwnOt>h+{0PUeJgExumnEutbN{e`#K5AHR4gS;+Z2xE1A2r z#%&L1flv7>AZZidBUU96U0Ati8}NOc75Jckb1}tWM0i z?QzQ^saM2vAjAiCfgMp|Cp@3AOu=W^$5c3>yLvn3B%v$EB5KJl&EKx8n}`QRV|02=fa7AgAJk_x>#>h27ItWF!>*5%kaJ8cznYMRXAS@J3A*en(HwcN%e zt_SM#%Q(guPs0*fpr>A zwq6KUoVFCVo>*Fb;EKdGzVGfcM-5*tl=xz}GLqtd@%cHEh}--r&;glFu!LUM0KH|V9vI%EyY5YC5s66|dQ>-ciWx*zm1*b)W1@Hml z(s>lB#wq7w-Iz?8}7csAJs5|?sJT6O(@Ze)d30&TwempdP>wJ#mx= zD94Mek8l;labI&!RrKI)$L z8sph7{-Yzvs{7BZ_H1y}{WlhXsc=N|r;tt+n;hEJ!b_TDBtWbbx-&!lJn5EdMe$KD z`H4~7E+GT2^`uPvG|j65J|*eze7tfQm7x)@mki>(S~qQr%Ak@+Wbc3a-d3#ArW8#m zp8jo7@ch`rja46MxArAygoRH{K)dj(=gzeH<{%y}m3nOAv*(BX?AY}MX`B=xD1_}N z)tqup)oreEOD&H8tC-Z;1*a$GlSB|t^}ZH@^XI|$Dc!u8ud4}Y<>rU4I1^5@z<_nZ zwN=KXUs$A|3T`6j%>>Locb!$nK2KO0ug*;IQh;Smn8k%3)f(6v(YC%OI-hmEWjw}Z$>$;G%qx{{Axza7V=Zc_szQf0&QiPVMRk84tn zAOC^0W=+Blz1T@L#%%T@kwB(p?WR^PX4XOcj5~OVC2@DR7x-%KLFqRzFvWH6QT22* zkUptBfY8|u7CyBnUkwLoJq&LhRQ3iVL#cu zb%3cT0qE#c6K;D0@VUc_Cl?0>0|xvbIgx2+ssL;M2J6xy8zPc;ONctaw9UKOcaZs< zKywTnk2EZ?FW9l^M|tg9Uh%%v;)_h2G#bXUaojo9QQ1JZao}@-IltL{P9L+K^kzGB zkrdi^8Cd;i@`qoccWZ_DN@x?PtNR;Z3oN2x5BoDC7r3 zPjjHghFI1qCmw@qt9=sZHI#tAl;=j!vh@)w8t45G2BLM#UQY(?^>2j2yu@DKZZ#36 zJIWDRugQlek@At)N{&pZ&_DQd|0RbIO2O{ScsPDK_2JR*oyO^8WC#n$01%MiD_1IM zh`*ZeZGtjaMlMt9RQsoKe%~zcWuE;@Cg6GR;_RHI-Jfehik|wGDoE>~vzUH6y6>BX zzAmln5W%%=?X!Wi^*-8y;k0DKv}s*r7^wW(@Iumymx90QXI8#ft&w1;9&%dt>+`NvM6H)fs&7?ru}u>>9w*qY~(dc;b0ClpKBSQtXquL43S=py9S7 zXtgv5@JQrAq~F{EkQwoq@yKyL5%Ek*SMbd7fF^6|RFO%9Hx4AY-;WiPF5m$>3l0zO zLr)~g)QJCf=+at7d$1sh3YEwj43|IfY>I=-?{tQ)n>@*7dJfJTntE4+x7}%+QidRo zf=i2cO6EJ?tXSzY8Z~tGck-L{UGLY$hSfje5WXZ)lIwg^y?CZ!G)ou5mfg?>Vq*_} zjueuO(q;88`sP!JW$9pSXxWF1D44WhXFHvdvo4u!X|FP~eq^r}LM?+HH*7TCDq+K% zLP$IPuLlY}l9QVB(m-+y*bD-&;>%m=PmOtoUr0~eG@DOI;CyKA?4Il{v!X)HWKUcy z>h8=)vubDzCU|HdOTMPEG(|y|)H&4Ac+PsUbKy6ZRVQd-} z58M}bb*tXRLek$fv!2-_BK2-H69HB>wI`Y1&z=-x=Y?pMa_4(^umlfa8kssG!(y>f zNlBv$$dg8J%%)oB<8i?M{zy)SY0n-OLcbOfaw7+}mP_LC<1#7d4HP&azT)!*~L1KmsHm{42;45L3opq=@M z?~mIgT(bO?k%K`svTXVWw<+ZUceuZ}uVxUAHKAd$mDM+q*f1tU4?|Oz;fnn=0(Mm@ zvbFy-0$1M;z2eLfb4R5RLV!YthQZ3pGe<(&tBl$6{PO8p3Wp-09U!)IlD@utm+Iv8 z`yRSdUdd+)KY%lo6AeQ@LCXw3rreQ@6b82Z)=)DIyO1$tqpKi;(hTKyK&#qa1=q?- zP67hf|AvC248Mq{Ve*|x4p-)lphqV_4BK{t2oc0$8b$f584AC^*nx7E%gU>*buf@S zw^-4%V0Fb<81tq_*;@fPcOcTlFP(Chqz1fo&w z4od&Q9xjtKCn@J5Db*^MGAAy-2ea!erqw61&k8rph3f;S?YxB2`@6(Dl47@f(tcuq zrAk;^Ug8DbKd%}1093{^&)XG=Z)v>T3!%G$oo8Sc&%~0VI%BmfWXuVHTfhc};9Xjq zs=Io-=_rKU3fsjz^4eLQIOs>?6>#U|*!e^dXTP&R%6qcbeYFd}@E(F#F+HCfXM5iCI{Ox91IM^$0I&YcdItN58zAYBk4z3GE z!LQb~#Xz&W;S|e$zL)O22hMe>@8eC@VL#`>oniv`bF1S9b+H8PK|8al>q_(KOc8Ai zS5kTaC>+Mv=zRajXVwAoKzr5evHb{Q5(akhWy9edK39!JyVd@OSOU3V{*IvI;<1NK zRemy~d~VQvV-+NSsrVDiD*6}erj%8WVrAZ&s3JpTa^cs3cGC+Su*#kM@mav0>r}M7 zOrjSGRbOW0XzTLh?BI(Ld?^Hu?KHYgX+VtX97LmbMZaFW7e+ydGq<^d<8K(1sD@#~ zvYr8-a8Pk3kv<7PQvF9InSC#h9A~+UlobWvnG3MpZGiPX0?aQjV5G7Ak>z&5m=!@R zMc7)vqTa5p5oW*dL{ZtmQXsVK&1r)TGqbSo;8)3NSTJ!GQnpdU8Jn8I$Nu7gt{>lFuceB)=Vm_*SNjuy@euzNQmf(eROS6j#%0*`JgPDkTB?NLX z2NVmIRvhY(UigKlQ#^Q-@z0u?>b~R>DW>B&0E7?-ue!6B)gmhBM@Kv--j(VauyPXM zO^h3?Pkz$mJlQ1-xdDtO!R3%f8^ARO2KtyH>s!2LXcd$3d7=PjkyG!+f|UO@#GA%4c`3cZb11$xx5COi?$2?MZg#zi7`B)wG(pTmvphm`y| z^7iDOPLpjB)$e6y6`*jYRL`q3A3WkZ{RhhV!Pv=>xf5Kv>hgl;~ei`H2I3kfU92!dG$keSgk~ z4toz#?lqht8-LgW4$)WhTSFIN8D{n%e1gk3N&Y=EOEPek@ zW!(xiVIt|Dv#v07qAF9D_Fno0RZs z4bG_LRA|)#6)ovEYIr=Ii0*7F-0!&~8LQz>zuJ3FUc*{l%Lt)LNVuN%@>?VjT%toD z9l>%4ZS=%IK?AwbW90yCe?2r_aWqLj6;sp0$N6xJE^KuG+{2sSE{*tm$&C3L0k4-T zg1AmMhGh|(@BL1BF3u*afdK_%3Ra7S`IA7w$2PA@yf^(S?@0oKE@PAD-M*gPpH>%! zY_-e?*W3%dxmkbF0M3o0r`6&?IcoDPH@@3n3jD`oX6ta#Yu5YS_3YuUESHMlb6^mT z`OkyQDW1~ru#j2VEz{h zCOEBsR=#&F~bg?)E)*{@}`yJcA&=p4@0(4fw z7iJ`yWcEV+m>k%@XT8o|Z>jjZ^|Cd}?B#hkk<7=r|GjC?| z)G*eFiD>ANPu1Wuc>hU>S) zS=`-U0=FSBDUq23!DKzbJOHx95&+RsYmYm7Ud+Q$17pUukEa z{gRq%g#XLF}!K;*#U@J2x$iAiI4mm#kE9}*(fA@w=HnB2o2 zzFr42XdD##$p00*RK zp?oRyIroUuxgHwl?G9(j}wW_fGtx1Z+RrSbUZ?3u>Ycrk#ak*bEM3vTZ5 z;X{GM;brN+e-S++@jD)&f?-VpFQ=m|#oo~BBQB@1386ZjqPb{`@VYG@ntXb}IY;;R zZ^b_NyGHPkC<%yTj$G<}&e0bu(aQW11So|Ys7~joi-2U|GB}Ak6!Q8(=g9SFrg(Xs!nlEPxCBrF?ju99ELKX834uto|9eS$eo2gmJpirRz-HGSXomlvzn#B2%<=!W zV!Sv=l_|)yLnK0=SGP&;-~lKp8e=Wn9XX#1gz$eZ-2EB){vz@3-dLN3vxo8%rxLO4 zYsWq5_XkMiPX|Z7`>{#Vi!QgYW`t3H{7Dvp6qlH8^D~m9S6&`w&uF=pLYNuyyo%yt zB{M>pQ+aurBf~_0N9wd|O;BcUf+m_y8%87xzoJG0W^==(gwokQZT8!l^i_a+_WbFgYuE~hA zj>4Dv`MG#f1TiTOZoGb^t-f})F=IgMySh?t7^xTT(vhA70kLMI&reFjZ)HF0?sQ6~ zNdmh%BP@H|VcQPD^z`)7kmYdJ#9e6Nrrf*;LA!O8bE2bHjbWmGmF3n=Zq>_c>&nCtnz4 z6+5p*%wANdPV}xA<6v?uY>RU1nsPgOF1tQvFv{%$lRAgpD|jgEFGvsL z%OUG`(5`onuEZQ~U)#mS0BQY6>+tv3^s84lvcO65r0*uy?c?t`WPs95b(b~;%N*C@ zKwK#GQ@$Q!!O~wR3f%^hm%$4L*J?DJKjJwTz_r14IN@_QPK)mpyDehq7G0#PSE_1Sd&ozm0={}%s8I1Z;BRyQc2Dmh=* zcWPu!uQk>8$Mt&Fg&Sz zJ4+QgSxK&bTbz=wRv!5+&wKs-=F{}uxCbyLT#V%JnM!iU-(JHaI~ngtfx~mVKGpG_ zR)2$;X%pn7wdj+8k5w$$8dsNN8X1H*+ z`=`qXiHx5He?JC(FgoFd``vI8?EK1h0`%(1f~Z6as$?y65P1K|(gj57zTvOt!P|rT zuwjO<#d&rLo&XxD6WF7)-8LRiZbk}PgKKNg+7P~<^ZX69F50$7z_SHJ2nT&dP(3Yip4;uk;JZX)a?Wwi z?%r5BoyyD{3h5FmvVP+$OstmD;r#H^&9#_BF)6+tjxn-FPsPQKFR}iv{nGm9>Z6>4 z?lm86b!1SfW)vjME&GY1(AuwxBqW5+LzqJ0&6wf8c zG2>*it=@Xxz1TiX;8Uc*{xJfQN3v=)20x`M@k#q`8l2do**xdbLXKOdY=;n&a(!ev zEoz=sa(AbBr(7hbBOs3`Gh_+QkMDt)Vc2t=(=T@@^Ql-KJPWw^c56o}f;BLocduge zh0ajJkW`(xR~fOvjjYq+_(#bE+u9&9?G3mzL}FXkPIr#ir#7rVAunkTIAUef?0S4g7&KNyn8mI9tVHeHWt}o&D(J zGYVAa(je2#XKJ74Pqvr9V@}PPCz5RKa?QBWVYm7Ll_%O_^wQ(8Rk}7X=v5H_#{?Zo zfc@)mh+lr@y8d>X%c;8|M`Sy%CC31s7cMv8BEO*GW(%d~P`gLKr)b|~;Cv;eEQMc= zJ2CZYUNJ+-u7&-!Sdl9`e{B*}sL(@MLEx!-I^h(gCzTxViC6@f8YLajCb)UaF6>(N9UBaxUau~!&rw3GEE(8G=e94E%*}gt!+6aPuK@eOa$ltV=htzN zYOv8)w@ua+OVwvKA5M``C10K=Z=LE-8jwDJ%K2wI_wB(qYt!z}(j-3lH@Kv^f&b-$ z{(8Ua@!7S#$G%S{E*mlWIkJHxFry=0ze(M6sk zXG%_@2V1|m^{~+YHv=+q-G0os1+0C3b6t{oW6GTgk1+Qi>1tl`cOQVIXAm%3)cO)dZ`X$tU7IC#h@MPZl#Af4z9b zS;ddWI1%Y8zIakj*))0@wtMrqcDVKTl^KVzFMQN3zyjAi2kBmLu!=N89&{P@M(>&q z5HFOs>A5D95h5b5wj+o7r(}q+VIu)O&QiR$=%>~-+bLMa8ZIw_?B4M-2T_$U8WZG`9ba@gMP42#{4v=b#t?EVN`(o#Q+r(dvVneE`=A@gr&g{G zLKCM;#Pi`rE7~x-9mkzAvi>ax2C^?gs(Trw{57IndGM2ig%Ievzk_1KlTP@=Z<3in z5AK83nem7OG^|x2GO0Q{{O$V+h&_#~jZ=ZRjnWjgGrhS9R)8?4-%p@CuuDaLLyS0N zP?oD9BRyKP!$mcUB6c-BR*Lb=!dUKcYB}D$Q~)O+dLlNZ0ZP2WRYqGj-hzmmXdC-k zlzp)G@>~PR*HHPmE#j1h1qZ?els%OE6HJ3ChVl|Q{4Tz&1IOLMC6IBpp{iaD!nLN zGEl(pD*bn9!Hd=Cg$`z$Tg@b#5tX6fVTuUfDw-lKZqyXEj{)v;d;$%+Xo`0HKZ#1y40gL~B4eL_8Z#HNu?Wb^nsB|8C5{N3oC`wp_R zB;~!5FRnWb`s%vhPda2aAj8c*w9mhO)yUwjU3t>`u4U=;o4!*AHCH(g3O*5WfRr37 z&GT<*+5n$8;bLTS=c@iNpn`A41wk!#-xkm=?Dt!{NsT`*(e&FJ0vMdN0(;g z-BEMdSNWE0+(uXhLD zw4e%t=u`RF3O9+JYs3rzLCnuv4#Yz-CH$Z{OcH!Rl}|3e9U6V0gDhQc6*Nc+4g9w+ z%KEAs+4fezn33}S9fBAaZ+)x#5y5^gyv0Es+cTT$Nl{Vx?7?*$^Hnrmno7`xZQJbg zr*Rt*d6G`Df$H49>t@{{rk2aiPlM|02M>5dqzdklW+@+T#{wydgx_^2_EtNg_wR%H}6U{yh4`jGeh6_$* z5~_qaRYApEK>Gsz$8M|~U5K5(Px2=r+A)vcYlYTY4M%2}76DO$rz7wu&6l8dYlMI> zWBN^Ga+kJz4fabg zJFzVA^&mz`$c|b3<6gk8a}A`hQ#Qo8CU;e9zYJ)ZnxK{ekxP=d;8HyUiydb0n?Qc( z))?4Z6RT|CvIEitISqr%}nw1_&vVY(UD5B(hG%nHrumMt8U<_yop&<~z zbWmd!`zM>PfkhlzNXe={-62y)9RnpO*S05{OY)Azo`k63$myFpmO40bnUe7vo3^1C zy5z8xy0glIqg>W*zMikj^+w-@2^fUKo(W*R_T(F0lEb_z2S zP!+&2WsfQ5{9dDD?;(3yOQVoe!ixhA+|{nkIA%HYzYS)(529f@5xvv}@C8ynV`myW z*BiK8=La+gxI6-e%j2nGiLx9quEv3h_MmW%q4(^n$7g<)k{BJw%w?&7Tnl#noJB)a zjaSKK742q6Rkp8+R^P=3yieqN#4Bar)nW6ucqT&$7#2j$LI=y<%U8MZrjwANvf`234c2v`i|&Sd{MG$j=MflDT;+CWlH!* z;Y2JtNJCC1lZUd{Hp<}8!D_ek}l+S7CD%}d@PSF>})Q)U|_gDxoMga z#whQ`;`)rA4#hP%F+4_YOI-@zlq=sn%JW~1Th3(n&vSo;y^tAMxx6Zn9A@})JBUl} zxoP4+0aKspDkYNQ)<}r|?vBwrhQ@SgH^p~juYLnbadio|>wF<3M@c1vC2DSuiTcM>lNcYY z$t6*gTD>ZH_Gia?(a(kODwuY^QD1rrG)spoUe&S33SOD6Qy`9>sD`#0#Q^ z;UzAUks6SZB07qZv`stOZXbj@pdZMBcB29ooGtA9E;;#qEG0^=l(&MLL?O2}iw9#w zaBpQ9l*6N)59=1^8Yu!hW^bV}%3a^2bTWWnz@fF^e#vnrL~F@WzDOAky`mei96@g; z5B|~1Rr6Ku&V&}fC+05hUGEq@gKG+o;U*tY-3KG%ealy*yew2J8lqpD_brE=MzWlWWhhp20~vYG z?0J57t<<-d<~;T(=QxrF$>mj^+l!Zhmq~4);C|`z6aM3`!#j-&pYE?VDu7P%sz}Y= z{V=TZkOLm9Y{;rN`YWq5^P5Hw#>~Zv#36qT#DRHWMZ3i0W*(fYX!Pd}Ygg0>;`!9e zcyMOO-JrtDImelIzUZ5+J5!VL4GxA0v5_Qq@!ZOgE0yi`phlS{02cY*%PJ2H{{U~n z`S+K=vC*T_M9U)LMaAUHyF#1RJHSi(nOH-B5&?jkqf$J zp15FfR?iS90#p%MOR)9}VCG!Zuv$%&a7pA`xg&=^k1=`9De#Y)mssWPk-qlmg-MJ+jk!u8yKy85y8Wefmo05O{!veqCzA41fBM-RzKYllyOUud6ryfb~ zXMT%N;>pNP7LP(j>xeS&8fSMgt4OZ<&S_)97bHjShmhkCQP-HX z!abWg#aGy#FZ4Tg&P6s*PP5|8Np%T484SWWGhmQR`xX5t_}JoR9+#8`e;BxEej7QT zon4ao!H@G@R@S+ZosJnBW@m?wq61CTM0^;OmIR|`Elwd-kqGupISGoOVB883c|+iU z=n0iqx{pM($!p>e%$GBEC;7|o{U|9V$r=@eDPy^}jL9$F@;YjkkDM^gN($&@ew!U) zS+QSAA}>-aD5H#>m(L9gBh1h81Yhx#{Fflh5Syypz-QD znKqg0v6NE=q(jX28*Rh!mzsMuB%`$Ggy0u8-yCDx_IbZKDt&SIq!N~hhD&Ru4HrAgAVgQ{`8tn8^eoe zwk`Ox;UkxpR6lmZ`w(+oyVyOHKhiPfM<_I6Vcu(UENkCxrsSTsc*HTN6`?ps>`tuW z3s0v-T*`y@z21mbnqIi6=TpG#d%J}Bop`9?HWSB_&qO70qSwnQv9c9AYbugv%@=!i znSKyYX zmiE*-wNa3Xm~Byzm_ZuNrVf$_e>Ka`F?E``$wgYL>_)qLZAAXAH9~#N@b)~Yw-CRM z=-HL;*`JT>`&DpX>IiH?zyWlb7Mo8TgtImHKG~`vUHd)SleVaOC~&0r3sVp-*AEm* zDyi1U+i6uNq@dAJp}2~j_sQ*&eEpDUDijh12}FmATJ$B=RKQ&i5*)gspvJK@Aa~Ig zG2TqJD>ZcL9#1TO~a#ELTo-c8%p3_u0=ycF3^Fmf|+_H6uduWJk&7JYe=|7 z!!?5k9m?NBCXY-92S|b{KnSyr>7r1u&|d}fjy)7JwTDmmPop-`c{c>08$E1Ss|JVE zIUy}*tImfDofEbI!sJY_wW#xe*#d;xsZaP6R@ixbrCSzC$g5;JAbXaC1;xt`hZa4LJ$9tw~Pv1+#%}mL&SXdsoSKD*UPR`{Z`~dz*)L6hoLtlt`tkXaQ+kKed*rwIiCsvCyVY1w~|- zsQT@xLj(8B0St3qq zn`T({MoFWT=c5sQe0-cO2V9M{WcGMRB(LE2nXvrx=`1vCZ=J%j;|h=oCV{U7Jo?Tz zeR)pX@`ltOJbc03TtLyCv_>7TB@y#|+(|tVAKAR9`f!LBR0iQ!^}j%lvwbSu=w3YW zhTP`_Ga?qN_BPEP*;=o`P~u{8QJU_}(ogc_`TKZlMt@r# zbjd5}{~09u@^hN!mT(@F5cV}NnR_(i^qi54!r>rbG5suMutjY?NP4*@voX9%%9tRP!H-$rzEqi3|z4!O_dVk(Oe8+$A?U#=G zzMl7Zp8H()eP7q(dR+X?b;>N_xl7-mcKeN$YS3KiIKSJ1i`_X;$1!MdY8QgXE3L`N zX;Xz?_!5ptH+C__#z`W3hwAxy|D8RqX-nOOl(Hp6HS9Y4JD9h zQ+(I24|_+d8M0qzNmqXiBg_{beauaE9_^R$%H1}Z3CS~1&@O7>U@+fZ7HnE^_s_Fu zund8(pWB1+Db-r4@5x)!clKJSwObXt@sqK!k!mU)9n^T%tsIbM&HrevuD+d<(84!% z>m9S8(BbCKxfWk^dW!S%;7Bd)5A3XHYD{cbH&JhmKue6OI=8j_NT!NY847eao80 zr<@&+AzY?Tys7i$Bh}j4#NecoF0iM;B;VCCx3et=%K=lE>!Y$xFLD#1#)P+S^l{M` z463K9+~pBifsCT|nnx0kZ%h#0zt*c>L{-j(h2j&zL2QJAnX||-YaYwtBw|s_^7$v~ zo<{1nSEBGn?5_?UEOj%Z5A$Q3#GaGL@uw!lNhl{jtN#SXT{m4JuP#_&Lb6rh-^kjH zQl50^^2-4tGEHIUZipR2$9O+WbVO@`)T6}XXyg53-?>D^yOK=yCHc;uCW=u#9pgry zq;r(uxF5cd?ssf)p#XNqKW*xOy?%c|)@RN*>j>D{%Th*+dG4QZdelKP4|>JA#SBq6NTcvLL3 zNQpZzgW+<0(LT7N1GYOQlPw^!p0qKVn5K_z{@D3vQhTCwKnyB`CU+~nXdiUpZL@Jt z2}{k7l91wW5J&c3ZWo^v+ot?+51V$>oIWxu%JOy zP10GoI=X7%*=r3!WCus3Bc==$!tmeIfb_%?6&uCCi{SY;+xCH3+o6ZUp)p+hYVWrT zuDXhMQC+d;9j^OlE7d1t&0{cIq5#cJ>#4SHzlBGcc!vjUOkc%hC9A_V(A(bU;af|8 zgYYOVHZ{QLUfkyXfI5@EYTwo#!84wQ_Y^{E^K)HK9R_qnI8qs-jwUPtNXOyp zW_idW$qI~{;8whiA&l_!xY=oY(($7&fDlkiB4rHwxpIIOhSwa~$Tmp_T-{X7wrKR% z8&gmpZrhJ>lILbZf#E3)`j32;B(@*fLn_Jf)S15X-k6YU>kc~xkIty-Q!+ELCUW>_ zKGG+cVXW2us`Q_LqjP=1zlX${W^ml--!v#a68-hz1y$eYv4y)I#ul(d7juS8A3!`b z9yTtxP40rZ@gaOQ@|i9$IU~{WRc(iDzPIox)l;LDFRbw?k!Uth`Y@QaFIY2eMo03v zl0;J)mLd&%XZ$NWdA7nUQ^_|uVbqM4Y=4E<4}-0wo(4}ozkGAa#etsku8diG6YV)Hzstn z6Yku=VBvPV$R7|jU2w29zPN%`mIzNI^l%!8BGdKE5~X2x00Gi`q%R~#*DMj-;D_28 zi6VphZNT=-LOVOmP6QuNaG6SqqAdcT15evuAeQQJ41mjWkg9FgP_P^^g%+wW%u2&5 z05tK3Qz4yES(YYP$N_6&SXLdx&HZ)X6FzG&HbDl~7bxT*6l*bhGbCEcmOehef3*++(lP`mbD&|j*ks09%6t$RO(+hXZO&_F5myJT^{pYLf_-c59AKrZ_gU{U422emz$G0 zzlMAJKixedNz~{27R=s=`k!(PQ`01QEvX@UmDoPY?H&D}hUAfAeft7;@C>MXWoyP- z`l@MJnPx>~s+DE;nS9$kDG44n=yjv=zHA!ZV9Fn$ob&{aZ4@YL{f}XN?~cZnoQ?e4 zUsZ_wg||lu?m(%Z%>h#k3*qp+)WW7sp|XjAsG`si7w^e@)f)@F#7cVv5f?(_DUU-4 z;0>(2G;%^>&vmi^bsMAZDyL-DP0junX)~4?19X(H0U>-@)0o_ydRvw=n<^{&-+v=p zEqUwimG3ydg?wYA`u@PcZRWU`=EQihOfE z`?_T^(G$Wdr`y3!Ka3PZz7ITR4G01BsS(dW;E0R&?{+d)3{x+~oajGctBGmMW7gpR zsg;Fg90qk<)#4eUS#0)+>MP@x5WEOryr8)X8MFSHL@aoFz=Lwk`vW(w(<)6?5f*gp z9tAGf#YG+M1a}d|bDM)4EaSHVe^{h3z5VA#o~sBlEM1=H$nS&_V5Q@jngH<|5fzk2ETmV_M_Xnm>>*VOzfP1f1h zsK&{srUdlZ99gMb8Lq}ahi~Z%aUa`y%>3e}CWvQ{JN8H%aGxf(dN7O0XO|u%ya5-K zhEb7c5C1GkNk5E9(N}WUb67ohd`k)py=EW5)nx31BKzid%G_{4Uz?knAA^9E6ldsz zeNp1fhTsvZz@r4IkF8$#OUs80kB@7eIqLuo=R8vLtTwWOO8Dz4Gm-*uk`44h099=h zw6^N6P}xXE$XV`!pncj5CsM%PGDxeUsS8nD=JgS_W92nFkPqXP{?65JJuV&aD>G^w z(yDc~r;Q%VUe_=QOo&-`&7ayzY9XN(K~nssBD;bscYZGgk#%+-LLE+EIOB+@4x@k4 zIOakQsvDS$uaq?n2w-=(KECq6-Fj&-ir?F_nuHc)ey0OQl~vovr*gQWD7qOmNl2pEGxK0! zlqVB}b)BicQfX(VzT*e>UxncuE`tC$~X;6vCFX^$-8Nh)_{febl_4!6XYx&&j zAP1&$qvlNRVi^nF6I2jBRmZ0c9-a9oir8)_Q(l(^=<j^uE!EK=3qubg|84*Bx;{#7M@=HV9rTa{dAxcBZ+6jK;1L+CS`Qn}0n*Zf6y z#Izu*tqanTv@#0gb}#4awA_~?=jRp;Gv+bB)qjn9>T&`?#kN)-z(l33hVf(4xiNOi zjx!F9>NelH+Suq4N%_3uX8!nlZHR=_9LqZxzfWh)y#Xp{0a@(T$2ugcj}~(NS`Q-2g9* zrBmey>}yC{xSjHrr^S3uz&Wj{3N`Ffc$=i~wnnb*SU`b?q@xaGV!uQ2@A@BMZ5?UY zQvLpmxTcGsV1n-Zc3vk2tLad}LAi30hSS%~7E>MCl{V>1AJ>2OM{$*GX3`^MZ21T; zMG)aem?m#i2<=O)xTXeT-swSJ4f}3O%dm|a0dn#AY14B)^I>XN|{}&5j0LyEF z-g7%*j~=P7L^)!p2xDFf1xYP;aqnsjli{6b|B;}|e)v|SHsYSzqFaVP_+3TJXwh~| zAt8cI+7(ug$9Ps`4cA6wFWuEv0K@l->joe5i##oUpNS_dC@lFBQDiI54x%)^1CD5` zPW)6Fh{nOkLc5b2 zkd*qwT`Ez7B@cZdiEI~cr>rePAz$Bc-H!N#H6knJ{CX@_R0O@LG50{x{*`B{gB?yFtW)0#tHjxv0xj1{L^-Aa$RzK)K}>3ZGnZnq7JA{)EFy?KVBM}} zsKLCHzz9ut|9I^y=s7E`+@7U0LLE&rkl;NqSYJ0$6OiHWK{Fcf*y{l&AYlCPJSbMI*|P~pL?dE-13p@8VQxr8O;1WWE$en zs2g3i7H*U-7eQAJR|G8GZF38J_GdrYYD$)Z{y@}|(|*WkD?3H#%&Yyr_&It~b33A-)S z*1r<@1);7>oI<=`VmT{|NT<7Y6wFr$(Fi%ZtzZ62UC({A>Lb%3ds^Y&Lq?0UD}mhM zvdfWX=sv?e8_fv84Q4OXT+4lwMfuriRX7TqclDAsYmBfk4EKmN27L6WSDCEO6jmmYLl*4vz#Y_cw%_dKFkuxZpt7xV zZfE3qc|g~%3S<9e$n|vfc@nVMcFN#{x>rBKXkMUKV^|8*fXFvYrP`w5ttZq>H4T}025JgX3^g%Cb4>P-K|&O?*7T1QV|@j=R9~jaQ}jpRAb;S zEb}^cX{Wc1yj=1-ijIy^*!SD*@yt&#(f(XMSpP-V8h;Qg;Z#8X3|99$;!pN$NUa1R zrOolF_o<;a>74_84wdbFTx3ZmRE^^)a1MSz(UFP@U(|g*l2s1}l>XJP;+Qt#2r;ty z`GM-_Hzo@?i@&AMEz($sV2qiQg!vAYU!mw%1q0W+LFAijXP!zW&DJwAPTNYCrh|VY zZdOj|`KXTvX51ktb`tNJ!q*>I8{|uqNZS&Ej`;1y% zM6v4J-3YyOs=lTHKH`@5+;_bFC)sX8KFPa%42)hN@v+|mCkYw(>jnM zt@Ylo5OLM_ZngDyD~P(gfpy2x^)KM)={d#}|{Vji4?{3%%7jyAPw5gjzdY5 z#D9M*|JO8K-=^O+afVz+2koKvrZ)G6-3eSiR^d{C_q6VlKA(!68#b-#*C$4TMIb(L zru9Ya6n>i`oBg#OOg!q%iNn;hSAnf1LCMh>fqHC#(Kj_(hPBahd=7Z`Nx|86oY9+k z^&7NZ%id?mQp9E#?{eCT`yv@*$)w|7OdEo-zXz(@yO)v+Ef zx~*Ya&WB)N`3gPO9uiQIIj6}hA~3*?BGGf_zX)oFG-1`&PKgh6Jl6j7=)&}7TAnB0 z($dJYqbAW1$DC${6%mwe6T@_=VDcr=1q*VN+KPZt>%-f#e3~TpSob*kKLVeVjYyf8`^9Zm$8~iHz(pJSeX7xwMj0Nu|LK;lIUJk za4Y#dIO!*DAhv5Iw(FPqE*$Ks+@;z+Rdx32Z>%yXd(2rY!!laK&6TCv{Xe(MnYi)} zjzQs$I_MU7b)!r|y$CCff>oJ|WA{N{d2!?-W4DwShRKR}go_YG6bstlx?!tfwNwZV z*0K+XX4;mNe-jx22uYau7pTaDgsNJ8sv;srJl~2oX1XcY<7c+AS^nfE=s@S6(|Z9= z72BbU#2UN2>w6KU$~%|-NKc?aQ)}3V;%{=Alz9EN z*idhhBhh}ld{q_wY9(=EAYu|h@dl`MwR}gDhiTAIU$ks;Fn8A&xEDf7bWo6jCKA67 zD1JgX#EI2U_fP2VKH|;;*k%wNn?+`PtYHYdeAwYttAG}zRS3S)E$Uk-s8ZHu4BFl9 zoRo-qtH1*Tmlgn8=sj3gXy`iXeHo4^l3RD`C3TzJLfGF26AhrfaSNNf$<)Zfmi+oL zk>PkY_4(CIzq|kbVhn~*66zO((maewZTIhO-XfUQxcW3Rex z@DTw|J*LUhLs`OlMI|#)kyEjz+F0Pl>Y4H|^~~U1I6>R1#fRCzdWcV%D9RiF2}w+< zw9J1HZB;nz9_)O#>oxETw1$(IXOnUQ-;M&f{ftTDvb*RPJw`brD8Ai}Y}K*)=Y4Uf za~OsG&a?K!h^{;dbq8UGF#xN3KxH7_Qz(L1Pm0?yN^MltLCARNOY#7 z2D++nqM|D$`EM`{mg)eU;0#Gg30{qrY_40doK#> z^mW&B0{~F?rRxqJo4p`#dYG_3mLCURDR!KC4NTtXUy;Hae9JgLkR;wn6(-B;kM<^1 zeJ+Fz@-Pq6W}^XAQb9BEH?TcvsVF(E3FaoQt0MO4RWDmz)@)EVQ5J}5IecV0q%D@` zi(0ydMalrDoUk76eUftzb{vN#UR(a$f0=yXL7iVJQ~yl$M2C|AKsn|ED)%7>P2aTX zv-I|YzZAUUxxz!F`vIf*=EKEEbp=Z9H-UJ$N!c5RiJ!Qnz%P=7>1xCz3M7g2hC@AE6B&_H6=i{xCEvoY8120VQu6?Gf>6|me9rn6aVmZC^H0q_-cLzKtA9MWnyfm=(AJsiAYUkf*(uN{hQe83}$NkgM~Ua?eQ&s0V$Qln*_BGgd~v@;Sc5(vu_r8 zl9jU|MvZN-Rmtzq;~m;S5TYDQ~F z=(FWK=uiA>wTxnNvW(n9@@ddR?pTkcuQ2E6nckeP$N@Ocs{musl_Vy7hLABTr;JKM zP?T-B-&n{#`d7!nDgI-gvnTdPEJ$}5+JB-Bu=`izBULlRZt2doTXh%STN8XFEFl!& zv;5qFbm4)}*ut4R@YF?e^RW7%a=8;wZx*AUeEmUD5o;exI{ad{u1DclOatYkg6Sb; z1gs&sv@-p9~ zN2#4~?EEU*-=mz1u0C-VEPYPzS;+h+l;Rapol_FQ^nOtrCa&*XuNr`22Pqlnm~Wcq z8~i6>1XoLFE{X*!u^ogHYJ%t4J(foDToP5N7qYiF>EA|ojgWfR16y`bZ2QBfF!}e7 zQv1srJKsbpWZpH1-B~|92VALJtMlgRvF=~WGv1hj^-H`jiCaY8+vGkF1e9WT>z=1K zkt3!V4&LT+>Z6sms%SGFV5%&cKFM^UAKy9!B|nZ{IEh& zEcuNouUu|F)Qxq)ms(@YD_fl9R(6X?c$AFiez%j?-6FTZPXWir3|04?AvQ|6wI9cErhd%?A6NY&J{~6#QehtNS9ScaH~M z+vfb|jX{(IUhL%ti%m@8 zWi;1hk?iTMp2dNe!8;-S9LQkbeimEx|966f$cS>;csu}h@D$tZ@GSi3q>YK6~bW?-v9~$=9-8sGA3s+hT}i3(?a!>6xgHBgPZNF=9Q79 zMTQr2B1<>#7(wbXM{s@P)(zkDBWksKk5z2}>&lmzA%~Nov-dxx;2u5KS-@ci!qHTt zGL-bAjRsmy2P5_}HP(miI1C7H=B~*QZ55WrHTU3U(4E=K!l;97Sj@5HN7u^2X&)oe z1dZ|=3=}&aOSxWk9a{ny4?(In>fTV6f^E&=q1LDQE5u&&HlQtuGd720gj^FeZZ|J5 z9SKnic`U!IL$diDAdb*iuM;5`z5Io)MM1PSAXVzb?r&En2QirA*Tdwjgz9aXet>h)yU~>yjOu;*owrZWcrTn@E>YHQg!US&0y%tO~5sqTuF;zVp^#? zzPBR`2cg*@K^$YAiZY^D z`{mnO#r1^BV_`c%(M^1@%tFq1E~EOZ;)5R?|K3+eNBbkD!4_GjVUM<$OLp8|xXY-@ zRr>bxEc=UaK##5Mpn9wU|;{NKs~7)XRE*AQPF*?pg@LQ1qc8F zV6rRCSxi+_)I;#@U4B;*s!9u1;!>6R!-}0CTDf7l&QgwD64!_#u&Kv0jWd1@yFd|A zGi|+-g|RC-G3WhJ`6~l^!Ce3y>r&ptm*SkFd(|;Wl~Td*2IN&oP`|#}Xn;a&?^mpv z&lhvc=N!Teh>#~`TCgUjv&xHOkgFoizI}OCz(?bqf;_?LesT2&6WEJzWm%Y{e&@S5 zV;xw-{IbQ>qtCIfx<`hdqj}JD>&sm(66{vGeS0Zoq$|pdM$>f>*i^wzInB2A-!3FM zPs^y%yIdPKbp0?^Wq=*GI{*1HMsQcj6El;zV42%i{0(~Cl{k90G7(>R({Yd+SBTpB z@_P7|XFLkBbGJUof=}0}#l|uKHJ4yuuCi@7{*LKltV0j41EIcD$KX?%*ffyRqz$(5 z{eFheNBfbQkn%9tZ8{Jd4%iXb`wTC-g}~V>6(2Yk-j5-qL==!ZVh79Py^DvUqs z@o(Jcof%R_!3J2p;P3fWdQH3X<%kZWXV|b%h69XWqd3v`Z_og$AE)28+8$&Jr$Jq` zcjLEL9~D3?G`i^dOUy`YHQY+1!ro=rJ_Y;$sCMP#*lLqf<>$y8CG64aRz$ZE*fk&H zb^XQXIsu})OANuA0nRgyHI#+{>$H`!G%)n7#*1~x-|^ash6&(_qxLNVj9n_NxQ+Gyk3 zuf1Qr_DN7O1aa(RzTzhBX~%X7@CRc?`h9IWv<-OE;+9c%=x)T9===+KaUXY<+8vlVOK1NxrTV zDr81dMH_d!v_@ypWs_6OWwo2iRlbF8Yx(;mPWHc^JUfI@xw#4+4kaaAdSPZZsYst1 zbe`Ltda7nJYPn|yrPKcZ-=g44(ISTEt?18X>R_fyr`tIW@LkGJlsT7a1 zhMd6*wp%{=sByz?s84rj*x_pvb@Zu+U%+9DYS?A1*TTXl)WIauYddOF2mmCld<}++xw5k@=$a^JofuBTu!RWuT}c5 z>l7w_M9p<0v*@zZS_COZ`P`F_qE4a(g!YMm-|*yca|%GHe=JQ2j7f5e*`<9%#og3g zt5;1&D5st$#R;E!^>*IRM~NpmNcd}EUtBl_M2*<4tXG67*I!8@HACJPMQ(Pv&S`y^ zvd-EqeQeiRE;Jq!rNxs6RhWzcxl{GHRn+195-x0*Cb_hX7m#WKNnU>Fhm=KZ^i1jC zam61_(U+8&2)iXM_JtE0k3?g~-%e2|h|WA4#cv}t1!iVfQhug3qOC%XYbmk&B19LD zS_^V=;k0E%s29ELaD)FgHhXargQ5l)?Pe%5JI)23)Y2K=7wh@$OQVzPO_1xp!?4g* z(81JN$m>nXc}iXVT&mGSq>MUaQ~gtR-1}iov~ie- z=Fyi1oxrF3uO5;o@$;r&wDEECdQulnZf>b(Osb@__O1$C{!o``9V&yfEx2$^nXVE~ z50b|omAHtSx)fMl4584c#TsQnh;X+K_0YWRs8f;w@tA1iMndZR+L9g40%&2E&iGp4 zp3HLR8UGuMN73*9sjgV$pIv#9I`4$`{JC7sR{%}64X%Cc6&@2!a$g3P@UW<1nQGR# z+jOlcI>t~LW)+sk8(li(sn#D(fmN*tdy5r*f4yQ*TgvD1Nfl}$Bn>)7TlQ0=s3APY zdK~B@=BNA>q`H>J<(Q^D+ooF)J~kBsVG9o47ekn{y^{Ep+tN}Ety2@bi0;eriPN6L zR<^yx^;5Ubwaane%IeP?KS*gU1F=MU!S;jM*jGj}44owch87ilI z;9HxQWtim(6{r2$4G$lhgYoo=z21Axi0PVyissf)BN!aleGR8NY-3j+*4gK~iEB+}vFg7SqAfsC}>XJIb-#DlD|T8D)@VtwilTj38|$0Z@u?vb`!P zL)b-Sh`9G1#J1FBmil6jD?g1|O2=7aDaQ}u;__LPHsnwZ%sK0v5a8KJAICGSd4-8L zd=63H$x>+W3Gb1Jk%uMtFds~i*S0vu&F~_OF5Ad*wB}7gygG=+$K+)}rH;G*w0Jh9 zLy2MvJO0%&ItQD4SNY=kH|*I%$gpmYt`l?&E)0bdxPwpo1MKvd3)T2|4_p}Qs}AWFqh|~R8-ffE ze#PgkN6v$ZgK)7k#(n%_!NxmM&&L?{5!+r~kG1T%?zZWF+(k@_P5-I(1$GAL}0!!a1nSkVS z;T*>NGVX?tLCTr~^T-M=M1&50tgFR#*CaXJ5B-n*2)n6bFp09XxWPcE4iZg)M>)uV zl6n(js*Qf#Xu{cKj=k9_Ww&!u=@x%f3sQoR=TfJC6;JP3OT`@pR=$zP)1mn_&$<<1 z-)W8w>d+3@WV!P=^Jai39lA+Bep2BDsitsrjU-vXyAF1om+7TQ7hHb88!lG8$zoBj z$N+H?h6WG{NT=bJn=psqr~`45<$@o1yxJ3f8>Spp@$N?pO4<^Uebf@U|;MZ zf$12TX2_jv*V-Mv-WI7_uIKx)K^mTrgOrJt_1(*{wTmg+ytQ7LFO@e6_KH23p6s{2^qT5D!!D+#x*2S2K8>9n53AhV_U2ZC z%X@Abd-IEZg(hC0hC15CqG*bGZ&xf#MjJbn(C1RKszfj+Y4Ijetk91;$9hdY2yW6? zqc;G|iv?EjcZ$Co3`p%aG1WwcJb>ld>|(^_>-cW>>0#09sS-@a_dX#C;r$_t5S z_`{li!ZBW|KV=r^tCBo9I_|&->fL{?cB>u_dWm4kox>hrg-wGb7dF1DRx!UVqsb*N zGBF3)M5x}zjtga@da6g6i|t`Qrgrv6D4fT9(bLV)Z;0Xt+uL6{*V%E@-E{P0C6_)P zE-~}$h4MzO7}tV12?i9%x$gQwT|2lnjqpt-b2#pDB5^+Gy+64z?H8W2lovVOWE%ap z0oKpX$Ah-lSOa`0oX%&Jrnw~dJNx$+f~5{gd(SPJ1D&eB{+cZlSb#j%Y@sofY|q*< z(Q|$s69tv39E#r#Ssqy?JFQ!im0ysoxu&!Y^E!!t)YB;TTB<%S4);Cs+BMQLB{>;Q zjrIVv;dqS0NM-|HpjM}ju+XRaQ&}BuPB9o>Vy0nz^GbjB6Pe4zPI_}&_D`K1&r};J zwQ`Suwec2fz=4Ni*;j%`xXpS6N2!sO;AJ~XpSX$`3-tgr*(*bF>w?buYX0qkzwZbQ zJr3(-b<_sE$$|yT)3T0!b{=h*`ZsxrjcL43XEK@6%dXV9Cvh>weO`F5!ROLK*85Eu zris!Ge_9=Yp6Xl@FPoCjC^AH$2ENa}Om-W|U9R+lP=?WRL{y^IT_Tp|`XiaR-#4J$ zy)M31eX1Dj0JSTFHq{3AUdq_Js4FR{<5EnmlVk&&V-NM|4=XYfXDL~F6cF|&@{a-# z7R2`NA(Xf^Z}Inwv#tcU_Ii7p8=Y-YRXI=8EQm|qKTBRa@t#c9w+~#Vb0;FZxfc;> zC9STsUB&U+FfHe8DRG~yAe{a%n>RW3@ZWV`HB=-CI~+zWL0}J|e5(mhIZWBv$|C2) z=4ZvrglpvfkZ`nO42K%JPKtF>22I})7l+NQnkaZYOgO~xIo6r_Bwjv%h@4zrI_25! zb59bxpLy#Dxh!_jrCB%JNy};DTs*NIII8k~nOre+#!ci9ILH?%`vj(9$kw@j^}a@r z42#42g?tj6>;AkJi%UGd8}g0@t-ot~GC$=QpSHaty;7epaV}c^z8+Scom)C};OniD#lHa^W!E@tdVjLYIg`;@`uf#*C0k_xo`*w*XUM?c-PfmNQE2 z9Z*3&vt};AKJJpjt}C3HZ<4Ejten2HeO%@drX^;ZL#7Pbj$E+0GaxZunpcC2a9P01 z-=tOAj?OF;HxYux+z7i_8hV-i`$rsCCbgZ@131+IKJ0~W;Lr<}Qo^(;d`U%TWG+}{T?IRFCZ6>uK)c77_0dZ#tGL9hr;$` z0*7WIzl>RF)FoM?rK1M3-Y*le;^YI+<&{zIj?y6_UaHz~g*J0jCN4|&Vpgwc=tX{e zSMR!#oqD>g!bV#J8x*ejYnK~^*E_r`wy^Tv6UCr2`EF`Wb}*{P;8rTeA%_j@nTJ#=w_-bH#Lb?TVsi4xDBoEDlx zomMTiz-QI8;m<3wUJTwTUsnD*g5PUUJS29S zY#Y0ZMD4v?%=wsA1;YBL4zoMAOqM4$3P1iHu=Mvq8T$B5XWdLu^M0v|r_muQ1!h(M zH}`IloqW1%k+QxA)ZpPs>61PvIR<*7P}a^<|j+An4^ddxQ8<5-5))gYA7d6k^1=>RTa=P zKe_yyG2OQ={=ugCS5#Ef2)jh=n|r{;gw`zI^qyOn_?Z>gW^eY;meYp4*X(~brh_yY$wZ zsCVp^nGH|95uGYV=^7b5xg8o-d1jT94_DB&y(!en%-YgtEp*2f1Oz7yK0 zC+0m*rtr;`ATS$LZg=YMV^_QDrP+;jGBmknU5O0Mp0!Dj(OKce%WVrC0+*|1*BchU z^q8+Q#zD2?{j$QH8j!_Ld_zL<{o3@`Spsa5cmvJ}C?c6~%d!E#0&aewmV(7RAm)N4 zs9s4ga1!oM@7C1TFm%tb1<(v;9nG@Hi%DT0!LqDHck)#~Zk7@V|9lSF9eM=2u$E1q z$_k>%)wn74GWUDM#RsdpwC|+-8_8KOHfR+g=4`hqPgYH@nYt=%`|#F<<+zF{ZPSPf zOkE^S;S?dT4L_uz)N1K}0_i8qw8jh6s`H>Xl_@@f%9?3vRrS%Azk5lb_5cZhB>jYUM69coV)ySE}~%pDGzm(2RPImcy0N8Uc{=eZCJG zvPwKdET6VHI#eO$;8P~nh$9s zGpLt!RM=qQp`^rBL(~r~;%sa7Z9Cm3Z7$pO?z5{N)xf9HvVyG?(e^BC1dmkT@U?z$ zfc+GLna|^%5X#!g6@?Ju9vFpA0?Ha>y-P zEvPm1a_Y}lM(@c6)Ob)KxuVE6cPCVHN@!ZI@wgNYi83r8)mPUSUM<#C8?jZ_WGQlK zBKzb7-7j1-AAG)ZUhj%!>dwZKFUUMgrvN@~-4BppLP9mAAkus?N`-gg@-68R{`LEnCex>V* z`P{I`+mtTd*N`cYC?K7_k%FHlOvx&5pDsHgfiG=mp#o7wU2C#XK@VI_h4917KpgaI z0EBdrP)~qW-Xh&E>zbYxYXB?k+Dk1~dE@`{_y6;Q(|;1`POS2;{*(BBe~A81LMfV6 z9tFCda8DEd|M=*dCS3lXoJ={ZJR*H&qXK{as{jlIp>(Ny!2Y~IDFT&SRl6+hmZu8w z5@oOYME&opAgt>iToLj^!y1*u1&&T1az?X+4Rim!w)vr9i!zJEBM1K_acbt)>XKq| zCbNX~K@-!`zALKe{#pi?N?LX#PRY(b(=SZ&n&JO^@?-s%F9PfGLLyMt8uFrMo;ss) zYZLLIL0Rt)Q5!ZSNT$dpksUujR&r^SFhe9V`x>4i`sY;_wD_2yEb28`+=TUYv>b|f zaDzyULHeeW(f8f!bj+}j!yE?Bo$EIupwGIyh~5KH4uQ_vvFlKDRvZ$0?MpZ`D#eTJ z-!&zk)mxC)3`*A@e#yETg*+k0Lto4nq|}GZ zn`abFBTN71#PjMxmhDrDrjY~aOj13_NYN0perjY1s5w2`)FzQnTGm1%tCNNOWJ1i7 z$bvd5P{?AxhY`G()|-%rOL;=fBgmjdspsrk4sNv!(wGqQ2=WOYc=ZA&o89?kfIKed z6uH(DaM=L?@72WJSqwo|8Nm(!ucjox?+Nl*yVPX|GOG4<0#S|}cR5-&FX7mQD3}ZZ+iFB)qul zE-T2g`lvm!Pu)JSxP)Bh(xr74kRwXjxcP8yA2QPb_7v9a^Rvrdfg+zO9sg7Tvc8q* zagQUrYHrWHT46lq90Q6hSVR^ORl`n3ZfIG%Kv#S9AEJu9U-k+Vd5e)jQY`Ti6V=ZG z>;d^K(b`(qfeeyj3X+Ok_sbr@BiF?|fgG1z%`ewmKd($>`j0yDRn_tqOE&nATg!5f zkZY}9qmRKjxU006kQuvb9z*JMFy#BUlgA3J^f9XTEcL&{EvWF9_sgziaOAY@i2km% zg`LQy!Gwr>W73OO6*fmssUqas!|p^bb?G&-0QD|{xgT;5vZ(h1db{`>KP2LIWsj<{ zYPl6Mv!LdYh~)Ax%+mK9?munZdXe*vHDDVD;!xj?@ACl9jL&h&i5iqOsuw;z~3?QUH|SfrXmZM7tD78 z*=CU*QhCPB6-1U@rJNxrb$$$4{l?T2WHx7y4Es#lHH-U)M$WZtk6wwE;Q?dt_9sFw zH-NZVZ20HS(_|4NpX@$yB@7H9?K{lIg z#OHD_og#kFr#!3WD;kv~Z9y-xc^XhD;2`%OPI`YSP?L`9I|E3GrS4GTq4=-*g1XnTSYEUyh!xXSfeA+KV z%OAE0SR!~Q&uUp};YMx$$sbvWoR_Amc@m2@iRP3Ud=Am66Q!IzTjXJ*BP?aCJu%7A zUybt|)NEAGh_t&1=pvTCyn4c4CGT6z<^OEAqdgXaWqsRyw+KOBa zDJKc@q*pGGj7E`h$ADTSFELV%yPqz7Y3?AoVg$K9Yj2({<{nUwZKND~9G^Z{cp|wOh)nFs zNwf$-I{KviNk|mgNV$M~q{u8mCia)l`jQ2kK>j4;=E7^^$XkMp0U*c%^#|@&#XU$j z|0j`8by+Gr9Yj(km1|kW>Gne%h0p!u=723*Dl+a5T*ATzh|Vc4z+xlx^3=Q z2Si-i3Qk0Bc?^%7dJI?FFW*3Wk8wd{u^-T5*z&N`I}CV?jXL&g_~m$|LBX&^5+3;$ zl>Nvl1clmmW{g$gA$-+FbF7=Tz`MLr5j@``TvSMhWUWIah?nw z1A5a!$@L?j<**wVa=3E};Q)R9;SQG&Ec*w7pE*9_}1DhhM8A zpQx1M&Lzbz7?ORI8iFNbKU~T~$Ub5r(G`MA=KYkRQXWJOPWz>$jClXQ~(YBVgFPuWwAt=2FT=@>N$9Tf|F+ChU z)H0{0$FNO!3prad1(2C3A-zZkon$JQU5c+SzTEDO$P+xXq*NF~&-l*{oehkU6+U#ST769;4C?ukZ_dw{8?85>N_egQwH7$wr_L z%}x%i&*mp4vZmXjf2**fF)9N)_~O-W75YCf&6 zDZw9E!SXdCNiY*ZYCAbPvN2vwFR|q0XJY}CIla}CT)m}CG4~`=UC65%Z44<e1H-m_fdSvPqMM)_Ww7VSH;W6`&wGw>lJU;hn zmy;ovcNnK@xsL1(aX5xZ&Xsx7(od|~8LG#?8*Gov&EJPxWrkViFmfqlIi#OZ{c@qf zc3PHdd~>% zk28boaqN#gjc(*Ze;LH&wv8H-%iI5ABn~czB5D~fp;(BFlneox=rOP@h||dU(!M6L zJ$Y(`J*s6_6MQ-3TF!rTHQ1G@TI(^c%wwo2GxNhoK7+^Lw(az4%RNT^qpS5JzVk4? zQGOK$M)r7h-Vb}GU9Dg4NC{@tiy0q9?wBiCT*@}ASwqI8NN)W^UCTv-@z}(k2H>iV zACLo`4R$fF@Ub-R(340?hx%Jzxp)R>H zUup;JVIP(5ay}~amytcjTq(O!W1x#%3zt_`^<8woY-&g`shS;dB;b){C0F87jBvnC<2Hv3>AI>A2OF2N+vRC_wHoJrpAanIkWB3vT z$Zo4&@F(Uqoc{LKAp3oD9$AOAZz1xqCC4GF4zGD_Mo14J3;SEx9HD;;)@J#Y#2ps|YVjXin zCwq+E&?+xvKhjk($o4sRET9x!#6>b>Y}AFkcOdtPIh%GEH#aSG+NVcH?h`YQFCOo? zs%sel=vu$rg*!}Tmn#_j)I9wSX-(Qfy4PASx=N$P$-(fSr3lUz%c11(DG z(w@{E!o=)eP|9hNcn7Nw*#~1!y`{p3<+m*{rB|z0gc3v)oX)P0x$peITsZM*0SC?{b(|-BYTFz~%_0tAD#?|l`OKhT# zv7#*-v5B7C#Ow()-h08s`!NL73Dj-LvwAP`l4te*x0L?}wJi56yO}r^*{0r)k-51z zofipY>MbOB$053*K4h}YrjYBU+#C0Q3vyk{osBkmwbh#U7NOSZP{{57gvVHg;B3Zc zb|I%@a z@lSh)-S{xQbfl@GMG8h}1s`UL_4y$xI^CjDn1a86d;O5HCSa3yjiu zBVq=~VTk{t)-MeTP>>NZqsXsm{l=yyYsj+RJN*^p&%cMB)~YW=rg)5=EzJefk-FL|(aamBvUusJUq+Uf4+eSntwSH-3>W{FjL>_AWdS2{dY$Y;gO=Ku$ zT7P+^mN9F$emu&|V^u~aN`3tvgKTZT48$C-+fA1E2Gd`U(e0N}qi8uthF>^DLpGn) zNXYJftn~w8UWiQTRP(W>7l%zL3j$k%yy2W3!SqKS!&76EV5L9nQ5ULA?G=kxysU)?{HHW2N!=Bwjf0 z_bPkcykC~nkoJk=ltJX;450g9$Xeh=HG-HjHd_#z!w#Kd7U& zMOsEvqnmlZG!c1?$B<}hj;DdZt(ZmQJa0>oPc$`alu~1FNA|h#{1{=w(QhF8)DSTf zHXIq`w`y4ylGD~Myxkzb)nmAod*~|@NX4eFe~({wMYwC=9YH2-IGWg`NJTcwNDlCA zSJ!prVG$}ae*?1V$FRUtMkZ}Isv@U1J*H)0ALt_F`tG?jg)xt@xRmR!L>JlFBgiE! zBO_Ik>#8E>XOAFz6X03Nd=s3cAV2EJjW3;A9jsN~2tBrY2c(e_H?*w3RAj>Td1R5N zSwmL&eYbL~m?`DCh3y$+Y}oV;uVfZm{@n_4c*9YKP#V&9g59(ledf?fwR2X^RzRHjexjEjuZ%K_++% zWpf*jtd!}<^awn4wOqCGEqN(lK+TJ^JoW0K4e5Jlb4y4G)*gFMWnc8Pis2CHAflI?x8geFPpj-BA*U9JhDOL6A^Qm%CN{CuZ%96)AG4bYFQ#; zmZ3<^Y)Z*@4|xp1Cq0Jw>Z$l6hs-TPCz@pG(n=Yhsrw~li8Uta8HJg;UqVJ3lgN~m#TsO>1{rHik`wmOVn;{1k^LSRJ0&%U z-y9(TDNkxybxx(3jWSsedJjUVA9M?*kd?$_)B_kpZU=-}=?m~OP*r60C69E+ zHuEMDGn^u<#c%Z{?>j%$09dd3)IY>kdC2vosFXASRMifI;VimR2Z}H*k$3tDg3#V6KpU@C9*T@7dH;`2&&XEV+Ij8fgnh7Hk zJVpaq_f<0F!JRu*W$fh0XB}C8`AV+k=Ib*C<1>qpRSY%t7`&DFV0>o9*bg5;Vp6W_ zG_e92QOhml9Z?{XW9P(u8F|TDu1W8G>D-9Ti^xmfat)I&R;y%+wxQ)hGOLgy;TBPn zO5 ziMgWxDspExv49M^eC@ezVZ|)QkVWU@2YR;96huE4VrJ!Ys#-p=^-VRy&Q{30<6WLs z%;j^YqD2TEj!fR?vU@Qj2hlA1kn=Ld#B7l5xh*X-FXsFnXm^HFL&=8vN zVn!AY(vWLfK9L3*+r6WZsariyCuWA;Jw?kkkAWd0V%Esi)#lQPxw5Bi#Y%yQ5BaDA z*@&5=X~P-UV4c(MT(venj-jK#9moYQZb$AhvWld6d5!^0^Fo z2d5YMB!v~l{nPG2%iD~W!>?A%u~im1k03jbvCVjlz$h8ED2M4$315O7tkk(C`DJkJ zR#^IU-^gSfBaE(X@~e;q$ET~M*5FLEC=4`g@-^i8!uFFxM%^VsL%#c5OfFv=UyNn* zDzcukh>A4|)o@=X)5zpf?%$*l_3wA@S>};DnYr{6oiJ3Im;f zy3$c@Iv!xi4#I;&CSFPCO^L^Xy*6x)w(5!V(b6c4A!+J)bR^Ys+sc2=yurL0(r z`#iFMhhb$-gSEON_4)mIBmW3~e0^4ti(0jB8JR(b3(2F3n1;mFF?q60oS%ZRgKZC9 zK`w^9t*;O*Zt*&H`(LfgP%p&s1DaeIlv{G&^ zDrzmqCm_qljb~OU#+eu9z{DMLBq1Dm<~@KWp#{tJLF3v)mh9tGZl8j)ue%5O@pVN; zx}A}GHn)k^&I+>CvS442=hyc5`TF_EkQ;Nx_N0DdJK{rYCjoi;e4L+m7nF&+F-eeH zPC(m;l+CCVO{L~Bj9>m%4fInr(#QR{l8I{)@`#i*vP4s(56(Znzw*PcG)ftv$RC^?@_c-A%5z#_u6>sjUsEV$c|4wv>v4X6 ztYs^hi*1sM2oJq{%l-S57ytM?*RmB1^%5of8y=&p4f+$vr57IH_Q#MZ-Kjr@Olb!G z1oG7*<-dkZIr(oOcdc~$8^~Rw+rNR_W&e=hVgHcdVgHcdVgHcdVgHcdVgLOvbL;2+kI5;dm!& zK6^NDPD4ClO8NEC@2VG9%+L=jCfn&tmy(NrVWZz)Ey~Ar&bix0ZprLwKg@f#%ihIr zF5ZjEd|vn0Dk|^)$Rx3WY}9iT?0YGp53869-&E!#*KfNpJ1abXr&nv)xYZO@D+b-Z zR{hw3!=26t@Fl3M*XLi>V18NrDc5YW>;nTg|H#T;dSW1?9 z@AKq{YPz_vf|Jt1>TN*sv2(}Zw>J(k6I&=pn-sn#c4}6*guL>gYvfIXF{1UME)k<^C$}dVpcWj z8H2GwgG&QyoZwh3c#b!uJbEM9#;N81fJr5wW8vl;I2W;(#7=*3Se0-IDC1 zjIg;*Ug#&USWNpOZ#}WO_1NR3bw4oE>NzFqnR{lqGwZr zmIya0X3po@#e1=Ce87)O_442CbJQ$E+aeD^eEF#HKcO_!LOW}CtF|hb`=nxs@m4Z% zk|Bh0X6gU0?zidPd&>NjC1<=vk?}6Yk<}7Nsn!}yAAN2Qon(QDR!WmnsTfWx!K{hB zUyYSp&{ZWJ&Ua@Zy6tLCPH5|S&bWfXU54|624CR6=Hy+4;U9cDev~I!_g4A6gFCaG zZ;N5;*gS@omBus-ge~(L54<_D4y$_4EWHgWoEYt6WcA#9W(AZvks45((=0RM^NC!r zqqRUQ!FupYOd|MAg$g#c2~gwzE@5qT7|ZE~J9;ws+bcg+BET!Bl1dH5LHA5{8DUuS zBXoR1o%36coj{DA`f}SvWO%&~d`t48y=Lc8*(iq56}Zi4d2y?@ABPPMl7uj|ezd3~ zS6#cQmuHJ;>en#B6I&H3kUW(pt@8UWoNT-Gt5L4QBvSk=PJ z$I$^qN;^^;zJf%0qb$aVV0{wow}U)-R)5DtfbD263emETX^7i{mVt{Y;33)w&T{ra z13(kBq#{=mmRUrQe@;NvSA2^r4WeN9b=nkJhuLmr-#uNe$6%b7^!IO%QH|$`$_x=| zx&W$|s|LWfU+{*RVkE1q+^f45(JJjaGE}h&b&T1+Y3k+GE@)7$jyT-emz^BrW_4ZT ziZexv1*S=QDRW;urLKp7Z?hDI>B-LWpMUu`5YXqD>Hm7*`+Na9U5c zYXa2y+k_rs@k{F3Ev+8Z%?V+o~;_zWCW?prITE7)V04iBJ1}>a3 zvWU^aV`{o37JeoY>pFsbhmYTFw&qO8;cSwU&-pYOoIzRq8xQ(5N@YqlPj~2;Z7&;! zsuJ@iB!J6hsix^7657?V1tYu@k)s6@A3S*&v$97dTS-kH)OSYa3mn2z+D-#OuE(iv zTSC$PhTQ#OuZ`!QJd0Fibh+~YLuCH5ALT>Oq>Ce8Xzw~9hT!$yd7<%(Xl(=5-lc)q&>c@{OcQ&9EJ^E6((4Mxkc`emFP#k}>Ofs$x8ZQQ8ub9z@TEA#20{HPx@d@=i`!{sk`^VQF}Z3UZ1 z9cYdlI|)f0KLF^?20p6Y74G{X!g#wsTI3DM;$LN-kR@<#|F4Zn+ky6H=o}1f`^?W z(gqDT+J~YuiU}udWj0^F~_KttE~fhRAgm@7uc%Lc4`l!-UF_hL-;n$jQDyA|G~0J?KGxu0Lf( zuQZFXq#IF`Fz!oA!Emic8snQvuQlf=s*Dir6^;Uu4B0mA_(9N}o~uus`FN&4yJrvPvlGhDF?zG8ALqJn@Zo0DD+~mJ&Ge-pPa2QbBNv zokK~dQwii!{+-v0&V>_gLtL>cNXY@9+c|ImY4Ei{B20{0qya>@lU(O@D*C)RbwccC zy)fr>JEdrUX6K8chV2j$YInH_h5f zH|GZ*ZQyPfG!uOsc0NvlV#a@NhfvM(_k1Eq@Fcci2J^&<`*LA`NzU0sSZfFmzJxIE zwN&lQ72d1(e2G3|`SjvPK9$O46FX1oQnh9Yx0WvQ_aGWAE*##lk)+jutnT5ltt2qz zrG;5C&R{JX{0rm$f;-nl1u#u`xo=gOk;gK&!L+g*H9r)Z-}KcHmjmHYmMKZj7nP`W z2rbO*xvF|3SDGDI0|svrh9v;0P!TO_QT8c01bAl=_E8m_bT7Ge;wbV@gUUV}nr}yu zVSl0*w7)+h-j)(-PhGoth*u$AL@XJIJMk;yyCNgl;*^P|7?pmrgrd{$qiftCL3=S$>HEJkNHM>6cSWI&?Fs zsm2yCo%&)}tjIi1KUZ=PsngF5q)GkwUQoNw$wh4YC`9i2s11L`!Rm(n_~b`UL{K_w z^zV%C+;+BNiLucEa0J#W>Wh|Y4f*gWM4f@w_t#b^E?%?m`)~=6FsuTf+bKX2o}=Ra zX;RnLQ>dDm;u=+^)(H)@YlV%v2Ipi43ul%QZ{`F#sF|lU-i_i+S6ZOkNBqds;ozZI z?;bAMj4KYEML{ene|>-nWfwquU1z$l&RAB_>dn{-6d!|C=0&Y>OT=nf{XX~x+Fnjo zHOW4Y{JRgBCP;I}rAIe|hgPWr!H1Q;egpJRhYl1{{g_#q1-X2#C)n}DJ!?qr@66Gbmo0?0~?VzkIqakkl1%eaa6!VFH28Dwhg!cJPQBG6^N%ldtm7R`_v6R-GtnbLG(~=}~++ z+9~OQK3H7mP~hsN`{GgCn|k^>`jdWW*f-(O%|OIr(qm0pm0$2>7jmOG3bD-G(=@Z= zP2-h=(ktK{PIVVqk5!A3W$t%&Q@u*|+PLXUl+$Jv^EXTWonC4C5e27DeQHgc=iJ6L=CWI+-f`dFnF9@e?yNL+jO|)UzlPqQ-a(b%?+!qIF2G? z!oWxYA|j%7{0xF4ttp^=(y^kF2Hp0N{s4!Mb5jDku$+PHLcg2>%t^bf#jicZA?YM;DO9 zGiGkSpscc8rKzjDOrh9>Y9{RR&AL??GlMQF!d5r%4<(P4TSl zoKCX@qp-&BOOq*M^ljefK%0d@;;9>YPsYL|xbI#+D)J5c@t|J;tMZton;vE zUenqv=2=eAPN1dyb=|AKKfVV0&W5sAH?Br^2mkmvO1p*_2);9=z&(L5PciWyIp>pM zo;PtV);qE7ei~70DnQapiGj!HCv$eiiFN8d2NHb8i}H9;X2J8lM14m1?)VPa3d`9j zPgA896Cv!bvCUn}KagF1hM>J!!Nd`8(A&&Q*BY9+Ki`CVzJ3o370_J^L=Jq{f@G0) z9pD8!+EiTY6p2$~0=TCk=C|aPCst>@ z*1~bT*DkxNS`V@GB;is=L70tjtml-h#PAAe^!hH@O&fkrkU`d}GQSH=DJ>E+xj#3@ zuue#CS0!aXv6Tq}Ol`f+&pP)q!mT0z-Tn5|dB-POj0_>Ymus3h@)T_kfF70$fp*V^ zi1%h~aOC}vCJ;*Mkti*s-4@5)rA5_?q@E1V+Yn^9?|)!fQ&_Ub_rLhDa%a!FbH3Gz zHAoPzH~le&Pkq||pR5Ry3>plHhmU?;>n&KM%#FZE z*f$tB?O-@@9lC9$`sV?wC+`Ne(PL%eZnaifbQ;P&f_Kx2q?l1W5 zLae|4U1MTAT?bm^mJ|&REQSVICRdTHVJxBgNZz{Y&*2sHp`Tz0T0(>dZTRV<5b&UybDs_UVgAd(W^qWJuG&z^ zgbhts?KayJ%a5a+r&9wwBP28I{8ecfXY2w&eDQI%7Hs%89}e){x^LaiG;D`D4>77! zPcp!Mr9+g`7V(<-X-xS5BU32VN~Ng98(7V<;;`@rXt}7n;+uJGm0SBbWa5F3O%s0`cq%J zmhtYGd)B?kdzj}7MZ_8A?d#rpXp7C4VaMvg^sIB9 z4|FL-cWr+wj4OKXfzf`JlQZArx_afK+!kxY&hl&S{ZeK_z~56p5(BjvUhR#brx0x* zesA(Ljg3SK3`EPV*=Zp7zfIio^xQexSB;%(`z{A@Y3^R^t~mQwpegdM3a#t=X>EPw zQ}C&ciw7B}j7%;WrOX>3D#8%yGIIry%J=HJJi&%GwK|L~#G??c-bJ%pFJDU!LWrWG z99~|JnLE?9q;j=svBE}!ZIzsL87UEsc6Su`QQ4KX((lof`&Iq@a;w92*q2->m9N#s z`eZY6^RFkzUSZl`Bmo-sl_IU#jGj_4Kc2Zfw6(mJhNrx5gKhVDR4)A&WR$#ISGm}_ z=m>gXO%k;v0MEs&HZ{?c6z#z92rSlzTSk^UC1H`PHJGW`@#)8hv7qR=F3>!kJFJ-a zXXH_J$pYcJhm7I Kbh+i#nEwH?M$oPR literal 0 HcmV?d00001 diff --git a/doc/aic.plated-drill.cnc b/doc/aic.plated-drill.cnc index 31052fe..d4b9ae6 100644 --- a/doc/aic.plated-drill.cnc +++ b/doc/aic.plated-drill.cnc @@ -1,516 +1,516 @@ M48 -INCH -T14C0.120 -T18C0.030 -T20C0.055 -T21C0.020 -T25C0.060 -T26C0.080 -T29C0.028 -T30C0.035 -T31C0.042 -T32C0.043 -T33C0.052 +METRIC,000.000 +T69C0.508 +T68C1.397 +T67C1.524 +T66C3.048 +T65C1.321 +T64C1.092 +T63C1.067 +T62C0.762 +T61C2.032 +T60C0.889 +T59C0.711 % -T21 -X036500Y009250 -X031500Y013000 -X036000Y018250 -X035250Y029250 -X035000Y028750 -X031500Y027500 -X032500Y025000 -X010250Y028000 -X010250Y029750 -X008750Y027500 -X009250Y027000 -X016000Y022250 -X021000Y037000 -X030500Y027000 -X028500Y030250 -X015500Y004250 -X020500Y005250 -X021500Y004750 -X022500Y004250 -X015500Y013500 -X016500Y005250 -X016000Y004750 -X028250Y016500 -X024750Y039250 -X020000Y026000 -X020000Y028750 -X022500Y022250 -X022500Y024000 -X031500Y026750 -X029500Y027500 -X039750Y026750 -X036750Y031750 -X036000Y026000 -X036500Y025500 -X041750Y040000 -X035250Y024000 -X034500Y026750 -X033250Y023500 -X031000Y031750 -X037750Y029750 -X033500Y037250 -X050750Y027000 -X049250Y023500 -X048250Y026000 -X050750Y029500 -X059250Y029500 -X048000Y030000 -X044250Y029500 -X053250Y035250 -X037750Y032750 -X037250Y026000 -X054750Y035750 -X056250Y034750 -X052750Y032500 -X053250Y032250 -X056500Y025000 -X054500Y026500 -X055750Y023750 -X061250Y032250 -X044250Y034500 -X047750Y038750 -X044250Y039250 -X043500Y036500 -X042750Y039250 -X040250Y039250 -X041750Y037000 -X042500Y029500 -X047750Y029500 -X047750Y030500 -X046000Y034000 -T29 -X022500Y033500 -X023500Y033500 -X037250Y033500 -X038250Y033500 -X039250Y033500 -X040250Y033500 -X025500Y036500 -X024500Y036500 -X023500Y036500 -X022500Y036500 -X019750Y038000 -X017750Y038000 -X019750Y035750 -X017750Y035750 -X034000Y028000 -X035000Y028000 -X035000Y031000 -X034000Y031000 -X037250Y028000 -X038250Y028000 -X039250Y028000 -X040250Y028000 -X040250Y031000 -X039250Y031000 -X038250Y031000 -X037250Y031000 -X039750Y038000 -X037750Y038000 -X040250Y036500 -X039250Y036500 -X038250Y036500 -X037250Y036500 -X050750Y038000 -X048750Y038000 -X051250Y036500 -X050250Y036500 -X049250Y036500 -X048250Y036500 -X046000Y028500 -X046000Y030500 -X048250Y028000 -X049250Y028000 -X050250Y028000 -X051250Y028000 -X052250Y028000 -X053250Y028000 -X054250Y028000 -X055250Y028000 -X056250Y028000 -X057250Y028000 -X058250Y028000 -X058250Y031000 -X057250Y031000 -X056250Y031000 -X055250Y031000 -X054250Y031000 -X053250Y031000 -X052250Y031000 -X051250Y031000 -X050250Y031000 -X049250Y031000 -X048250Y031000 -X051250Y033500 -X048250Y033500 -X049250Y033500 -X050250Y033500 -X059250Y028000 -X059250Y031000 -X060250Y028000 -X061250Y028000 -X061250Y031000 -X060250Y031000 -X060750Y038000 -X058750Y038000 -X061250Y036500 -X060250Y036500 -X059250Y036500 -X058250Y036500 -X058250Y033500 -X059250Y033500 -X060250Y033500 -X061250Y033500 -X019500Y006000 -X020500Y006000 -X021500Y006000 -X022500Y006000 -X023500Y006000 -X024500Y006000 -X025500Y006000 -X025500Y009000 -X024500Y009000 -X024500Y033500 -X025500Y033500 -X033000Y028000 -X033000Y031000 -X032000Y031000 -X031000Y031000 -X030000Y031000 -X029000Y031000 -X025000Y038000 -X023000Y038000 -X017750Y030500 -X017750Y028500 -X019500Y028000 -X020500Y028000 -X021500Y028000 -X022500Y028000 -X023500Y028000 -X021500Y031000 -X020500Y031000 -X019500Y031000 -X028000Y028000 -X029000Y028000 -X030000Y028000 -X031000Y028000 -X032000Y028000 -X024500Y028000 -X025500Y028000 -X028000Y031000 -X025500Y031000 -X024500Y031000 -X023500Y031000 -X023500Y009000 -X022500Y031000 -X022500Y009000 -X021500Y009000 -X020500Y009000 -X019500Y009000 -X017750Y008500 -X017750Y006500 -X059250Y003000 -X059250Y005000 -X055250Y005000 -X055250Y003000 -X057500Y003000 -X057500Y005000 -T18 -X065250Y036250 -X064250Y036250 -X065250Y035250 -X065250Y034250 -X064250Y035250 -X064250Y034250 -X063250Y036250 -X063250Y035250 -X063250Y034250 -X065250Y031250 -X065250Y030250 -X065250Y029250 -X064250Y029250 -X063250Y029250 -X065250Y028250 -X064250Y028250 -X063250Y028250 -X064250Y031250 -X064250Y030250 -X063250Y031250 -X063250Y030250 -X065250Y033250 -X065250Y032250 -X064250Y033250 -X064250Y032250 -X063250Y033250 -X063250Y032250 -X021750Y026000 -X021750Y017500 -X017750Y026000 -X017750Y017500 -X023250Y017500 -X023250Y021500 -X027250Y017500 -X027250Y021500 -X017750Y021500 -X021750Y021500 -X021750Y013500 -X017750Y013500 -X063250Y026250 -X063250Y025250 -X065250Y027250 -X064250Y027250 -X063250Y027250 -X065250Y026250 -X064250Y026250 -X064250Y025250 -X064250Y024250 -X065250Y025250 -X065250Y024250 -X063250Y024250 -X063250Y023250 -X063250Y022250 -X063250Y021250 -X063250Y020250 -X065250Y006250 -X065250Y005250 -X064250Y006250 -X064250Y005250 -X063250Y006250 -X063250Y005250 -X065250Y023250 -X065250Y022250 -X065250Y021250 -X064250Y023250 -X064250Y022250 -X064250Y021250 -X065250Y020250 -X065250Y019250 -X065250Y018250 -X064250Y020250 -X064250Y019250 -X063250Y019250 -X065250Y016250 -X065250Y015250 -X065250Y014250 -X065250Y013250 -X065250Y012250 -X065250Y011250 -X065250Y010250 -X065250Y009250 -X065250Y008250 -X065250Y007250 -X065250Y017250 -X064250Y017250 -X064250Y018250 -X064250Y016250 -X064250Y015250 -X064250Y014250 -X064250Y013250 -X064250Y012250 -X064250Y011250 -X064250Y010250 -X064250Y009250 -X064250Y008250 -X064250Y007250 -X063250Y018250 -X063250Y017250 -X063250Y016250 -X063250Y015250 -X063250Y014250 -X063250Y013250 -X063250Y012250 -X063250Y011250 -X063250Y010250 -X063250Y009250 -X063250Y008250 -X063250Y007250 -T30 -X029000Y036000 -X028000Y036000 -X019250Y033500 -X020250Y033500 -X034500Y037000 -X034500Y033000 -X031500Y036500 -X031500Y035500 -X046000Y037000 -X042500Y037000 -X044250Y037000 -X053250Y037000 -X042500Y031500 -X046000Y033000 -X042500Y033000 -X044250Y031500 -X054750Y033000 -X053250Y033000 -X044250Y033000 -X054750Y037000 -X056250Y037000 -X056250Y033000 -X008000Y030750 -X007000Y030210 -X008000Y029660 -X007000Y029120 -X008000Y028570 -X007000Y028030 -X008000Y027480 -X008000Y026390 -X007000Y026940 -X021750Y023500 -X021750Y015500 -X017750Y023500 -X017750Y015500 -X024250Y026000 -X024250Y023500 -X025250Y023500 -X025250Y026000 -X032000Y026000 -X031000Y026000 -X023250Y019500 -X023250Y015500 -X027250Y019500 -X027250Y015500 -X028000Y033500 -X029000Y033500 -X031000Y033500 -X032000Y033500 -X028750Y026000 -X027750Y026000 -X024250Y013500 -X017750Y019500 -X021750Y019500 -X021750Y011000 -X024250Y011000 -X025250Y011000 -X025250Y013500 -X017750Y011000 -X042500Y027500 -X044250Y027500 -X061500Y026000 -X057500Y026000 -X055750Y026000 -X051750Y026000 -X050000Y026000 -X034250Y026000 -X038250Y026000 -X044000Y026000 -X040000Y026000 -X046000Y026000 -X061500Y004000 -X061500Y003000 -X061500Y006000 -X061500Y007000 -X036000Y026750 -X049750Y004000 -X049750Y014250 -X054500Y006250 -X037250Y004000 -X040000Y008500 -X038500Y007000 -X039250Y007750 -X060500Y006000 -X055250Y007000 -X043250Y006000 -X015250Y034750 -X016000Y033500 -X018750Y030250 -X016000Y028500 -X015250Y022750 -X017750Y024500 -X016000Y024500 -X018750Y023500 -X026250Y030250 -X026250Y020750 -X029500Y035000 -X027000Y026000 -X024000Y008000 -X022500Y009750 -X025250Y012500 -X025250Y009750 -X019500Y003000 -X019000Y009750 -X017750Y012500 -X021750Y018750 -X022500Y011750 -X024250Y012500 -X019000Y013500 -X020750Y015500 -X028000Y032250 -X027000Y038000 -X024250Y024500 -X026250Y023500 -X027000Y028750 -X038750Y026750 -X036000Y038000 -X030250Y032250 -X032750Y038000 -X052000Y034000 -X038500Y024500 -X051750Y024500 -X060250Y025250 -X061500Y030250 -X041000Y034000 -X047250Y024500 -X040000Y024500 -X043250Y022750 -X047250Y032250 -T31 -X047750Y005000 -X046750Y005000 -X045750Y005000 -X035000Y005000 -X034000Y005000 -X033000Y005000 -X047750Y012500 -X046750Y012500 -X045750Y012500 -X035000Y012500 -X034000Y012500 -X033000Y012500 -X035000Y020000 -X034000Y020000 -X033000Y020000 -X005500Y009000 -X005500Y007230 -X047750Y020000 -X046750Y020000 -X045750Y020000 -T32 -X006250Y011750 -X006250Y012750 -X006250Y015500 -X006250Y016500 -X006250Y019250 -X006250Y020250 -T33 -X006480Y006730 -X006480Y009490 -T20 -X034000Y017250 -X055250Y017250 -X061500Y012250 -X061500Y018750 -X059250Y015750 -X053250Y001750 -X053250Y015750 -T25 -X055250Y011000 -X059250Y011000 -X055250Y020750 -X059250Y020750 -T26 -X066250Y038250 -X066250Y038250 -X005750Y003380 -X005750Y038250 -X066250Y003380 -X066250Y003250 -T14 -X007500Y033450 -X007500Y023690 +T69 +X022225Y069850 +X023495Y068580 +X026035Y075565 +X026035Y071120 +X039370Y034290 +X039370Y010795 +X040640Y056515 +X040640Y012065 +X041910Y013335 +X050800Y073025 +X050800Y066040 +X052070Y013335 +X053340Y093980 +X054610Y012065 +X057150Y060960 +X057150Y056515 +X057150Y010795 +X062865Y099695 +X071755Y041910 +X072390Y076835 +X074930Y069850 +X077470Y068580 +X078740Y080645 +X080010Y069850 +X080010Y067945 +X080010Y033020 +X082550Y063500 +X084455Y059690 +X085090Y094615 +X087630Y067945 +X088900Y073025 +X089535Y074295 +X089535Y060960 +X091440Y066040 +X091440Y046355 +X092710Y064770 +X092710Y023495 +X093345Y080645 +X094615Y066040 +X095885Y083185 +X095885Y075565 +X100965Y067945 +X102235Y099695 +X106045Y101600 +X106045Y093980 +X107950Y074930 +X108585Y099695 +X110490Y092710 +X112395Y099695 +X112395Y087630 +X112395Y074930 +X116840Y086360 +X121285Y098425 +X121285Y077470 +X121285Y074930 +X121920Y076200 +X122555Y066040 +X125095Y059690 +X128905Y074930 +X128905Y068580 +X133985Y082550 +X135255Y089535 +X135255Y081915 +X138430Y067310 +X139065Y090805 +X141605Y060325 +X142875Y088265 +X143510Y063500 +X150495Y074930 +X155575Y081915 +T59 +X045085Y096520 +X045085Y090805 +X045085Y077470 +X045085Y072390 +X045085Y021590 +X045085Y016510 +X049530Y078740 +X049530Y071120 +X049530Y022860 +X049530Y015240 +X050165Y096520 +X050165Y090805 +X052070Y078740 +X052070Y071120 +X052070Y022860 +X052070Y015240 +X054610Y078740 +X054610Y071120 +X054610Y022860 +X054610Y015240 +X057150Y092710 +X057150Y085090 +X057150Y078740 +X057150Y071120 +X057150Y022860 +X057150Y015240 +X058420Y096520 +X059690Y092710 +X059690Y085090 +X059690Y078740 +X059690Y071120 +X059690Y022860 +X059690Y015240 +X062230Y092710 +X062230Y085090 +X062230Y078740 +X062230Y071120 +X062230Y022860 +X062230Y015240 +X063500Y096520 +X064770Y092710 +X064770Y085090 +X064770Y078740 +X064770Y071120 +X064770Y022860 +X064770Y015240 +X071120Y078740 +X071120Y071120 +X073660Y078740 +X073660Y071120 +X076200Y078740 +X076200Y071120 +X078740Y078740 +X078740Y071120 +X081280Y078740 +X081280Y071120 +X083820Y078740 +X083820Y071120 +X086360Y078740 +X086360Y071120 +X088900Y078740 +X088900Y071120 +X094615Y092710 +X094615Y085090 +X094615Y078740 +X094615Y071120 +X095885Y096520 +X097155Y092710 +X097155Y085090 +X097155Y078740 +X097155Y071120 +X099695Y092710 +X099695Y085090 +X099695Y078740 +X099695Y071120 +X100965Y096520 +X102235Y092710 +X102235Y085090 +X102235Y078740 +X102235Y071120 +X116840Y077470 +X116840Y072390 +X122555Y092710 +X122555Y085090 +X122555Y078740 +X122555Y071120 +X123825Y096520 +X125095Y092710 +X125095Y085090 +X125095Y078740 +X125095Y071120 +X127635Y092710 +X127635Y085090 +X127635Y078740 +X127635Y071120 +X128905Y096520 +X130175Y092710 +X130175Y085090 +X130175Y078740 +X130175Y071120 +X132715Y078740 +X132715Y071120 +X135255Y078740 +X135255Y071120 +X137795Y078740 +X137795Y071120 +X140335Y078740 +X140335Y071120 +X140335Y012700 +X140335Y007620 +X142875Y078740 +X142875Y071120 +X145415Y078740 +X145415Y071120 +X146050Y012700 +X146050Y007620 +X147955Y092710 +X147955Y085090 +X147955Y078740 +X147955Y071120 +X149225Y096520 +X150495Y092710 +X150495Y085090 +X150495Y078740 +X150495Y071120 +X150495Y012700 +X150495Y007620 +X153035Y092710 +X153035Y085090 +X153035Y078740 +X153035Y071120 +X154305Y096520 +X155575Y092710 +X155575Y085090 +X155575Y078740 +X155575Y071120 +T62 +X045085Y066040 +X045085Y054610 +X045085Y044450 +X045085Y034290 +X055245Y066040 +X055245Y054610 +X055245Y044450 +X055245Y034290 +X059055Y054610 +X059055Y044450 +X069215Y054610 +X069215Y044450 +X160655Y092075 +X160655Y089535 +X160655Y086995 +X160655Y084455 +X160655Y081915 +X160655Y079375 +X160655Y076835 +X160655Y074295 +X160655Y071755 +X160655Y069215 +X160655Y066675 +X160655Y064135 +X160655Y061595 +X160655Y059055 +X160655Y056515 +X160655Y053975 +X160655Y051435 +X160655Y048895 +X160655Y046355 +X160655Y043815 +X160655Y041275 +X160655Y038735 +X160655Y036195 +X160655Y033655 +X160655Y031115 +X160655Y028575 +X160655Y026035 +X160655Y023495 +X160655Y020955 +X160655Y018415 +X160655Y015875 +X160655Y013335 +X163195Y092075 +X163195Y089535 +X163195Y086995 +X163195Y084455 +X163195Y081915 +X163195Y079375 +X163195Y076835 +X163195Y074295 +X163195Y071755 +X163195Y069215 +X163195Y066675 +X163195Y064135 +X163195Y061595 +X163195Y059055 +X163195Y056515 +X163195Y053975 +X163195Y051435 +X163195Y048895 +X163195Y046355 +X163195Y043815 +X163195Y041275 +X163195Y038735 +X163195Y036195 +X163195Y033655 +X163195Y031115 +X163195Y028575 +X163195Y026035 +X163195Y023495 +X163195Y020955 +X163195Y018415 +X163195Y015875 +X163195Y013335 +X165735Y092075 +X165735Y089535 +X165735Y086995 +X165735Y084455 +X165735Y081915 +X165735Y079375 +X165735Y076835 +X165735Y074295 +X165735Y071755 +X165735Y069215 +X165735Y066675 +X165735Y064135 +X165735Y061595 +X165735Y059055 +X165735Y056515 +X165735Y053975 +X165735Y051435 +X165735Y048895 +X165735Y046355 +X165735Y043815 +X165735Y041275 +X165735Y038735 +X165735Y036195 +X165735Y033655 +X165735Y031115 +X165735Y028575 +X165735Y026035 +X165735Y023495 +X165735Y020955 +X165735Y018415 +X165735Y015875 +X165735Y013335 +T60 +X017780Y076733 +X017780Y073965 +X017780Y071196 +X017780Y068428 +X020320Y078105 +X020320Y075336 +X020320Y072568 +X020320Y069799 +X020320Y067031 +X038735Y088265 +X038735Y057785 +X040640Y085090 +X040640Y072390 +X040640Y062230 +X045085Y062230 +X045085Y059690 +X045085Y049530 +X045085Y039370 +X045085Y031750 +X045085Y027940 +X047625Y076835 +X047625Y059690 +X048260Y034290 +X048260Y024765 +X048895Y085090 +X049530Y007620 +X051435Y085090 +X052705Y039370 +X055245Y059690 +X055245Y049530 +X055245Y047625 +X055245Y039370 +X055245Y027940 +X057150Y029845 +X057150Y024765 +X059055Y049530 +X059055Y039370 +X060960Y020320 +X061595Y066040 +X061595Y062230 +X061595Y059690 +X061595Y034290 +X061595Y031750 +X061595Y027940 +X064135Y066040 +X064135Y059690 +X064135Y034290 +X064135Y031750 +X064135Y027940 +X064135Y024765 +X066675Y076835 +X066675Y059690 +X066675Y052705 +X068580Y096520 +X068580Y073025 +X068580Y066040 +X069215Y049530 +X069215Y039370 +X070485Y066040 +X071120Y091440 +X071120Y085090 +X071120Y081915 +X073025Y066040 +X073660Y091440 +X073660Y085090 +X074930Y088900 +X076835Y081915 +X078740Y085090 +X078740Y066040 +X080010Y092710 +X080010Y090170 +X081280Y085090 +X081280Y066040 +X083185Y096520 +X086995Y066040 +X087630Y093980 +X087630Y083820 +X091440Y096520 +X091440Y067945 +X094615Y010160 +X097155Y066040 +X097790Y062230 +X097790Y017780 +X098425Y067945 +X099695Y019685 +X101600Y066040 +X101600Y062230 +X101600Y021590 +X104140Y086360 +X107950Y093980 +X107950Y083820 +X107950Y080010 +X107950Y069850 +X109855Y057785 +X109855Y015240 +X111760Y066040 +X112395Y093980 +X112395Y083820 +X112395Y080010 +X112395Y069850 +X116840Y093980 +X116840Y083820 +X116840Y066040 +X120015Y081915 +X120015Y062230 +X126365Y036195 +X126365Y010160 +X127000Y066040 +X131445Y066040 +X131445Y062230 +X132080Y086360 +X135255Y093980 +X135255Y083820 +X138430Y015875 +X139065Y093980 +X139065Y083820 +X140335Y017780 +X141605Y066040 +X142875Y093980 +X142875Y083820 +X146050Y066040 +X153035Y064135 +X153670Y015240 +X156210Y076835 +X156210Y066040 +X156210Y017780 +X156210Y015240 +X156210Y010160 +X156210Y007620 +T63 +X013970Y022860 +X013970Y018364 +X083820Y050800 +X083820Y031750 +X083820Y012700 +X086360Y050800 +X086360Y031750 +X086360Y012700 +X088900Y050800 +X088900Y031750 +X088900Y012700 +X116205Y050800 +X116205Y031750 +X116205Y012700 +X118745Y050800 +X118745Y031750 +X118745Y012700 +X121285Y050800 +X121285Y031750 +X121285Y012700 +T64 +X015875Y051435 +X015875Y048895 +X015875Y041910 +X015875Y039370 +X015875Y032385 +X015875Y029845 +T65 +X016459Y024105 +X016459Y017094 +T68 +X086360Y043815 +X135255Y040005 +X135255Y004445 +X140335Y043815 +X150495Y040005 +X156210Y047625 +X156210Y031115 +T67 +X140335Y052705 +X140335Y027940 +X150495Y052705 +X150495Y027940 +T61 +X014605Y097155 +X014605Y008585 +X168275Y097155 +X168275Y097155 +X168275Y008585 +X168275Y008255 +T66 +X019050Y084963 +X019050Y060173 M30 diff --git a/doc/aic.top.gbr b/doc/aic.top.gbr new file mode 100644 index 0000000..f99bb1d --- /dev/null +++ b/doc/aic.top.gbr @@ -0,0 +1,1638 @@ +G04 start of page 3 for group 1 idx 3 * +G04 Title: (unknown), component * +G04 Creator: pcb 20140316 * +G04 CreationDate: Wed 15 Jul 2015 07:10:19 PM GMT UTC * +G04 For: fetter * +G04 Format: Gerber/RS-274X * +G04 PCB-Dimensions (mm): 180.34 104.14 * +G04 PCB-Coordinate-Origin: lower left * +%MOMM*% +%FSLAX43Y43*% +%LNTOP*% +%ADD58C,1.321*% +%ADD57C,1.092*% +%ADD56C,1.067*% +%ADD55C,0.762*% +%ADD54C,0.711*% +%ADD53C,2.921*% +%ADD52C,2.667*% +%ADD51C,2.286*% +%ADD50C,2.159*% +%ADD49C,1.016*% +%ADD48C,1.397*% +%ADD47C,3.556*% +%ADD46C,2.032*% +%ADD45C,0.002*% +%ADD44C,2.540*% +%ADD43C,1.524*% +%ADD42C,1.778*% +%ADD41C,3.048*% +%ADD40C,0.508*% +%ADD39C,0.889*% +%ADD38C,1.651*% +%ADD37C,0.254*% +%ADD36C,0.635*% +%ADD35C,0.203*% +G54D35*X0Y104140D02*X180340D01* +X0D02*Y0D01* +X180340Y104140D02*Y0D01* +X0D02*X180340D01* +G54D36*X45085Y54610D02*Y49530D01* +G54D37*X40640Y56515D02*Y12065D01* +G54D36*X45085Y39370D02*Y44450D01* +X43180Y56515D02*X45085Y54610D01* +Y24765D02*Y31750D01* +Y16510D02*Y18415D01* +X57150Y37465D02*Y29845D01* +X55245Y54610D02*Y47625D01* +X59055Y49530D02*Y66040D01* +X55245Y44450D02*Y39370D01* +X57150Y37465D01* +X52705Y24765D02*Y39370D01* +G54D38*X48260Y34290D02*Y24765D01* +G54D36*X45085Y62230D02*Y59690D01* +G54D37*X26035Y75565D02*Y71120D01* +X20320Y72390D02*X22225Y70485D01* +X20549Y75336D02*X23495Y72390D01* +X20320Y72568D02*Y72390D01* +X23495Y68580D02*Y72390D01* +X22225Y69850D02*Y70485D01* +G54D38*X13970Y60960D02*X20320Y67031D01* +X13970Y22860D02*Y60960D01* +X15875Y29845D02*X13970D01* +X15875Y39370D02*X13970D01* +X15875Y48895D02*X13970D01* +G54D37*X39370Y34290D02*Y10795D01* +G54D36*X57150Y22860D02*Y24765D01* +X54610Y22860D02*X52705Y24765D01* +G54D37*X54610Y12065D02*Y15240D01* +G54D38*X62230Y17145D02*X66675Y21590D01* +X62230Y17145D02*Y15240D01* +G54D36*X60960Y24130D02*Y20320D01* +G54D37*X52070Y13335D02*Y14605D01* +G54D36*X46990Y22860D02*X45085Y24765D01* +G54D37*X52070Y14605D02*Y15240D01* +G54D36*X45085Y18415D02*X46990Y20320D01* +Y22860D01* +X59055Y44450D02*Y26035D01* +G54D38*X64135Y34290D02*X64770D01* +X66675Y32385D01* +G54D36*X61595Y31750D02*Y34290D01* +G54D38*X66675Y21590D02*Y32385D01* +G54D36*X64135Y31750D02*Y24765D01* +X59055Y26035D02*X60960Y24130D01* +G54D37*X57150Y15240D02*Y10795D01* +X95885Y75565D02*Y67310D01* +X92710Y64770D02*X93345Y65405D01* +X90170Y70485D02*X89535Y69850D01* +X90170Y73660D02*Y70485D01* +X89535Y74295D02*X90170Y73660D01* +X95885Y67310D02*X94615Y66040D01* +X93345Y65405D02*Y80645D01* +X88265Y75565D02*Y73660D01* +X107950Y76200D02*Y69850D01* +X112395Y76200D02*Y69850D01* +G54D38*X102235Y71120D02*Y72390D01* +X104140Y74295D01* +G54D37*X102235Y76835D02*X100965Y75565D01* +X102235Y78740D02*Y76835D01* +G54D38*X99695Y66675D02*X98425Y67945D01* +G54D37*X71120Y69850D02*X70485Y69215D01* +Y66040D01* +X72390Y69215D02*X71755Y68580D01* +X78740Y75565D02*X77470Y74295D01* +X80010Y69850D02*Y74295D01* +X81280Y75565D01* +G54D36*X64770Y71120D02*Y69850D01* +X63500Y68580D01* +X61595Y65405D02*Y62865D01* +G54D37*X74930Y74295D02*Y69850D01* +X76200Y75565D02*X74930Y74295D01* +G54D36*X73660Y71120D02*Y76200D01* +G54D37*X77470Y74295D02*Y68580D01* +X72390Y76835D02*Y69215D01* +X76200Y71120D02*Y69215D01* +X81280Y66040D02*Y66675D01* +Y71120D01* +X76200Y69215D02*X73025Y66040D01* +X87630Y85725D02*X88900Y84455D01* +Y83185D01* +X87630Y81915D01* +Y93980D02*Y85725D01* +G54D36*X85090Y94615D02*Y78105D01* +X119380Y95885D02*X103505D01* +G54D37*X110490Y92710D02*Y78105D01* +G54D39*X116840Y93980D02*Y86360D01* +G54D38*X104140Y89535D02*Y74295D01* +G54D36*X102235Y94615D02*X95250D01* +X95885Y96520D02*Y94615D01* +X94615Y93980D02*X95250Y94615D01* +X94615Y92710D02*Y93980D01* +G54D37*X99695Y92710D02*Y90805D01* +G54D38*X102235Y92710D02*Y91440D01* +X104140Y89535D01* +G54D37*X99695Y90805D02*X95885Y86995D01* +Y83185D01* +X88900Y78740D02*Y76200D01* +X88265Y75565D01* +X85090D02*X86360Y76835D01* +X83820Y78740D02*X82550Y77470D01* +X87630Y81915D02*Y67945D01* +G54D36*X83820Y76835D02*Y71120D01* +G54D37*X85090Y67945D02*Y75565D01* +X82550Y63500D02*Y77470D01* +X76200Y78740D02*Y75565D01* +G54D36*X73660Y76200D02*X74930Y77470D01* +G54D37*X81280Y75565D02*Y78740D01* +X78740D02*Y75565D01* +G54D38*X63500Y95885D02*Y94615D01* +G54D36*X80010Y92710D02*X78740D01* +X76835Y90805D01* +G54D40*X74930Y77470D02*Y88900D01* +G54D36*X71120Y78740D02*Y85090D01* +X76835Y90805D02*Y81915D01* +G54D37*X78740Y80645D02*Y85090D01* +G54D38*X81280D02*X83185Y86995D01* +Y95885D02*Y86995D01* +G54D37*X52070Y71120D02*Y76200D01* +G54D36*X47625Y76835D02*X46355Y75565D01* +X52070Y78740D02*X47625Y74295D01* +X46355Y75565D02*X44450D01* +X43180Y74295D01* +Y56515D01* +X47625Y59690D02*Y74295D01* +X38735Y88265D02*Y57785D01* +X40640Y85090D02*Y62230D01* +G54D37*X45085Y100330D02*Y96520D01* +X46355Y101600D02*X45085Y100330D01* +Y90805D02*X41910Y87630D01* +Y13335D01* +G54D36*X49530Y7620D02*Y15240D01* +X69215Y54610D02*Y49530D01* +G54D37*X71755Y68580D02*Y41910D01* +G54D36*X69215Y44450D02*Y39370D01* +G54D41*X86360Y48260D02*Y34290D01* +G54D37*X80010Y33020D02*Y67945D01* +G54D42*X86360Y62230D02*Y31750D01* +X86995Y62865D02*X86360Y62230D01* +G54D37*X84455Y67310D02*X85090Y67945D01* +X84455Y59690D02*Y67310D01* +X89535Y69850D02*Y60960D01* +G54D42*X86995Y62865D02*Y66040D01* +G54D37*X88265Y73660D02*X88900Y73025D01* +X91440Y66040D02*Y46355D01* +G54D42*X115570Y33655D02*Y29845D01* +G54D41*Y30480D02*Y12700D01* +G54D38*X99695Y19685D02*Y66675D01* +G54D42*X116205Y50800D02*Y13335D01* +G54D37*X53340Y77470D02*X52070Y76200D01* +G54D36*X85090Y78105D02*X83820Y76835D01* +G54D43*X73660Y85090D02*Y78740D01* +G54D37*X86360Y76835D02*Y78740D01* +X106045Y78105D02*X107950Y76200D01* +X112395D02*X110490Y78105D01* +X112395Y83820D02*Y87630D01* +X46355Y101600D02*X106045D01* +G54D36*X107950Y95885D02*Y94615D01* +X103505Y95885D02*X102235Y94615D01* +G54D37*X60960Y97790D02*X62865Y99695D01* +X108585D02*X102235D01* +X106045Y93980D02*Y78105D01* +G54D38*X64770Y93345D02*Y85090D01* +X63500Y94615D02*X64770Y93345D01* +G54D37*X59690Y85090D02*Y90170D01* +X60960Y91440D01* +Y97790D01* +G54D36*X58420Y96520D02*Y93980D01* +X57150Y92710D01* +Y85090D01* +G54D38*X50165Y90805D02*X51435Y89535D01* +X50165Y96520D02*Y90805D01* +X51435Y89535D02*Y85090D01* +G54D37*X53340Y93980D02*Y77470D01* +X50800Y66040D02*Y73025D01* +G54D36*X61595Y68580D02*X59055Y66040D01* +G54D37*X57150Y66675D02*X54610Y69215D01* +Y71120D01* +X78740D02*Y66040D01* +X71120Y71120D02*Y69850D01* +G54D36*X63500Y68580D02*X61595D01* +G54D37*X57150Y66675D02*Y56515D01* +G54D36*X66675Y76835D02*Y52705D01* +G54D38*X68580Y96520D02*Y66040D01* +X91440Y67945D02*Y96520D01* +G54D36*X154940Y23495D02*X165735D01* +X158750Y20320D02*Y12700D01* +X165735Y20955D02*X159385D01* +X158750Y20320D01* +G54D42*X142875Y25400D02*Y6350D01* +G54D36*X138430Y9525D02*X140335Y7620D01* +X138430Y9525D02*Y15875D01* +G54D38*X140335Y12700D02*Y17780D01* +G54D36*X153670Y22225D02*X154940Y23495D01* +X153670Y22225D02*Y15240D01* +G54D42*X142875Y6350D02*X144780Y4445D01* +X160655Y13335D02*X165735D01* +X160655Y6350D02*Y13335D01* +X144780Y4445D02*X158750D01* +X160655Y6350D01* +G54D36*X158750Y12700D02*X156210Y10160D01* +G54D42*X146050Y12700D02*Y7620D01* +X126365Y36195D02*Y10160D01* +G54D41*X140335Y53340D02*Y27940D01* +X135255Y40005D02*Y4445D01* +G54D42*X140970Y27940D02*X142875Y26035D01* +G54D40*X116205Y34290D02*Y30480D01* +G54D41*X116635Y40005D02*X135255D01* +G54D42*X140335Y53975D02*X150495Y64135D01* +X153035D01* +G54D37*X157480Y66040D02*X158115Y66675D01* +X144780Y64770D02*X143510Y63500D01* +X156210Y66040D02*X157480D01* +X141605D02*Y60325D01* +X135890Y66040D02*X141605D01* +G54D36*X131445D02*Y62230D01* +G54D41*X150495Y52705D02*Y27940D01* +G54D44*X156210Y31115D02*Y47625D01* +G54D36*X149225Y92075D02*X150495Y90805D01* +X147955Y92710D02*Y90805D01* +X158115D02*X150495D01* +X149225Y96520D02*Y92075D01* +G54D37*X160655Y99695D02*X112395D01* +G54D36*X120015Y95250D02*X119380Y95885D01* +X128905Y95250D02*X130175Y93980D01* +X160655Y92075D02*Y90805D01* +G54D37*X167005Y93345D02*X160655Y99695D01* +X121285Y98425D02*Y90170D01* +G54D36*X165735Y89535D02*Y90170D01* +X165100Y90805D02*X161290D01* +X165735Y90170D02*X165100Y90805D01* +G54D37*X167005Y78740D02*Y93345D01* +G54D36*X161290Y90805D02*X157480D01* +X147955D02*X150495Y88265D01* +X153035Y90805D02*Y85725D01* +X161925Y80645D02*X164465D01* +X165735Y79375D01* +G54D37*X166370Y78105D02*X167005Y78740D01* +X164465Y78105D02*X166370D01* +X164465D02*X163195Y76835D01* +X155575Y85090D02*Y81915D01* +G54D36*X157480Y81280D02*X158115Y81915D01* +X150495Y88265D02*Y85090D01* +G54D37*X148590Y81915D02*X150495Y80010D01* +G54D36*X157480Y78105D02*Y81280D01* +X158115Y81915D02*X160655D01* +X161925Y80645D01* +G54D37*X160655Y79375D02*X158115Y76835D01* +Y66675D02*Y76835D01* +X150495Y80010D02*Y78740D01* +X142875Y82550D02*X143510Y81915D01* +X148590D01* +G54D38*X140335Y72390D02*X145415Y77470D01* +Y78740D01* +X140335Y72390D02*Y71120D01* +G54D37*X150495D02*Y74930D01* +X144780Y67945D02*Y64770D01* +G54D36*X146050Y66040D02*Y67310D01* +X146685Y67945D01* +X152400D01* +G54D37*X147955Y71120D02*X144780Y67945D01* +G54D36*X152400D02*X153035Y68580D01* +Y73660D01* +X157480Y78105D01* +X128905Y96520D02*Y95250D01* +G54D37*X127000Y88265D02*X128905Y86360D01* +Y83185D01* +G54D36*X130175Y90170D02*Y93980D01* +G54D37*X135255Y89535D02*Y93980D01* +G54D36*X132080Y88265D02*X130175Y90170D01* +X132080Y88265D02*Y86360D01* +G54D37*X133985Y76200D02*Y82550D01* +X135255Y83820D02*Y83185D01* +X130175Y78740D02*Y77470D01* +X135255Y83820D02*Y81915D01* +X139065Y90805D02*Y83820D01* +X142875Y93980D02*Y88265D01* +Y83820D02*Y82550D01* +X125730Y74930D02*X121285D01* +G54D42*X94615Y63500D02*Y10160D01* +G54D36*X101600Y66040D02*Y21590D01* +X109855Y57785D02*Y15240D01* +X97790Y17780D02*Y62230D01* +G54D37*X92710Y64770D02*Y23495D01* +G54D41*X115570Y50800D02*Y28575D01* +G54D37*X100965Y75565D02*Y67945D01* +G54D42*X97155Y66040D02*X94615Y63500D01* +G54D37*X132715Y71120D02*Y74930D01* +X133985Y76200D01* +X135255Y71120D02*Y66675D01* +X131445Y74930D02*X130175Y73660D01* +X128905Y74930D02*Y68580D01* +X127635Y71120D02*Y73025D01* +X125730Y74930D01* +X130175Y73660D02*Y71120D01* +Y77470D02*X128905Y76200D01* +X131445Y80645D02*Y74930D01* +X135255Y66675D02*X135890Y66040D01* +X142875Y68580D02*X141605Y67310D01* +X138430D01* +X142875Y71120D02*Y68580D01* +X128905Y83185D02*X131445Y80645D01* +G54D36*X125095Y83185D02*Y85090D01* +X122555Y80645D02*X125095Y83185D01* +X120015Y62230D02*Y95250D01* +G54D37*X121285Y90170D02*X123190Y88265D01* +X127000D01* +X128905Y76200D02*X121920D01* +X127000Y77470D02*X121285D01* +X127635Y78740D02*Y78105D01* +X127000Y77470D01* +G54D36*X116840D02*Y78105D01* +X117475Y78740D01* +X122555D01* +Y80645D01* +G54D37*Y71120D02*Y66040D01* +X125095Y71120D02*Y59690D01* +G54D35*X19050Y8001D02*Y6985D01* +X19431Y7366D01* +X19812Y6985D01* +Y8001D02*Y6985D01* +X20498Y7493D02*X20625Y7366D01* +X20244Y7493D02*X20498D01* +X20117Y7366D02*X20244Y7493D01* +X20117Y7366D02*Y7112D01* +X20244Y6985D01* +X20625Y7493D02*Y7112D01* +X20752Y6985D01* +X20244D02*X20498D01* +X20625Y7112D01* +X21057Y8001D02*Y7112D01* +X21184Y6985D01* +X21565Y8001D02*Y7112D01* +X21692Y6985D01* +X21438Y7620D02*X21692D01* +X22073Y6985D02*X22454D01* +X21946Y7112D02*X22073Y6985D01* +X21946Y7366D02*Y7112D01* +Y7366D02*X22073Y7493D01* +X22327D01* +X22454Y7366D01* +X21946Y7239D02*X22454D01* +Y7366D02*Y7239D01* +X22885Y7366D02*Y6985D01* +Y7366D02*X23012Y7493D01* +X23266D01* +X22758D02*X22885Y7366D01* +X24028Y8001D02*Y6985D01* +Y8001D02*X24536D01* +X24028Y7493D02*X24409D01* +X24968Y6985D02*X25349D01* +X24841Y7112D02*X24968Y6985D01* +X24841Y7366D02*Y7112D01* +Y7366D02*X24968Y7493D01* +X25222D01* +X25349Y7366D01* +X24841Y7239D02*X25349D01* +Y7366D02*Y7239D01* +X25781Y8001D02*Y7112D01* +X25908Y6985D01* +X25654Y7620D02*X25908D01* +X26289Y8001D02*Y7112D01* +X26416Y6985D01* +X26162Y7620D02*X26416D01* +X26797Y6985D02*X27178D01* +X26670Y7112D02*X26797Y6985D01* +X26670Y7366D02*Y7112D01* +Y7366D02*X26797Y7493D01* +X27051D01* +X27178Y7366D01* +X26670Y7239D02*X27178D01* +Y7366D02*Y7239D01* +X27610Y7366D02*Y6985D01* +Y7366D02*X27737Y7493D01* +X27991D01* +X27483D02*X27610Y7366D01* +X28753Y8001D02*Y6985D01* +X29261D01* +X29947Y7493D02*X30074Y7366D01* +X29693Y7493D02*X29947D01* +X29566Y7366D02*X29693Y7493D01* +X29566Y7366D02*Y7112D01* +X29693Y6985D01* +X30074Y7493D02*Y7112D01* +X30201Y6985D01* +X29693D02*X29947D01* +X30074Y7112D01* +X30886Y7493D02*X31013Y7366D01* +X30632Y7493D02*X30886D01* +X30505Y7366D02*X30632Y7493D01* +X30505Y7366D02*Y7112D01* +X30632Y6985D01* +X30886D01* +X31013Y7112D01* +X30505Y6731D02*X30632Y6604D01* +X30886D01* +X31013Y6731D01* +Y7493D02*Y6731D01* +X31445Y6985D02*X31826D01* +X31318Y7112D02*X31445Y6985D01* +X31318Y7366D02*Y7112D01* +Y7366D02*X31445Y7493D01* +X31699D01* +X31826Y7366D01* +X31318Y7239D02*X31826D01* +Y7366D02*Y7239D01* +X32258Y6985D02*X32639D01* +X32766Y7112D01* +X32639Y7239D02*X32766Y7112D01* +X32258Y7239D02*X32639D01* +X32131Y7366D02*X32258Y7239D01* +X32131Y7366D02*X32258Y7493D01* +X32639D01* +X32766Y7366D01* +X32131Y7112D02*X32258Y6985D01* +X19177Y9906D02*Y8890D01* +X19558Y9906D02*X19685Y9779D01* +Y9017D01* +X19558Y8890D02*X19685Y9017D01* +X19050Y8890D02*X19558D01* +X19050Y9906D02*X19558D01* +X19990Y9652D02*Y9525D01* +Y9271D02*Y8890D01* +X20371D02*X20752D01* +X20244Y9017D02*X20371Y8890D01* +X20244Y9271D02*Y9017D01* +Y9271D02*X20371Y9398D01* +X20625D01* +X20752Y9271D01* +X20244Y9144D02*X20752D01* +Y9271D02*Y9144D01* +X21438Y9398D02*X21565Y9271D01* +X21184Y9398D02*X21438D01* +X21057Y9271D02*X21184Y9398D01* +X21057Y9271D02*Y9017D01* +X21184Y8890D01* +X21438D01* +X21565Y9017D01* +X21057Y8636D02*X21184Y8509D01* +X21438D01* +X21565Y8636D01* +Y9398D02*Y8636D01* +X21869Y9271D02*Y9017D01* +Y9271D02*X21996Y9398D01* +X22250D01* +X22377Y9271D01* +Y9017D01* +X22250Y8890D02*X22377Y9017D01* +X21996Y8890D02*X22250D01* +X21869Y9017D02*X21996Y8890D01* +X23266D02*X23647D01* +X23139Y9017D02*X23266Y8890D01* +X23139Y9779D02*Y9017D01* +Y9779D02*X23266Y9906D01* +X23647D01* +X24333Y9398D02*X24460Y9271D01* +X24079Y9398D02*X24333D01* +X23952Y9271D02*X24079Y9398D01* +X23952Y9271D02*Y9017D01* +X24079Y8890D01* +X24460Y9398D02*Y9017D01* +X24587Y8890D01* +X24079D02*X24333D01* +X24460Y9017D01* +X24892Y9906D02*Y8890D01* +Y9017D02*X25019Y8890D01* +X25273D01* +X25400Y9017D01* +Y9271D02*Y9017D01* +X25273Y9398D02*X25400Y9271D01* +X25019Y9398D02*X25273D01* +X24892Y9271D02*X25019Y9398D01* +X25832Y8890D02*X26213D01* +X25705Y9017D02*X25832Y8890D01* +X25705Y9271D02*Y9017D01* +Y9271D02*X25832Y9398D01* +X26086D01* +X26213Y9271D01* +X25705Y9144D02*X26213D01* +Y9271D02*Y9144D01* +X26645Y9271D02*Y8890D01* +Y9271D02*X26772Y9398D01* +X27026D01* +X26518D02*X26645Y9271D01* +X27330Y9906D02*Y9017D01* +X27457Y8890D01* +X27711Y9271D02*Y9017D01* +Y9271D02*X27838Y9398D01* +X28092D01* +X28219Y9271D01* +Y9017D01* +X28092Y8890D02*X28219Y9017D01* +X27838Y8890D02*X28092D01* +X27711Y9017D02*X27838Y8890D01* +X28651Y9271D02*Y8890D01* +Y9271D02*X28778Y9398D01* +X28905D01* +X29032Y9271D01* +Y8890D01* +X28524Y9398D02*X28651Y9271D01* +X30302Y9906D02*X30429Y9779D01* +X29921Y9906D02*X30302D01* +X29794Y9779D02*X29921Y9906D01* +X29794Y9779D02*Y9525D01* +X29921Y9398D01* +X30302D01* +X30429Y9271D01* +Y9017D01* +X30302Y8890D02*X30429Y9017D01* +X29921Y8890D02*X30302D01* +X29794Y9017D02*X29921Y8890D01* +X31115Y9398D02*X31242Y9271D01* +X30861Y9398D02*X31115D01* +X30734Y9271D02*X30861Y9398D01* +X30734Y9271D02*Y9017D01* +X30861Y8890D01* +X31242Y9398D02*Y9017D01* +X31369Y8890D01* +X30861D02*X31115D01* +X31242Y9017D01* +X31801Y9271D02*Y8890D01* +Y9271D02*X31928Y9398D01* +X32055D01* +X32182Y9271D01* +Y8890D01* +X31674Y9398D02*X31801Y9271D01* +X32614Y9906D02*Y9017D01* +X32741Y8890D01* +X32487Y9525D02*X32741D01* +X32995Y9652D02*Y9525D01* +Y9271D02*Y8890D01* +X33376Y9271D02*Y8890D01* +Y9271D02*X33503Y9398D01* +X33630D01* +X33757Y9271D01* +Y8890D01* +X33249Y9398D02*X33376Y9271D01* +X34061Y9652D02*Y9525D01* +Y9271D02*Y8890D01* +X19050Y11684D02*Y10795D01* +Y11684D02*X19177Y11811D01* +X19558D01* +X19685Y11684D01* +Y10795D01* +X19050Y11303D02*X19685D01* +X19990Y11811D02*X20244D01* +X20117D02*Y10795D01* +X19990D02*X20244D01* +X20676D02*X21057D01* +X20549Y10922D02*X20676Y10795D01* +X20549Y11684D02*Y10922D01* +Y11684D02*X20676Y11811D01* +X21057D01* +X21361Y11303D02*X21869D01* +X22174Y11684D02*X22301Y11811D01* +X22682D01* +X22809Y11684D01* +Y11430D01* +X22174Y10795D02*X22809Y11430D01* +X22174Y10795D02*X22809D01* +X23114D02*X23241D01* +X23546Y11684D02*X23673Y11811D01* +X24054D01* +X24181Y11684D01* +Y11430D01* +X23546Y10795D02*X24181Y11430D01* +X23546Y10795D02*X24181D01* +X24486D02*X24613D01* +X24917Y10922D02*X25044Y10795D01* +X24917Y11684D02*Y10922D01* +Y11684D02*X25044Y11811D01* +X25298D01* +X25425Y11684D01* +Y10922D01* +X25298Y10795D02*X25425Y10922D01* +X25044Y10795D02*X25298D01* +X24917Y11049D02*X25425Y11557D01* +X26187Y10922D02*X26314Y10795D01* +X26187Y11684D02*X26314Y11811D01* +X26187Y11684D02*Y10922D01* +X26746Y11303D02*X27127D01* +X26619Y11176D02*X26746Y11303D01* +X26619Y11176D02*Y10922D01* +X26746Y10795D01* +X27127D01* +X27432Y11811D02*X27559Y11684D01* +Y10922D01* +X27432Y10795D02*X27559Y10922D01* +X28321Y11684D02*X28448Y11811D01* +X28829D01* +X28956Y11684D01* +Y11430D01* +X28321Y10795D02*X28956Y11430D01* +X28321Y10795D02*X28956D01* +X29261Y10922D02*X29388Y10795D01* +X29261Y11684D02*Y10922D01* +Y11684D02*X29388Y11811D01* +X29642D01* +X29769Y11684D01* +Y10922D01* +X29642Y10795D02*X29769Y10922D01* +X29388Y10795D02*X29642D01* +X29261Y11049D02*X29769Y11557D01* +X30074Y10922D02*X30201Y10795D01* +X30074Y11684D02*Y10922D01* +Y11684D02*X30201Y11811D01* +X30455D01* +X30582Y11684D01* +Y10922D01* +X30455Y10795D02*X30582Y10922D01* +X30201Y10795D02*X30455D01* +X30074Y11049D02*X30582Y11557D01* +X30886Y10795D02*X31394Y11303D01* +Y11684D02*Y11303D01* +X31267Y11811D02*X31394Y11684D01* +X31013Y11811D02*X31267D01* +X30886Y11684D02*X31013Y11811D01* +X30886Y11684D02*Y11430D01* +X31013Y11303D01* +X31394D01* +X19050Y6096D02*X19558D01* +X19685Y5969D01* +Y5715D01* +X19558Y5588D02*X19685Y5715D01* +X19177Y5588D02*X19558D01* +X19177Y6096D02*Y5080D01* +Y5588D02*X19685Y5080D01* +X19990Y5461D02*Y5207D01* +Y5461D02*X20117Y5588D01* +X20371D01* +X20498Y5461D01* +Y5207D01* +X20371Y5080D02*X20498Y5207D01* +X20117Y5080D02*X20371D01* +X19990Y5207D02*X20117Y5080D01* +X21311Y6096D02*Y5080D01* +X21184D02*X21311Y5207D01* +X20930Y5080D02*X21184D01* +X20803Y5207D02*X20930Y5080D01* +X20803Y5461D02*Y5207D01* +Y5461D02*X20930Y5588D01* +X21184D01* +X21311Y5461D01* +X21742D02*Y5080D01* +Y5461D02*X21869Y5588D01* +X22123D01* +X21615D02*X21742Y5461D01* +X22428Y5842D02*Y5715D01* +Y5461D02*Y5080D01* +X23063Y5588D02*X23190Y5461D01* +X22809Y5588D02*X23063D01* +X22682Y5461D02*X22809Y5588D01* +X22682Y5461D02*Y5207D01* +X22809Y5080D01* +X23063D01* +X23190Y5207D01* +X22682Y4826D02*X22809Y4699D01* +X23063D01* +X23190Y4826D01* +Y5588D02*Y4826D01* +X23495Y5461D02*Y5207D01* +Y5461D02*X23622Y5588D01* +X23876D01* +X24003Y5461D01* +Y5207D01* +X23876Y5080D02*X24003Y5207D01* +X23622Y5080D02*X23876D01* +X23495Y5207D02*X23622Y5080D01* +X24892Y6096D02*Y5080D01* +X25273Y6096D02*X25400Y5969D01* +Y5207D01* +X25273Y5080D02*X25400Y5207D01* +X24765Y5080D02*X25273D01* +X24765Y6096D02*X25273D01* +X26086Y5588D02*X26213Y5461D01* +X25832Y5588D02*X26086D01* +X25705Y5461D02*X25832Y5588D01* +X25705Y5461D02*Y5207D01* +X25832Y5080D01* +X26213Y5588D02*Y5207D01* +X26340Y5080D01* +X25832D02*X26086D01* +X26213Y5207D01* +X26772Y5461D02*Y5080D01* +Y5461D02*X26899Y5588D01* +X27026D01* +X27153Y5461D01* +Y5080D01* +X26645Y5588D02*X26772Y5461D01* +X27457Y5842D02*Y5715D01* +Y5461D02*Y5080D01* +X27838D02*X28219D01* +X27711Y5207D02*X27838Y5080D01* +X27711Y5461D02*Y5207D01* +Y5461D02*X27838Y5588D01* +X28092D01* +X28219Y5461D01* +X27711Y5334D02*X28219D01* +Y5461D02*Y5334D01* +X28524Y6096D02*Y5207D01* +X28651Y5080D01* +X29362Y6096D02*X29870D01* +X29616D02*Y5080D01* +X30302Y5461D02*Y5080D01* +Y5461D02*X30429Y5588D01* +X30683D01* +X30175D02*X30302Y5461D01* +X31115Y5080D02*X31496D01* +X30988Y5207D02*X31115Y5080D01* +X30988Y5461D02*Y5207D01* +Y5461D02*X31115Y5588D01* +X31369D01* +X31496Y5461D01* +X30988Y5334D02*X31496D01* +Y5461D02*Y5334D01* +X31801Y5588D02*Y5334D01* +X32055Y5080D01* +X32309Y5334D01* +Y5588D02*Y5334D01* +X32614Y5842D02*Y5715D01* +Y5461D02*Y5080D01* +X32868Y5588D02*X33376D01* +X32868Y5080D02*X33376Y5588D01* +X32868Y5080D02*X33376D01* +X34061Y5588D02*X34188Y5461D01* +X33807Y5588D02*X34061D01* +X33680Y5461D02*X33807Y5588D01* +X33680Y5461D02*Y5207D01* +X33807Y5080D01* +X34188Y5588D02*Y5207D01* +X34315Y5080D01* +X33807D02*X34061D01* +X34188Y5207D01* +X34747Y5461D02*Y5080D01* +Y5461D02*X34874Y5588D01* +X35001D01* +X35128Y5461D01* +Y5080D01* +X34620Y5588D02*X34747Y5461D01* +G54D45*G36* +X56388Y85852D02*Y84328D01* +X57912D01* +Y85852D01* +X56388D01* +G37* +G54D43*X59690Y85090D03* +G54D45*G36* +X93853Y85852D02*Y84328D01* +X95377D01* +Y85852D01* +X93853D01* +G37* +G54D43*X97155Y85090D03* +X99695D03* +X102235D03* +X64770Y92710D03* +X62230D03* +X59690D03* +G54D45*G36* +X72898Y92202D02*Y90678D01* +X74422D01* +Y92202D01* +X72898D01* +G37* +G54D43*X71120Y91440D03* +X57150Y92710D03* +G54D45*G36* +X49403Y97282D02*Y95758D01* +X50927D01* +Y97282D01* +X49403D01* +G37* +G54D43*X45085Y96520D03* +G54D45*G36* +X49403Y91567D02*Y90043D01* +X50927D01* +Y91567D01* +X49403D01* +G37* +G54D43*X45085Y90805D03* +G54D45*G36* +X48133Y85852D02*Y84328D01* +X49657D01* +Y85852D01* +X48133D01* +G37* +G54D43*X51435Y85090D03* +G54D45*G36* +X86868Y94742D02*Y93218D01* +X88392D01* +Y94742D01* +X86868D01* +G37* +G54D43*X87630Y83820D03* +X86360Y71120D03* +X88900D03* +Y78740D03* +X86360D03* +G54D45*G36* +X93853Y71882D02*Y70358D01* +X95377D01* +Y71882D01* +X93853D01* +G37* +G54D43*X97155Y71120D03* +X99695D03* +X102235D03* +Y78740D03* +X99695D03* +X97155D03* +X94615D03* +G54D45*G36* +X79248Y93472D02*Y91948D01* +X80772D01* +Y93472D01* +X79248D01* +G37* +G54D43*X80010Y90170D03* +G54D45*G36* +X100203Y97282D02*Y95758D01* +X101727D01* +Y97282D01* +X100203D01* +G37* +G54D43*X95885Y96520D03* +X102235Y92710D03* +X99695D03* +X97155D03* +X94615D03* +G54D45*G36* +X116078Y94742D02*Y93218D01* +X117602D01* +Y94742D01* +X116078D01* +G37* +G54D43*X107950Y93980D03* +G54D45*G36* +X128143Y97282D02*Y95758D01* +X129667D01* +Y97282D01* +X128143D01* +G37* +G54D43*X123825Y96520D03* +X112395Y93980D03* +X130175Y92710D03* +G54D45*G36* +X134493Y94742D02*Y93218D01* +X136017D01* +Y94742D01* +X134493D01* +G37* +G54D43*X127635Y92710D03* +X125095D03* +X122555D03* +G54D45*G36* +X107188Y80772D02*Y79248D01* +X108712D01* +Y80772D01* +X107188D01* +G37* +G54D43*X116840Y83820D03* +G54D45*G36* +X107188Y84582D02*Y83058D01* +X108712D01* +Y84582D01* +X107188D01* +G37* +G36* +X111633Y80772D02*Y79248D01* +X113157D01* +Y80772D01* +X111633D01* +G37* +G36* +X116078Y73152D02*Y71628D01* +X117602D01* +Y73152D01* +X116078D01* +G37* +G54D43*X116840Y77470D03* +G54D45*G36* +X121793Y71882D02*Y70358D01* +X123317D01* +Y71882D01* +X121793D01* +G37* +G54D43*X125095Y71120D03* +X127635D03* +X130175D03* +X132715D03* +X135255D03* +X137795D03* +X140335D03* +X142875D03* +X145415D03* +X147955D03* +Y78740D03* +X145415D03* +X142875D03* +X140335D03* +X137795D03* +X135255D03* +X132715D03* +X130175D03* +X127635D03* +X125095D03* +X122555D03* +G54D45*G36* +X138303Y84582D02*Y83058D01* +X139827D01* +Y84582D01* +X138303D01* +G37* +G54D43*X130175Y85090D03* +X135255Y83820D03* +G54D45*G36* +X111633Y84582D02*Y83058D01* +X113157D01* +Y84582D01* +X111633D01* +G37* +G36* +X121793Y85852D02*Y84328D01* +X123317D01* +Y85852D01* +X121793D01* +G37* +G54D43*X125095Y85090D03* +X127635D03* +G54D41*X168275Y97155D03* +D03* +G54D45*G36* +X164973Y92837D02*Y91313D01* +X166497D01* +Y92837D01* +X164973D01* +G37* +G54D43*X163195Y92075D03* +X165735Y89535D03* +Y86995D03* +X163195Y89535D03* +Y86995D03* +X160655Y92075D03* +Y89535D03* +Y86995D03* +X150495Y71120D03* +Y78740D03* +X153035Y71120D03* +X155575D03* +Y78740D03* +X153035D03* +X165735Y79375D03* +Y76835D03* +Y74295D03* +X163195D03* +X160655D03* +X165735Y71755D03* +X163195D03* +X160655D03* +X163195Y79375D03* +Y76835D03* +X160655Y79375D03* +Y76835D03* +X139065Y93980D03* +X142875D03* +G54D45*G36* +X153543Y97282D02*Y95758D01* +X155067D01* +Y97282D01* +X153543D01* +G37* +G54D43*X149225Y96520D03* +X155575Y92710D03* +X153035D03* +X150495D03* +X147955D03* +G54D45*G36* +X142113Y84582D02*Y83058D01* +X143637D01* +Y84582D01* +X142113D01* +G37* +G36* +X147193Y85852D02*Y84328D01* +X148717D01* +Y85852D01* +X147193D01* +G37* +G54D43*X150495Y85090D03* +X153035D03* +X155575D03* +X165735Y84455D03* +Y81915D03* +X163195Y84455D03* +Y81915D03* +X160655Y84455D03* +Y81915D03* +G54D45*G36* +X120269Y13716D02*Y11684D01* +X122301D01* +Y13716D01* +X120269D01* +G37* +G54D46*X118745Y12700D03* +X116205D03* +G54D45*G36* +X87884Y13716D02*Y11684D01* +X89916D01* +Y13716D01* +X87884D01* +G37* +G54D46*X86360Y12700D03* +X83820D03* +G54D45*G36* +X120269Y32766D02*Y30734D01* +X122301D01* +Y32766D01* +X120269D01* +G37* +G54D46*X118745Y31750D03* +X116205D03* +G54D45*G36* +X87884Y32766D02*Y30734D01* +X89916D01* +Y32766D01* +X87884D01* +G37* +G54D46*X86360Y31750D03* +X83820D03* +G54D45*G36* +X87884Y51816D02*Y49784D01* +X89916D01* +Y51816D01* +X87884D01* +G37* +G54D46*X86360Y50800D03* +X83820D03* +G54D45*G36* +X15050Y30670D02*Y29020D01* +X16700D01* +Y30670D01* +X15050D01* +G37* +G54D38*X15875Y32385D03* +G54D45*G36* +X15050Y40196D02*Y38544D01* +X16700D01* +Y40196D01* +X15050D01* +G37* +G54D38*X15875Y41910D03* +G54D41*X14605Y8585D03* +G54D45*G36* +X13208Y23622D02*Y22098D01* +X14732D01* +Y23622D01* +X13208D01* +G37* +G54D43*X13970Y18364D03* +G54D42*X16459Y17094D03* +Y24105D03* +G54D41*X14605Y97155D03* +G54D47*X19050Y84963D03* +G54D45*G36* +X15050Y49720D02*Y48070D01* +X16700D01* +Y49720D01* +X15050D01* +G37* +G54D38*X15875Y51435D03* +G54D47*X19050Y60173D03* +G54D45*G36* +X19558Y78867D02*Y77343D01* +X21082D01* +Y78867D01* +X19558D01* +G37* +G54D43*X17780Y76733D03* +X20320Y75336D03* +X17780Y73965D03* +X20320Y72568D03* +X17780Y71196D03* +X20320Y69799D03* +Y67031D03* +X17780Y68428D03* +G54D45*G36* +X54483Y60452D02*Y58928D01* +X56007D01* +Y60452D01* +X54483D01* +G37* +G36* +X54546Y66738D02*Y65342D01* +X55944D01* +Y66738D01* +X54546D01* +G37* +G36* +Y45148D02*Y43752D01* +X55944D01* +Y45148D01* +X54546D01* +G37* +G54D43*X55245Y39370D03* +X45085Y59690D03* +G54D48*Y66040D03* +Y44450D03* +G54D45*G36* +X44323Y40132D02*Y38608D01* +X45847D01* +Y40132D01* +X44323D01* +G37* +G36* +X60833Y66802D02*Y65278D01* +X62357D01* +Y66802D01* +X60833D01* +G37* +G36* +Y60452D02*Y58928D01* +X62357D01* +Y60452D01* +X60833D01* +G37* +G54D43*X64135Y59690D03* +Y66040D03* +G54D45*G36* +X80518Y66802D02*Y65278D01* +X82042D01* +Y66802D01* +X80518D01* +G37* +G54D43*X78740Y66040D03* +G54D45*G36* +X58293Y50292D02*Y48768D01* +X59817D01* +Y50292D01* +X58293D01* +G37* +G54D48*X59055Y44450D03* +G54D45*G36* +X58293Y40132D02*Y38608D01* +X59817D01* +Y40132D01* +X58293D01* +G37* +G36* +X58356Y55308D02*Y53912D01* +X59754D01* +Y55308D01* +X58356D01* +G37* +G54D43*X69215Y49530D03* +G54D45*G36* +X68516Y45148D02*Y43752D01* +X69914D01* +Y45148D01* +X68516D01* +G37* +G54D43*X69215Y39370D03* +G54D48*Y54610D03* +G54D45*G36* +X48768Y16002D02*Y14478D01* +X50292D01* +Y16002D01* +X48768D01* +G37* +G54D43*X52070Y15240D03* +X54610D03* +X57150D03* +X59690D03* +X62230D03* +X64770D03* +Y22860D03* +X62230D03* +G54D45*G36* +X70358Y85852D02*Y84328D01* +X71882D01* +Y85852D01* +X70358D01* +G37* +G54D43*X73660Y85090D03* +X62230D03* +X64770D03* +X83820Y71120D03* +Y78740D03* +X81280D03* +X78740D03* +X76200D03* +X73660D03* +G54D45*G36* +X62738Y97282D02*Y95758D01* +X64262D01* +Y97282D01* +X62738D01* +G37* +G54D43*X58420Y96520D03* +G54D45*G36* +X77978Y85852D02*Y84328D01* +X79502D01* +Y85852D01* +X77978D01* +G37* +G54D43*X81280Y85090D03* +G54D45*G36* +X44323Y78232D02*Y76708D01* +X45847D01* +Y78232D01* +X44323D01* +G37* +G54D43*X45085Y72390D03* +G54D45*G36* +X48768Y71882D02*Y70358D01* +X50292D01* +Y71882D01* +X48768D01* +G37* +G54D43*X52070Y71120D03* +X54610D03* +X57150D03* +X59690D03* +X54610Y78740D03* +G54D45*G36* +X44386Y55308D02*Y53912D01* +X45784D01* +Y55308D01* +X44386D01* +G37* +G54D43*X52070Y78740D03* +X49530D03* +G54D48*X55245Y54610D03* +G54D45*G36* +X72263Y66802D02*Y65278D01* +X73787D01* +Y66802D01* +X72263D01* +G37* +G54D43*X70485Y66040D03* +G54D45*G36* +X70358Y71882D02*Y70358D01* +X71882D01* +Y71882D01* +X70358D01* +G37* +G54D43*X73660Y71120D03* +X76200D03* +X78740D03* +X81280D03* +X62230D03* +X64770D03* +X71120Y78740D03* +X64770D03* +X62230D03* +X59690D03* +Y22860D03* +G54D45*G36* +X60833Y35052D02*Y33528D01* +X62357D01* +Y35052D01* +X60833D01* +G37* +G54D43*X57150Y78740D03* +Y22860D03* +G54D45*G36* +X44323Y50292D02*Y48768D01* +X45847D01* +Y50292D01* +X44323D01* +G37* +G54D43*X55245Y49530D03* +X54610Y22860D03* +X52070D03* +X49530D03* +G54D45*G36* +X44323Y22352D02*Y20828D01* +X45847D01* +Y22352D01* +X44323D01* +G37* +G54D43*X45085Y16510D03* +G54D45*G36* +X54483Y28702D02*Y27178D01* +X56007D01* +Y28702D01* +X54483D01* +G37* +G36* +X60833D02*Y27178D01* +X62357D01* +Y28702D01* +X60833D01* +G37* +G54D43*X64135Y27940D03* +Y34290D03* +G54D45*G36* +X54546Y34988D02*Y33592D01* +X55944D01* +Y34988D01* +X54546D01* +G37* +G54D43*X45085Y27940D03* +G54D48*Y34290D03* +G54D43*X107950Y69850D03* +G54D45*G36* +X120269Y51816D02*Y49784D01* +X122301D01* +Y51816D01* +X120269D01* +G37* +G54D46*X118745Y50800D03* +X116205D03* +G54D43*X112395Y69850D03* +G54D45*G36* +X155448Y66802D02*Y65278D01* +X156972D01* +Y66802D01* +X155448D01* +G37* +G54D43*X160655Y66675D03* +Y64135D03* +X165735Y69215D03* +X163195D03* +X160655D03* +X165735Y66675D03* +X163195D03* +Y64135D03* +Y61595D03* +X165735Y64135D03* +Y61595D03* +X160655D03* +Y59055D03* +Y56515D03* +Y53975D03* +Y51435D03* +X146050Y66040D03* +G54D45*G36* +X140843Y66802D02*Y65278D01* +X142367D01* +Y66802D01* +X140843D01* +G37* +G54D43*X131445Y66040D03* +X127000D03* +G54D45*G36* +X86233Y66802D02*Y65278D01* +X87757D01* +Y66802D01* +X86233D01* +G37* +G54D43*X97155Y66040D03* +G54D45*G36* +X110998Y66802D02*Y65278D01* +X112522D01* +Y66802D01* +X110998D01* +G37* +G54D43*X101600Y66040D03* +G54D45*G36* +X116078Y66802D02*Y65278D01* +X117602D01* +Y66802D01* +X116078D01* +G37* +G36* +X155448Y10922D02*Y9398D01* +X156972D01* +Y10922D01* +X155448D01* +G37* +G54D43*X156210Y7620D03* +G54D45*G36* +X155448Y16002D02*Y14478D01* +X156972D01* +Y16002D01* +X155448D01* +G37* +G54D43*X156210Y17780D03* +G54D41*X168275Y8585D03* +Y8255D03* +G54D45*G36* +X149733Y8382D02*Y6858D01* +X151257D01* +Y8382D01* +X149733D01* +G37* +G54D43*X150495Y12700D03* +G54D45*G36* +X139573Y13462D02*Y11938D01* +X141097D01* +Y13462D01* +X139573D01* +G37* +G54D43*X140335Y7620D03* +G54D45*G36* +X145288Y8382D02*Y6858D01* +X146812D01* +Y8382D01* +X145288D01* +G37* +G54D43*X146050Y12700D03* +X165735Y15875D03* +Y13335D03* +X163195Y15875D03* +Y13335D03* +X160655Y15875D03* +Y13335D03* +G54D45*G36* +X139065Y29210D02*Y26670D01* +X141605D01* +Y29210D01* +X139065D01* +G37* +G54D44*X150495Y27940D03* +G54D45*G36* +X139065Y53975D02*Y51435D01* +X141605D01* +Y53975D01* +X139065D01* +G37* +G54D44*X150495Y52705D03* +G54D43*X165735Y59055D03* +Y56515D03* +Y53975D03* +X163195Y59055D03* +Y56515D03* +Y53975D03* +X165735Y51435D03* +Y48895D03* +Y46355D03* +X163195Y51435D03* +Y48895D03* +X160655D03* +X165735Y41275D03* +Y38735D03* +Y36195D03* +Y33655D03* +Y31115D03* +Y28575D03* +Y26035D03* +Y23495D03* +Y20955D03* +Y18415D03* +Y43815D03* +X163195D03* +Y46355D03* +Y41275D03* +Y38735D03* +Y36195D03* +Y33655D03* +Y31115D03* +Y28575D03* +Y26035D03* +Y23495D03* +Y20955D03* +Y18415D03* +X160655Y46355D03* +Y43815D03* +Y41275D03* +Y38735D03* +Y36195D03* +Y33655D03* +Y31115D03* +Y28575D03* +Y26035D03* +Y23495D03* +Y20955D03* +Y18415D03* +G54D41*X86360Y43815D03* +G54D49*X92710Y23495D03* +X80010Y33020D03* +X91440Y46355D03* +X89535Y74295D03* +X88900Y73025D03* +X80010Y69850D03* +X82550Y63500D03* +G54D50*X91440Y67945D03* +G54D51*X126365Y10160D03* +Y36195D03* +G54D43*X138430Y15875D03* +G54D51*X94615Y10160D03* +G54D43*X101600Y21590D03* +X97790Y17780D03* +G54D46*X99695Y19685D03* +G54D41*X140335Y43815D03* +G54D52*X156210Y31115D03* +G54D41*Y47625D03* +G54D43*X153670Y15240D03* +G54D46*X140335Y17780D03* +G54D41*X150495Y40005D03* +G54D53*X135255Y4445D03* +G54D41*Y40005D03* +G54D43*X109855Y15240D03* +G54D49*X26035Y71120D03* +G54D43*X38735Y88265D03* +X40640Y85090D03* +G54D49*X26035Y75565D03* +G54D43*X47625Y76835D03* +X40640Y72390D03* +G54D49*X22225Y69850D03* +X23495Y68580D03* +X40640Y56515D03* +G54D43*X38735Y57785D03* +X45085Y62230D03* +X40640D03* +X47625Y59690D03* +G54D49*X53340Y93980D03* +G54D43*X66675Y76835D03* +Y52705D03* +G54D49*X77470Y68580D03* +X72390Y76835D03* +G54D43*X74930Y88900D03* +G54D38*X68580Y66040D03* +G54D43*X60960Y20320D03* +X57150Y24765D03* +X64135Y31750D03* +Y24765D03* +G54D49*X39370Y10795D03* +G54D43*X49530Y7620D03* +G54D49*X52070Y13335D03* +X54610Y12065D03* +X57150Y10795D03* +X39370Y34290D03* +X41910Y13335D03* +G54D51*X48260Y24765D03* +G54D49*X40640Y12065D03* +X71755Y41910D03* +G54D43*X45085Y31750D03* +X55245Y47625D03* +X57150Y29845D03* +X61595Y31750D03* +G54D42*X48260Y34290D03* +G54D43*X52705Y39370D03* +X71120Y81915D03* +G54D49*X62865Y99695D03* +G54D51*X68580Y96520D03* +G54D49*X50800Y66040D03* +Y73025D03* +G54D43*X61595Y62230D03* +G54D49*X57150Y56515D03* +Y60960D03* +G54D43*X66675Y59690D03* +G54D42*X68580Y73025D03* +G54D49*X80010Y67945D03* +X74930Y69850D03* +X100965Y67945D03* +G54D50*X98425D03* +G54D49*X93345Y80645D03* +X91440Y66040D03* +X92710Y64770D03* +G54D51*X91440Y96520D03* +G54D49*X106045Y101600D03* +X89535Y60960D03* +X87630Y67945D03* +X84455Y59690D03* +X78740Y80645D03* +X95885Y75565D03* +G54D43*X76835Y81915D03* +G54D51*X83185Y96520D03* +G54D49*X85090Y94615D03* +X128905Y68580D03* +X125095Y59690D03* +X122555Y66040D03* +X128905Y74930D03* +X150495D03* +X121920Y76200D03* +X112395Y74930D03* +X135255Y89535D03* +X95885Y83185D03* +G54D43*X132080Y86360D03* +G54D49*X94615Y66040D03* +G54D43*X97790Y62230D03* +X131445D03* +G54D49*X139065Y90805D03* +X142875Y88265D03* +X133985Y82550D03* +X135255Y81915D03* +G54D51*X153035Y64135D03* +G54D49*X143510Y63500D03* +X138430Y67310D03* +X141605Y60325D03* +X155575Y81915D03* +G54D43*X156210Y76835D03* +G54D49*X112395Y87630D03* +X121285Y98425D03* +X112395Y99695D03* +X110490Y92710D03* +X108585Y99695D03* +X102235D03* +X106045Y93980D03* +G54D51*X104140Y86360D03* +G54D43*X120015Y62230D03* +G54D49*X107950Y74930D03* +G54D43*X101600Y62230D03* +G54D48*X109855Y57785D03* +G54D49*X121285Y74930D03* +G54D43*X120015Y81915D03* +G54D49*X121285Y77470D03* +G54D43*X116840Y86360D03* +G54D48*G54D40*G54D39*G54D48*G54D39*G54D48*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D39*G54D40*G54D54*G54D39*G54D54*G54D39*G54D54*G54D39*G54D54*G54D39*G54D54*G54D39*G54D54*G54D39*G54D54*G54D39*G54D54*G54D39*G54D54*G54D39*G54D54*G54D46*G54D55*G54D54*G54D55*G54D39*G54D54*G54D39*G54D54*G54D55*G54D56*G54D57*G54D46*G54D56*G54D58*G54D46*G54D41*G54D57*G54D41*G54D39*G54D55*G54D39*G54D55*G54D39*G54D55*G54D39*G54D55*G54D39*G54D55*G54D39*G54D55*G54D54*G54D39*G54D54*G54D39*G54D54*G54D55*G54D54*G54D55*G54D39*G54D54*G54D39*G54D54*G54D39*G54D54*G54D39*G54D55*G54D39*G54D55*G54D39*G54D56*G54D39*G54D55*G54D39*G54D46*G54D54*G54D55*G54D43*G54D55*M02* diff --git a/doc/aic.topmask.gbr b/doc/aic.topmask.gbr new file mode 100644 index 0000000..7fa70cf --- /dev/null +++ b/doc/aic.topmask.gbr @@ -0,0 +1,755 @@ +G04 start of page 5 for group -4063 idx -4063 * +G04 Title: (unknown), componentmask * +G04 Creator: pcb 20140316 * +G04 CreationDate: Wed 15 Jul 2015 07:10:19 PM GMT UTC * +G04 For: fetter * +G04 Format: Gerber/RS-274X * +G04 PCB-Dimensions (mm): 180.34 104.14 * +G04 PCB-Coordinate-Origin: lower left * +%MOMM*% +%FSLAX43Y43*% +%LNTOPMASK*% +%ADD79C,2.692*% +%ADD78C,1.549*% +%ADD77C,3.708*% +%ADD76C,1.930*% +%ADD75C,1.803*% +%ADD74C,2.184*% +%ADD73C,3.200*% +%ADD72C,1.676*% +%ADD71C,0.002*% +%ADD70C,0.203*% +G54D70*X0Y104140D02*X180340D01* +X0D02*Y0D01* +X180340Y104140D02*Y0D01* +X0D02*X180340D01* +G54D71*G36* +X56312Y85928D02*Y84252D01* +X57988D01* +Y85928D01* +X56312D01* +G37* +G54D72*X59690Y85090D03* +G54D71*G36* +X93777Y85928D02*Y84252D01* +X95453D01* +Y85928D01* +X93777D01* +G37* +G54D72*X97155Y85090D03* +X99695D03* +X102235D03* +X64770Y92710D03* +X62230D03* +X59690D03* +G54D71*G36* +X72822Y92278D02*Y90602D01* +X74498D01* +Y92278D01* +X72822D01* +G37* +G54D72*X71120Y91440D03* +X57150Y92710D03* +G54D71*G36* +X49327Y97358D02*Y95682D01* +X51003D01* +Y97358D01* +X49327D01* +G37* +G54D72*X45085Y96520D03* +G54D71*G36* +X49327Y91643D02*Y89967D01* +X51003D01* +Y91643D01* +X49327D01* +G37* +G54D72*X45085Y90805D03* +G54D71*G36* +X48057Y85928D02*Y84252D01* +X49733D01* +Y85928D01* +X48057D01* +G37* +G54D72*X51435Y85090D03* +G54D71*G36* +X86792Y94818D02*Y93142D01* +X88468D01* +Y94818D01* +X86792D01* +G37* +G54D72*X87630Y83820D03* +X86360Y71120D03* +X88900D03* +Y78740D03* +X86360D03* +G54D71*G36* +X93777Y71958D02*Y70282D01* +X95453D01* +Y71958D01* +X93777D01* +G37* +G54D72*X97155Y71120D03* +X99695D03* +X102235D03* +Y78740D03* +X99695D03* +X97155D03* +X94615D03* +G54D71*G36* +X79172Y93548D02*Y91872D01* +X80848D01* +Y93548D01* +X79172D01* +G37* +G54D72*X80010Y90170D03* +G54D71*G36* +X100127Y97358D02*Y95682D01* +X101803D01* +Y97358D01* +X100127D01* +G37* +G54D72*X95885Y96520D03* +X102235Y92710D03* +X99695D03* +X97155D03* +X94615D03* +G54D71*G36* +X116002Y94818D02*Y93142D01* +X117678D01* +Y94818D01* +X116002D01* +G37* +G54D72*X107950Y93980D03* +G54D71*G36* +X128067Y97358D02*Y95682D01* +X129743D01* +Y97358D01* +X128067D01* +G37* +G54D72*X123825Y96520D03* +X112395Y93980D03* +X130175Y92710D03* +G54D71*G36* +X134417Y94818D02*Y93142D01* +X136093D01* +Y94818D01* +X134417D01* +G37* +G54D72*X127635Y92710D03* +X125095D03* +X122555D03* +G54D71*G36* +X107112Y80848D02*Y79172D01* +X108788D01* +Y80848D01* +X107112D01* +G37* +G54D72*X116840Y83820D03* +G54D71*G36* +X107112Y84658D02*Y82982D01* +X108788D01* +Y84658D01* +X107112D01* +G37* +G36* +X111557Y80848D02*Y79172D01* +X113233D01* +Y80848D01* +X111557D01* +G37* +G36* +X116002Y73228D02*Y71552D01* +X117678D01* +Y73228D01* +X116002D01* +G37* +G54D72*X116840Y77470D03* +G54D71*G36* +X121717Y71958D02*Y70282D01* +X123393D01* +Y71958D01* +X121717D01* +G37* +G54D72*X125095Y71120D03* +X127635D03* +X130175D03* +X132715D03* +X135255D03* +X137795D03* +X140335D03* +X142875D03* +X145415D03* +X147955D03* +Y78740D03* +X145415D03* +X142875D03* +X140335D03* +X137795D03* +X135255D03* +X132715D03* +X130175D03* +X127635D03* +X125095D03* +X122555D03* +G54D71*G36* +X138227Y84658D02*Y82982D01* +X139903D01* +Y84658D01* +X138227D01* +G37* +G54D72*X130175Y85090D03* +X135255Y83820D03* +G54D71*G36* +X111557Y84658D02*Y82982D01* +X113233D01* +Y84658D01* +X111557D01* +G37* +G36* +X121717Y85928D02*Y84252D01* +X123393D01* +Y85928D01* +X121717D01* +G37* +G54D72*X125095Y85090D03* +X127635D03* +G54D73*X168275Y97155D03* +D03* +G54D71*G36* +X164897Y92913D02*Y91237D01* +X166573D01* +Y92913D01* +X164897D01* +G37* +G54D72*X163195Y92075D03* +X165735Y89535D03* +Y86995D03* +X163195Y89535D03* +Y86995D03* +X160655Y92075D03* +Y89535D03* +Y86995D03* +X150495Y71120D03* +Y78740D03* +X153035Y71120D03* +X155575D03* +Y78740D03* +X153035D03* +X165735Y79375D03* +Y76835D03* +Y74295D03* +X163195D03* +X160655D03* +X165735Y71755D03* +X163195D03* +X160655D03* +X163195Y79375D03* +Y76835D03* +X160655Y79375D03* +Y76835D03* +X139065Y93980D03* +X142875D03* +G54D71*G36* +X153467Y97358D02*Y95682D01* +X155143D01* +Y97358D01* +X153467D01* +G37* +G54D72*X149225Y96520D03* +X155575Y92710D03* +X153035D03* +X150495D03* +X147955D03* +G54D71*G36* +X142037Y84658D02*Y82982D01* +X143713D01* +Y84658D01* +X142037D01* +G37* +G36* +X147117Y85928D02*Y84252D01* +X148793D01* +Y85928D01* +X147117D01* +G37* +G54D72*X150495Y85090D03* +X153035D03* +X155575D03* +X165735Y84455D03* +Y81915D03* +X163195Y84455D03* +Y81915D03* +X160655Y84455D03* +Y81915D03* +G54D71*G36* +X120193Y13792D02*Y11608D01* +X122377D01* +Y13792D01* +X120193D01* +G37* +G54D74*X118745Y12700D03* +X116205D03* +G54D71*G36* +X87808Y13792D02*Y11608D01* +X89992D01* +Y13792D01* +X87808D01* +G37* +G54D74*X86360Y12700D03* +X83820D03* +G54D71*G36* +X120193Y32842D02*Y30658D01* +X122377D01* +Y32842D01* +X120193D01* +G37* +G54D74*X118745Y31750D03* +X116205D03* +G54D71*G36* +X87808Y32842D02*Y30658D01* +X89992D01* +Y32842D01* +X87808D01* +G37* +G54D74*X86360Y31750D03* +X83820D03* +G54D71*G36* +X87808Y51892D02*Y49708D01* +X89992D01* +Y51892D01* +X87808D01* +G37* +G54D74*X86360Y50800D03* +X83820D03* +G54D71*G36* +X14973Y30747D02*Y28943D01* +X16777D01* +Y30747D01* +X14973D01* +G37* +G54D75*X15875Y32385D03* +G54D71*G36* +X14973Y40272D02*Y38468D01* +X16777D01* +Y40272D01* +X14973D01* +G37* +G54D75*X15875Y41910D03* +G54D73*X14605Y8585D03* +G54D71*G36* +X13132Y23698D02*Y22022D01* +X14808D01* +Y23698D01* +X13132D01* +G37* +G54D72*X13970Y18364D03* +G54D76*X16459Y17094D03* +Y24105D03* +G54D73*X14605Y97155D03* +G54D77*X19050Y84963D03* +G54D71*G36* +X14973Y49797D02*Y47993D01* +X16777D01* +Y49797D01* +X14973D01* +G37* +G54D75*X15875Y51435D03* +G54D77*X19050Y60173D03* +G54D71*G36* +X19482Y78943D02*Y77267D01* +X21158D01* +Y78943D01* +X19482D01* +G37* +G54D72*X17780Y76733D03* +X20320Y75336D03* +X17780Y73965D03* +X20320Y72568D03* +X17780Y71196D03* +X20320Y69799D03* +Y67031D03* +X17780Y68428D03* +G54D71*G36* +X54407Y60528D02*Y58852D01* +X56083D01* +Y60528D01* +X54407D01* +G37* +G36* +X54470Y66815D02*Y65265D01* +X56020D01* +Y66815D01* +X54470D01* +G37* +G36* +Y45225D02*Y43675D01* +X56020D01* +Y45225D01* +X54470D01* +G37* +G54D72*X55245Y39370D03* +X45085Y59690D03* +G54D78*Y66040D03* +Y44450D03* +G54D71*G36* +X44247Y40208D02*Y38532D01* +X45923D01* +Y40208D01* +X44247D01* +G37* +G36* +X60757Y66878D02*Y65202D01* +X62433D01* +Y66878D01* +X60757D01* +G37* +G36* +Y60528D02*Y58852D01* +X62433D01* +Y60528D01* +X60757D01* +G37* +G54D72*X64135Y59690D03* +Y66040D03* +G54D71*G36* +X80442Y66878D02*Y65202D01* +X82118D01* +Y66878D01* +X80442D01* +G37* +G54D72*X78740Y66040D03* +G54D71*G36* +X58217Y50368D02*Y48692D01* +X59893D01* +Y50368D01* +X58217D01* +G37* +G54D78*X59055Y44450D03* +G54D71*G36* +X58217Y40208D02*Y38532D01* +X59893D01* +Y40208D01* +X58217D01* +G37* +G36* +X58280Y55385D02*Y53835D01* +X59830D01* +Y55385D01* +X58280D01* +G37* +G54D72*X69215Y49530D03* +G54D71*G36* +X68440Y45225D02*Y43675D01* +X69990D01* +Y45225D01* +X68440D01* +G37* +G54D72*X69215Y39370D03* +G54D78*Y54610D03* +G54D71*G36* +X48692Y16078D02*Y14402D01* +X50368D01* +Y16078D01* +X48692D01* +G37* +G54D72*X52070Y15240D03* +X54610D03* +X57150D03* +X59690D03* +X62230D03* +X64770D03* +Y22860D03* +X62230D03* +G54D71*G36* +X70282Y85928D02*Y84252D01* +X71958D01* +Y85928D01* +X70282D01* +G37* +G54D72*X73660Y85090D03* +X62230D03* +X64770D03* +X83820Y71120D03* +Y78740D03* +X81280D03* +X78740D03* +X76200D03* +X73660D03* +G54D71*G36* +X62662Y97358D02*Y95682D01* +X64338D01* +Y97358D01* +X62662D01* +G37* +G54D72*X58420Y96520D03* +G54D71*G36* +X77902Y85928D02*Y84252D01* +X79578D01* +Y85928D01* +X77902D01* +G37* +G54D72*X81280Y85090D03* +G54D71*G36* +X44247Y78308D02*Y76632D01* +X45923D01* +Y78308D01* +X44247D01* +G37* +G54D72*X45085Y72390D03* +G54D71*G36* +X48692Y71958D02*Y70282D01* +X50368D01* +Y71958D01* +X48692D01* +G37* +G54D72*X52070Y71120D03* +X54610D03* +X57150D03* +X59690D03* +X54610Y78740D03* +G54D71*G36* +X44310Y55385D02*Y53835D01* +X45860D01* +Y55385D01* +X44310D01* +G37* +G54D72*X52070Y78740D03* +X49530D03* +G54D78*X55245Y54610D03* +G54D71*G36* +X72187Y66878D02*Y65202D01* +X73863D01* +Y66878D01* +X72187D01* +G37* +G54D72*X70485Y66040D03* +G54D71*G36* +X70282Y71958D02*Y70282D01* +X71958D01* +Y71958D01* +X70282D01* +G37* +G54D72*X73660Y71120D03* +X76200D03* +X78740D03* +X81280D03* +X62230D03* +X64770D03* +X71120Y78740D03* +X64770D03* +X62230D03* +X59690D03* +Y22860D03* +G54D71*G36* +X60757Y35128D02*Y33452D01* +X62433D01* +Y35128D01* +X60757D01* +G37* +G54D72*X57150Y78740D03* +Y22860D03* +G54D71*G36* +X44247Y50368D02*Y48692D01* +X45923D01* +Y50368D01* +X44247D01* +G37* +G54D72*X55245Y49530D03* +X54610Y22860D03* +X52070D03* +X49530D03* +G54D71*G36* +X44247Y22428D02*Y20752D01* +X45923D01* +Y22428D01* +X44247D01* +G37* +G54D72*X45085Y16510D03* +G54D71*G36* +X54407Y28778D02*Y27102D01* +X56083D01* +Y28778D01* +X54407D01* +G37* +G36* +X60757D02*Y27102D01* +X62433D01* +Y28778D01* +X60757D01* +G37* +G54D72*X64135Y27940D03* +Y34290D03* +G54D71*G36* +X54470Y35065D02*Y33515D01* +X56020D01* +Y35065D01* +X54470D01* +G37* +G54D72*X45085Y27940D03* +G54D78*Y34290D03* +G54D72*X107950Y69850D03* +G54D71*G36* +X120193Y51892D02*Y49708D01* +X122377D01* +Y51892D01* +X120193D01* +G37* +G54D74*X118745Y50800D03* +X116205D03* +G54D72*X112395Y69850D03* +G54D71*G36* +X155372Y66878D02*Y65202D01* +X157048D01* +Y66878D01* +X155372D01* +G37* +G54D72*X160655Y66675D03* +Y64135D03* +X165735Y69215D03* +X163195D03* +X160655D03* +X165735Y66675D03* +X163195D03* +Y64135D03* +Y61595D03* +X165735Y64135D03* +Y61595D03* +X160655D03* +Y59055D03* +Y56515D03* +Y53975D03* +Y51435D03* +X146050Y66040D03* +G54D71*G36* +X140767Y66878D02*Y65202D01* +X142443D01* +Y66878D01* +X140767D01* +G37* +G54D72*X131445Y66040D03* +X127000D03* +G54D71*G36* +X86157Y66878D02*Y65202D01* +X87833D01* +Y66878D01* +X86157D01* +G37* +G54D72*X97155Y66040D03* +G54D71*G36* +X110922Y66878D02*Y65202D01* +X112598D01* +Y66878D01* +X110922D01* +G37* +G54D72*X101600Y66040D03* +G54D71*G36* +X116002Y66878D02*Y65202D01* +X117678D01* +Y66878D01* +X116002D01* +G37* +G36* +X155372Y10998D02*Y9322D01* +X157048D01* +Y10998D01* +X155372D01* +G37* +G54D72*X156210Y7620D03* +G54D71*G36* +X155372Y16078D02*Y14402D01* +X157048D01* +Y16078D01* +X155372D01* +G37* +G54D72*X156210Y17780D03* +G54D73*X168275Y8585D03* +Y8255D03* +G54D71*G36* +X149657Y8458D02*Y6782D01* +X151333D01* +Y8458D01* +X149657D01* +G37* +G54D72*X150495Y12700D03* +G54D71*G36* +X139497Y13538D02*Y11862D01* +X141173D01* +Y13538D01* +X139497D01* +G37* +G54D72*X140335Y7620D03* +G54D71*G36* +X145212Y8458D02*Y6782D01* +X146888D01* +Y8458D01* +X145212D01* +G37* +G54D72*X146050Y12700D03* +X165735Y15875D03* +Y13335D03* +X163195Y15875D03* +Y13335D03* +X160655Y15875D03* +Y13335D03* +G54D71*G36* +X138989Y29286D02*Y26594D01* +X141681D01* +Y29286D01* +X138989D01* +G37* +G54D79*X150495Y27940D03* +G54D71*G36* +X138989Y54051D02*Y51359D01* +X141681D01* +Y54051D01* +X138989D01* +G37* +G54D79*X150495Y52705D03* +G54D72*X165735Y59055D03* +Y56515D03* +Y53975D03* +X163195Y59055D03* +Y56515D03* +Y53975D03* +X165735Y51435D03* +Y48895D03* +Y46355D03* +X163195Y51435D03* +Y48895D03* +X160655D03* +X165735Y41275D03* +Y38735D03* +Y36195D03* +Y33655D03* +Y31115D03* +Y28575D03* +Y26035D03* +Y23495D03* +Y20955D03* +Y18415D03* +Y43815D03* +X163195D03* +Y46355D03* +Y41275D03* +Y38735D03* +Y36195D03* +Y33655D03* +Y31115D03* +Y28575D03* +Y26035D03* +Y23495D03* +Y20955D03* +Y18415D03* +X160655Y46355D03* +Y43815D03* +Y41275D03* +Y38735D03* +Y36195D03* +Y33655D03* +Y31115D03* +Y28575D03* +Y26035D03* +Y23495D03* +Y20955D03* +Y18415D03* +M02* diff --git a/doc/aic.toppaste.gbr b/doc/aic.toppaste.gbr new file mode 100644 index 0000000..c5b4369 --- /dev/null +++ b/doc/aic.toppaste.gbr @@ -0,0 +1,13 @@ +G04 start of page 9 for group -4015 idx -4015 * +G04 Title: (unknown), toppaste * +G04 Creator: pcb 20140316 * +G04 CreationDate: Wed 15 Jul 2015 07:10:19 PM GMT UTC * +G04 For: fetter * +G04 Format: Gerber/RS-274X * +G04 PCB-Dimensions (mm): 180.34 104.14 * +G04 PCB-Coordinate-Origin: lower left * +%MOMM*% +%FSLAX43Y43*% +%LNTOPPASTE*% +%ADD11C,0.0100*% +M02* diff --git a/doc/aic.topsilk.gbr b/doc/aic.topsilk.gbr new file mode 100644 index 0000000..e55ae2b --- /dev/null +++ b/doc/aic.topsilk.gbr @@ -0,0 +1,1647 @@ +G04 start of page 7 for group -4079 idx -4079 * +G04 Title: (unknown), topsilk * +G04 Creator: pcb 20140316 * +G04 CreationDate: Wed 15 Jul 2015 07:10:19 PM GMT UTC * +G04 For: fetter * +G04 Format: Gerber/RS-274X * +G04 PCB-Dimensions (mm): 180.34 104.14 * +G04 PCB-Coordinate-Origin: lower left * +%MOMM*% +%FSLAX43Y43*% +%LNTOPSILK*% +%ADD93C,1.016*% +%ADD92C,0.254*% +%ADD91C,0.508*% +%ADD90C,0.203*% +G54D90*X0Y104140D02*X180340D01* +X0D02*Y0D01* +X180340Y104140D02*Y0D01* +X0D02*X180340D01* +G54D91*X113030Y22860D02*Y8890D01* +X111760Y22860D02*X113030D01* +X111760D02*Y8890D01* +X106680D02*X111760D01* +X106680Y22860D02*Y8890D01* +X105410Y22860D02*X106680D01* +X105410D02*Y6350D01* +X113030Y8890D02*X124460D01* +Y22860D02*Y8890D01* +Y22860D02*X125730D01* +Y8890D01* +X130810D01* +Y22860D02*Y8890D01* +Y22860D02*X132080D01* +Y6350D01* +X105410D02*X132080D01* +X113665Y9652D02*X123825D01* +X113665Y14224D02*Y9652D01* +Y14224D02*X123825D01* +Y9652D01* +X113665D02*X123825D01* +X113665Y11176D02*Y9652D01* +Y11176D02*X123825D01* +Y9652D01* +G54D92*X120523Y11176D02*Y9652D01* +X116967Y11176D02*Y9652D01* +G54D91*X80645Y22860D02*Y8890D01* +X79375Y22860D02*X80645D01* +X79375D02*Y8890D01* +X74295D02*X79375D01* +X74295Y22860D02*Y8890D01* +X73025Y22860D02*X74295D01* +X73025D02*Y6350D01* +X80645Y8890D02*X92075D01* +Y22860D02*Y8890D01* +Y22860D02*X93345D01* +Y8890D01* +X98425D01* +Y22860D02*Y8890D01* +Y22860D02*X99695D01* +Y6350D01* +X73025D02*X99695D01* +G54D92*X155575Y11811D02*X156845D01* +X156210Y12446D02*Y11176D01* +Y11430D02*G75*G03X156210Y11430I0J-2540D01*G01* +X151765Y12700D02*Y7620D01* +X149225Y12700D02*Y7620D01* +X151765Y12700D02*G75*G03X149225Y12700I-1270J0D01*G01* +Y7620D02*G75*G03X151765Y7620I1270J0D01*G01* +X139065Y12700D02*Y7620D01* +X141605Y12700D02*Y7620D01* +X139065D02*G75*G03X141605Y7620I1270J0D01*G01* +Y12700D02*G75*G03X139065Y12700I-1270J0D01*G01* +X155575Y13589D02*X156845D01* +X156210Y14224D02*Y12954D01* +Y13970D02*G75*G03X156210Y13970I0J2540D01*G01* +X147320Y12700D02*Y7620D01* +X144780Y12700D02*Y7620D01* +X147320Y12700D02*G75*G03X144780Y12700I-1270J0D01*G01* +Y7620D02*G75*G03X147320Y7620I1270J0D01*G01* +X55880Y83820D02*X66040D01* +Y93980D02*Y83820D01* +X55880Y93980D02*X66040D01* +X55880Y87630D02*Y83820D01* +Y93980D02*Y90170D01* +Y87630D02*G75*G03X55880Y90170I0J1270D01*G01* +X75311Y92075D02*Y90805D01* +X74676Y91440D02*X75946D01* +X74930D02*G75*G03X74930Y91440I-2540J0D01*G01* +X79375Y94361D02*X80645D01* +X80010Y94996D02*Y93726D01* +Y93980D02*G75*G03X80010Y93980I0J-2540D01*G01* +X87630D02*Y91440D01* +Y86360D02*Y83820D01* +X88468Y91440D02*Y86360D01* +X86792D02*X88468D01* +X86792Y91440D02*Y86360D01* +Y91440D02*X88468D01* +X107950Y80010D02*Y77470D01* +Y72390D02*Y69850D01* +X108788Y77470D02*Y72390D01* +X107112D02*X108788D01* +X107112Y77470D02*Y72390D01* +Y77470D02*X108788D01* +X69850Y69850D02*X90170D01* +Y80010D02*Y69850D01* +X69850Y80010D02*X90170D01* +X69850Y73660D02*Y69850D01* +Y80010D02*Y76200D01* +Y73660D02*G75*G03X69850Y76200I0J1270D01*G01* +X90373Y67716D02*Y64364D01* +X93777D02*X90373Y66040D01* +X93777Y67716D02*Y64364D01* +X90373Y66040D02*X93777Y67716D01* +Y66040D02*X97155D01* +X86995D02*X90373D01* +X93345Y69850D02*X103505D01* +Y80010D02*Y69850D01* +X93345Y80010D02*X103505D01* +X93345Y73660D02*Y69850D01* +Y80010D02*Y76200D01* +Y73660D02*G75*G03X93345Y76200I0J1270D01*G01* +X116840Y93980D02*Y91440D01* +Y86360D02*Y83820D01* +X117678Y91440D02*Y86360D01* +X116002D02*X117678D01* +X116002Y91440D02*Y86360D01* +Y91440D02*X117678D01* +X107950Y86360D02*Y83820D01* +Y93980D02*Y91440D01* +X107112D02*Y86360D01* +Y91440D02*X108788D01* +Y86360D01* +X107112D02*X108788D01* +X112395D02*Y83820D01* +Y93980D02*Y91440D01* +X111557D02*Y86360D01* +Y91440D02*X113233D01* +Y86360D01* +X111557D02*X113233D01* +X112395Y80010D02*Y77470D01* +Y72390D02*Y69850D01* +X113233Y77470D02*Y72390D01* +X111557D02*X113233D01* +X111557Y77470D02*Y72390D01* +Y77470D02*X113233D01* +X93345Y83820D02*X103505D01* +Y93980D02*Y83820D01* +X93345Y93980D02*X103505D01* +X93345Y87630D02*Y83820D01* +Y93980D02*Y90170D01* +Y87630D02*G75*G03X93345Y90170I0J1270D01*G01* +X77724Y85090D02*X76454D01* +X77089Y85725D02*Y84455D01* +X77470Y85090D02*G75*G03X77470Y85090I2540J0D01*G01* +X153670Y66040D02*X156210D01* +X146050D02*X148590D01* +Y65202D02*X153670D01* +X148590Y66878D02*Y65202D01* +Y66878D02*X153670D01* +Y65202D01* +X139065Y66040D02*X141605D01* +X131445D02*X133985D01* +Y65202D02*X139065D01* +X133985Y66878D02*Y65202D01* +Y66878D02*X139065D01* +Y65202D01* +X156083Y27940D02*X157099D01* +X134239Y28448D02*Y27432D01* +X133731Y27940D02*X134747D01* +X135255D02*G75*G03X135255Y27940I10160J0D01*G01* +G54D91*X113030Y60960D02*Y46990D01* +X111760Y60960D02*X113030D01* +X111760D02*Y46990D01* +X106680D02*X111760D01* +X106680Y60960D02*Y46990D01* +X105410Y60960D02*X106680D01* +X105410D02*Y44450D01* +X113030Y46990D02*X124460D01* +Y60960D02*Y46990D01* +Y60960D02*X125730D01* +Y46990D01* +X130810D01* +Y60960D02*Y46990D01* +Y60960D02*X132080D01* +Y44450D01* +X105410D02*X132080D01* +X113665Y47752D02*X123825D01* +X113665Y52324D02*Y47752D01* +Y52324D02*X123825D01* +Y47752D01* +X113665D02*X123825D01* +X113665Y49276D02*Y47752D01* +Y49276D02*X123825D01* +Y47752D01* +G54D92*X120523Y49276D02*Y47752D01* +X116967Y49276D02*Y47752D01* +G54D91*X113030Y41910D02*Y27940D01* +X111760Y41910D02*X113030D01* +X111760D02*Y27940D01* +X106680D02*X111760D01* +X106680Y41910D02*Y27940D01* +X105410Y41910D02*X106680D01* +X105410D02*Y25400D01* +X113030Y27940D02*X124460D01* +Y41910D02*Y27940D01* +Y41910D02*X125730D01* +Y27940D01* +X130810D01* +Y41910D02*Y27940D01* +Y41910D02*X132080D01* +Y25400D01* +X105410D02*X132080D01* +G54D92*X123825Y97790D02*X128905D01* +X123825Y95250D02*X128905D01* +X123825Y97790D02*G75*G03X123825Y95250I0J-1270D01*G01* +X128905D02*G75*G03X128905Y97790I0J1270D01*G01* +X118110Y77470D02*Y72390D01* +X115570Y77470D02*Y72390D01* +X118110Y77470D02*G75*G03X115570Y77470I-1270J0D01*G01* +Y72390D02*G75*G03X118110Y72390I1270J0D01*G01* +X156083Y52705D02*X157099D01* +X134239Y53213D02*Y52197D01* +X133731Y52705D02*X134747D01* +X135255D02*G75*G03X135255Y52705I10160J0D01*G01* +X149225Y97790D02*X154305D01* +X149225Y95250D02*X154305D01* +X149225Y97790D02*G75*G03X149225Y95250I0J-1270D01*G01* +X154305D02*G75*G03X154305Y97790I0J1270D01*G01* +X142875Y86360D02*Y83820D01* +Y93980D02*Y91440D01* +X142037D02*Y86360D01* +Y91440D02*X143713D01* +Y86360D01* +X142037D02*X143713D01* +X146685Y83820D02*X156845D01* +Y93980D02*Y83820D01* +X146685Y93980D02*X156845D01* +X146685Y87630D02*Y83820D01* +Y93980D02*Y90170D01* +Y87630D02*G75*G03X146685Y90170I0J1270D01*G01* +X116840Y66040D02*X119380D01* +X124460D02*X127000D01* +X119380Y66878D02*X124460D01* +Y65202D01* +X119380D02*X124460D01* +X119380Y66878D02*Y65202D01* +X139065Y86360D02*Y83820D01* +Y93980D02*Y91440D01* +X138227D02*Y86360D01* +Y91440D02*X139903D01* +Y86360D01* +X138227D02*X139903D01* +X121285Y69850D02*X156845D01* +Y80010D02*Y69850D01* +X121285Y80010D02*X156845D01* +X121285Y73660D02*Y69850D01* +Y80010D02*Y76200D01* +Y73660D02*G75*G03X121285Y76200I0J1270D01*G01* +Y83820D02*X131445D01* +Y93980D02*Y83820D01* +X121285Y93980D02*X131445D01* +X121285Y87630D02*Y83820D01* +Y93980D02*Y90170D01* +Y87630D02*G75*G03X121285Y90170I0J1270D01*G01* +X135255Y93980D02*Y91440D01* +Y86360D02*Y83820D01* +X136093Y91440D02*Y86360D01* +X134417D02*X136093D01* +X134417Y91440D02*Y86360D01* +Y91440D02*X136093D01* +X45085Y97790D02*X50165D01* +X45085Y95250D02*X50165D01* +X45085Y97790D02*G75*G03X45085Y95250I0J-1270D01*G01* +X50165D02*G75*G03X50165Y97790I0J1270D01*G01* +X58420D02*X63500D01* +X58420Y95250D02*X63500D01* +X58420Y97790D02*G75*G03X58420Y95250I0J-1270D01*G01* +X63500D02*G75*G03X63500Y97790I0J1270D01*G01* +X45085Y92075D02*X50165D01* +X45085Y89535D02*X50165D01* +X45085Y92075D02*G75*G03X45085Y89535I0J-1270D01*G01* +X50165D02*G75*G03X50165Y92075I0J1270D01*G01* +X68834Y85090D02*X70104D01* +X69469Y85725D02*Y84455D01* +X69850Y85090D02*G75*G03X69850Y85090I2540J0D01*G01* +X74676Y66675D02*Y65405D01* +X74041Y66040D02*X75311D01* +X74295D02*G75*G03X74295Y66040I-2540J0D01*G01* +X59309D02*X60579D01* +X59944Y66675D02*Y65405D01* +X60325Y66040D02*G75*G03X60325Y66040I2540J0D01*G01* +X59309Y59690D02*X60579D01* +X59944Y60325D02*Y59055D01* +X60325Y59690D02*G75*G03X60325Y59690I2540J0D01*G01* +X51867Y61366D02*Y58014D01* +X48463Y61366D02*X51867Y59690D01* +X48463Y61366D02*Y58014D01* +X51867Y59690D02*X48463Y58014D01* +X45085Y59690D02*X48463D01* +X51867D02*X55245D01* +X52705Y66878D02*Y65202D01* +X47625Y66878D02*X52705D01* +X47625D02*Y65202D01* +X52705D01* +X45085Y66040D02*X47625D01* +X52705D02*X55245D01* +X43815Y77470D02*Y72390D01* +X46355Y77470D02*Y72390D01* +X43815D02*G75*G03X46355Y72390I1270J0D01*G01* +Y77470D02*G75*G03X43815Y77470I-1270J0D01*G01* +X46609Y85090D02*X47879D01* +X47244Y85725D02*Y84455D01* +X47625Y85090D02*G75*G03X47625Y85090I2540J0D01*G01* +X48260Y80010D02*Y76200D01* +Y73660D02*Y69850D01* +Y80010D02*X66040D01* +Y69850D01* +X48260D02*X66040D01* +X48260Y73660D02*G75*G03X48260Y76200I0J1270D01*G01* +G54D91*X171450Y102870D02*X11430D01* +X171450Y2870D02*Y102870D01* +X11430Y2870D02*X171450D01* +X11430Y102870D02*Y2870D01* +G54D92*X109220Y66040D02*X111760D01* +X101600D02*X104140D01* +Y65202D02*X109220D01* +X104140Y66878D02*Y65202D01* +Y66878D02*X109220D01* +Y65202D01* +G54D91*X113665Y28702D02*X123825D01* +X113665Y33274D02*Y28702D01* +Y33274D02*X123825D01* +Y28702D01* +X113665D02*X123825D01* +X113665Y30226D02*Y28702D01* +Y30226D02*X123825D01* +Y28702D01* +G54D92*X120523Y30226D02*Y28702D01* +X116967Y30226D02*Y28702D01* +G54D91*X81280Y47752D02*X91440D01* +X81280Y52324D02*Y47752D01* +Y52324D02*X91440D01* +Y47752D01* +X81280D02*X91440D01* +X81280Y49276D02*Y47752D01* +Y49276D02*X91440D01* +Y47752D01* +G54D92*X88138Y49276D02*Y47752D01* +X84582Y49276D02*Y47752D01* +G54D91*X173863Y97155D02*X178435D01* +Y8255D01* +X173863D02*X178435D01* +X168148Y94107D02*Y11303D01* +X165735Y94107D02*X168148D01* +G54D92*X173863D01* +Y97155D02*Y94107D01* +G54D91*Y99695D02*Y97155D01* +X165735Y99695D02*X173863D01* +X165735D02*Y94107D01* +Y5715D02*X173863D01* +Y8255D02*Y5715D01* +G54D92*Y11303D02*Y8255D01* +X168148Y11303D02*X173863D01* +G54D91*X165735D02*X168148D01* +X165735D02*Y5715D01* +G54D93*X160655Y92075D02*X167640D01* +X160655Y89535D02*X167640D01* +X160655Y86995D02*X167640D01* +X160655Y84455D02*X167640D01* +X160655Y81915D02*X167640D01* +X160655Y79375D02*X167640D01* +X160655Y76835D02*X167640D01* +X160655Y74295D02*X167640D01* +X160655Y71755D02*X167640D01* +X160655Y69215D02*X167640D01* +X160655Y66675D02*X167640D01* +X160655Y64135D02*X167640D01* +X160655Y61595D02*X167640D01* +X160655Y59055D02*X167640D01* +X160655Y56515D02*X167640D01* +X160655Y53975D02*X167640D01* +X160655Y51435D02*X167640D01* +X160655Y48895D02*X167640D01* +X160655Y46355D02*X167640D01* +X160655Y43815D02*X167640D01* +X160655Y41275D02*X167640D01* +X160655Y38735D02*X167640D01* +X160655Y36195D02*X167640D01* +X160655Y33655D02*X167640D01* +X160655Y31115D02*X167640D01* +X160655Y28575D02*X167640D01* +X160655Y26035D02*X167640D01* +X160655Y23495D02*X167640D01* +X160655Y20955D02*X167640D01* +X160655Y18415D02*X167640D01* +X160655Y15875D02*X167640D01* +X160655Y13335D02*X167640D01* +G54D91*X81280Y28702D02*X91440D01* +X81280Y33274D02*Y28702D01* +Y33274D02*X91440D01* +Y28702D01* +X81280D02*X91440D01* +X81280Y30226D02*Y28702D01* +Y30226D02*X91440D01* +Y28702D01* +G54D92*X88138Y30226D02*Y28702D01* +X84582Y30226D02*Y28702D01* +G54D91*X81280Y9652D02*X91440D01* +X81280Y14224D02*Y9652D01* +Y14224D02*X91440D01* +Y9652D01* +X81280D02*X91440D01* +X81280Y11176D02*Y9652D01* +Y11176D02*X91440D01* +Y9652D01* +G54D92*X88138Y11176D02*Y9652D01* +X84582Y11176D02*Y9652D01* +G54D91*X80645Y41910D02*Y27940D01* +X79375Y41910D02*X80645D01* +X79375D02*Y27940D01* +X74295D02*X79375D01* +X74295Y41910D02*Y27940D01* +X73025Y41910D02*X74295D01* +X73025D02*Y25400D01* +X80645Y27940D02*X92075D01* +Y41910D02*Y27940D01* +Y41910D02*X93345D01* +Y27940D01* +X98425D01* +Y41910D02*Y27940D01* +Y41910D02*X99695D01* +Y25400D01* +X73025D02*X99695D01* +X80645Y60960D02*Y46990D01* +X79375Y60960D02*X80645D01* +X79375D02*Y46990D01* +X74295D02*X79375D01* +X74295Y60960D02*Y46990D01* +X73025Y60960D02*X74295D01* +X73025D02*Y44450D01* +X80645Y46990D02*X92075D01* +Y60960D02*Y46990D01* +Y60960D02*X93345D01* +Y46990D01* +X98425D01* +Y60960D02*Y46990D01* +Y60960D02*X99695D01* +Y44450D01* +X73025D02*X99695D01* +G54D92*X95885Y97790D02*X100965D01* +X95885Y95250D02*X100965D01* +X95885Y97790D02*G75*G03X95885Y95250I0J-1270D01*G01* +X100965D02*G75*G03X100965Y97790I0J1270D01*G01* +X48463Y51206D02*Y47854D01* +X51867D02*X48463Y49530D01* +X51867Y51206D02*Y47854D01* +X48463Y49530D02*X51867Y51206D01* +Y49530D02*X55245D01* +X45085D02*X48463D01* +X51867Y29616D02*Y26264D01* +X48463Y29616D02*X51867Y27940D01* +X48463Y29616D02*Y26264D01* +X51867Y27940D02*X48463Y26264D01* +X45085Y27940D02*X48463D01* +X51867D02*X55245D01* +X59309D02*X60579D01* +X59944Y28575D02*Y27305D01* +X60325Y27940D02*G75*G03X60325Y27940I2540J0D01*G01* +X59309Y34290D02*X60579D01* +X59944Y34925D02*Y33655D01* +X60325Y34290D02*G75*G03X60325Y34290I2540J0D01*G01* +X82931Y66675D02*Y65405D01* +X82296Y66040D02*X83566D01* +X82550D02*G75*G03X82550Y66040I-2540J0D01*G01* +X52705Y35128D02*Y33452D01* +X47625Y35128D02*X52705D01* +X47625D02*Y33452D01* +X52705D01* +X45085Y34290D02*X47625D01* +X52705D02*X55245D01* +X61595Y55448D02*Y53772D01* +X66675D01* +Y55448D02*Y53772D01* +X61595Y55448D02*X66675D01* +Y54610D02*X69215D01* +X59055D02*X61595D01* +X62433Y51206D02*Y47854D01* +X65837D02*X62433Y49530D01* +X65837Y51206D02*Y47854D01* +X62433Y49530D02*X65837Y51206D01* +Y49530D02*X69215D01* +X59055D02*X62433D01* +X52705Y45288D02*Y43612D01* +X47625Y45288D02*X52705D01* +X47625D02*Y43612D01* +X52705D01* +X45085Y44450D02*X47625D01* +X52705D02*X55245D01* +X66675Y45288D02*Y43612D01* +X61595Y45288D02*X66675D01* +X61595D02*Y43612D01* +X66675D01* +X59055Y44450D02*X61595D01* +X66675D02*X69215D01* +X62433Y41046D02*Y37694D01* +X65837D02*X62433Y39370D01* +X65837Y41046D02*Y37694D01* +X62433Y39370D02*X65837Y41046D01* +Y39370D02*X69215D01* +X59055D02*X62433D01* +X48463Y41046D02*Y37694D01* +X51867D02*X48463Y39370D01* +X51867Y41046D02*Y37694D01* +X48463Y39370D02*X51867Y41046D01* +Y39370D02*X55245D01* +X45085D02*X48463D01* +X48260Y24130D02*Y20320D01* +Y17780D02*Y13970D01* +Y24130D02*X66040D01* +Y13970D01* +X48260D02*X66040D01* +X48260Y17780D02*G75*G03X48260Y20320I0J1270D01*G01* +X43815Y21590D02*Y16510D01* +X46355Y21590D02*Y16510D01* +X43815D02*G75*G03X46355Y16510I1270J0D01*G01* +Y21590D02*G75*G03X43815Y21590I-1270J0D01*G01* +X47625Y55448D02*Y53772D01* +X52705D01* +Y55448D02*Y53772D01* +X47625Y55448D02*X52705D01* +Y54610D02*X55245D01* +X45085D02*X47625D01* +X15875Y47168D02*G75*G03X15875Y47168I0J2997D01*G01* +Y46660D02*G75*G03X15875Y46660I0J3505D01*G01* +X15875Y28118D02*G75*G03X15875Y28118I0J2997D01*G01* +Y27610D02*G75*G03X15875Y27610I0J3505D01*G01* +X15875Y37643D02*G75*G03X15875Y37643I0J2997D01*G01* +Y37135D02*G75*G03X15875Y37135I0J3505D01*G01* +G54D91*X2134Y19101D02*X11430Y18847D01* +X2134Y22098D02*Y19101D01* +X11430Y22352D02*X2134Y22098D01* +X14935Y24105D02*Y17094D01* +X11430D02*X17983D01* +X11430Y24105D02*Y17094D01* +Y24105D02*X17983D01* +X17780Y68428D02*X13208D01* +X17780Y71196D02*X13208D01* +X17780Y73965D02*X13208D01* +X17780Y76733D02*X13208D01* +X20320Y67031D02*X13208D01* +X20320Y69799D02*X13208D01* +X20320Y72568D02*X13208D01* +X20320Y75336D02*X13208D01* +X20320Y78105D02*X13208D01* +G54D92*X8128Y62967D02*Y82169D01* +G54D91*X13208Y62967D02*X8128D01* +X13208Y82169D02*Y62967D01* +X8128Y82169D02*X13208D01* +X508Y64491D02*Y80645D01* +X7366Y64491D02*X508D01* +G54D92*X7366Y80645D02*Y64491D01* +G54D91*X508Y80645D02*X7366D01* +G54D92*Y61697D02*X8128D01* +X7366Y58649D02*X8128D01* +X7366Y83439D02*X8128D01* +X7366Y86487D02*X8128D01* +X7366Y57125D02*Y88011D01* +X8128Y57125D02*X7366D01* +X8128Y88011D02*Y57125D01* +X7366Y88011D02*X8128D01* +G54D90*X18897Y34978D02*Y33962D01* +X19278Y34978D02*X19405Y34851D01* +Y34089D01* +X19278Y33962D02*X19405Y34089D01* +X18770Y33962D02*X19278D01* +X18770Y34978D02*X19278D01* +X19837Y33962D02*X20091D01* +X19964Y34978D02*Y33962D01* +X19710Y34724D02*X19964Y34978D01* +X16967Y20345D02*X17094Y20218D01* +X16586Y20345D02*X16967D01* +X16459Y20218D02*X16586Y20345D01* +X16459Y20218D02*Y19964D01* +X16586Y19837D01* +X16967D01* +X17094Y19710D01* +Y19456D01* +X16967Y19329D02*X17094Y19456D01* +X16586Y19329D02*X16967D01* +X16459Y19456D02*X16586Y19329D01* +X17526D02*X17780D01* +X17653Y20345D02*Y19329D01* +X17399Y20091D02*X17653Y20345D01* +X43767Y23495D02*X44148D01* +X43640Y23622D02*X43767Y23495D01* +X43640Y24384D02*Y23622D01* +Y24384D02*X43767Y24511D01* +X44148D01* +X44453Y24384D02*X44580Y24511D01* +X44961D01* +X45088Y24384D01* +Y24130D01* +X44453Y23495D02*X45088Y24130D01* +X44453Y23495D02*X45088D01* +X45392Y24003D02*X45900Y24511D01* +X45392Y24003D02*X46027D01* +X45900Y24511D02*Y23495D01* +X52217Y30362D02*Y29346D01* +X52598Y30362D02*X52725Y30235D01* +Y29473D01* +X52598Y29346D02*X52725Y29473D01* +X52090Y29346D02*X52598D01* +X52090Y30362D02*X52598D01* +X53410D02*X53537Y30235D01* +X53156Y30362D02*X53410D01* +X53029Y30235D02*X53156Y30362D01* +X53029Y30235D02*Y29473D01* +X53156Y29346D01* +X53410Y29854D02*X53537Y29727D01* +X53029Y29854D02*X53410D01* +X53156Y29346D02*X53410D01* +X53537Y29473D01* +Y29727D02*Y29473D01* +X64897Y29845D02*X65278D01* +X64770Y29972D02*X64897Y29845D01* +X64770Y30734D02*Y29972D01* +Y30734D02*X64897Y30861D01* +X65278D01* +X65583Y30734D02*X65710Y30861D01* +X66091D01* +X66218Y30734D01* +Y30480D01* +X65583Y29845D02*X66218Y30480D01* +X65583Y29845D02*X66218D01* +X66523Y30861D02*X67031D01* +X66523D02*Y30353D01* +X66650Y30480D01* +X66904D01* +X67031Y30353D01* +Y29972D01* +X66904Y29845D02*X67031Y29972D01* +X66650Y29845D02*X66904D01* +X66523Y29972D02*X66650Y29845D01* +X85870Y26864D02*Y26102D01* +Y26864D02*X85997Y26991D01* +X86251D01* +X86378Y26864D01* +Y26102D01* +X86251Y25975D02*X86378Y26102D01* +X85997Y25975D02*X86251D01* +X85870Y26102D02*X85997Y25975D01* +X86124Y26229D02*X86378Y25975D01* +X86683Y26483D02*X87191Y26991D01* +X86683Y26483D02*X87318D01* +X87191Y26991D02*Y25975D01* +X118485Y7914D02*Y7152D01* +Y7914D02*X118612Y8041D01* +X118866D01* +X118993Y7914D01* +Y7152D01* +X118866Y7025D02*X118993Y7152D01* +X118612Y7025D02*X118866D01* +X118485Y7152D02*X118612Y7025D01* +X118739Y7279D02*X118993Y7025D01* +X119425D02*X119679D01* +X119552Y8041D02*Y7025D01* +X119298Y7787D02*X119552Y8041D01* +X85870Y8041D02*Y7152D01* +X85997Y7025D01* +X86251D01* +X86378Y7152D01* +Y8041D02*Y7152D01* +X86810Y7025D02*X87064D01* +X86937Y8041D02*Y7025D01* +X86683Y7787D02*X86937Y8041D01* +X118350Y26864D02*Y26102D01* +Y26864D02*X118477Y26991D01* +X118731D01* +X118858Y26864D01* +Y26102D01* +X118731Y25975D02*X118858Y26102D01* +X118477Y25975D02*X118731D01* +X118350Y26102D02*X118477Y25975D01* +X118604Y26229D02*X118858Y25975D01* +X119163Y26991D02*X119671D01* +X119163D02*Y26483D01* +X119290Y26610D01* +X119544D01* +X119671Y26483D01* +Y26102D01* +X119544Y25975D02*X119671Y26102D01* +X119290Y25975D02*X119544D01* +X119163Y26102D02*X119290Y25975D01* +X158352Y11320D02*X158733D01* +X158225Y11447D02*X158352Y11320D01* +X158225Y12209D02*Y11447D01* +Y12209D02*X158352Y12336D01* +X158733D01* +X159165Y11320D02*X159419D01* +X159292Y12336D02*Y11320D01* +X159038Y12082D02*X159292Y12336D01* +X158537Y19000D02*X158918D01* +X158410Y19127D02*X158537Y19000D01* +X158410Y19889D02*Y19127D01* +Y19889D02*X158537Y20016D01* +X158918D01* +X159223Y19889D02*X159350Y20016D01* +X159604D01* +X159731Y19889D01* +Y19127D01* +X159604Y19000D02*X159731Y19127D01* +X159350Y19000D02*X159604D01* +X159223Y19127D02*X159350Y19000D01* +Y19508D02*X159731D01* +X149710Y14572D02*X150091D01* +X149583Y14699D02*X149710Y14572D01* +X149583Y15461D02*Y14699D01* +Y15461D02*X149710Y15588D01* +X150091D01* +X150396Y15461D02*X150523Y15588D01* +X150904D01* +X151031Y15461D01* +Y15207D01* +X150396Y14572D02*X151031Y15207D01* +X150396Y14572D02*X151031D01* +X145480Y14287D02*X145861D01* +X145353Y14414D02*X145480Y14287D01* +X145353Y15176D02*Y14414D01* +Y15176D02*X145480Y15303D01* +X145861D01* +X146547D02*X146674Y15176D01* +X146293Y15303D02*X146547D01* +X146166Y15176D02*X146293Y15303D01* +X146166Y15176D02*Y14414D01* +X146293Y14287D01* +X146547Y14795D02*X146674Y14668D01* +X146166Y14795D02*X146547D01* +X146293Y14287D02*X146547D01* +X146674Y14414D01* +Y14668D02*Y14414D01* +X144272Y27305D02*X144653D01* +X144145Y27432D02*X144272Y27305D01* +X144145Y28194D02*Y27432D01* +Y28194D02*X144272Y28321D01* +X144653D01* +X144958Y28194D02*X145085Y28321D01* +X145466D01* +X145593Y28194D01* +Y27940D01* +X144958Y27305D02*X145593Y27940D01* +X144958Y27305D02*X145593D01* +X145898Y28194D02*X146025Y28321D01* +X146406D01* +X146533Y28194D01* +Y27940D01* +X145898Y27305D02*X146533Y27940D01* +X145898Y27305D02*X146533D01* +X139627Y14365D02*X140008D01* +X139500Y14492D02*X139627Y14365D01* +X139500Y15254D02*Y14492D01* +Y15254D02*X139627Y15381D01* +X140008D01* +X140313Y14873D02*X140821Y15381D01* +X140313Y14873D02*X140948D01* +X140821Y15381D02*Y14365D01* +X50800Y19304D02*Y18415D01* +X50927Y18288D01* +X51181D01* +X51308Y18415D01* +Y19304D02*Y18415D01* +X51740Y18288D02*X51994D01* +X51867Y19304D02*Y18288D01* +X51613Y19050D02*X51867Y19304D01* +X52299Y18415D02*X52426Y18288D01* +X52299Y19177D02*Y18415D01* +Y19177D02*X52426Y19304D01* +X52680D01* +X52807Y19177D01* +Y18415D01* +X52680Y18288D02*X52807Y18415D01* +X52426Y18288D02*X52680D01* +X52299Y18542D02*X52807Y19050D01* +X18907Y54018D02*Y53002D01* +X19288Y54018D02*X19415Y53891D01* +Y53129D01* +X19288Y53002D02*X19415Y53129D01* +X18780Y53002D02*X19288D01* +X18780Y54018D02*X19288D01* +X19720Y53891D02*X19847Y54018D01* +X20101D01* +X20228Y53891D01* +Y53129D01* +X20101Y53002D02*X20228Y53129D01* +X19847Y53002D02*X20101D01* +X19720Y53129D02*X19847Y53002D01* +Y53510D02*X20228D01* +X19152Y44748D02*Y43732D01* +X19533Y44748D02*X19660Y44621D01* +Y43859D01* +X19533Y43732D02*X19660Y43859D01* +X19025Y43732D02*X19533D01* +X19025Y44748D02*X19533D01* +X19965Y44621D02*X20092Y44748D01* +X20473D01* +X20600Y44621D01* +Y44367D01* +X19965Y43732D02*X20600Y44367D01* +X19965Y43732D02*X20600D01* +X52502Y62352D02*Y61336D01* +X52883Y62352D02*X53010Y62225D01* +Y61463D01* +X52883Y61336D02*X53010Y61463D01* +X52375Y61336D02*X52883D01* +X52375Y62352D02*X52883D01* +X53315D02*X53823D01* +X53315D02*Y61844D01* +X53442Y61971D01* +X53696D01* +X53823Y61844D01* +Y61463D01* +X53696Y61336D02*X53823Y61463D01* +X53442Y61336D02*X53696D01* +X53315Y61463D02*X53442Y61336D01* +X52918Y68250D02*X53426D01* +X53553Y68123D01* +Y67869D01* +X53426Y67742D02*X53553Y67869D01* +X53045Y67742D02*X53426D01* +X53045Y68250D02*Y67234D01* +Y67742D02*X53553Y67234D01* +X53985D02*X54239D01* +X54112Y68250D02*Y67234D01* +X53858Y67996D02*X54112Y68250D01* +X54543Y67742D02*X55051Y68250D01* +X54543Y67742D02*X55178D01* +X55051Y68250D02*Y67234D01* +X44402Y79375D02*X44783D01* +X44275Y79502D02*X44402Y79375D01* +X44275Y80264D02*Y79502D01* +Y80264D02*X44402Y80391D01* +X44783D01* +X45088Y80264D02*X45215Y80391D01* +X45596D01* +X45723Y80264D01* +Y80010D01* +X45088Y79375D02*X45723Y80010D01* +X45088Y79375D02*X45723D01* +X46028Y79502D02*X46155Y79375D01* +X46028Y80264D02*Y79502D01* +Y80264D02*X46155Y80391D01* +X46409D01* +X46536Y80264D01* +Y79502D01* +X46409Y79375D02*X46536Y79502D01* +X46155Y79375D02*X46409D01* +X46028Y79629D02*X46536Y80137D01* +X50800Y75184D02*Y74295D01* +X50927Y74168D01* +X51181D01* +X51308Y74295D01* +Y75184D02*Y74295D01* +X51613Y74168D02*X52121Y74676D01* +Y75057D02*Y74676D01* +X51994Y75184D02*X52121Y75057D01* +X51740Y75184D02*X51994D01* +X51613Y75057D02*X51740Y75184D01* +X51613Y75057D02*Y74803D01* +X51740Y74676D01* +X52121D01* +X64982Y61660D02*X65363D01* +X64855Y61787D02*X64982Y61660D01* +X64855Y62549D02*Y61787D01* +Y62549D02*X64982Y62676D01* +X65363D01* +X65668Y62549D02*X65795Y62676D01* +X66176D01* +X66303Y62549D01* +Y62295D01* +X65668Y61660D02*X66303Y62295D01* +X65668Y61660D02*X66303D01* +X66734D02*X66988D01* +X66861Y62676D02*Y61660D01* +X66607Y62422D02*X66861Y62676D01* +X66562Y51662D02*Y50646D01* +X66943Y51662D02*X67070Y51535D01* +Y50773D01* +X66943Y50646D02*X67070Y50773D01* +X66435Y50646D02*X66943D01* +X66435Y51662D02*X66943D01* +X67375Y50773D02*X67502Y50646D01* +X67375Y51027D02*Y50773D01* +Y51027D02*X67502Y51154D01* +X67756D01* +X67883Y51027D01* +Y50773D01* +X67756Y50646D02*X67883Y50773D01* +X67502Y50646D02*X67756D01* +X67375Y51281D02*X67502Y51154D01* +X67375Y51535D02*Y51281D01* +Y51535D02*X67502Y51662D01* +X67756D01* +X67883Y51535D01* +Y51281D01* +X67756Y51154D02*X67883Y51281D01* +X14852Y79926D02*X15233D01* +Y79037D01* +X15106Y78910D02*X15233Y79037D01* +X14979Y78910D02*X15106D01* +X14852Y79037D02*X14979Y78910D01* +X15665D02*X15919D01* +X15792Y79926D02*Y78910D01* +X15538Y79672D02*X15792Y79926D01* +X52518Y46900D02*X53026D01* +X53153Y46773D01* +Y46519D01* +X53026Y46392D02*X53153Y46519D01* +X52645Y46392D02*X53026D01* +X52645Y46900D02*Y45884D01* +Y46392D02*X53153Y45884D01* +X53585D02*X53839D01* +X53712Y46900D02*Y45884D01* +X53458Y46646D02*X53712Y46900D01* +X54143Y46011D02*X54270Y45884D01* +X54143Y46265D02*Y46011D01* +Y46265D02*X54270Y46392D01* +X54524D01* +X54651Y46265D01* +Y46011D01* +X54524Y45884D02*X54651Y46011D01* +X54270Y45884D02*X54524D01* +X54143Y46519D02*X54270Y46392D01* +X54143Y46773D02*Y46519D01* +Y46773D02*X54270Y46900D01* +X54524D01* +X54651Y46773D01* +Y46519D01* +X54524Y46392D02*X54651Y46519D01* +X52457Y41423D02*Y40407D01* +X52838Y41423D02*X52965Y41296D01* +Y40534D01* +X52838Y40407D02*X52965Y40534D01* +X52330Y40407D02*X52838D01* +X52330Y41423D02*X52838D01* +X53269Y40407D02*X53777Y40915D01* +Y41296D02*Y40915D01* +X53650Y41423D02*X53777Y41296D01* +X53396Y41423D02*X53650D01* +X53269Y41296D02*X53396Y41423D01* +X53269Y41296D02*Y41042D01* +X53396Y40915D01* +X53777D01* +X52518Y57150D02*X53026D01* +X53153Y57023D01* +Y56769D01* +X53026Y56642D02*X53153Y56769D01* +X52645Y56642D02*X53026D01* +X52645Y57150D02*Y56134D01* +Y56642D02*X53153Y56134D01* +X53585D02*X53839D01* +X53712Y57150D02*Y56134D01* +X53458Y56896D02*X53712Y57150D01* +X54525D02*X54652Y57023D01* +X54271Y57150D02*X54525D01* +X54144Y57023D02*X54271Y57150D01* +X54144Y57023D02*Y56261D01* +X54271Y56134D01* +X54525Y56642D02*X54652Y56515D01* +X54144Y56642D02*X54525D01* +X54271Y56134D02*X54525D01* +X54652Y56261D01* +Y56515D02*Y56261D01* +X52592Y51673D02*Y50657D01* +X52973Y51673D02*X53100Y51546D01* +Y50784D01* +X52973Y50657D02*X53100Y50784D01* +X52465Y50657D02*X52973D01* +X52465Y51673D02*X52973D01* +X53405Y50657D02*X54040Y51292D01* +Y51673D02*Y51292D01* +X53405Y51673D02*X54040D01* +X52673Y36410D02*X53181D01* +X53308Y36283D01* +Y36029D01* +X53181Y35902D02*X53308Y36029D01* +X52800Y35902D02*X53181D01* +X52800Y36410D02*Y35394D01* +Y35902D02*X53308Y35394D01* +X53740D02*X53994D01* +X53867Y36410D02*Y35394D01* +X53613Y36156D02*X53867Y36410D01* +X54299D02*X54807D01* +X54299D02*Y35902D01* +X54426Y36029D01* +X54680D01* +X54807Y35902D01* +Y35521D01* +X54680Y35394D02*X54807Y35521D01* +X54426Y35394D02*X54680D01* +X54299Y35521D02*X54426Y35394D01* +X66697Y41482D02*Y40466D01* +X67078Y41482D02*X67205Y41355D01* +Y40593D01* +X67078Y40466D02*X67205Y40593D01* +X66570Y40466D02*X67078D01* +X66570Y41482D02*X67078D01* +X67637Y40466D02*X67891D01* +X67764Y41482D02*Y40466D01* +X67510Y41228D02*X67764Y41482D01* +X68195Y40593D02*X68322Y40466D01* +X68195Y41355D02*Y40593D01* +Y41355D02*X68322Y41482D01* +X68576D01* +X68703Y41355D01* +Y40593D01* +X68576Y40466D02*X68703Y40593D01* +X68322Y40466D02*X68576D01* +X68195Y40720D02*X68703Y41228D01* +X65047Y35980D02*X65428D01* +X64920Y36107D02*X65047Y35980D01* +X64920Y36869D02*Y36107D01* +Y36869D02*X65047Y36996D01* +X65428D01* +X65733Y36869D02*X65860Y36996D01* +X66241D01* +X66368Y36869D01* +Y36615D01* +X65733Y35980D02*X66368Y36615D01* +X65733Y35980D02*X66368D01* +X66672Y36869D02*X66799Y36996D01* +X67053D01* +X67180Y36869D01* +Y36107D01* +X67053Y35980D02*X67180Y36107D01* +X66799Y35980D02*X67053D01* +X66672Y36107D02*X66799Y35980D01* +Y36488D02*X67180D01* +X65532Y67310D02*X65913D01* +X65405Y67437D02*X65532Y67310D01* +X65405Y68199D02*Y67437D01* +Y68199D02*X65532Y68326D01* +X65913D01* +X66345Y67310D02*X66599D01* +X66472Y68326D02*Y67310D01* +X66218Y68072D02*X66472Y68326D01* +X66904Y67310D02*X67412Y67818D01* +Y68199D02*Y67818D01* +X67285Y68326D02*X67412Y68199D01* +X67031Y68326D02*X67285D01* +X66904Y68199D02*X67031Y68326D01* +X66904Y68199D02*Y67945D01* +X67031Y67818D01* +X67412D01* +X153903Y68640D02*X154411D01* +X154538Y68513D01* +Y68259D01* +X154411Y68132D02*X154538Y68259D01* +X154030Y68132D02*X154411D01* +X154030Y68640D02*Y67624D01* +Y68132D02*X154538Y67624D01* +X154843Y68132D02*X155351Y68640D01* +X154843Y68132D02*X155478D01* +X155351Y68640D02*Y67624D01* +X138873Y68640D02*X139381D01* +X139508Y68513D01* +Y68259D01* +X139381Y68132D02*X139508Y68259D01* +X139000Y68132D02*X139381D01* +X139000Y68640D02*Y67624D01* +Y68132D02*X139508Y67624D01* +X139813Y68640D02*X140321D01* +X139813D02*Y68132D01* +X139940Y68259D01* +X140194D01* +X140321Y68132D01* +Y67751D01* +X140194Y67624D02*X140321Y67751D01* +X139940Y67624D02*X140194D01* +X139813Y67751D02*X139940Y67624D01* +X109353Y68775D02*X109861D01* +X109988Y68648D01* +Y68394D01* +X109861Y68267D02*X109988Y68394D01* +X109480Y68267D02*X109861D01* +X109480Y68775D02*Y67759D01* +Y68267D02*X109988Y67759D01* +X110293Y68648D02*X110420Y68775D01* +X110674D01* +X110801Y68648D01* +Y67886D01* +X110674Y67759D02*X110801Y67886D01* +X110420Y67759D02*X110674D01* +X110293Y67886D02*X110420Y67759D01* +Y68267D02*X110801D01* +X124453Y68440D02*X124961D01* +X125088Y68313D01* +Y68059D01* +X124961Y67932D02*X125088Y68059D01* +X124580Y67932D02*X124961D01* +X124580Y68440D02*Y67424D01* +Y67932D02*X125088Y67424D01* +X125393Y68313D02*X125520Y68440D01* +X125901D01* +X126028Y68313D01* +Y68059D01* +X125393Y67424D02*X126028Y68059D01* +X125393Y67424D02*X126028D01* +X82507Y67510D02*X82888D01* +X82380Y67637D02*X82507Y67510D01* +X82380Y68399D02*Y67637D01* +Y68399D02*X82507Y68526D01* +X82888D01* +X83320Y67510D02*X83574D01* +X83447Y68526D02*Y67510D01* +X83193Y68272D02*X83447Y68526D01* +X83879Y68399D02*X84006Y68526D01* +X84387D01* +X84514Y68399D01* +Y68145D01* +X83879Y67510D02*X84514Y68145D01* +X83879Y67510D02*X84514D01* +X107258Y81990D02*X107766D01* +X107893Y81863D01* +Y81609D01* +X107766Y81482D02*X107893Y81609D01* +X107385Y81482D02*X107766D01* +X107385Y81990D02*Y80974D01* +Y81482D02*X107893Y80974D01* +X108579Y81990D02*X108706Y81863D01* +X108325Y81990D02*X108579D01* +X108198Y81863D02*X108325Y81990D01* +X108198Y81863D02*Y81101D01* +X108325Y80974D01* +X108579Y81482D02*X108706Y81355D01* +X108198Y81482D02*X108579D01* +X108325Y80974D02*X108579D01* +X108706Y81101D01* +Y81355D02*Y81101D01* +X94412Y67462D02*Y66446D01* +X94793Y67462D02*X94920Y67335D01* +Y66573D01* +X94793Y66446D02*X94920Y66573D01* +X94285Y66446D02*X94793D01* +X94285Y67462D02*X94793D01* +X95225Y66954D02*X95733Y67462D01* +X95225Y66954D02*X95860D01* +X95733Y67462D02*Y66446D01* +X115862Y78895D02*X116243D01* +X115735Y79022D02*X115862Y78895D01* +X115735Y79784D02*Y79022D01* +Y79784D02*X115862Y79911D01* +X116243D01* +X116548Y79022D02*X116675Y78895D01* +X116548Y79276D02*Y79022D01* +Y79276D02*X116675Y79403D01* +X116929D01* +X117056Y79276D01* +Y79022D01* +X116929Y78895D02*X117056Y79022D01* +X116675Y78895D02*X116929D01* +X116548Y79530D02*X116675Y79403D01* +X116548Y79784D02*Y79530D01* +Y79784D02*X116675Y79911D01* +X116929D01* +X117056Y79784D01* +Y79530D01* +X116929Y79403D02*X117056Y79530D01* +X111758Y81935D02*X112266D01* +X112393Y81808D01* +Y81554D01* +X112266Y81427D02*X112393Y81554D01* +X111885Y81427D02*X112266D01* +X111885Y81935D02*Y80919D01* +Y81427D02*X112393Y80919D01* +X112698D02*X113333Y81554D01* +Y81935D02*Y81554D01* +X112698Y81935D02*X113333D01* +X96520Y75311D02*Y74422D01* +X96647Y74295D01* +X96901D01* +X97028Y74422D01* +Y75311D02*Y74422D01* +X97333Y75184D02*X97460Y75311D01* +X97841D01* +X97968Y75184D01* +Y74930D01* +X97333Y74295D02*X97968Y74930D01* +X97333Y74295D02*X97968D01* +X85870Y45814D02*Y45052D01* +Y45814D02*X85997Y45941D01* +X86251D01* +X86378Y45814D01* +Y45052D01* +X86251Y44925D02*X86378Y45052D01* +X85997Y44925D02*X86251D01* +X85870Y45052D02*X85997Y44925D01* +X86124Y45179D02*X86378Y44925D01* +X86683Y45814D02*X86810Y45941D01* +X87191D01* +X87318Y45814D01* +Y45560D01* +X86683Y44925D02*X87318Y45560D01* +X86683Y44925D02*X87318D01* +X118485Y45949D02*Y45187D01* +Y45949D02*X118612Y46076D01* +X118866D01* +X118993Y45949D01* +Y45187D01* +X118866Y45060D02*X118993Y45187D01* +X118612Y45060D02*X118866D01* +X118485Y45187D02*X118612Y45060D01* +X118739Y45314D02*X118993Y45060D01* +X119298Y45949D02*X119425Y46076D01* +X119679D01* +X119806Y45949D01* +Y45187D01* +X119679Y45060D02*X119806Y45187D01* +X119425Y45060D02*X119679D01* +X119298Y45187D02*X119425Y45060D01* +Y45568D02*X119806D01* +X123825Y75184D02*Y74295D01* +X123952Y74168D01* +X124206D01* +X124333Y74295D01* +Y75184D02*Y74295D01* +X124638Y74168D02*X125273Y74803D01* +Y75184D02*Y74803D01* +X124638Y75184D02*X125273D01* +X66638Y47105D02*X67146D01* +X67273Y46978D01* +Y46724D01* +X67146Y46597D02*X67273Y46724D01* +X66765Y46597D02*X67146D01* +X66765Y47105D02*Y46089D01* +Y46597D02*X67273Y46089D01* +X67704D02*X67958D01* +X67831Y47105D02*Y46089D01* +X67577Y46851D02*X67831Y47105D01* +X68263Y46089D02*X68771Y46597D01* +Y46978D02*Y46597D01* +X68644Y47105D02*X68771Y46978D01* +X68390Y47105D02*X68644D01* +X68263Y46978D02*X68390Y47105D01* +X68263Y46978D02*Y46724D01* +X68390Y46597D01* +X68771D01* +X66718Y57140D02*X67226D01* +X67353Y57013D01* +Y56759D01* +X67226Y56632D02*X67353Y56759D01* +X66845Y56632D02*X67226D01* +X66845Y57140D02*Y56124D01* +Y56632D02*X67353Y56124D01* +X67785D02*X68039D01* +X67912Y57140D02*Y56124D01* +X67658Y56886D02*X67912Y57140D01* +X68344Y56124D02*X68979Y56759D01* +Y57140D02*Y56759D01* +X68344Y57140D02*X68979D01* +X144907Y52070D02*X145288D01* +X144780Y52197D02*X144907Y52070D01* +X144780Y52959D02*Y52197D01* +Y52959D02*X144907Y53086D01* +X145288D01* +X145720Y52070D02*X145974D01* +X145847Y53086D02*Y52070D01* +X145593Y52832D02*X145847Y53086D01* +X146279Y52197D02*X146406Y52070D01* +X146279Y52451D02*Y52197D01* +Y52451D02*X146406Y52578D01* +X146660D01* +X146787Y52451D01* +Y52197D01* +X146660Y52070D02*X146787Y52197D01* +X146406Y52070D02*X146660D01* +X146279Y52705D02*X146406Y52578D01* +X146279Y52959D02*Y52705D01* +Y52959D02*X146406Y53086D01* +X146660D01* +X146787Y52959D01* +Y52705D01* +X146660Y52578D02*X146787Y52705D01* +X138308Y96475D02*X138816D01* +X138943Y96348D01* +Y96094D01* +X138816Y95967D02*X138943Y96094D01* +X138435Y95967D02*X138816D01* +X138435Y96475D02*Y95459D01* +Y95967D02*X138943Y95459D01* +X139248Y95586D02*X139375Y95459D01* +X139248Y95840D02*Y95586D01* +Y95840D02*X139375Y95967D01* +X139629D01* +X139756Y95840D01* +Y95586D01* +X139629Y95459D02*X139756Y95586D01* +X139375Y95459D02*X139629D01* +X139248Y96094D02*X139375Y95967D01* +X139248Y96348D02*Y96094D01* +Y96348D02*X139375Y96475D01* +X139629D01* +X139756Y96348D01* +Y96094D01* +X139629Y95967D02*X139756Y96094D01* +X150577Y98125D02*X150958D01* +X150450Y98252D02*X150577Y98125D01* +X150450Y99014D02*Y98252D01* +Y99014D02*X150577Y99141D01* +X150958D01* +X151390Y98125D02*X151644D01* +X151517Y99141D02*Y98125D01* +X151263Y98887D02*X151517Y99141D01* +X151948D02*X152456D01* +X151948D02*Y98633D01* +X152075Y98760D01* +X152329D01* +X152456Y98633D01* +Y98252D01* +X152329Y98125D02*X152456Y98252D01* +X152075Y98125D02*X152329D01* +X151948Y98252D02*X152075Y98125D01* +X162433Y96012D02*X163195D01* +Y94234D01* +X162941Y93980D02*X163195Y94234D01* +X162687Y93980D02*X162941D01* +X162433Y94234D02*X162687Y93980D01* +X163805Y95758D02*X164059Y96012D01* +X164821D01* +X165075Y95758D01* +Y95250D01* +X163805Y93980D02*X165075Y95250D01* +X163805Y93980D02*X165075D01* +X125112Y98125D02*X125493D01* +X124985Y98252D02*X125112Y98125D01* +X124985Y99014D02*Y98252D01* +Y99014D02*X125112Y99141D01* +X125493D01* +X125925Y98125D02*X126179D01* +X126052Y99141D02*Y98125D01* +X125798Y98887D02*X126052Y99141D01* +X126484Y98633D02*X126992Y99141D01* +X126484Y98633D02*X127119D01* +X126992Y99141D02*Y98125D01* +X134288Y96295D02*X134796D01* +X134923Y96168D01* +Y95914D01* +X134796Y95787D02*X134923Y95914D01* +X134415Y95787D02*X134796D01* +X134415Y96295D02*Y95279D01* +Y95787D02*X134923Y95279D01* +X135355D02*X135609D01* +X135482Y96295D02*Y95279D01* +X135228Y96041D02*X135482Y96295D01* +X135914Y95406D02*X136041Y95279D01* +X135914Y96168D02*Y95406D01* +Y96168D02*X136041Y96295D01* +X136295D01* +X136422Y96168D01* +Y95406D01* +X136295Y95279D02*X136422Y95406D01* +X136041Y95279D02*X136295D01* +X135914Y95533D02*X136422Y96041D01* +X141808Y96164D02*X142316D01* +X142443Y96037D01* +Y95783D01* +X142316Y95656D02*X142443Y95783D01* +X141935Y95656D02*X142316D01* +X141935Y96164D02*Y95148D01* +Y95656D02*X142443Y95148D01* +X142748D02*X143256Y95656D01* +Y96037D02*Y95656D01* +X143129Y96164D02*X143256Y96037D01* +X142875Y96164D02*X143129D01* +X142748Y96037D02*X142875Y96164D01* +X142748Y96037D02*Y95783D01* +X142875Y95656D01* +X143256D01* +X123825Y89281D02*Y88392D01* +X123952Y88265D01* +X124206D01* +X124333Y88392D01* +Y89281D02*Y88392D01* +X124638Y88773D02*X125146Y89281D01* +X124638Y88773D02*X125273D01* +X125146Y89281D02*Y88265D01* +X149225Y89154D02*Y88265D01* +X149352Y88138D01* +X149606D01* +X149733Y88265D01* +Y89154D02*Y88265D01* +X150038Y89027D02*X150165Y89154D01* +X150419D01* +X150546Y89027D01* +Y88265D01* +X150419Y88138D02*X150546Y88265D01* +X150165Y88138D02*X150419D01* +X150038Y88265D02*X150165Y88138D01* +Y88646D02*X150546D01* +X115788Y96380D02*X116296D01* +X116423Y96253D01* +Y95999D01* +X116296Y95872D02*X116423Y95999D01* +X115915Y95872D02*X116296D01* +X115915Y96380D02*Y95364D01* +Y95872D02*X116423Y95364D01* +X116854D02*X117108D01* +X116981Y96380D02*Y95364D01* +X116727Y96126D02*X116981Y96380D01* +X117413Y96253D02*X117540Y96380D01* +X117794D01* +X117921Y96253D01* +Y95491D01* +X117794Y95364D02*X117921Y95491D01* +X117540Y95364D02*X117794D01* +X117413Y95491D02*X117540Y95364D01* +Y95872D02*X117921D01* +X106748Y96010D02*X107256D01* +X107383Y95883D01* +Y95629D01* +X107256Y95502D02*X107383Y95629D01* +X106875Y95502D02*X107256D01* +X106875Y96010D02*Y94994D01* +Y95502D02*X107383Y94994D01* +X107815D02*X108069D01* +X107942Y96010D02*Y94994D01* +X107688Y95756D02*X107942Y96010D01* +X108501Y94994D02*X108755D01* +X108628Y96010D02*Y94994D01* +X108374Y95756D02*X108628Y96010D01* +X111308Y96145D02*X111816D01* +X111943Y96018D01* +Y95764D01* +X111816Y95637D02*X111943Y95764D01* +X111435Y95637D02*X111816D01* +X111435Y96145D02*Y95129D01* +Y95637D02*X111943Y95129D01* +X112375D02*X112629D01* +X112502Y96145D02*Y95129D01* +X112248Y95891D02*X112502Y96145D01* +X112933Y96018D02*X113060Y96145D01* +X113441D01* +X113568Y96018D01* +Y95764D01* +X112933Y95129D02*X113568Y95764D01* +X112933Y95129D02*X113568D01* +X97552Y98125D02*X97933D01* +X97425Y98252D02*X97552Y98125D01* +X97425Y99014D02*Y98252D01* +Y99014D02*X97552Y99141D01* +X97933D01* +X98238Y98125D02*X98746Y98633D01* +Y99014D02*Y98633D01* +X98619Y99141D02*X98746Y99014D01* +X98365Y99141D02*X98619D01* +X98238Y99014D02*X98365Y99141D01* +X98238Y99014D02*Y98760D01* +X98365Y98633D01* +X98746D01* +X95885Y89154D02*Y88265D01* +X96012Y88138D01* +X96266D01* +X96393Y88265D01* +Y89154D02*Y88265D01* +X96698Y89154D02*X97206D01* +X96698D02*Y88646D01* +X96825Y88773D01* +X97079D01* +X97206Y88646D01* +Y88265D01* +X97079Y88138D02*X97206Y88265D01* +X96825Y88138D02*X97079D01* +X96698Y88265D02*X96825Y88138D01* +X86693Y96465D02*X87201D01* +X87328Y96338D01* +Y96084D01* +X87201Y95957D02*X87328Y96084D01* +X86820Y95957D02*X87201D01* +X86820Y96465D02*Y95449D01* +Y95957D02*X87328Y95449D01* +X87760D02*X88014D01* +X87887Y96465D02*Y95449D01* +X87633Y96211D02*X87887Y96465D01* +X75057Y86360D02*X75438D01* +X74930Y86487D02*X75057Y86360D01* +X74930Y87249D02*Y86487D01* +Y87249D02*X75057Y87376D01* +X75438D01* +X75743Y86360D02*X76378Y86995D01* +Y87376D02*Y86995D01* +X75743Y87376D02*X76378D01* +X74612Y67455D02*X74993D01* +X74485Y67582D02*X74612Y67455D01* +X74485Y68344D02*Y67582D01* +Y68344D02*X74612Y68471D01* +X74993D01* +X75425Y67455D02*X75679D01* +X75552Y68471D02*Y67455D01* +X75298Y68217D02*X75552Y68471D01* +X76111Y67455D02*X76365D01* +X76238Y68471D02*Y67455D01* +X75984Y68217D02*X76238Y68471D01* +X72390Y75184D02*Y74295D01* +X72517Y74168D01* +X72771D01* +X72898Y74295D01* +Y75184D02*Y74295D01* +X73584Y75184D02*X73711Y75057D01* +X73330Y75184D02*X73584D01* +X73203Y75057D02*X73330Y75184D01* +X73203Y75057D02*Y74295D01* +X73330Y74168D01* +X73584Y74676D02*X73711Y74549D01* +X73203Y74676D02*X73584D01* +X73330Y74168D02*X73584D01* +X73711Y74295D01* +Y74549D02*Y74295D01* +X58420Y89154D02*Y88265D01* +X58547Y88138D01* +X58801D01* +X58928Y88265D01* +Y89154D02*Y88265D01* +X59233D02*X59360Y88138D01* +X59233Y88519D02*Y88265D01* +Y88519D02*X59360Y88646D01* +X59614D01* +X59741Y88519D01* +Y88265D01* +X59614Y88138D02*X59741Y88265D01* +X59360Y88138D02*X59614D01* +X59233Y88773D02*X59360Y88646D01* +X59233Y89027D02*Y88773D01* +Y89027D02*X59360Y89154D01* +X59614D01* +X59741Y89027D01* +Y88773D01* +X59614Y88646D02*X59741Y88773D01* +X46712Y98290D02*X47093D01* +X46585Y98417D02*X46712Y98290D01* +X46585Y99179D02*Y98417D01* +Y99179D02*X46712Y99306D01* +X47093D01* +X47398Y99179D02*X47525Y99306D01* +X47906D01* +X48033Y99179D01* +Y98925D01* +X47398Y98290D02*X48033Y98925D01* +X47398Y98290D02*X48033D01* +X48719Y99306D02*X48846Y99179D01* +X48465Y99306D02*X48719D01* +X48338Y99179D02*X48465Y99306D01* +X48338Y99179D02*Y98417D01* +X48465Y98290D01* +X48719Y98798D02*X48846Y98671D01* +X48338Y98798D02*X48719D01* +X48465Y98290D02*X48719D01* +X48846Y98417D01* +Y98671D02*Y98417D01* +X46712Y92575D02*X47093D01* +X46585Y92702D02*X46712Y92575D01* +X46585Y93464D02*Y92702D01* +Y93464D02*X46712Y93591D01* +X47093D01* +X47398Y93464D02*X47525Y93591D01* +X47906D01* +X48033Y93464D01* +Y93210D01* +X47398Y92575D02*X48033Y93210D01* +X47398Y92575D02*X48033D01* +X48338D02*X48973Y93210D01* +Y93591D02*Y93210D01* +X48338Y93591D02*X48973D01* +X60047Y98290D02*X60428D01* +X59920Y98417D02*X60047Y98290D01* +X59920Y99179D02*Y98417D01* +Y99179D02*X60047Y99306D01* +X60428D01* +X60860Y98290D02*X61114D01* +X60987Y99306D02*Y98290D01* +X60733Y99052D02*X60987Y99306D01* +X61419Y98290D02*X62054Y98925D01* +Y99306D02*Y98925D01* +X61419Y99306D02*X62054D01* +X52182Y87415D02*X52563D01* +X52055Y87542D02*X52182Y87415D01* +X52055Y88304D02*Y87542D01* +Y88304D02*X52182Y88431D01* +X52563D01* +X52995Y87415D02*X53249D01* +X53122Y88431D02*Y87415D01* +X52868Y88177D02*X53122Y88431D01* +X53935D02*X54062Y88304D01* +X53681Y88431D02*X53935D01* +X53554Y88304D02*X53681Y88431D01* +X53554Y88304D02*Y87542D01* +X53681Y87415D01* +X53935Y87923D02*X54062Y87796D01* +X53554Y87923D02*X53935D01* +X53681Y87415D02*X53935D01* +X54062Y87542D01* +Y87796D02*Y87542D01* +X74262Y93935D02*X74643D01* +X74135Y94062D02*X74262Y93935D01* +X74135Y94824D02*Y94062D01* +Y94824D02*X74262Y94951D01* +X74643D01* +X75075Y93935D02*X75329D01* +X75202Y94951D02*Y93935D01* +X74948Y94697D02*X75202Y94951D01* +X75634Y94824D02*X75761Y94951D01* +X76015D01* +X76142Y94824D01* +Y94062D01* +X76015Y93935D02*X76142Y94062D01* +X75761Y93935D02*X76015D01* +X75634Y94062D02*X75761Y93935D01* +Y94443D02*X76142D01* +X81232Y93920D02*X81613D01* +X81105Y94047D02*X81232Y93920D01* +X81105Y94809D02*Y94047D01* +Y94809D02*X81232Y94936D01* +X81613D01* +X82045Y93920D02*X82299D01* +X82172Y94936D02*Y93920D01* +X81918Y94682D02*X82172Y94936D01* +X82604Y94047D02*X82731Y93920D01* +X82604Y94809D02*Y94047D01* +Y94809D02*X82731Y94936D01* +X82985D01* +X83112Y94809D01* +Y94047D01* +X82985Y93920D02*X83112Y94047D01* +X82731Y93920D02*X82985D01* +X82604Y94174D02*X83112Y94682D01* +X82677Y86360D02*X83058D01* +X82550Y86487D02*X82677Y86360D01* +X82550Y87249D02*Y86487D01* +Y87249D02*X82677Y87376D01* +X83058D01* +X83363D02*X83871D01* +X83363D02*Y86868D01* +X83490Y86995D01* +X83744D01* +X83871Y86868D01* +Y86487D01* +X83744Y86360D02*X83871Y86487D01* +X83490Y86360D02*X83744D01* +X83363Y86487D02*X83490Y86360D01* +M02* diff --git a/doc/aic.xy b/doc/aic.xy new file mode 100644 index 0000000..2968b2a --- /dev/null +++ b/doc/aic.xy @@ -0,0 +1,9 @@ +D3,"LED5","GREEN",625.00,1975.00,90,top +C7,"RCY100P","1uFx16V",2850.00,3350.00,0,top +R6,"ACY400","470",4250.00,2950.00,270,top +Q4,"TO220W","unknown",3400.00,1250.00,270,top +D5,"Axial diode (pin 1 is cathode)","ALF400",1975.00,2350.00,0,top +C11,"Bottom lead polar circular component (typically capacitor)","RCY100P",2825.00,2600.00,180,top +R14,"Axial non-polar component (typically resistor or capacitor),","ACY400",1975.00,2600.00,180,top +D1,"LED5","RED",625.00,1225.00,90,top +U8,"DIP8","unknown",2400.00,3500.00,90,top diff --git a/doc/aicpic.pdf b/doc/aicpic.pdf index d04b4971d83c79b2bd4edfe62be22a96559130d0..c17afaae2f951a04bdf1e0eccaf028807d9ac265 100644 GIT binary patch delta 14317 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 diff --git a/doc/aicpic.sch b/doc/aicpic.sch index 9204294..e6d36f1 100644 --- a/doc/aicpic.sch +++ b/doc/aicpic.sch @@ -1,4 +1,4 @@ -v 20100214 2 +v 20130925 2 C 1000 73500 0 0 0 title-A2.sym N 18300 87300 18600 87300 4 N 18300 84100 18600 84100 4 @@ -89,13 +89,13 @@ N 10200 78900 10700 78900 4 N 10700 78900 10700 78800 4 N 8500 79400 8500 78900 4 C 6400 86500 1 0 0 gnd-1.sym -C 8600 87600 1 0 0 resistor-1.sym +C 8400 87600 1 0 0 resistor-1.sym { -T 9000 87900 5 10 1 1 0 0 1 +T 8800 87900 5 10 1 1 0 0 1 refdes=R2 -T 9000 87400 5 10 1 1 0 0 1 +T 8800 87400 5 10 1 1 0 0 1 value=2k2 -T 8600 87600 5 10 0 1 0 0 1 +T 8400 87600 5 10 0 1 0 0 1 footprint=ACY400 } C 8200 87700 1 90 0 resistor-1.sym @@ -107,34 +107,34 @@ value=10k T 8200 87700 5 10 0 1 0 0 1 footprint=ACY400 } -N 7600 87700 8600 87700 4 +N 7600 87700 8400 87700 4 N 8100 87700 8100 87000 4 N 8100 87000 7600 87000 4 N 6500 87700 6600 87700 4 N 6500 86800 6500 87700 4 -C 10800 84200 1 0 0 osc-2.sym +C 10000 84200 1 0 0 osc-2.sym { -T 11300 84900 5 10 1 1 0 0 1 +T 10500 84900 5 10 1 1 0 0 1 device=OSC -T 10600 84900 5 10 1 1 0 0 1 +T 9800 84900 5 10 1 1 0 0 1 refdes=U2 -T 11000 84000 5 10 1 1 0 0 1 +T 10200 84000 5 10 1 1 0 0 1 value=6MHz } -N 12000 84500 13900 84500 4 +N 11200 84500 13900 84500 4 { -T 12100 84600 5 10 1 1 0 0 1 +T 11200 84600 5 10 1 1 0 0 1 netname=CLOCK } -N 9500 87700 13900 87700 4 -C 11000 86000 1 0 0 input-2.sym +N 9300 87700 13900 87700 4 +C 10500 86000 1 0 0 input-2.sym { -T 11500 86100 5 10 1 1 0 7 1 +T 11000 86100 5 10 1 1 0 7 1 value=REFPOS -T 11000 86000 5 10 0 1 0 0 1 +T 10500 86000 5 10 0 1 0 0 1 net=REFPOS:1 } -N 12400 86100 13900 86100 4 +N 11900 86100 13900 86100 4 C 7300 85200 1 0 0 input-2.sym { T 7800 85300 5 10 1 1 0 7 1 @@ -182,7 +182,7 @@ T 19300 74500 9 10 1 0 0 0 1 Departamento de Engenharia Eletrica N 18300 86900 22100 86900 4 N 18300 86500 22100 86500 4 -N 12400 86500 13900 86500 4 +N 11900 86500 13900 86500 4 C 20900 85400 1 90 0 resistor-1.sym { T 21400 86100 5 10 1 1 180 0 1 @@ -227,7 +227,7 @@ C 8300 79400 1 0 0 5V-plus-1.sym T 8300 79400 5 10 0 1 0 0 1 net=+5V:1 } -C 7900 88600 1 0 0 5V-plus-1.sym +C 7900 89500 1 0 0 5V-plus-1.sym C 9100 86800 1 0 0 5V-plus-1.sym N 13600 82900 13900 82900 4 C 13400 82900 1 0 0 5V-plus-1.sym @@ -241,7 +241,7 @@ Actuador Interface Card - dsPIC & RS232 & CAN Interfaces T 17300 73900 9 10 1 0 0 0 1 aicpic.sch T 21200 73900 9 10 1 0 0 0 1 -2.2.0 +2.4.0 T 22200 73600 9 6 1 0 0 0 3 Walter Fetter Lages Diego Caberlon Santini @@ -336,13 +336,13 @@ N 19200 77000 19000 77000 4 N 19000 77000 19000 77400 4 N 18300 76700 18300 78600 4 N 18300 78600 18100 78600 4 -C 23000 77400 1 180 0 resistor-1.sym +C 22200 77400 1 180 0 resistor-1.sym { -T 22400 77500 5 10 1 1 0 0 1 +T 21600 77500 5 10 1 1 0 0 1 refdes=R11 -T 22400 77000 5 10 1 1 0 0 1 +T 21600 77000 5 10 1 1 0 0 1 value=2k2 -T 23000 77400 5 10 0 1 180 6 1 +T 22200 77400 5 10 0 1 180 6 1 footprint=ACY400 } C 21600 78300 1 0 1 6n137-1.sym @@ -456,10 +456,10 @@ N 20800 86300 20800 86900 4 N 22000 86300 22000 86500 4 N 6700 87000 6500 87000 4 N 18300 83300 22700 83300 4 -N 22700 83300 22700 78900 4 +N 22700 75400 22700 83300 4 N 22700 78900 22500 78900 4 N 18300 83700 23200 83700 4 -N 23200 76700 23200 83700 4 +N 23200 75100 23200 83700 4 N 10800 83700 13900 83700 4 N 10800 83700 10800 82600 4 N 10800 82600 8200 82600 4 @@ -574,11 +574,11 @@ net=DRVB:1 T 23000 86500 5 10 1 1 0 1 1 value=DRVB } -C 12400 86600 1 180 0 output-2.sym +C 11900 86600 1 180 0 output-2.sym { -T 11500 86400 5 10 0 0 180 0 1 +T 11000 86400 5 10 0 0 180 0 1 net=BRAKE:1 -T 11500 86500 5 10 1 1 180 1 1 +T 11000 86500 5 10 1 1 180 1 1 value=BRAKE } C 7600 74700 1 90 0 capacitor-1.sym @@ -653,12 +653,12 @@ value=/SD } N 18300 85300 18900 85300 4 N 18900 85300 18900 84000 4 -N 21200 77300 22100 77300 4 +N 21200 77300 21300 77300 4 N 21200 76700 23200 76700 4 N 19300 79500 19600 79500 4 N 19600 79500 19600 79200 4 N 21200 77000 21200 77400 4 -N 23000 77300 23200 77300 4 +N 22200 77300 23200 77300 4 C 19600 85400 1 90 0 capacitor-1.sym { T 19300 86100 5 10 1 1 180 0 1 @@ -682,3 +682,27 @@ N 20200 86500 20200 86300 4 C 19300 85100 1 0 0 gnd-1.sym C 20100 85100 1 0 0 gnd-1.sym C 18500 87000 1 0 0 gnd-1.sym +C 7900 89500 1 270 0 diode-1.sym +{ +T 8500 89100 5 10 0 0 270 0 1 +device=DIODE +T 8500 89100 5 10 1 1 0 0 1 +refdes=D11 +T 8300 88700 5 10 1 1 0 0 1 +value=1N4148 +} +C 10800 74900 1 0 0 connector5-1.sym +{ +T 12600 76400 5 10 0 0 0 0 1 +device=CONNECTOR_5 +T 10900 76600 5 10 1 1 0 0 1 +refdes=J3 +T 10800 74600 5 10 1 1 0 0 1 +value=ICSP +} +N 23200 75100 12500 75100 4 +N 22700 75400 12500 75400 4 +N 12500 75700 13000 75700 4 +N 13000 75700 13000 74500 4 +C 12900 74200 1 0 0 gnd-1.sym +N 12500 76300 12500 87700 4 diff --git a/doc/attribs b/doc/attribs index bbe801d..2786dbe 100644 --- a/doc/attribs +++ b/doc/attribs @@ -1,3 +1,7 @@ device value footprint +midx +midy +rotation + diff --git a/lib/Makefile b/lib/Makefile index 1669d93..98930d4 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -46,4 +46,4 @@ clean: rm -f *.o *~ distclean:clean - rm -f libdebug.a libaicio.a libcanlib.a libwdt.a \ No newline at end of file + rm -f libdebug.a libaicio.a libcanlib.a libwdt.a diff --git a/test/README b/test/README new file mode 100644 index 0000000..1649a39 --- /dev/null +++ b/test/README @@ -0,0 +1,21 @@ +dsPICtest: blinks D2 using internal RC (7.37 MHz) as OSC. + +dsPICAICtest: blinks D2 using AICs crystal oscilator (6 MHz) as OSC. + +freertostest: blinks D2 using internal RC (7.37 MHz) as OSC and a FreeRTOS +task. + +freertosAICtest: blinks D2 and D3 using AICs crystal oscilator (6 MHz) as +OSC and FreeRTOS tasks. + +serialtest: sends test string and size of variables through the RS232 +Interface. 19200 bps. + +braketest: turns on and off the brake. + +pwmtest: + +cantest +encodertest +motortest + diff --git a/test/braketest/Makefile b/test/braketest/Makefile index 1a97440..a579c6a 100644 --- a/test/braketest/Makefile +++ b/test/braketest/Makefile @@ -14,4 +14,7 @@ clean: rm -f *.o braketest *~ distclean:clean - rm -f braketest.hex \ No newline at end of file + rm -f braketest.hex + +burn: braketest.hex + usburn -S ICSP -F 30 -w -I $^ diff --git a/test/braketest/braketest.c b/test/braketest/braketest.c index da6c2f5..6a23eff 100644 --- a/test/braketest/braketest.c +++ b/test/braketest/braketest.c @@ -40,7 +40,7 @@ #endif /*---------------------------------------------------------------------------*/ -_FOSC(EC_PLL16 & CSW_FSCM_OFF); //Config OSC to internal RC osc 7.37MHz +_FOSC(EC_PLL16 & CSW_FSCM_OFF); _FWDT(WDT_OFF); _FBORPOR(MCLR_EN & RST_IOPIN & PBOR_OFF & PWRT_64); /*---------------------------------------------------------------------------*/ diff --git a/test/dsPICAICtest/Makefile b/test/dsPICAICtest/Makefile index f46467b..e76f5ed 100644 --- a/test/dsPICAICtest/Makefile +++ b/test/dsPICAICtest/Makefile @@ -15,4 +15,7 @@ clean: rm -f *.o dspicaictest *~ distclean:clean - rm -f dspicaictest.hex \ No newline at end of file + rm -f dspicaictest.hex + +burn: dspicaictest.hex + usburn -S ICSP -F 30 -w -I $^ diff --git a/test/dsPICAICtest/dspicaictest.c b/test/dsPICAICtest/dspicaictest.c index 8401f37..e7225cd 100644 --- a/test/dsPICAICtest/dspicaictest.c +++ b/test/dsPICAICtest/dspicaictest.c @@ -30,6 +30,7 @@ /*---------------------------------------------------------------------------*/ _FOSC(EC_PLL16 & CSW_FSCM_OFF); +//_FOSC(FRC & CSW_FSCM_OFF); _FWDT(WDT_OFF); _FBORPOR(MCLR_EN & RST_IOPIN & PBOR_OFF & PWRT_64); /*---------------------------------------------------------------------------*/ diff --git a/test/dsPICtest/Makefile b/test/dsPICtest/Makefile index d025730..7cff6b6 100644 --- a/test/dsPICtest/Makefile +++ b/test/dsPICtest/Makefile @@ -15,4 +15,7 @@ clean: rm -f *.o dspictest *~ distclean:clean - rm -f dspictest.hex \ No newline at end of file + rm -f dspictest.hex + +burn: dspictest.hex + usburn -S ICSP -F 30 -w -I $^ diff --git a/test/dsPICtest/dspictest.c b/test/dsPICtest/dspictest.c index 02f922e..62a25af 100644 --- a/test/dsPICtest/dspictest.c +++ b/test/dsPICtest/dspictest.c @@ -1,8 +1,8 @@ /****************************************************************************** Actuator Interface Card - dsPIC30F4012 testM - Copyright (C) 2008 Diego Caberlon Santini M + dsPIC30F4012 test + Copyright (C) 2008 Diego Caberlon Santini This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/test/encodertest/Makefile b/test/encodertest/Makefile index 27b8715..da89e89 100644 --- a/test/encodertest/Makefile +++ b/test/encodertest/Makefile @@ -14,4 +14,7 @@ clean: rm -f *.o encodertest *~ distclean:clean - rm -f encodertest.hex \ No newline at end of file + rm -f encodertest.hex + +burn: encodertest.hex + usburn -S ICSP -F 30 -w -I $^ diff --git a/test/encodertest/encodertest.c b/test/encodertest/encodertest.c index 5a9a3b0..14fadc4 100644 --- a/test/encodertest/encodertest.c +++ b/test/encodertest/encodertest.c @@ -53,10 +53,11 @@ int main(int argc,char *argv[]) long encoder; float fencoder; + serial_init(); sprintf(buff,"Encoder Test Begin, compiled at %s %s\n",__DATE__,__TIME__); - printd(buff); + printd(buff); delay(50); encoder_initialize(0x0,2048); diff --git a/test/freertosAICtest/FreeRTOSConfig.h b/test/freertosAICtest/FreeRTOSConfig.h index 1091a26..64f4fe0 100644 --- a/test/freertosAICtest/FreeRTOSConfig.h +++ b/test/freertosAICtest/FreeRTOSConfig.h @@ -60,8 +60,8 @@ #define configUSE_PREEMPTION 1 #define configUSE_IDLE_HOOK 0 #define configUSE_TICK_HOOK 0 -#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) /*1 ms*/ -#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 24000000 ) /* Fosc / 4 = 24MHz*/ +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 24000000) /* Fosc / 4 = 24MHz*/ #define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 4 ) #define configMINIMAL_STACK_SIZE ( 105 ) #define configTOTAL_HEAP_SIZE ( ( size_t ) 5120/4 ) diff --git a/test/freertosAICtest/Makefile b/test/freertosAICtest/Makefile index 47c47d1..80aacaf 100644 --- a/test/freertosAICtest/Makefile +++ b/test/freertosAICtest/Makefile @@ -9,13 +9,18 @@ freertosAICtest:freertosAICtest.o $(OSOBJS) $(CC) $(CPU) $^ -o $@ $(CCLIBDIR) -Wl $(CCGLD) freertosAICtest.o:freertosAICtest.c - $(CC) $(CPU) -x c -c $^ $(CCINCDIR) $(OSINCDIR) $(CCFLAGS) $(OSFLAGS) + $(CC) -MMD $(CPU) -c $^ $(CCINCDIR) $(OSINCDIR) $(CCFLAGS) $(OSFLAGS) + +-include freertosAICtest.d $(OSOBJS):$(OSFILES) - for i in $(OSFILES); do $(CC) $(CPU) -x c -c $$i $(CCINCDIR) $(OSINCDIR) $(CCFLAGS) $(OSFLAGS) ; done + for i in $(OSFILES); do $(CC) -MMD $(CPU) -c $$i $(CCINCDIR) $(OSINCDIR) $(CCFLAGS) $(OSFLAGS) ; done clean: - rm -f *.o freertosAICtest *~ + rm -f *.o freertosAICtest *~ *.d distclean:clean - rm -f freertosAICtest.hex \ No newline at end of file + rm -f freertosAICtest.hex + +burn: freertosAICtest.hex + usburn -S ICSP -F 30 -w -I $^ diff --git a/test/freertosAICtest/freertosAICtest.c b/test/freertosAICtest/freertosAICtest.c index 5897461..b60007e 100644 --- a/test/freertosAICtest/freertosAICtest.c +++ b/test/freertosAICtest/freertosAICtest.c @@ -25,6 +25,7 @@ 2008.06.12 -> Start FreeRTOS test to AIC-2.0.0 by Diego Caberlon Santini from Demos apps. ******************************************************************************* */ + #include /* Scheduler includes. */ @@ -32,97 +33,71 @@ #include "task.h" #include "queue.h" #include "croutine.h" -/*---------------------------------------------------------------------------*/ - -#define mainLED_TAKS_STACK_SIZE ( configMINIMAL_STACK_SIZE) - -#define mainLED_TASK_PRIORITY1 ( tskIDLE_PRIORITY + 3 ) -/* The execution period of the check task. */ -#define mainLED_TASK_PERIOD1 ( ( portTickType ) 1000 / portTICK_RATE_MS ) +#define TAKS_STACK_SIZE configMINIMAL_STACK_SIZE -#define mainLED_TASK_PRIORITY2 ( tskIDLE_PRIORITY + 2 ) +#define TASK_PRIORITY1 (tskIDLE_PRIORITY + 3) +#define TASK_PERIOD1 ((portTickType) 500 / portTICK_RATE_MS) -/* The execution period of the check task. */ -#define mainLED_TASK_PERIOD2 ( ( portTickType ) 2000 / portTICK_RATE_MS ) -/*---------------------------------------------------------------------------*/ +#define TASK_PRIORITY2 (tskIDLE_PRIORITY + 2) +#define TASK_PERIOD2 ((portTickType ) 1000 / portTICK_RATE_MS) _FOSC(EC_PLL16 & CSW_FSCM_OFF); _FWDT(WDT_OFF); _FBORPOR(MCLR_EN & RST_IOPIN & PBOR_OFF & PWRT_64); -/*---------------------------------------------------------------------------*/ -/** Blink port RE0 mainLED_TASK_PERIOD1 (1s) +/** Blink port RE0 TASK_PERIOD1 (1 s) */ -static void vLEDTask1( void *pvParameters ); - -/** Blink port RE0 mainLED_TASK_PERIOD2 (2s) - */ -static void vLEDTask2( void *pvParameters ); - -/*---------------------------------------------------------------------------*/ - -/* - * Create the demo tasks then start the scheduler. - */ -int main( void ) -{ - - TRISE=0x00; - - /* Create the test tasks defined within this file. */ - xTaskCreate( vLEDTask1, ( signed portCHAR * ) "LED1", mainLED_TAKS_STACK_SIZE, NULL, mainLED_TASK_PRIORITY1, NULL ); - - xTaskCreate( vLEDTask2, ( signed portCHAR * ) "LED2", mainLED_TAKS_STACK_SIZE, NULL, mainLED_TASK_PRIORITY2, NULL ); - - /* Finally start the scheduler. */ - vTaskStartScheduler(); - - /* Will only reach here if there is insufficient heap available to start - the scheduler. */ - return 0; -} -/*---------------------------------------------------------------------------*/ - -static void vLEDTask1( void *pvParameters ) +static void vLEDTask1(void *pvParameters) { -/* Used to wake the task at the correct frequency. */ -portTickType xLastExecutionTime; + /* Used to wake the task at the correct frequency. */ + portTickType xLastExecutionTime; /* Initialise xLastExecutionTime so the first call to vTaskDelayUntil() works correctly. */ - xLastExecutionTime = xTaskGetTickCount(); + xLastExecutionTime=xTaskGetTickCount(); for(;;) { /* Wait until it is time for the next cycle. */ - vTaskDelayUntil( &xLastExecutionTime, mainLED_TASK_PERIOD1 ); - PORTE = PORTE^0x01; - - /* Has an error been found in any of the standard demo tasks? */ - + vTaskDelayUntil(&xLastExecutionTime,TASK_PERIOD1); + PORTE=PORTE^0x1; } } -/*---------------------------------------------------------------------------*/ -static void vLEDTask2( void *pvParameters ) +/** Blink port RE0 TASK_PERIOD2 (2s) + */ +static void vLEDTask2(void *pvParameters) { /* Used to wake the task at the correct frequency. */ portTickType xLastExecutionTime; /* Initialise xLastExecutionTime so the first call to vTaskDelayUntil() works correctly. */ - xLastExecutionTime = xTaskGetTickCount(); + xLastExecutionTime=xTaskGetTickCount(); for(;;) { /* Wait until it is time for the next cycle. */ - vTaskDelayUntil( &xLastExecutionTime, mainLED_TASK_PERIOD2 ); - PORTE = PORTE^0x02; - - /* Has an error been found in any of the standard demo tasks? */ - + vTaskDelayUntil(&xLastExecutionTime,TASK_PERIOD2); + PORTE=PORTE^0x02; } } -/*---------------------------------------------------------------------------*/ +/* + * Create the demo tasks then start the scheduler. + */ +int main(void) +{ + TRISE=0x00; // Set port RE as output + + xTaskCreate(vLEDTask1,(signed portCHAR *) "LED1",TAKS_STACK_SIZE,NULL,TASK_PRIORITY1,NULL); + + xTaskCreate(vLEDTask2,(signed portCHAR *) "LED2",TAKS_STACK_SIZE,NULL,TASK_PRIORITY2,NULL); + + vTaskStartScheduler(); + + /* Will only reach here if there is insufficient heap available to start + the scheduler. */ + return 0; +} diff --git a/test/freertostest/Makefile b/test/freertostest/Makefile index c1f3600..5c0659c 100644 --- a/test/freertostest/Makefile +++ b/test/freertostest/Makefile @@ -9,13 +9,16 @@ freertostest:freertostest.o $(OSOBJS) $(CC) $(CPU) $^ -o $@ $(CCLIBDIR) -Wl $(CCGLD) freertostest.o:freertostest.c - $(CC) $(CPU) -x c -c $^ $(CCINCDIR) $(OSINCDIR) $(CCFLAGS) $(OSFLAGS) + $(CC) $(CPU) -c $^ $(CCINCDIR) $(OSINCDIR) $(CCFLAGS) $(OSFLAGS) $(OSOBJS):$(OSFILES) - for i in $(OSFILES); do $(CC) $(CPU) -x c -c $$i $(CCINCDIR) $(OSINCDIR) $(CCFLAGS) $(OSFLAGS) ; done + for i in $(OSFILES); do $(CC) $(CPU) -c $$i $(CCINCDIR) $(OSINCDIR) $(CCFLAGS) $(OSFLAGS) ; done clean: rm -f *.o freertostest *~ distclean:clean - rm -f freertostest.hex \ No newline at end of file + rm -f freertostest.hex + +burn: freertostest.hex + usburn -S ICSP -F 30 -w -I $^ diff --git a/test/freertostest/freertostest.c b/test/freertostest/freertostest.c index c6b9795..b4520ae 100644 --- a/test/freertostest/freertostest.c +++ b/test/freertostest/freertostest.c @@ -39,7 +39,7 @@ #define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) /* The execution period of the check task. */ -#define mainCHECK_TASK_PERIOD ( ( portTickType ) 5 / portTICK_RATE_MS ) +#define mainCHECK_TASK_PERIOD ( ( portTickType ) 500 / portTICK_RATE_MS ) /*---------------------------------------------------------------------------*/ // _FOSC(EC_PLL16 & CSW_FSCM_OFF); @@ -48,7 +48,7 @@ _FWDT(WDT_OFF); _FBORPOR(MCLR_EN & RST_IOPIN & PBOR_OFF & PWRT_64); /*---------------------------------------------------------------------------*/ -/** Blink port RE0 (10ms) +/** Blink port RE0 */ static void vLEDTask( void *pvParameters ); /*---------------------------------------------------------------------------*/ @@ -75,8 +75,8 @@ int main( void ) static void vLEDTask( void *pvParameters ) { -/* Used to wake the task at the correct frequency. */ -portTickType xLastExecutionTime; + /* Used to wake the task at the correct frequency. */ + portTickType xLastExecutionTime; /* Initialise xLastExecutionTime so the first call to vTaskDelayUntil() works correctly. */ @@ -87,9 +87,6 @@ portTickType xLastExecutionTime; /* Wait until it is time for the next cycle. */ vTaskDelayUntil( &xLastExecutionTime, mainCHECK_TASK_PERIOD ); PORTE = PORTE^0x01; - - /* Has an error been found in any of the standard demo tasks? */ - } } /*---------------------------------------------------------------------------*/ diff --git a/test/motortest/Makefile b/test/motortest/Makefile index a6f1b42..e40742b 100644 --- a/test/motortest/Makefile +++ b/test/motortest/Makefile @@ -14,4 +14,7 @@ clean: rm -f *.o motortest *~ distclean:clean - rm -f motortest.hex \ No newline at end of file + rm -f motortest.hex + +burn: motortest.hex + usburn -S ICSP -F 30 -w -I $^ diff --git a/test/pwmtest/Makefile b/test/pwmtest/Makefile index 3b51c71..1c6c460 100644 --- a/test/pwmtest/Makefile +++ b/test/pwmtest/Makefile @@ -14,4 +14,7 @@ clean: rm -f *.o pwmtest *~ distclean:clean - rm -f pwmtest.hex \ No newline at end of file + rm -f pwmtest.hex + +burn: pwmtest.hex + usburn -S ICSP -F 30 -w -I $^ diff --git a/test/serialtest/Makefile b/test/serialtest/Makefile index 805da96..39c3a80 100644 --- a/test/serialtest/Makefile +++ b/test/serialtest/Makefile @@ -14,4 +14,7 @@ clean: rm -f *.o serialtest *~ distclean:clean - rm -f serialtest.hex \ No newline at end of file + rm -f serialtest.hex + +burn: serialtest.hex + usburn -S ICSP -F 30 -w -I $^ diff --git a/test/serialtest/serialtest.c b/test/serialtest/serialtest.c index ff2528d..b462211 100644 --- a/test/serialtest/serialtest.c +++ b/test/serialtest/serialtest.c @@ -39,11 +39,20 @@ _FBORPOR(MCLR_EN & RST_IOPIN & PBOR_OFF & PWRT_64 & RST_PWMPIN & PWMxH_ACT_HI & int main(int argc,char *argv[]) { - char *name; + char name[]="Diego é o cara\n"; char buff[256]; - unsigned int bitorder=0x0733; + int i; + union + { + unsigned int i; + struct + { + unsigned char lsb; + unsigned char msb; + } le; + } bitorder; - name="Diego é o cara\n"; + bitorder.i=0x0123; //set PORTE just to check if the program is running TRISE=0x0; @@ -67,12 +76,20 @@ int main(int argc,char *argv[]) prints(buff); sprintf(buff,"size of double... %d\n",sizeof(double)); prints(buff); - sprintf(buff,"int 0x0733 byte[0]:%x byte[1]:%x\n",((unsigned char*)(&bitorder))[0],((unsigned char*)(&bitorder))[1]); + if((bitorder.i & 0xff) == bitorder.le.lsb) + { + sprintf(buff,"Little-endian\n"); + } + else + { + sprintf(buff,"Big-endian\n"); + } prints(buff); - - for(;;){ - + for(i=0;;i++) + { + sprintf(buff,"i=%d\n",i); + prints(buff); } } -- 2.12.0