From: Olivier B. <Ba...@us...> - 2010-03-14 11:29:09
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "krobot". The branch, master has been updated via 58d387423da6e5090bd789065925eac1bf937c5c (commit) from 6795c8d0a9e01b24e1762dd433acc9c48591d393 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 58d387423da6e5090bd789065925eac1bf937c5c Author: Olivier BICHLER <oli...@gm...> Date: Sun Mar 14 12:28:33 2010 +0100 Quelques modifs : - Changement des valeurs des constantes MOTOR_* pour une implémentation plus simple - Ajout d'une nouvelle erreur, ERR_INVALID_AXIS, lorsque l'on essaie de lire les deux LM simultanément - Correction d'un bug dans newVelocity() (il faut réinitialiser la variable arg) - Les commandes LCD ne renvoient plus de réponse vide - Ajout d'une nouvelle fonction configAX12() pour initialiser automatiquement les nouveaux AX12 ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/common/PcInterface.h b/PC_Mainboard/common/PcInterface.h index cb0e224..a24b00c 100644 --- a/PC_Mainboard/common/PcInterface.h +++ b/PC_Mainboard/common/PcInterface.h @@ -94,6 +94,7 @@ typedef struct _UP { #define ERR_ADJD_S371_NOT_RESPONDING 9 #define ERR_LM_COMMAND_ERROR 10 #define ERR_LM_POSITION_ERROR 11 +#define ERR_INVALID_AXIS 12 // CMD_SET arguments #define SET_PORTS_CONFIG_INPUTS 0x00 ///< Dnir les entr du PIC @@ -123,17 +124,18 @@ typedef struct _UP { #define RESET_SOURCE_MCLR 0x07 ///< Master Clear Reset // CMD_AX12 -#define AX12_PING 0x01 -#define AX12_READ 0x02 -#define AX12_WRITE 0x03 -#define AX12_GOTO 0x04 -#define AX12_GET_POS 0x05 -#define AX12_GET_SPEED 0x06 -#define AX12_GET_LOAD 0x07 -#define AX12_GET_STATS 0x08 -#define AX12_WRITE_REG 0x09 -#define AX12_ACTION 0x10 // <-- ou la loose, bibich sait pas compter en hexa -- dim -#define AX12_RESET 0x11 +#define AX12_PING 1 +#define AX12_READ 2 +#define AX12_WRITE 3 +#define AX12_GOTO 4 +#define AX12_GET_POS 5 +#define AX12_GET_SPEED 6 +#define AX12_GET_LOAD 7 +#define AX12_GET_STATS 8 +#define AX12_WRITE_REG 9 +#define AX12_ACTION 10 +#define AX12_RESET 11 +#define AX12_CONFIG 12 #define AX12_VALUE8 0x00 #define AX12_VALUE16 0x01 @@ -182,9 +184,9 @@ typedef struct _UP { #define MOTOR_DISABLE 2 #define MOTOR_MOVE 3 -#define MOTOR_RIGHT 0 ///< Sction du moteur de droite (moteur 1) -#define MOTOR_LEFT 1 ///< Sction du moteur de gauche (moteur 2) -#define MOTOR_BOTH 2 ///< Sction des 2 moteurs simultannt +#define MOTOR_RIGHT 1 ///< Sction du moteur de droite (moteur 1) +#define MOTOR_LEFT 2 ///< Sction du moteur de gauche (moteur 2) +#define MOTOR_BOTH 3 ///< Sction des 2 moteurs simultannt // XXX omplr #define READ_VERSION 0x00 diff --git a/PC_Mainboard/python/dev/USB_Com_Layer/src/PcInterface.h b/PC_Mainboard/python/dev/USB_Com_Layer/src/PcInterface.h index cb0e224..a24b00c 100644 --- a/PC_Mainboard/python/dev/USB_Com_Layer/src/PcInterface.h +++ b/PC_Mainboard/python/dev/USB_Com_Layer/src/PcInterface.h @@ -94,6 +94,7 @@ typedef struct _UP { #define ERR_ADJD_S371_NOT_RESPONDING 9 #define ERR_LM_COMMAND_ERROR 10 #define ERR_LM_POSITION_ERROR 11 +#define ERR_INVALID_AXIS 12 // CMD_SET arguments #define SET_PORTS_CONFIG_INPUTS 0x00 ///< Dnir les entr du PIC @@ -123,17 +124,18 @@ typedef struct _UP { #define RESET_SOURCE_MCLR 0x07 ///< Master Clear Reset // CMD_AX12 -#define AX12_PING 0x01 -#define AX12_READ 0x02 -#define AX12_WRITE 0x03 -#define AX12_GOTO 0x04 -#define AX12_GET_POS 0x05 -#define AX12_GET_SPEED 0x06 -#define AX12_GET_LOAD 0x07 -#define AX12_GET_STATS 0x08 -#define AX12_WRITE_REG 0x09 -#define AX12_ACTION 0x10 // <-- ou la loose, bibich sait pas compter en hexa -- dim -#define AX12_RESET 0x11 +#define AX12_PING 1 +#define AX12_READ 2 +#define AX12_WRITE 3 +#define AX12_GOTO 4 +#define AX12_GET_POS 5 +#define AX12_GET_SPEED 6 +#define AX12_GET_LOAD 7 +#define AX12_GET_STATS 8 +#define AX12_WRITE_REG 9 +#define AX12_ACTION 10 +#define AX12_RESET 11 +#define AX12_CONFIG 12 #define AX12_VALUE8 0x00 #define AX12_VALUE16 0x01 @@ -182,9 +184,9 @@ typedef struct _UP { #define MOTOR_DISABLE 2 #define MOTOR_MOVE 3 -#define MOTOR_RIGHT 0 ///< Sction du moteur de droite (moteur 1) -#define MOTOR_LEFT 1 ///< Sction du moteur de gauche (moteur 2) -#define MOTOR_BOTH 2 ///< Sction des 2 moteurs simultannt +#define MOTOR_RIGHT 1 ///< Sction du moteur de droite (moteur 1) +#define MOTOR_LEFT 2 ///< Sction du moteur de gauche (moteur 2) +#define MOTOR_BOTH 3 ///< Sction des 2 moteurs simultannt // XXX omplr #define READ_VERSION 0x00 diff --git a/PC_Mainboard/python/dev/User_Interface/PcInterface.h b/PC_Mainboard/python/dev/User_Interface/PcInterface.h index cb0e224..a24b00c 100644 --- a/PC_Mainboard/python/dev/User_Interface/PcInterface.h +++ b/PC_Mainboard/python/dev/User_Interface/PcInterface.h @@ -94,6 +94,7 @@ typedef struct _UP { #define ERR_ADJD_S371_NOT_RESPONDING 9 #define ERR_LM_COMMAND_ERROR 10 #define ERR_LM_POSITION_ERROR 11 +#define ERR_INVALID_AXIS 12 // CMD_SET arguments #define SET_PORTS_CONFIG_INPUTS 0x00 ///< Dnir les entr du PIC @@ -123,17 +124,18 @@ typedef struct _UP { #define RESET_SOURCE_MCLR 0x07 ///< Master Clear Reset // CMD_AX12 -#define AX12_PING 0x01 -#define AX12_READ 0x02 -#define AX12_WRITE 0x03 -#define AX12_GOTO 0x04 -#define AX12_GET_POS 0x05 -#define AX12_GET_SPEED 0x06 -#define AX12_GET_LOAD 0x07 -#define AX12_GET_STATS 0x08 -#define AX12_WRITE_REG 0x09 -#define AX12_ACTION 0x10 // <-- ou la loose, bibich sait pas compter en hexa -- dim -#define AX12_RESET 0x11 +#define AX12_PING 1 +#define AX12_READ 2 +#define AX12_WRITE 3 +#define AX12_GOTO 4 +#define AX12_GET_POS 5 +#define AX12_GET_SPEED 6 +#define AX12_GET_LOAD 7 +#define AX12_GET_STATS 8 +#define AX12_WRITE_REG 9 +#define AX12_ACTION 10 +#define AX12_RESET 11 +#define AX12_CONFIG 12 #define AX12_VALUE8 0x00 #define AX12_VALUE16 0x01 @@ -182,9 +184,9 @@ typedef struct _UP { #define MOTOR_DISABLE 2 #define MOTOR_MOVE 3 -#define MOTOR_RIGHT 0 ///< Sction du moteur de droite (moteur 1) -#define MOTOR_LEFT 1 ///< Sction du moteur de gauche (moteur 2) -#define MOTOR_BOTH 2 ///< Sction des 2 moteurs simultannt +#define MOTOR_RIGHT 1 ///< Sction du moteur de droite (moteur 1) +#define MOTOR_LEFT 2 ///< Sction du moteur de gauche (moteur 2) +#define MOTOR_BOTH 3 ///< Sction des 2 moteurs simultannt // XXX omplr #define READ_VERSION 0x00 diff --git a/USB_Dev_Board/Firmware/PcInterface.h b/USB_Dev_Board/Firmware/PcInterface.h index cb0e224..a24b00c 100644 --- a/USB_Dev_Board/Firmware/PcInterface.h +++ b/USB_Dev_Board/Firmware/PcInterface.h @@ -94,6 +94,7 @@ typedef struct _UP { #define ERR_ADJD_S371_NOT_RESPONDING 9 #define ERR_LM_COMMAND_ERROR 10 #define ERR_LM_POSITION_ERROR 11 +#define ERR_INVALID_AXIS 12 // CMD_SET arguments #define SET_PORTS_CONFIG_INPUTS 0x00 ///< Dnir les entr du PIC @@ -123,17 +124,18 @@ typedef struct _UP { #define RESET_SOURCE_MCLR 0x07 ///< Master Clear Reset // CMD_AX12 -#define AX12_PING 0x01 -#define AX12_READ 0x02 -#define AX12_WRITE 0x03 -#define AX12_GOTO 0x04 -#define AX12_GET_POS 0x05 -#define AX12_GET_SPEED 0x06 -#define AX12_GET_LOAD 0x07 -#define AX12_GET_STATS 0x08 -#define AX12_WRITE_REG 0x09 -#define AX12_ACTION 0x10 // <-- ou la loose, bibich sait pas compter en hexa -- dim -#define AX12_RESET 0x11 +#define AX12_PING 1 +#define AX12_READ 2 +#define AX12_WRITE 3 +#define AX12_GOTO 4 +#define AX12_GET_POS 5 +#define AX12_GET_SPEED 6 +#define AX12_GET_LOAD 7 +#define AX12_GET_STATS 8 +#define AX12_WRITE_REG 9 +#define AX12_ACTION 10 +#define AX12_RESET 11 +#define AX12_CONFIG 12 #define AX12_VALUE8 0x00 #define AX12_VALUE16 0x01 @@ -182,9 +184,9 @@ typedef struct _UP { #define MOTOR_DISABLE 2 #define MOTOR_MOVE 3 -#define MOTOR_RIGHT 0 ///< Sction du moteur de droite (moteur 1) -#define MOTOR_LEFT 1 ///< Sction du moteur de gauche (moteur 2) -#define MOTOR_BOTH 2 ///< Sction des 2 moteurs simultannt +#define MOTOR_RIGHT 1 ///< Sction du moteur de droite (moteur 1) +#define MOTOR_LEFT 2 ///< Sction du moteur de gauche (moteur 2) +#define MOTOR_BOTH 3 ///< Sction des 2 moteurs simultannt // XXX omplr #define READ_VERSION 0x00 diff --git a/USB_Module/Battery_Monitoring/Firmware/PcInterface.h b/USB_Module/Battery_Monitoring/Firmware/PcInterface.h index cb0e224..a24b00c 100644 --- a/USB_Module/Battery_Monitoring/Firmware/PcInterface.h +++ b/USB_Module/Battery_Monitoring/Firmware/PcInterface.h @@ -94,6 +94,7 @@ typedef struct _UP { #define ERR_ADJD_S371_NOT_RESPONDING 9 #define ERR_LM_COMMAND_ERROR 10 #define ERR_LM_POSITION_ERROR 11 +#define ERR_INVALID_AXIS 12 // CMD_SET arguments #define SET_PORTS_CONFIG_INPUTS 0x00 ///< Dnir les entr du PIC @@ -123,17 +124,18 @@ typedef struct _UP { #define RESET_SOURCE_MCLR 0x07 ///< Master Clear Reset // CMD_AX12 -#define AX12_PING 0x01 -#define AX12_READ 0x02 -#define AX12_WRITE 0x03 -#define AX12_GOTO 0x04 -#define AX12_GET_POS 0x05 -#define AX12_GET_SPEED 0x06 -#define AX12_GET_LOAD 0x07 -#define AX12_GET_STATS 0x08 -#define AX12_WRITE_REG 0x09 -#define AX12_ACTION 0x10 // <-- ou la loose, bibich sait pas compter en hexa -- dim -#define AX12_RESET 0x11 +#define AX12_PING 1 +#define AX12_READ 2 +#define AX12_WRITE 3 +#define AX12_GOTO 4 +#define AX12_GET_POS 5 +#define AX12_GET_SPEED 6 +#define AX12_GET_LOAD 7 +#define AX12_GET_STATS 8 +#define AX12_WRITE_REG 9 +#define AX12_ACTION 10 +#define AX12_RESET 11 +#define AX12_CONFIG 12 #define AX12_VALUE8 0x00 #define AX12_VALUE16 0x01 @@ -182,9 +184,9 @@ typedef struct _UP { #define MOTOR_DISABLE 2 #define MOTOR_MOVE 3 -#define MOTOR_RIGHT 0 ///< Sction du moteur de droite (moteur 1) -#define MOTOR_LEFT 1 ///< Sction du moteur de gauche (moteur 2) -#define MOTOR_BOTH 2 ///< Sction des 2 moteurs simultannt +#define MOTOR_RIGHT 1 ///< Sction du moteur de droite (moteur 1) +#define MOTOR_LEFT 2 ///< Sction du moteur de gauche (moteur 2) +#define MOTOR_BOTH 3 ///< Sction des 2 moteurs simultannt // XXX omplr #define READ_VERSION 0x00 diff --git a/USB_Module/Motor_Controller/Firmware/PcInterface.h b/USB_Module/Motor_Controller/Firmware/PcInterface.h index cb0e224..a24b00c 100644 --- a/USB_Module/Motor_Controller/Firmware/PcInterface.h +++ b/USB_Module/Motor_Controller/Firmware/PcInterface.h @@ -94,6 +94,7 @@ typedef struct _UP { #define ERR_ADJD_S371_NOT_RESPONDING 9 #define ERR_LM_COMMAND_ERROR 10 #define ERR_LM_POSITION_ERROR 11 +#define ERR_INVALID_AXIS 12 // CMD_SET arguments #define SET_PORTS_CONFIG_INPUTS 0x00 ///< Dnir les entr du PIC @@ -123,17 +124,18 @@ typedef struct _UP { #define RESET_SOURCE_MCLR 0x07 ///< Master Clear Reset // CMD_AX12 -#define AX12_PING 0x01 -#define AX12_READ 0x02 -#define AX12_WRITE 0x03 -#define AX12_GOTO 0x04 -#define AX12_GET_POS 0x05 -#define AX12_GET_SPEED 0x06 -#define AX12_GET_LOAD 0x07 -#define AX12_GET_STATS 0x08 -#define AX12_WRITE_REG 0x09 -#define AX12_ACTION 0x10 // <-- ou la loose, bibich sait pas compter en hexa -- dim -#define AX12_RESET 0x11 +#define AX12_PING 1 +#define AX12_READ 2 +#define AX12_WRITE 3 +#define AX12_GOTO 4 +#define AX12_GET_POS 5 +#define AX12_GET_SPEED 6 +#define AX12_GET_LOAD 7 +#define AX12_GET_STATS 8 +#define AX12_WRITE_REG 9 +#define AX12_ACTION 10 +#define AX12_RESET 11 +#define AX12_CONFIG 12 #define AX12_VALUE8 0x00 #define AX12_VALUE16 0x01 @@ -182,9 +184,9 @@ typedef struct _UP { #define MOTOR_DISABLE 2 #define MOTOR_MOVE 3 -#define MOTOR_RIGHT 0 ///< Sction du moteur de droite (moteur 1) -#define MOTOR_LEFT 1 ///< Sction du moteur de gauche (moteur 2) -#define MOTOR_BOTH 2 ///< Sction des 2 moteurs simultannt +#define MOTOR_RIGHT 1 ///< Sction du moteur de droite (moteur 1) +#define MOTOR_LEFT 2 ///< Sction du moteur de gauche (moteur 2) +#define MOTOR_BOTH 3 ///< Sction des 2 moteurs simultannt // XXX omplr #define READ_VERSION 0x00 diff --git a/USB_Module/Motor_Controller/Firmware/lm629.c b/USB_Module/Motor_Controller/Firmware/lm629.c index 800bf09..98b3147 100644 --- a/USB_Module/Motor_Controller/Firmware/lm629.c +++ b/USB_Module/Motor_Controller/Firmware/lm629.c @@ -21,6 +21,7 @@ void checkLM629Interrupt(void) { // Toutes les interruptions non masqu doivent e traitici dans le cas de la mode LM_INTERRUPT. BYTE statusRight = readStatus(MOTOR_RIGHT); BYTE statusLeft = readStatus(MOTOR_LEFT); + char axis = 0; // Bit 1: Command-Error Interrupt if ((statusRight & LM_COMMAND_ERROR) || (statusLeft & LM_COMMAND_ERROR)) { @@ -45,18 +46,17 @@ void checkLM629Interrupt(void) { } // Bit 6: Breakpoint Interrupt - if (statusRight & LM_BREAKPOINT) { - if (trajLoaded) - start(MOTOR_RIGHT); - - resetInterrupt(MOTOR_RIGHT, LM_BREAKPOINT); - } + if (statusRight & LM_BREAKPOINT) + axis|= MOTOR_RIGHT; - if (statusLeft & LM_BREAKPOINT) { + if (statusLeft & LM_BREAKPOINT) + axis|= MOTOR_LEFT; + + if (axis > 0) { if (trajLoaded) - start(MOTOR_LEFT); + start(axis); - resetInterrupt(MOTOR_LEFT, LM_BREAKPOINT); + resetInterrupt(axis, LM_BREAKPOINT); } } @@ -99,7 +99,7 @@ void waitBusyLM(char axis) { LM_PS = PS_COMMAND; // attendre au moins 30 ns avant LM_READ = 0 // La durd'attente ne devrait pas excr 100 us - if (axis == MOTOR_RIGHT || axis == MOTOR_BOTH) { + if (axis & MOTOR_RIGHT) { LM_CS1 = 0; LM_CS2 = 1; // attendre au moins 30 ns avant LM_READ = 0 Nop(); // attends 1 cycle, 8 MHz / 4 = 83.3 ns (> 30 ns) @@ -117,7 +117,7 @@ void waitBusyLM(char axis) { } // La durd'attente ne devrait pas excr 100 us - if (axis == MOTOR_LEFT || axis == MOTOR_BOTH) { + if (axis & MOTOR_LEFT) { LM_CS1 = 1; LM_CS2 = 0; // attendre au moins 30 ns avant LM_READ = 0 Nop(); // attends 1 cycle, 8 MHz / 4 = 83.3 ns (> 30 ns) @@ -153,18 +153,8 @@ void writeCommand(char axis, BYTE command) { waitBusyLM(axis); dataBusDirection(DATA_OUT); - if (axis == MOTOR_RIGHT) { - LM_CS1 = 0; - LM_CS2 = 1; - } - else if (axis == MOTOR_LEFT) { - LM_CS1 = 1; - LM_CS2 = 0; - } - else if (axis == MOTOR_BOTH) { - LM_CS1 = 0; - LM_CS2 = 0; - } + LM_CS1 = ((axis & MOTOR_RIGHT) == 0); + LM_CS2 = ((axis & MOTOR_LEFT) == 0); LM_PS = PS_COMMAND; // attendre au moins 30 ns avant LM_WRITE = 0 Nop(); // attends 1 cycle, 8 MHz / 4 = 83.3 ns (> 30 ns) @@ -201,18 +191,8 @@ void writeDataWord(char axis, WORD data) { waitBusyLM(axis); dataBusDirection(DATA_OUT); - if (axis == MOTOR_RIGHT) { - LM_CS1 = 0; - LM_CS2 = 1; - } - else if (axis == MOTOR_LEFT) { - LM_CS1 = 1; - LM_CS2 = 0; - } - else if (axis == MOTOR_BOTH) { - LM_CS1 = 0; - LM_CS2 = 0; - } + LM_CS1 = ((axis & MOTOR_RIGHT) == 0); + LM_CS2 = ((axis & MOTOR_LEFT) == 0); LM_PS = PS_DATA; // attendre au moins 30 ns avant LM_WRITE = 0 Nop(); // attends 1 cycle, 8 MHz / 4 = 83.3 ns (> 30 ns) @@ -262,35 +242,36 @@ void writeDataWord(char axis, WORD data) { WORD readDataWord(char axis) { WORD_VAL word; - waitBusyLM(axis); - dataBusDirection(DATA_IN); - - if (axis == MOTOR_RIGHT) { - LM_CS1 = 0; - LM_CS2 = 1; - } - else if (axis == MOTOR_LEFT) { - LM_CS1 = 1; - LM_CS2 = 0; - } - - LM_PS = PS_DATA; // attendre au moins 30 ns avant LM_READ = 0 - Nop(); // attends 1 cycle, 8 MHz / 4 = 83.3 ns (> 30 ns) - LM_READ = 0; // attendre au moins 180 ns avant de lire le bus - Nop(); Nop(); Nop(); // attends 3 cycles, 8 MHz / 4 = 250 ns (> 180 ns) - - word.byte.HB = LM_DATA_BUS; - - LM_READ = 1; // attendre au moins 120 ns avant LM_READ = 0 - Nop(); Nop(); // attends 2 cycles, 8 MHz / 4 = 166 ns (> 120 ns) - LM_READ = 0; // attendre au moins 180 ns avant de lire le bus - Nop(); Nop(); Nop(); // attends 3 cycles, 8 MHz / 4 = 250 ns (> 180 ns) - - word.byte.LB = LM_DATA_BUS; - - LM_READ = 1; // attendre au moins 30 ns avant une autre action - - return word.Val; + if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { + error(ERR_INVALID_AXIS); + return 0; + } + else { + waitBusyLM(axis); + dataBusDirection(DATA_IN); + + // Si axis = MOTOR_BOTH, LM_CS1 = LM_CS2 = 1 : on ne sctionne aucun LM, pour ter un conflit sur le bus + LM_CS1 = ((axis & MOTOR_LEFT) != 0); + LM_CS2 = ((axis & MOTOR_RIGHT) != 0); + + LM_PS = PS_DATA; // attendre au moins 30 ns avant LM_READ = 0 + Nop(); // attends 1 cycle, 8 MHz / 4 = 83.3 ns (> 30 ns) + LM_READ = 0; // attendre au moins 180 ns avant de lire le bus + Nop(); Nop(); Nop(); // attends 3 cycles, 8 MHz / 4 = 250 ns (> 180 ns) + + word.byte.HB = LM_DATA_BUS; + + LM_READ = 1; // attendre au moins 120 ns avant LM_READ = 0 + Nop(); Nop(); // attends 2 cycles, 8 MHz / 4 = 166 ns (> 120 ns) + LM_READ = 0; // attendre au moins 180 ns avant de lire le bus + Nop(); Nop(); Nop(); // attends 3 cycles, 8 MHz / 4 = 250 ns (> 180 ns) + + word.byte.LB = LM_DATA_BUS; + + LM_READ = 1; // attendre au moins 30 ns avant une autre action + + return word.Val; + } } /** @@ -307,28 +288,29 @@ WORD readDataWord(char axis) { BYTE readStatus(char axis) { BYTE status = 0; - waitBusyLM(axis); - dataBusDirection(DATA_IN); - - if (axis == MOTOR_RIGHT) { - LM_CS1 = 0; - LM_CS2 = 1; - } - else if (axis == MOTOR_LEFT) { - LM_CS1 = 1; - LM_CS2 = 0; - } - - LM_PS = PS_COMMAND; // attendre au moins 30 ns avant LM_READ = 0 - Nop(); // attends 1 cycle, 8 MHz / 4 = 83.3 ns (> 30 ns) - LM_READ = 0; // attendre au moins 180 ns avant de lire le bus - Nop(); Nop(); Nop(); // attends 3 cycles, 8 MHz / 4 = 250 ns (> 180 ns) - - status = LM_DATA_BUS; - - LM_READ = 1; // attendre au moins 30 ns avant une autre action + if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { + error(ERR_INVALID_AXIS); + return 0; + } + else { + waitBusyLM(axis); + dataBusDirection(DATA_IN); - return status; + // Si axis = MOTOR_BOTH, LM_CS1 = LM_CS2 = 1 : on ne sctionne aucun LM, pour ter un conflit sur le bus + LM_CS1 = ((axis & MOTOR_LEFT) != 0); + LM_CS2 = ((axis & MOTOR_RIGHT) != 0); + + LM_PS = PS_COMMAND; // attendre au moins 30 ns avant LM_READ = 0 + Nop(); // attends 1 cycle, 8 MHz / 4 = 83.3 ns (> 30 ns) + LM_READ = 0; // attendre au moins 180 ns avant de lire le bus + Nop(); Nop(); Nop(); // attends 3 cycles, 8 MHz / 4 = 250 ns (> 180 ns) + + status = LM_DATA_BUS; + + LM_READ = 1; // attendre au moins 30 ns avant une autre action + + return status; + } } /** @@ -353,7 +335,12 @@ BYTE readStatus(char axis) { * @return value la valeur du bit, 0 (#FALSE) ou 1 (#TRUE). */ BOOL readStatusBit(char axis, BYTE type) { - return ((readStatus(axis) & type) != 0); + if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { + error(ERR_INVALID_AXIS); + return 0; + } + else + return ((readStatus(axis) & type) != 0); } /** @@ -532,18 +519,19 @@ void newPosition(char axis, DWORD pos, DWORD vel, DWORD acc) { writeDataWord(axis, velData.word.LW); if (axis == MOTOR_BOTH && CON_MOTOR_RIGHT == CON_MOTOR_LEFT) { + // Dans ce cas, on peut ire simultannt sur les 2 LM pour gagner du temps posData.Val = CON_MOTOR_RIGHT * pos; writeDataWord(axis, posData.word.HW); writeDataWord(axis, posData.word.LW); } else { - if (axis == MOTOR_BOTH || axis == MOTOR_LEFT) { + if (axis & MOTOR_LEFT) { posData.Val = CON_MOTOR_LEFT * pos; writeDataWord(MOTOR_LEFT, posData.word.HW); writeDataWord(MOTOR_LEFT, posData.word.LW); } - if (axis == MOTOR_BOTH || axis == MOTOR_RIGHT) { + if (axis & MOTOR_RIGHT) { posData.Val = CON_MOTOR_RIGHT * pos; writeDataWord(MOTOR_RIGHT, posData.word.HW); writeDataWord(MOTOR_RIGHT, posData.word.LW); @@ -581,20 +569,23 @@ void newVelocity(char axis, DWORD vel, DWORD acc, char dir) { arg|= LM_LTRJ_LOAD_ACC; if (axis == MOTOR_BOTH && CON_MOTOR_RIGHT == CON_MOTOR_LEFT) { + // Dans ce cas, on peut ire simultannt sur les 2 LM pour gagner du temps if (dir == CON_MOTOR_RIGHT) arg|= LM_LTRJ_FORWARD_DIR; writeDataWord(axis, arg); } else { - if (axis == MOTOR_BOTH || axis == MOTOR_LEFT) { + if (axis & MOTOR_LEFT) { if (dir == CON_MOTOR_LEFT) arg|= LM_LTRJ_FORWARD_DIR; writeDataWord(MOTOR_LEFT, arg); } - if (axis == MOTOR_BOTH || axis == MOTOR_RIGHT) { + if (axis & MOTOR_RIGHT) { + arg = LM_LTRJ_LOAD_VEL | LM_LTRJ_VEL_MODE; // Il faut ritialiser arg + if (dir == CON_MOTOR_RIGHT) arg|= LM_LTRJ_FORWARD_DIR; @@ -639,10 +630,10 @@ void changeVelocity(char axis, DWORD vel, char dir) { * #MOTOR_BOTH les 2 moteurs */ void start(char axis) { - if (axis == MOTOR_RIGHT || axis == MOTOR_BOTH) + if (axis & MOTOR_RIGHT) posRight = getRealPosition(MOTOR_RIGHT); - if (axis == MOTOR_LEFT || axis == MOTOR_BOTH) + if (axis & MOTOR_LEFT) posLeft = getRealPosition(MOTOR_LEFT); trajLoaded = 0; @@ -697,13 +688,13 @@ void setBreakpoint(char axis, DWORD pos, BOOL rel) { else { writeCommand(axis, LM_CMD_SBPA); - if (axis == MOTOR_BOTH || axis == MOTOR_LEFT) { + if (axis & MOTOR_LEFT) { posData.Val = posLeft + CON_MOTOR_LEFT * pos; writeDataWord(MOTOR_LEFT, posData.word.HW); writeDataWord(MOTOR_LEFT, posData.word.LW); } - if (axis == MOTOR_BOTH || axis == MOTOR_RIGHT) { + if (axis & MOTOR_RIGHT) { posData.Val = posRight + CON_MOTOR_RIGHT * pos; writeDataWord(MOTOR_RIGHT, posData.word.HW); writeDataWord(MOTOR_RIGHT, posData.word.LW); @@ -726,8 +717,10 @@ void setBreakpoint(char axis, DWORD pos, BOOL rel) { DWORD getDesiredPosition(char axis) { DWORD_VAL posData; - if (axis == MOTOR_BOTH) + if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { + error(ERR_INVALID_AXIS); return 0; + } else { writeCommand(axis, LM_CMD_RDDP); posData.word.HW = readDataWord(axis); @@ -749,8 +742,10 @@ DWORD getDesiredPosition(char axis) { DWORD getRealPosition(char axis) { DWORD_VAL posData; - if (axis == MOTOR_BOTH) + if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { + error(ERR_INVALID_AXIS); return 0; + } else { writeCommand(axis, LM_CMD_RDRP); posData.word.HW = readDataWord(axis); @@ -774,8 +769,10 @@ DWORD getRealPosition(char axis) { DWORD getDesiredVelocity(char axis) { DWORD_VAL velData; - if (axis == MOTOR_BOTH) + if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { + error(ERR_INVALID_AXIS); return 0; + } else { writeCommand(axis, LM_CMD_RDDV); velData.word.HW = readDataWord(axis); @@ -797,8 +794,10 @@ DWORD getDesiredVelocity(char axis) { DWORD getRealVelocity(char axis) { DWORD_VAL velData; - if (axis == MOTOR_BOTH) + if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { + error(ERR_INVALID_AXIS); return 0; + } else { writeCommand(axis, LM_CMD_RDRV); velData.word.HW = readDataWord(axis); @@ -818,8 +817,10 @@ DWORD getRealVelocity(char axis) { * @return WORD la valeur de l'intation, sur 16 bits */ WORD getIntegrationSum(char axis) { - if (axis == MOTOR_BOTH) + if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { + error(ERR_INVALID_AXIS); return 0; + } else { writeCommand(axis, LM_CMD_RDSUM); return readDataWord(axis); @@ -841,8 +842,10 @@ short getRelPos(char axis) { return ((float) ((long) getRealPosition(MOTOR_RIGHT) - (long) posRight) / (float) COEF_RIGHT_WHEEL * CON_MOTOR_RIGHT); else if (axis == MOTOR_LEFT) return ((float) ((long) getRealPosition(MOTOR_LEFT) - (long) posLeft) / (float) COEF_LEFT_WHEEL * CON_MOTOR_LEFT); - else + else { + error(ERR_INVALID_AXIS); return 0; + } } /** diff --git a/USB_Module/Motor_Controller/Firmware/motor.c b/USB_Module/Motor_Controller/Firmware/motor.c index e42e0b3..7ac42f9 100644 --- a/USB_Module/Motor_Controller/Firmware/motor.c +++ b/USB_Module/Motor_Controller/Firmware/motor.c @@ -114,6 +114,10 @@ long getIsens(char axis) { for (i = 0; i < ISENS_AVR1; i++) Isens+= Isens2[i]; } + else { + error(ERR_INVALID_AXIS); + return 0; + } return (long) ((((float) Isens / ISENS_AVR0 / ISENS_AVR1) * 5.0 / 1023.0 - 2.5) * ISENS_COEF); } @@ -130,14 +134,11 @@ long getIsens(char axis) { * #MOTOR_BOTH les 2 moteurs */ void enableMotor(char axis) { - if (axis == MOTOR_RIGHT) - EN_MOTOR1 = 1; - else if (axis == MOTOR_LEFT) - EN_MOTOR2 = 1; - else if (axis == MOTOR_BOTH) { + if (axis & MOTOR_RIGHT) EN_MOTOR1 = 1; + + if (axis & MOTOR_LEFT) EN_MOTOR2 = 1; - } } /** @@ -151,14 +152,11 @@ void enableMotor(char axis) { * #MOTOR_BOTH les 2 moteurs */ void disableMotor(char axis) { - if (axis == MOTOR_RIGHT) - EN_MOTOR1 = 0; - else if (axis == MOTOR_LEFT) - EN_MOTOR2 = 0; - else if (axis == MOTOR_BOTH) { + if (axis & MOTOR_RIGHT) EN_MOTOR1 = 0; + + if (axis & MOTOR_LEFT) EN_MOTOR2 = 0; - } } #endif diff --git a/USB_Module/Motor_Controller/Firmware/motor.h b/USB_Module/Motor_Controller/Firmware/motor.h index 82862dc..2b628f6 100644 --- a/USB_Module/Motor_Controller/Firmware/motor.h +++ b/USB_Module/Motor_Controller/Firmware/motor.h @@ -7,8 +7,11 @@ #define MOTOR_H #include <adc.h> +#include "GenericTypeDefs.h" #include "Compiler.h" #include "HardwareProfile.h" +#include "PcInterface.h" +#include "error.h" // Parames graux #define ISENS_R 0.02 ///< Valeur de la rstance de mesure du courant (en ohm) @@ -47,9 +50,9 @@ #endif // Constantes programme -#define MOTOR_RIGHT 0 ///< Sction du moteur de droite (moteur 1) -#define MOTOR_LEFT 1 ///< Sction du moteur de gauche (moteur 2) -#define MOTOR_BOTH 2 ///< Sction des 2 moteurs simultannt +#define MOTOR_RIGHT 1 ///< Sction du moteur de droite (moteur 1) +#define MOTOR_LEFT 2 ///< Sction du moteur de gauche (moteur 2) +#define MOTOR_BOTH 3 ///< Sction des 2 moteurs simultannt #if defined(REV_1_0) // Board revision 1.0 diff --git a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.cof b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.cof index e76d155..453ac5d 100644 Binary files a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.cof and b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.cof differ diff --git a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.hex b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.hex index 91a16f9..a50fbfb 100644 --- a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.hex +++ b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.hex @@ -1,1563 +1,1572 @@ :020000040000FA -:0600000041EF33F0120095 +:0600000098EF33F012003E :0600080004EF04F01200F9 :060018000CEF04F01200E1 -:0608000041EF33F012008D -:0608080004EF13F01200E2 -:0608180071EF13F0120065 -:06082A0004001767000046 -:1008300026010000210000000C67000054010000A8 -:100840000B000000FF660000470100000D000000E3 -:0C085000FC6600006C01000003000000CA -:04085C00B5EC0EF0F9 -:10086000020EE126E66AC1DAE552DF6E010EE66E9F -:10087000BCDAE552E76E010EE7CFDBFF020EDF14B4 -:1008800004E1010EDB50020B0BE00A0EE66EE1EC18 -:1008900032F0E552020EE66EE66AE66E6CEC0FF0A0 -:1008A000040EDF140AE0010EDB50040B06E0010128 -:1008B000010E566F040EB3EC11F0200EDF1404E1AC -:1008C000010EDB50200B08E00B0EE66EE1EC32F07F -:1008D000E552200EB3EC11F0DFAC0DD00101545104 -:1008E00004E0E66A32EC09F0E552400EE66EE66A94 -:1008F000E66A6CEC0FF0010EDBAC0FD00101545135 -:1009000005E0010EE66E32EC09F0E552400EE66EAF -:10091000E66A010EE66E6CEC0FF0020EE15C02E29C -:10092000E16AE552E16EBAEF0EF0CDEC11F006E1AE -:10093000F80E96163C0E9416959808D0FE0EDB0421 -:1009400005E1070E9612C30E94129588BAEF0EF0C9 -:10095000D9CFE6FFE1CFD9FFE652010EE66EE5DF23 -:10096000E5528098FE0EDB5004E0FE0EDB500208DC -:100970000FE1839C808A0000839E0000000000003D -:100980008450010BDF6E838E00000000DF04F4E072 -:10099000FE0EDB0404E0FE0EDB5002080FE1838C48 -:1009A000809A0000839E0000000000008450010B2C -:1009B000DF6E838E00000000DF04F4E0E552E552B4 -:1009C000E7CFD9FF1200D9CFE6FFE1CFD9FFE6523A -:1009D000FD0EDB50DF6EFE0EDBCFE6FFB9DFE5522A -:1009E000E66AA3DFE552FE0EDB5003E1839C808ABA -:1009F0000CD0FE0EDB0403E1838C809A06D0FE0E41 -:100A0000DB50020802E1839C809A80980000809667 -:100A1000D9CFE9FFDACFEAFFEF50010B02E0848083 -:100A200001D08490D9CFE9FFDACFEAFFEF50020B73 -:100A300002E0848201D08492D9CFE9FFDACFEAFFC5 -:100A4000EF50040B02E0848401D08494D9CFE9FFF5 -:100A5000DACFEAFFEF50080B02E0838801D08398D9 -:100A6000D9CFE9FFDACFEAFFEF50100B02E0828224 -:100A700001D08292D9CFE9FFDACFEAFFEF50200B05 -:100A800002E0828E01D0829ED9CFE9FFDACFEAFF61 -:100A9000EF50400B02E0828001D08290D9CFE9FF75 -:100AA000DACFEAFFEF50800B02E0828C01D0829C0B -:100AB00000000000808600000000E552E552E7CF0C -:100AC000D9FF1200D9CFE6FFE1CFD9FF020EE12610 -:100AD000FC0EDBCFDEFFDBCFDDFFFE0EDBCFE6FF64 -:100AE00037DFE552E66A21DFE552FE0EDB5003E117 -:100AF000839C808A0CD0FE0EDB0403E1838C809AF9 -:100B000006D0FE0EDB50020802E1839C809A8088AA -:100B100000008096D9CFE9FFDACFEAFFEE52EF501E -:100B2000010B02E0848001D08490D9CFE9FFDACFB5 -:100B3000EAFFEE52EF50020B02E0848201D0849271 -:100B4000D9CFE9FFDACFEAFFEE52EF50040B02E013 -:100B5000848401D08494D9CFE9FFDACFEAFFEE5242 -:100B6000EF50080B02E0838801D08398D9CFE9FFCA -:100B7000DACFEAFFEE52EF50100B02E0828201D092 -:100B80008292D9CFE9FFDACFEAFFEE52EF50200B85 -:100B900002E0828E01D0829ED9CFE9FFDACFEAFF50 -:100BA000EE52EF50400B02E0828001D08290D9CF0C -:100BB000E9FFDACFEAFFEE52EF50800B02E0828CC1 -:100BC00001D0829C0000000080860000000080961A -:100BD000D9CFE9FFDACFEAFFEF50010B02E08480C2 -:100BE00001D08490D9CFE9FFDACFEAFFEF50020BB2 -:100BF00002E0848201D08492D9CFE9FFDACFEAFF04 -:100C0000EF50040B02E0848401D08494D9CFE9FF33 -:100C1000DACFEAFFEF50080B02E0838801D0839817 -:100C2000D9CFE9FFDACFEAFFEF50100B02E0828262 -:100C300001D08292D9CFE9FFDACFEAFFEF50200B43 -:100C400002E0828E01D0829ED9CFE9FFDACFEAFF9F -:100C5000EF50400B02E0828001D08290D9CFE9FFB3 -:100C6000DACFEAFFEF50800B02E0828C01D0829C49 -:100C700000000000808600000000020EE15C02E23D -:100C8000E16AE552E16EE552E7CFD9FF1200D9CF14 -:100C9000E6FFE1CFD9FF020EE126FE0EDBCFE6FF35 -:100CA00057DEE552010EE66E40DEE552FE0EDB50E9 -:100CB00003E1839C808A05D0FE0EDB0402E1838C75 -:100CC000809A80880000839E00000000000084500D -:100CD000010B066E8450020B01E0010EE824056E44 -:100CE0008450040B01E0010E040DF3CF04F0835097 -:100CF000100B01E0010E080DF3CF03F08250020B40 -:100D000001E0010E100DF3CF02F08250800B01E0E4 -:100D1000010E200DF3CF01F08250010B400DF3CFF7 -:100D200000F08250400B01E0010E800DF3500010E6 -:100D3000011002100310041005100610E76E010EDA -:100D4000E7CFDBFF838E00000000839E00000000E1 -:100D500000008450010B066E8450020B01E0010E6E -:100D6000E824056E8450040B01E0010E040DF3CF5E -:100D700004F08350100B01E0010E080DF3CF03F0D7 -:100D80008250020B01E0010E100DF3CF02F08250F1 -:100D9000800B01E0010E200DF3CF01F08250010B1A -:100DA000400DF3CF00F08250400B01E0010E800DAA -:100DB000F35000100110021003100410051006106B -:100DC000DF6E838EDECF00F0DDCF01F000C0F3FFD9 -:100DD00001C0F4FF00D0020EE15C02E2E16AE552DC -:100DE000E16EE552E7CFD9FF1200D9CFE6FFE1CFA0 -:100DF000D9FFE652DF6AFE0EDBCFE6FFA9DDE55242 -:100E0000010EE66E92DDE552FE0EDB5003E1839C9F -:100E1000808A05D0FE0EDB0402E1838C809A8098E4 -:100E20000000839E0000000000008450010B066E4D -:100E30008450020B01E0010EE824056E8450040B7F -:100E400001E0010E040DF3CF04F08350100B01E01C -:100E5000010E080DF3CF03F08250020B01E0010EEA -:100E6000100DF3CF02F08250800B01E0010E200D37 -:100E7000F3CF01F08250010B400DF3CF00F0825010 -:100E8000400B01E0010E800DF35000100110021024 -:100E90000310041005100610DF6E838EDF5000D0A3 -:100EA000E552E552E7CFD9FF1200B5EC0EF0FD0E8A -:100EB000DBCFE6FF48EC0FF0E552E71402E1000E4D -:100EC00001D0010EBAEF0EF0B5EC0EF01D0E55EC90 -:100ED0000EF0FC0EDB1C006EFD0EDB1C016E00C074 -:100EE000E6FFE66E40EC0EF0BAEF0EF0B5EC0EF059 -:100EF000000EE66EE66A25EC11F06CEC0FF0BAEF2E -:100F00000EF0B5EC0EF048EC0FF084080DE048EC64 -:100F10000FF0C40809E0E66A25EC11F049EC10F086 -:100F200014EC33F0E552EFD71C0E55EC0EF0660EC4 -:100F3000D1EC11F050EC10F048EC0FF0800804E018 -:100F400048EC0FF0C008E7E148EC0FF0C00802E100 -:100F500050EC10F01E0E55EC0EF00F0ED1EC11F00F -:100F6000B5EC12F0FA0EDBCFE6FFFB0E03EC11F04E -:100F7000F80EDBCFE6FFF90E03EC11F0F60EDBCF37 -:100F8000E6FFF70E03EC11F0040E55EC0EF01A0E0E -:100F900055EC0EF0100EE66E270EE66E40EC0EF0ED -:100FA0000101546B556B566BBAEF0EF0B5EC0EF0B9 -:100FB000080EE126010ECBEC0EF0010EE7CFDBFFB1 -:100FC000020ED5EC11F0DF6E030ECBEC0EF0030E2B -:100FD000E7CFDBFF040ECBEC0EF0020EE7CFDBFF1A -:100FE000050ECBEC0EF0050EE7CFDBFF060ECBECCB -:100FF0000EF0040EE7CFDBFF070ECBEC0EF0070E72 -:10100000E7CFDBFF080ECBEC0EF02AEC0FF0E66A20 -:1010100055EC10F0090ECBEC0EF0010EE7CFDBFF24 -:101020000A0ED5EC11F0DF6E0B0ECBEC0EF0030EBA -:10103000E7CFDBFF0C0ECBEC0EF0020EE7CFDBFFB1 -:101040000D0ECBEC0EF0050EE7CFDBFF0E0ECBEC5A -:101050000EF0040EE7CFDBFF0F0ECBEC0EF0070E09 -:10106000E7CFDBFF100ECBEC0EF02AEC0FF0010EF9 -:10107000E66E55EC10F0020EE66EE66E49EC10F0EE -:10108000E66A13DFE552E552000909E1020EE66E59 -:10109000010EE66E0ADFE552E552000902E0000E9D -:1010A00001D0010E006E080EE15C02E2E16AE55239 -:1010B000E16E0050BAEF0EF0B5EC0EF00C0EE1262A -:1010C00055EC0FF0D950F20FA9EC11F0080EEECF4D -:1010D000DBFF090EEECFDBFF0A0EEECFDBFF0B0EC0 -:1010E000EECFDBFF1F0E55EC0EF0C4EC0FF00050FE -:1010F0000110021003100CE02B0ED1EC11F00A0EBF -:10110000DBCFE6FF0B0E03EC11F0B3EC0FF003D0D6 -:101110000B0EE66EE66A40EC0EF085EC12F097ECF2 -:101120000FF009E1DAEC11F040EC0EF03BEC11F0BD -:1011300025EC11F014D097EC0FF003E0FE0EDB0469 -:1011400004E1DAEC11F0BBEC12F097EC0FF003E0E5 -:10115000FE0EDB5006E1DAEC11F011EC10F013ECAE -:1011600011F00101010E546F0C0EE15C02E2E16A24 -:10117000E552E16EBAEF0EF0B5EC0EF00A0EE12684 -:1011800080EC0FF055EC0FF0080EF36EDB6E090EDD -:10119000F3CFDBFF1F0E55EC0EF06FEC0FF007E006 -:1011A000D950080FE96EDACFEAFFEE8AED5297ECDC -:1011B0000FF00BE1F50EDB50FF0802E105EC10F03B -:1011C000B3EC0FF025EC11F01FD097EC0FF003E01B -:1011D000FE0EDB040AE1F50EDB50FF0802E105EC30 -:1011E00010F0B3EC0FF044EC0FF097EC0FF003E0CD -:1011F000FE0EDB500BE1F50EDB50FF0802E105ECC3 -:1012000010F0B3EC0FF0E66A13EC11F06FEC0FF096 -:1012100002E085EC12F09CEC12F040EC0EF00101C3 -:10122000010E546F0A0EE15C02E2E16AE552E16EE2 -:10123000BAEF0EF0B5EC0EF0F90EDBCFE6FFE66A82 -:10124000E66AE66AE66AD950FA0FA9EC11F091EC69 -:1012500011F025EC11F090DF006E0A0EE15E0050F7 -:10126000BAEF0EF0CDEC11F003E097EC0FF00BE1CC -:10127000E66A75D8E5522DC057F12EC058F12FC03F -:1012800059F130C05AF1FE0EDB0403E097EC0FF089 -:101290000CE1010EE66E63D8E5522DC05BF12EC065 -:1012A0005CF12FC05DF130C05EF10101546B9AEF2B -:1012B00011F0B5EC0EF01F0E55EC0EF0B5EC12F07F -:1012C0009AEF11F0B5EC0EF0040EE126F90EDB50AA -:1012D0000AE080EC0FF0210E55EC0EF09CEC12F0C1 -:1012E00025EC11F021D0200E55EC0EF097EC0FF00C -:1012F00003E0FE0EDB0409E15CEC0EF05B0EE96E30 -:10130000010E57EC11F0BBEC12F097EC0FF003E07C -:10131000FE0EDB500BE15CEC0EF0570EE96E010E99 -:1013200057EC11F011EC10F013EC11F0040EE15C2D -:1013300002E2E16AE552E16EBAEF0EF036EC11F02E -:1013400003E13FEC10F003D0080EDDEC11F0040EC9 -:10135000E15C02E2E16AE552E16EBAEF0EF036ECD2 -:1013600011F003E13FEC10F003D00A0EDDEC11F0B8 -:10137000040EE15C02E2E16AE552E16EBAEF0EF0C2 -:1013800036EC11F003E13FEC10F003D0070EDDEC7A -:1013900011F0040EE15C02E2E16AE552E16EBAEF9F -:1013A0000EF036EC11F003E13FEC10F00BD00B0E19 -:1013B00055EC0EF025EC11F087EC11F0DE6ADD6AD9 -:1013C00068EC11F0040EE15C02E2E16AE552E16EC4 -:1013D000BAEF0EF0B5EC0EF097EC0FF003E1F36A04 -:1013E000F46A07D00D0E55EC0EF025EC11F04FDC31 -:1013F000E552BAEF0EF0CDEC11F00FE1E66AAFDF87 -:10140000E552010157512D5C0A6E58512E580B6E52 -:1014100059512F580C6E5A5112D0FE0EDB0433E195 -:10142000010EE66E9CDFE55201015B512D5C0A6EF8 -:101430005C512E580B6E5D512F580C6E5E5130581A -:101440000D6E0AC02DF00BC02EF00CC02FF0306EC8 -:1014500064EC24F01CEC0FF026EC12F014EC25F0F8 -:101460002EC002F02FC003F030C004F031C005F0F0 -:1014700065EC0FF067EC25F0D4EC25F02FC0F3FFFE -:1014800030C0F4FF02D0F36AF46ABAEF0EF0B9ECA0 -:1014900011F029EC10F03BEC0FF0BAEF0EF0B9ECC4 -:1014A00011F00BEC0FF0020E3BEC0FF0BAEF0EF068 -:1014B000B5EC0EF06DEC10F00BEC0FF0E66AFCDD15 -:1014C00044EC10F06DEC10F022EC11F062EF11F032 -:1014D000B5EC0EF06DEC10F04DEC0FF044EC10F0AC -:1014E0006DEC10F00BEC0FF0010E62EF11F0B5ECAB -:1014F0000EF01C0EE126F60EDB501EE0006A800E98 -:10150000016E010E026E430E036EEFEC12F0336AB1 -:10151000346AC80E356E420E366E14EC25F033EC8C -:1015200012F0A5DB6FEC12F0D4EC25F0F70E2FC013 -:10153000DBFFF80E30C0DBFF40EC11F0A5EC0EF045 -:10154000BDEC11F00C6A800E0D6E010E0E6E430E96 -:101550000F6EB0EC12F02FEC12F0F1EC10F01BEC6F -:1015600010F085DB6FEC12F02EC0DEFF2FC0DEFF27 -:1015700030C0DEFF31C0DDFFDD52DD5291EC0FF0F7 -:1015800065EC0FF067EC25F033EC12F0BDEC11F0D8 -:10159000106A800E116E010E126E430E136EB0ECC7 -:1015A00012F0FFEC10F0E3EC12F06FEC12F0040E0E -:1015B0002EC0DBFF050E2FC0DBFF060E30C0DBFFA9 -:1015C000070E31C0DBFFDECF2EF0DECF2FF0DECFF7 -:1015D00030F0DDCF31F0DD52DD52040EDBCF33F0E1 -:1015E000050EDBCF34F0060EDBCF35F0070EBFEC77 -:1015F00012F0080E2EC0DBFF090E2FC0DBFF0A0E13 -:1016000030C0DBFF0B0E31C0DBFF080EDBCF04F078 -:10161000090EDBCF05F00A0EDBCF06F00B0EDBCF99 -:1016200007F0336A346A356A366A5BDB3AEC26F0D7 -:10163000010A03E0C4EC0FF013D0080EDBCF08F072 -:10164000090EDBCF09F00A0EDBCF0AF00B0EDBCF61 -:101650000BF065EC0FF073EC12F067EC25F013DB88 -:10166000080E00C0DBFF090E01C0DBFF0A0E02C03E -:10167000DBFF0B0E03C0DBFF9FDB94EC0FF064EC91 -:1016800010F0C0EC10F0EBEC0FF0046A056A066A8B -:10169000400E076E45EC11F02FEC12F064EC10F0E8 -:1016A00096EC12F0F0DA0C0EDBCF0CF00D0EDBCF67 -:1016B0000DF00E0EDBCF0EF00F0EDBCF0FF01FEC98 -:1016C00010F0D1EC0FF078DB33EC12F0D4EC12F028 -:1016D000C0EC10F09BEC0FF0066A400E076ED4ECE5 -:1016E00012F096EC12F0E0EC11F01FEC10F0DEECD2 -:1016F0000FF0140EDBCF08F0150EDBCF09F0160E3D -:10170000DBCF0AF0170E14DB0C0EDBCF14F00D0E3E -:10171000DBCF15F00E0EDBCF16F00F0E0FDBD9CF9F -:10172000E9FFDACFEAFFEECF20F0EECF21F0EECFE7 -:1017300022F0EFCF23F029EC11F0AFDB246E0D0E79 -:10174000E15E2450180EDBCF08F0190EDBCF09F054 -:101750001A0EDBCF0AF01B0EEBDA100EDBCF14F003 -:10176000110EDBCF15F0120EDBCF16F0130EE6DAFA -:10177000040EDBCF20F0050EDBCF21F0060EDBCF11 -:1017800022F0070EDBCF23F029EC11F022EC11F050 -:10179000E66E92DC246E0D0EE15E2450AAEC12F08F -:1017A0001C0EE15C02E2E16AE552E16EE3D2DDDAB1 -:1017B0003C0EE126B6DBFAEC12F03CEC12F073ECD6 -:1017C00012F067EC25F0B0DB58EC12F045EC11F0AC -:1017D0002FEC12F030EC10F04ADA07EC11F047DA97 -:1017E00080DA7EEC24F04FDA336A346A800E16EC2D -:1017F00010F0380E2EC0DBFF390E2FC0DBFF3A0E83 -:1018000030C0DBFF3B0E31C0DBFFFAEC12F03BDAFD -:1018100048DB45EC11F099DA44DBC6EC2DF0086E9C -:10182000080EE15E0850080E2DC0DBFF090E2EC029 -:10183000DBFF0A0E2FC0DBFF0B0E30C0DBFFF60E06 -:10184000DB5007E0D950F40FA9EC11F0EE50ED1089 -:1018500039E1C3DA080EDBCF0EF0090EDBCF0FF053 -:101860000A0EDBCF10F00B0E88EC10F0D9D94AEC41 -:1018700011F02E6A2F6A800E306E400E316E380ED7 -:10188000DBCF33F0390EDBCF34F03A0EDBCF35F05F -:101890003B0E83EC11F0D0DA04DB6CDB2DC002F0E0 -:1018A0002EC003F02FC004F030C005F02DC02EF084 -:1018B000C2EC11F073EC11F0EADD0A6E060EE15E87 -:1018C0000A50A1D1380EDBCF04F0390EDBCF05F082 -:1018D0003A0EDBCF06F03B0EDBCF07F0CADBFDECA8 -:1018E00012F067EC25F0F0DBDBEC12F0AEDAB8DBDF -:1018F000E3EC11F058EC12F0BAD9CED97EEC24F01A -:101900001ADBE6EC11F040EC11F0FFEC10F06FEC9C -:1019100012F054DB046A056AE6EC11F045EC11F0B4 -:10192000FFEC10F06FEC12F01C0E2EC0DBFF1D0E52 -:101930002FC0DBFF1E0E30C0DBFF1F0E31C0DBFFF0 -:101940001C0EDBCF00F01D0EDBCF01F01E0EDBCF37 -:1019500002F01F0EDBCF03F0B8DA6FEC12F0200EAE -:101960002EC0DBFF210E2FC0DBFF220E30C0DBFFBD -:10197000230E31C0DBFFD950180FE96EDACFEAFF32 -:10198000240EEECFDBFF250EEECFDBFF260EEECFD3 -:10199000DBFF270EEECFDBFF40EC11F090EC12F0F6 -:1019A000200EDBCF33F0210EDBCF34F0220EDBCF65 -:1019B00035F0230EC5EC12F0280E2EC0DBFF290EE9 -:1019C0002FC0DBFF2A0E30C0DBFF2B0E31C0DBFF48 -:1019D00045EC11F090EC12F0240EDBCF33F0250E25 -:1019E000DBCF34F0260EDBCF35F0270EC5EC12F03E -:1019F0002C0E2EC0DBFF2D0E2FC0DBFF2E0E30C0B5 -:101A0000DBFF2F0E31C0DBFF2C0EDBCF04F02D0EE1 -:101A1000DBCF05F02E0EDBCF06F02F0EDBCF07F06D -:101A200054DA5FD967EC25F016EC11F0300E2EC0B9 -:101A3000DBFF310E2FC0DBFF320E30C0DBFF330E79 -:101A400031C0DBFF280EDBCF2EF0290EDBCF2FF0CD -:101A50002A0EDBCF30F02B0EDBCF31F0E7DB340E7C -:101A60002EC0DBFF350E2FC0DBFF360E30C0DBFF94 -:101A7000370E31C0DBFFD950300F90D9D950340F19 -:101A80008DD9C6EC2DF0006E080EE15E00500C0EF4 -:101A90002DC0DBFF0D0E2EC0DBFF0E0E2FC0DBFFB7 -:101AA0000F0E30C0DBFF006A016A026A400E036E4F -:101AB00000C0E6FF01C0E6FF02C0E6FFE66E95D972 -:101AC000FDEC12F0B8DAEDD97EEC11F02DC014F077 -:101AD0002EC015F02FC016F030C017F022EC12F017 -:101AE000C6EC2DF0186E080EE15E1850E552E7CFF7 -:101AF00003F0E552E7CF02F0E552E7CF01F0E552FF -:101B0000E7CF00F02DC004F02EC005F02FC006F086 -:101B100030C007F01FDA6FEC12F043DAF60EDB503C -:101B200002081FE161EC12F07DEC24F0A3EC12F04E -:101B30007EEC24F023D95CDA060E2FC0DBFF070E03 -:101B400030C0DBFF000EDFCF2FF0010EFED8020EFB -:101B5000AEEC11F0B9DA49DB040E2FC0DBFF050E45 -:101B600035D02AD990D80C0EDBCF04F00D0EDBCF88 -:101B700005F00E0EDBCF06F00F0EDBCF07F004C032 -:101B800033F005C034F006C035F007C036F07DEC08 -:101B900024F021DA61EC12F07EEC24F0A3EC12F0D8 -:101BA0007DEC24F0EBD824DA040E2FC0DBFF050E09 -:101BB00030C0DBFF020EDBCF2FF0030EC6D8C1DB37 -:101BC00083DA13DB060E2FC0DBFF070E30C0DBFF0E -:101BD00027D890D8040EDBCF2FF0050E6DDA22EC5B -:101BE00012F0AFDB2FD859D9206E0D0EE15E2050D8 -:101BF00081D8060EDBCF2FF0070E5EDA2ADAAEDBD5 -:101C000021D820DB38D93C0EE15C02E2E16AE552E2 -:101C1000E16EB0D00101565102E0556B010C000C91 -:101C2000F9DF0009FDE01200010155511200D4EC6A -:101C300012F026EC12F08EDA28DB3EDA22EC12F0FB -:101C40001FDB85D32EC01CF02FC01DF030C01EF04E -:101C500031C01FF026EC12F000EC13F02DC018F08C -:101C60002EC019F02FC01AF030C01BF012002EC089 -:101C700033F02FC034F030C035F031C036F01200F0 -:101C8000E4DA13EF11F02EC000F02FC001F030C0E5 -:101C900002F031C003F0120000C02EF001C02FF09E -:101CA00002C030F003C031F01200E66ECEDAE3EC91 -:101CB00004F0E552E5521200FA0EDBCF00F0FB0E05 -:101CC000DBCF01F0FC0EDBCF02F0FD0EDBCF03F02B -:101CD000000E006C011E0122021E0222031E0322BE -:101CE000120004C02EF005C02FF006C030F007C06F -:101CF00031F01200EFEC12F0A9DBAAEF10F0A5DA38 -:101D000006DBA3DA47EC06F0E552F3CFDEFFF4CFB3 -:101D1000DDFF68EF11F000C0DFFF010E01C0DBFF47 -:101D2000020E02C0DBFF030E03C0DBFFC9EF12F09F -:101D3000DBCF0BF08BDBD7DBAAEF10F0DBCF17F09C -:101D400085DB65DAA3DB22EF12F089DB33EF12F0DB -:101D500002C02EF017DB7DEC24F0C5DA58EC0AF057 -:101D6000126E060EE15E12501200D9CFE6FFE1CFEF -:101D7000D9FF1200E552E7CFD9FF1200100EDBCFDA -:101D800033F0110EDBCF34F0120EDBCF35F0130E33 -:101D9000BADAD4EF25F009DBE76E1200E96EDACF8C -:101DA000EAFF91EF11F00CC02EF00DC02FF00EC025 -:101DB00030F00FC031F012002E6A2F6A306A400EE8 -:101DC000316E080EDBCF33F0090EDBCF34F00A0E94 -:101DD000DBCF35F00B0E83EF11F05CDA026A036A99 -:101DE000B40E046E420E056E1200140EDBCF0CF022 -:101DF000150EDBCF0DF0160EDBCF0EF0170EDBCF7E -:101E00000FF01200350E336EFA0E346E0E0E356E74 -:101E10003C0E366E1200000E186C191E19221A1E86 -:101E20001A221B1E1B2218C0E6FF19C0E6FF1AC0AB -:101E3000E6FF1BC0E6FF12002EC006F02FC007F021 -:101E400030C008F031C009F01200F40EDBCF2FF0E3 -:101E5000F50E7DD2060EE7CFDBFFDBCFE6FF070EE8 -:101E6000DBCFE6FF040EDBCFE6FF050EDBCFE6FFA0 -:101E700090DB3BEF11F0E66E5CEC08F0206E0D0E8F -:101E8000E15E2050AAEF12F0010EE66E13EF11F0A2 -:101E9000DCD9F5EC06F0E5521200D4DAE66A5CEF24 -:101EA00008F0A1DB31C0E6FF1200D950F60F51DA7D -:101EB000040EEECFDBFF050EEECFDBFF060EEECFFE -:101EC000DBFF070EEECFDBFF1200336A346A800EB1 -:101ED000356EBF0E366E120064EC07F061D3040E4F -:101EE000DBCF00F0050EDBCF01F0060EDBCF02F0FA -:101EF000070EDBCF03F00050011002100310120098 -:101F0000D9CFE9FFDACFEAFFFA0EDBCFEEFFFB0E07 -:101F1000DBCFEEFFFC0EDBCFEEFFFD0EDBCFEEFFE7 -:101F2000120068DB64EF10F09EDAAFD910D2FE0E1B -:101F3000DB5002081200140E2EC0DBFF150E2FC05E -:101F4000DBFF160E30C0DBFF170E31C0DBFF046A6B -:101F5000056A12002DC033F02EC034F02FC035F0CA -:101F600030C036F01200080EDBCFE6FF090EDBCFE3 -:101F7000E6FF1200D9EC29F0E55212D3336A346A35 -:101F8000356A400E366E1200080EDBCF00F0090EE7 -:101F9000DBCF01F00A0EDBCF02F00B0EDBCF03F03C -:101FA0001200100E2EC0DBFF110E2FC0DBFF120E31 -:101FB00030C0DBFF130E31C0DBFF1200180E2EC045 -:101FC000DBFF190E2FC0DBFF1A0E30C0DBFF1B0E2C -:101FD00031C0DBFF12000C0E2EC0DBFF0D0E2FC038 -:101FE000DBFF0E0E30C0DBFF0F0E31C0DBFF120037 -:101FF000020E2FC0DBFF030E30C0DBFFF90EDBCF7C -:102000002FF0FA0EDBCF30F01200D950080FE96E36 -:10201000DACFEAFFEE52ED881200356E430E366ECF -:102020001200E66A00D927D9E66A1200356E400E22 -:10203000366E14EF25F07DEC24F064EF10F00CC048 -:1020400033F00DC034F00EC035F00FC036F07DEF28 -:1020500024F0F8D9020E1200336A800E346E12009A -:102060002EC018F02FC019F030C01AF031C01BF08C -:1020700012000C6A0D6A0E6A400E0F6E12002D6A75 -:102080002E6A2F6A306A1200286E0D0EE15E28500B -:102090001200E3EC04F0E552E552020EE66E120087 -:1020A000D4D876EC07F0E552120081EC07F0006E10 -:1020B000090EE15E00501200D2D9FAD9C7D967ECF7 -:1020C00025F01ADA46EF12F02EC008F02FC009F002 -:1020D00030C00AF031C00BF01200A9DD2EC024F090 -:1020E0002FC025F030C026F031C027F08BDE67EC22 -:1020F00025F02EC020F02FC021F030C022F031C0DA -:1021000023F0AADF810E89DF67EC25F022EF0EF0C5 -:10211000DBCF11F0336A346A340E7FDF0EC02EF04D -:102120000FC02FF010C030F011C031F067EC25F077 -:102130002EC00AF02FC00BF030C00CF031C00DF0F3 -:10214000DB0E336E0F0E346E490E70DF75DE8FDDE1 -:10215000A8EF0EF067EC25F086D9CC0E336EBC0EDE -:10216000346E8C0E356E3B0E366E4ADA2DC000F0A2 -:102170002EC001F02FC002F030C003F022EF12F0A9 -:10218000D5D981DD106A116A800E126E3F0E136E72 -:10219000080EDBCF14F0090EDBCF15F00A0EDBCFF3 -:1021A00016F00B0EDBCF17F014C033F015C034F06F -:1021B00016C035F017C036F006DA6EDD14EF25F0E4 -:1021C000140EDBCF00F0150EDBCF01F0160EDBCFC7 -:1021D00002F0170EDBCF03F03FDF010E1EDF4CEFE6 -:1021E0000EF08AD944DDD3EF0EF0E5D9F90EDBCF3E -:1021F0002FF0FA0E34D940D972D9D4EF25F02FD967 -:1022000057D937EF0EF0DBCFE6FF40EF0EF014C0EA -:102210002EF015C02FF016C030F017C031F067EC6B -:1022200025F07CEF12F062EC05F0BAD1140EDBCF92 -:1022300033F0150EDBCF34F0160EDBCF35F0170E72 -:10224000BFEF12F0FFD8010E1200FE0EDBCFE6FF4B -:102250001200D8DD20C02EF021C02FF022C030F0B7 -:1022600023C031F067EC25F022EF0EF07EDD040E86 -:10227000E12697EF0FF0DECFE6FFDDCFE6FF12009D -:10228000FD0EDBCF2FF0FE0E1200FB0EDBCF2FF08A -:10229000FC0E1200F70EDBCFE6FFF80EDBCFE6FFF9 -:1022A000F90EDBCFE6FFFA0EDBCFE6FF1200EA6E97 -:1022B000EE500026EE500122EE500222EE50032294 -:1022C0008BEF0EF0E66E5CEC08F0DEDE43D952D503 -:1022D000DECF2DF0DECF2EF0DECF2FF0DDCF30F0D1 -:1022E000DD52DD521200D4EC25F02FC000F030C0DA -:1022F00001F02FC0E6FF30C0E6FF1200D950380FC2 -:102300004DDDBAEF0FF0DBCF36F067EF25F047EC8D -:1023100006F0E552020EF3CFDBFF030EF4CFDBFF36 -:102320001200EECFE6FFEECFE6FFEECFE6FFEFCFF7 -:10233000E6FF1200010EB9DC0101010E556F566B6C -:1023400019D5000EDFCF2FF0010E2FEF12F02FEF77 -:1023500012F0E96EFF0EDA20EA6E1200DBCF2FF0EA -:10236000030E2FEF12F0E66EE66A020EE66E6CEFD9 -:102370000FF0FBDC5CDC22EF0EF000DE67EC25F0FA -:1023800043EF0EF003C02FF004C030F005C031F071 -:1023900012006DDC81DC7DEF24F0E7DCFE0EDB500B -:1023A0001200E66EE66A40EF0EF0E66E33EC32F0B5 -:1023B000E552120081DC8BEF0EF077DC7FEF0EF040 -:1023C00062DCF5EF0EF0DADD14EF25F0800E066E1C -:1023D0003F0E076E4EDE04C0E6FF05C0E6FF06C0F6 -:1023E000E6FF07C0E6FF0CC0E6FF0DC0E6FF0EC02B -:1023F000E6FFE66E83DFE552E7CF0FF0E552E7CF69 -:102400000EF0E552E7CF0DF0E552E7CF0CF0E552C4 -:10241000E7CF07F0E552E7CF06F0E552E7CF05F04A -:10242000E552E7CF04F02DC010F02EC011F02FC000 -:1024300012F030C013F08EDDB6DC67EC25F044DE20 -:10244000DBEF12F02DC0E6FFF3EF12F0330E336E28 -:10245000E20E346EC20E356E420E366E1200DBCFC7 -:1024600030F04FEF24F02EC004F02FC005F030C044 -:1024700006F031C007F012002EC00CF02FC00DF096 -:1024800030C00EF031C00FF037EF0EF0BD0E336EDE -:10249000370E346E860E356E410E366EB1D82DC0B5 -:1024A0000CF02EC00DF02FC00EF030C00FF0120057 -:1024B0002EC014F02FC015F030C016F031C017F048 -:1024C00012008BDC0C0EDBCF0EF00D0EDBCF0FF00D -:1024D0000E0EDBCF10F00F0E1BDEE0EF10F04CEC19 -:1024E0000EF067EF25F008C02EF009C02FF00AC0EB -:1024F00030F00BC031F012002EC010F02FC011F0E0 -:1025000030C012F031C013F01200060EDBCFE6FF30 -:10251000070E79DE040EDBCFE6FF050E03EF11F0A8 -:1025200014DC51DF4DDF69D87DEF24F037EC0EF07D -:1025300071EC0EF067EF25F0020EDBCFE6FF030E25 -:1025400062DE3BEF11F01ADC2FC0DEFF30C0DDFF92 -:10255000E0EF10F0020EE66E32EC09F0E5521200E8 -:10256000F70EDBCF2FF0F80E1200FC0EDBCFE6FFEC -:10257000FD0E03EF11F088DC7EDE44EF0FF0DBCFC1 -:1025800036F014EC25F043EF0EF0BDDE9DDDC9EF13 -:1025900011F0020EDBCFE6FF030EDBCFE6FF1200E9 -:1025A000E552E552E5521200F90EDBCF2FF0FA0E9C -:1025B00056DF64EF10F037EC0EF071EC0EF014EC17 -:1025C00025F043EF0EF010C02EF011C02FF012C016 -:1025D00030F013C031F07EEC24F03CEF12F0C0DF9D -:1025E0003EDF64EF10F02EC0E6FF2FC0E6FF30C0E4 -:1025F000E6FF120045DE2FEF12F027DCF1EF10F0BE -:0826000067EC25F003EF26F062 -:08260800DACFE4FFE2CFDAFFB4 -:10261000E9CFE4FFEACFE4FFF6CFE4FFF7CFE4FF32 -:10262000F5CFE4FFF3CFE4FFF4CFE4FFFACFE4FF0C -:1026300000EE29F0140EE80403E3EECFE4FFFBD72D -:1026400000EE00F0290EE80403E3EECFE4FFFBD731 -:102650007FEC1EF09EA013D089EC1EF001014D2BE3 -:10266000000E4E23E80E4D5D030E4E5905E34D6BF3 -:102670004E6B4F2B000E5023FAEC2BF09E90F2A0E5 -:1026800003D02EEC04F0F29092EC1EF002E2E16A2C -:10269000E552E16EE552E7CFD9FFE55200EE28F0B2 -:1026A000290EE80403E3E5CFEDFFFBD700EE3CF095 -:1026B000140EE80403E3E5CFEDFFFBD7E5CFFAFF07 -:1026C000E5CFF4FFE5CFF3FFE5CFF5FFE5CFF7FF6B -:1026D000E5CFF6FFE5CFEAFFE5CFE9FFE5CFDAFF8B -:1026E0001100D8CFE4FFE0CFE4FFE46EDACFE4FFDF -:1026F000E2CFDAFFF3CFE4FFF4CFE4FF7FEC1EF08C -:1027000092EC1EF002E2E16AE552E16EE552E7CF9B -:10271000D9FFE552E5CFF4FFE5CFF3FFE5CFDAFFD0 -:10272000E550E5CFE0FFE5CFD8FF100004D8DDECA1 -:102730001EF063D8FCD70F0EC11202D8A7EF1EF00F -:10274000A2EC1EF0E65256EC1EF00101696F070E76 -:10275000695D10E1E66A33EC32F0E552DF6E000E9F -:10276000DF809AEC1EF0E66A14EC33F0E552DF707D -:102770009AEC1EF01C0E9316D08EF28EF28CF2861E -:10278000F30E8C1695160101476B486B496B4A6B2B -:10279000010E4B6F92948094939881980D0EE66E83 -:1027A0007C0EE66EE10EE66EA6EC31F0E552E552E7 -:1027B000E552C70E921694943F0E9516010EE66EE2 -:1027C00095EC04F0E552838C808A82848088838E25 -:1027D00080868294010EE66E4FEC33F0E5528284DF -:1027E0009D80C50EE66EA4EC32F0E55289EC1EF039 -:1027F000E552E552E7CFD9FF1200D9CFE6FFE1CF8E -:10280000D9FF0F0EE12601014B5102E09BEC1DF0B8 -:10281000200E0101005D03E36D50020B12E014EC89 -:102820000EF000090CE0E66A010EE66E020EE66E9E -:1028300059EC09F0E552E552E55210EC0EF091EF3B -:102840001DF0010149514A1102E1000E08D049C1B1 -:10285000E9FF4AC1EAFFEF50800B01E0010E0009D9 -:1028600047E101014651EA6A260FE96E010EEA22AC -:10287000EF5000083DE20501406B01014C514C2B2B -:102880000501416F0501040E426F01014651EA6ADC -:10289000260FE96E010EEA22EFCF43F5400EE66EF9 -:1028A000400EE66E050EE66E010EE66E010EE66E59 -:1028B000F8EC22F0006E050EE15E0050F3CF49F116 -:1028C000F4CF4AF101014651EA6A260FE96E010E82 -:1028D000EA22EF6A01014651000803E201014607BE -:1028E00007D001014551000803E201011F0E466FA8 -:1028F000010149514A1102E1000E08D049C1E9FF26 -:102900004AC1EAFFEF50800B01E0010E00092BE104 -:1029100014EC0EF0000927E00AEC0EF0000923E0A9 -:102920000501406B01014C514C2B0501416F050124 -:102930000A0E426F0501436B0501010E486F400E00 -:10294000E66E400EE66E050EE66E010EE66E010EB8 -:10295000E66EF8EC22F0006E050EE15E0050F3CF5B -:1029600049F1F4CF4AF101015151020A10E0030A82 -:1029700001E021D0020EE66E46EC2DF0E552D6ECD9 -:1029800007F0000903E00101020E516F16D0200E7E -:10299000E66E030EE66EC80EE66EE66AE80EE66EBA -:1029A000030EE66E47EC0AF0006E060EE15E005084 -:1029B0000101516B02D00101516B010147514811D6 -:1029C00002E1000E08D047C1E9FF48C1EAFFEF501D -:1029D000800B01E0010E000902E091EF1DF00501FE -:1029E0000251070A02E1F2EF1CF00D0A01E166D282 -:1029F000010A01E126D20D0A01E1BED1040A1AE062 -:102A0000030A07E0010A02E050EF1DF0FF0091EF1A -:102A10001DF0E66A33EC32F0E552DF6E000EDB802B -:102A2000DFCFE6FFE66A13EC32F0E552E552FF0035 -:102A300091EF1DF0010149514A1102E1000E08D049 -:102A400049C1E9FF4AC1EAFFEF50800B01E0010EE6 -:102A5000000901E08FD100C540F50501416B05017A -:102A6000030E426F0501436B05010851100A01E195 -:102A700035D11F0A01E1F8D0080A01E1BBD0010AF3 -:102A800001E17ED0020A71E0070A64E0010A20E059 -:102A9000030A06E0010A01E043D169C148F543D1C8 -:102AA0000501486B230E006E650E016E026A00C0C0 -:102AB000E6FF01C0E6FF02C0E6FF480EE66E050E27 -:102AC000E66EF7EC31F0036E050EE15E03502BD19C -:102AD0000501486B170E006E650E016E026A00C09C -:102AE000E6FF01C0E6FF02C0E6FF480EE66E050EF7 -:102AF000E66EF7EC31F0036E050EE15E0350150E45 -:102B0000006E650E016E026A00C0E6FF01C0E6FFBE -:102B100002C0E6FF480EE66E050EE66EF7EC31F0F9 -:102B2000036E050EE15E03500C0E006E650E016E25 -:102B3000026A00C0E6FF01C0E6FF02C0E6FF480EE1 -:102B4000E66E050EE66EF7EC31F0036E050EE15E03 -:102B50000350E9D092CF48F593CF49F594CF4AF589 -:102B600095CF4BF596CF4CF5DED080CF48F581CF91 -:102B700049F582CF4AF583CF4B... [truncated message content] |