Tue Aug 12, 2014 12:10 pm
// GamebuinoISP demo - by Mark Feldman (Myndale)
// This experimental code is a direct port of ArduinoISP version 04m3 with modifications for Gamebuino.
// Original ArduinoISP copyright is below.
// ArduinoISP version 04m3
// Copyright (c) 2008-2011 Randall Bohn
// If you require a license, see
// http://www.opensource.org/licenses/bsd-license.php
//
// This sketch turns the Arduino into a AVRISP
// using the following arduino pins:
//
// pin name: not-mega: mega(1280 and 2560)
// slave reset: 10: 53
// MOSI: 11: 51
// MISO: 12: 50
// SCK: 13: 52
//
// Put an LED (with resistor) on the following pins:
// 9: Heartbeat - shows the programmer is running
// 8: Error - Lights up if something goes wrong (use red if that makes sense)
// 7: Programming - In communication with the slave
//
// 23 July 2011 Randall Bohn
// -Address Arduino issue 509 :: Portability of ArduinoISP
// http://code.google.com/p/arduino/issues/detail?id=509
//
// October 2010 by Randall Bohn
// - Write to EEPROM > 256 bytes
// - Better use of LEDs:
// -- Flash LED_PMODE on each flash commit
// -- Flash LED_PMODE while writing EEPROM (both give visual feedback of writing progress)
// - Light LED_ERR whenever we hit a STK_NOSYNC. Turn it off when back in sync.
// - Use pins_arduino.h (should also work on Arduino Mega)
//
// October 2009 by David A. Mellis
// - Added support for the read signature command
//
// February 2009 by Randall Bohn
// - Added support for writing to EEPROM (what took so long?)
// Windows users should consider WinAVR's avrdude instead of the
// avrdude included with Arduino software.
//
// January 2008 by Randall Bohn
// - Thanks to Amplificar for helping me with the STK500 protocol
// - The AVRISP/STK500 (mk I) protocol is used in the arduino bootloader
// - The SPI functions herein were developed for the AVR910_ARD programmer
// - More information at http://code.google.com/p/mega-isp
#include <SPI.h>
#include <Gamebuino.h>
Gamebuino gb;
#include "pins_arduino.h"
#define RESET 19
#define LED_HB 5
//#define LED_ERR 8
//#define LED_PMODE 7
#define PROG_FLICKER true
#define HWVER 2
#define SWMAJ 1
#define SWMIN 18
// STK Definitions
#define STK_OK 0x10
#define STK_FAILED 0x11
#define STK_UNKNOWN 0x12
#define STK_INSYNC 0x14
#define STK_NOSYNC 0x15
#define CRC_EOP 0x20 //ok it is a space...
void pulse(int pin, int times);
void setup() {
gb.begin();
gb.titleScreen(F("GamebuinoISP\n\nPlease wait until\nnext screen\nbefore turning\non target."));
Serial.begin(19200);
gb.display.clear();
gb.display.clear();
gb.display.println(F(" ICSP Pins:"));
gb.display.println(F(" |GND RST|"));
gb.display.println(F(" |MOSI SCK|"));
gb.display.println(F(" |VTG MISO|"));
gb.display.println();
gb.display.println(F("Connect GND,MOSI,MISO"));
gb.display.println(F(" & SCK, target RST"));
gb.display.println(F(" connects to I2CLK."));
gb.display.update();
// disable the screen so we don't get corruption during communication with the IDE
digitalWrite(SCR_CS, HIGH);
/*
gb.display.println(F("PROG TARGET"));
gb.display.println(F("---------------"));
gb.display.println(F("GND -> GND | ICSP Pins:"));
gb.display.println(F("MISO -> MISO |"));
gb.display.println(F("MOSI -> MOSI | GND RST"));
gb.display.println(F("SCK -> SCK | MOSI SCK"));
gb.display.println(F("I2CLK -> RST | VTG MISO"));
gb.display.update();
*/
/*
pinMode(LED_PMODE, OUTPUT);
pulse(LED_PMODE, 2);
pinMode(LED_ERR, OUTPUT);
pulse(LED_ERR, 2);
*/
pinMode(LED_HB, OUTPUT);
pulse(LED_HB, 2);
}
int error=0;
int pmode=0;
// address for reading and writing, set by 'U' command
int here;
uint8_t buff[256]; // global block storage
#define beget16(addr) (*addr * 256 + *(addr+1) )
typedef struct param {
uint8_t devicecode;
uint8_t revision;
uint8_t progtype;
uint8_t parmode;
uint8_t polling;
uint8_t selftimed;
uint8_t lockbytes;
uint8_t fusebytes;
int flashpoll;
int eeprompoll;
int pagesize;
int eepromsize;
int flashsize;
}
parameter;
parameter param;
// this provides a heartbeat on pin 9, so you can tell the software is running.
uint8_t hbval=128;
int8_t hbdelta=8;
void heartbeat() {
if (hbval > 192) hbdelta = -hbdelta;
if (hbval < 32) hbdelta = -hbdelta;
hbval += hbdelta;
analogWrite(LED_HB, hbval);
delay(20);
}
void loop(void) {
/*
// is pmode active?
if (pmode) digitalWrite(LED_PMODE, HIGH);
else digitalWrite(LED_PMODE, LOW);
// is there an error?
if (error) digitalWrite(LED_ERR, HIGH);
else digitalWrite(LED_ERR, LOW);
*/
// light the heartbeat LED
heartbeat();
if (Serial.available()) {
avrisp();
}
}
uint8_t getch() {
while(!Serial.available());
return Serial.read();
}
void fill(int n) {
for (int x = 0; x < n; x++) {
buff[x] = getch();
}
}
#define PTIME 30
void pulse(int pin, int times) {
do {
digitalWrite(pin, HIGH);
delay(PTIME);
digitalWrite(pin, LOW);
delay(PTIME);
}
while (times--);
}
void prog_lamp(int state) {
/*
if (PROG_FLICKER)
digitalWrite(LED_PMODE, state);
*/
}
void spi_init() {
uint8_t x;
SPCR = 0x53;
x=SPSR;
x=SPDR;
}
void spi_wait() {
do {
}
while (!(SPSR & (1 << SPIF)));
}
uint8_t spi_send(uint8_t b) {
uint8_t reply;
SPDR=b;
spi_wait();
reply = SPDR;
return reply;
}
uint8_t spi_transaction(uint8_t a, uint8_t b, uint8_t c, uint8_t d) {
uint8_t n;
spi_send(a);
n=spi_send(b);
//if (n != a) error = -1;
n=spi_send(c);
return spi_send(d);
}
void empty_reply() {
if (CRC_EOP == getch()) {
Serial.print((char)STK_INSYNC);
Serial.print((char)STK_OK);
}
else {
error++;
Serial.print((char)STK_NOSYNC);
}
}
void breply(uint8_t b) {
if (CRC_EOP == getch()) {
Serial.print((char)STK_INSYNC);
Serial.print((char)b);
Serial.print((char)STK_OK);
}
else {
error++;
Serial.print((char)STK_NOSYNC);
}
}
void get_version(uint8_t c) {
switch(c) {
case 0x80:
breply(HWVER);
break;
case 0x81:
breply(SWMAJ);
break;
case 0x82:
breply(SWMIN);
break;
case 0x93:
breply('S'); // serial programmer
break;
default:
breply(0);
}
}
void set_parameters() {
// call this after reading paramter packet into buff[]
param.devicecode = buff[0];
param.revision = buff[1];
param.progtype = buff[2];
param.parmode = buff[3];
param.polling = buff[4];
param.selftimed = buff[5];
param.lockbytes = buff[6];
param.fusebytes = buff[7];
param.flashpoll = buff[8];
// ignore buff[9] (= buff[8])
// following are 16 bits (big endian)
param.eeprompoll = beget16(&buff[10]);
param.pagesize = beget16(&buff[12]);
param.eepromsize = beget16(&buff[14]);
// 32 bits flashsize (big endian)
param.flashsize = buff[16] * 0x01000000
+ buff[17] * 0x00010000
+ buff[18] * 0x00000100
+ buff[19];
}
void start_pmode() {
spi_init();
// following delays may not work on all targets...
pinMode(RESET, OUTPUT);
digitalWrite(RESET, HIGH);
pinMode(SCK, OUTPUT);
digitalWrite(SCK, LOW);
delay(50);
digitalWrite(RESET, LOW);
delay(50);
pinMode(MISO, INPUT);
pinMode(MOSI, OUTPUT);
spi_transaction(0xAC, 0x53, 0x00, 0x00);
pmode = 1;
}
void end_pmode() {
pinMode(MISO, INPUT);
pinMode(MOSI, INPUT);
pinMode(SCK, INPUT);
pinMode(RESET, INPUT);
pmode = 0;
}
void universal() {
int w;
uint8_t ch;
fill(4);
ch = spi_transaction(buff[0], buff[1], buff[2], buff[3]);
breply(ch);
}
void flash(uint8_t hilo, int addr, uint8_t data) {
spi_transaction(0x40+8*hilo,
addr>>8 & 0xFF,
addr & 0xFF,
data);
}
void commit(int addr) {
if (PROG_FLICKER) prog_lamp(LOW);
spi_transaction(0x4C, (addr >> 8) & 0xFF, addr & 0xFF, 0);
if (PROG_FLICKER) {
delay(PTIME);
prog_lamp(HIGH);
}
}
//#define _current_page(x) (here & 0xFFFFE0)
int current_page(int addr) {
if (param.pagesize == 32) return here & 0xFFFFFFF0;
if (param.pagesize == 64) return here & 0xFFFFFFE0;
if (param.pagesize == 128) return here & 0xFFFFFFC0;
if (param.pagesize == 256) return here & 0xFFFFFF80;
return here;
}
void write_flash(int length) {
fill(length);
if (CRC_EOP == getch()) {
Serial.print((char) STK_INSYNC);
Serial.print((char) write_flash_pages(length));
}
else {
error++;
Serial.print((char) STK_NOSYNC);
}
}
uint8_t write_flash_pages(int length) {
int x = 0;
int page = current_page(here);
while (x < length) {
if (page != current_page(here)) {
commit(page);
page = current_page(here);
}
flash(LOW, here, buff[x++]);
flash(HIGH, here, buff[x++]);
here++;
}
commit(page);
return STK_OK;
}
#define EECHUNK (32)
uint8_t write_eeprom(int length) {
// here is a word address, get the byte address
int start = here * 2;
int remaining = length;
if (length > param.eepromsize) {
error++;
return STK_FAILED;
}
while (remaining > EECHUNK) {
write_eeprom_chunk(start, EECHUNK);
start += EECHUNK;
remaining -= EECHUNK;
}
write_eeprom_chunk(start, remaining);
return STK_OK;
}
// write (length) bytes, (start) is a byte address
uint8_t write_eeprom_chunk(int start, int length) {
// this writes byte-by-byte,
// page writing may be faster (4 bytes at a time)
fill(length);
prog_lamp(LOW);
for (int x = 0; x < length; x++) {
int addr = start+x;
spi_transaction(0xC0, (addr>>8) & 0xFF, addr & 0xFF, buff[x]);
delay(45);
}
prog_lamp(HIGH);
return STK_OK;
}
void program_page() {
char result = (char) STK_FAILED;
int length = 256 * getch();
length += getch();
char memtype = getch();
// flash memory @here, (length) bytes
if (memtype == 'F') {
write_flash(length);
return;
}
if (memtype == 'E') {
result = (char)write_eeprom(length);
if (CRC_EOP == getch()) {
Serial.print((char) STK_INSYNC);
Serial.print(result);
}
else {
error++;
Serial.print((char) STK_NOSYNC);
}
return;
}
Serial.print((char)STK_FAILED);
return;
}
uint8_t flash_read(uint8_t hilo, int addr) {
return spi_transaction(0x20 + hilo * 8,
(addr >> 8) & 0xFF,
addr & 0xFF,
0);
}
char flash_read_page(int length) {
for (int x = 0; x < length; x+=2) {
uint8_t low = flash_read(LOW, here);
Serial.print((char) low);
uint8_t high = flash_read(HIGH, here);
Serial.print((char) high);
here++;
}
return STK_OK;
}
char eeprom_read_page(int length) {
// here again we have a word address
int start = here * 2;
for (int x = 0; x < length; x++) {
int addr = start + x;
uint8_t ee = spi_transaction(0xA0, (addr >> 8) & 0xFF, addr & 0xFF, 0xFF);
Serial.print((char) ee);
}
return STK_OK;
}
void read_page() {
char result = (char)STK_FAILED;
int length = 256 * getch();
length += getch();
char memtype = getch();
if (CRC_EOP != getch()) {
error++;
Serial.print((char) STK_NOSYNC);
return;
}
Serial.print((char) STK_INSYNC);
if (memtype == 'F') result = flash_read_page(length);
if (memtype == 'E') result = eeprom_read_page(length);
Serial.print(result);
return;
}
void read_signature() {
if (CRC_EOP != getch()) {
error++;
Serial.print((char) STK_NOSYNC);
return;
}
Serial.print((char) STK_INSYNC);
uint8_t high = spi_transaction(0x30, 0x00, 0x00, 0x00);
Serial.print((char) high);
uint8_t middle = spi_transaction(0x30, 0x00, 0x01, 0x00);
Serial.print((char) middle);
uint8_t low = spi_transaction(0x30, 0x00, 0x02, 0x00);
Serial.print((char) low);
Serial.print((char) STK_OK);
}
//////////////////////////////////////////
//////////////////////////////////////////
////////////////////////////////////
////////////////////////////////////
int avrisp() {
uint8_t data, low, high;
uint8_t ch = getch();
switch (ch) {
case '0': // signon
error = 0;
empty_reply();
break;
case '1':
if (getch() == CRC_EOP) {
Serial.print((char) STK_INSYNC);
Serial.print("AVR ISP");
Serial.print((char) STK_OK);
}
break;
case 'A':
get_version(getch());
break;
case 'B':
fill(20);
set_parameters();
empty_reply();
break;
case 'E': // extended parameters - ignore for now
fill(5);
empty_reply();
break;
case 'P':
start_pmode();
empty_reply();
break;
case 'U': // set address (word)
here = getch();
here += 256 * getch();
empty_reply();
break;
case 0x60: //STK_PROG_FLASH
low = getch();
high = getch();
empty_reply();
break;
case 0x61: //STK_PROG_DATA
data = getch();
empty_reply();
break;
case 0x64: //STK_PROG_PAGE
program_page();
break;
case 0x74: //STK_READ_PAGE 't'
read_page();
break;
case 'V': //0x56
universal();
break;
case 'Q': //0x51
error=0;
end_pmode();
empty_reply();
break;
case 0x75: //STK_READ_SIGN 'u'
read_signature();
break;
// expecting a command, not CRC_EOP
// this is how we can get back in sync
case CRC_EOP:
error++;
Serial.print((char) STK_NOSYNC);
break;
// anything else we will return STK_UNKNOWN
default:
error++;
if (CRC_EOP == getch())
Serial.print((char)STK_UNKNOWN);
else
Serial.print((char)STK_NOSYNC);
}
}
:100000000C944A020C9472020C9472020C947202C8
:100010000C9472020C9472020C9472020C94720290
:100020000C9472020C9472020C9472020C948C1553
:100030000C9472020C9472020C9472020C94720270
:100040000C9403160C9472020C947C180C94CA182D
:100050000C9472020C9472020C9472020C94720250
:100060000C9472020C94720220636F6E6E6563745E
:100070007320746F204932434C4B2E0020262053AE
:10008000434B2C20746172676574205253540043B3
:100090006F6E6E65637420474E442C4D4F53492C50
:1000A0004D49534F00202020207C56544720204D9E
:1000B00049534F7C00202020207C4D4F5349202065
:1000C00053434B7C00202020207C474E442020209E
:1000D0005253547C00202020204943535020506923
:1000E0006E733A0047616D656275696E6F49535072
:1000F0000A0A506C65617365207761697420756EBA
:1001000074696C0A6E6578742073637265656E0A33
:100110006265666F7265207475726E696E670A6FCC
:100120006E207461726765742E0003053F213F0ADB
:10013000100A1208120E1C0E0C1E0C141A14161F94
:10014000161E131E1E1B1E1E1F1E3F213F3A2F3A56
:10015000173D173F213F181F02040A041F0E040415
:100160000E1F0A1F0A0E0E1F04110E2E252E2F2AF7
:100170002E262929021F02081F08150E04040E1539
:100180000E15151B151B040604040C0400000000CA
:1001900017000300031F0A1F16371A1904130A1544
:1001A0003A000300000E11110E000A040A040E04A6
:1001B0000030000404040010001804031F111F1273
:1001C0001F101D151711151F07041F17151D1F15CB
:1001D0001D01011F1F151F17151F000A0000320007
:1001E000040A110A0A0A110A040115020E11171E47
:1001F000051E1F150A0E110A1F110E1F15111F05CE
:10020000010E111D1F041F111F1108100F1F041BC9
:100210001F10101F061F1E040F0E110E1F09060EC1
:10022000112E1F051A121509011F011F101F0F188B
:100230000F1F0C1F1B041B031C03191513001F1198
:10024000030418111F000201022020200001020CEB
:10025000121E1F120C0C12120C121F0C1A14041E68
:1002600005242A1E1F021C141D1020201D1F081407
:10027000111F101E041E1E021C0C120C3E0A040C40
:10028000123E1E040214160A020F120E101E0E1049
:100290000E1E081E120C1226281E322A26041E21AB
:1002A000001F00211E040102013F213F0A4E6F2062
:1002B00053442063617264206F720A6E6F204C4F4A
:1002C000414445522E4845580A0A153A4578697402
:1002D000001D20466C617368696E670A20206C6F90
:1002E000616465722E2E2E0A0A444F4E2754205404
:1002F00055524E204F464621004E4F204241545405
:100300004552590A0A504C454153450A5455524EDC
:10031000204F464600177361766500166261636B75
:10032000001574797065000A0A0A153A6F6B6179D5
:1003300020163A6564697400596F7520656E74659E
:100340007265640A00540A03E181867F3E186D835A
:100350000F0F0E0183866033186DC3198F1803C306
:100360008E6033186DE330CF1803C39E603630CDF6
:10037000E360CF3006C79E7E3E30CDB360CF300CF9
:10038000C6F6603330D9B660CF33CFCCF66061B0FB
:10039000DB1E60CF30D86CE6C061B0DB1E618F1908
:1003A000986CC6C063B19B0E330F0FB078C6FF7E4A
:1003B0001F1B061E0F175344001613780016131444
:1003C00000151020001520100000000500893008DD
:1003D00002380249786814000045006801000005F1
:1003E000006801380100000500380168010000F6CE
:1003F000E8DBCFC3B8AEA49B928A827B746E68623E
:100400005C57524E4945413E3A3734312E2C29270C
:100410002523211F1D1C1A1917161514131211104C
:100420000F0E0D0C0B0A090807062E0432040101F9
:10043000F7030101FF0300000000240027002A0049
:1004400000000000250028002B0000000000230011
:100450002600290004040404040404040202020225
:100460000202030303030303010204081020408077
:1004700001020408102001020408102000000007F7
:10048000000201000003040600000000000000005C
:10049000E302361A11241FBECFEFD8E0DEBFCDBF76
:1004A00011E0A0E0B1E0E8E6FAE302C005900D92A9
:1004B000AC32B107D9F715E0ACE2B1E001C01D9252
:1004C000AB37B107E1F714E0C4E9D4E004C02297E8
:1004D000FE010E942E1DC039D107C9F70E948C1A57
:1004E0000C94321D0C9400008091B8018093B802E6
:1004F0008091B9018093B9028091BA018093BA02C8
:100500008091BB018093BB028091BC018093BC02AF
:100510008091BD018093BD028091BE018093BE0297
:100520008091BF018093BF028091C0018093C0027F
:100530001092C1029091C20180E02091C301820F0C
:10054000911D9093C3028093C2029091C40180E0F8
:100550002091C501820F911D9093C5028093C40222
:100560009091C60180E02091C701820F911D909368
:10057000C7028093C6029091CA0180E02091CB010E
:10058000820F911D9093C9028093C802089590E054
:10059000049633E0880F991F3A95E1F78EBD0DB4AC
:1005A00007FEFDCF8EB57EBD0DB407FEFDCF8EB527
:1005B0006EBD0DB407FEFDCF8EB51EBC0DB407FE9B
:1005C000FDCF8EB5089510927D0110927C0187E1D8
:1005D00091E090937B0180937A010895CF92DF920E
:1005E000EF92FF920F931F93CF93DF937C01C09103
:1005F000B601D091B701CC0FDD1F00E010E040EA5A
:10060000C42EDD24DA941BC0CEBC0DB407FEFDCF92
:100610008EB5DEBD0DB407FEFDCF8EB5CEBD0DB4DB
:1006200007FEFDCF8EB5DEBC0DB407FEFDCF6EB567
:1006300089E595E00E94E81A0F5F1F4F21960E157D
:100640001F0514F380E1DF91CF911F910F91FF906F
:10065000EF90DF90CF9008950F931F93CF93DF9388
:100660008C01C0E0D0E022C06091B6017091B7016A
:1006700080E00E94C702682F89E595E00E94E81A91
:100680006091B6017091B70181E00E94C702682FA6
:1006900089E595E00E94E81A8091B6019091B70132
:1006A00001969093B7018093B6012296C017D107A7
:1006B000DCF280E1DF91CF911F910F910895282FF7
:1006C0008CE48EBD0DB407FEFDCF8EB59EBD0DB47E
:1006D00007FEFDCF8EB52EBD0DB407FEFDCF8EB546
:1006E0001EBC0DB407FEFDCF8EB56EE170E080E05C
:1006F00090E00E947F160895CF92DF92EF92FF92D2
:100700000F931F93CF93DF937C018091C40290914C
:10071000C5028032910531F48091B6019091B70104
:10072000807F11C08034910531F48091B6019091A1
:10073000B701807E08C08038910571F48091B601C0
:100740009091B701807CC8EBD1E000E010E070E44C
:10075000C72E68E4D62E9BC02091B6013091B70118
:100760008050914019F4C9018078EDCFC901EBCFD9
:100770004091C4025091C5024032510531F420919C
:10078000B6013091B701207F1AC04034510531F4D1
:100790002091B6013091B701207E11C0403851053B
:1007A00031F42091B6013091B701207C08C020912E
:1007B000B6013091B7014050514009F420788217BA
:1007C000930761F10E945F038091C4029091C5027A
:1007D0008032910531F48091B6019091B701807F0C
:1007E0001DC08034910531F48091B6019091B7011C
:1007F000807E14C08038910531F48091B6019091CB
:10080000B701807C0BC02091B6013091B7018050B8
:10081000914019F4C901807801C0C9012091B60145
:100820003091B7014881532F622FCEBC0DB407FE23
:10083000FDCF7EB55EBD0DB407FEFDCF7EB56EBDAE
:100840000DB407FEFDCF7EB54EBD0DB407FEFDCF46
:100850004EB54981DEBC0DB407FEFDCF7EB55EBD51
:100860000DB407FEFDCF5EB56EBD0DB407FEFDCF26
:100870005EB54EBD0DB407FEFDCF0E5F1F4F4EB5EA
:100880002F5F3F4F3093B7012093B60122960E158C
:100890001F050CF46DCF0E945F0380E1DF91CF91C3
:1008A0001F910F91FF90EF90DF90CF9008958CE013
:1008B00060E00E9495178BE060E00E9495178DE044
:1008C00060E00E94951783E160E00E949517109206
:1008D000B5011092B401089583E58CBD8DB58EB538
:1008E00083E161E00E94951783E161E00E94D417E3
:1008F0008DE061E00E9495178DE060E00E94D417C2
:1009000062E370E080E090E00E947F1683E160E0A7
:100910000E94D41762E370E080E090E00E947F16AE
:100920008CE060E00E9495178BE061E00E949517D3
:100930008CEA8EBD0DB407FEFDCF8EB583E58EBD6E
:100940000DB407FEFDCF8EB51EBC0DB407FEFDCF66
:100950008EB51EBC0DB407FEFDCF8EB581E090E0D4
:100960009093B5018093B40108951F93CF93DF93C3
:10097000182FEB01812F61E00E94D4176EE170E027
:1009800080E090E00E947F16812F60E00E94D417E3
:100990006EE170E080E090E00E947F1621978FEF7B
:1009A000CF3FD80739F7DF91CF911F91089589E59F
:1009B00095E00E948C19892BD1F389E595E00E947E
:1009C000BD1908950E94D704803269F08091B20168
:1009D0009091B30101969093B3018093B20189E5A0
:1009E00095E065E155C089E595E064E10E94E81A6B
:1009F00080E38EBD0DB407FEFDCF8EB51EBC0DB4D9
:100A000007FEFDCF8EB51EBC0DB407FEFDCF8EB523
:100A10001EBC0DB407FEFDCF6EB589E595E00E94C2
:100A2000E81A80E38EBD0DB407FEFDCF8EB51EBC67
:100A30000DB407FEFDCF8EB581E08EBD0DB407FE6F
:100A4000FDCF8EB51EBC0DB407FEFDCF6EB589E59A
:100A500095E00E94E81A80E38EBD0DB407FEFDCF3D
:100A60008EB51EBC0DB407FEFDCF8EB582E08EBDE7
:100A70000DB407FEFDCF8EB51EBC0DB407FEFDCF35
:100A80006EB589E595E00E94E81A89E595E060E198
:100A90000E94E81A0895FF920F931F93CF93DF935C
:100AA0000E94D704F82E0E94D704082F0E94D70472
:100AB000182F0E94D704803269F08091B201909182
:100AC000B30101969093B3018093B20189E595E05B
:100AD00065E11AC09F2D80E0EC01C00FD11D89E5B2
:100AE00095E064E10E94E81A163421F4CE010E94D8
:100AF0002C0307C0153411F061E104C0CE010E943F
:100B0000EE02682F89E595E00E94E81ADF91CF9107
:100B10001F910F91FF9008951F93182F0E94D704E3
:100B2000803271F489E595E064E10E94E81A89E574
:100B300095E0612F0E94E81A89E595E060E10CC01C
:100B40008091B2019091B30101969093B30180938B
:100B5000B20189E595E065E10E94E81A1F910895C8
:100B6000813861F0823818F4803871F405C0823819
:100B700039F0833949F406C082E007C081E005C03E
:100B800082E103C083E501C080E00E948C050895E6
:100B90000E94D704803249F489E595E064E10E941F
:100BA000E81A89E595E060E10CC08091B20190916E
:100BB000B30101969093B3018093B20189E595E06A
:100BC00065E10E94E81A08950F931F93CF93DF9376
:100BD0008C01C0E0D0E007C00E94D704FE01E854B9
:100BE000FE4F80832196C017D107B4F3DF91CF91D8
:100BF0001F910F910895DF92EF92FF920F931F9331
:100C0000CF93DF93182F092F7B01CB010E94E405BE
:100C1000212F302FC901EC0100E010E0E0ECDE2EC6
:100C200021C0F801E854FE4FE081DEBC0DB407FEA0
:100C3000FDCF8EB5DEBD0DB407FEFDCF8EB5CEBDAA
:100C40000DB407FEFDCF8EB5EEBD0DB407FEFDCF92
:100C50008EB56DE270E080E090E00E947F160F5F3D
:100C60001F4F21960E151F05E4F280E1DF91CF9111
:100C70001F910F91FF90EF90DF9008950F931F93B6
:100C8000CF93DF93BC012091B6013091B7018091E1
:100C9000C6029091C702861797072CF08901000FB2
:100CA000111FEB0113C08091B2019091B301019625
:100CB0009093B3018093B20181E110C0C80160E25A
:100CC00070E00E94FB05005E1F4FA097C132D10566
:100CD000ACF7C801BE010E94FB0580E1DF91CF9116
:100CE0001F910F91089584E090E00E94E4058091A7
:100CF000B8019091B9012091BA013091BB018EBD2C
:100D00000DB407FEFDCF8EB59EBD0DB407FEFDCF21
:100D10008EB52EBD0DB407FEFDCF8EB53EBD0DB414
:100D200007FEFDCF8EB50E948C050895CF93DF930B
:100D3000EC010E94E4050E94D704803261F489E549
:100D400095E064E10E94E81ACE010E947C03682FBE
:100D500089E595E00CC08091B2019091B3010196B4
:100D60009093B3018093B20189E595E065E10E941B
:100D7000E81ADF91CF9108950F931F93CF93DF93DC
:100D80000E94D704182F00E00E94D704E801C80F82
:100D9000D11D0E94D704863421F4CE010E9496060C
:100DA00025C08534F1F4CE010E943E06082F0E9432
:100DB000D704803249F489E595E064E10E94E81A9D
:100DC00089E595E0602F10C08091B2019091B30148
:100DD00001969093B3018093B20189E595E065E1B6
:100DE00003C089E595E061E10E94E81ADF91CF91A7
:100DF0001F910F9108950F931F930E94D70481357F
:100E000009F482C08235B8F4813409F446C08234D2
:100E100040F4803349F1813361F1803209F088C0B8
:100E20007DC0853409F447C0803509F449C0823457
:100E300009F07EC037C0813609F45AC0823650F4BA
:100E4000863509F45EC0803609F450C0853509F056
:100E50006FC039C0843709F451C0853709F45BC0CD
:100E6000843609F065C047C01092B3011092B201F8
:100E70001FC00E94D704803209F070C089E595E058
:100E800064E10E94E81A89E595E060E071E00E9463
:100E9000401B89E595E060E15FC00E94D7040E9495
:100EA000B0055CC084E190E00E94E4050E947402F9
:100EB0000E94C80553C085E090E00E94E405F8CF89
:100EC0000E946C04F5CF0E94D704082F10E0109305
:100ED000B7010093B6010E94D704382F20E0200FFD
:100EE000311F3093B7012093B601E2CF0E94D7049F
:100EF0000E94D704DDCF0E94BC0630C00E944B0583
:100F00002DC00E9473062AC01092B3011092B20144
:100F10000E945704CDCF0E94E20420C08091B2010C
:100F20009091B30101969093B3018093B20111C0E7
:100F30008091B2019091B30101969093B301809397
:100F4000B2010E94D704803221F489E595E062E184
:100F500003C089E595E065E10E94E81A1F910F91B1
:100F6000089590910F01913C28F080911001819596
:100F700080931001903228F4809110018195809324
:100F8000100160911001690F60930F0185E070E01E
:100F90000E94351764E170E080E090E00E947F16C7
:100FA00008950E94B10789E595E00E948C19892B6C
:100FB00011F00E94FB0608950F931F930CE211E0BD
:100FC000C8010E94C212C80164EE70E00E94BD1206
:100FD00089E595E040E05BE460E070E00E9405197F
:100FE0000AE711E0C8010E940A0EC8010E940A0E19
:100FF000C80165ED70E00E94101BC80165EC70E04F
:101000000E94101BC80165EB70E00E94101BC80114
:1010100065EA70E00E94101BC8010E94F01AC80126
:101020006FE870E00E94101BC8016CE770E00E943E
:10103000101BC80168E670E00E94101BC8010E94E6
:10104000CA0D8FE061E00E94D41785E061E00E9444
:10105000951785E090E062E070E00E94B5041F9172
:101060000F910895882319F48CB5806202C08CB565
:101070008F7D8CBD08959CB5937F982B9CBD089562
:101080002CB5382F33702C7F322B3CBD2DB590E022
:10109000959587959595879581702E7F822B8DBD2F
:1010A00008958AE061E00E94D4178AE061E00E941E
:1010B00095178CB580618CBD8CB580648CBD8DE03E
:1010C00061E00E9495178BE061E00E9495170895FA
:1010D000FC0181E08083089585E070E00E9435176F
:1010E00008956F927F928F929F92AF92BF92CF920C
:1010F000DF92EF92FF920F931F93CF93DF93EC0158
:1011000089819A818C0124E0000F111F2A95E1F753
:10111000081B190B85E10E941317BC01600F711F9A
:1011200084E0769567958A95E1F77A83698388816B
:10113000882381F12E813F816217730710F4B90172
:1011400006C0888599858617970708F4BC0100D0EA
:1011500000D080E090E040E050E0E884F98400E0D6
:1011600010E0AD80BB24CC24DD246C80772488245F
:101170009924EDB7FEB761827282838294820E94C5
:10118000431B6B830F900F900F900F9085E070E0E2
:101190000E943517DF91CF911F910F91FF90EF9033
:1011A000DF90CF90BF90AF909F908F907F906F9087
:1011B0000895FC018CE39FE09383828384E0818324
:1011C00081E084870895CF93DF93EC018C8590E0D4
:1011D0008F719070892B69F584E10E941317AA27FB
:1011E00097FDA095BA2FBC01CD010E94BA1B26EE37
:1011F0003FE34EEC50E40E94461C0E948C1B9B0176
:10120000AC017B836A836115710589F084E0898371
:10121000B901FE0120E0848195816817790710F4F7
:1012200029830AC02F5F32962430A9F702C08FEFBE
:1012300089838C858F5F8C87DF91CF910895FC0126
:1012400088E0808389E0818387E0828386E08383EE
:1012500084E0848382E0858381E18683089520E0B1
:10126000FC01E60FF11D8781813009F421E0822F16
:1012700008950F931F93CF93DF93EC0110E00FEFCE
:10128000888162E00E94951788810E9428182F812A
:10129000892B19F42F5F2F8307C0222349F02F3F9A
:1012A00011F41F8201C00F83888160E00E949517AE
:1012B0001F5F2196173021F7DF91CF911F910F917A
:1012C0000895FC01678F60A30895FC01678F40A318
:1012D0000895FC016435A8F547FD33C040338CF513
:1012E000878D942F959595959595772767FD7095A2
:1012F0004770882399F0E4E59E02F0011124E60F7F
:10130000F71FE653FD4F81E090E002C0880F991F60
:101310004A95E2F72081282B20830895E4E59E0278
:10132000F0011124E60FF71FE653FD4F81E090E036
:1013300002C0880F991F4A95E2F7809520812823E3
:1013400020830895AF92BF92CF92DF92EF92FF92E7
:101350000F931F93CF93DF93EC01162FF42EE22E01
:10136000AA24402F552747FD50958F2D992787FD9B
:101370009095481B590B57FF03C0509541955F4FFF
:101380002E2D332727FD3095812F992787FD9095A6
:10139000281B390B37FF03C0309521953F4F241789
:1013A000350744F4AA24A3948F2DF12E182F802FF3
:1013B0000E2DE82EE11634F48E2DE12E182F802FFD
:1013C0000F2DF82EDE2CD11A202F332727FD309534
:1013D0008F2D992787FD9095281B390B37FF03C068
:1013E000309521953F4FB22EF0161CF0CC24CA94B4
:1013F00002C0CC24C3948D2DD7FC8F5F082F059598
:1014000011C0AA2021F0CE016F2D412F03C0CE01C3
:10141000612F4F2D0E9469090B1907FF02C0FC0CB8
:101420000D0D1F5FE1166CF7DF91CF911F910F91AA
:10143000FF90EF90DF90CF90BF90AF9008950F9303
:10144000042F322F262F2150230F0E94A2090F9123
:1014500008950F93362F042F0150020F232F0E945F
:10146000A2090F9108959F92AF92BF92CF92DF92FF
:10147000EF92FF920F931F93CF93DF936C01B62EE1
:10148000942EA02EC0E0D0E0E62EFF24E7FCF094DE
:10149000022F112707FD10950E0D1F1D06C0C60156
:1014A000492D2A2D0E94290A21966B2D6C0FCE0101
:1014B0008E0D9F1D8017910794F3DF91CF911F919F
:1014C0000F91FF90EF90DF90CF90BF90AF909F90E3
:1014D00008952F923F925F926F927F928F929F9288
:1014E000AF92BF92CF92DF92EF92FF920F931F9332
:1014F000DF93CF9300D000D000D0CDB7DEB79E836E
:101500008D83C62ED42EEE24E394E21A8EEF289F0C
:10151000502C1124842E8A94962E9A94A42EA3944F
:10152000B62EB394F22E662423E0722E10E0C8018A
:10153000847090709A838983F801E270F070FC8364
:10154000EB8398E0292E312C20223122017010707B
:1015500054C0E7FC04C0FA94F2E05F0EE50C63941B
:1015600089819A81892B71F04F2D4D0D8D819E813E
:101570006B2D0E9469096F2D6C0D8D819E814A2D06
:101580000E946909EB81FC81EF2B71F04D2D4F1901
:101590008D819E816B2D0E9469096F2D6C0D8D814F
:1015A0009E81482D0E9469092114310471F06C2D2F
:1015B0006F198D819E814A2D0E9469094F2D4D0D15
:1015C0008D819E81692D0E9469090115110571F0B7
:1015D0006C2D6F198D819E81482D0E9469094D2DBA
:1015E0004F198D819E81692D0E946909E70CF2E0F7
:1015F0007F0E8A949A94A394B3946F140CF4A9CF99
:1016000026960FB6F894DEBF0FBECDBFCF91DF9107
:101610001F910F91FF90EF90DF90CF90BF90AF9010
:101620009F908F907F906F905F903F902F90089544
:101630004F925F926F927F928F929F92AF92BF92E2
:10164000CF92DF92EF92FF920F931F93CF93DF938E
:10165000EC01A62E742E9E2DFF24F394F21A8EEF29
:10166000289F802C1124B42EBA9453E0C52ECE0CA2
:10167000E22EDD2443E0942E10E031E0432E512C85
:1016800040225122692E63940270107034C0F7FC1E
:1016900004C0EA9482E0880EF80CD39441145104FB
:1016A00089F06D2D6A0D472D4E192E2D220F260D16
:1016B000CE010E94290A6E2D6A0DCE014B2D2C2DD4
:1016C0000E94290A0115110589F06A2D6D19472D0F
:1016D0004E192E2D220F260DCE010E94290A6A2DA9
:1016E0006E19CE014B2D2C2D0E94290AF90C82E097
:1016F000980EBA94C80EDE1454F2DF91CF911F9168
:101700000F91FF90EF90DF90CF90BF90AF909F90A0
:101710008F907F906F905F904F9008957F928F92FF
:101720009F92AF92BF92CF92DF92EF92FF920F9370
:101730001F936C01962EA42EF22E7E2C760E1EEF99
:10174000E19E102D1124812E820E672D282D0E94DE
:101750001F0AB02EBA0CBA94C601672D4B2D282D46
:101760000E941F0AAE0C100FC601692D4A2D212FB1
:101770000E94290AF90CFA94C6016F2D4A2D212FD7
:101780000E94290AC601672D4A2D2E2D01E00E94D4
:10179000690AFE18C6016F2D4A2D2E2D02E00E9407
:1017A000690ABE18C6016F2D4B2D2E2D04E00E9434
:1017B000690AC601672D4B2D2E2D08E00E94690A8B
:1017C0001F910F91FF90EF90DF90CF90BF90AF905F
:1017D0009F908F907F9008958F929F92AF92BF922B
:1017E000CF92DF92EF92FF920F931F936C01162F0F
:1017F000A42E922EF02EBE2C8E2C860E2EEFE29E64
:10180000E02C11242E2D290D682D0E94330AAB0CDB
:10181000FA94FE0C1150190D1B19C601612F4A2DA7
:101820002B2D01E0EF2C0E94180BC601682D4A2DCC
:101830002B2D02E00E94180B1F910F91FF90EF904B
:10184000DF90CF90BF90AF909F908F9008953F9280
:101850004F925F926F927F928F929F92AF92BF92C0
:10186000CF92DF92EF92FF920F931F93CF93DF936C
:101870004C01362E442EF901A490319654906F01FC
:101880000894C11CD11C8A2D992787FD9095079635
:1018900068E070E00E94DC1CE62EFF24E7FCF09478
:1018A00000E0C0E0D0E060E8662E712C26C0E12F99
:1018B000E595E595E595FF27E7FDF095EC0FFD1F14
:1018C000EC0DFD1DE4912E2F30E0812F8770A301D8
:1018D00002C0559547958A95E2F724233523232B9B
:1018E00031F0612F630DC4014B2D0E9469091F5F08
:1018F0001A15ECF20F5FCE0DDF1D051524F410E074
:10190000B02EB40CF5CFDF91CF911F910F91FF90C6
:10191000EF90DF90CF90BF90AF909F908F907F908F
:101920006F905F904F903F9008953F924F925F92DB
:101930006F927F928F929F92AF92BF92CF92DF92DF
:10194000EF92FF920F931F93CF93DF93EC01862EBC
:10195000A42E422F102F3F8C23E526170CF4ABC08A
:101960003FE23A150CF4A7C0C02EDD248C8190E034
:1019700001979C01C29EC001C39E900DD29E900D06
:101980001124262F332727FD3095820F931F181619
:1019900019060CF090C08D8190E09C01C29EC001A0
:1019A000C39E900DD29E900D11242A2D332727FD22
:1019B0003095820F931F181619060CF07CC09924DD
:1019C000442E55246DC09C012150304042175307CE
:1019D00011F460E00EC0429EC001439E900D529EE5
:1019E000900D1124840F951FED8DFE8DE80FF91FCA
:1019F00064914C9DC0014D9D900D5C9D900D1124F6
:101A0000682C680EBB24792C780C3FC0E62EFF248E
:101A100060FF19C0113039F44B2D4A0DCE01672DEE
:101A20000E9469092EC02C9DC0012D9D900D3C9DEA
:101A3000900D11244A2D480FCE01662D212F012F24
:101A40000E94330A1EC098A18F8D9817D1F09F8FE6
:101A5000113039F44B2D4A0DCE01672D0E946909D2
:101A60000FC02C9DC0012D9D900D3C9D900D11240B
:101A70004A2D480FCE01662D212F012F0E94330AD7
:101A80003F8EF594E7946E2DB3942B2D332727FDCD
:101A900030958D8190E0281739070CF4B7CF9394D7
:101AA000492D552747FD50958C8190E048175907DF
:101AB0000CF489CF3F8EDF91CF911F910F91FF9052
:101AC000EF90DF90CF90BF90AF909F908F907F90DE
:101AD0006F905F904F903F9008950F93CF93DF9357
:101AE000EC01262F6A3049F48D819885899F802DDD
:101AF00011249A85980F9A8726C06D3029F169853F
:101B00004A8508850E94950C9C816885969F402D8A
:101B100011248985480F49878F818823A9F055278B
:101B200047FD5095699F9001112484E590E0821B48
:101B3000930B8417950744F49D81699F902D112480
:101B40008A85890F8A87198681E090E0DF91CF919D
:101B50000F9108951F93CF93DF93EC01162FF89404
:101B60008E8560E00E94D4178F8518161CF460E003
:101B70000E94D4171EBD0DB407FEFDCF8EB58F8514
:101B800018161CF461E00E94D4177894DF91CF916D
:101B90001F910895FF920F931F93CF93DF93EC0152
:101BA000FF2400E010E06F2D6064CE010E94AA0DBA
:101BB000CE0160E80E94AA0D8E8561E00E94D417D4
:101BC0008F8518161CF460E00E94D417F801E653C4
:101BD000FD4F90E080818EBD0DB407FEFDCF8EB528
:101BE0009F5F31969435B1F78F8518161CF461E02C
:101BF0000E94D417F3940C5A1F4F86E0F81699F6FA
:101C0000CE0160E40E94AA0DDF91CF911F910F9148
:101C1000FF900895CF93DF93DC0188EF91E0EAEC29
:101C2000F2E0EF019C01199221503040E1F7199642
:101C30001C9219971A961C92DF91CF910895EF92FA
:101C40000F93CF93DF93EC014D876C872E87E88A43
:101C50000F8781E088878F8F18A28F83EAE2F1E0F7
:101C600084918F5F8C83319684918F5F8D833196C1
:101C7000FE8FED8F0E94510881E00E94320885E0BE
:101C80000E9440088CE00E943B088D8561E00E9424
:101C900095178C8561E00E9495178E8561E00E9402
:101CA0009517888918161CF461E00E9495178F8596
:101CB00018161CF461E00E949517888918166CF4B8
:101CC00060E00E94D4176AE070E080E090E00E943B
:101CD0007F16888961E00E94D417EC852E2F332768
:101CE00027FD3095F901EC5AFB4FE491F0E0EE0F3F
:101CF000FF1FE05CFB4F859194919C8B8B8B285947
:101D00003B4FF90184918A8FED852E2F332727FDD4
:101D10003095F901EC5AFB4FE491F0E0EE0FFF1F14
:101D2000E05CFB4F859194919A8B898B28593B4FAE
:101D3000F9018491898FEF852E2F332727FD309568
:101D4000F901EC5AFB4FE491F0E0EE0FFF1FE05C6D
:101D5000FB4F859194919E8B8D8B28593B4FF901B8
:101D600084918B8FEE852E2F332727FD3095F90137
:101D7000EC5AFB4FE491F0E0EE0FFF1FE05CFB4FED
:101D800085919491988F8F8B28593B4FF9018491BD
:101D90008C8FCE0161E20E94AA0DCE0164E10E9407
:101DA000AA0D8B8587FF02C08FE78B876B856068E4
:101DB000CE010E94AA0DCE0160E20E94AA0DCE01C2
:101DC0006CE00E94AA0DCE010E94CA0DDF91CF9156
:101DD0000F91EF900895CF93DF93DC01E0E8FFE6E9
:101DE00085919491ED01C75ADF4FAD0141595F4F85
:101DF0008150904C09F04EC0E6E9FFE6E491E8839B
:101E0000E7E9FFE6E4911496EC931497E8E9FFE61E
:101E1000E4911596EC931597E9E9FFE68591949185
:101E200017969C938E931697EBE9FFE68591949114
:101E300019969C938E931897EDE9FFE6E4919B9693
:101E4000EC939B97EEE9FFE6E4919A96EC939A97D0
:101E5000EFE9FFE6E491EA01E883E0EAFFE6859135
:101E600094915D969C938E935C97E2EAFFE6859150
:101E700094915F969C938E935E97E4EAFFE685913A
:101E8000949191969C938E939097E6EAFFE68591C4
:101E9000949132C08CE3888314961C9214972FEF90
:101EA00015962C93159780E293E017969C938E934A
:101EB000169784ED93E019969C938E93189781E082
:101EC0009B968C939B979A968C939A97FA01208372
:101ED0008CEA9DE05D969C938E935C978EED9DE0E1
:101EE0005F969C938E935E9784E79EE091969C9379
:101EF0008E9390978CE39FE093969C938E9392970A
:101F0000DF91CF910895EF92FF920F931F93CF939C
:101F1000DF937C018C01025B1F4FC8010E940A0EF7
:101F2000C80161ED72E00E94C51AC8010E94CA0D85
:101F300083E00E94400888E091E0EEEFFFE309951E
:101F400084E590E0E80EF91EF7011082C8016CEA02
:101F500072E00E94101BC8010E94CA0DE701CA541A
:101F6000D040CE010E943909CE0164E00E942F09C1
:101F7000882339F462E370E080E090E00E947F16ED
:101F8000F0CFDF91CF911F910F91FF90EF900895C7
:101F90000F931F93CF93DF93EC018C01025B1F4FD4
:101FA000C80161E040E00E946509FE01E95AFF4F67
:101FB000CE5ADF4F85E59881891B8083269618824B
:101FC000C855D040698D613081F1613028F0888D2D
:101FD000653008F043C03DC0CE0185960E9489134C
:101FE000CE0160E00E946C08C8010E940A0ECA5A25
:101FF000DF4F81E08883C80169EF72E00E94C51A53
:10200000C8010E94CA0D83B7817F846083BF83B7F4
:10201000816083BF83B7816083BF889583B78E7FDC
:1020200083BF83B78E7F83BF1FC0C059DF4F8881B6
:102030009981AA81BB818F709070A070B070089751
:10204000A105B10518F4C80167E00CC0C80168E734
:1020500009C0882349F06B5FC80104C0882321F0C0
:10206000C8016FE20E94E81ADF91CF911F910F9192
:102070000895AF92BF92CF92DF92EF92FF920F93AB
:102080001F93CF93DF93EC01CB57DF4F8881C55867
:10209000D040882309F44AC08C3010F010E002C010
:1020A0001CE0181BCA5ADF4F81E08883C655D04018
:1020B0006EE4C62ED12CCC0EDD1EC60160E00E945F
:1020C000610953E5A52EB12CAC0EBD1EF5010081B2
:1020D0004DE2F42E4F2D401B410F0D5FC60160E015
:1020E00024E533E0E32E0E94EC0BC60161E00E9480
:1020F0006109F5010081F01AF10E0D5FC60160E083
:102100004F2D24E50E948E0BC95ADF4F84E089933E
:10211000F5018081181B115D1883AB966991799147
:10212000C6010E94C51A888181508883DF91CF91B2
:102130001F910F91FF90EF90DF90CF90BF90AF90E5
:102140000895AF92BF92CF92DF92EF92FF920F93DA
:102150001F93CF93DF93EC01EFE7AE2EB12CA80EC7
:10216000B91EF501E080F180028113810E944B16B7
:10217000E61AF70A080B190B7EE7C72ED12CCC0EF6
:10218000DD1EF601808190E0A0E0B0E08E159F0595
:10219000A007B10708F081C08E0106581F4FF80153
:1021A00080819181A281B3810097A105B10509F4D5
:1021B00074C00E944B16F6012081620F711D811DB3
:1021C000911DF5016083718382839383FE01E05941
:1021D000FF4F80819181A281B3810196A11DB11D24
:1021E00080839183A283B383F801108211821282CB
:1021F00013820E945916CA58DF4F688379838A83F5
:102200009B83C657D040CE010E947108CE010A962A
:102210000E943909CE0148960E94E30881E032C04D
:102220008E010B5D1F4FC8010E948513C8010E94DB
:102230005D14C8010E945315CE010E943910CE01D1
:102240000E94C80F8E01025B1F4FC8010E94CA0D79
:10225000CC5ADF4F8881C455D040882319F4C80177
:102260000E940A0E0E945916C658DF4F6883798370
:102270008A839B83249728813981621B730B7A930D
:102280006A9380E0DF91CF911F910F91FF90EF90C3
:10229000DF90CF90BF90AF900895C658DF4F8881F0
:1022A0009981AA81BB81CA57D0400097A105B10589
:1022B00041F7B6CF2F923F924F925F926F927F92EB
:1022C0008F929F92AF92BF92CF92DF92EF92FF9246
:1022D0000F931F93DF93CF93CDB7DEB72B970FB636
:1022E000F894DEBF0FBECDBF9B878A877A83698350
:1022F0005C834B838C0101591F4FF8018081882337
:1023000009F422C18A859B858A5A9F4F9B878A87B9
:1023100081E0EA85FB85808312921292E455F040B9
:10232000FB87EA87108E9EE4E92EF12CEE0EFF1E4D
:10233000C70161E00E9461098AE0282E312C8A855C
:102340009B85280E391EB5E26B2E712C680E791E06
:10235000E981FA81F491FD83A7E58A2E912C880EFC
:10236000991EF8E5CF2ED12CC80ED91EE2E54E2ECF
:10237000512C480E591E8D5A9F4F9F838E8370E7B4
:10238000A72EB12C8A859B85A80EB91E19870887B0
:102390008A859B850E94A1108823D1F39D81992372
:1023A00011F410E003C0EE81FF811081C70160E0ED
:1023B00040E025E433E00E94270C8B819C81892B2F
:1023C00041F0145FC70160E0412F2B813C810E94E6
:1023D000270CF40110828CE0F6018083C70169812B
:1023E0007A810E94C51AF201208130E0C901880F6C
:1023F000991F820F931F909581959F4F8D5AF401DD
:102400008083EE81FF81208130E0C901880F991F10
:10241000820F931F909581959F4F835DF601808376
:10242000F501808184FF04C0C70165EC73E003C03F
:10243000C70161EC73E00E94101BF201208130E0C3
:10244000C901880F991F820F931F909581959F4F07
:102450008D5AF4018083F60180818F5F8083EA8545
:10246000FB8582A5882321F0C7016DEB73E003C0D3
:10247000C70169EB73E00E94101BF201808190E0BC
:102480009C01220F331F280F391F309521953F4F94
:102490002D5AF4012083F60180818F5F8083C7016C
:1024A00065EB73E00E94101BC10165E00E942F09DB
:1024B000882351F0EA85FB8562A56F5FC3010E9406
:1024C000BC15C3010E94B615C10164E00E942F092A
:1024D000882399F4E885F9856081262F30E040E073
:1024E00050E0F50180819181A281B3818217930729
:1024F000A407B50708F16F3FF9F08A859B858159DC
:102500009F4F9B878A878FEFEA85FB858083EF56F5
:10251000F040FB87EA87C30160E00E942913C301F2
:102520000E94B01581E0EA85FB85808F0DC08A8509
:102530009B850E94830F2CCFC10166E00E942F096A
:10254000882309F425CFF3CF2B960FB6F894DEBF7E
:102550000FBECDBFCF91DF911F910F91FF90EF90F4
:10256000DF90CF90BF90AF909F908F907F906F90B3
:102570005F904F903F902F90089540E050E00E9470
:102580005A110895AF92BF92CF92DF92EF920F93BC
:10259000CF93DF936C018EE790E0C80ED91E82E3E3
:1025A000F601808381E090E0A0E0B0E0B293A293D6
:1025B000929382936F0185EF9FEFC80ED91E8FEF24
:1025C000F601808381E99FEFC80ED91EC6010E94E3
:1025D000EB0EC6010E946808C6016FEF0E946C08EE
:1025E0004AE0A42EB12CAC0CBD1CC5010E941F09F1
:1025F000C5010E943909C60148960E94D908C60142
:10260000825B9F4F6DE04BE020E10FE03EE0E32E68
:102610000E941F0EE601A596CE010E94C915C501B4
:1026200065E00E942F09882329F0CE0160E00E9416
:10263000BC1506C0CE016BEC73E040E00E943B137A
:10264000DF91CF910F91EF90DF90CF90BF90AF903F
:102650000895FC01662371F4178A158A14A213A247
:10266000108E1092C6041092C5041092C3041092EA
:10267000B400118208950F931F93CF93DF93EC0161
:102680008B01442371F460E00E9429131E870D879B
:102690001B8A1A8A81E0898389E08E8B198E1B8EB2
:1026A0001D8EDF91CF911F910F910895CF93DF93EE
:1026B000EC01662339F58881882321F189818823FB
:1026C00009F5898590E0880F991FEF81F885E80F5B
:1026D000F91F859194912FEF8F3F920711F4188283
:1026E00011C09C8790E0880F991FEA85FB85E80F51
:1026F000F91F65917491CE0140E00E943B138985DA
:102700008F5F8987DF91CF91089560E00E94561313
:10271000089560E00E94291308950F93DC010023BF
:1027200009F047C06230A1F1633030F4662351F004
:10273000613009F03EC009C0633081F1643009F0B6
:1027400038C032C056964C9334C0842F90E0880F26
:10275000991F1F962D913C915097280F391FF90111
:102760008591949190969C938E935F97FC014591EF
:102770005491642F91964C939197252F3327842F52
:1027800090E02817390708F4652F92966C9311C0D2
:1027900059964C9359975A962C930BC05B964C9331
:1027A0005B975C962C9305C05D964C935D975E9607
:1027B0002C930F9108950F93CF93DF93EC01662331
:1027C00009F077C08981882309F473C08D89882333
:1027D00009F06FC0EA89FB89EE0FFF1F4D855E850A
:1027E000E40FF51F259134912115310509F049C0F9
:1027F0008989813031F41B8A1A8AFA012591349132
:1028000040C019828881882379F0CE0160E00E945F
:1028100056138A899B89880F991FED85FE85E80FDD
:10282000F91F259134912DC01F8A1D8A1CA21BA25D
:10283000188E1092C6041092C5041092C304109210
:10284000B40037C006E0369527950A95E1F76F701A
:10285000422F4F71B5E036952795BA95E1F7205193
:10286000CE0100E00E948D138A899B8901969B8B83
:102870008A8B880F991FED85FE85E80FF91F25913A
:102880003491B901769567957695679520FDDACFF5
:10289000862F8F738C8B3D8B1DA21CA21BA281E007
:1028A0008F8B8093C304188E8A899B8901969B8B9A
:1028B0008A8BDF91CF910F91089560E00E94DB1326
:1028C0000895CF93DF93EC01662309F0E9C08F8967
:1028D000882309F4E5C08D89882371F41F8A1D8A35
:1028E0001CA21BA2188E1092C6041092C50410924E
:1028F000C3041092B400D4C081508D8B8DA1882365
:1029000009F044C08BA19CA10196880F991FEF8DFF
:10291000F8A1E80FF91F85919491282F27702EA315
:10292000AC0173E0569547957A95E1F79A01369593
:102930002795892F9927869586958FA32F738C814C
:10294000289F202D11242DA341704093C7048BA1F3
:102950009CA101969CA38BA329A130E08217930729
:10296000A8F08AA1882329F0281B31093CA32BA3B6
:102970000DC01F8A1D8A1CA21BA2188E1092C604AD
:102980001092C5041092C3041092B4008DA181501E
:102990008DA3988D9F5F988F2FA18C89280F8C8590
:1029A000280F2A836B8D662369F0892F992787FD6D
:1029B000909570E00E94DC1C8C8D869F802D1124E8
:1029C000820F8A838A8190E0CB966BE370E00E944D
:1029D000DC1C8A832E892B83698D662379F0888D90
:1029E000772767FD7095992787FD90950E94DC1CDD
:1029F0008A8D869F802D1124820F8B836D8D662397
:102A000099F0888D992787FD909570E00E94DC1CD5
:102A1000CB0162E070E00E94DC1C9E8D899F802DBE
:102A200011249B81890F8B838B818A300CF089E084
:102A300087FD80E08B838C898F3309F41B82F894A7
:102A4000EA81F0E0E151FC4FE491E093C4042D8170
:102A500030E08B81992787FD9095A901489F9001CF
:102A6000499F300D589F300D112488A590E0A90191
:102A7000489F9001499F300D589F300D11248EA121
:102A8000992787FD9095AC01249FC001259F900D4B
:102A9000349F900D11248093C5048093C6047894CC
:102AA000DF91CF91089560E00E94611408956091D4
:102AB000C504662381F18091C2048F5F8093C204B4
:102AC0009091C404891738F130E08091C3048823C1
:102AD00009F431E03093C3041092C2048091C7041A
:102AE0008823A9F08091110123E4829FC001112461
:102AF000895B8093110190E070E00E94C81C809374
:102B0000C60405C08091C6048093B40008953323A1
:102B1000C9F780E0F9CF08951F920F920FB60F9278
:102B200011242F933F934F935F936F937F938F93D2
:102B30009F93AF93BF93EF93FF930E945715FF911D
:102B4000EF91BF91AF919F918F917F916F915F9125
:102B50004F913F912F910F900FBE0F901F9018959E
:102B600067EE73E040E00E943B13089569ED73E067
:102B700040E00E943B130895FC01862F668170E0BF
:102B80006F5F7F4F992787FD90950E94DC1C85839E
:102B900008950F93FC0181E0848384E080A78AE29A
:102BA00094E0908B8787CF0161E040E020E000E077
:102BB0000E948D1383E061E070E00E943517E1EB25
:102BC000F0E08081887F81608083F894109280009B
:102BD000E1E8F0E01082109285001092840088E114
:102BE00091E0909389008093880080818860808341
:102BF000808181608083EFE6F0E080818260808365
:102C000078940F9108951F920F920FB60F9211248E
:102C10002F933F938F939F93AF93BF938091CC0457
:102C20009091CD04A091CE04B091CF043091D00406
:102C30000196A11DB11D232F2D5F2D3720F02D579B
:102C40000196A11DB11D2093D0048093CC049093D4
:102C5000CD04A093CE04B093CF048091C80490918A
:102C6000C904A091CA04B091CB040196A11DB11D65
:102C70008093C8049093C904A093CA04B093CB0472
:102C8000BF91AF919F918F913F912F910F900FBE68
:102C90000F901F9018958FB7F8942091CC04309125
:102CA000CD044091CE045091CF048FBFB901CA0129
:102CB00008959FB7F8942091C8043091C9044091B9
:102CC000CA045091CB0486B5A89B06C08F3F21F063
:102CD0002F5F3F4F4F4F5F4F9FBF542F432F322FD8
:102CE0002227280F311D411D511D82E0220F331F65
:102CF000441F551F8A95D1F7B901CA0108959B0158
:102D0000AC017FB7F8948091C8049091C904A09158
:102D1000CA04B091CB0466B5A89B05C06F3F19F0FB
:102D20000196A11DB11D7FBFBA2FA92F982F88270B
:102D3000860F911DA11DB11D62E0880F991FAA1F6A
:102D4000BB1F6A95D1F7BC012DC0FFB7F8948091E5
:102D5000C8049091C904A091CA04B091CB04E6B50F
:102D6000A89B05C0EF3F19F00196A11DB11DFFBF43
:102D7000BA2FA92F982F88278E0F911DA11DB11D45
:102D8000E2E0880F991FAA1FBB1FEA95D1F7861BA7
:102D9000970B885E9340C8F221503040404050402D
:102DA00068517C4F211531054105510571F6089593
:102DB000789484B5826084BD84B5816084BD85B516
:102DC000826085BD85B5816085BDEEE6F0E08081DD
:102DD00081608083E1E8F0E01082808182608083FE
:102DE000808181608083E0E8F0E080818160808381
:102DF000E1EBF0E0808184608083E0EBF0E08081B3
:102E000081608083EAE7F0E0808184608083808154
:102E100082608083808181608083808180688083FC
:102E20001092C1000895982F8E3008F09E50977030
:102E3000809112018295880F880F807C892B809366
:102E40007C0080917A00806480937A0080917A007F
:102E500086FDFCCF2091780040917900942F80E08E
:102E600030E0282B392BC90108951F93CF93DF93AE
:102E7000182FEB0161E00E949517209709F44AC0D2
:102E8000CF3FD10509F449C0E12FF0E0E458FB4FF2
:102E900084918330C1F0843028F4813051F0823045
:102EA000B1F50CC0863019F1873049F1843079F5DD
:102EB00014C084B5806884BDC7BD33C084B580624A
:102EC00084BDC8BD2EC08091800080688093800042
:102ED000D0938900C093880024C0809180008062D4
:102EE00080938000D0938B00C0938A001AC0809199
:102EF000B00080688093B000C093B30012C080918E
:102F0000B00080628093B000C093B4000AC0C038A3
:102F1000D1051CF4812F60E002C0812F61E00E9486
:102F2000D417DF91CF911F910895CF93DF93482F4E
:102F300050E0CA0188599B4FFC0134914C5A5B4FB9
:102F4000FA018491882369F190E0880F991FFC01B0
:102F5000EA5CFB4FA591B491FC01E05CFB4FC5918D
:102F6000D491662351F42FB7F8948C91932F9095B8
:102F700089238C93888189230BC0623061F42FB739
:102F8000F8948C91932F909589238C938881832B2F
:102F900088832FBF06C09FB7F8948C91832B8C93A6
:102FA0009FBFDF91CF910895482F50E0CA01845808
:102FB0009B4FFC012491CA0188599B4FFC019491BD
:102FC0004C5A5B4FFA013491332309F440C0222359
:102FD00051F1233071F0243028F42130A1F0223057
:102FE00011F514C02630B1F02730C1F02430D9F4E7
:102FF00004C0809180008F7703C0809180008F7D16
:103000008093800010C084B58F7702C084B58F7D17
:1030100084BD09C08091B0008F7703C08091B0005B
:103020008F7D8093B000E32FF0E0EE0FFF1FE05C98
:10303000FB4FA591B4912FB7F894662321F48C919E
:103040009095892302C08C91892B8C932FBF089572
:10305000682F70E0CB0184589B4FFC012491CB0179
:1030600088599B4FFC0144916C5A7B4FFB01949112
:10307000992319F420E030E03CC0222351F12330A1
:1030800071F0243028F42130A1F0223011F514C061
:103090002630B1F02730C1F02430D9F404C080913B
:1030A00080008F7703C0809180008F7D80938000A7
:1030B00010C084B58F7702C084B58F7D84BD09C0F0
:1030C0008091B0008F7703C08091B0008F7D809396
:1030D000B000892F90E0880F991F865B9B4FFC0101
:1030E000A591B4918C9120E030E0842311F021E08F
:1030F00030E0C901089508951F920F920FB60F9204
:1031000011242F933F934F938F939F93EF93FF93AC
:103110008091C00082FD1DC04091C6002091110524
:10312000309112052F5F3F4F2F7330708091130540
:10313000909114052817390771F0E0911105F0916D
:103140001205EF52FB4F4083309312052093110577
:1031500002C08091C600FF91EF919F918F914F9196
:103160003F912F910F900FBE0F901F901895E091F7
:103170006505F0916605E05CFF4F8191919120819A
:103180003181821B930B8F739070892B11F00E94F9
:103190007B1808951F920F920FB60F9211242F9350
:1031A0003F938F939F93EF93FF9320915505309119
:1031B000560580915705909158052817390731F425
:1031C0008091C1008F7D8093C10014C0E0915705AC
:1031D000F0915805EB5EFA4F208180915705909150
:1031E000580501968F7390709093580580935705FA
:1031F0002093C600FF91EF919F918F913F912F9166
:103200000F900FBE0F901F901895AF92BF92DF9254
:10321000EF92FF920F931F93CF93DF93EC017A010C
:103220008B01DD24403081EE580780E0680780E0A4
:10323000780711F0DD24D39491E0A92EB12CEC890C
:10324000FD89DD2069F0C50108A002C0880F991F23
:103250000A94E2F7808360E079E08DE390E005C0B6
:10326000108260E874E88EE190E0A80197010E9466
:10327000EF1C2150304040405040569547953795BF
:10328000279580E12030380720F0DD2011F0DD2483
:10329000D6CFE889F9893083EA89FB89208319A28E
:1032A000EE89FF89408121E030E0C9010C8C02C029
:1032B000880F991F0A94E2F7482B4083EE89FF8913
:1032C0004081C9010D8C02C0880F991F0A94E2F752
:1032D000482B4083EE89FF894081C9010E8C02C0D2
:1032E000880F991F0A94E2F7482B4083EE89FF89E3
:1032F00080810F8C02C0220F331F0A94E2F72095C1
:1033000028232083DF91CF911F910F91FF90EF90A1
:10331000DF90BF90AF900895DC011C96ED91FC9179
:103320001D97E05CFF4F2191319180819181281B95
:10333000390B2F733070C9010895DC011C96ED9193
:10334000FC911D97E05CFF4F20813181E054F040FB
:10335000DF01AE5BBF4F8D919C9111972817390704
:1033600019F42FEF3FEF07C08D919C91E80FF91FE3
:103370008081282F30E0C9010895DC011C96ED9171
:10338000FC911D97E05CFF4F20813181E054F040BB
:10339000DF01AE5BBF4F8D919C91119728173907C4
:1033A00019F42FEF3FEF10C08D919C911197E80F0A
:1033B000F91F20818D919C91119701968F739070C8
:1033C00011969C938E9330E0C9010895DC0191968B
:1033D0008C919197882339F05496ED91FC915597F3
:1033E000808186FFF9CF91961C920895CF93DF9349
:1033F000EC01EE85FF85E05CFF4F20813181E054D8
:10340000F0402F5F3F4F2F733070DF01AE5BBF4F37
:103410008D919C91119728173907D1F3E05CFF4FEC
:1034200080819181E054F040E80FF91F6083EE85C0
:10343000FF85E05CFF4F31832083EE89FF89208187
:1034400081E090E00F8C02C0880F991F0A94E2F788
:10345000282B208381E089A3EC89FD898081806409
:10346000808381E090E0DF91CF91089510925C0518
:1034700010925B0588EE93E0A0E0B0E080935D05DC
:1034800090935E05A0935F05B09360058FE191E096
:1034900090935A058093590581ED94E090936605C9
:1034A0008093650585E195E09093680580936705B5
:1034B00085EC90E090936A058093690584EC90E038
:1034C00090936C0580936B0580EC90E090936E0573
:1034D00080936D0581EC90E09093700580936F056B
:1034E00082EC90E0909372058093710586EC90E0F9
:1034F000909374058093730584E08093750583E051
:103500008093760587E08093770585E08093780542
:1035100081E0809379050895CF93DF930E94D816B8
:103520000E94DC07C7EBD8E10E94D1072097E1F3A6
:103530000E94B718F9CFCF92DF92EF92FF920F93CC
:103540001F93CF93DF937C016B018A01C0E0D0E031
:103550000FC0D6016D916D01D701ED91FC910190E5
:10356000F081E02DC7010995C80FD91F0150104007
:103570000115110571F7CE01DF91CF911F910F91C8
:10358000FF90EF90DF90CF900895EF92FF920F930E
:103590001F93CF93DF937C018B01C0E0D0E0F80153
:1035A0000F5F1F4F6491662359F0D701ED91FC9195
:1035B0000190F081E02DC7010995C80FD91FEFCF09
:1035C000CE01DF91CF911F910F91FF90EF90089561
:1035D000DC01ED91FC910190F081E02D09950895B9
:1035E000EF92FF920F931F938C01DC01ED91FC9100
:1035F0000190F081E02D6DE009957C01D801ED91FD
:10360000FC910190F081E02DC8016AE009959C01D0
:103610002E0D3F1DC9011F910F91FF90EF9008954E
:10362000EF92FF920F931F937C010E94C51A8C01A9
:10363000C7010E94F01A9C01200F311FC9011F9180
:103640000F91FF90EF900895CF93DF93EC016115F8
:10365000710519F420E030E00FC0DB010D9000206F
:10366000E9F71197A61BB70BE881F9810280F38176
:10367000E02DAD0109959C01C901DF91CF9108951D
:103680000E94241B08952F923F924F925F926F9257
:103690007F928F929F92AF92BF92CF92DF92EF92E2
:1036A000FF920F931F93DF93CF93CDB7DEB73B010C
:1036B0004C0119012A016D897E898F89988D6A19BB
:1036C0007B098C099D09621A730A840A950AA40170
:1036D00093010E94A91CE218F30804091509A80126
:1036E00097010E94111D2A0D3B1D4C1D5D1DB90146
:1036F000CA01CF91DF911F910F91FF90EF90DF9062
:10370000CF90BF90AF909F908F907F906F905F9081
:103710004F903F902F90089598D088F09F5790F049
:10372000B92F9927B751A0F0D1F0660F771F881FE6
:10373000991F1AF0BA95C9F712C0B13081F09FD025
:10374000B1E008959CC0672F782F8827B85F39F0C3
:10375000B93FCCF3869577956795B395D9F73EF445
:1037600090958095709561957F4F8F4F9F4F0895ED
:10377000E89409C097FB3EF490958095709561950B
:103780007F4F8F4F9F4F9923A9F0F92F96E9BB27C1
:103790009395F695879577956795B795F111F8CF3D
:1037A000FAF4BB0F11F460FF1BC06F5F7F4F8F4FA8
:1037B0009F4F16C0882311F096E911C0772321F09E
:1037C0009EE8872F762F05C0662371F096E8862F36
:1037D00070E060E02AF09A95660F771F881FDAF78D
:1037E000880F9695879597F9089597F99F6780E8D0
:1037F00070E060E008959FEF80EC089500240A9443
:103800001616170618060906089500240A941216BB
:103810001306140605060895092E0394000C11F4EE
:10382000882352F0BB0F40F4BF2B11F460FF04C09B
:103830006F5F7F4F8F4F9F4F089557FD9058440FF4
:10384000551F59F05F3F71F04795880F97FB991FFF
:1038500061F09F3F79F087950895121613061406BC
:10386000551FF2CF4695F1DF08C016161706180649
:10387000991FF1CF86957105610508940895E89424
:10388000BB2766277727CB0197F908950BD0C4CFC4
:10389000B5DF28F0BADF18F0952309F0A6CFABCF3B
:1038A0001124EECFCADFA0F3959FD1F3950F50E01E
:1038B000551F629FF001729FBB27F00DB11D639FE2
:1038C000AA27F00DB11DAA1F649F6627B00DA11D88
:1038D000661F829F2227B00DA11D621F739FB00D2E
:1038E000A11D621F839FA00D611D221F749F33279E
:1038F000A00D611D231F849F600D211D822F762F37
:103900006A2F11249F5750408AF0E1F088234AF033
:10391000EE0FFF1FBB1F661F771F881F915050407F
:10392000A9F79E3F510570F060CFAACF5F3FECF33F
:10393000983EDCF3869577956795B795F795E7956B
:103940009F5FC1F7FE2B880F911D9695879597F97C
:103950000895629FD001739FF001829FE00DF11DD9
:10396000649FE00DF11D929FF00D839FF00D749FF9
:10397000F00D659FF00D9927729FB00DE11DF91FA5
:10398000639FB00DE11DF91FBD01CF011124089502
:10399000AA1BBB1B51E107C0AA1FBB1FA617B70775
:1039A00010F0A61BB70B881F991F5A95A9F7809591
:1039B0009095BC01CD01089597FB092E07260AD0EA
:1039C00077FD04D0E5DF06D000201AF470956195EC
:1039D0007F4F0895F6F7909581959F4F0895A1E246
:1039E0001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F79
:1039F000FF1FA217B307E407F50720F0A21BB30BC4
:103A0000E40BF50B661F771F881F991F1A9469F73F
:103A100060957095809590959B01AC01BD01CF019B
:103A2000089597FB092E05260ED057FD04D0D7DF49
:103A30000AD0001C38F450954095309521953F4FA1
:103A40004F4F5F4F0895F6F790958095709561956B
:103A50007F4F8F4F9F4F0895EE0FFF1F0590F491FA
:083A6000E02D0994F894FFCF5A
:103A680041565220495350004C4F41444552008022
:103A7800080101000000006D0D9B1A00000000F60F
:0C3A8800199B1A8C19BD199D19E6190034
:00000001FF
Tue Aug 12, 2014 11:39 pm
Tue Aug 12, 2014 11:48 pm
Wed Aug 13, 2014 3:33 am
Skyrunner65 wrote:One question: Could you control a Gamebuino with another Gamebuino using a similar method?