Subversion Repositories Code-Repo

Compare Revisions

Ignore whitespace Rev 113 → Rev 114

/Classwork/ECE4534 - Embedded Systems/PIC 26J11/buffer.c
1,5 → 1,6
#include "buffer.h"
#include "maindefs.h"
#include "pwm.h"
 
#pragma udata buffer
unsigned char buffer[BUFFER_SIZE];
17,6 → 18,7
char buffer_insert_one(unsigned char c) {
if (BUFFER_SIZE - buffer_data->stored_length == 0) {
DBG_PRINT_BUFFER("Buffer: (ERROR) Not enough free space for insert\r\n");
pwm_LED_on(); // Turn on LED to indicate full buffer
return -1;
}
 
39,6 → 41,7
// Make sure we have enough space to store message
if (length > BUFFER_SIZE - buffer_data->stored_length) {
DBG_PRINT_BUFFER("Buffer: (ERROR) Not enough free space for insert\r\n");
pwm_LED_on(); // Turn on LED to indicate full buffer
return -1;
}
 
63,6 → 66,7
// Make sure requested data is less than size of stored data
if (length > buffer_data->stored_length) {
DBG_PRINT_BUFFER("Buffer: (ERROR) Read length exceedes stored length\r\n");
pwm_LED_on(); // Turn on LED to indicate full buffer
return -1;
}
 
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/buffer.h
1,9 → 1,17
#ifndef __circular_buffer_h
#define __circular_buffer_h
 
#include "maindefs.h"
#include "xbee.h"
 
#define BUFFER_OK 0
#define BUFFER_ERROR -1
 
#ifdef _BASE_STATION
#define BUFFER_SIZE 512
#else
#define BUFFER_SIZE 100 //(max is 125 for some reason)
#endif
 
typedef struct __BUFFER_DATA {
unsigned int index_read;
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/build/default/production/buffer.o.d
1,7 → 1,10
build/default/production/buffer.o : \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/buffer.c \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/msg_queues.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/xbee.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/buffer.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/pwm.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/build/default/production/sleep.o.d
4,6 → 4,7
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/msg_queues.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/xbee.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/led_driver.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/maindefs.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f26j11.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \
10,4 → 11,5
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/sleep.h \
C:/Users/Kevin/Documents/School/VTech/Spring\ 2012/ECE\ 4534/PIC\ Code/PIC_26J11/timers.h \
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \
 
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/dist/default/production/PIC_26J11.production.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/dist/default/production/PIC_26J11.production.hex
1,859 → 1,913
:020000040000FA
:06000000FBEF18F01200F6
:06000000BCEF1AF0120033
:020006001200E6
:0600080093EF11F012005D
:0600080000EF14F01200ED
:02000E00C2909E
:040010009D9C1200A1
:04001400B46A1200B8
:06001800EEEF11F01200F2
:02001E000400DC
:1000200061320000FF0700000100000060320000A4
:10003000FF060000010000005F320000FF05000025
:10004000010000005E320000FF040000010000001B
:10005000D9CFE6FFE1CFD9FFFD0EDBCFA1F0FE0E39
:10006000DBCFA2F0A1C0E9FFA2C0EAFF000EEE6E56
:100070000B0EED6EA1C0E9FFA2C0EAFF020EEB6A13
:10008000030EEB6AA1C0E9FFA2C0EAFF060EE92653
:10009000000EEA22EF6AA1C0E9FFA2C0EAFF040E47
:1000A000E926000EEA22050EEF6EA1C0E9FFA2C00C
:1000B000EAFF080EE926000EEA22EF6AA1C0E9FF76
:1000C000A2C0EAFF050EE926000EEA22EF6AA1C0EF
:1000D000E9FFA2C0EAFF020EEB6A030EEB6AA1C0C1
:1000E000E9FFA2C0EAFF090EE926000EEA22EF6A44
:1000F000A1C0E9FFA2C0EAFF0B0EE926000EEA222A
:10010000EF6AA1C0E9FFA2C0EAFF0C0EE926000ECB
:10011000EA22EF6AA1C0E9FFA2C0EAFF0F0EE926BA
:10012000000EEA22EF6AA1C0E9FFA2C0EAFF0D0EAD
:10013000E926000EEA22EF6AA1C0E9FFA2C0EAFFA9
:100140000E0EE926000EEA22220EEF6EE552E7CFF0
:10015000D9FF1200A1C0E9FFA2C0EAFF0F0EE926F5
:10016000000EEA22110EEF6E94869488C76AC66A62
:10017000C56AF00EC6140809C66E630EC86EC78E37
:10018000C68A1200D9CFE6FFE1CFD9FF020EE126E1
:10019000FD0EDB506FE0DE6ADD6ADECF10F0DDCFF2
:1001A00011F0FD0EDB50000111AE02D0D89003D04B
:1001B000105C000E115826E2FB0EDBCF12F0FC0E95
:1001C000DBCF13F0DE501224E96EDD501320EA6E0F
:1001D000EF50E66EDECF10F0DDCF11F0A1C0E9FFE9
:1001E000A2C0EAFF1050EE24E76E1150EE20EA6E36
:1001F000E7CFE9FFE552E750EF6EDF2A010ECDE3CE
:10020000DB2ACBD7FD0EDB50E66EA1C0E9FFA2C012
:10021000EAFF020EE926000EEA22E552E750EE6EF2
:10022000ED6AA1C0E9FFA2C0EAFF0D0EE926000EAB
:10023000EA22FE0EDBCFEFFFA1C0E9FFA2C0EAFF7A
:10024000050EE926000EEA22EF6AA1C0E9FFA2C06E
:10025000EAFF040EE926000EEA22090EEF6EA1C0A5
:10026000E9FFA2C0EAFF0E0EE926000EEA22200EE8
:10027000EF6EC580020EE15C02E2E16AE552E16EDA
:10028000E552E7CFD9FF1200D9CFE6FFE1CFD9FF82
:10029000FD0EDB5038E0FD0EDB50E66EA1C0E9FF3D
:1002A000A2C0EAFF020EE926000EEA22E552E7505C
:1002B000EE6EED6AA1C0E9FFA2C0EAFF0D0EE926CD
:1002C000000EEA22FE0EDBCFEFFFA1C0E9FFA2C0C5
:1002D000EAFF050EE926000EEA22EF6AA1C0E9FF57
:1002E000A2C0EAFF040EE926000EEA22090EEF6E14
:1002F000A1C0E9FFA2C0EAFF0E0EE926000EEA2225
:10030000210EEF6EC580E552E7CFD9FF1200D9CF9D
:10031000E6FFE1CFD9FFA1C0E9FFA2C0EAFF0F0EBF
:10032000E926000EEA22100EEF6E94869488FE0EE7
:10033000DB50E824C86EC76AC66AC56AF00EC614E8
:100340000E09C66EC78EC580C68AE552E7CFD9FFB3
:100350001200A1C0E9FFA2C0EAFF0F0EEB50110886
:1003600002E1BDEF01F0A1C0E9FFA2C0EAFF0F0E5C
:10037000EB50100801E1E4D91200A1C0E9FFA2C0CE
:10038000EAFF0E0EEB50200801E09DD0A1C0E9FF6E
:10039000A2C0EAFF040EEB500B0A19E0020A04E0C7
:1003A0000C0A01E18FD01200A1C0E9FFA2C0EAFF50
:1003B000040EE926000EEA220B0EEF6EA1C0E9FF43
:1003C000A2C0EAFF0D0EEB50E824C96E1200C5BCB6
:1003D00058D0A1C0E9FFA2C0EAFF050EEB50106E95
:1003E000116A020EE926000EEA22EECF12F0EFCFDC
:1003F00013F011501318E8AE02D0133404D0125089
:10040000105C135011581BE2A1C0E9FFA2C0EAFF23
:10041000050EEB50116AE850EE24E76E1150EE2005
:10042000EA6EE7CFE9FFEF50C96EA1C0E9FFA2C0B5
:10043000EAFF050EE926000EEA22EF2A1200A1C00B
:10044000E9FFA2C0EAFF040EE926000EEA22050E2B
:10045000EF6EC584A1C0E9FFA2C0EAFF0E0EE92637
:10046000000EEA22220EEF6E000EE66EE66A2B0EFA
:10047000E66EE66A80EC09F0E552E552E552E55297
:100480001200A1C0E9FFA2C0EAFF040EE926000E97
:10049000EA22050EEF6EC584A1C0E9FFA2C0EAFF03
:1004A0000E0EE926000EEA22220EEF6E000EE66E18
:1004B000E66A2C0EE66EE66A80EC09F0E552E5523B
:1004C000E552E5521200A1C0E9FFA2C0EAFF0E0EFC
:1004D000EB50210801E0D7D0A1C0E9FFA2C0EAFF9C
:1004E000040EEB500D0A01E19FD0010A01E190D00A
:1004F0000B0A40E00C0A1AE0020A04E00C0A01E1CF
:10050000C2D01200A1C0E9FFA2C0EAFF040EE92692
:10051000000EEA220B0EEF6EA1C0E9FFA2C0EAFFB7
:100520000D0EEB50E8240109C96E1200C5AC70D065
:10053000A1C0E9FFA2C0EAFF040EE926000EEA22EC
:10054000050EEF6EC584A1C0E9FFA2C0EAFF0E0E42
:10055000E926000EEA22220EEF6E000EE66EE66A33
:100560002E0EE66EE66A80EC09F0E552E552E552A1
:10057000E5521200A1C0E9FFA2C0EAFF050EEB5050
:10058000116AE850EE24E76E1150EE20EA6EE7CFD4
:10059000E9FFC9CFEFFFA1C0E9FFA2C0EAFF050E46
:1005A000E926000EEA22EF2AA1C0E9FFA2C0EAFF75
:1005B000050EEB50106E116A020EE926000EEA22BB
:1005C000EECF12F0EFCF13F011501318E8AE02D0B7
:1005D000133404D01250105C135011580CE2A1C017
:1005E000E9FFA2C0EAFF040EE926000EEA220C0E83
:1005F000EF6EC59A0BD0A1C0E9FFA2C0EAFF040EBE
:10060000E926000EEA220D0EEF6EC58AC58812009B
:10061000A1C0E9FFA2C0EAFF040EE926000EEA220B
:10062000070EEF6EC5861200A1C0E9FFA2C0EAFF67
:10063000040EE926000EEA22050EEF6EC584A1C065
:10064000E9FFA2C0EAFF0E0EE926000EEA22220E02
:10065000EF6EA1C0E9FFA2C0EAFFEECFE6FFEFCF49
:10066000E6FF2D0EE66EA1C0E9FFA2C0EAFF020E72
:10067000E926000EEA22EF50E66E80EC09F0E55222
:10068000E552E552E5521200D9CFE6FFE1CFD9FF9E
:10069000A1C0E9FFA2C0EAFF060EE926000EEA2289
:1006A000010EEF6EA1C0E9FFA2C0EAFF020EEB6AE5
:1006B000030EEB6AFE0EDB5035E0C7AA1DD0A1C0C9
:1006C000E9FFA2C0EAFF040EE926000EEA22050EA9
:1006D000EF6EA1C0E9FFA2C0EAFF080EE926000EF6
:1006E000EA22EF2AA1C0E9FFA2C0EAFF070EE9262D
:1006F000000EEA22050E1FD0C7A40AD0A1C0E9FF50
:10070000A2C0EAFF040EE926000EEA22080E13D06A
:10071000A1C0E9FFA2C0EAFF040EE926000EEA220A
:10072000070E09D0A1C0E9FFA2C0EAFF040EE92626
:10073000000EEA22060EEF6EE552E7CFD9FF120057
:10074000D9CFE6FFE1CFD9FF090EE126010EDB6A22
:10075000020EDB6A030EDB6A040EDB6A080EDB6A3C
:10076000C6AC23D0C69CA1C0E9FFA2C0EAFF040E1C
:10077000E926000EEA22050EEF6E010EF36E040E5E
:10078000F3CFDBFFA1C0E9FFA2C0EAFF080EE92614
:10079000000EEA22EF2AA1C0E9FFA2C0EAFF070E7D
:1007A000E926000EEA22040EEF6EC7A005D0C9505C
:1007B000DF6EDE52010EDD6E040EDB5001E024D24E
:1007C000A1C0E9FFA2C0EAFF040EEB50070A01E155
:1007D00060D10F0A6CE00E0A14E0030A01E014D2A3
:1007E000C7A612D2010EDBCFE6FF4EDFE552A1C055
:1007F000E9FFA2C0EAFF040EEB50080801E004D2B2
:1008000037D0C7A810D0A1C0E9FFA2C0EAFF060EEA
:10081000E926000EEA22EF2A010EDB5001E1EAD1BF
:10082000C7AA89D1D4D1010EDB5001E1EDD1A1C01D
:10083000E9FFA2C0EAFF060EE926000EEA22EF2A2F
:10084000C7BA18D0C7B40AD0A1C0E9FFA2C0EAFF56
:10085000040EE926000EEA22070ED5D1A1C0E9FF59
:10086000A2C0EAFF040EE926000EEA22080EEF6E8F
:10087000030EABD1A1C0E9FFA2C0EAFF080EE92632
:10088000000EEA22EF2AA1C0E9FFA2C0EAFF040E8F
:10089000E926000EEA22050EEF6EA1C0E9FFA2C014
:1008A000EAFF070EE926000EEA22060EACD1A1C02F
:1008B000E9FFA2C0EAFF0B0EEB50000901E080D077
:1008C00047EC0AF0E76E080EE7CFDBFFDB502A08A3
:1008D00003E1080EDB501BE1C968A1C0E9FFA2C01B
:1008E000EAFF050EE926000EEA22010EEF6EA1C016
:1008F000E9FFA2C0EAFF0B0EE926000EEA22010E74
:10090000EF6EA1C0E9FFA2C0EAFF0C0E53D0A1C058
:10091000E9FFA2C0EAFFEECFE6FFEFCFE6FFA1C0FE
:10092000E9FFA2C0EAFF0A0EEB50E66EE66AE6684F
:1009300027EC0AF0126E050EE15E1250106E116A7D
:1009400010BE1168A1C0E9FFA2C0EAFF020E10C0EC
:10095000EBFF030E11C0EBFFA1C0E9FFA2C0EAFF4D
:10096000020EE926000EEA22EECF10F0EFCF11F0D2
:10097000113401E349D110500008000E115401E375
:1009800043D1A1C0E9FFA2C0EAFFEE50EFCFEAFFDA
:10099000E96EEF50C96EA1C0E9FFA2C0EAFF050EE3
:1009A000E926000EEA22010EEF6EA1C0E9FFA2C007
:1009B000EAFF0B0EE926000EEA22010EEF6E5AD076
:1009C000A1C0E9FFA2C0EAFF0C0EEB5000091CE039
:1009D000A1C0E9FFA2C0EAFF050EEB50106E090EA0
:1009E000EB50105C02E2C9683BD0A1C0E9FFA2C095
:1009F000EAFF0B0EE926000EEA22EF6AA1C0E9FF2A
:100A0000A2C0EAFF0C0E40D0A1C0E9FFA2C0EAFFDD
:100A1000050EEB50106E116A020EE926000EEA2256
:100A2000EECF12F0EFCF13F011501318E8AE02D052
:100A3000133404D01250105C1350115820E2A1C09E
:100A4000E9FFA2C0EAFF050EEB50116AE850EE2460
:100A5000E76E1150EE20EA6EE7CFE9FFEF50C96E66
:100A6000A1C0E9FFA2C0EAFF050EE926000EEA22B6
:100A7000EF2A010EF36E020EF3CFDBFFC5D0A1C04B
:100A8000E9FFA2C0EAFF0B0EE926000EEA22EF6A98
:100A9000B1D0C7A856D0A1C0E9FFA2C0EAFF060E98
:100AA000E926000EEA22EF2A010EDB5044E0C7AA35
:100AB00025D0A1C0E9FFA2C0EAFFEECF10F0EFCF32
:100AC00011F0A1C0E9FFA2C0EAFF020EE926000E64
:100AD000EA221050EE24E76E1150EE20EA6EE7CFC6
:100AE000E9FFDFCFEFFFA1C0E9FFA2C0EAFF020EDE
:100AF000E926000EEA22EE2AEF221DD0A1C0E9FF6E
:100B0000A2C0EAFF080EE926000EEA22EF2AA1C0E1
:100B1000E9FFA2C0EAFF070EE926000EEA22060E50
:100B2000EF6EA1C0E9FFA2C0EAFF040EE926000EA5
:100B3000EA22050E5ED0010EF36E030EF3CFDBFF4B
:100B400059D0010EDB5060E0A1C0E9FFA2C0EAFF6E
:100B5000060EE926000EEA22EF2AC7AA25D0A1C078
:100B6000E9FFA2C0EAFFEECF10F0EFCF11F0A1C075
:100B7000E9FFA2C0EAFF020EE926000EEA221050A9
:100B8000EE24E76E1150EE20EA6EE7CFE9FFDFCFEB
:100B9000EFFFA1C0E9FFA2C0EAFF020EE926000EA6
:100BA000EA22EE2AEF2230D0C7A411D0A1C0E9FF7B
:100BB000A2C0EAFF040EE926000EEA22080EEF6E3C
:100BC000010EF36E030EF3CFDBFFC96E1DD0A1C083
:100BD000E9FFA2C0EAFF080EE926000EEA22EF2A8A
:100BE000A1C0E9FFA2C0EAFF070EE926000EEA2233
:100BF000060EEF6EA1C0E9FFA2C0EAFF040EE926CF
:100C0000000EEA22050EEF6E010EDB5003E1020E2C
:100C1000DB5002E0C6A8C688A1C0E9FFA2C0EAFF77
:100C2000020EE926000EEA22EECF10F0EFCF11F00F
:100C3000113425E21050FD08000E115420E2030E7D
:100C4000DB501DE1A1C0E9FFA2C0EAFF040EE926C6
:100C5000000EEA22050EEF6EA1C0E9FFA2C0EAFF76
:100C6000080EE926000EEA22EF2AA1C0E9FFA2C081
:100C7000EAFF070EE926000EEA22070EEF6E030ECA
:100C8000DB506DE0A1C0E9FFA2C0EAFF020EE92639
:100C9000000EEA22EECF10F0EFCF11F01006115A3D
:100CA000A1C0E9FFA2C0EAFF1050EE24E76E115088
:100CB000EE20EA6EE7CFE9FFEF50E66EA1C0E9FF54
:100CC000A2C0EAFF090EE926000EEA22E552E7502B
:100CD000EF6EA1C0E9FFA2C0EAFF060EEB50E66E80
:100CE000EECF10F0EFCF11F0A1C0E9FFA2C0EAFFF4
:100CF000020EE926000EEA221050EE24E76E115093
:100D0000EE20EA6EE7CFE9FFE552E750EF6EA1C0B3
:100D1000E9FFA2C0EAFFEECFE6FFEFCFE6FF290E24
:100D2000E66EA1C0E9FFA2C0EAFF020EE926000EAE
:100D3000EA22EECF10F0EFCF11F0010E1024E66E94
:100D400080EC09F0E552E552E552E552A1C0E9FF19
:100D5000A2C0EAFF020EEB6A030EEB6A38D0A1C014
:100D6000E9FFA2C0EAFF080EEB50106E010E105C06
:100D70002EE3A1C0E9FFA2C0EAFF080EEB50E76E28
:100D8000050EE7CFDBFF070EEB50E76E060EE7CF51
:100D9000DBFFEB50E76E070EE7CFDBFFD950050F07
:100DA000E66E000EDA20E66E280EE66E030EE66EA4
:100DB00080EC09F0E552E552E552E552A1C0E9FFA9
:100DC000A2C0EAFF080EE926000EEA22EF6A090E29
:100DD000E15C02E2E16AE552E16EE552E7CFD9FF5C
:100DE0001200A1C0E9FFA2C0EAFF0E0EEB502208DC
:060DF00001E1000C010C02
:0A0DF600D9CFE6FFE1CFD9FFE652A6
:100E0000FD0EDBCFE9FFFE0EDBCFEAFF0A0EE9267F
:100E1000000EEA22EF6AFD0EDBCFE9FFFE0EDBCF0C
:100E2000EAFF0B0EE926000EEA22EF6ADF6A020EE5
:100E3000DF5C11E2FD0EDBCFE9FFFE0EDBCFEAFF48
:100E4000DF50050DE950F324E96EEA50F420EA6E14
:100E5000EF6ADF2AECD7E552E552E7CFD9FF12005F
:100E60000001906B000E636F090E646F000E686FD7
:100E7000080E696F000E6F6F070E706F000E746FB3
:100E8000060E756F000E7B6F050E7C6F000E806F77
:100E9000040E816F000E876F030E886F000E8C6F3B
:100EA000020E8D6F600EE66E000EE66EA4DFE55258
:100EB000E5526C0EE66E000EE66E9DDFE552E552E1
:100EC000780EE66E000EE66E96DFE552E552840E71
:100ED000E66E000EE66E8FDFE552E5521200D9CFC6
:100EE000E6FFE1CFD9FF050EE126FC0EDB50E66EF2
:100EF000D950030FE96EDACFEAFFE552E750EE6E04
:100F0000ED6AFD0EDBCFE9FFFE0EDBCFEAFF0A0E36
:100F1000E926000EEA22EFCFDFFFFD0EDBCFE9FF6F
:100F2000FE0EDBCFEAFFE9CF12F0EACF13F0DF507D
:100F3000050DE950F324106EEA50F420116E010EF5
:100F400010C0DBFF020E11C0DBFF010EDBCFE9FF9B
:100F5000020EDBCFEAFFEF5002E0FF0E58D0010E89
:100F6000DBCFE9FF020EDBCFEAFFEE52FC0EDBCF58
:100F7000EFFF010EDBCFE9FF020EDBCFEAFFE92630
:100F8000000EEA22FB0EDBCFEFFF030EDBCFE6FF06
:100F9000040EDBCFE6FFF90EDBCFE6FFFA0EDBCF68
:100FA000E6FF010EDBCFE9FF020EDBCFEAFF030E07
:100FB000E926000EEA22EECFE6FFEFCFE6FF7AEC5D
:100FC00017F0106E060EE15E1050FD0EDBCFE9FF4C
:100FD000FE0EDBCFEAFF0A0EE926000EEA22EF281A
:100FE000010BE66EFD0EDBCFE9FFFE0EDBCFEAFF65
:100FF0000A0EE926000EEA22E552E750EF6E010ED6
:10100000DBCFE9FF020EDBCFEAFF010EEF6E106EC1
:10101000050EE15C02E2E16AE552E16E1050E55234
:10102000E7CFD9FF1200D9CFE6FFE1CFD9FF050EF8
:10103000E126FD0EDBCFE9FFFE0EDBCFEAFF0B0E54
:10104000E926000EEA22EFCFDFFFFD0EDBCFE9FF3E
:10105000FE0EDBCFEAFFE9CF12F0EACF13F0DF504C
:10106000050DE950F324106EEA50F420116E010EC4
:1010700010C0DBFF020E11C0DBFF010EDBCFE9FF6A
:10108000020EDBCFEAFFEF0401E07AD0010EDBCFE6
:10109000E9FF020EDBCFEAFFEE52EFCF10F0FC0EBD
:1010A000DB50D880105402E2FD0E6BD0010EDBCF76
:1010B000E9FF020EDBCFEAFFEE52EF50E66ED950A9
:1010C000030FE96EDACFEAFFE552E750EE6EED6A04
:1010D000030EDBCFE6FF040EDBCFE6FF010EDBCF16
:1010E000E9FF020EDBCFEAFF030EE926000EEA223B
:1010F000EECFE6FFEFCFE6FFF80EDBCFE6FFF90E0F
:10110000DBCFE6FF7AEC17F0106E060EE15E1050B2
:10111000FD0EDBCFE9FFFE0EDBCFEAFF0B0EE9266B
:10112000000EEA22EF28010BE66EFD0EDBCFE9FF91
:10113000FE0EDBCFEAFF0B0EE926000EEA22E55297
:10114000E750EF6E010EDBCFE9FF020EDBCFEAFFC7
:10115000E926000EEA22EF50E66EFA0EDBCFE9FF39
:10116000FB0EDBCFEAFFE552E750EF6E010EDBCF5F
:10117000E9FF020EDBCFEAFFEF6A030EDB5001D07E
:10118000FC0E106E050EE15C02E2E16AE552E16ED2
:101190001050E552E7CFD9FF1200D9CFE6FFE1CFDB
:1011A000D9FF030EE126FD0EDBCFE9FFFE0EDBCFFC
:1011B000EAFF0B0EE926000EEA22EFCFDFFFFD0E5D
:1011C000DBCFE9FFFE0EDBCFEAFFDF50050DE95074
:1011D000F324106EEA50F420116E010E10C0DBFFF4
:1011E000020E11C0DBFF010EDBCFE9FF020EDBCFE9
:1011F000EAFFEF040BE1010EDBCFE9FF020EDBCFCC
:10120000EAFFE926000EEA22EF5001D0000E106E30
:10121000030EE15C02E2E16AE552E16E1050E55234
:10122000E7CFD9FF1200D9CFE6FFE1CFD9FFFD0EFE
:10123000DBCFE9FFFE0EDBCFEAFFE9CF10F0EACF0C
:1012400011F0FD0EDBCFE9FFFE0EDBCFEAFF0B0E48
:10125000E926000EEA22EF50050D1050F324E96E46
:101260001150F420EA6EEF50E552E7CFD9FF12009B
:10127000D38E03001200D9CFE6FFE1CFD9FFFB0EDA
:10128000DBCFE6FFFC0EDBCFE6FFFD0EDBCFE6FF9C
:10129000FE0EDBCFE6FF600EE66E000EE66E1FDE92
:1012A000106E060EE15E1050E552E7CFD9FF120036
:1012B000D9CFE6FFE1CFD9FFFA0EDBCFE6FFFB0E79
:1012C000DBCFE6FFFC0EDBCFE6FFFD0EDBCFE6FF5C
:1012D000FE0EDBCFE6FF600EE66E000EE66EA3DECE
:1012E000106E070EE15E1050E552E7CFD9FF1200F5
:1012F000600EE66E000EE66E50DFE552E55212001B
:10130000D9CFE6FFE1CFD9FFFB0EDBCFE6FFFC0E26
:10131000DBCFE6FFFD0EDBCFE6FFFE0EDBCFE6FF09
:101320006C0EE66E000EE66EDADD106E060EE15E05
:101330001050E552E7CFD9FF1200D9CFE6FFE1CF39
:10134000D9FFFA0EDBCFE6FFFB0EDBCFE6FFFC0E8C
:10135000DBCFE6FFFD0EDBCFE6FFFE0EDBCFE6FFC9
:101360006C0EE66E000EE66E5EDE106E070EE15E3F
:101370001050E552E7CFD9FF12006C0EE66E000E5A
:10138000E66E0BDFE552E5521200D9CFE6FFE1CF62
:10139000D9FFFB0EDBCFE6FFFC0EDBCFE6FFFD0E39
:1013A000DBCFE6FFFE0EDBCFE6FF780EE66E000E2B
:1013B000E66E95DD106E060EE15E1050E552E7CF49
:1013C000D9FF1200D9CFE6FFE1CFD9FFFA0EDBCF6C
:1013D000E6FFFB0EDBCFE6FFFC0EDBCFE6FFFD0EEC
:1013E000DBCFE6FFFE0EDBCFE6FF780EE66E000EEB
:1013F000E66E19DE106E070EE15E1050E552E7CF83
:10140000D9FF1200780EE66E000EE66EC6DEE552DB
:10141000E5521200D9CFE6FFE1CFD9FFFB0EDBCFBB
:10142000E6FFFC0EDBCFE6FFFD0EDBCFE6FFFE0E98
:10143000DBCFE6FF840EE66E000EE66E50DD106E2A
:10144000060EE15E1050E552E7CFD9FF1200D9CF6A
:10145000E6FFE1CFD9FFFA0EDBCFE6FFFB0EDBCFD5
:10146000E6FFFC0EDBCFE6FFFD0EDBCFE6FFFE0E58
:10147000DBCFE6FF840EE66E000EE66ED4DD106E66
:10148000070EE15E1050E552E7CFD9FF1200840E3F
:10149000E66E000EE66E81DEE552E55212000001B6
:1014A000905101E1120075EC11F0F3CF10F0F4CF80
:1014B00011F0F350F41001E0120059EC11F0F3CFE9
:1014C00010F0F4CF11F0F350F41001E112006C0EA3
:1014D000E66E000EE66EA7DEE552E552000901E079
:1014E0001200600EE66E000EE66E9DDEE552E552DD
:1014F000000901E0120038EF09F081EC11F0F3CFA0
:1015000010F0F4CF11F0F350F41001E112000001DB
:10151000010E906F6C0EE66E000EE66E84DEE552F4
:10152000E552000909E1600EE66E000EE66E7BDE14
:10153000E552E552000903E00001906B12000A0E2B
:0A154000E66EDBEC18F0E552E5D78B
:06154A00D9CFE6FFE1CF5E
:10155000D9FF3B0EE126230EDB6A240EDB6A250E43
:10156000DB6A260EDB6A9B8C8F0ED3147009D36E58
:10157000FC0ED3140009D36E0F0148691F0E496F8A
:1015800062EC16F0D9CFE6FFDACFE6FF8BEC0DF078
:10159000E552E552D950090FE66E000EDA20E66EEC
:1015A00028EC00F0E552E552D950190FE66E000E16
:1015B000DA20E66EA0EC0FF0E552E55230EC07F0D1
:1015C000A6EC14F062EC12F024EC14F02AEC16F005
:1015D00055EC11F04AEC11F0AAEC00F062EC13F0BB
:1015E000E66872EC18F0E55253EC16F07DEC0AF068
:1015F000000EE66E0A0EE66ED950220FE66E000E61
:10160000DA20E66EE6689DEC09F0106E050EE15EEC
:101610001050E76E210EE7CFDBFFDBCF10F0103468
:1016200021E3210EDB50FC08000EE66E0A0EE66E8A
:10163000D950220FE66E000EDA20E66EE66858EC0E
:1016400009F0106E050EE15E1050E76E210EE7CF37
:10165000DBFFDBCF10F0103401E281D1210EDB5033
:10166000FC08C4D7220EDB50440A01E148D1070A26
:1016700001E13BD1010A01E135D1030A01E12FD19A
:10168000010A01E129D17F0A01E123D1010A01E127
:101690001DD1030A01E1D7D0010A01E1BBD0120A32
:1016A000A5E0030A01E182D0010AA0E0070A9EE05A
:1016B000020A13E0010A02E0360A98D7230EDB6A19
:1016C000210EDB50F36E230EDBCFF4FFF350F45CFE
:1016D00001E38CD7230EDB2AF3D7230EDB6A210E1E
:1016E000DB04F36E230EDBCFF4FFF350F45C03E274
:1016F000230EDB2AF4D70A010051090A01E176D74B
:10170000010A01E173D70F0A01E170D7010A01E173
:101710006DD7020A19E0060A01E068D7010EF36EE0
:10172000210EF3CFDBFFD9501D0FE96EDACFEAFFB0
:10173000FF0ED880EE54000EED5402E2006929D06D
:101740001D0EDBCF00FA25D0D9501D0FE96EDACF80
:10175000EAFFFF0ED880EE54000EED5408E2210E91
:10176000DB68000EE66E0A0EE66EE6680DD01D0E12
:10177000DB50E76E210EE7CFDBFF000EE66E0A0EB0
:10178000E66E1D0EDBCFE6FFBEEC10F0E552E55233
:10179000E552000EE66E0A0EE66E2A0EE66E210E89
:1017A000DBCFE6FF0AEC0AF0E55231D0230EDB6A0C
:1017B000210EDB50F36E230EDBCFF4FFF350F45C0D
:1017C00003E2230EDB2AF4D735EC11F0F3CF10F04F
:1017D000F4CF11F0070EF35C000EF45801E206D7C7
:1017E000250EDB0402E10A0E06D0250EDB500208AE
:1017F00001E0FCD60B0EE66ED0EC0FF0E552000EC9
:10180000E66E0A0EE66E060EE66E36EC10F0E55257
:10181000E5525AD0D950270FE96EDACFEAFF000E11
:10182000EE6E0A0EED6E230EDB6A210EDB50FB0F0F
:10183000F36E230EDBCFF4FFF350F45C01E3D6D656
:10184000230EDB2AF2D7D950290FE96EDACFEAFF4F
:10185000000EEE6E0A0EED6E230EDB6A210EDB50DB
:10186000F40FF36E230EDBCFF4FFF350F45C03E2CE
:10187000230EDB2AF3D7290EDBCFE9FF2A0EDBCFBD
:10188000EAFF0C0EE926000EEA22E9CF10F0EACFBB
:1018900011F0E9CFE6FFEACFE6FF210EDB50F40FAF
:1018A000E66E36EC10F0E552E552E552290EDBCF3C
:1018B000E9FF2A0EDBCFEAFF0C0EE926000EEA2232
:1018C000EF50E66EADEC12F0E55290D6D9502B0FEA
:1018D0000ED0D9502D0F0BD0D9502F0F08D0D95082
:1018E000310F05D0D950330F02D0D950350FE96EE2
:1018F000DACFEAFF000EEE6E0A0EED6E77D6D95003
:10190000370FE96EDACFEAFF000EEE6E0A0EED6ECB
:10191000370EDBCFE9FF380EDBCFEAFFEE52EF5098
:10192000110A01E163D6160A01E160D6010A01E15C
:101930005DD6050A01E15AD6010A09E0030A01E170
:1019400055D6010A01E052D6260EDB6A4FD6010EAB
:10195000F36E260EF3CFDBFF60EC16F047D6220EB7
:10196000DB500B0A31E0010A2CE05A0A01E13ED6B5
:101970001D0A24E0010A1FE0070A20E0010A1BE01B
:10198000030A16E0010A0FE00F0A08E0010A01E06D
:10199000B3D0D5EC18F0F7EC14F028D600EC15F025
:1019A000250EDB6A0BD0D5EC18F017EC15F01ED61F
:1019B0001EEC15F003D0D5EC18F018D6D4EC14F0CA
:1019C00015D6CAEC18F012D6D950390FE96EDACF15
:1019D000EAFF000EEE6E0A0EED6E390EDBCFE9FF68
:1019E0003A0EDBCFEAFF100EEF6E390EDBCFE9FFC8
:1019F0003A0EDBCFEAFFEE52EF6A390EDBCFE9FF9A
:101A00003A0EDBCFEAFF020EE926000EEA22EE6A6A
:101A1000EE6AEE6AEE6A390EDBCFE9FF3A0EDBCFF3
:101A2000EAFF020EE926000EEA22040EE926000E65
:101A3000EA22EE6AEE6AEE6AEE6A390EDBCFE9FF61
:101A40003A0EDBCFEAFF0A0EE926000EEA22EE6A22
:101A5000ED6A390EDBCFE9FF3A0EDBCFEAFF0C0E61
:101A6000E926000EEA22EF6A390EDBCFE9FF3A0ED3
:101A7000DBCFEAFF0D0EE926000EEA22010EEF6E23
:101A8000390EDBCFE9FF3A0EDBCFEAFF0E0EE92677
:101A9000000EEA22240EDBCFEFFFDBCFE6FFADEC3A
:101AA00012F0E552240EDB2ADB50640802E1240E1A
:101AB000DB6A0F0EF36E210EF3CFDBFFDBCFE6FF09
:101AC000000EE66E0A0EE66E0EEC0FF0E552E552E1
:101AD000E552250EDB50020807E0250EDB0404E189
:101AE000DDEC13F0020E03D0B3EC13F0010EF36E35
:101AF000250EF3CFDBFF7AD5230EDB6A210EDB50F8
:101B0000F36E230EDBCFF4FFF350F45C01E36ED5EC
:061B1000230EDB2AF3D7CF
:0A1B1600D9CFE6FFE1CFD9FF93809D
:101B20009392949A8A908A928B9AFD0EDBCF9BF0C7
:101B3000FE0EDBCF9CF09BC0E9FF9CC0EAFF050EC8
:101B4000E926000EEA22EF6A9BC0E9FF9CC0EAFF8B
:101B5000060EE926000EEA22EF6A9BC0E9FF9CC050
:101B6000EAFF070EE926000EEA220A0EEF6E9BC07E
:101B7000E9FF9CC0EAFF030EE926000EEA22000EF0
:101B8000EE6E010EED6E9BC0E9FF9CC0EAFF030EF6
:101B9000E926000EEA22EECF9DF0EDCF9EF0E55251
:101BA000E7CFD9FF1200D9CFE6FFE1CFD9FFFE0E74
:101BB000DB507E0823E19BC0E9FF9CC0EAFF050ED5
:101BC000E926000EEA22EF6A9BC0E9FF9CC0EAFF0B
:101BD000060EE926000EEA22EF6A9BC0E9FF9CC0D0
:101BE000EAFF7E0EEF6E9BC0E9FF9CC0EAFF070E86
:101BF000E926000EEA220B0EEF6EA4D09BC0E9FF8F
:101C00009CC0EAFF070EEB500F0A01E181D0010AE8
:101C10002EE0020A1AE0070A02E0010A93D09BC0F4
:101C2000E9FF9CC0EAFFEE52010EE926000EEA220F
:101C3000FE0EDBCFEFFF9BC0E9FF9CC0EAFF070E63
:101C4000E926000EEA220C0E7CD09BC0E9FF9CC066
:101C5000EAFFEE52FE0EDBCFEFFF9BC0E9FF9CC018
:101C6000EAFF070EE926000EEA220E0E6AD09BC09C
:101C7000E9FF9CC0EAFF050EEB50106EEE52EECF6E
:101C800011F0EFCF12F01150105C000E125423E24D
:101C90009BC0E9FF9CC0EAFF050EEB500001EA6A19
:101CA0009D25E96E9E51EA22FE0EDBCFEFFF9BC021
:101CB000E9FF9CC0EAFF060EE926000EEA22FE0EAE
:101CC000DB50EF269BC0E9FF9CC0EAFF050EE9262A
:101CD000000EEA22EF2A9BC0E9FF9CC0EAFF050E36
:101CE000EB50106E116AEE52EECF12F0EFCF13F000
:101CF0001250101827E11350111824E19BC0E9FF7E
:101D00009CC0EAFF070EE926000EEA220F0E19D04A
:101D10009BC0E9FF9CC0EAFF060EE926000EEA22FE
:101D2000EF28E86C106EFE0EDB50105C01E10ED85F
:101D30009BC0E9FF9CC0EAFF070EE926000EEA22DD
:101D40000A0EEF6EE552E7CFD9FF1200D9CFE6FFBA
:101D5000E1CFD9FFE6529DC0E9FF9EC0EAFFEF50F8
:101D60008A0A40E01F0A38E0340A30E0360A28E0E8
:101D7000060A20E0030A18E0190A10E01B0A08E02E
:101D8000180A47E19DC0E6FF9EC0E6FF3C0E2FD03B
:101D90009DC0E6FF9EC0E6FF3D0E29D09DC0E6FF38
:101DA0009EC0E6FF3E0E23D09DC0E6FF9EC0E6FF2C
:101DB0003F0E1DD09DC0E6FF9EC0E6FF400E17D02F
:101DC0009DC0E6FF9EC0E6FF410E11D09DC0E6FF1C
:101DD0009EC0E6FF420E0BD09DC0E6FF9EC0E6FF10
:101DE000430E05D09DC0E6FF9EC0E6FF440EE66EA2
:101DF0009BC0E9FF9CC0EAFFEE52EF50E66E80EC1C
:101E000009F0E552E552E552E552DF6EDFCF10F002
:101E10001034E552E552E7CFD9FF1200D9CFE6FFE3
:101E2000E1CFD9FF020EE126010EDB6A7E0EE66EDF
:101E300089EC18F0E552A850020BFDE06BD80009C0
:101E4000FAE1E66A89EC18F0E552A850020BFDE0D1
:101E500061D80009FAE1FC0EDBCFE6FF89EC18F04F
:101E6000E552A850020BFDE055D80009FAE1DF6AFF
:101E7000FC0EDB50DF5C2DE2DF50E76EFD0EDBCFAA
:101E8000E9FFFE0EDBCFEAFFE750E926000EEA226B
:101E9000EF50E66E89EC18F0E552DF50E76EFD0E6C
:101EA000DBCFE9FFFE0EDBCFEAFFE750E926000EAD
:101EB000EA22010EDBCFE7FFEF50E726010EE7CF66
:101EC000DBFFA850020BFDE025D80009FAE1DF2A6C
:101ED000CFD7010EDB28E86CE66E89EC18F0E552EE
:101EE000A8A2FED7020EE15C02E2E16AE552E16ED1
:101EF000E552E7CFD9FF1200D9CFE6FFE1CFD9FFF6
:101F0000FE0EDB5002E08A8201D08A92E552E7CFD2
:101F1000D9FF1200D9CFE6FFE1CFD9FFE6528150B9
:101F2000010BDF6EDF5002E0010E01D0000EE55222
:101F3000E552E7CFD9FF12008B8A12008B9A12006C
:101F4000D9CFE6FFE1CFD9FFFD0EDBCFA3F0FE0E28
:101F5000DBCFA4F0A3C0E9FFA4C0EAFFEE6AED6AFC
:101F6000A3C0E9FFA4C0EAFF020EEB6A030EEB6A0E
:101F7000A3C0E9FFA4C0EAFF040EEB6A050EEB6AFA
:101F8000A3C0E9FFA4C0EAFF060EE926000EEA227C
:101F9000000EEE6E0C0EED6EE552E7CFD9FF12008B
:101FA000D9CFE6FFE1CFD9FFA3C0E9FFA4C0EAFF84
:101FB000040EE926000EEA22EECF10F0EFCF11F06A
:101FC000D8801056020E11561050111002E1FF0E6B
:101FD00049D0A3C0E9FFA4C0EAFF040EE926000E21
:101FE000EA22EE2AED22A3C0E9FFA4C0EAFF060E12
:101FF000E926000EEA22EECF10F0EFCF11F0A3C0D9
:10200000E9FFA4C0EAFF020EE926000EEA22105002
:10201000EE24E76E1150EE20EA6EE7CFE9FFFE0EE8
:10202000DBCFEFFFA3C0E9FFA4C0EAFF020EE92661
:10203000000EEA22EE2AEF22A3C0E9FFA4C0EAFFC5
:10204000020EE926000EEA22EE500BE1020EED1818
:1020500008E1A3C0E9FFA4C0EAFF020EEB6A030E89
:10206000EB6A000EE552E7CFD9FF1200D9CFE6FFA9
:10207000E1CFD9FFE652FE0EDBCF10F0A3C0E9FF9F
:10208000A4C0EAFF040EE926000EEA22EECF11F00A
:10209000EFCF12F0D8801156020E12561050115C7C
:1020A000000E125802E2FF0E64D0FE0EDB50106EDE
:1020B000116AA3C0E9FFA4C0EAFF040EE926000EDE
:1020C000EA221050EE261150ED22DF6AFE0EDB50A0
:1020D000DF5C4EE2DF50E76EFC0EDBCFE9FFFD0E6A
:1020E000DBCFEAFFE750E926000EEA22EF50E66E6A
:1020F000A3C0E9FFA4C0EAFF060EE926000EEA220B
:10210000EECF10F0EFCF11F0A3C0E9FFA4C0EAFFBB
:10211000020EE926000EEA221050EE24E76E11505E
:10212000EE20EA6EE7CFE9FFE552E750EF6EA3C07D
:10213000E9FFA4C0EAFF020EE926000EEA22EE2A19
:10214000EF22A3C0E9FFA4C0EAFF020EE926000EB9
:10215000EA22EE500BE1020EED1808E1A3C0E9FF00
:10216000A4C0EAFF020EEB6A030EEB6ADF2AAED7C9
:10217000000EE552E552E7CFD9FF1200D9CFE6FFB6
:10218000E1CFD9FFE652FE0EDBCF10F0A3C0E9FF8E
:10219000A4C0EAFF040EE926000EEA22EECF11F0F9
:1021A000EFCF12F01050115C000E125802E2FF0E39
:1021B00057D0FE0EDB50106E116AA3C0E9FFA4C019
:1021C000EAFF040EE926000EEA221050EE5E1150DE
:1021D000ED5ADF6AFE0EDB50DF5C41E2A3C0E9FF8F
:1021E000A4C0EAFF060EE926000EEA22EECF10F0A8
:1021F000EFCF11F0A3C0E9FFA4C0EAFF1050EE2416
:10220000E76E1150EE20EA6EE7CFE9FFEF50E66E81
:10221000DF50E76EFC0EDBCFE9FFFD0EDBCFEAFF00
:10222000E750E926000EEA22E552E750EF6EA3C020
:10223000E9FFA4C0EAFFEE2A000EEF22A3C0E9FFE7
:10224000A4C0EAFFEE5009E1020EED1806E1A3C0BA
:10225000E9FFA4C0EAFFEE6AED6ADF2ABBD7000EF1
:10226000E552E552E7CFD9FF1200A3C0E9FFA4C0B1
:10227000EAFF040EE926000EEA22EECF10F0EFCFBF
:1022800011F0D8801056020E115610C0F3FF11C085
:04229000F4FF120045
:0C229400A58A9F86F1949F90A292F19081
:1022A000F09C9D86F286F0861200D08EF28EF28C23
:1022B0001200F250800B800A01E0010E106E116ACC
:1022C00010BE116810C0F3FF11C0F4FF1200F250ED
:1022D000400B400A01E0010E106E116A10BE116839
:1022E00010C0F3FF11C0F4FF1200F2BC04D0E1DF14
:1022F000F350F41002E0F36A02D0010EF36EF46AB8
:102300001200F3DFF3CF10F0F4CF11F0F350F4101C
:1023100007E1CFDFF350F41003E1010EF36E01D0BB
:10232000F36AF46A1200DACFE4FFE2CFDAFFE9CF12
:10233000E4FFEACFE4FFF6CFE4FFF7CFE4FFF8CF06
:10234000E4FFF5CFE4FFF3CFE4FFF4CFE4FFFACFEF
:10235000E4FFFBCFE4FF00EE00F0100EE80403E31F
:10236000EECFE4FFFBD700EE10F0040EE80403E329
:10237000EECFE4FFFBD7E652A4AA03D07BEC16F025
:10238000A49A9EA603D0A9EC01F09E96E55200EE19
:1023900013F0040EE80403E3E5CFEDFFFBD700EEF6
:1023A0000FF0100EE80403E3E5CFEDFFFBD7E5CF18
:1023B000FBFFE5CFFAFFE5CFF4FFE5CFF3FFE5CF75
:1023C000F5FFE5CFF8FFE5CFF7FFE5CFF6FFE5CF67
:1023D000EAFFE5CFE9FFE5CFDAFF1100D8CFE4FF50
:1023E000E0CFE4FFE46EDACFE4FFE2CFDAFFE9CF3B
:1023F000E4FFEACFE4FFF6CFE4FFF7CFE4FFF8CF46
:10240000E4FFF5CFE4FFF3CFE4FFF4CFE4FFFACF2E
:10241000E4FFFBCFE4FF00EE00F0100EE80403E35E
:10242000EECFE4FFFBD700EE10F0040EE80403E368
:10243000EECFE4FFFBD7E652F0A003D00EEC14F091
:10244000F090F2A003D035EC14F0F290F2A403D097
:10245000C6EC14F0F2949EA003D0DFEC14F09E9032
:10246000A1A203D002EC15F0A192E55200EE13F008
:10247000040EE80403E3E5CFEDFFFBD700EE0FF019
:10248000100EE80403E3E5CFEDFFFBD7E5CFFBFF3C
:10249000E5CFFAFFE5CFF4FFE5CFF3FFE5CFF5FF9A
:1024A000E5CFF8FFE5CFF7FFE5CFF6FFE5CFEAFF91
:1024B000E5CFE9FFE5CFDAFFE550E5CFE0FFE5CF77
:0424C000D8FF100031
:0C24C40092909292929492968990899244
:1024D0008994899600019F6BA06BE66A0AD8E55241
:1024E000E66A07D8E552120089820000899200004E
:1024F0001200D9CFE6FFE1CFD9FF020EE126899085
:10250000DE6ADD6ADECF10F0DDCF11F0D890115019
:1025100004E6080E105C000E115814E2FE0EDB50AB
:10252000010BE8B08984E8A08994DEDFFE0EDBCFE2
:10253000F3FFF390F342F3CFDBFFDF2A010EE2E378
:10254000DB2AE0D78980020EE15C02E2E16AE55213
:10255000E16EE552E7CFD9FF1200D9CFE6FFE1CF18
:10256000D9FFE652DF6A00019F6BA06B0A0E106E66
:102570000C6EFE0EDBCF07F009EC19F00350DF6E96
:10258000DF50090A34E0010A2DE00F0A26E0010AB3
:1025900022E0030A1EE0010A17E0070A13E0010A1D
:1025A0000CE0030A07E0010A27E1700E00019F1307
:1025B0000D0E21D000019F8D13D0600E00019F13DE
:1025C0000E0E19D0600E14D0500E00019F13030E92
:1025D00012D0300E0DD0300E06D0700E00019F13B9
:1025E000A0810AD0700E00019F130F0E04D0700E50
:1025F00000019F13070EA0130A0E106E0C6EFE0E44
:10260000DBCF07F009EC19F00750DF6EDF50090A45
:102610002EE0010A27E00F0A20E0010A1CE0030A6D
:1026200018E0010A14E0070A10E0010A09E0030AB1
:1026300004E0010A21E10D0E16D000019F8710D0A1
:102640000E0E00019F13C00E16D00E0E11D00B0EF1
:1026500005D0070E0DD0070E06D00D0E00019F13FA
:10266000A08B0AD00F0E00019F13E00E04D00F0EB6
:1026700000019F13600EA01300019F51E66E39DF29
:10268000E552000E00019F15106EFF0EA015116E91
:10269000106E116AE850E66E2CDFE552E552E55205
:1026A000E7CFD9FF120000019F51E66E22DFE5520D
:1026B0000001FF0EA015106E116AE850E66E19DFDA
:0426C000E5521200CD
:0C26C40029D865EF13F0D9CFE6FFE1CF75
:1026D000D9FF020EE126200EDF6EDE52270EDD6EE0
:1026E000D9CFE6FFDACFE6FF020EE66E180EE66EF1
:1026F000C2EC00F0E552E552E552E552F1EC06F08D
:102700000009FCE1020EE15C02E2E16AE552E16EE1
:10271000E552E7CFD9FF1200D9CFE6FFE1CFD9FFCD
:10272000020EE126200EDF6EDE520F0EDD6ED9CFD7
:10273000E6FFDACFE6FF020EE66E690EE66EC2EC49
:1027400000F0E552E552E552E552F1EC06F00009E1
:10275000FCE1020EE15C02E2E16AE552E16EE55263
:10276000E7CFD9FF1200D9CFE6FFE1CFD9FFE6527C
:10277000A80EDF6ED9CFE6FFDACFE6FF010EE66ED8
:10278000180EE66EC2EC00F0E552E552E552E55255
:10279000F1EC06F00009FCE1060EE66E180EE66E9E
:1027A00044EC01F0E552E552F1EC06F00009FCE1E1
:1027B000E552E552E7CFD9FF1200D9CFE6FFE1CFCE
:1027C000D9FFE652A80EDF6ED9CFE6FFDACFE6FFDB
:1027D000010EE66E690EE66EC2EC00F0E552E552BF
:1027E000E552E552F1EC06F00009FCE1060EE66E5A
:1027F000690EE66E44EC01F0E552E552F1EC06F0AC
:0E2800000009FCE1E552E552E7CFD9FF1200D6
:02280E00928AAC
:1028100094940E01020EE76FF19A120053EC16F039
:10282000010EE66E17EC19F0E55260EC16F0000EA2
:10283000E66EE66A500EE66EE66A3BEC09F0E5529B
:10284000E552E552E552120003010F0EFF6FF19EB3
:102850009388938A938C938E8188818A818C818ED0
:102860008A888A8A8A8C8A8E1200D9CFE6FFE1CFC5
:10287000D9FFE652F00E8114E8380F0BDF6EDF50FF
:102880000301FF19010B13E0FFA105D0000EE66E56
:10289000E66A460E04D0000EE66EE66A470EE66E65
:1028A000E66A3BEC09F0E552E552E552E552DF50AD
:1028B0000301FF19020B13E0FFA305D0000EE66E23
:1028C000E66A480E04D0000EE66EE66A490EE66E31
:1028D000E66A3BEC09F0E552E552E552E552DF507D
:1028E0000301FF19040B13E0FFA505D0000EE66EEF
:1028F000E66A4A0E04D0000EE66EE66A4B0EE66EFD
:10290000E66A3BEC09F0E552E552E552E552DF504C
:102910000301FF19080B13E0FFA705D0000EE66EB8
:10292000E66A4C0E04D0000EE66EE66A4D0EE66EC8
:10293000E66A3BEC09F0E552E552E552E552DFCF9D
:0C294000FFF3E552E552E7CFD9FF12008B
:04294C00970EE66E8E
:102950003BEC18F0E552D59E7B0EE66E9B0EE66EC4
:10296000A5EC17F0E552E552CD900201FF6B050E84
:10297000E66E57EC18F0E5527F0EE66E830EE66EBB
:1029800022EC17F0E552E5527990120016D8000EAD
:10299000E66EE66A0A0EE66EE66A3BEC09F0E55280
:1029A000E552E552E5521200000EE66EE66A1FECB3
:1029B00018F0E552E552D58E1200D59E12000201A4
:1029C000FF2B030E106E0C6EFFC207F009EC19F01E
:1029D00003500CE1000EE66EE66A0B0EE66EE66A48
:1029E0003BEC09F0E552E552E552E5521200000ECB
:1029F000E66EE66A03EC18F0E552E552CD8012006F
:102A0000CD9012000401FF5106E138EC16F00401EC
:102A1000010EFF6F04D051EC16F00401FF6BE66A63
:102A2000EA0EE66EE7EC17F0E552E5521200798007
:102A300038EC16F00401010EFF6F1200799051EC92
:082A400016F00401FF6B120007
:082A48001E0EF66E000EF76E83
:102A5000000EF86E00010900F550966F0900F55060
:102A6000976F03E1966701D03DD00900F550916F53
:102A70000900F550926F0900F550936F09000900A5
:102A8000F550E96E0900F550EA6E090009000900E9
:102A9000F550946F0900F550956F09000900F6CFC5
:102AA00098F0F7CF99F0F8CF9AF091C0F6FF92C066
:102AB000F7FF93C0F8FF0001945302E1955307E03C
:102AC0000900F550EE6E9407F8E29507F9D798C023
:102AD000F6FF99C0F7FF9AC0F8FF00019607000EB5
:062AE000975BBFD7120056
:0A2AE600D9CFE6FFDACFE6FFE1CF1B
:102AF000D9FFE2CFDAFFC26AC16AFC0EDB50400D9B
:102B0000F350C00B106EFC0EDB407F0B3C0B101023
:102B1000C26EFD0EDB50040DF350380B116EFD0E2E
:102B2000DB380F0B070B106EFD0EDB50800B101007
:102B30001110C16EFA0EDBCF10F0FB0EDBCF11F0DF
:102B400011C010F0116A10C048FFFA0EDBCF49FF28
:102B5000FC0EDBAE03D09E9C9D8CF28CC280E552B5
:0A2B6000E5CFDAFFE7CFD9FF12003E
:062B6A00D9CFE6FFDACF2F
:102B7000E6FFE1CFD9FFE2CFDAFFA86A9C6AFD0E3B
:102B8000DBB0A888DBA202D0A88C9C8CDBB4A88E1A
:102B9000DBA602D09C8801D09C8ADBA802D0A88446
:102BA00001D0A894DBBA9C86DBAC02D0A38A01D00A
:102BB000A39ADBAE02D0A38801D0A398FB0EDB5012
:102BC000AB6EFC0EDBCF11F011C010F0116A10508B
:102BD0007D6EA88A9C8EE552E5CFDAFFE7CFD9FF5C
:022BE0001200E1
:0E2BE200D9CFE6FFDACFE6FFE1CFD9FFE2CF91
:102BF000DAFFAD6AAC6AFD0EDBB0AD88DBA202D0B5
:102C0000AD8CAC8CDBB4AD8EDBA602D0AC8801D031
:102C1000AC8ADBB8AD84DBBAAC86DBAC02D09D8A73
:102C200001D09D9ADBAE02D09D8801D09D98FB0E0D
:102C3000DB50B06EFC0EDBCF11F011C010F0116A4A
:102C400010507F6EAD8AAC8EE552E5CFDAFFE7CF4C
:042C5000D9FF120096
:0C2C54009490949294948B908B928B94AB
:102C60000E010E0ED16F0F0ED26F120ED36F120027
:102C70003D0EE66EB5EC18F0E552800EE66EE66AA3
:102C8000C6EC16F0E552E5529EA2FED7FC0EE66EAB
:102C90003F0EE66E4EEC17F0E552E552BF80BF8264
:102CA00012002BEF19F0E668A0EC18F0E552800E48
:102CB000E66EE66A97EC16F0E552E552B98012002E
:042CC0000AEF00F027
:0C2CC400400EE66EE66A3C0EE66EF1EC97
:102CD00015F0E552E552E5520E01050EF66FCC6F88
:102CE000400EE66EE66A7C0EE66EB5EC15F0E55237
:102CF000E552E5521200A4AA06D0C8EC17F0E66E21
:102D0000D3EC0DF0E5520101FFA710D0AC98AC88D0
:102D10009C989C88000EE66EE66A1E0EE66EE66AD9
:0E2D200080EC09F0E552E552E552E552120052
:022D2E00D9CFFB
:102D3000E6FFDACFE6FFE1CFD9FFE2CFDAFFE652D6
:102D4000E652FC0EDBCF10F0FD0EDBCF11F0060ECD
:102D5000D89010361136E804FBE110C0DEFF11C038
:102D6000DDFF010EDB50B56EDF50E840E8403F0B61
:102D7000300B106ECF0EB4141010B46EE552E55245
:0C2D8000E552E5CFDAFFE7CFD9FF1200E3
:042D8C00D9CFE6FFB6
:102D9000DACFE6FFE1CFD9FFE2CFDAFFE652E65223
:102DA000FC0EDBCF10F0FD0EDBCF11F0060ED8903D
:102DB00010361136E804FBE110C0DEFF11C0DDFF64
:102DC000010EDB50BB6EDF50E840E8403F0B300B9C
:102DD000106ECF0EBA141010BA6EE552E552E552DD
:0A2DE000E5CFDAFFE7CFD9FF1200BC
:062DEA009280FE0EE66E71
:102DF0001F0EE66E840EE66EE10EE66E73EC15F0C5
:102E0000E552E552E552E55212002DEF19F007EFB9
:102E100000F0D9CFE6FFE1CFD9FF030EE12622EC87
:102E200019F0F3CFDEFFF4CFDDFF020EF36EDB6EA1
:102E3000030EE15C02E2E16AE552E16EE552E7CFA2
:042E4000D9FF1200A4
:0C2E4400D9CFE6FFDACFE6FFE1CFD9FFDF
:102E5000E2CFDAFFFC0EDB50F30B976EFD0EDB507A
:102E60007F0BE824796EFD0EDBB4CD867B6A7A6A2F
:102E7000A192A492DBAE02D0A08201D0A092FC0E5F
:102E8000DBA402D0A38201D0A39297BE978679805B
:0C2E9000E552E5CFDAFFE7CFD9FF1200D2
:042E9C00D9CFE6FFA5
:102EA000DACFE6FFE1CFD9FFE2CFDAFFFD0EDB801C
:102EB000DB82DB84DB86DB88DB8AFC0EDB84DB8663
:102EC000DB88DB8ADB8CDB8EFD0EDBCFE6FFC00E02
:102ED000BA10E552E714BA6EFC0EDBCFE6FF0F0E18
:102EE000BA10E552E714BA6EE552E5CFDAFFE7CF44
:042EF000D9FF1200F4
:0C2EF400D9CFE6FFDACFE6FFFA0EE3CFFD
:102F0000D9FFFB0EE3CFDAFFFC0EE3CFE9FFFD0EA6
:102F1000E3CFEAFFE9CFF3FFEACFF4FFF80EE35087
:102F200003E1F90EE35008E0F80EE30602E2F90EC1
:102F3000E306DECFEEFFF2D7FF0EE3CFDAFFE55276
:0A2F4000FF0EE3CFD9FFE5521200A7
:062F4A00D9CFE6FFDACF4B
:102F5000E6FFE1CFD9FFE2CFDAFFFC0EDB50F30B47
:102F60009A6EFD0EDB507F0BE824CD6ECF6ACE6AE1
:102F70009E90FD0EDBAE02D09D8001D09D909ABE4A
:102F80009A86CD80E552E5CFDAFFE7CFD9FF120070
:102F9000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFF04
:102FA000E652F20E0101FF179CAC03D0FF919CB0DA
:102FB000FF819CB4FF859CB2FF87AA50DF6EDF5073
:0E2FC000E552E552E5CFDAFFE7CFD9FF120068
:022FCE00D9CF59
:102FD000E6FFDACFE6FFE1CFD9FFE2CFDAFFE65234
:102FE000E652FC0EDBCFDEFFDBCFDDFF010EDB5058
:102FF0007B6EDF507A6EE552E552E552E5CFDAFF9F
:060018005BEF14F0120082
:02001E000500DB
:10002000E6350000FE08000002000000E435000094
:10003000FE07000002000000E2350000FE0600009E
:1000400002000000E0350000FE0500000200000094
:0C005000DE350000FE040000020000008D
:04005C00D9CFE6FF13
:10006000E1CFD9FFFD0EDBCFFEF2FE0EDBCFFFF2BC
:10007000FEC2E9FFFFC2EAFF000EEE6E0B0EED6E50
:10008000FEC2E9FFFFC2EAFF020EEB6A030EEB6A53
:10009000FEC2E9FFFFC2EAFF060EE926000EEA22D1
:1000A000EF6AFEC2E9FFFFC2EAFF040EE926000E76
:1000B000EA22050EEF6EFEC2E9FFFFC2EAFF080E5C
:1000C000E926000EEA22EF6AFEC2E9FFFFC2EAFF5C
:1000D000050EE926000EEA22EF6AFEC2E9FFFFC222
:1000E000EAFF020EEB6A030EEB6AFEC2E9FFFFC2F3
:1000F000EAFF090EE926000EEA22EF6AFEC2E9FFD6
:10010000FFC2EAFF0B0EE926000EEA22EF6AFEC2EA
:10011000E9FFFFC2EAFF0C0EE926000EEA22EF6AB1
:10012000FEC2E9FFFFC2EAFF0F0EE926000EEA2237
:10013000EF6AFEC2E9FFFFC2EAFF0D0EE926000EDC
:10014000EA22EF6AFEC2E9FFFFC2EAFF0E0EE926CD
:10015000000EEA22220EEF6EE552E7CFD9FF120021
:10016000FEC2E9FFFFC2EAFF0F0EE926000EEA22F7
:10017000110EEF6E94869488C76AC66AC56AF00E3F
:10018000C6140809C66E4F0EC86EC78EC68A120006
:10019000D9CFE6FFE1CFD9FF020EE126FD0EDB50FD
:1001A0006FE0DE6ADD6ADECF10F0DDCF11F0FD0E0C
:1001B000DB50000111AE02D0D89003D0105C000ECD
:1001C000115826E2FB0EDBCF12F0FC0EDBCF13F052
:1001D000DE501224E96EDD501320EA6EEF50E66E19
:1001E000DECF10F0DDCF11F0FEC2E9FFFFC2EAFF63
:1001F0001050EE24E76E1150EE20EA6EE7CFE9FFD3
:10020000E552E750EF6EDF2A010ECDE3DB2ACBD7B4
:10021000FD0EDB50E66EFEC2E9FFFFC2EAFF020EF2
:10022000E926000EEA22E552E750EE6EED6AFEC2C4
:10023000E9FFFFC2EAFF0D0EE926000EEA22FE0EDC
:10024000DBCFEFFFFEC2E9FFFFC2EAFF050EE926A2
:10025000000EEA22EF6AFEC2E9FFFFC2EAFF040EC7
:10026000E926000EEA22090EEF6EFEC2E9FFFFC288
:10027000EAFF0E0EE926000EEA22200EEF6EC58080
:10028000020EE15C02E2E16AE552E16EE552E7CF7F
:10029000D9FF1200D9CFE6FFE1CFD9FFFD0EDB5029
:1002A00038E0FD0EDB50E66EFEC2E9FFFFC2EAFF5A
:1002B000020EE926000EEA22E552E750EE6EED6AE4
:1002C000FEC2E9FFFFC2EAFF0D0EE926000EEA2298
:1002D000FE0EDBCFEFFFFEC2E9FFFFC2EAFF050E15
:1002E000E926000EEA22EF6AFEC2E9FFFFC2EAFF3A
:1002F000040EE926000EEA22090EEF6EFEC2E9FFA7
:10030000FFC2EAFF0E0EE926000EEA22210EEF6E72
:10031000C580E552E7CFD9FF1200D9CFE6FFE1CF84
:10032000D9FFFEC2E9FFFFC2EAFF0F0EE926000E69
:10033000EA22100EEF6E94869488FE0EDB50E824BD
:10034000C86EC76AC66AC56AF00EC6140E09C66EC4
:10035000C78EC580C68AE552E7CFD9FF1200FEC21C
:10036000E9FFFFC2EAFF0F0EEB50110802E1C3EFF5
:1003700001F0FEC2E9FFFFC2EAFF0F0EEB501008CA
:1003800001E1E4D91200FEC2E9FFFFC2EAFF0E0E4E
:10039000EB50200801E09DD0FEC2E9FFFFC2EAFF5A
:1003A000040EEB500B0A19E0020A04E00C0A01E10A
:1003B0008FD01200FEC2E9FFFFC2EAFF040EE92659
:1003C000000EEA220B0EEF6EFEC2E9FFFFC2EAFF4B
:1003D0000D0EEB50E824C96E1200C5BC58D0FEC209
:1003E000E9FFFFC2EAFF050EEB50106E116A020E24
:1003F000E926000EEA22EECF12F0EFCF13F01150F3
:100400001318E8AE02D0133404D01250105C13500D
:1004100011581BE2FEC2E9FFFFC2EAFF050EEB50D6
:10042000116AE850EE24E76E1150EE20EA6EE7CF35
:10043000E9FFEF50C96EFEC2E9FFFFC2EAFF050EF9
:10044000E926000EEA22EF2A1200FEC2E9FFFFC2EF
:10045000EAFF040EE926000EEA22050EEF6EC584BF
:10046000FEC2E9FFFFC2EAFF0E0EE926000EEA22F5
:10047000220EEF6E000EE66EE66A2B0EE66EE66A60
:10048000A5EC0DF0E552E552E552E5521200FEC230
:10049000E9FFFFC2EAFF040EE926000EEA22050E7C
:1004A000EF6EC584FEC2E9FFFFC2EAFF0E0EE92629
:1004B000000EEA22220EEF6E000EE66EE66A2C0EA9
:1004C000E66EE66AA5EC0DF0E552E552E552E5521E
:1004D0001200FEC2E9FFFFC2EAFF0E0EEB50210838
:1004E00001E0D7D0FEC2E9FFFFC2EAFF040EEB50E5
:1004F0000D0A01E19FD0010A01E190D00B0A40E012
:100500000C0A1AE0020A04E00C0A01E1C2D012004F
:10051000FEC2E9FFFFC2EAFF040EE926000EEA224E
:100520000B0EEF6EFEC2E9FFFFC2EAFF0D0EEB50AD
:10053000E8240109C96E1200C5AC70D0FEC2E9FF03
:10054000FFC2EAFF040EE926000EEA22050EEF6E56
:10055000C584FEC2E9FFFFC2EAFF0E0EE926000EC7
:10056000EA22220EEF6E000EE66EE66A2E0EE66EB0
:10057000E66AA5EC0DF0E552E552E552E5521200AF
:10058000FEC2E9FFFFC2EAFF050EEB50116AE85018
:10059000EE24E76E1150EE20EA6EE7CFE9FFC9CFF7
:1005A000EFFFFEC2E9FFFFC2EAFF050EE926000EDB
:1005B000EA22EF2AFEC2E9FFFFC2EAFF050EEB5076
:1005C000106E116A020EE926000EEA22EECF12F03A
:1005D000EFCF13F011501318E8AE02D0133404D04B
:1005E0001250105C135011580CE2FEC2E9FFFFC21A
:1005F000EAFF040EE926000EEA220C0EEF6EC59A01
:100600000BD0FEC2E9FFFFC2EAFF040EE926000E8E
:10061000EA220D0EEF6EC58AC5881200FEC2E9FF00
:10062000FFC2EAFF040EE926000EEA22070EEF6E73
:10063000C5861200FEC2E9FFFFC2EAFF040EE926EA
:10064000000EEA22050EEF6EC584FEC2E9FFFFC26E
:10065000EAFF0E0EE926000EEA22220EEF6EFEC21F
:10066000E9FFFFC2EAFFEECFE6FFEFCFE6FF2D0E78
:10067000E66EFEC2E9FFFFC2EAFF020EE926000EA7
:10068000EA22EF50E66EA5EC0DF0E552E552E55298
:10069000E5521200D9CFE6FFE1CFD9FFFEC2E9FF54
:1006A000FFC2EAFF060EE926000EEA22010EEF6EF7
:1006B000FEC2E9FFFFC2EAFF020EEB6A030EEB6A1D
:1006C000FE0EDB5035E0C7AA1DD0FEC2E9FFFFC217
:1006D000EAFF040EE926000EEA22050EEF6EFEC2C6
:1006E000E9FFFFC2EAFF080EE926000EEA22EF2A20
:1006F000FEC2E9FFFFC2EAFF070EE926000EEA226A
:10070000050E1FD0C7A40AD0FEC2E9FFFFC2EAFF50
:10071000040EE926000EEA22080E13D0FEC2E9FFFD
:10072000FFC2EAFF040EE926000EEA22070E09D0F6
:10073000FEC2E9FFFFC2EAFF040EE926000EEA222C
:10074000060EEF6EE552E7CFD9FF1200D9CFE6FFD4
:10075000E1CFD9FF090EE126010EDB6A020EDB6A4A
:10076000030EDB6A040EDB6A080EDB6AC6AC23D01C
:10077000C69CFEC2E9FFFFC2EAFF040EE926000E96
:10078000EA22050EEF6E010EF36E040EF3CFDBFFCF
:10079000FEC2E9FFFFC2EAFF080EE926000EEA22C8
:1007A000EF2AFEC2E9FFFFC2EAFF070EE926000EAC
:1007B000EA22040EEF6EC7A005D0C950DF6EDE52EC
:1007C000010EDD6E040EDB5001E022D2FEC2E9FF15
:1007D000FFC2EAFF040EEB50070A01E15ED10F0AE7
:1007E0006CE00E0A14E0030A01E012D2C7A610D290
:1007F000010EDBCFE6FF4EDFE552FEC2E9FFFFC28E
:10080000EAFF040EEB50080801E002D237D0C7A877
:1008100010D0FEC2E9FFFFC2EAFF060EE926000E75
:10082000EA22EF2A010EDB5001E1E8D1C7AA87D105
:10083000D2D1010EDB5001E1EBD1FEC2E9FFFFC2D4
:10084000EAFF060EE926000EEA22EF2AC7BA18D000
:10085000C7B40AD0FEC2E9FFFFC2EAFF040EE926D0
:10086000000EEA22070ED3D1FEC2E9FFFFC2EAFF63
:10087000040EE926000EEA22080EEF6E030EA9D13F
:10088000FEC2E9FFFFC2EAFF080EE926000EEA22D7
:10089000EF2AFEC2E9FFFFC2EAFF040EE926000EBE
:1008A000EA22050EEF6EFEC2E9FFFFC2EAFF070E65
:1008B000E926000EEA22060EAAD1FEC2E9FFFFC217
:1008C000EAFF0B0EEB50000901E07ED074EC0EF055
:1008D000080EF3CFDBFFDB502A0803E1080EDB50E4
:1008E0001BE1C968FEC2E9FFFFC2EAFF050EE92667
:1008F000000EEA22010EEF6EFEC2E9FFFFC2EAFF20
:100900000B0EE926000EEA22010EEF6EFEC2E9FF91
:10091000FFC2EAFF0C0E52D0FEC2E9FFFFC2EAFF9F
:10092000EECFE6FFEFCFE6FFFEC2E9FFFFC2EAFF30
:100930000A0EEB50E66EE66AFE0EE66E54EC0EF022
:10094000126E050EE15E1250F4CF11F0FEC2E9FF07
:10095000FFC2EAFF020EF3CFEBFF030E11C0EBFF65
:10096000FEC2E9FFFFC2EAFF020EE926000EEA22FC
:10097000EECF10F0EFCF11F0113401E349D1105058
:100980000008000E115401E343D1FEC2E9FFFFC28B
:10099000EAFFEE50EFCFEAFFE96EEF50C96EFEC2FC
:1009A000E9FFFFC2EAFF050EE926000EEA22010E6A
:1009B000EF6EFEC2E9FFFFC2EAFF0B0EE926000E52
:1009C000EA22010EEF6E5AD0FEC2E9FFFFC2EAFF33
:1009D0000C0EEB5000091CE0FEC2E9FFFFC2EAFF6B
:1009E000050EEB50106E090EEB50105C02E2C96868
:1009F0003BD0FEC2E9FFFFC2EAFF0B0EE926000E64
:100A0000EA22EF6AFEC2E9FFFFC2EAFF0C0E40D005
:100A1000FEC2E9FFFFC2EAFF050EEB50106E116A3D
:100A2000020EE926000EEA22EECF12F0EFCF13F00D
:100A300011501318E8AE02D0133404D01250105CD9
:100A40001350115820E2FEC2E9FFFFC2EAFF050E73
:100A5000EB50116AE850EE24E76E1150EE20EA6E7A
:100A6000E7CFE9FFEF50C96EFEC2E9FFFFC2EAFF20
:100A7000050EE926000EEA22EF2A010EF36E020EA1
:100A8000F3CFDBFFC5D0FEC2E9FFFFC2EAFF0B0ECA
:100A9000E926000EEA22EF6AB1D0C7A856D0FEC2FE
:100AA000E9FFFFC2EAFF060EE926000EEA22EF2A5E
:100AB000010EDB5044E0C7AA25D0FEC2E9FFFFC209
:100AC000EAFFEECF10F0EFCF11F0FEC2E9FFFFC258
:100AD000EAFF020EE926000EEA221050EE24E76E2D
:100AE0001150EE20EA6EE7CFE9FFDFCFEFFFFEC245
:100AF000E9FFFFC2EAFF020EE926000EEA22EE2A13
:100B0000EF221DD0FEC2E9FFFFC2EAFF080EE92670
:100B1000000EEA22EF2AFEC2E9FFFFC2EAFF070E3B
:100B2000E926000EEA22060EEF6EFEC2E9FFFFC2C2
:100B3000EAFF040EE926000EEA22050E5ED0010E41
:100B4000F36E030EF3CFDBFF59D0010EDB5060E0F4
:100B5000FEC2E9FFFFC2EAFF060EE926000EEA2206
:100B6000EF2AC7AA25D0FEC2E9FFFFC2EAFFEECFF7
:100B700010F0EFCF11F0FEC2E9FFFFC2EAFF020E54
:100B8000E926000EEA221050EE24E76E1150EE2006
:100B9000EA6EE7CFE9FFDFCFEFFFFEC2E9FFFFC25A
:100BA000EAFF020EE926000EEA22EE2AEF2230D0FA
:100BB000C7A411D0FEC2E9FFFFC2EAFF040EE92676
:100BC000000EEA22080EEF6E010EF36E030EF3CF55
:100BD000DBFFC96E1DD0FEC2E9FFFFC2EAFF080EAF
:100BE000E926000EEA22EF2AFEC2E9FFFFC2EAFF71
:100BF000070EE926000EEA22060EEF6EFEC2E9FF9E
:100C0000FFC2EAFF040EE926000EEA22050EEF6E8F
:100C1000010EDB5003E1020EDB5002E0C6A8C688DD
:100C2000FEC2E9FFFFC2EAFF020EE926000EEA2239
:100C3000EECF10F0EFCF11F0113425E21050FC0888
:100C4000000E115420E2030EDB501DE1FEC2E9FF4D
:100C5000FFC2EAFF040EE926000EEA22050EEF6E3F
:100C6000FEC2E9FFFFC2EAFF080EE926000EEA22F3
:100C7000EF2AFEC2E9FFFFC2EAFF070EE926000ED7
:100C8000EA22070EEF6E030EDB506DE0FEC2E9FFB5
:100C9000FFC2EAFF020EE926000EEA22EECF10F0B4
:100CA000EFCF11F01006115AFEC2E9FFFFC2EAFFB2
:100CB0001050EE24E76E1150EE20EA6EE7CFE9FF08
:100CC000EF50E66EFEC2E9FFFFC2EAFF090EE92619
:100CD000000EEA22E552E750EF6EFEC2E9FFFFC2C6
:100CE000EAFF060EEB50E66EEECF10F0EFCF11F0FC
:100CF000FEC2E9FFFFC2EAFF020EE926000EEA2269
:100D00001050EE24E76E1150EE20EA6EE7CFE9FFB7
:100D1000E552E750EF6EFEC2E9FFFFC2EAFFEECFF9
:100D2000E6FFEFCFE6FF290EE66EFEC2E9FFFFC247
:100D3000EAFF020EE926000EEA22EECF10F0EFCF16
:100D400011F0010E1024E66EA5EC0DF0E552E5520F
:100D5000E552E552FEC2E9FFFFC2EAFF020EEB6A6E
:100D6000030EEB6A38D0FEC2E9FFFFC2EAFF080EAD
:100D7000EB50106E010E105C2EE3FEC2E9FFFFC2C5
:100D8000EAFF080EEB50E76E050EE7CFDBFF070E1C
:100D9000EB50E76E060EE7CFDBFFEB50E76E070E7A
:100DA000E7CFDBFFD950050FE66E000EDA20E66EC6
:100DB000280EE66E030EE66EA5EC0DF0E552E55248
:100DC000E552E552FEC2E9FFFFC2EAFF080EE9263E
:100DD000000EEA22EF6A090EE15C02E2E16AE552E6
:100DE000E16EE552E7CFD9FF1200FEC2E9FFFFC274
:0E0DF000EAFF0E0EEB50220801E1000C010C90
:020DFE00D9CF4B
:100E0000E6FFE1CFD9FF4B0EE126240EDB6A250E6B
:100E1000DB6A260EDB6A270EDB6A280EDB6A290EE8
:100E2000DB6A2A0EDB6A2B0EDB6A2C0EDB6A2D0EC8
:100E3000DB6A2E0EDB6AD9502F0FE96EDACFEAFF9C
:100E4000EE6AEE6AEE6AEE6A9B8C8F0ED31470091E
:100E5000D36EFC0ED3140009D36E0F0148691F0E28
:100E6000496F76EC18F0D9CFE6FFDACFE6FFD6EC83
:100E70000EF0E552E552D950090FE66E000EDA2069
:100E8000E66E2EEC00F0E552E552D950190FE66EF1
:100E9000000EDA20E66E07EC12F0E552E55248EC5F
:100EA0000BF003EC18F0CFEC14F06FEC16F05BECE9
:100EB00016F040EC17F0C2EC13F0B7EC13F0510E43
:100EC000E66E8DEC01F0E552D8EC1AF0AEEC0EF0C7
:100ED000000EE66E0A0EE66ED950230FE66E000E87
:100EE000DA20E66EFE0EE66EC2EC0DF0106E050E18
:100EF000E15E1050210EF3CFDBFF220EF4CFDBFFBB
:100F0000210EDBCF10F0220EDBCF11F00001800E9E
:100F100011140CE0D950210FE96EDACFEAFFFC0E74
:100F2000EE1801E000D3FF0EED18FDD2230EDB50CA
:100F3000440A01E1CAD2070A01E152D2010A01E1E1
:100F400045D2030A01E13FD2010A01E139D27F0A09
:100F500001E133D2010A01E12DD2030A01E1E1D01E
:100F6000010A01E1B7D0150A1DE0010A02E0360AC4
:100F7000ADD7240EDB6ADB50106E116A210EDBCF79
:100F800012F0220EDBCF13F011501318E8AE02D08E
:100F9000133404D01250105C1350115897E2240EF1
:100FA000DB2AE9D7240EDB6ADB50106E116A210EB2
:100FB000DBCF12F0220EDBCF13F01206000E135A15
:100FC00011501318E8AE02D0133404D01250105C44
:100FD0001350115803E2240EDB2AE6D70A01005110
:100FE000090A01E173D7010A01E170D70F0A01E193
:100FF0006DD7010A01E16AD7020A29E0060A01E079
:1010000065D7010EF36E210EF3CFDBFF220EDB6AF4
:10101000D9501D0FE96EDACFEAFFFE0ED880EE54EC
:10102000000EED5403E2FE0E006F03D01D0EDBCF69
:1010300000FA000EE66E0A0EE66E2A0EE66E210E2D
:10104000DBCFE6FF37EC0EF0E552E5523BD2D9504C
:101050001D0FE96EDACFEAFFFE0ED880EE54000EC7
:10106000ED540EE2FE0EF36E210EF3CFDBFF220EE7
:10107000DB6A000EE66E0A0EE66EFE0EE66E13D01A
:101080001D0EDBCF06F01E0EDBCF07F0210E06C0D3
:10109000DBFF220E07C0DBFF000EE66E0A0EE66ED7
:1010A0001D0EDBCFE6FF29EC13F0E552E552E552C9
:1010B000000EE66E0A0EE66E2A0EE66E210EDBCFFD
:1010C000E6FF37EC0EF0E552E552E552E55279ECD9
:1010D00017F0FCD6D950350FE96EDACFEAFF000ED3
:1010E000EE6E0A0EED6E240EDB6ADB50106E116A96
:1010F000210EDBCF12F0220EDBCF13F0050E125EB5
:10110000000E135A11501318E8AE02D0133404D055
:101110001250105C1350115801E3D8D6240EDB2A6C
:10112000E4D7E0EC1AF0D950370FE96EDACFEAFFD6
:10113000000EEE6E0A0EED6E370EDBCFE9FF380EB5
:10114000DBCFEAFFEE52E9CF10F0EACF11F0E9CFA2
:10115000E6FFEACFE6FFECEC10F0E552E552370E81
:10116000DBCFE9FF380EDBCFEAFF090EE926000EE0
:10117000EA22E9CF10F0EACF11F0E9CFE6FFEACF9B
:10118000E6FFD4EC11F0E552E552240EDB6ADB50A9
:10119000106E116A210EDBCF12F0220EDBCF13F09E
:1011A0000C0E125E000E135A11501318E8AE02D046
:1011B000133404D01250105C1350115803E2240E63
:1011C000DB2AE5D7370EDBCFE9FF380EDBCFEAFFAE
:1011D000EE52040EE926000EEA22EECF10F0EECF1A
:1011E00011F0EECF12F0EFCF13F0D9502F0FE96EC0
:1011F000DACFEAFF00011050EE182BE11150EE1883
:1012000028E11250EE1825E11350EE1822E121E1F9
:10121000370EDBCFE9FF380EDBCFEAFFEE52EECF21
:1012200014F0EECF15F0EECF16F0EFCF17F0D95047
:101230002B0FE96EDACFEAFF1450EE1808E11550D3
:10124000EE1805E11650EE1802E11750EE1801E114
:101250007ED0370EDBCFE9FF380EDBCFEAFFEE5250
:10126000E9CF10F0EACF11F0E9CFE6FFEACFE6FFD1
:10127000040EE66E9FEC12F0E552E552E552370E91
:10128000DBCFE9FF380EDBCFEAFFEE52040EE92692
:10129000000EEA22E9CF10F0EACF11F0E9CFE6FF25
:1012A000EACFE6FF040EE66E9FEC12F0E552E5523F
:1012B000E552370EDBCFE9FF380EDBCFEAFF0C0E2D
:1012C000E926000EEA22E9CF10F0EACF11F0E9CFCB
:1012D000E6FFEACFE6FF210EDBCF12F0220EDBCFD6
:1012E00013F00C0E125E000E135A1250E66E9FECB5
:1012F00012F0E552E552E552370EDBCFE9FF380E2A
:10130000DBCFEAFFEE522B0EEECFDBFF2C0EEECF43
:10131000DBFF2D0EEECFDBFF2E0EEECFDBFF370E09
:10132000DBCFE9FF380EDBCFEAFFEE52040EE926F1
:10133000000EEA222F0EEECFDBFF300EEECFDBFFEA
:10134000310EEECFDBFF320EEECFDBFF23D0370EB8
:10135000DBCFE9FF380EDBCFEAFF0C0EE926000EEB
:10136000EA22E9CF10F0EACF11F0E9CFE6FFEACFA9
:10137000E6FF210EDBCF12F0220EDBCF13F00C0EB6
:10138000125E000E135A1250E66E9FEC12F0E552F8
:10139000E552E552370EDBCFE9FF380EDBCFEAFF2F
:1013A0000C0EE926000EEA22EF50E66E01EC15F075
:1013B000E55217D1D950390F0BD0D9503B0F08D077
:1013C000D9503D0F05D0D9503F0F02D0D950410F11
:1013D000E96EDACFEAFF000EEE6E0A0EED6E76D5FC
:1013E000D950430FE96EDACFEAFF000EEE6E0A0E17
:1013F000ED6E430EDBCFE9FF440EDBCFEAFFEE528A
:10140000E9CF10F0EACF11F0E9CFE6FFEACFE6FF2F
:10141000ECEC10F0E552E552430EDBCFE9FF440E51
:10142000DBCFEAFF0E0EE926000EEA22E9CF10F02C
:10143000EACF11F0E9CFE6FFEACFE6FFECEC10F0DF
:10144000E552E552430EDBCFE9FF440EDBCFEAFF66
:10145000090EE926000EEA22E9CF10F0EACF11F0DA
:10146000E9CFE6FFEACFE6FFD4EC11F0E552E55212
:10147000430EDBCFE9FF440EDBCFEAFF0C0EE9267B
:10148000000EEA22E9CF10F0EACF11F0E9CFE6FF33
:10149000EACFE6FFD4EC11F0E552E552430EDBCF84
:1014A000E9FF440EDBCFEAFF180EE926000EEA2220
:1014B000E9CF10F0EACF11F0E9CFE6FFEACFE6FF7F
:1014C000D4EC11F0E552E55201D5D950450FE96E43
:1014D000DACFEAFF000EEE6E0A0EED6E450EDBCFA0
:1014E000E9FF460EDBCFEAFFEE52EF50110A01E1B1
:1014F000EDD4160A01E1EAD4010A01E1E7D4050AB4
:1015000001E1E4D4010A09E0030A01E1DFD4010AA0
:1015100001E0DCD42A0EDB6AD9D4010EF36E2A0E68
:10152000F3CFDBFFD3D4000EE66E0A0EE66ED95081
:10153000230FE66E000EDA20E66EFE0EE66E79EC04
:101540000DF0106E050EE15E1050210EF3CFDBFFA3
:10155000220EF4CFDBFF210EDBCF10F0220EDBCF0B
:1015600011F00001800E11140CE0D950210FE96E2A
:10157000DACFEAFFFC0EEE1801E0A8D4FF0EED185A
:10158000A5D4230EDB500B0A01E1A0D4010A2CE004
:101590005A0A19E01D0A01E199D4010A01E196D421
:1015A000070A01E193D4010A01E190D4030A01E1A1
:1015B0008DD4010A01E18AD40F0A01E187D4010A1E
:1015C00001E184D416D0010EF36E260EF3CFDBFFBB
:1015D0007EEC17F0010EE66E44EC1AF0E5527EEC5C
:1015E00017F0D8EC1AF072D4260EDB6ADAEC1AF097
:1015F0006DD4240EDB6ADB50106E116A210EDBCF36
:1016000012F0220EDBCF13F011501318E8AE02D007
:10161000133404D01250105C1350115801E356D407
:06162000240EDB2AE8D7CE
:0A162600D9CFE6FFE1CFD9FFE6526D
:10163000FD0EDBCFE9FFFE0EDBCFEAFF0A0EE92647
:10164000000EEA22EF6AFD0EDBCFE9FFFE0EDBCFD4
:10165000EAFF0B0EE926000EEA22EF6ADF6A020EAD
:10166000DF5C11E2FD0EDBCFE9FFFE0EDBCFEAFF10
:10167000DF50050DE950F324E96EEA50F420EA6EDC
:10168000EF6ADF2AECD7E552E552E7CFD9FF120027
:101690000001906B000E636F090E646F000E686F9F
:1016A000080E696F000E6F6F070E706F000E746F7B
:1016B000060E756F000E7B6F050E7C6F000E806F3F
:1016C000040E816F000E876F030E886F000E8C6F03
:1016D000020E8D6F600EE66E000EE66EA4DFE55220
:1016E000E5526C0EE66E000EE66E9DDFE552E552A9
:1016F000780EE66E000EE66E96DFE552E552840E39
:10170000E66E000EE66E8FDFE552E5521200D9CF8D
:10171000E6FFE1CFD9FF050EE126FC0EDB50E66EB9
:10172000D950030FE96EDACFEAFFE552E750EE6ECB
:10173000ED6AFD0EDBCFE9FFFE0EDBCFEAFF0A0EFE
:10174000E926000EEA22EFCFDFFFFD0EDBCFE9FF37
:10175000FE0EDBCFEAFFE9CF12F0EACF13F0DF5045
:10176000050DE950F324106EEA50F420116E010EBD
:1017700010C0DBFF020E11C0DBFF010EDBCFE9FF63
:10178000020EDBCFEAFFEF5003E0F368F4685AD0B3
:10179000010EDBCFE9FF020EDBCFEAFFEE52FC0EBB
:1017A000DBCFEFFF010EDBCFE9FF020EDBCFEAFF5D
:1017B000E926000EEA22FB0EDBCFEFFF030EDBCFA4
:1017C000E6FF040EDBCFE6FFF90EDBCFE6FFFA0EF5
:1017D000DBCFE6FF010EDBCFE9FF020EDBCFEAFF36
:1017E000030EE926000EEA22EECFE6FFEFCFE6FF7A
:1017F00062EC19F0106E060EE15E1050FD0EDBCFAC
:10180000E9FFFE0EDBCFEAFF0A0EE926000EEA2210
:10181000EF28010BE66EFD0EDBCFE9FFFE0EDBCFFE
:10182000EAFF0A0EE926000EEA22E552E750EF6EC3
:10183000010EDBCFE9FF020EDBCFEAFF010EEF6EF8
:10184000F36EF46A050EE15C02E2E16AE552E16ED4
:10185000E552E7CFD9FF1200D9CFE6FFE1CFD9FF9C
:10186000050EE126FD0EDBCFE9FFFE0EDBCFEAFF22
:101870000B0EE926000EEA22EFCFDFFFFD0EDBCFD5
:10188000E9FFFE0EDBCFEAFFE9CF12F0EACF13F05B
:10189000DF50050DE950F324106EEA50F420116E6C
:1018A000010E10C0DBFF020E11C0DBFF010EDBCF0B
:1018B000E9FF020EDBCFEAFFEF0401E082D0010E68
:1018C000DBCFE9FF020EDBCFEAFFEE52EFCF10F0E5
:1018D000FC0EDB50D880105402E2FD0E73D0010ED6
:1018E000DBCFE9FF020EDBCFEAFFEE52EF50E66EF0
:1018F000D950030FE96EDACFEAFFE552E750EE6EFA
:10190000ED6A030EDBCFE6FF040EDBCFE6FF010E30
:10191000DBCFE9FF020EDBCFEAFF030EE926000E64
:10192000EA22EECFE6FFEFCFE6FFF80EDBCFE6FFD1
:10193000F90EDBCFE6FF62EC19F0106E060EE15EE9
:101940001050FD0EDBCFE9FFFE0EDBCFEAFF0B0EE2
:10195000E926000EEA22EF28010BE66EFD0EDBCF32
:10196000E9FFFE0EDBCFEAFF0B0EE926000EEA22AE
:10197000E552E750EF6E010EDBCFE9FF020EDBCF41
:10198000EAFFE926000EEA22EF50E66EFA0EDBCF00
:10199000E9FFFB0EDBCFEAFFE552E750EF6E010EE9
:1019A000DBCFE9FF020EDBCFEAFFEF6A030EDBCFEE
:1019B00010F0040EDBCF11F010C0F3FF11C0F4FFE4
:1019C00003D0FC0EF36EF468050EE15C02E2E16AFE
:1019D000E552E16EE552E7CFD9FF1200D9CFE6FF1D
:1019E000E1CFD9FF030EE126FD0EDBCFE9FFFE0EAE
:1019F000DBCFEAFF0B0EE926000EEA22EFCFDFFF76
:101A0000FD0EDBCFE9FFFE0EDBCFEAFFDF50050D59
:101A1000E950F324106EEA50F420116E010E10C04C
:101A2000DBFF020E11C0DBFF010EDBCFE9FF020E70
:101A3000DBCFEAFFEF040BE1010EDBCFE9FF020E83
:101A4000DBCFEAFFE926000EEA22EF5001D0000EBC
:101A5000106E030EE15C02E2E16AE552E16E1050A5
:101A6000E552E7CFD9FF1200D9CFE6FFE1CFD9FF8A
:101A7000FD0EDBCFE9FFFE0EDBCFEAFFE9CF10F072
:101A8000EACF11F0FD0EDBCFE9FFFE0EDBCFEAFF60
:101A90000B0EE926000EEA22EF50050D1050F3243C
:101AA000E96E1150F420EA6EEF50E552E7CFD9FF0E
:101AB0001200D38E03001200D9CFE6FFE1CFD9FF89
:101AC000FB0EDBCFE6FFFC0EDBCFE6FFFD0EDBCF30
:101AD000E6FFFE0EDBCFE6FF600EE66E000EE66E62
:101AE00016DE106E060EE15E1050E552E7CFD9FF0C
:101AF0001200D9CFE6FFE1CFD9FFFA0EDBCFE6FF28
:101B0000FB0EDBCFE6FFFC0EDBCFE6FFFD0EDBCFEF
:101B1000E6FFFE0EDBCFE6FF600EE66E000EE66E21
:101B20009BDE106E070EE15E1050E552E7CFD9FF45
:101B30001200600EE66E000EE66E50DFE552E552D2
:101B4000116AF36E11C0F4FF1200D9CFE6FFE1CFA6
:101B5000D9FFFB0EDBCFE6FFFC0EDBCFE6FFFD0E71
:101B6000DBCFE6FFFE0EDBCFE6FF6C0EE66E000E6F
:101B7000E66ECDDD106E060EE15E1050E552E7CF49
:101B8000D9FF1200D9CFE6FFE1CFD9FFFA0EDBCFA4
:101B9000E6FFFB0EDBCFE6FFFC0EDBCFE6FFFD0E24
:101BA000DBCFE6FFFE0EDBCFE6FF6C0EE66E000E2F
:101BB000E66E52DE106E070EE15E1050E552E7CF82
:101BC000D9FF12006C0EE66E000EE66E07DFE552DE
:101BD000E552116AF36E11C0F4FF1200D9CFE6FF8F
:101BE000E1CFD9FFFB0EDBCFE6FFFC0EDBCFE6FF3C
:101BF000FD0EDBCFE6FFFE0EDBCFE6FF780EE66ED6
:101C0000000EE66E84DD106E060EE15E1050E552A9
:101C1000E7CFD9FF1200D9CFE6FFE1CFD9FFFA0E07
:101C2000DBCFE6FFFB0EDBCFE6FFFC0EDBCFE6FFF4
:101C3000FD0EDBCFE6FFFE0EDBCFE6FF780EE66E95
:101C4000000EE66E09DE106E070EE15E1050E552E2
:101C5000E7CFD9FF1200780EE66E000EE66EBEDE0C
:101C6000E552E552116AF36E11C0F4FF1200D9CFAC
:101C7000E6FFE1CFD9FFFB0EDBCFE6FFFC0EDBCFAB
:101C8000E6FFFD0EDBCFE6FFFE0EDBCFE6FF840EA8
:101C9000E66E000EE66E3BDD106E060EE15E105045
:101CA000E552E7CFD9FF1200D9CFE6FFE1CFD9FF48
:101CB000FA0EDBCFE6FFFB0EDBCFE6FFFC0EDBCF41
:101CC000E6FFFD0EDBCFE6FFFE0EDBCFE6FF840E68
:101CD000E66E000EE66EC0DD106E070EE15E10507F
:101CE000E552E7CFD9FF1200840EE66E000EE66ED5
:101CF00075DEE552E552116AF36E11C0F4FF120071
:101D00000001905101E11200E2EC13F0F3CF10F06A
:101D1000F4CF11F0F350F41001E01200C6EC13F010
:101D2000F3CF10F0F4CF11F0F350F41001E11200F2
:101D30006C0EE66E000EE66E97DEE552E552000987
:101D400001E01200600EE66E000EE66E8DDEE552DA
:101D5000E552000901E0120059EF0DF0EEEC13F02E
:101D6000F3CF10F0F4CF11F0F350F41001E11200B2
:101D70000001010E906F6C0EE66E000EE66E74DED2
:101D8000E552E552000909E1600EE66E000EE66ECE
:101D90006BDEE552E552000903E00001906B120092
:0C1DA0000A0EE66E9CEC1AF0E552E5D746
:041DAC00D9CFE6FFA6
:101DB000E1CFD9FF93809392949A8A908A928B9ADA
:101DC000FD0EDBCF9BF0FE0EDBCF9CF09BC0E9FF4E
:101DD0009CC0EAFF050EE926000EEA22EF6A9BC0CE
:101DE000E9FF9CC0EAFF060EE926000EEA22EF6A30
:101DF0009BC0E9FF9CC0EAFF070EE926000EEA221D
:101E00000A0EEF6E9BC0E9FF9CC0EAFF030EE926B5
:101E1000000EEA22000EEE6E010EED6E9BC0E9FF91
:101E20009CC0EAFF030EE926000EEA22EECF9DF0E9
:101E3000EDCF9EF0E552E7CFD9FF1200D9CFE6FFF4
:101E4000E1CFD9FFFE0EDB507E0823E19BC0E9FF06
:101E50009CC0EAFF050EE926000EEA22EF6A9BC04D
:101E6000E9FF9CC0EAFF060EE926000EEA22EF6AAF
:101E70009BC0E9FF9CC0EAFF7E0EEF6E9BC0E9FFAE
:101E80009CC0EAFF070EE926000EEA220B0EEF6E59
:101E9000A4D09BC0E9FF9CC0EAFF070EEB500F0ADD
:101EA00001E181D0010A2EE0020A1AE0070A02E0ED
:101EB000010A93D09BC0E9FF9CC0EAFFEE52010EDD
:101EC000E926000EEA22FE0EDBCFEFFF9BC0E9FF02
:101ED0009CC0EAFF070EE926000EEA220C0E7CD019
:101EE0009BC0E9FF9CC0EAFFEE52FE0EDBCFEFFF86
:101EF0009BC0E9FF9CC0EAFF070EE926000EEA221C
:101F00000E0E6AD09BC0E9FF9CC0EAFF050EEB50A5
:101F1000106EEE52EECF11F0EFCF12F01150105CB8
:101F2000000E125423E29BC0E9FF9CC0EAFF050E9D
:101F3000EB500001EA6A9D25E96E9E51EA22FE0EF1
:101F4000DBCFEFFF9BC0E9FF9CC0EAFF060EE9264E
:101F5000000EEA22FE0EDB50EF269BC0E9FF9CC07C
:101F6000EAFF050EE926000EEA22EF2A9BC0E9FFF0
:101F70009CC0EAFF050EEB50106E116AEE52EECFD8
:101F800012F0EFCF13F01250101827E11350111870
:101F900024E19BC0E9FF9CC0EAFF070EE926000E82
:101FA000EA220F0E19D09BC0E9FF9CC0EAFF060E83
:101FB000E926000EEA22EF28E86C106EFE0EDB50D8
:101FC000105C01E10ED89BC0E9FF9CC0EAFF070E40
:101FD000E926000EEA220A0EEF6EE552E7CFD9FF9E
:101FE0001200D9CFE6FFE1CFD9FFE6529DC0E9FF4D
:101FF0009EC0EAFFEF508A0A40E01F0A38E0340A28
:1020000030E0360A28E0060A20E0030A18E0190A40
:1020100010E01B0A08E0180A48E19DC0E6FF9EC0D8
:10202000E6FF3C0E2FD09DC0E6FF9EC0E6FF3D0EB2
:1020300029D09DC0E6FF9EC0E6FF3E0E23D09DC086
:10204000E6FF9EC0E6FF3F0E1DD09DC0E6FF9EC08E
:10205000E6FF400E17D09DC0E6FF9EC0E6FF410E92
:1020600011D09DC0E6FF9EC0E6FF420E0BD09DC082
:10207000E6FF9EC0E6FF430E05D09DC0E6FF9EC072
:10208000E6FF440EE66E9BC0E9FF9CC0EAFFEE52FD
:10209000EF50E66EA5EC0DF0E552E552E552E55243
:1020A000F350DF6EDFCF10F01034E552E552E7CF8A
:1020B000D9FF1200D9CFE6FFE1CFD9FF020EE1260A
:1020C000010EDB6A7E0EE66E5BEC1AF0E552A8505C
:1020D000020BFDE06BD80009FAE1E66A5BEC1AF04E
:1020E000E552A850020BFDE061D80009FAE1FC0EB0
:1020F000DBCFE6FF5BEC1AF0E552A850020BFDE0E7
:1021000055D80009FAE1DF6AFC0EDB50DF5C2DE2F6
:10211000DF50E76EFD0EDBCFE9FFFE0EDBCFEAFFFF
:10212000E750E926000EEA22EF50E66E5BEC1AF06B
:10213000E552DF50E76EFD0EDBCFE9FFFE0EDBCF91
:10214000EAFFE750E926000EEA22010EDBCFE7FFA7
:10215000EF50E726010EE7CFDBFFA850020BFDE0B2
:1021600025D80009FAE1DF2ACFD7010EDB28E86C79
:10217000E66E5BEC1AF0E552A8A2FED7020EE15C17
:1021800002E2E16AE552E16EE552E7CFD9FF1200C3
:10219000D9CFE6FFE1CFD9FFFE0EDB5002E08A8205
:1021A00001D08A92E552E7CFD9FF1200D9CFE6FFDE
:1021B000E1CFD9FFE6528150010BDF6EDF5002E024
:1021C000010E01D0000EE552E552E7CFD9FF120013
:1021D0008B8A12008B9A1200D9CFE6FFE1CFD9FF8C
:1021E000020EE126FD0EDBCFE9FFFE0EDBCFEAFF9C
:1021F000030EE926000EEA22EFCFDFFFFD0EDBCF54
:10220000E9FFFE0EDBCFEAFF020EE926000EEA220E
:10221000010EEFCFDBFFFD0EDBCFE9FFFE0EDBCFC4
:10222000EAFFEF50E66EFD0EDBCFE9FFFE0EDBCFDF
:10223000EAFF030EE926000EEA22E552E750EF6EB0
:10224000FD0EDBCFE9FFFE0EDBCFEAFF010EE92634
:10225000000EEA22EF50E66EFD0EDBCFE9FFFE0E28
:10226000DBCFEAFF020EE926000EEA22E552E75034
:10227000EF6EFD0EDBCFE9FFFE0EDBCFEAFF010EB6
:10228000E926000EEA22010EDBCFEFFFFD0EDBCFC9
:10229000E9FFFE0EDBCFEAFFDFCFEFFFFD0EDBCF66
:1022A000E9FFFE0EDBCFEAFF040EE926000EEA226C
:1022B000030EE926000EEA22EFCFDFFFFD0EDBCF93
:1022C000E9FFFE0EDBCFEAFF040EE926000EEA224C
:1022D000020EE926000EEA22010EEFCFDBFFFD0E13
:1022E000DBCFE9FFFE0EDBCFEAFF040EE926000E8E
:1022F000EA22EF50E66EFD0EDBCFE9FFFE0EDBCFEC
:10230000EAFF040EE926000EEA22030EE926000E7B
:10231000EA22E552E750EF6EFD0EDBCFE9FFFE0E3D
:10232000DBCFEAFF040EE926000EEA22010EE926C1
:10233000000EEA22EF50E66EFD0EDBCFE9FFFE0E47
:10234000DBCFEAFF040EE926000EEA22020EE926A0
:10235000000EEA22E552E750EF6EFD0EDBCFE9FFFB
:10236000FE0EDBCFEAFF040EE926000EEA22010E84
:10237000E926000EEA22010EDBCFEFFFFD0EDBCFD8
:10238000E9FFFE0EDBCFEAFF040EE926000EEA228B
:10239000DFCFEFFF020EE15C02E2E16AE552E16E9F
:1023A000E552E7CFD9FF1200D9CFE6FFE1CFD9FF41
:1023B000E652FD0EDBCFE9FFFE0EDBCFEAFFEFCFEB
:1023C000DFFFFD0EDBCFE9FFFE0EDBCFEAFF010EE4
:1023D000E926000EEA22EF50E66EFD0EDBCFE9FFA4
:1023E000FE0EDBCFEAFFE552E750EF6EFD0EDBCFCE
:1023F000E9FFFE0EDBCFEAFF010EE926000EEA221E
:0E240000DFCFEFFFE552E552E7CFD9FF120024
:02240E00D9CF24
:10241000E6FFE1CFD9FFFD0EDBCFFEF3FE0EDBCFF3
:10242000FFF3FEC3E9FFFFC3EAFFEE6AED6AFEC3F6
:10243000E9FFFFC3EAFF020EEB6A030EEB6AFEC37D
:10244000E9FFFFC3EAFF040EEB6A050EEB6AFEC369
:10245000E9FFFFC3EAFF060EE926000EEA22000E9E
:10246000EE6E0C0EED6EE552E7CFD9FF1200D9CF1C
:10247000E6FFE1CFD9FFFEC3E9FFFFC3EAFF040E89
:10248000E926000EEA22EECF10F0EFCF11F0D8804F
:102490001056020E11561050111004E169EC17F09D
:1024A000FF0E49D0FEC3E9FFFFC3EAFF040EE92691
:1024B000000EEA22EE2AED22FEC3E9FFFFC3EAFF87
:1024C000060EE926000EEA22EECF10F0EFCF11F053
:1024D000FEC3E9FFFFC3EAFF020EE926000EEA226F
:1024E0001050EE24E76E1150EE20EA6EE7CFE9FFC0
:1024F000FE0EDBCFEFFFFEC3E9FFFFC3EAFF020ED4
:10250000E926000EEA22EE2AEF22FEC3E9FFFFC30E
:10251000EAFF020EE926000EEA22EE500BE1020E5F
:10252000ED1808E1FEC3E9FFFFC3EAFF020EEB6A04
:10253000030EEB6A000EE552E7CFD9FF1200D9CFA8
:10254000E6FFE1CFD9FFE652FE0EDBCF10F0FEC36F
:10255000E9FFFFC3EAFF040EE926000EEA22EECFF0
:1025600011F0EFCF12F0D8801156020E1256105013
:10257000115C000E125804E269EC17F0FF0E64D0F3
:10258000FE0EDB50106E116AFEC3E9FFFFC3EAFFC7
:10259000040EE926000EEA221050EE261150ED221C
:1025A000DF6AFE0EDB50DF5C4EE2DF50E76EFC0EB2
:1025B000DBCFE9FFFD0EDBCFEAFFE750E926000E97
:1025C000EA22EF50E66EFEC3E9FFFFC3EAFF060E04
:1025D000E926000EEA22EECF10F0EFCF11F0FEC395
:1025E000E9FFFFC3EAFF020EE926000EEA221050BF
:1025F000EE24E76E1150EE20EA6EE7CFE9FFE552D8
:10260000E750EF6EFEC3E9FFFFC3EAFF020EE926C3
:10261000000EEA22EE2AEF22FEC3E9FFFFC3EAFF23
:10262000020EE926000EEA22EE500BE1020EED1832
:1026300008E1FEC3E9FFFFC3EAFF020EEB6A030EE7
:10264000EB6ADF2AAED7000EE552E552E7CFD9FF9D
:102650001200D9CFE6FFE1CFD9FFE652FE0EDBCF65
:1026600010F0FEC3E9FFFFC3EAFF040EE926000EE7
:10267000EA22EECF11F0EFCF12F01050115C000EF5
:10268000125804E269EC17F0FF0E57D0FE0EDB5033
:10269000106E116AFEC3E9FFFFC3EAFF040EE926CC
:1026A000000EEA221050EE5E1150ED5ADF6AFE0E67
:1026B000DB50DF5C41E2FEC3E9FFFFC3EAFF060E29
:1026C000E926000EEA22EECF10F0EFCF11F0FEC3A4
:1026D000E9FFFFC3EAFF1050EE24E76E1150EE2031
:1026E000EA6EE7CFE9FFEF50E66EDF50E76EFC0ED3
:1026F000DBCFE9FFFD0EDBCFEAFFE750E926000E56
:10270000EA22E552E750EF6EFEC3E9FFFFC3EAFF9E
:10271000EE2A000EEF22FEC3E9FFFFC3EAFFEE50F0
:1027200009E1020EED1806E1FEC3E9FFFFC3EAFF6F
:10273000EE6AED6ADF2ABBD7000EE552E552E7CF1D
:10274000D9FF1200FEC3E9FFFFC3EAFF040EE9262A
:10275000000EEA22EECF10F0EFCF11F0D880105625
:0E276000020E115610C0F3FF11C0F4FF12005C
:02276E00A58A3A
:102770009F86F1949F90A292F190F09C9D86F286A4
:10278000F0861200D08EF28EF28C1200F250800B86
:10279000800A01E0010E106E116A10BE116810C0AF
:1027A000F3FF11C0F4FF1200F250400B400A01E0A9
:1027B000010E106E116A10BE116810C0F3FF11C037
:1027C000F4FF1200F2BC04D0E1DFF350F41002E099
:1027D000F36A02D0010EF36EF46A1200F3DFF3CF56
:1027E00010F0F4CF11F0F350F41007E1CFDFF35005
:1027F000F41003E1010EF36E01D0F36AF46A1200E3
:10280000DACFE4FFE2CFDAFFE9CFE4FFEACFE4FF7B
:10281000F6CFE4FFF7CFE4FFF8CFE4FFF5CFE4FF16
:10282000F3CFE4FFF4CFE4FFFACFE4FFFBCFE4FF04
:1028300000EE00F0100EE80403E3EECFE4FFFBD758
:1028400000EE10F0080EE80403E3EECFE4FFFBD740
:10285000E652A4AA03D08FEC18F0A49A9EA603D047
:10286000AFEC01F09E96E55200EE17F0080EE8047A
:1028700003E3E5CFEDFFFBD700EE0FF0100EE80409
:1028800003E3E5CFEDFFFBD7E5CFFBFFE5CFFAFF95
:10289000E5CFF4FFE5CFF3FFE5CFF5FFE5CFF8FF98
:1028A000E5CFF7FFE5CFF6FFE5CFEAFFE5CFE9FF9C
:1028B000E5CFDAFF1100D8CFE4FFE0CFE4FFE46E0C
:1028C000DACFE4FFE2CFDAFFE9CFE4FFEACFE4FFBB
:1028D000F6CFE4FFF7CFE4FFF8CFE4FFF5CFE4FF56
:1028E000F3CFE4FFF4CFE4FFFACFE4FFFBCFE4FF44
:1028F00000EE00F0100EE80403E3EECFE4FFFBD798
:1029000000EE10F0080EE80403E3EECFE4FFFBD77F
:10291000E652F0A003D062EC16F0F090F2A003D0E3
:1029200080EC16F0F290F2A403D00AEC18F0F294C6
:102930009EA003D023EC18F09E90A1A203D02FEC10
:1029400018F0A192E55200EE17F0080EE80403E338
:10295000E5CFEDFFFBD700EE0FF0100EE80403E328
:10296000E5CFEDFFFBD7E5CFFBFFE5CFFAFFE5CFE6
:10297000F4FFE5CFF3FFE5CFF5FFE5CFF8FFE5CFB7
:10298000F7FFE5CFF6FFE5CFEAFFE5CFE9FFE5CFBB
:0E299000DAFFE550E5CFE0FFE5CFD8FF1000FD
:02299E00929015
:1029A00092929294929689908992898489960E0146
:1029B0000A0EC66F090EC76FE66AE66AE66A8DEC14
:1029C00019F0E552E552E5520101FE6BFF6BE66A34
:1029D0000AD8E552E66A07D8E5521200898000005D
:1029E000899000001200D9CFE6FFE1CFD9FFFE0E9B
:1029F000DBCFE6FFD2EC19F0E552E552E7CFD9FF85
:102A00001200D9CFE6FFE1CFD9FFE652DF6A01011C
:102A1000FE6BFF6B0A0E106E0C6EFE0EDBCF07F026
:102A2000CAEC1AF00350DF6EDF50090A30E0010AE9
:102A30002CE00F0A27E0010A20E0030A1CE0010A4B
:102A400015E0070A0EE0010A0AE0030A04E0010AA1
:102A500023E1B00E1DD00101FE8FFF831DD0700E4B
:102A600001D0E00E0101FE13060E15D0C00E0101CB
:102A7000FE130A0E10D0E00E01D0F00E0101FE137D
:102A80000C0E09D00101FE8F05D0F00E01D0E00E32
:102A90000101FE130E0EFF130A0E106E0C6EFE0ED9
:102AA000DBCF07F0CAEC1AF00750DF6EDF50090ADF
:102AB00032E0010A2EE00F0A28E0010A21E0030AB1
:102AC0001DE0010A17E0070A10E0010A0CE0030A02
:102AD00006E0010A25E1070E0101FE1318D00101ED
:102AE000FE85FF891DD0030E01D0060E0101FE13E5
:102AF000700E15D00101FE85D00E11D0060E01D04A
:102B0000070E0101FE13E00E0AD00101FE85B00E92
:102B100006D0070E01D0060E0101FE13F00EFF13C2
:102B2000000E0101FE15106EFF0EFF15116E106EE6
:102B3000116AE850E66E57DFE5520101FE51E66E7C
:102B400052DFE552E552E552E7CFD9FF120001010D
:102B5000FF0EFF15106E116AE850E66E44DFE55275
:0C2B60000101FE51E66E3FDFE55212005D
:042B6C0029D8B9EFBC
:102B700015F0D9CFE6FFE1CFD9FF020EE126200EF6
:102B8000DF6EDE52270EDD6ED9CFE6FFDACFE6FF2D
:102B9000020EE66E180EE66EC8EC00F0E552E55245
:102BA000E552E552F5EC06F00009FCE1020EE15CAD
:102BB00002E2E16AE552E16EE552E7CFD9FF120089
:102BC000D9CFE6FFE1CFD9FF020EE126200EDF6E5E
:102BD000DE520F0EDD6ED9CFE6FFDACFE6FF020E32
:102BE000E66E690EE66EC8EC00F0E552E552E5527D
:102BF000E552F5EC06F00009FCE1020EE15C02E2B0
:102C0000E16AE552E16EE552E7CFD9FF1200D9CF74
:102C1000E6FFE1CFD9FFE652A80EDF6ED9CFE6FF7F
:102C2000DACFE6FF010EE66E180EE66EC8EC00F095
:102C3000E552E552E552E552F5EC06F00009FCE1FB
:102C4000060EE66E180EE66E4AEC01F0E552E5520D
:102C5000F5EC06F00009FCE1E552E552E7CFD9FFBB
:102C60001200D9CFE6FFE1CFD9FFE652A80EDF6E02
:102C7000D9CFE6FFDACFE6FF010EE66E690EE66E0B
:102C8000C8EC00F0E552E552E552E552F5EC06F0ED
:102C90000009FCE1060EE66E690EE66E4AEC01F0F4
:102CA000E552E552F5EC06F00009FCE1E552E5528B
:062CB000E7CFD9FF12007E
:0A2CB600928A94940E01020EE76F5B
:102CC000F19A1200000EE66EE66A500EE66EE66AB3
:102CD0005CEC0DF0E552E552E552E55212000A01B6
:102CE0000F0EFE6FF19E9388938A938C938E81884A
:102CF000818A818C818E8A888A8A8A8C8A8E120047
:102D0000D9CFE6FFE1CFD9FFE652F00E8114E838C3
:102D10000F0BDF6EDF500A01FE19010B13E0FEA15D
:102D200005D0000EE66EE66A460E04D0000EE66E92
:102D3000E66A470EE66EE66A5CEC0DF0E552E55297
:102D4000E552E552DF500A01FE19020B13E0FEA323
:102D500005D0000EE66EE66A480E04D0000EE66E60
:102D6000E66A490EE66EE66A5CEC0DF0E552E55265
:102D7000E552E552DF500A01FE19040B13E0FEA5EF
:102D800005D0000EE66EE66A4A0E04D0000EE66E2E
:102D9000E66A4B0EE66EE66A5CEC0DF0E552E55233
:102DA000E552E552DF500A01FE19080B13E0FEA7B9
:102DB00005D0000EE66EE66A4C0E04D0000EE66EFC
:102DC000E66A4D0EE66EE66A5CEC0DF0E552E55201
:102DD000E552E552DFCFFEFAE552E552E7CFD9FFE3
:022DE0001200DF
:0E2DE2001E0EF66E000EF76E000EF86E00016B
:102DF0000900F550966F0900F550976F03E196674B
:102E000001D03DD00900F550916F0900F550926F47
:102E10000900F550936F09000900F550E96E0900AB
:102E2000F550EA6E090009000900F550946F090099
:102E3000F550956F09000900F6CF98F0F7CF99F09B
:102E4000F8CF9AF091C0F6FF92C0F7FF93C0F8FF59
:102E50000001945302E1955307E00900F550EE6E2E
:102E60009407F8E29507F9D798C0F6FF99C0F7FFE5
:102E70009AC0F8FF00019607000E975BBFD71200BB
:102E80009490949294948B908B928B940E010E0E4E
:102E9000D16F0F0ED26F120ED36F12003D0EE66E81
:102EA00087EC1AF0E552800EE66EE66ADAEC18F06E
:102EB000E552E5529EA2FED7FC0EE66E3F0EE66E90
:102EC00036EC19F0E552E552BF80BF821200EBEFFD
:102ED0001AF0E66872EC1AF0E552800EE66EE66AC9
:102EE000ABEC18F0E552E552B9800501010EFF6F19
:102EF00012000AEC00F00501FF6B12000501FF5102
:0A2F000002E079EF17F069EF17F017
:062F0A00D9CFE6FFDACF8B
:102F1000E6FFE1CFD9FFE2CFDAFFC26AC16AFC0E59
:102F2000DB50400DF350C00B106EFC0EDB407F0BEE
:102F30003C0B1010C26EFD0EDB50040DF350380B2D
:102F4000116EFD0EDB380F0B070B106EFD0EDB5004
:102F5000800B10101110C16EFA0EDBCF10F0FB0EBB
:102F6000DBCF11F011C010F0116A10C048FFFA0E4B
:102F7000DBCF49FFFC0EDBAE03D09E9C9D8CF28C18
:0E2F8000C280E552E5CFDAFFE7CFD9FF12009D
:022F8E00D9CF99
:102F9000E6FFDACFE6FFE1CFD9FFE2CFDAFFA86A9A
:102FA0009C6AFD0EDBB0A888DBA202D0A88C9C8CAA
:102FB000DBB4A88EDBA602D09C8801D09C8ADBA85B
:102FC00002D0A88401D0A894DBBA9C86DBAC02D0E6
:102FD000A38A01D0A39ADBAE02D0A38801D0A39824
:102FE000FB0EDB50AB6EFC0EDBCF11F011C010F00E
:102FF000116A10507D6EA88A9C8EE552E5CFDAFFEB
:06300000E7CFD9FF12002A
:0A300600D9CFE6FFDACFE6FFE1CFF5
:10301000D9FFE2CFDAFFE652E652FC0EDBCFDEFF4D
:10302000DBCFDDFF010EDB50CF6EDF50CE6EE55201
:0E303000E552E552E5CFDAFFE7CFD9FF1200F7
:02303E00D9CFE8
:10304000E6FFDACFE6FFE1CFD9FFE2CFDAFFE652C3
:10305000E652FC0EDBCFDEFFDBCFDDFF010EDB50E7
:10306000D76EDF50D66EE552E552E552E5CFDAFF76
:06307000E7CFD9FF1200BA
:0A307600D9CFE6FFDACFE6FFE1CF85
:10308000D9FFE2CFDAFFFD0EDB507F0BD56ED76A9A
:10309000D66AF294FD0EDBAE02D0F28A01D0F29A2B
:0E30A000D58EE552E5CFDAFFE7CFD9FF12005B
:0230AE00D9CF78
:1030B000E6FFDACFE6FFE1CFD9FFE2CFDAFFFD0E80
:1030C000DB50FB0BCA6ECC6A9E92FD0EDBAE02D0CB
:1030D0009D8201D09D92CA84E552E5CFDAFFE7CF09
:0430E000D9FF120002
:0C30E400FF0EE350156EEF0E01D0F30E4E
:1030F000E76EE72E79EF18F00C0E146EE76AE72EF4
:103100007FEF18F0142E7EEF18F0152E77EF18F0E1
:023110001200AB
:0E311200D9CFE6FFDACFE6FFE1CFD9FFE2CF5B
:10312000DAFFA8AC04D0A8900101FFB3A880FD0E7F
:10313000DB50A96EE552E5CFDAFFE7CFD9FF1200E9
:10314000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFF52
:103150000C0EB46ECA94FD0EDB50CB6ECA84E552E1
:0A316000E5CFDAFFE7CFD9FF120038
:06316A00D9CFE6FFDACF29
:10317000E6FFE1CFD9FFE2CFDAFF0C0EBA12CA9414
:10318000FD0EDB50CB6ECA84E552E5CFDAFFE7CF08
:04319000D9FF120051
:0C3194009CEC0FF0E66A79EC12F0E552BA
:1031A000E66A79EC12F0E5521200DDEC14F09EECC8
:0631B0000FF053EF13F0D5
:0A31B600FF0EE350156E480E01D025
:1031C0004C0EE76EE72EFED7E76AE72EFED7152EE8
:0631D000F7D70000120019
:0A31D600C00EF36E00EE00F00E0EC6
:1031E00001D81200EA6002D0EE6AFCD7F350E96021
:0631F0001200EE6AFCD79C
:0A31F6001EEE00F02EEE00F0F86A65
:103200000F9C24EC15F003EC00F0A5EC0AF0FBD7C2
:0A300600970EE66E28EC1AF0E55272
:10301000D59E120016D8000EE66EE66A0A0EE66E1F
:10302000E66A5CEC0DF0E552E552E552E55212001D
:10303000000EE66EE66A0CEC1AF0E552E552D58E0B
:103040001200D59E12001200000EE66EE66AF0EC49
:1030500019F0E552E552CD801200CD901200120019
:1030600079804EEC17F00401010EFE6F120079908A
:0A30700067EC17F00401FE6B12007C
:06307A00D9CFE6FFDACF1A
:10308000E6FFE1CFD9FFE2CFDAFFAD6AAC6AFD0E11
:10309000DBB0AD88DBA202D0AD8CAC8CDBB4AD8EE6
:1030A000DBA602D0AC8801D0AC8ADBB8AD84DBBA39
:1030B000AC86DBAC02D09D8A01D09D9ADBAE02D0FB
:1030C0009D8801D09D98FB0EDB50B06EFC0EDBCFCF
:1030D00011F011C010F0116A10507F6EAD8AAC8EE5
:0C30E000E552E5CFDAFFE7CFD9FF120080
:0430EC00330EE66E4B
:1030F000E66A3C0EE66E3DEC18F0E552E552E5520C
:103100000E01050EF66FCC6F330EE66EE66A7C0E8E
:10311000E66EC7EC17F0E552E552E5521200A4AA9C
:1031200006D0B3EC19F0E66E1EEC0FF0E552090183
:10313000FEA710D0AC98AC889C989C88000EE66ED8
:10314000E66A1E0EE66EE66AA5EC0DF0E552E55263
:06315000E552E5521200F9
:0A315600D9CFE6FFDACFE6FFE1CFA4
:10316000D9FFE2CFDAFFE652E652FC0EDBCF10F0D9
:10317000FD0EDBCF11F0060ED89010361136E804A4
:10318000FBE110C0DEFF11C0DDFF010EDB50B56EAC
:10319000DF50E840E8403F0B300B106ECF0EB41408
:1031A0001010B46EE552E552E552E5CFDAFFE7CFF5
:0431B000D9FF120031
:0C31B400D9CFE6FFDACFE6FFE1CFD9FF6C
:1031C000E2CFDAFFE652E652FC0EDBCF10F0FD0E46
:1031D000DBCF11F0060ED89010361136E804FBE173
:1031E00010C0DEFF11C0DDFF010EDB50BB6EDF50F3
:1031F000E840E8403F0B300B106ECF0EBA141010B1
:10320000BA6EE552E552E552E5CFDAFFE7CFD9FFD6
:023210001200AA
:0E321200036A080EE76ED890073603360C509C
:0E322000035C02E3036E072AE72EF7D71200C5
:02322E00FF0E91
:10323000E350E84E1200000000D000D000D0E82E8D
:04324000FAD71200A7
:0C324400C450136E126AC3501210F36ED7
:0632500013C0F4FF1200A0
:04325600BA6A12003E
:04325A00C28212001A
:01325E00006F
:01325F00006E
:01326000006D
:01326100006C
:0E3212009280FE0EE66E1F0EE66E840EE66ED5
:10322000E10EE66E85EC17F0E552E552E552E55207
:103230001200EDEF1AF007EF00F0D9CFE6FFE1CF73
:10324000D9FF030EE126E2EC1AF0F3CFDEFFF4CF54
:10325000DDFF020EF36EDB6E030EE15C02E2E16A5B
:0C326000E552E16EE552E7CFD9FF120005
:04326C00D9CFE6FFD1
:10327000DACFE6FFE1CFD9FFE2CFDAFFFD0EDB8048
:10328000DB82DB84DB86DB88DB8AFC0EDB84DB868F
:10329000DB88DB8ADB8CDB8EFD0EDBCFE6FFC00E2E
:1032A000BA10E552E714BA6EFC0EDBCFE6FF0F0E44
:1032B000BA10E552E714BA6EE552E5CFDAFFE7CF70
:0432C000D9FF120020
:0C32C400D9CFE6FFDACFE6FFFA0EE3CF29
:1032D000D9FFFB0EE3CFDAFFFC0EE3CFE9FFFD0ED3
:1032E000E3CFEAFFE9CFF3FFEACFF4FFF80EE350B4
:1032F00003E1F90EE35008E0F80EE30602E2F90EEE
:10330000E306DECFEEFFF2D7FF0EE3CFDAFFE552A2
:0A331000FF0EE3CFD9FFE5521200D3
:06331A00D9CFE6FFDACF77
:10332000E6FFE1CFD9FFE2CFDAFF3F0E7316726AF4
:10333000FD0EDB507212FB0EDB507312FC0EDB50E5
:10334000030A09E0010A04E0020A06E1738C04D0D2
:10335000738C728801D07288728AE552E5CFDAFFE9
:06336000E7CFD9FF1200C7
:0A336600D9CFE6FFDACFE6FFE1CF92
:10337000D9FFE2CFDAFFE652F20E0901FE179CAC4C
:1033800003D0FE919CB0FE819CB4FE859CB2FE876A
:10339000AA50DF6EDF50E552E552E5CFDAFFE7CF06
:0433A000D9FF12003F
:0C33A400D9CFE6FFDACFE6FFE1CFD9FF7A
:1033B000E2CFDAFFE6527550DF6EA49E729EFD0EDC
:1033C000DB50756E72AE02D0FF0E03D0A4AEFED7F6
:1033D000000EE552E552E5CFDAFFE7CFD9FF120044
:1033E000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFFB0
:1033F000E652E652FC0EDBCFDEFFDBCFDDFF010E37
:10340000DB50CF6EDF50CE6EE552E552E552E5CF90
:08341000DAFFE7CFD9FF12003B
:08341800D9CFE6FFDACFE6FF91
:10342000E1CFD9FFE2CFDAFFE652E652FC0EDBCF66
:10343000DEFFDBCFDDFF010EDB50D76EDF50D66E37
:10344000E552E552E552E5CFDAFFE7CFD9FF1200AA
:10345000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFF3F
:10346000FD0EDB507F0BD56ED76AD66AF294FD0E47
:10347000DBAE02D0F28A01D0F29AD58EE552E5CFCA
:08348000DAFFE7CFD9FF1200CB
:08348800FF0EE350196EEF0E78
:1034900001D0F30EE76EE72E4BEF1AF00C0E186E0C
:1034A000E76AE72E51EF1AF0182E50EF1AF0192E96
:0634B00049EF1AF01200C2
:0A34B600D9CFE6FFDACFE6FFE1CF41
:1034C000D9FFE2CFDAFFA8AC04D0A8900901FEB37F
:1034D000A880FD0EDB50A96EE552E5CFDAFFE7CFFD
:0434E000D9FF1200FE
:0C34E400D9CFE6FFDACFE6FFE1CFD9FF39
:1034F000E2CFDAFF0C0EB46ECA94FD0EDB50CB6E39
:0E350000CA84E552E5CFDAFFE7CFD9FF12000B
:02350E00D9CF13
:10351000E6FFDACFE6FFE1CFD9FFE2CFDAFF0C0E0C
:10352000BA12CA94FD0EDB50CB6ECA84E552E5CFC9
:08353000DAFFE7CFD9FF12001A
:08353800FF0EE350196E480E6E
:1035400001D04C0EE76EE72EFED7E76AE72EFED7D6
:08355000192EF7D7000012004C
:08355800C00EF36E00EE00F05E
:103560000E0E01D81200EA6002D0EE6AFCD7F350CA
:08357000E9601200EE6AFCD7CD
:083578001EEE00F02EEE00F043
:10358000F86A0F9CF1EC16F003EC00F0FFEC06F08B
:04359000FBD7120053
:0C359400036A080EE76ED8900736033675
:1035A0000C50035C02E3036E072AE72EF7D71200E4
:1035B00018EF18F0510EE66E01EC15F0E55212000E
:0435C00021EF18F0EF
:0C35C400C450136E126AC3501210F36E54
:0635D00013C0F4FF12001D
:0435D600BA6A1200BB
:0435DA00C282120097
:0235DE000000EB
:0235E0000000E9
:0235E2000000E7
:0235E4000000E5
:0235E6000000E3
:01FFF800A068
:01FFFA00DD29
:01FFFA00DA2C
:01FFFD00F80B
:00000001FF
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/i2c.c
38,7 → 38,15
SSPCON1 = 0x0;
SSPCON2 = 0x0;
SSPCON1bits.SSPM = 0x8; // I2C Master Mode
 
/* SSPADD = (( Fosc/bit rate) / 4 ) - 1 */
#ifdef _REMOTE
SSPADD = 0x63; // Operate at 100KHz (40MHz)
#endif
#ifdef _BASE_STATION
SSPADD = 0x4F; // Operate at 100KHz (32MHz)
#endif
SSPSTATbits.SMP = 1; // Disable Slew Rate Control
SSPCON1bits.SSPEN = 1; // Enable MSSP Module
}
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/interrupts.c
37,8 → 37,10
PIE1bits.SSPIE = 1;
// Enable Port B interrupt
INTCONbits.RBIE = 1;
#ifdef _BASE_STATION
// Enable interrupt for INT1
INTCON3bits.INT1IE = 1;
#endif
}
 
void interrupt_enable() {
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/led_driver.c
37,6 → 37,16
#endif
 
#ifdef _SPI2_V2
TRISAbits.TRISA0 = 0; // CLK
TRISAbits.TRISA1 = 0; // DAT
TRISAbits.TRISA2 = 0; // LE
TRISAbits.TRISA3 = 0; // OE
LATAbits.LATA0 = 0; // CLK
LATAbits.LATA1 = 0; // DAT
LATAbits.LATA2 = 1; // LE
LATAbits.LATA3 = 0; // OE
 
RPOR0 = 10; // CLK
RPOR1 = 9; // DATA
OpenSPI2(SPI_FOSC_4, MODE_00, SMPMID);
47,14 → 57,20
led_driver_data(0);
}
 
void led_driver_clock() {
#ifdef _SPI2_V1
void led_driver_clock() {
LATAbits.LATA1 = 0x1; // Simple clock output toggle
Nop();
LATAbits.LATA1 = 0x0;
Nop();
#endif
#ifdef _SPI2_V2
LATAbits.LATA0 = 0x1; // Simple clock output toggle
Nop();
LATAbits.LATA0 = 0x0;
Nop();
#endif
}
#endif
 
void led_driver_data(char val) {
#ifdef _SPI2_V1
69,9 → 85,7
#endif
 
#ifdef _SPI2_V2
LATAbits.LATA0 = 0x0;
WriteSPI2(val);
LATAbits.LATA0 = 0x1;
#endif
}
 
82,6 → 96,7
// Determine right character (1s digit)
tmp = data % 10;
switch (tmp) {
#ifdef _SPI2_V1
case 0:
led_last_value |= 0x0D70;
break;
112,11 → 127,45
case 9:
led_last_value |= 0x0770;
break;
#endif
#ifdef _SPI2_V2
case 0:
led_last_value |= 0x0EB0;
break;
case 1:
led_last_value |= 0x0280;
break;
case 2:
led_last_value |= 0x0670;
break;
case 3:
led_last_value |= 0x06E0;
break;
case 4:
led_last_value |= 0x0AC0;
break;
case 5:
led_last_value |= 0x0CE0;
break;
case 6:
led_last_value |= 0x0CF0;
break;
case 7:
led_last_value |= 0x0E80;
break;
case 8:
led_last_value |= 0x0EF0;
break;
case 9:
led_last_value |= 0x0EE0;
break;
#endif
}
 
// Determine left character (10s digit)
tmp = data / 10;
switch (tmp) {
#ifdef _SPI2_V1
case 0:
led_last_value |= 0xE00D;
break;
147,13 → 196,58
case 9:
led_last_value |= 0x600F;
break;
#endif
#ifdef _SPI2_V2
case 0:
led_last_value |= 0xB007;
break;
case 1:
led_last_value |= 0x1004;
break;
case 2:
led_last_value |= 0x7003;
break;
case 3:
led_last_value |= 0x7006;
break;
case 4:
led_last_value |= 0xD004;
break;
case 5:
led_last_value |= 0xE006;
break;
case 6:
led_last_value |= 0xE007;
break;
case 7:
led_last_value |= 0xB004;
break;
case 8:
led_last_value |= 0xF007;
break;
case 9:
led_last_value |= 0xF006;
break;
#endif
}
 
#ifdef _SPI2_V1
led_driver_data(led_last_value & 0x00FF);
led_driver_data((led_last_value & 0xFF00) >> 8);
#endif
#ifdef _SPI2_V2
led_driver_data((led_last_value & 0xFF00) >> 8);
led_driver_data(led_last_value & 0x00FF);
#endif
}
 
void led_driver_show_last() {
#ifdef _SPI2_V1
led_driver_data(led_last_value & 0x00FF);
led_driver_data((led_last_value & 0xFF00) >> 8);
#endif
#ifdef _SPI2_V2
led_driver_data((led_last_value & 0xFF00) >> 8);
led_driver_data(led_last_value & 0x00FF);
#endif
}
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/main.c
14,15 → 14,29
#include "imu.h"
#include "sleep.h"
 
#ifdef _REMOTE
#pragma config WDTEN = OFF // Turn off watchdog timer
#pragma config XINST = OFF // Turn off extended instruction set
#pragma config OSC = HSPLL // Use external oscillator (101)
#pragma config IOL1WAY = OFF // IOLOCK bit can be set and cleared as needed
#endif
#ifdef _BASE_STATION
#pragma config WDTEN = OFF // Turn off watchdog timer
#pragma config XINST = OFF // Turn off extended instruction set
#pragma config OSC = INTOSCPLL // Use internal oscillator
#pragma config IOL1WAY = OFF // IOLOCK bit can be set and cleared as needed
#endif
 
/* ----- To Do -----
* Verify polling base station over I2C works
* Implement send data to remote on corresponding I2C command
* Verify operation with multiple base stations
* -------------- */
 
/* ----------- IO Pins -----------
* RA0 - LED Display Latch Enable (V1) or Display CLK (V2) (PPS)
* RA1 - LED Display CLK (V1) or Display DIN (V2) (PPS)
* RA2 - LED Display DIN (V1) or Display Clock (V2)
* RA1 - LED Display CLK (V1) (PPS) or Display DIN (V2) (PPS)
* RA2 - LED Display DIN (V1) (PPS) or Display Latch Enable (V2)
* RA3 - LED Display Output Enable
* RA4 - [CANNOT BE USED (VDDCORE/VCAP)]
* RA5 - IR Reciever (PPS)
56,12 → 70,16
XBEE_DATA xbee_data;
I2C_DATA i2c_data;
BUFFER_DATA buffer_data;
char length;
int length;
unsigned char msgtype;
unsigned char i = 0;
unsigned char counter = 0;
unsigned char IR_receive_flag = 0;
unsigned int xbee_parent_address = 0;
enum I2C_STATE i2c_state = I2C_STATE_IDLE;
enum XBEE_STATE xbee_state = XBEE_STATE_WAITING_TO_JOIN;
XBEE_ADDRESS_64 last_recv_address = {0};
XBEE_ADDRESS_16 converter16;
// Pointers to allow parsing of xbee data from arbitrary byte array
XBEE_RX_AT_COMMAND_RESPONSE_FRAME *frame_at_cmd_response;
75,11 → 93,12
XBEE_RX_MODEM_STATUS_FRAME *frame_modem_status;
 
XBEE_TX_DATA_PACKET_FRAME *frame_tx_data;
XBEE_TX_AT_COMMAND_FRAME *frame_tx_at_command;
 
/* --------------------- Oscillator Configuration --------------------- */
OSCTUNEbits.PLLEN = 1; // Enable 4x PLL
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source
OSCCONbits.SCS = 0b00; // Use PLL as primary clock source
/* -------------------------------------------------------------------- */
 
// Set all ports as digial I/O
95,20 → 114,30
timers_init(); // Initialize timers
led_driver_init(); // Initialize the driver for the LED display
port_b_int_init(); // Initialze Port B interrupt handler
// intx_init(); // IR receiver input
#ifdef _BASE_STATION
intx_init(); // IR receiver input
#endif
pwm_init(); // Initialize the PWM output driver
 
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts
interrupt_init(); // Initialize the interrupt priorities
 
#ifdef _BASE_STATION
i2c_configure_slave(BASE_STATION_ADDRESS);
#endif
#ifdef _REMOTE
i2c_configure_master(); // Configure the hardware i2c device as a master
imu_init();
#endif
 
Delay10KTCYx(255);
DBG_PRINT_MAIN("\r\nMain: Program Started\r\n");
 
#ifdef _BASE_STATION
sleep();
#endif
#ifdef _REMOTE
// Turn on LED until XBee is connected to network
pwm_LED_start();
pwm_LED_on();
#endif
 
// Loop and process recieved messages from interrupts
while (1) {
125,6 → 154,7
} else {
switch (msgtype) {
/* --- I2C Message Handlers ----------------------------------*/
#ifdef _BASE_STATION
case MSGTYPE_OVERRUN:
DBG_PRINT_MAIN("Main: (ERROR) UART overrun detected, type = %d\r\n", msgtype);
break;
131,7 → 161,7
case MSGTYPE_I2C_DBG:
DBG_PRINT_MAIN("Main: I2C Dbg Data Recieved: ");
for (i = 0; i < length; i++) {
DBG_PRINT_MAIN("%X ", msgbuffer[i]);
DBG_PRINT_MAIN("%02X ", msgbuffer[i]);
}
DBG_PRINT_MAIN("\r\n");
break;
138,7 → 168,7
case MSGTYPE_I2C_DATA:
DBG_PRINT_MAIN("Main: I2C Data Recieved: ");
for (i = 0; i < length - 1; i++) {
DBG_PRINT_MAIN("%X ", msgbuffer[i]);
DBG_PRINT_MAIN("%02X ", msgbuffer[i]);
}
DBG_PRINT_MAIN(" Event Count: %d", msgbuffer[length - 1]);
DBG_PRINT_MAIN("\r\n");
151,7 → 181,7
} else {
msgbuffer[0] = buffer_data.stored_length;
}
DBG_PRINT_MAIN("Main: (I2C Return 0x2) Returning %X\r\n", msgbuffer[0]);
DBG_PRINT_MAIN("Main: (I2C Return 0x2) Returning %d bytes\r\n", length);
MQ_sendmsg_FromMainToHigh(length, MSGTYPE_I2C_REPLY, (void *) msgbuffer);
break;
case 0x4:
163,7 → 193,9
length = buffer_data.stored_length;
buffer_read(buffer_data.stored_length, msgbuffer);
}
DBG_PRINT_MAIN("Main: (I2C Return 0x4) Returning %d bytes\r\n", length);
MQ_sendmsg_FromMainToHigh(length, MSGTYPE_I2C_REPLY, (void *) msgbuffer);
pwm_LED_off(); // Turn off LED if it was on
break;
case 0x6:
break;
178,6 → 210,8
break;
};
break;
#endif
#ifdef _REMOTE
case MSGTYPE_I2C_MASTER_SEND_COMPLETE:
DBG_PRINT_MAIN("Main: I2C Master Send Complete\r\n");
break;
188,62 → 222,114
DBG_PRINT_MAIN("Main: I2C Master Receive Complete\r\n");
DBG_PRINT_MAIN("Main: (I2C Data) ");
for (i = 0; i < length; i++) {
DBG_PRINT_MAIN("%X ", msgbuffer[i]);
DBG_PRINT_MAIN("%02X ", msgbuffer[i]);
}
DBG_PRINT_MAIN("\r\n");
// Insert recorded value into buffer
if (i2c_state == I2C_STATE_READ_ACC) {
buffer_insert_one(RETURNID_ACC);
buffer_insert(6, msgbuffer);
} else if (i2c_state == I2C_STATE_READ_GYRO) {
buffer_insert_one(RETURNID_GYRO);
buffer_insert(6, msgbuffer);
}
 
if (buffer_free_space() >= 7) {
// Insert recorded value into buffer
if (i2c_state == I2C_STATE_READ_ACC) {
buffer_insert_one(RETURNID_ACC);
buffer_insert(6, msgbuffer);
} else if (i2c_state == I2C_STATE_READ_GYRO) {
buffer_insert_one(RETURNID_GYRO);
buffer_insert(6, msgbuffer);
}
} else {
if (buffer_free_space() < 7) {
wake();
// Send data to base station
frame_tx_data = (void *) msgbuffer;
frame_tx_data->frame_type = XBEE_TX_DATA_PACKET;
frame_tx_data->frame_id = 0;
frame_tx_data->destination_64.UPPER_32.long_value = 0x00000000;
frame_tx_data->destination_64.LOWER_32.long_value = 0x00000000;
ConvertEndian64(&frame_tx_data->destination_64);
frame_tx_data->destination_16.INT_16.int_value = xbee_parent_address;
ConvertEndian16(&frame_tx_data->destination_16);
frame_tx_data->broadcast_radius = 0;
frame_tx_data->options = 0x01; // Disable ACK
length = XBEE_TX_DATA_PACKET_FRAME_SIZE + buffer_data.stored_length;
buffer_read(buffer_data.stored_length, frame_tx_data->data);
xbee_process_transmit_frame((void *) msgbuffer, length);
}
DBG_PRINT_MAIN("\r\n");
 
break;
case MSGTYPE_I2C_MASTER_RECV_FAILED:
DBG_PRINT_MAIN("Main: (ERROR) I2C Master Receive Failed\r\n");
break;
#endif
/* -----------------------------------------------------------*/
 
/* --- XBee Message Handlers ---------------------------------*/
case MSGTYPE_XBEE_RX_AT_COMMAND_RESPONSE:
DBG_PRINT_MAIN("Main: XBee AT command frame\r\n");
DBG_PRINT_MAIN("Main: XBee AT command response frame\r\n");
frame_at_cmd_response = (void *) msgbuffer;
DBG_PRINT_MAIN("Command: %c%c\r\n", frame_at_cmd_response->command[0], frame_at_cmd_response->command[0]);
DBG_PRINT_MAIN("Command: %c%c\r\n", frame_at_cmd_response->command[0], frame_at_cmd_response->command[1]);
DBG_PRINT_MAIN("Status: %d\r\n", frame_at_cmd_response->command_status);
DBG_PRINT_MAIN("Data: ");
for (i = 0; i < length - XBEE_RX_AT_COMMAND_RESPONSE_FRAME_SIZE; i++) {
DBG_PRINT_MAIN("%X ", frame_data_packet->data[i]);
DBG_PRINT_MAIN("%02X ", frame_data_packet->data[i]);
}
DBG_PRINT_MAIN("\r\n");
#ifdef _REMOTE
if (frame_at_cmd_response->command[0] == 'M' &&
frame_at_cmd_response->command[1] == 'P') {
converter16.INT_16.char_value[0] = frame_at_cmd_response->data[0];
converter16.INT_16.char_value[1] = frame_at_cmd_response->data[1];
ConvertEndian16(&converter16);
xbee_parent_address = converter16.INT_16.int_value;
xbee_state = XBEE_STATE_JOINED_NETWORK;
}
#endif
break;
case MSGTYPE_XBEE_RX_DATA_PACKET:
wake();
DBG_PRINT_MAIN("Main: XBee data packet frame\r\n");
frame_data_packet = (void *) msgbuffer;
ConvertEndian64(&frame_data_packet->source_64);
ConvertEndian16(&frame_data_packet->source_16);
DBG_PRINT_MAIN("Source 64: %08lX-%08lX\r\n",
frame_data_packet->source_64.UPPER_32.long_value,
frame_data_packet->source_64.LOWER_32.long_value
);
DBG_PRINT_MAIN("Source 16: %04X\r\n", frame_data_packet->source_16.INT_16.int_value);
DBG_PRINT_MAIN("Options: 0x%02X\r\n", frame_data_packet->recieve_options);
DBG_PRINT_MAIN("Data: ");
for (i = 0; i < length - XBEE_RX_DATA_PACKET_FRAME_SIZE; i++) {
DBG_PRINT_MAIN("%X ", frame_data_packet->data[i]);
DBG_PRINT_MAIN("%02X ", frame_data_packet->data[i]);
}
DBG_PRINT_MAIN("\r\n");
// Store received data into buffer
buffer_insert(length - XBEE_RX_DATA_PACKET_FRAME_SIZE, frame_data_packet->data);
#ifdef _BASE_STATION
 
DBG_PRINT_MAIN("Buffer Free Space: %d\r\n", buffer_free_space());
if (frame_data_packet->source_64.LOWER_32.long_value != last_recv_address.LOWER_32.long_value ||
frame_data_packet->source_64.UPPER_32.long_value != last_recv_address.UPPER_32.long_value) {
// Receive data from new remote
buffer_insert(4, frame_data_packet->source_64.UPPER_32.char_value);
buffer_insert(4, frame_data_packet->source_64.LOWER_32.char_value);
// Save data
buffer_insert(length - XBEE_RX_DATA_PACKET_FRAME_SIZE, frame_data_packet->data);
// Save address of sender
last_recv_address.UPPER_32.long_value = frame_data_packet->source_64.UPPER_32.long_value;
last_recv_address.LOWER_32.long_value = frame_data_packet->source_64.LOWER_32.long_value;
} else {
// Receive data from same remote that previously sent data
buffer_insert(length - XBEE_RX_DATA_PACKET_FRAME_SIZE, frame_data_packet->data);
}
// Send value of first byte received to LED display
led_driver_num(frame_data_packet->data[0]);
#endif
sleep();
break;
case MSGTYPE_XBEE_RX_DATA_TX_STATUS:
DBG_PRINT_MAIN("Main: XBee TX status frame\r\n");
frame_tx_status = (void *) msgbuffer;
DBG_PRINT_MAIN("Destination: %X\r\n", frame_tx_status->destination_16);
DBG_PRINT_MAIN("Transmit Retry Count: %X\r\n", frame_tx_status->transmit_retry_count);
DBG_PRINT_MAIN("Delivery Status: %X\r\n", frame_tx_status->delivery_status);
DBG_PRINT_MAIN("Discovery Status: %X\r\n", frame_tx_status->discovery_status);
DBG_PRINT_MAIN("Destination: %02X\r\n", frame_tx_status->destination_16);
DBG_PRINT_MAIN("Transmit Retry Count: %02X\r\n", frame_tx_status->transmit_retry_count);
DBG_PRINT_MAIN("Delivery Status: %02X\r\n", frame_tx_status->delivery_status);
DBG_PRINT_MAIN("Discovery Status: %02X\r\n", frame_tx_status->discovery_status);
break;
case MSGTYPE_XBEE_RX_IO_DATA_SAMPLE:
DBG_PRINT_MAIN("Main: XBee IO data sample frame\r\n");
264,11 → 350,28
case MSGTYPE_XBEE_RX_NODE_IDENTIFICATION:
DBG_PRINT_MAIN("Main: XBee node identification frame\r\n");
frame_node_identification = (void *) msgbuffer;
ConvertEndian64(&frame_node_identification->source_64);
ConvertEndian64(&frame_node_identification->remote_64);
ConvertEndian16(&frame_node_identification->source_16);
ConvertEndian16(&frame_node_identification->remote_16);
ConvertEndian16(&frame_node_identification->parent_16);
DBG_PRINT_MAIN("Source 64: %08lX-%08lX\r\n",
frame_node_identification->source_64.UPPER_32.long_value,
frame_node_identification->source_64.LOWER_32.long_value
);
DBG_PRINT_MAIN("Source 16: %04X\r\n", frame_node_identification->source_16.INT_16.int_value);
DBG_PRINT_MAIN("Remote 64: %08lX-%08lX\r\n",
frame_node_identification->remote_64.UPPER_32.long_value,
frame_node_identification->remote_64.LOWER_32.long_value
);
DBG_PRINT_MAIN("Remote 16: %04X\r\n", frame_node_identification->remote_16.INT_16.int_value);
DBG_PRINT_MAIN("Remote 16: %04X\r\n", frame_node_identification->parent_16.INT_16.int_value);
DBG_PRINT_MAIN("Receive Options: %02X\r\n", frame_node_identification->recieve_options);
break;
case MSGTYPE_XBEE_RX_FRAME_MODEM_STATUS:
DBG_PRINT_MAIN("Main: XBee modem status frame\r\n");
frame_modem_status = (void *) msgbuffer;
DBG_PRINT_MAIN("Status: %X (", frame_modem_status->status);
DBG_PRINT_MAIN("Status: %02X (", frame_modem_status->status);
switch(frame_modem_status->status) {
case 0:
DBG_PRINT_MAIN("Hardware Reset");
279,9 → 382,21
break;
case 2:
DBG_PRINT_MAIN("Joined Network");
#ifdef _BASE_STATION
xbee_state = XBEE_STATE_JOINED_NETWORK;
#endif
#ifdef _REMOTE
// Query for parent's address
frame_tx_at_command = (void *) msgbuffer;
frame_tx_at_command->frame_type = XBEE_TX_AT_COMMAND;
frame_tx_at_command->frame_id = 1;
frame_tx_at_command->command[0] = 'M';
frame_tx_at_command->command[1] = 'P';
// length = XBEE_TX_AT_COMMAND_FRAME_SIZE;
xbee_process_transmit_frame((void *) msgbuffer, 4);
// Turn off LED after XBee has joined network
pwm_LED_stop();
pwm_LED_off();
#endif
break;
case 3:
DBG_PRINT_MAIN("Disassociated");
315,79 → 430,176
/* --- Port B Interrupt Handlers -----------------------------*/
case MSGTYPE_PORTB_4_DOWN:
DBG_PRINT_MAIN("Main: Port B4 Down\r\n");
remote_wake(); // Wake up all components
timer1_enable(); // Set timer to start data polling
#ifdef _REMOTE
if (xbee_state == XBEE_STATE_JOINED_NETWORK) {
wake(); // Wake up all components
timer1_enable(); // Set timer to start data polling
pwm_LED_on();
}
#endif
break;
case MSGTYPE_PORTB_4_UP:
DBG_PRINT_MAIN("Main: Port B4 Up\r\n");
timer1_disable(); // Stop data polling timer
i2c_state = I2C_STATE_IDLE;
timer0_enable(); // Set timer to sleep components
#ifdef _REMOTE
if (xbee_state == XBEE_STATE_JOINED_NETWORK) {
wake();
timer1_disable(); // Stop data polling timer
// Send remaining buffer data to base station
frame_tx_data = (void *) msgbuffer;
frame_tx_data->frame_type = XBEE_TX_DATA_PACKET;
frame_tx_data->frame_id = 0;
frame_tx_data->destination_64.UPPER_32.long_value = 0x00000000;
frame_tx_data->destination_64.LOWER_32.long_value = 0x00000000;
ConvertEndian64(&frame_tx_data->destination_64);
frame_tx_data->destination_16.INT_16.int_value = xbee_parent_address;
ConvertEndian16(&frame_tx_data->destination_16);
frame_tx_data->broadcast_radius = 0;
frame_tx_data->options = 0x01; // Disable ACK
length = XBEE_TX_DATA_PACKET_FRAME_SIZE + buffer_data.stored_length;
buffer_read(buffer_data.stored_length, frame_tx_data->data);
xbee_process_transmit_frame((void *) msgbuffer, length);
i2c_state = I2C_STATE_IDLE;
pwm_LED_off();
sleep();
}
#endif
break;
case MSGTYPE_PORTB_5_DOWN:
DBG_PRINT_MAIN("Main: Port B5 Down\r\n");
remote_wake(); // Wake up all components
timer3_enable(); // Enable PWM timer
#ifdef _REMOTE
if (xbee_state == XBEE_STATE_JOINED_NETWORK) {
wake(); // Wake up all components
timer3_enable(); // Enable PWM timer
frame_tx_data = (void *) msgbuffer;
frame_tx_data->frame_type = XBEE_TX_DATA_PACKET;
frame_tx_data->frame_id = 0;
frame_tx_data->destination_64.UPPER_32.long_value = 0x00000000;
frame_tx_data->destination_64.LOWER_32.long_value = 0x00000000;
ConvertEndian64(&frame_tx_data->destination_64);
frame_tx_data->destination_16.INT_16.int_value = xbee_parent_address;
ConvertEndian16(&frame_tx_data->destination_16);
frame_tx_data->broadcast_radius = 0;
frame_tx_data->options = 0x01; // Disable ACK
frame_tx_data->data[0] = RETURNID_CONN;
 
length = XBEE_TX_DATA_PACKET_FRAME_SIZE + 1;
xbee_process_transmit_frame((void *) msgbuffer, length);
}
#endif
break;
case MSGTYPE_PORTB_5_UP:
DBG_PRINT_MAIN("Main: Port B5 Up\r\n");
timer3_disable(); // Disable PWM timer
timer0_enable(); // Set timer to sleep components
#ifdef _REMOTE
if (xbee_state == XBEE_STATE_JOINED_NETWORK) {
timer3_disable(); // Disable PWM timer
sleep();
}
#endif
break;
case MSGTYPE_PORTB_6_DOWN:
DBG_PRINT_MAIN("Main: Port B6 Down\r\n");
remote_wake(); // Wake up all components
#ifdef _REMOTE
if (xbee_state == XBEE_STATE_JOINED_NETWORK) {
wake(); // Wake up all components
frame_tx_data = (void *) msgbuffer;
frame_tx_data->frame_type = XBEE_TX_DATA_PACKET;
frame_tx_data->frame_id = 0;
frame_tx_data->destination_64.UPPER_32.long_value = 0x00000000;
frame_tx_data->destination_64.LOWER_32.long_value = 0x00000000;
ConvertEndian64(&frame_tx_data->destination_64);
frame_tx_data->destination_16.INT_16.int_value = xbee_parent_address;
ConvertEndian16(&frame_tx_data->destination_16);
frame_tx_data->broadcast_radius = 0;
frame_tx_data->options = 0x01; // Disable ACK
frame_tx_data->data[0] = RETURNID_BTN1;
 
length = XBEE_TX_DATA_PACKET_FRAME_SIZE + 1;
xbee_process_transmit_frame((void *) msgbuffer, length);
}
#endif
break;
case MSGTYPE_PORTB_6_UP:
DBG_PRINT_MAIN("Main: Port B6 Up\r\n");
timer0_enable(); // Set timer to sleep components
#ifdef _REMOTE
if (xbee_state == XBEE_STATE_JOINED_NETWORK) {
sleep();
}
#endif
break;
case MSGTYPE_PORTB_7_DOWN:
DBG_PRINT_MAIN("Main: Port B7 Down\r\n");
remote_wake(); // Wake up all components
#ifdef _REMOTE
if (xbee_state == XBEE_STATE_JOINED_NETWORK) {
wake(); // Wake up all components
frame_tx_data = (void *) msgbuffer;
frame_tx_data->frame_type = XBEE_TX_DATA_PACKET;
frame_tx_data->frame_id = 0;
frame_tx_data->destination_64.UPPER_32.long_value = 0x00000000;
frame_tx_data->destination_64.LOWER_32.long_value = 0x00000000;
ConvertEndian64(&frame_tx_data->destination_64);
frame_tx_data->destination_16.INT_16.int_value = xbee_parent_address;
ConvertEndian16(&frame_tx_data->destination_16);
frame_tx_data->broadcast_radius = 0;
frame_tx_data->options = 0x01; // Disable ACK
frame_tx_data->data[0] = RETURNID_BTN2;
 
length = XBEE_TX_DATA_PACKET_FRAME_SIZE + 1;
xbee_process_transmit_frame((void *) msgbuffer, length);
}
#endif
break;
case MSGTYPE_PORTB_7_UP:
DBG_PRINT_MAIN("Main: Port B7 Up\r\n");
timer0_enable(); // Set timer to sleep components
#ifdef _REMOTE
if (xbee_state == XBEE_STATE_JOINED_NETWORK) {
sleep();
}
#endif
break;
case MSGTYPE_INT1:
#ifdef _BASE_STATION
IR_receive_flag = 1;
pwm_LED_toggle();
Delay10KTCYx(1);
pwm_LED_toggle();
sleep();
// DBG_PRINT_MAIN("Main: INT1 Interrupt\r\n");
#endif
break;
/* -----------------------------------------------------------*/
/* --- Timer Interrupt Handlers ------------------------------*/
case MSGTYPE_TIMER0:
DBG_PRINT_MAIN("Main: Timer 0 Interrupt\r\n");
remote_sleep();
IR_receive_flag = 0;
sleep_enable();
break;
// case MSGTYPE_ADC_NEWVALUE:
// // Get the value in the ADC
// adc_last_value = *((unsigned int*) msgbuffer);
// adc_last_value_shifted = adc_last_value >> 4;
// DBG_PRINT_MAIN("Main: ADC Value = %d\r\n", adc_last_value);
//
// adc_start();
// break;
case MSGTYPE_TIMER1:
DBG_PRINT_MAIN("Main: Timer 1 Interrupt\r\n");
/* XBee Demo */
frame_tx_data = (void *) msgbuffer;
frame_tx_data->frame_type = XBEE_TX_DATA_PACKET;
frame_tx_data->frame_id = 0;
frame_tx_data->destination_64.UPPER_32.long_value = 0x00000000;
frame_tx_data->destination_64.LOWER_32.long_value = 0x00000000;
frame_tx_data->destination_16.INT_16.int_value = 0x0000;
frame_tx_data->broadcast_radius = 0;
frame_tx_data->options = 0x01; // Disable ACK
frame_tx_data->data[0] = counter;
#ifdef _REMOTE
// /* XBee Demo */
// frame_tx_data = (void *) msgbuffer;
// frame_tx_data->frame_type = XBEE_TX_DATA_PACKET;
// frame_tx_data->frame_id = 0;
// frame_tx_data->destination_64.UPPER_32.long_value = 0x00000000;
// frame_tx_data->destination_64.LOWER_32.long_value = 0x00000000;
// ConvertEndian64(&frame_tx_data->destination_64);
// frame_tx_data->destination_16.INT_16.int_value = xbee_parent_address;
// ConvertEndian16(&frame_tx_data->destination_16);
// frame_tx_data->broadcast_radius = 1;
// frame_tx_data->options = 0x01; // Disable ACK
// frame_tx_data->data[0] = counter;
//
// led_driver_num(counter);
// counter++;
// if (counter == 100)
// counter = 0;
//
// length = XBEE_TX_DATA_PACKET_FRAME_SIZE + 1;
// xbee_process_transmit_frame((void *) msgbuffer, length);
 
led_driver_num(counter);
counter++;
if (counter == 100)
counter = 0;
 
length = XBEE_TX_DATA_PACKET_FRAME_SIZE + 1;
xbee_process_transmit_frame((void *) msgbuffer, length);
 
/* Read values from accelerometer and gyroscope */
if (i2c_state == I2C_STATE_READ_GYRO) {
imu_read_acc();
399,8 → 611,16
imu_read_acc();
i2c_state = I2C_STATE_READ_ACC;
}
#endif
break;
// case MSGTYPE_ADC_NEWVALUE:
// // Get the value in the ADC
// adc_last_value = *((unsigned int*) msgbuffer);
// adc_last_value_shifted = adc_last_value >> 4;
// DBG_PRINT_MAIN("Main: ADC Value = %d\r\n", adc_last_value);
//
// adc_start();
// break;
default:
DBG_PRINT_MAIN("Main: (ERROR) Unexpected msg in low queue, length = %d, type = %d\r\n", length, msgtype);
for (i = 0; i < length; i++) {
412,4 → 632,4
continue;
}
}
}
}
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/maindefs.h
5,9 → 5,18
#include <stdio.h>
 
//#define _DEBUG
#define _BASE_STATION
//#define _REMOTE
 
#ifdef _BASE_STATION
#define _SPI2_V2
#endif
#ifdef _REMOTE
#define _SPI2_V1
//#define _SPI2_V2
#endif
 
#define BASE_STATION_ADDRESS 81
 
// Enable or disable debug prints depending on project preprocessor (_DEBUG)
#ifdef _DEBUG
#define DBG_PRINT_MAIN(x) printf(x)
27,8 → 36,9
 
#define RETURNID_ACC 10
#define RETURNID_GYRO 11
#define RETURNID_BTN1 12
#define RETURNID_BTN2 13
#define RETURNID_CONN 12
#define RETURNID_BTN1 13
#define RETURNID_BTN2 14
 
// Message type definitions
#define MSGTYPE_RESEND 1
86,7 → 96,8
 
enum XBEE_STATE {
XBEE_STATE_WAITING_TO_JOIN,
XBEE_STATE_JOINED_NETWORK
XBEE_STATE_JOINED_NETWORK,
XBEE_STATE_QUERY_PARENT
};
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/msg_queues.c
70,7 → 70,7
MQ_init_queue(&MQ_FromMainToHigh);
}
 
signed char MQ_send_msg(msg_queue *qptr,unsigned char length,unsigned char msgtype, void *data) {
signed int MQ_send_msg(msg_queue *qptr,unsigned char length,unsigned char msgtype, void *data) {
unsigned char slot;
msg *qmsg;
size_t tlength = length;
110,7 → 110,7
return(MSG_SEND_OKAY);
}
 
signed char MQ_recv_msg(msg_queue *qptr, unsigned char maxlength, unsigned char *msgtype, void *data) {
signed int MQ_recv_msg(msg_queue *qptr, unsigned char maxlength, unsigned char *msgtype, void *data) {
unsigned char slot;
msg *qmsg;
size_t tlength;
186,7 → 186,7
}
 
/* Message Queue 1 - Low Interrupt -> Main */
signed char MQ_sendmsg_ToMainFromLow(unsigned char length, unsigned char msgtype, void *data) {
signed int MQ_sendmsg_ToMainFromLow(unsigned char length, unsigned char msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_low_interrupt_routine()) {
return (MSG_NOT_IN_LOW);
195,7 → 195,7
return (MQ_send_msg(&MQ_ToMainFromLow, length, msgtype, data));
}
 
signed char MQ_recvmsg_ToMainFromLow(unsigned char maxlength, unsigned char *msgtype, void *data) {
signed int MQ_recvmsg_ToMainFromLow(unsigned char maxlength, unsigned char *msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_main_routine()) {
return (MSG_NOT_IN_MAIN);
204,12 → 204,12
return (MQ_recv_msg(&MQ_ToMainFromLow, maxlength, msgtype, data));
}
 
unsigned char MQ_peek_ToMainFromLow() {
unsigned int MQ_peek_ToMainFromLow() {
return (MQ_peek_msg(&MQ_ToMainFromLow));
}
 
/* Message Queue 2 - High Interrupt -> Main */
signed char MQ_sendmsg_ToMainFromHigh(unsigned char length, unsigned char msgtype, void *data) {
signed int MQ_sendmsg_ToMainFromHigh(unsigned char length, unsigned char msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_high_interrupt_routine()) {
return (MSG_NOT_IN_HIGH);
218,7 → 218,7
return (MQ_send_msg(&MQ_ToMainFromHigh, length, msgtype, data));
}
 
signed char MQ_recvmsg_ToMainFromHigh(unsigned char maxlength, unsigned char *msgtype, void *data) {
signed int MQ_recvmsg_ToMainFromHigh(unsigned char maxlength, unsigned char *msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_main_routine()) {
return (MSG_NOT_IN_MAIN);
227,12 → 227,12
return (MQ_recv_msg(&MQ_ToMainFromHigh, maxlength, msgtype, data));
}
 
unsigned char MQ_peek_ToMainFromHigh() {
unsigned int MQ_peek_ToMainFromHigh() {
return (MQ_peek_msg(&MQ_ToMainFromHigh));
}
 
/* Message Queue 3 - Main -> Low Interrupt */
signed char MQ_sendmsg_FromMainToLow(unsigned char length, unsigned char msgtype, void *data) {
signed int MQ_sendmsg_FromMainToLow(unsigned char length, unsigned char msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_main_routine()) {
return (MSG_NOT_IN_MAIN);
241,7 → 241,7
return (MQ_send_msg(&MQ_FromMainToLow, length, msgtype, data));
}
 
signed char MQ_recvmsg_FromMainToLow(unsigned char maxlength, unsigned char *msgtype, void *data) {
signed int MQ_recvmsg_FromMainToLow(unsigned char maxlength, unsigned char *msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_low_interrupt_routine()) {
return (MSG_NOT_IN_LOW);
250,12 → 250,12
return (MQ_recv_msg(&MQ_FromMainToLow, maxlength, msgtype, data));
}
 
unsigned char MQ_peek_FromMainToLow() {
unsigned int MQ_peek_FromMainToLow() {
return (MQ_peek_msg(&MQ_FromMainToLow));
}
 
/* Message Queue 4 - Main -> High Interrupt */
signed char MQ_sendmsg_FromMainToHigh(unsigned char length, unsigned char msgtype, void *data) {
signed int MQ_sendmsg_FromMainToHigh(unsigned char length, unsigned char msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_main_routine()) {
return (MSG_NOT_IN_MAIN);
264,7 → 264,7
return (MQ_send_msg(&MQ_FromMainToHigh, length, msgtype, data));
}
 
signed char MQ_recvmsg_FromMainToHigh(unsigned char maxlength, unsigned char *msgtype, void *data) {
signed int MQ_recvmsg_FromMainToHigh(unsigned char maxlength, unsigned char *msgtype, void *data) {
#ifdef DEBUG
if (!interrupt_in_high_interrupt_routine()) {
return (MSG_NOT_IN_HIGH);
273,7 → 273,7
return (MQ_recv_msg(&MQ_FromMainToHigh, maxlength, msgtype, data));
}
 
unsigned char MQ_peek_FromMainToHigh() {
unsigned int MQ_peek_FromMainToHigh() {
return (MQ_peek_msg(&MQ_FromMainToHigh));
}
 
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/msg_queues.h
2,7 → 2,7
#define __msg_queues_h
 
// The maximum length (in bytes) of a message
#define MSGLEN 255
#define MSGLEN 254
 
// The maximum number of messages in a single queue
#define MSGQUEUELEN 2 // DO NOT CHANGE THIS!
47,32 → 47,32
// The "MQ_ToMainToLow" queue is a message queue from low priority
// interrupt handlers to the "main()" thread. The send is called
// in the interrupt handlers and the receive from "main()"
signed char MQ_sendmsg_ToMainFromLow(unsigned char,unsigned char,void *);
signed char MQ_recvmsg_ToMainFromLow(unsigned char,unsigned char *,void *);
unsigned char MQ_peek_ToMainFromLow(void);
signed int MQ_sendmsg_ToMainFromLow(unsigned char,unsigned char,void *);
signed int MQ_recvmsg_ToMainFromLow(unsigned char,unsigned char *,void *);
unsigned int MQ_peek_ToMainFromLow(void);
 
// Queue:
// The "MQ_ToMainFromHigh" queue is a message queue from high priority
// interrupt handlers to the "main()" thread. The send is called
// in the interrupt handlers and the receive from "main()"
signed char MQ_sendmsg_ToMainFromHigh(unsigned char,unsigned char,void *);
signed char MQ_recvmsg_ToMainFromHigh(unsigned char,unsigned char *,void *);
unsigned char MQ_peek_ToMainFromHigh(void);
signed int MQ_sendmsg_ToMainFromHigh(unsigned char,unsigned char,void *);
signed int MQ_recvmsg_ToMainFromHigh(unsigned char,unsigned char *,void *);
unsigned int MQ_peek_ToMainFromHigh(void);
 
// Queue:
// The "MQ_FromMainToLow" queue is a message queue from the "main()"
// thread to the low priority interrupt handlers. The send is called
// in the "main()" thread and the receive from the interrupt handlers.
signed char MQ_sendmsg_FromMainToLow(unsigned char,unsigned char,void *);
signed char MQ_recvmsg_FromMainToLow(unsigned char,unsigned char *,void *);
unsigned char MQ_peek_FromMainToLow(void);
signed int MQ_sendmsg_FromMainToLow(unsigned char,unsigned char,void *);
signed int MQ_recvmsg_FromMainToLow(unsigned char,unsigned char *,void *);
unsigned int MQ_peek_FromMainToLow(void);
 
// Queue:
// The "MQ_FromMainToHigh" queue is a message queue from the "main()"
// thread to the high priority interrupt handlers. The send is called
// in the "main()" thread and the receive from the interrupt handlers.
signed char MQ_sendmsg_FromMainToHigh(unsigned char,unsigned char,void *);
signed char MQ_recvmsg_FromMainToHigh(unsigned char,unsigned char *,void *);
unsigned char MQ_peek_FromMainToHigh(void);
signed int MQ_sendmsg_FromMainToHigh(unsigned char,unsigned char,void *);
signed int MQ_recvmsg_FromMainToHigh(unsigned char,unsigned char *,void *);
unsigned int MQ_peek_FromMainToHigh(void);
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/pin_interrupts.c
17,9 → 17,6
}
 
void int1_interrupt_handler() {
pwm_LED_start();
Delay10TCYx(1);
pwm_LED_stop();
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_INT1, (void *) 0);
}
 
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/pwm.c
33,12 → 33,22
ClosePWM1();
}
 
void pwm_LED_start() {
void pwm_LED_on() {
OpenPWM2(0xFF); // Full period from timer
SetDCPWM2(0x80); // 50% duty cycle
PSTR2CONbits.STRA = 1; // Enable output channel A
PWM_LED_STATE = 1;
}
 
void pwm_LED_stop() {
void pwm_LED_off() {
ClosePWM2();
PWM_LED_STATE = 0;
}
 
void pwm_LED_toggle() {
if (PWM_LED_STATE) {
pwm_LED_off();
} else {
pwm_LED_on();
}
}
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/pwm.h
4,9 → 4,11
void pwm_init(void);
void pwm_IR_start(void);
void pwm_IR_stop(void);
void pwm_LED_start(void);
void pwm_LED_stop(void);
void pwm_LED_on(void);
void pwm_LED_off(void);
void pwm_LED_toggle(void);
 
static char pwm_on = 0;
static char PWM_IR_STATE = 0;
static char PWM_LED_STATE = 0;
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/sleep.c
3,15 → 3,28
#include "xbee.h"
#include "timers.h"
#include "led_driver.h"
#include <delays.h>
 
void remote_sleep() {
xbee_sleep();
void sleep() {
timer0_enable();
}
 
void sleep_enable() {
#ifdef _BASE_STATION
led_driver_num(BASE_STATION_ADDRESS);
#endif
#ifdef _REMOTE
led_driver_data(0);
led_driver_data(0);
xbee_sleep();
#endif
}
 
void remote_wake() {
timer0_disable();
void wake() {
#ifdef _REMOTE
xbee_wake();
Delay10KTCYx(2); // Give some time for the radio to wake up
led_driver_show_last();
#endif
timer0_disable();
}
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/sleep.h
1,7 → 1,8
#ifndef __sleep_h
#define __sleep_h
 
void remote_sleep(void);
void remote_wake(void);
void sleep(void);
void sleep_enable(void);
void wake(void);
 
#endif
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/timers.c
12,12 → 12,15
/* InitTMR0 = 256 - ( Delay * Frequency ) / ( 4* Prescaler) */
/* Delay = (256 - InitTMR0 * Prescaler) / (Frequency / 4) */
/* ----------------------------------------------------------- */
 
// Sleep timer
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_256);
T0CONbits.TMR0ON = 0; // Timer 0 initially off
 
#ifdef _REMOTE
// Data polling timer
OpenTimer1(TIMER_INT_ON & T1_16BIT_RW &
T1_SOURCE_FOSC_4 & T1_PS_1_8 &
T1_SOURCE_FOSC_4 & T1_PS_1_1 &
T1_OSC1EN_OFF & T1_SYNC_EXT_OFF,
TIMER_GATE_OFF & TIMER_GATE_INT_OFF);
T1CONbits.TMR1ON = 0; // Timer 1 initially off
30,6 → 33,7
OpenTimer3(TIMER_INT_ON & T3_16BIT_RW & T3_SOURCE_FOSC_4 &
T3_OSC1EN_OFF & T3_PS_1_1 & T3_SYNC_EXT_OFF, TIMER_GATE_OFF);
T3CONbits.TMR3ON = 0; // Timer 3 initially off
#endif
}
 
// Interrupt handler for timer 0
49,10 → 53,12
 
// Interrupt handler for timer 1
void timer1_interrupt_handler() {
#ifdef _REMOTE
timer1_counter++;
if (timer1_counter % 3 == 0) {
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_TIMER1, (void *) 0);
}
#endif
}
 
void timer1_enable() {
65,20 → 71,22
}
 
void timer3_interrupt_handler() {
if (!pwm_on) {
#ifdef _REMOTE
if (!PWM_IR_STATE) {
// Turn on PWM
pwm_IR_start();
pwm_on = 1;
PWM_IR_STATE = 1;
WriteTimer3(0xEA00); // Send 38kHz pulses for 600us
} else {
// Turn off PWM
pwm_IR_stop();
pwm_on = 0;
PWM_IR_STATE = 0;
WriteTimer3(0xEA00); // Send low for 0.6ms
// WriteTimer3(0xD800); // Send low for 1ms
// WriteTimer3(0xB000); // Send low for 2ms
// WriteTimer3(0x1000); // Send low for 6ms
}
#endif
}
 
void timer3_enable() {
85,7 → 93,7
// Enable timer and start PWM
T3CONbits.TMR3ON = 1;
pwm_IR_start();
pwm_on = 1;
PWM_IR_STATE = 1;
}
 
void timer3_disable() {
92,5 → 100,5
// Disable timer and stop PWM
T3CONbits.TMR3ON = 0;
pwm_IR_stop();
pwm_on = 0;
PWM_IR_STATE = 0;
}
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/uart.c
6,7 → 6,29
 
void uart_init() {
// Configure the hardware USART device
#ifdef _BASE_STATION
// UART1 TX RC6
// UART1 RX RC7
Open1USART(USART_TX_INT_OFF & // Interrupt on TX off
USART_RX_INT_OFF & // Interrupt on RX on
USART_ASYNCH_MODE & // Operate in async mode
USART_EIGHT_BIT & // Operate in 8-bit mode
USART_CONT_RX & // Continuously recieve messages
USART_BRGH_HIGH, 51); // Set UART speed to 38400 baud (32MHz)
 
// UART2 RX Pin RP5
RPINR16 = 5; // 5 is PPS RP5
// UART2 TX Pin RP6
RPOR6 = 5; // 5 is TX2/CK2 (EUSART2 Asynchronous Transmit/Asynchronous Clock Output)
 
Open2USART(USART_TX_INT_OFF & // Interrupt on TX off
USART_RX_INT_ON & // Interrupt on RX on
USART_ASYNCH_MODE & // Operate in async mode
USART_EIGHT_BIT & // Operate in 8-bit mode
USART_CONT_RX & // Continuously recieve messages
USART_BRGH_HIGH, 51); // Set UART speed to 38400 baud (32MHz)
#endif
#ifdef _REMOTE
// UART1 TX RC6
// UART1 RX RC7
Open1USART(USART_TX_INT_OFF & // Interrupt on TX off
26,7 → 48,8
USART_ASYNCH_MODE & // Operate in async mode
USART_EIGHT_BIT & // Operate in 8-bit mode
USART_CONT_RX & // Continuously recieve messages
USART_BRGH_HIGH, 64); // Set UART speed to 115200 baud
USART_BRGH_HIGH, 64); // Set UART speed to 38400 baud
#endif
}
 
void uart_recv_interrupt_handler() {
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/xbee.c
224,4 → 224,28
 
void xbee_wake() {
LATCbits.LATC5 = 0;
}
 
void ConvertEndian64(XBEE_ADDRESS_64 *src) {
char tmp[2];
tmp[0] = src->UPPER_32.char_value[3];
tmp[1] = src->UPPER_32.char_value[2];
src->UPPER_32.char_value[3] = src->UPPER_32.char_value[0];
src->UPPER_32.char_value[2] = src->UPPER_32.char_value[1];
src->UPPER_32.char_value[1] = tmp[1];
src->UPPER_32.char_value[0] = tmp[0];
 
tmp[0] = src->LOWER_32.char_value[3];
tmp[1] = src->LOWER_32.char_value[2];
src->LOWER_32.char_value[3] = src->LOWER_32.char_value[0];
src->LOWER_32.char_value[2] = src->LOWER_32.char_value[1];
src->LOWER_32.char_value[1] = tmp[1];
src->LOWER_32.char_value[0] = tmp[0];
}
 
void ConvertEndian16(XBEE_ADDRESS_16 *src) {
char tmp;
tmp = src->INT_16.char_value[0];
src->INT_16.char_value[0] = src->INT_16.char_value[1];
src->INT_16.char_value[1] = tmp;
}
/Classwork/ECE4534 - Embedded Systems/PIC 26J11/xbee.h
259,4 → 259,7
void xbee_sleep(void);
void xbee_wake(void);
 
void ConvertEndian64(XBEE_ADDRESS_64 *src);
void ConvertEndian16(XBEE_ADDRESS_16 *src);
 
#endif