avr/nano: added srf sensors
authorErik Andresen <erik@vontaene.de>
Thu, 7 May 2015 11:37:34 +0000 (13:37 +0200)
committerErik Andresen <erik@vontaene.de>
Thu, 7 May 2015 11:37:34 +0000 (13:37 +0200)
avr/nano/main.c
avr/nano/main.hex

index 0cb0acf..5418055 100644 (file)
@@ -4,6 +4,7 @@
 #include <avr/io.h>
 #include <avr/interrupt.h>
 #include <avr/sleep.h>
+#include <util/delay.h>
 #include "uart.h"
 
 /*
  * 0x02 Distance left LSB
  * 0x03 Distance right MSB
  * 0x04 Distance right LSB
+ * 0x05 Distance forward MSB
+ * 0x06 Distance forward LSB
+ * 0x07 Distance backward MSB
+ * 0x08 Distance backward LSB
  *
  * 0xff Bootloader
  */
@@ -26,6 +31,10 @@ static volatile uint8_t ireg=0;
 static volatile uint8_t bootloader=0;
 static volatile uint16_t dist_left=0;
 static volatile uint16_t dist_right=0;
+static volatile uint16_t dist_forward=0;
+static volatile uint16_t dist_backward=0;
+static volatile uint8_t start_dist_fwd=0;
+static volatile uint8_t start_dist_bwd=0;
 
 ISR(TWI_vect)
 {
@@ -41,6 +50,10 @@ ISR(TWI_vect)
                        switch(ireg) {
                                case 0x00: // register select
                                        ireg = TWDR;
+
+                                       if (ireg == 0x05) start_dist_fwd=1;
+                                       if (ireg == 0x07) start_dist_bwd=1;
+
                                        ireg--; // because we do ireg++ below
                                        TWI_ACK;
                                        break;
@@ -72,6 +85,24 @@ ISR(TWI_vect)
                                        TWDR = tmp16;
                                        TWI_ACK;
                                        break;
+                               case 0x05: // Distance forward MSB
+                                       tmp16 = dist_forward;
+                                       TWDR = tmp16>>8;
+                                       TWI_ACK;
+                                       break;
+                               case 0x06: // Distance forward LSB
+                                       TWDR = tmp16;
+                                       TWI_ACK;
+                                       break;
+                               case 0x07: // Distance backward MSB
+                                       tmp16 = dist_backward;
+                                       TWDR = tmp16>>8;
+                                       TWI_ACK;
+                                       break;
+                               case 0x08: // Distance backward LSB
+                                       TWDR = tmp16;
+                                       TWI_ACK;
+                                       break;
                                default:
                                        TWDR = 0;
                                        TWI_NAK;
@@ -128,6 +159,40 @@ static unsigned short get_distance(uint8_t i) {
 }
 
 
+ISR(INT0_vect) {
+       static uint16_t t_start=0;
+       uint16_t t_now = TCNT1;
+       uint16_t t_diff;
+
+       if (bit_is_set(PIND, 2)) { // high level
+               // start timer
+               t_start = t_now;
+       } else {
+               t_diff = t_now - t_start;
+               dist_forward = t_diff*2.7586 + 0.5; // t [µs] / 580 = mm
+               // disable this interrupt
+               EIMSK |= (1 << INT0);
+       }
+}
+
+
+ISR(INT1_vect) {
+       static uint16_t t_start=0;
+       uint16_t t_now = TCNT1;
+       uint16_t t_diff;
+
+       if (bit_is_set(PIND, 3)) { // high level
+               // start timer
+               t_start = t_now;
+       } else {
+               t_diff = t_now - t_start;
+               dist_backward = t_diff*2.7586 + 0.5; // t [µs] / 580 = mm
+               // disable this interrupt
+               EIMSK |= (1 << INT1);
+       }
+}
+
+
 int main(void) {
        bootloader = 0x00;
        setup_uart(9600);
@@ -137,16 +202,23 @@ int main(void) {
        TWAR = 0x52;
        TWI_RESET;
 
+       // Timer 1: Normal mode, Top: 0xffff, Prescaler: F_CPU/256=62500Hz
+       TCCR1A = 0x0;
+       TCCR1B = (1 << CS12);
+
+       // External Interrupts
+       EICRA = (1 << ISC10) | (1 << ISC00);
+
        printf("\r\nStart\r\n");
 
        set_sleep_mode(SLEEP_MODE_IDLE);
        sei();
        while(1) {
                switch(ireg) {
-                       case 1: // ir left
+                       case 0x01: // ir left
                                dist_left = get_distance(0);
                                break;
-                       case 3: // ir right
+                       case 0x03: // ir right
                                dist_right = get_distance(1);
                                break;
                        case 0xff: // Magic reg that starts the bootloader
@@ -160,6 +232,31 @@ int main(void) {
                                break;
                }
 
+               if (start_dist_fwd) {
+                       start_dist_fwd = 0;
+                       dist_forward = 0;
+
+                       DDRD |= (1 << 2);
+                       PORTD |= (1 << 2);
+                       _delay_us(10);
+                       PORTD &= ~(1 << 2);
+                       DDRD &= ~(1 << 2);
+                       // wait for interrupt
+                       EIMSK |= (1 << INT0);
+               }
+               if (start_dist_bwd) {
+                       start_dist_bwd = 0;
+                       dist_backward = 0;
+
+                       DDRD |= (1 << 3);
+                       PORTD |= (1 << 3);
+                       _delay_us(10);
+                       PORTD &= ~(1 << 3);
+                       DDRD &= ~(1 << 3);
+                       // wait for interrupt
+                       EIMSK |= (1 << INT1);
+               }
+
                sleep_mode();
        }
 
index c6b1c2d..faac092 100644 (file)
-:100000000C9440000C945D000C945D000C945D0019\r
-:100010000C945D000C945D000C945D000C945D00EC\r
-:100020000C945D000C945D000C945D000C945D00DC\r
-:100030000C945D000C945D000C945D000C945D00CC\r
-:100040000C945D000C945D000C9401010C945D0017\r
-:100050000C945D000C945D000C945D000C945D00AC\r
-:100060000C945F000C945D00454647656667002070\r
-:100070002B2D2E3031323334353637383968000085\r
-:1000800011241FBECFEFD8E0DEBFCDBF11E0A0E04E\r
-:10009000B1E0EEE9FCE002C005900D92A031B1079D\r
-:1000A000D9F721E0A0E1B1E001C01D92AD38B2075F\r
-:1000B000E1F70E940A020C944D060C9400001F9276\r
-:1000C0000F920FB60F9211248F939F938091B900D6\r
-:1000D000887F803879F048F4803609F04DC085EC8F\r
-:1000E0008093BC00109217014FC0883AC1F0883B42\r
-:1000F000B1F042C080911701882339F08F3F99F504\r
-:100100008091BB00809316012EC08091BB0080932C\r
-:1001100017018091170181508093170120C08091B1\r
-:1001200017018230C1F038F48130D9F48091140184\r
-:100130009091150109C0833019F0843061F011C02D\r
-:1001400080911201909113018093100190931101FD\r
-:100150009093BB0004C0809110018093BB0085EC9C\r
-:1001600003C01092BB0085E88093BC00809117010A\r
-:100170008F5F8093170108C08091BC008B7E8093B5\r
-:10018000BC0085EC8093BC009F918F910F900FBEB7\r
-:100190000F901F90189593E890937A0080937C00BD\r
-:1001A00080917C00806C80937C0080917A008064D8\r
-:1001B00080937A0080917A0086FDFCCF8091780050\r
-:1001C0009091790045E080E090E020917A002064F1\r
-:1001D00020937A0020917A0026FDFCCF20917800B0\r
-:1001E00030917900820F931F415079F720917A0066\r
-:1001F0002F7720937A0065E070E00E949B03CB018B\r
-:1002000008951F920F920FB60F9211248F939F9310\r
-:10021000EF93FF938091C00087FF17C0E0911A0110\r
-:10022000F0911B018091C600808381E0EF37F807D1\r
-:1002300030F43196F0931B01E0931A0106C08CE173\r
-:1002400091E090931B0180931A01FF91EF919F9190\r
-:100250008F910F900FBE0F901F9018959C01E1ECAD\r
-:10026000F0E0808188618083808180688083E2EC17\r
-:10027000F0E080818660808340E050E084E0220FDF\r
-:10028000331F441F551F8A95D1F760E074E284EF55\r
-:1002900090E00E94AF03DA01C9010197A109B109F9\r
-:1002A000892F9A2FAB2FBB27A7FDBA958093C50046\r
-:1002B00021502093C4008CE191E090931901809328\r
-:1002C000180190931B0180931A0108952091C0009A\r
-:1002D00025FFFCCFFC0180818093C6000895CF9359\r
-:1002E000DF931F92CDB7DEB78983CE0101960E94BE\r
-:1002F000660180E090E00F90DF91CF910895CF9359\r
-:10030000DF93EC01CE012196FC012081222319F01C\r
-:100310000E946601F7CFDF91CF9108958091C000D0\r
-:1003200087FFFCCF8091C60090E008950C948E0169\r
-:1003300066E971E08FE691E00C94FB03CF93DF93C5\r
-:10034000FC01E253FF4FA081B181EC01C453DF4FA8\r
-:1003500028813981A217B307B9F02091C00025FF89\r
-:1003600013C02C912093C60020813181AC014553EC\r
-:100370005F4F2417350718F42F5F3F4F03C09C01D0\r
-:1003800028593F4F31832083E0911801F0911901E2\r
-:1003900020911A0130911B012E173F07C1F1DC019A\r
-:1003A000AC59BF4FCD91DC911197208128836D917D\r
-:1003B0007C9111979C012B523F4FE9013881EB0151\r
-:1003C0002881321307C09C012C523F4FE90148811C\r
-:1003D0004F5F48839C012D593F4F6217730728F4E4\r
-:1003E000EB012196CD93DC9302C08D939C93D1E0D9\r
-:1003F000EF37FD0730F43196F0931901E0931801BF\r
-:1004000006C08CE191E09093190180931801DF916F\r
-:10041000CF9108951092160180E895E20E942E0176\r
-:100420000E94980182E58093BA008091BC008B7E87\r
-:100430008093BC0085EC8093BC0086E091E00E9434\r
-:10044000780483B7817F83BF7894C0E0D8E180913E\r
-:100450001701833061F08F3F91F08130B9F480E073\r
-:100460000E94CB0090931501809314010FC081E08E\r
-:100470000E94CB00909313018093120107C08091DA\r
-:100480001601853A19F4F894FE01099583B7816045\r
-:1004900083BF889583B78E7F83BFD9CF6F927F92BA\r
-:1004A0009F92AF92BF92CF92DF92EF92FF920F9303\r
-:1004B0001F93CF93DF93CDB7DEB72C970FB6F89489\r
-:1004C000DEBF0FBECDBF8C017B013A01FC0117825C\r
-:1004D0001682838181FF19C1CE0101965C01F8016A\r
-:1004E000D380F701D3FC2591D3FE21917F012223F4\r
-:1004F00009F407C1253249F4D3FC2591D3FE21919B\r
-:100500007F01253211F0912C1BC0B801822F90E0A1\r
-:100510000E94460463013601E2CF222309F4F1C0B0\r
-:10052000622F70E08FE690E02C870E94F0032C850C\r
-:10053000892B49F0F701D3FC2591D3FE21917F014E\r
-:1005400097FEEBCF0CC0233221F4F92DF0619F2EE2\r
-:10055000F1CF2C3639F4292D2068922EEBCF2223AF\r
-:1005600009F4CFC0622F70E088E690E02C870E94EB\r
-:10057000F0032C85892B41F06301F4E0CF0ED11CF0\r
-:10058000B8018FE390E012C0233641F0233789F0A1\r
-:10059000233521F5F92DF1609F2E0BC0630122E078\r
-:1005A000C20ED11CB801F301808191810E944604E2\r
-:1005B000B2CF630122E0C20ED11CF30160807180D2\r
-:1005C000F30190FC859190FE81913F01882309F40D\r
-:1005D000A2CFB80190E00E944604F2CF243611F079\r
-:1005E000293639F5630197FE09C0F4E0CF0ED11C1E\r
-:1005F000F30160817181828193810AC0F2E0CF0EA4\r
-:10060000D11CF30160817181882777FD8095982F37\r
-:10061000F92DFF7E9F2E97FF09C0909580957095CC\r
-:1006200061957F4F8F4F9F4FF0649F2E2AE030E0FF\r
-:1006300038C02037A1F040F42835D1F02F3609F02A\r
-:1006400060C028E030E019C0253719F0283751F094\r
-:1006500058C0292D2F7E922E2AE030E00EC0892D21\r
-:100660008061982E992D9462992E20E130E005C08A\r
-:10067000E92DE4609E2E20E132E0630197FE09C07F\r
-:10068000F4E0CF0ED11CF3016081718182819381EE\r
-:1006900008C0F2E0CF0ED11CF3016081718180E0CF\r
-:1006A00090E0A5010E94A504782E7A1896FE05C058\r
-:1006B000B8018DE290E00E94460494FE16C0FE014F\r
-:1006C000E70DF11D8081803381F0B80180E390E077\r
-:1006D0000E94460492FE09C0292D2072822F90E0CC\r
-:1006E000B801885A9F4F0E9446047A94F501E70D9D\r
-:1006F000F11D8081B80190E00E9446047110F5CF91\r
-:100700000ACFF8018681978102C08FEF9FEF2C9668\r
-:100710000FB6F894DEBF0FBECDBFDF91CF911F9112\r
-:100720000F91FF90EF90DF90CF90BF90AF909F9090\r
-:100730007F906F900895AA1BBB1B51E107C0AA1FB1\r
-:10074000BB1FA617B70710F0A61BB70B881F991F72\r
-:100750005A95A9F780959095BC01CD010895052E75\r
-:1007600097FB1EF400940E94C60357FD07D00E9419\r
-:10077000CE0307FC03D04EF40C94C603509540956D\r
-:10078000309521953F4F4F4F5F4F0895909580953D\r
-:10079000709561957F4F8F4F9F4F0895A1E21A2E5C\r
-:1007A000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F15\r
-:1007B000A217B307E407F50720F0A21BB30BE40B65\r
-:1007C000F50B661F771F881F991F1A9469F76095AC\r
-:1007D0007095809590959B01AC01BD01CF01089566\r
-:1007E000FC010590061621F00020D9F7C0010895FC\r
-:1007F0003197CF0108950F931F93CF93DF93EC01AF\r
-:100800008B01009731F46115710519F480E090E0D7\r
-:1008100038C06EE070E081E090E00E940305FC01CA\r
-:100820000097A1F380E883830115110571F0138708\r
-:10083000028781E883838091830190918401892BD1\r
-:1008400021F4F0938401E09383012097C9F0D187CC\r
-:10085000C087838182608383809185019091860126\r
-:10086000892B71F4F0938601E093850180918701D3\r
-:1008700090918801892B21F4F0938801E0938701FE\r
-:10088000CF01DF91CF911F910F9108950F931F9387\r
-:10089000CF93DF93182F092FEB018B8181FD03C0CC\r
-:1008A0008FEF9FEF20C082FF10C04E815F812C81AF\r
-:1008B0003D81421753077CF4E881F9819F012F5F46\r
-:1008C0003F4F39832883108306C0E885F985812F3F\r
-:1008D0000995892B29F72E813F812F5F3F4F3F8359\r
-:1008E0002E83812F902FDF91CF911F910F9108952B\r
-:1008F0000F931F93CF93DF93E0918501F0918601D1\r
-:10090000238121FF1BC0EC0100E010E08991609180\r
-:10091000850170918601DB011896ED91FC91199784\r
-:10092000882331F00995892B89F30FEF1FEFEECF64\r
-:100930008AE00995892B11F4C80102C08FEF9FEF5F\r
-:10094000DF91CF911F910F910895FA01AA272830C6\r
-:1009500051F1203181F1E8946F936E7F6E5F7F4F8C\r
-:100960008F4F9F4FAF4FB1E03ED0B4E03CD0670F08\r
-:10097000781F891F9A1FA11D680F791F8A1F911D5B\r
-:10098000A11D6A0F711D811D911DA11D20D009F4AB\r
-:1009900068943F912AE0269F11243019305D3193ED\r
-:1009A000DEF6CF010895462F4770405D4193B3E0D6\r
-:1009B0000FD0C9F7F6CF462F4F70405D4A3318F07D\r
-:1009C000495D31FD4052419302D0A9F7EACFB4E02E\r
-:1009D000A6959795879577956795BA95C9F70097E6\r
-:1009E0006105710508959B01AC010A2E0694579587\r
-:1009F000479537952795BA95C9F7620F731F841FDE\r
-:100A0000951FA01D08950F931F93CF93DF93869F8B\r
-:100A10008001879F100D969F100D1124C8010E9420\r
-:100A20001F05EC01009729F0A80160E070E00E942A\r
-:100A30004606CE01DF91CF911F910F910895CF937C\r
-:100A4000DF938230910510F482E090E0E0918B0119\r
-:100A5000F0918C0120E030E0A0E0B0E0309739F177\r
-:100A60004081518148175907B8F04817590771F468\r
-:100A700082819381109729F013969C938E931297FD\r
-:100A80002CC090938C0180938B0127C021153105D8\r
-:100A900031F04217530718F0A901DB0101C0EF0143\r
-:100AA0009A01BD01DF010280F381E02DD7CF21152E\r
-:100AB0003105F9F0281B390B2430310580F48A8187\r
-:100AC0009B816115710521F0FB019383828304C032\r
-:100AD00090938C0180938B01FE01329644C0FE01FD\r
-:100AE000E20FF31F819391932250310939832883B8\r
-:100AF0003AC02091890130918A01232B41F4209141\r
-:100B000002013091030130938A01209389012091E1\r
-:100B10000001309101012115310541F42DB73EB797\r
-:100B20004091040150910501241B350BE09189018E\r
-:100B3000F0918A01E217F307A0F42E1B3F0B281750\r
-:100B4000390778F0AC014E5F5F4F2417350748F046\r
-:100B50004E0F5F1F50938A014093890181939193B7\r
-:100B600002C0E0E0F0E0CF01DF91CF910895CF9394\r
-:100B7000DF93009709F487C0FC0132971382128239\r
-:100B8000C0918B01D0918C01209781F4208131811B\r
-:100B9000280F391F8091890190918A01821793074C\r
-:100BA00079F5F0938A01E09389016DC0DE0120E0C0\r
-:100BB00030E0AE17BF0750F412964D915C91139739\r
-:100BC0009D014115510509F1DA01F3CFB383A283E9\r
-:100BD00040815181840F951F8A179B0771F48D9175\r
-:100BE0009C911197840F951F029691838083129692\r
-:100BF0008D919C911397938382832115310529F45C\r
-:100C0000F0938C01E0938B013EC0D9011396FC93C5\r
-:100C1000EE9312974D915D91A40FB51FEA17FB0754\r
-:100C200079F480819181840F951F0296D9011196E4\r
-:100C30009C938E938281938113969C938E931297AB\r
-:100C4000E0E0F0E08A819B81009719F0FE01EC0161\r
-:100C5000F9CFCE01029628813981820F931F20910E\r
-:100C6000890130918A012817390769F4309729F4EE\r
-:100C700010928C0110928B0102C013821282D093C9\r
-:100C80008A01C0938901DF91CF910895DC0101C0F1\r
-:0E0C90006D9341505040E0F70895F894FFCF67\r
-:100C9E0000008D0120000D0A53746172740D000066\r
+:100000000C9448000C942A010C9475010C94650022\r
+:100010000C9465000C9465000C9465000C946500CC\r
+:100020000C9465000C9465000C9465000C946500BC\r
+:100030000C9465000C9465000C9465000C946500AC\r
+:100040000C9465000C9465000C94C0010C94650040\r
+:100050000C9465000C9465000C9465000C9465008C\r
+:100060000C9467000C946500B600D000BB00D00073\r
+:10007000C600D000CB00D00045464765666700202B\r
+:100080002B2D2E3031323334353637383968000075\r
+:1000900011241FBECFEFD8E0DEBFCDBF11E0A0E03E\r
+:1000A000B1E0E8E8F1E102C005900D92A031B1079E\r
+:1000B000D9F721E0A0E1B1E001C01D92A739B20754\r
+:1000C000E1F70E94C9020C94C2080C9400001F9230\r
+:1000D0000F920FB60F9211248F939F93AF93BF93FC\r
+:1000E000EF93FF938091B900887F803879F048F4CE\r
+:1000F000803609F066C085EC8093BC001092210127\r
+:1001000068C0883A39F1883B29F15BC080912101B0\r
+:10011000882341F08F3F09F04BC08091BB00809352\r
+:10012000200146C08091BB00809321018091210174\r
+:10013000853019F481E08093170180912101873087\r
+:1001400019F481E080931601809121018150809300\r
+:1001500021012AC08091210190E0FC013197E83013\r
+:10016000F10520F5EC5CFF4F0C943D0680911E01DB\r
+:1001700090911F0104C080911C0190911D018093FA\r
+:100180001401909315019093BB000EC080911A0149\r
+:1001900090911B01F4CF8091180190911901EFCF3C\r
+:1001A000809114018093BB0085EC03C01092BB00CA\r
+:1001B00085E88093BC00809121018F5F80932101AD\r
+:1001C00008C08091BC008B7E8093BC0085EC80933E\r
+:1001D000BC00FF91EF91BF91AF919F918F910F90D4\r
+:1001E0000FBE0F901F90189593E890937A0080931C\r
+:1001F0007C0080917C00806C80937C0080917A00F0\r
+:10020000806480937A0080917A0086FDFCCF809193\r
+:1002100078009091790045E080E090E020917A00AC\r
+:10022000206420937A0020917A0026FDFCCF209153\r
+:10023000780030917900820F931F415079F7209117\r
+:100240007A002F7720937A0065E070E00E940A061A\r
+:10025000CB0108951F920F920FB60F9211242F9386\r
+:100260003F934F935F936F937F938F939F93AF933E\r
+:10027000BF93EF93FF9380918400909185004A9BF8\r
+:1002800005C090931301809312011EC020911201AA\r
+:1002900030911301BC01621B730B80E090E00E945F\r
+:1002A000190527EE3CE840E350E40E94A70520E052\r
+:1002B00030E040E05FE30E9489040E94ED04709307\r
+:1002C0001B0160931A01E89AFF91EF91BF91AF91E2\r
+:1002D0009F918F917F916F915F914F913F912F915E\r
+:1002E0000F900FBE0F901F9018951F920F920FB690\r
+:1002F0000F9211242F933F934F935F936F937F93AC\r
+:100300008F939F93AF93BF93EF93FF93809184005C\r
+:10031000909185004B9B05C0909311018093100133\r
+:100320001EC02091100130911101BC01621B730BA2\r
+:1003300080E090E00E94190527EE3CE840E350E49D\r
+:100340000E94A70520E030E040E05FE30E948904BE\r
+:100350000E94ED047093190160931801E99AFF91CE\r
+:10036000EF91BF91AF919F918F917F916F915F912D\r
+:100370004F913F912F910F900FBE0F901F901895A6\r
+:100380001F920F920FB60F9211248F939F93EF93AA\r
+:10039000FF938091C00087FF17C0E0912401F09186\r
+:1003A00025018091C600808381E0E938F80730F4A8\r
+:1003B0003196F0932501E093240106C086E291E096\r
+:1003C0009093250180932401FF91EF919F918F914C\r
+:1003D0000F900FBE0F901F9018959C01E1ECF0E07C\r
+:1003E000808188618083808180688083E2ECF0E096\r
+:1003F00080818660808340E050E084E0220F331FDC\r
+:10040000441F551F8A95D1F760E074E284EF90E0B5\r
+:100410000E941E06DA01C9010197A109B109892FBD\r
+:100420009A2FAB2FBB27A7FDBA958093C50021500B\r
+:100430002093C40086E291E09093230180932201EF\r
+:10044000909325018093240108952091C00025FFF9\r
+:10045000FCCFFC0180818093C6000895CF93DF9389\r
+:100460001F92CDB7DEB78983CE0101960E94250287\r
+:1004700080E090E00F90DF91CF910895CF93DF93CC\r
+:10048000EC01CE012196FC012081222319F00E946B\r
+:100490002502F7CFDF91CF9108958091C00087FFAB\r
+:1004A000FCCF8091C60090E008950C944D0265E564\r
+:1004B00072E08EE292E00C947006CF93DF93FC0121\r
+:1004C000E253FF4FA081B181EC01C453DF4F28817B\r
+:1004D0003981A217B307B9F02091C00025FF13C0DE\r
+:1004E0002C912093C60020813181AC0145535F4F90\r
+:1004F0002417350718F42F5F3F4F03C09C0128597C\r
+:100500003F4F31832083E0912201F091230120911C\r
+:100510002401309125012E173F07C1F1DC01AC59B0\r
+:10052000BF4FCD91DC911197208128836D917C91F3\r
+:1005300011979C012B523F4FE9013881EB01288133\r
+:10054000321307C09C012C523F4FE90148814F5F95\r
+:1005500048839C012D593F4F6217730728F4EB0124\r
+:100560002196CD93DC9302C08D939C93D1E0E93822\r
+:10057000FD0730F43196F0932301E093220106C089\r
+:1005800086E291E09093230180932201DF91CF9145\r
+:1005900008951092200180E895E20E94ED010E94EA\r
+:1005A000570282E58093BA008091BC008B7E8093D5\r
+:1005B000BC0085EC8093BC001092800084E08093A6\r
+:1005C000810085E08093690086E091E00E94ED065D\r
+:1005D00083B7817F83BF7894C0E0D8E18091210107\r
+:1005E000833061F08F3F91F08130B9F480E00E9458\r
+:1005F000F40090931F0180931E010FC081E00E94C0\r
+:10060000F40090931D0180931C0107C0809120018C\r
+:10061000853A19F4F894FE01099580911701882311\r
+:1006200079F01092170110921B0110921A01529A40\r
+:100630005A9AF5E3FA95F1F700005A985298E89A19\r
+:1006400080911601882379F01092160110921901F9\r
+:1006500010921801539A5B9A85E38A95F1F700008E\r
+:100660005B985398E99A83B7816083BF889583B775\r
+:100670008E7F83BFB3CF6F927F929F92AF92BF92D4\r
+:10068000CF92DF92EF92FF920F931F93CF93DF935E\r
+:10069000CDB7DEB72C970FB6F894DEBF0FBECDBF37\r
+:1006A0008C017B013A01FC0117821682838181FF54\r
+:1006B00019C1CE0101965C01F801D380F701D3FC8A\r
+:1006C0002591D3FE21917F01222309F407C1253210\r
+:1006D00049F4D3FC2591D3FE21917F01253211F0FD\r
+:1006E000912C1BC0B801822F90E00E94BB066301D1\r
+:1006F0003601E2CF222309F4F1C0622F70E08FE7C8\r
+:1007000090E02C870E9465062C85892B49F0F70123\r
+:10071000D3FC2591D3FE21917F0197FEEBCF0CC036\r
+:10072000233221F4F92DF0619F2EF1CF2C3639F4CC\r
+:10073000292D2068922EEBCF222309F4CFC0622FFF\r
+:1007400070E088E790E02C870E9465062C85892B55\r
+:1007500041F06301F4E0CF0ED11CB8018FE390E0CB\r
+:1007600012C0233641F0233789F0233521F5F92DC6\r
+:10077000F1609F2E0BC0630122E0C20ED11CB801B4\r
+:10078000F301808191810E94BB06B2CF630122E018\r
+:10079000C20ED11CF30160807180F30190FC859141\r
+:1007A00090FE81913F01882309F4A2CFB80190E027\r
+:1007B0000E94BB06F2CF243611F0293639F56301C9\r
+:1007C00097FE09C0F4E0CF0ED11CF3016081718166\r
+:1007D000828193810AC0F2E0CF0ED11CF3016081C7\r
+:1007E0007181882777FD8095982FF92DFF7E9F2EA8\r
+:1007F00097FF09C090958095709561957F4F8F4FB9\r
+:100800009F4FF0649F2E2AE030E038C02037A1F0DF\r
+:1008100040F42835D1F02F3609F060C028E030E0F0\r
+:1008200019C0253719F0283751F058C0292D2F7ECF\r
+:10083000922E2AE030E00EC0892D8061982E992DED\r
+:100840009462992E20E130E005C0E92DE4609E2EEF\r
+:1008500020E132E0630197FE09C0F4E0CF0ED11C25\r
+:10086000F301608171818281938108C0F2E0CF0E33\r
+:10087000D11CF3016081718180E090E0A5010E94AC\r
+:100880001A07782E7A1896FE05C0B8018DE290E01E\r
+:100890000E94BB0694FE16C0FE01E70DF11D80818B\r
+:1008A000803381F0B80180E390E00E94BB0692FEA5\r
+:1008B00009C0292D2072822F90E0B801885A9F4FDD\r
+:1008C0000E94BB067A94F501E70DF11D8081B80105\r
+:1008D00090E00E94BB067110F5CF0ACFF801868127\r
+:1008E000978102C08FEF9FEF2C960FB6F894DEBF72\r
+:1008F0000FBECDBFDF91CF911F910F91FF90EF9071\r
+:10090000DF90CF90BF90AF909F907F906F900895B1\r
+:100910005058BB27AA270ED0E0C0D1D030F0D6D097\r
+:1009200020F031F49F3F11F41EF4C6C00EF4E095A0\r
+:10093000E7FBBCC0E92FE2D080F3BA176207730768\r
+:100940008407950718F071F49EF5FAC00EF4E0954F\r
+:100950000B2EBA2FA02D0B01B90190010C01CA0179\r
+:10096000A0011124FF27591B99F0593F50F4503E24\r
+:1009700068F11A16F040A22F232F342F4427585F16\r
+:10098000F3CF469537952795A795F0405395C9F72E\r
+:100990007EF41F16BA0B620B730B840BBAF09150E6\r
+:1009A000A1F0FF0FBB1F661F771F881FC2F70EC085\r
+:1009B000BA0F621F731F841F48F487957795679558\r
+:1009C000B795F7959E3F08F0B3CF9395880F08F041\r
+:1009D0009927EE0F97958795089598D088F09F579F\r
+:1009E00090F0B92F9927B751A0F0D1F0660F771F7B\r
+:1009F000881F991F1AF0BA95C9F712C0B13081F05B\r
+:100A00009FD0B1E008959CC0672F782F8827B85FEA\r
+:100A100039F0B93FCCF3869577956795B395D9F7BB\r
+:100A20003EF490958095709561957F4F8F4F9F4FC5\r
+:100A30000895E89409C097FB3EF4909580957095D1\r
+:100A400061957F4F8F4F9F4F9923A9F0F92F96E91A\r
+:100A5000BB279395F695879577956795B795F1118F\r
+:100A6000F8CFFAF4BB0F11F460FF1BC06F5F7F4F2C\r
+:100A70008F4F9F4F16C0882311F096E911C077233E\r
+:100A800021F09EE8872F762F05C0662371F096E847\r
+:100A9000862F70E060E02AF09A95660F771F881F16\r
+:100AA000DAF7880F9695879597F9089597F99F67D4\r
+:100AB00080E870E060E008959FEF80EC08950024E6\r
+:100AC0000A941616170618060906089500240A94B3\r
+:100AD00012161306140605060895092E0394000C39\r
+:100AE00011F4882352F0BB0F40F4BF2B11F460FFC8\r
+:100AF00004C06F5F7F4F8F4F9F4F089557FD9058F1\r
+:100B0000440F551F59F05F3F71F04795880F97FBD1\r
+:100B1000991F61F09F3F79F087950895121613068B\r
+:100B20001406551FF2CF4695F1DF08C016161706BA\r
+:100B30001806991FF1CF86957105610508940895EF\r
+:100B4000E894BB2766277727CB0197F908950BD048\r
+:100B5000C4CFB5DF28F0BADF18F0952309F0A6CF8F\r
+:100B6000ABCF1124EECFCADFA0F3959FD1F3950F41\r
+:100B700050E0551F629FF001729FBB27F00DB11D21\r
+:100B8000639FAA27F00DB11DAA1F649F6627B00DB1\r
+:100B9000A11D661F829F2227B00DA11D621F739F9A\r
+:100BA000B00DA11D621F839FA00D611D221F749FA8\r
+:100BB0003327A00D611D231F849F600D211D822FEF\r
+:100BC000762F6A2F11249F5750408AF0E1F0882336\r
+:100BD0004AF0EE0FFF1FBB1F661F771F881F915043\r
+:100BE0005040A9F79E3F510570F060CFAACF5F3FFC\r
+:100BF000ECF3983EDCF3869577956795B795F79576\r
+:100C0000E7959F5FC1F7FE2B880F911D96958795FD\r
+:100C100097F90895AA1BBB1B51E107C0AA1FBB1F70\r
+:100C2000A617B70710F0A61BB70B881F991F5A9578\r
+:100C3000A9F780959095BC01CD010895052E97FBED\r
+:100C40001EF400940E94350657FD07D00E9443060B\r
+:100C500007FC03D04EF40C94350650954095309522\r
+:100C600021953F4F4F4F5F4F089590958095709518\r
+:100C700061957F4F8F4F9F4F0895EE0FFF1F059097\r
+:100C8000F491E02D0994A1E21A2EAA1BBB1BFD01D1\r
+:100C90000DC0AA1FBB1FEE1FFF1FA217B307E4075B\r
+:100CA000F50720F0A21BB30BE40BF50B661F771FB3\r
+:100CB000881F991F1A9469F7609570958095909593\r
+:100CC0009B01AC01BD01CF010895FC010590061602\r
+:100CD00021F00020D9F7C00108953197CF01089580\r
+:100CE0000F931F93CF93DF93EC018B01009731F4A7\r
+:100CF0006115710519F480E090E038C06EE070E095\r
+:100D000081E090E00E947807FC010097A1F380E861\r
+:100D100083830115110571F01387028781E88383AE\r
+:100D200080918D0190918E01892B21F4F0938E0199\r
+:100D3000E0938D012097C9F0D187C08783818260BD\r
+:100D4000838380918F0190919001892B71F4F093AE\r
+:100D50009001E0938F018091910190919201892BF4\r
+:100D600021F4F0939201E0939101CF01DF91CF91B3\r
+:100D70001F910F9108950F931F93CF93DF93182F17\r
+:100D8000092FEB018B8181FD03C08FEF9FEF20C006\r
+:100D900082FF10C04E815F812C813D814217530735\r
+:100DA0007CF4E881F9819F012F5F3F4F39832883CD\r
+:100DB000108306C0E885F985812F0995892B29F7CD\r
+:100DC0002E813F812F5F3F4F3F832E83812F902FB6\r
+:100DD000DF91CF911F910F9108950F931F93CF93A0\r
+:100DE000DF93E0918F01F0919001238121FF1BC0DF\r
+:100DF000EC0100E010E0899160918F017091900109\r
+:100E0000DB011896ED91FC911997882331F0099533\r
+:100E1000892B89F30FEF1FEFEECF8AE00995892B1D\r
+:100E200011F4C80102C08FEF9FEFDF91CF911F91A6\r
+:100E30000F910895FA01AA27283051F1203181F14C\r
+:100E4000E8946F936E7F6E5F7F4F8F4F9F4FAF4FD2\r
+:100E5000B1E03ED0B4E03CD0670F781F891F9A1FE5\r
+:100E6000A11D680F791F8A1F911DA11D6A0F711D99\r
+:100E7000811D911DA11D20D009F468943F912AE0A5\r
+:100E8000269F11243019305D3193DEF6CF0108958D\r
+:100E9000462F4770405D4193B3E00FD0C9F7F6CFBE\r
+:100EA000462F4F70405D4A3318F0495D31FD405286\r
+:100EB000419302D0A9F7EACFB4E0A695979587951C\r
+:100EC00077956795BA95C9F70097610571050895FB\r
+:100ED0009B01AC010A2E06945795479537952795A7\r
+:100EE000BA95C9F7620F731F841F951FA01D08953F\r
+:100EF0000F931F93CF93DF93869F8001879F100DE1\r
+:100F0000969F100D1124C8010E949407EC010097D0\r
+:100F100029F0A80160E070E00E94BB08CE01DF91DB\r
+:100F2000CF911F910F910895CF93DF938230910558\r
+:100F300010F482E090E0E0919501F091960120E0BC\r
+:100F400030E0A0E0B0E0309739F14081518148179E\r
+:100F50005907B8F04817590771F4828193811097A7\r
+:100F600029F013969C938E9312972CC09093960120\r
+:100F70008093950127C02115310531F042175307A1\r
+:100F800018F0A901DB0101C0EF019A01BD01DF01E9\r
+:100F90000280F381E02DD7CF21153105F9F0281B10\r
+:100FA000390B2430310580F48A819B8161157105EC\r
+:100FB00021F0FB019383828304C090939601809378\r
+:100FC0009501FE01329644C0FE01E20FF31F8193AA\r
+:100FD000919322503109398328833AC0209193019B\r
+:100FE00030919401232B41F42091020130910301AF\r
+:100FF00030939401209393012091000130910101DD\r
+:101000002115310541F42DB73EB7409104015091AF\r
+:101010000501241B350BE0919301F0919401E21737\r
+:10102000F307A0F42E1B3F0B2817390778F0AC010B\r
+:101030004E5F5F4F2417350748F04E0F5F1F5093E8\r
+:101040009401409393018193919302C0E0E0F0E01A\r
+:10105000CF01DF91CF910895CF93DF93009709F4EB\r
+:1010600087C0FC01329713821282C0919501D09102\r
+:101070009601209781F420813181280F391F8091BA\r
+:101080009301909194018217930779F5F09394015D\r
+:10109000E09393016DC0DE0120E030E0AE17BF07A2\r
+:1010A00050F412964D915C9113979D014115510595\r
+:1010B00009F1DA01F3CFB383A28340815181840F18\r
+:1010C000951F8A179B0771F48D919C911197840F3E\r
+:1010D000951F02969183808312968D919C91139710\r
+:1010E000938382832115310529F4F0939601E093CF\r
+:1010F00095013EC0D9011396FC93EE9312974D9142\r
+:101100005D91A40FB51FEA17FB0779F480819181E7\r
+:10111000840F951F0296D90111969C938E9382811C\r
+:10112000938113969C938E931297E0E0F0E08A816E\r
+:101130009B81009719F0FE01EC01F9CFCE010296D8\r
+:1011400028813981820F931F20919301309194015E\r
+:101150002817390769F4309729F4109296011092F4\r
+:10116000950102C013821282D0939401C09393011F\r
+:10117000DF91CF910895DC0101C06D934150504043\r
+:08118000E0F70895F894FFCF99\r
+:101188000000970120000D0A53746172740D00006D\r
 :00000001FF\r