From: Olivier B. <Ba...@us...> - 2010-03-13 17:29:54
|
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 6795c8d0a9e01b24e1762dd433acc9c48591d393 (commit) from 1df5dc2b427b81fa86804859729ac50f2bcc4377 (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 6795c8d0a9e01b24e1762dd433acc9c48591d393 Author: Olivier BICHLER <oli...@gm...> Date: Sat Mar 13 18:29:08 2010 +0100 Pack de modifs sur Motor Controller : - Correction d'un bug dans resetInterrupt (on resettait toutes les interruptions sauf celle désirée !) - Ajout de plusieurs variables d'état sur la trajectoire, qui remplacent la variable traj_engaged du fichier main.c (cela devrait diminuer le risque d'entrer dans un état incohérent suite à un problème) - Ajout de la gestion de breakpoints, avec la fonction setBreakpoint(), avec possibilité de charger une trajectoire et de l'exécuter au moment du breakpoint - Ajout des fonctions getDesiredPosition() et getDesiredVelocity() - La fonction getRelPos() remplace les fonctions getRelPosRight() et getRelPosLeft() (pour deux fonctions alors que toutes les autres ont un paramètre axis ?) et tient compte des coefficients relatifs à la connexion des moteurs - Ajout d'une fonction isTrajEngaged() pour connaitre l'état de la trajectoire - Corrections mineures dans la documentation : arguments annoncées sur 16 bits alors qu'ils sont sur 32 bits en réalité + ajout des valeurs de retour pour les fonctions get...() - Utilisation de la fonction getRealPosition() dans la fonction start() au lieu des commandes de bas niveau - La fonction checkLM629Interrupt() ne lit qu'une seule fois l'état de chaque LM pour de meilleures performances ----------------------------------------------------------------------- Changes: diff --git a/USB_Module/Motor_Controller/Firmware/lm629.c b/USB_Module/Motor_Controller/Firmware/lm629.c index 9f52c7c..800bf09 100644 --- a/USB_Module/Motor_Controller/Firmware/lm629.c +++ b/USB_Module/Motor_Controller/Firmware/lm629.c @@ -8,23 +8,56 @@ #include "lm629.h" -volatile DWORD_VAL posRight = 0; -volatile DWORD_VAL posLeft = 0; +volatile BOOL trajLoaded = 0; +volatile BOOL trajEngaged = 0; +volatile BOOL trajCompleted = 0; + +volatile DWORD posRight = 0; +volatile DWORD posLeft = 0; void checkLM629Interrupt(void) { // Ne jamais oublier de resetter l'interruption correspondante sous peine de flooder l'USB dans le cas de la mode LM_POLLING // et de ne pas dcter les interruptions suivantes dans le cas de la mode LM_INTERRUPT ! // 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); - if (readStatusBit(MOTOR_RIGHT, LM_COMMAND_ERROR) || readStatusBit(MOTOR_LEFT, LM_COMMAND_ERROR)) { + // Bit 1: Command-Error Interrupt + if ((statusRight & LM_COMMAND_ERROR) || (statusLeft & LM_COMMAND_ERROR)) { error(ERR_LM_COMMAND_ERROR); resetInterrupt(MOTOR_BOTH, LM_COMMAND_ERROR); } - if (readStatusBit(MOTOR_RIGHT, LM_POSITION_ERROR) || readStatusBit(MOTOR_LEFT, LM_POSITION_ERROR)) { + // Bit 2: Trajectory-Complete Interrupt + if ((statusRight & LM_TRAJECTORY_COMPLETE) && (statusLeft & LM_TRAJECTORY_COMPLETE)) { + trajCompleted = 1; + resetInterrupt(MOTOR_BOTH, LM_TRAJECTORY_COMPLETE); + } + + // Bit 3: Index-Pulse Interrupt -- Not implemented + + // Bit 4: Wrap-Around Interrupt -- Not implemented + + // Bit 5: Position-Error Interrupt + if ((statusRight & LM_POSITION_ERROR) || (statusLeft & LM_POSITION_ERROR)) { error(ERR_LM_POSITION_ERROR); resetInterrupt(MOTOR_BOTH, LM_POSITION_ERROR); } + + // Bit 6: Breakpoint Interrupt + if (statusRight & LM_BREAKPOINT) { + if (trajLoaded) + start(MOTOR_RIGHT); + + resetInterrupt(MOTOR_RIGHT, LM_BREAKPOINT); + } + + if (statusLeft & LM_BREAKPOINT) { + if (trajLoaded) + start(MOTOR_LEFT); + + resetInterrupt(MOTOR_LEFT, LM_BREAKPOINT); + } } /** @@ -330,10 +363,11 @@ BOOL readStatusBit(char axis, BYTE type) { * #MOTOR_RIGHT le moteur de droite uniquement @n * #MOTOR_LEFT le moteur de gauche uniquement @n * #MOTOR_BOTH les 2 moteurs + * @param type type d'interruption esetter */ void resetInterrupt(char axis, WORD type) { writeCommand(axis, LM_CMD_RSTI); - writeDataWord(axis, type); + writeDataWord(axis, ~type); } /** @@ -387,7 +421,7 @@ initLM_RESET: writeCommand(axis, LM_CMD_MSKI); #if defined(LM_INTERRUPT) - writeDataWord(axis, LM_COMMAND_ERROR | LM_POSITION_ERROR); + writeDataWord(axis, LM_COMMAND_ERROR | LM_TRAJECTORY_COMPLETE | LM_POSITION_ERROR | LM_BREAKPOINT); #else writeDataWord(axis, 0); #endif @@ -415,6 +449,10 @@ initLM_RESET: // Srit writeCommand(axis, LM_CMD_LPES); writeDataWord(axis, LM_PES_LIMIT); + + trajLoaded = 0; + trajEngaged = 0; + trajCompleted = 0; } /** @@ -469,9 +507,9 @@ BOOL initLMs(void) { * #MOTOR_LEFT le moteur de gauche uniquement @n * #MOTOR_BOTH les 2 moteurs * - * @param pos position tteindre, sur 16 bits - * @param vel vitesse max., sur 16 bits - * @param acc accration, sur 16 bits @n + * @param pos position tteindre, sur 32 bits + * @param vel vitesse max., sur 32 bits + * @param acc accration, sur 32 bits @n * /!\ uniquement si l'on part d'une position 'arr * l'accration ne peut pas e changen court de trajectoire */ @@ -511,6 +549,8 @@ void newPosition(char axis, DWORD pos, DWORD vel, DWORD acc) { writeDataWord(MOTOR_RIGHT, posData.word.LW); } } + + trajLoaded = 1; } /** @@ -521,8 +561,8 @@ void newPosition(char axis, DWORD pos, DWORD vel, DWORD acc) { * #MOTOR_LEFT le moteur de gauche uniquement @n * #MOTOR_BOTH les 2 moteurs * - * @param vel vitesse, sur 16 bits - * @param acc accration, sur 16 bits @n + * @param vel vitesse, sur 32 bits + * @param acc accration, sur 32 bits @n * /!\ uniquement si l'on part d'une position 'arr * l'accration ne peut pas e changen court de trajectoire * @@ -569,6 +609,8 @@ void newVelocity(char axis, DWORD vel, DWORD acc, char dir) { writeDataWord(axis, velData.word.HW); writeDataWord(axis, velData.word.LW); + + trajLoaded = 1; } /** @@ -579,7 +621,7 @@ void newVelocity(char axis, DWORD vel, DWORD acc, char dir) { * #MOTOR_LEFT le moteur de gauche uniquement @n * #MOTOR_BOTH les 2 moteurs * - * @param vel vitesse, sur 16 bits + * @param vel vitesse, sur 32 bits * @param dir sens de rotation, peut valoir : @n * 1 avance @n * -1 recule @@ -597,19 +639,17 @@ void changeVelocity(char axis, DWORD vel, char dir) { * #MOTOR_BOTH les 2 moteurs */ void start(char axis) { - if (axis == MOTOR_RIGHT || axis == MOTOR_BOTH) { - writeCommand(MOTOR_RIGHT, LM_CMD_RDRP); - posRight.word.HW = readDataWord(MOTOR_RIGHT); - posRight.word.LW = readDataWord(MOTOR_RIGHT); - } + if (axis == MOTOR_RIGHT || axis == MOTOR_BOTH) + posRight = getRealPosition(MOTOR_RIGHT); - if (axis == MOTOR_LEFT || axis == MOTOR_BOTH) { - writeCommand(MOTOR_LEFT, LM_CMD_RDRP); - posLeft.word.HW = readDataWord(MOTOR_LEFT); - posLeft.word.LW = readDataWord(MOTOR_LEFT); - } + if (axis == MOTOR_LEFT || axis == MOTOR_BOTH) + posLeft = getRealPosition(MOTOR_LEFT); + + trajLoaded = 0; writeCommand(axis, LM_CMD_STT); + trajEngaged = 1; + trajCompleted = 0; } /** @@ -628,7 +668,72 @@ void start(char axis) { void stop(char axis, WORD type) { writeCommand(axis, LM_CMD_LTRJ); writeDataWord(axis, type); + writeCommand(axis, LM_CMD_STT); + trajEngaged = 1; + trajCompleted = 0; +} + +/** + * Ajoute un breakpoint pour l'enchainement de trajectoires. + * + * @param axis l'axe moteur correspondant au LM rrer, peut valoir : @n + * #MOTOR_RIGHT le moteur de droite uniquement @n + * #MOTOR_LEFT le moteur de gauche uniquement @n + * #MOTOR_BOTH les 2 moteurs + * @param pos la position du breakpoint, depuis le dt de la trajectoire (rel = 0) + * ou par rapport a position finale dr(rel = 1), sur 16 bits + * @param rel indique si la position du breakpoint est exprimen valeur relative (rel = 1) ou absolue (rel = 0) +*/ +void setBreakpoint(char axis, DWORD pos, BOOL rel) { + DWORD_VAL posData; + + if (rel) { + posData.Val = pos; + writeCommand(axis, LM_CMD_SBPR); + writeDataWord(axis, posData.word.HW); + writeDataWord(axis, posData.word.LW); + } + else { + writeCommand(axis, LM_CMD_SBPA); + + if (axis == MOTOR_BOTH || 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) { + posData.Val = posRight + CON_MOTOR_RIGHT * pos; + writeDataWord(MOTOR_RIGHT, posData.word.HW); + writeDataWord(MOTOR_RIGHT, posData.word.LW); + } + } +} + +/** + * Rp la position dr(la consigne) des moteurs drminpar les LMs. + * Attention : cela ne correspond pas a position finale tteindre, mais bien + * a consigne 'instant prnt en entrde la boucle d'asservissement. + * + * @param axis l'axe moteur correspondant au LM, peut valoir : @n + * #MOTOR_RIGHT le moteur de droite uniquement @n + * #MOTOR_LEFT le moteur de gauche uniquement @n + * (spfier les #MOTOR_BOTH est bien demment impossible) + * + * @return DWORD la position de consigne, sur 32 bits +*/ +DWORD getDesiredPosition(char axis) { + DWORD_VAL posData; + + if (axis == MOTOR_BOTH) + return 0; + else { + writeCommand(axis, LM_CMD_RDDP); + posData.word.HW = readDataWord(axis); + posData.word.LW = readDataWord(axis); + return posData.Val; + } } /** @@ -638,6 +743,8 @@ void stop(char axis, WORD type) { * #MOTOR_RIGHT le moteur de droite uniquement @n * #MOTOR_LEFT le moteur de gauche uniquement @n * (spfier les #MOTOR_BOTH est bien demment impossible) + * + * @return DWORD la position rle, sur 32 bits */ DWORD getRealPosition(char axis) { DWORD_VAL posData; @@ -653,12 +760,39 @@ DWORD getRealPosition(char axis) { } /** + * Rp la vitesse dr(la consigne) des moteurs drminpar les LMs. + * Attention : cela ne correspond pas a vitesse finale tteindre, mais bien + * a consigne 'instant prnt en entrde la boucle d'asservissement. + * + * @param axis l'axe moteur correspondant au LM, peut valoir : @n + * #MOTOR_RIGHT le moteur de droite uniquement @n + * #MOTOR_LEFT le moteur de gauche uniquement @n + * (spfier les #MOTOR_BOTH est bien demment impossible) + * + * @return DWORD la vitesse de consigne, sur 32 bits +*/ +DWORD getDesiredVelocity(char axis) { + DWORD_VAL velData; + + if (axis == MOTOR_BOTH) + return 0; + else { + writeCommand(axis, LM_CMD_RDDV); + velData.word.HW = readDataWord(axis); + velData.word.LW = readDataWord(axis); + return velData.Val; + } +} + +/** * Rp la vitesse vtable des moteurs drminpar les LMs. * * @param axis l'axe moteur correspondant au LM, peut valoir : @n * #MOTOR_RIGHT le moteur de droite uniquement @n * #MOTOR_LEFT le moteur de gauche uniquement @n * (spfier les #MOTOR_BOTH est bien demment impossible) + * + * @return DWORD la vitesse rle, sur 32 bits */ DWORD getRealVelocity(char axis) { DWORD_VAL velData; @@ -680,6 +814,8 @@ DWORD getRealVelocity(char axis) { * #MOTOR_RIGHT le moteur de droite uniquement @n * #MOTOR_LEFT le moteur de gauche uniquement @n * (spfier les #MOTOR_BOTH est bien demment impossible) + * + * @return WORD la valeur de l'intation, sur 16 bits */ WORD getIntegrationSum(char axis) { if (axis == MOTOR_BOTH) @@ -691,6 +827,25 @@ WORD getIntegrationSum(char axis) { } /** + * Rp la valeur de la distance actuelle relativement au dt de la trajectoire. + * + * @param axis l'axe moteur correspondant au LM, peut valoir : @n + * #MOTOR_RIGHT le moteur de droite uniquement @n + * #MOTOR_LEFT le moteur de gauche uniquement @n + * (spfier les #MOTOR_BOTH est bien demment impossible) + * + * @return short la distance parcourue, en mm, sur 16 bits +*/ +short getRelPos(char axis) { + if (axis == MOTOR_RIGHT) + 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 + return 0; +} + +/** * Avance. * * @param pos position tteindre, en mm, sur 16 bits @@ -698,7 +853,6 @@ WORD getIntegrationSum(char axis) { * @param acc accration, en mm/s, sur 16 bits */ void moveForward(short pos, short vel, short acc) { - resetAllInterrupt(MOTOR_BOTH); newPosition(MOTOR_BOTH, (long) ((float) pos * COEF_RIGHT_WHEEL), (long) ((float) vel * COEF_RIGHT_WHEEL * CONST_VEL), @@ -714,7 +868,6 @@ void moveForward(short pos, short vel, short acc) { * @param acc accration, en mm/s, sur 16 bits */ void moveBackward(short pos, short vel, short acc) { - resetAllInterrupt(MOTOR_BOTH); newPosition(MOTOR_BOTH, - (long) ((float) pos * COEF_RIGHT_WHEEL), (long) ((float) vel * COEF_RIGHT_WHEEL * CONST_VEL), @@ -730,7 +883,6 @@ void moveBackward(short pos, short vel, short acc) { * @param acc accration, en mm/s, sur 16 bits */ void turnRight(short angle, short vel, short acc) { - resetAllInterrupt(MOTOR_BOTH); newPosition(MOTOR_RIGHT, - (long) ((float) angle * CONST_POS * WHEELS_DIST * COEF_RIGHT_WHEEL), (long) ((float) vel * COEF_RIGHT_WHEEL * CONST_VEL), @@ -750,7 +902,6 @@ void turnRight(short angle, short vel, short acc) { * @param acc accration, en mm/s, sur 16 bits */ void turnLeft(short angle, short vel, short acc) { - resetAllInterrupt(MOTOR_BOTH); newPosition(MOTOR_RIGHT, (long) ((float) angle * CONST_POS * WHEELS_DIST * COEF_RIGHT_WHEEL), (long) ((float) vel * COEF_RIGHT_WHEEL * CONST_VEL), @@ -770,7 +921,7 @@ void turnLeft(short angle, short vel, short acc) { * @param vel vitesse max., en mm/s, sur 16 bits * @param acc accration, en mm/s, sur 16 bits * @param c position du centre de rotation par rapport au milieu de l'axe des roues, en mm ou en %, sur 16 bits - * @param rel indique si c est exprimn mm (relative = 0) ou en % de la distance du milieu a roue, #WHEELS_DIST/2 (relative = 1) + * @param rel indique si c est exprimn mm (rel = 0) ou en % de la distance du milieu a roue, #WHEELS_DIST/2 (rel = 1) * * -100 0 100 * relative = 1: ||--------.--------|| @@ -797,8 +948,6 @@ void turn(short angle, short vel, short acc, short c, BOOL rel) { acc1 = (2.0 * d1d2 * (float) acc) / (1.0 + d1d2); acc2 = 2.0 * (float) acc - acc1; - resetAllInterrupt(MOTOR_BOTH); - newPosition(MOTOR_RIGHT, (long) (d1 * CONST_POS * COEF_RIGHT_WHEEL), (long) (vel1 * COEF_RIGHT_WHEEL * CONST_VEL), @@ -845,8 +994,6 @@ void goTo(short x, short y, short vel, short acc, BYTE mode, short d) { a = (((float) x)*((float) x) + ((float) y)*((float) y))/4.0; angle1 = atan2((float)y, (float)x); - resetAllInterrupt(MOTOR_BOTH); - if (mode == GOTO_STRAIGHT || d == 0) { turnRight(90.0 - angle1*180.0/PI, vel, acc); waitTrajComplete(); @@ -915,14 +1062,6 @@ void goTo(short x, short y, short vel, short acc, BYTE mode, short d) { } } -WORD getRelPosRight() { - return ((float) ((long) getRealPosition(MOTOR_RIGHT) - (long) posRight.Val) / (float) COEF_RIGHT_WHEEL); -} - -WORD getRelPosLeft() { - return ((float) ((long) getRealPosition(MOTOR_LEFT) - (long) posLeft.Val) / (float) COEF_LEFT_WHEEL); -} - /** * Indique si la derni trajectoire est termin * Attention : cette fonction renvoie 1 dque la trajectoire programm @@ -938,8 +1077,12 @@ WORD getRelPosLeft() { BOOL isTrajComplete(void) { // Delay10KTCYx(12); // attends 120000 cycles, 8 MHz / 4 = 10 ms - return (readStatusBit(MOTOR_RIGHT, LM_TRAJECTORY_COMPLETE) - && readStatusBit(MOTOR_LEFT, LM_TRAJECTORY_COMPLETE)); + if (trajCompleted) { + trajEngaged = 0; + return TRUE; + } + else + return FALSE; } /** @@ -954,4 +1097,15 @@ void waitTrajComplete(void) { while (!isTrajComplete()); } +/** + * Indique si une trajectoire est en cours. + * Si une trajectoire en cours est terminle rltat de cette fonction sera maintenu RUE + * jusqu'e qu'une des fonctions isTrajComplete() ou waitTrajComplete() soit appel + * + * @return done renvoie #TRUE en si une trajectoire est en cours et #FALSE sinon +*/ +BOOL isTrajEngaged(void) { + return trajEngaged; +} + #endif diff --git a/USB_Module/Motor_Controller/Firmware/lm629.h b/USB_Module/Motor_Controller/Firmware/lm629.h index 341794a..85aeba3 100644 --- a/USB_Module/Motor_Controller/Firmware/lm629.h +++ b/USB_Module/Motor_Controller/Firmware/lm629.h @@ -223,9 +223,12 @@ void resetAllInterrupt(char axis); void initLM(char axis, WORD kp, WORD ki, WORD kd, WORD il); // Fonctions de rptions des grandeurs actuelles +DWORD getDesiredPosition(char axis); DWORD getRealPosition(char axis); +DWORD getDesiredVelocity(char axis); DWORD getRealVelocity(char axis); WORD getIntegrationSum(char axis); +short getRelPos(char axis); // Fonctions de gration des trajectoires void newPosition(char axis, DWORD pos, DWORD vel, DWORD acc); @@ -233,6 +236,7 @@ void newVelocity(char axis, DWORD vel, DWORD acc, char dir); void changeVelocity(char axis, DWORD vel, char dir); void start(char axis); void stop(char axis, WORD type); +void setBreakpoint(char axis, DWORD pos, BOOL rel); // Fonctions de haut niveau BOOL initLMs(void); @@ -242,9 +246,8 @@ void turnRight(short angle, short vel, short acc); void turnLeft(short angle, short vel, short acc); void turn(short angle, short vel, short acc, short c, BOOL rel); void goTo(short x, short y, short vel, short acc, BYTE mode, short d); -WORD getRelPosRight(void); -WORD getRelPosLeft(void); BOOL isTrajComplete(void); void waitTrajComplete(void); +BOOL isTrajEngaged(void); #endif diff --git a/USB_Module/Motor_Controller/Firmware/main.c b/USB_Module/Motor_Controller/Firmware/main.c index 65ec694..bc5d400 100644 --- a/USB_Module/Motor_Controller/Firmware/main.c +++ b/USB_Module/Motor_Controller/Firmware/main.c @@ -574,7 +574,6 @@ void UserInit(void) void ProcessIO(void) { BYTE eeprom; static char state = 0; - static char traj_engaged = 0; DWORD_VAL dword; WORD_VAL word1, word2, word3, word4, word5; @@ -586,10 +585,9 @@ void ProcessIO(void) { // User Application USB tasks if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) { // Mesure de srit ce n'est pas normal de perdre la liaison USB au milieu d'une trajectoire - if (traj_engaged) { + if (isTrajEngaged()) { stop(MOTOR_BOTH, TRAJ_STOP_MOTOR_OFF); waitTrajComplete(); - traj_engaged = 0; } return; @@ -614,7 +612,7 @@ void ProcessIO(void) { errno = 31; } - if (!HIDTxHandleBusy(USBInHandle) && traj_engaged == 1) { + if (!HIDTxHandleBusy(USBInHandle) && isTrajEngaged()) { if (isTrajComplete()) { ToSendDataBuffer.HSEQ = 0; // Num sence PC ToSendDataBuffer.DSEQ = (UPClientSeq++); // Num sence PIC @@ -622,8 +620,6 @@ void ProcessIO(void) { ToSendDataBuffer.ERR = 0; // Pas Erreur ToSendDataBuffer.DATA[0] = TRAJ_COMPLETED; // On indique que c'est fini USBInHandle = HIDTxPacket(HID_EP, (BYTE*) &ToSendDataBuffer, 64); - - traj_engaged = 0; } } @@ -854,10 +850,9 @@ void ProcessIO(void) { disableMotor(ReceivedDataBuffer.DATA[1]); // Mesure de srit ce n'est pas normal que l'on dctive les moteurs au milieu d'une trajectoire - if (traj_engaged) { + if (isTrajEngaged()) { stop(MOTOR_BOTH, TRAJ_STOP_MOTOR_OFF); waitTrajComplete(); - traj_engaged = 0; } break; @@ -979,7 +974,6 @@ void ProcessIO(void) { word3.byte.HB = ReceivedDataBuffer.DATA[5]; word3.byte.LB = ReceivedDataBuffer.DATA[6]; moveForward(word1.Val, word2.Val, word3.Val); - traj_engaged = 1; break; case TRAJ_BACKWARD: @@ -990,7 +984,6 @@ void ProcessIO(void) { word3.byte.HB = ReceivedDataBuffer.DATA[5]; word3.byte.LB = ReceivedDataBuffer.DATA[6]; moveBackward(word1.Val, word2.Val, word3.Val); - traj_engaged = 1; break; case TRAJ_TR: @@ -1001,7 +994,6 @@ void ProcessIO(void) { word3.byte.HB = ReceivedDataBuffer.DATA[5]; word3.byte.LB = ReceivedDataBuffer.DATA[6]; turnRight(word1.Val, word2.Val, word3.Val); - traj_engaged = 1; break; case TRAJ_TL: @@ -1012,7 +1004,6 @@ void ProcessIO(void) { word3.byte.HB = ReceivedDataBuffer.DATA[5]; word3.byte.LB = ReceivedDataBuffer.DATA[6]; turnLeft(word1.Val, word2.Val, word3.Val); - traj_engaged = 1; break; case TRAJ_TURN: @@ -1025,7 +1016,6 @@ void ProcessIO(void) { word4.byte.HB = ReceivedDataBuffer.DATA[7]; word4.byte.LB = ReceivedDataBuffer.DATA[8]; turn(word1.Val, word2.Val, word3.Val, word4.Val, ReceivedDataBuffer.DATA[9]); - traj_engaged = 1; break; case TRAJ_GOTO: @@ -1040,7 +1030,6 @@ void ProcessIO(void) { word5.byte.HB = ReceivedDataBuffer.DATA[10]; word5.byte.LB = ReceivedDataBuffer.DATA[11]; goTo(word1.Val, word2.Val, word3.Val, word4.Val, ReceivedDataBuffer.DATA[9], word5.Val); - traj_engaged = 1; break; case TRAJ_STOP: @@ -1058,7 +1047,6 @@ void ProcessIO(void) { word3.byte.HB = ReceivedDataBuffer.DATA[6]; word3.byte.LB = ReceivedDataBuffer.DATA[7]; - resetAllInterrupt(ReceivedDataBuffer.DATA[1]); newPosition(ReceivedDataBuffer.DATA[1], (long) ((float) word1.Val * COEF_WHEEL), (long) ((float) word2.Val * COEF_WHEEL * CONST_VEL), @@ -1071,7 +1059,6 @@ void ProcessIO(void) { word2.byte.HB = ReceivedDataBuffer.DATA[4]; word2.byte.LB = ReceivedDataBuffer.DATA[5]; - resetAllInterrupt(ReceivedDataBuffer.DATA[1]); newVelocity(ReceivedDataBuffer.DATA[1], (long) ((float) word1.Val * COEF_WHEEL * CONST_VEL), (long) ((float) word2.Val * COEF_WHEEL * CONST_ACC), @@ -1082,7 +1069,6 @@ void ProcessIO(void) { word1.byte.HB = ReceivedDataBuffer.DATA[2]; word1.byte.LB = ReceivedDataBuffer.DATA[3]; - resetAllInterrupt(ReceivedDataBuffer.DATA[1]); changeVelocity(ReceivedDataBuffer.DATA[1], (long) ((float) word1.Val * COEF_WHEEL * CONST_VEL), ReceivedDataBuffer.DATA[4]); @@ -1090,20 +1076,19 @@ void ProcessIO(void) { case TRAJ_START: start(ReceivedDataBuffer.DATA[1]); - traj_engaged = 1; break; case TRAJ_GET_REL_POS: - word1.Val = getRelPosRight(); - word2.Val = getRelPosLeft(); - ToSendDataBuffer.HSEQ = ReceivedDataBuffer.HSEQ; // Num sence PC ToSendDataBuffer.DSEQ = 0; // Num sence PIC ToSendDataBuffer.CMD = CMD_RESPOND; // Type requ ToSendDataBuffer.ERR = 0; // Erreur + word1.Val = getRelPos(MOTOR_RIGHT); ToSendDataBuffer.DATA[0] = word1.byte.HB; ToSendDataBuffer.DATA[1] = word1.byte.LB; + + word1.Val = getRelPos(MOTOR_LEFT); ToSendDataBuffer.DATA[2] = word2.byte.HB; ToSendDataBuffer.DATA[3] = word2.byte.LB; diff --git a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.cof b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.cof index 442d6f5..e76d155 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 12343c1..91a16f9 100644 --- a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.hex +++ b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.hex @@ -1,1544 +1,1563 @@ :020000040000FA -:06000000A6EF32F0120031 +:0600000041EF33F0120095 :0600080004EF04F01200F9 :060018000CEF04F01200E1 -:06080000A6EF32F0120029 -:0608080046EF12F01200A1 -:06081800B3EF12F0120024 -:06082A000400DF65000080 -:100830002601000021000000D76500005F010000D4 -:1008400008000000C9650000470100000E0000001C -:0C085000C66500006A0100000300000003 -:04085C00020E11EC8B -:1008600011F004E1020EE6EC10F00BE00A0EE66E69 -:1008700046EC32F0E552020EE66EE66AE66E9CEC5D -:100880000FF0200E11EC11F004E1200EE6EC10F058 -:100890000CE00B0EE66E46EC32F0E552200EE66EF2 -:1008A000E66A020EE66E9CEC0FF0120027EC0EF0EA -:1008B000FE0EDB5006E1F80E96163C0E9416959847 -:1008C00008D0FE0EDB0405E1070E9612C30E94124B -:1008D00095882CEF0EF0D9CFE6FFE1CFD9FFE65295 -:1008E000010EE66EE3DFE5528098FE0EDB5004E079 -:1008F000FE0EDB5002080FE1839C808A0000839E7D -:100900000000000000008450010BDF6E838E0000A9 -:100910000000DF04F4E0FE0EDB0404E0FE0EDB501A -:1009200002080FE1838C809A0000839E0000000083 -:1009300000008450010BDF6E838E00000000DF0496 -:10094000F4E0E552E552E7CFD9FF1200D9CFE6FF38 -:10095000E1CFD9FFE652FD0EDB50DF6EFE0EDBCF9E -:10096000E6FFB9DFE552E66AA1DFE552FE0EDB5095 -:1009700003E1839C808A0CD0FE0EDB0403E1838CB0 -:10098000809A06D0FE0EDB50020802E1839C809A1A -:10099000809800008096D9CFE9FFDACFEAFFEF50C8 -:1009A000010B02E0848001D08490D9CFE9FFDACF37 -:1009B000EAFFEF50020B02E0848201D08492D9CF8B -:1009C000E9FFDACFEAFFEF50040B02E0848401D0A4 -:1009D0008494D9CFE9FFDACFEAFFEF50080B02E0A9 -:1009E000838801D08398D9CFE9FFDACFEAFFEF50AF -:1009F000100B02E0828201D08292D9CFE9FFDACFD8 -:100A0000EAFFEF50200B02E0828E01D0829ED9CF08 -:100A1000E9FFDACFEAFFEF50400B02E0828001D01D -:100A20008290D9CFE9FFDACFEAFFEF50800B02E0E6 -:100A3000828C01D0829C00000000808600000000B3 -:100A4000E552E552E7CFD9FF1200D9CFE6FFE1CF5B -:100A5000D9FF020EE126FC0EDBCFDEFFDBCFDDFF90 -:100A6000FE0EDBCFE6FF37DFE552E66A1FDFE55219 -:100A7000FE0EDB5003E1839C808A0CD0FE0EDB046B -:100A800003E1838C809A06D0FE0EDB50020802E15F -:100A9000839C809A808800008096D9CFE9FFDACFC6 -:100AA000EAFFEE52EF50010B02E0848001D0849007 -:100AB000D9CFE9FFDACFEAFFEE52EF50020B02E0A6 -:100AC000848201D08492D9CFE9FFDACFEAFFEE52D7 -:100AD000EF50040B02E0848401D08494D9CFE9FF65 -:100AE000DACFEAFFEE52EF50080B02E0838801D024 -:100AF0008398D9CFE9FFDACFEAFFEE52EF50100B1F -:100B000002E0828201D08292D9CFE9FFDACFEAFFF8 -:100B1000EE52EF50200B02E0828E01D0829ED9CFA0 -:100B2000E9FFDACFEAFFEE52EF50400B02E082809D -:100B300001D08290D9CFE9FFDACFEAFFEE52EF5031 -:100B4000800B02E0828C01D0829C00000000808635 -:100B5000000000008096D9CFE9FFDACFEAFFEF501E -:100B6000010B02E0848001D08490D9CFE9FFDACF75 -:100B7000EAFFEF50020B02E0848201D08492D9CFC9 -:100B8000E9FFDACFEAFFEF50040B02E0848401D0E2 -:100B90008494D9CFE9FFDACFEAFFEF50080B02E0E7 -:100BA000838801D08398D9CFE9FFDACFEAFFEF50ED -:100BB000100B02E0828201D08292D9CFE9FFDACF16 -:100BC000EAFFEF50200B02E0828E01D0829ED9CF47 -:100BD000E9FFDACFEAFFEF50400B02E0828001D05C -:100BE0008290D9CFE9FFDACFEAFFEF50800B02E025 -:100BF000828C01D0829C00000000808600000000F2 -:100C0000020EE15C02E2E16AE552E16EE552E7CFF5 -:100C1000D9FF1200D9CFE6FFE1CFD9FF020EE126BE -:100C2000FE0EDBCFE6FF57DEE552010EE66E3EDE3E -:100C3000E552FE0EDB5003E1839C808A05D0FE0E58 -:100C4000DB0402E1838C809A80880000839E000090 -:100C5000000000008450010B066E8450020B01E07E -:100C6000010EE824056E8450040B01E0010E040D12 -:100C7000F3CF04F08350100B01E0010E080DF3CF09 -:100C800003F08250020B01E0010E100DF3CF02F0D1 -:100C90008250800B01E0010E200DF3CF01F0825055 -:100CA000010B400DF3CF00F08250400B01E0010E2C -:100CB000800DF350001001100210031004100510F5 -:100CC0000610E76E010EE7CFDBFF838E0000000009 -:100CD000839E0000000000008450010B066E8450CB -:100CE000020B01E0010EE824056E8450040B01E0C4 -:100CF000010E040DF3CF04F08350100B01E0010E40 -:100D0000080DF3CF03F08250020B01E0010E100D2D -:100D1000F3CF02F08250800B01E0010E200DF3CFE3 -:100D200001F08250010B400DF3CF00F08250400BD8 -:100D300001E0010E800DF3500010011002100310AD -:100D4000041005100610DF6E838EDECF00F0DDCFBD -:100D500001F000C0F3FF01C0F4FF00D0020EE15C1F -:100D600002E2E16AE552E16EE552E7CFD9FF1200F7 -:100D7000D9CFE6FFE1CFD9FFE652DF6AFE0EDBCF27 -:100D8000E6FFA9DDE552010EE66E90DDE552FE0EAE -:100D9000DB5003E1839C808A05D0FE0EDB0402E178 -:100DA000838C809A80980000839E000000000000E1 -:100DB0008450010B066E8450020B01E0010EE82402 -:100DC000056E8450040B01E0010E040DF3CF04F016 -:100DD0008350100B01E0010E080DF3CF03F0825099 -:100DE000020B01E0010E100DF3CF02F08250800BD8 -:100DF00001E0010E200DF3CF01F08250010B400DF8 -:100E0000F3CF00F08250400B01E0010E800DF35053 -:100E10000010011002100310041005100610DF6E00 -:100E2000838EDF5000D0E552E552E7CFD9FF1200A4 -:100E300027EC0EF0FD0EDBCFE6FFA3EC0EF0E55243 -:100E4000E71402E1000E01D0010E2CEF0EF027ECAA -:100E50000EF01D0EABEC0DF0D8EC11F02CEF0EF0F7 -:100E600027EC0EF0000EE66EE66AB8EC10F09CEC93 -:100E70000FF02CEF0EF027EC0EF0A3EC0EF0840830 -:100E80000DE0A3EC0EF0C40809E0E66AB8EC10F03F -:100E9000AAEC0FF079EC32F0E552EFD71C0EABEC78 -:100EA0000DF0220E15EC11F0AEEC0FF0A3EC0EF0ED -:100EB000800804E0A3EC0EF0C008E7E1A3EC0EF01C -:100EC000C00802E1AEEC0FF01E0EABEC0DF00F0E01 -:100ED00015EC11F0D8EC11F0FA0EDBCFE6FFFB0EAB -:100EE0006CEC10F0F80EDBCFE6FFF90E6CEC10F0B6 -:100EF000F60EDBCFE6FFF70E6CEC10F0040EABEC59 -:100F00000DF01A0EABEC0DF0100EE66E270EE66E2D -:100F10009FEC0DF02CEF0EF027EC0EF0080EE12602 -:100F2000010E08EC0EF0010EE7CFDBFF020E19EC0C -:100F300011F0DF6E030E08EC0EF0030EE7CFDBFFBF -:100F4000040E08EC0EF0020EE7CFDBFF050E08ECF6 -:100F50000EF0050EE7CFDBFF060E08EC0EF0040ED8 -:100F6000E7CFDBFF070E08EC0EF0070EE7CFDBFF45 -:100F7000080E08EC0EF083EC0EF0E66AB3EC0FF00E -:100F8000090E08EC0EF0010EE7CFDBFF0A0E19EC9C -:100F900011F0DF6E0B0E08EC0EF0030EE7CFDBFF57 -:100FA0000C0E08EC0EF0020EE7CFDBFF0D0E08EC86 -:100FB0000EF0050EE7CFDBFF0E0E08EC0EF0040E70 -:100FC000E7CFDBFF0F0E08EC0EF0070EE7CFDBFFDD -:100FD000100E08EC0EF083EC0EF0010EE66EB3EC92 -:100FE0000FF0020EE66EE66EAAEC0FF0E66A94ECE5 -:100FF0000EF004E1020EE6EC10F002E0000E01D06B -:10100000010E006E080EE15C02E2E16AE552E16E5B -:1010100000502CEF0EF027EC0EF00C0EE126B9EC90 -:101020000EF0D950F20FE9EC10F0080EEECFDBFF16 -:10103000090EEECFDBFF0A0EEECFDBFF0B0EEECF7D -:10104000DBFF1F0EABEC0DF019EC0FF000500110A0 -:10105000021003100CE02B0E15EC11F00A0EDBCF82 -:10106000E6FF0B0E6CEC10F0FEEC0EF003D00B0E56 -:10107000E66EE66A9FEC0DF0C7EC11F066EC0FF03F -:1010800009E1AFEC0DF09FEC0DF0C7EC10F0B8ECFF -:1010900010F01CD066EC0FF003E0FE0EDB0408E15C -:1010A000AFEC0DF05AEC0FF0C7EC10F05AEC0FF06B -:1010B00066EC0FF003E0FE0EDB500AE1AFEC0DF042 -:1010C000E66A98EC10F0C7EC10F0E66A98EC10F0C5 -:1010D0000C0EE15C02E2E16AE552E16E2CEF0EF0EB -:1010E00027EC0EF00A0EE126D9CFE9FFDACFEAFFAE -:1010F000FA0EDBCFEEFFFB0EDBCFEEFFFC0EDBCFFD -:10110000EEFFFD0EDBCFEEFFB9EC0EF0080EF36E36 -:10111000DB6E090EF3CFDBFF1F0EABEC0DF0CFEC57 -:101120000EF007E0D950080FE96EDACFEAFFEE8A39 -:10113000ED5266EC0FF00BE1F50EDB50FF0802E11B -:101140005EEC0FF0FEEC0EF0B8EC10F01FD066EC89 -:101150000FF003E0FE0EDB040AE1F50EDB50FF08A2 -:1011600002E15EEC0FF0FEEC0EF05AEC0FF066ECD4 -:101170000FF003E0FE0EDB500BE1F50EDB50FF0835 -:1011800002E15EEC0FF0FEEC0EF0E66A98EC10F077 -:10119000CFEC0EF002E0C7EC11F0020EDBCFE6FF61 -:1011A000030E6CEC10F0C7EC10F09FEC0DF00A0E83 -:1011B000E15C02E2E16AE552E16E2CEF0EF027EC11 -:1011C0000EF0F90EDBCFE6FFE66AE66AE66AE66A4B -:1011D000D950FA0FE9EC10F0D0EC10F0B8EC10F0A8 -:1011E0007FDF006E0A0EE15E00502CEF0EF027EC60 -:1011F0000EF0FE0EDB5003E066EC0FF013E10A0E7A -:10120000E66EE66AEEEC10F0E66A24EC11F0F3CF3D -:1012100061F1F4CF62F1E66A24EC11F0F3CF5FF1F3 -:10122000F4CF60F1FE0EDB0403E066EC0FF015E195 -:101230000A0EC1EC0FF0EEEC10F0010EE66E24EC9D -:1012400011F0F3CF65F1F4CF66F1010EE66E24ECF8 -:1012500011F0F3CF63F1F4CF64F1010EABEC0DF0BC -:101260002CEF0EF027EC0EF01F0EABEC0DF0D8ECCF -:1012700011F0010EABEC0DF02CEF0EF0F8EC10F0CD -:1012800005E12D6A2E6A2F6A306A0BD00A0EFDEC3A -:1012900010F005EC0FF0F3CFDEFFF4CFDDFF73ECC1 -:1012A0000FF0040EE15C02E2E16AE552E16E2CEF20 -:1012B0000EF0F8EC10F005E12D6A2E6A2F6A306A04 -:1012C00007D00B0EFDEC10F0DE6ADD6A73EC0FF058 -:1012D000040EE15C02E2E16AE552E16E2CEF0EF0F1 -:1012E00027EC0EF066EC0FF003E1F36AF46A05D028 -:1012F0000D0EABEC0DF005EC0FF02CEF0EF0D9EC71 -:1013000010F08CEC0FF09AEC0EF02CEF0EF0D9EC04 -:1013100010F06DEC0EF0020E9AEC0EF02CEF0EF0C9 -:10132000F6EC11F06DEC0EF0E66A75DEA5EC0FF050 -:10133000D6EC0FF088EC10F0B2EF10F0F6EC11F0F4 -:10134000A8EC0EF0A5EC0FF0D6EC0FF06DEC0EF063 -:10135000010EB2EF10F027EC0EF01C0EE126F60E97 -:10136000DB501EE0006A800E016E010E026E430E1D -:10137000036E31EC12F0336A346AC80E356E420ED9 -:10138000366E79EC24F075EC11F0C7DBB1EC11F09E -:1013900039EC25F0F70E2FC0DBFFF80E30C0DBFF75 -:1013A0009BEC10F0EBEC0DF001EC11F00C6A800EF0 -:1013B0000D6E010E0E6E430E0F6EF1EC11F071EC1E -:1013C00011F05AEC10F07EEC0FF0A7DBB1EC11F04D -:1013D0002EC0DEFF2FC0DEFF30C0DEFF31C0DDFFDC -:1013E000DD52DD52E0EC0EF008EC0FF0CCEC24F016 -:1013F00075EC11F001EC11F0106A800E116E010E07 -:10140000126E430E136EF1EC11F068EC10F025EC47 -:1014100012F0B1EC11F0040E2EC0DBFF050E2FC050 -:10142000DBFF060E30C0DBFF070E31C0DBFFDECF77 -:101430002EF0DECF2FF0DECF30F0DDCF31F0DD52F9 -:10144000DD52040EDBCF33F0050EDBCF34F0060E99 -:10145000DBCF35F0070EFAEC11F0080E2EC0DBFFE3 -:10146000090E2FC0DBFF0A0E30C0DBFF0B0E31C0B0 -:10147000DBFF080EDBCF04F0090EDBCF05F00A0E10 -:10148000DBCF06F00B0EDBCF07F0336A346A356A28 -:10149000366A86DB9FEC25F0010A03E019EC0FF0B9 -:1014A00013D0080EDBCF08F0090EDBCF09F00A0ECF -:1014B000DBCF0AF00B0EDBCF0BF008EC0FF0B5EC36 -:1014C00011F0CCEC24F032DB080E00C0DBFF090E7B -:1014D00001C0DBFF0A0E02C0DBFF0B0E03C0DBFF07 -:1014E000CDDBE3EC0EF0CDEC0FF029EC10F040EC8E -:1014F0000FF0046A056A066A400E076EA0EC10F051 -:1015000071EC11F0CDEC0FF0DEEC11F00FDB0C0EF6 -:10151000DBCF0CF00D0EDBCF0DF00E0EDBCF0EF09F -:101520000F0EDBCF0FF082EC0FF026EC0FF0A6DBF6 -:1015300075EC11F016EC12F029EC10F0E6EC0EF060 -:10154000066A400E076E16EC12F0DEEC11F01EEC8F -:1015500011F082EC0FF033EC0FF0C9EC0EF0140E2A -:10156000DBCF08F0150EDBCF09F0160EDBCF0AF04B -:10157000170E24DB0C0EDBCF14F00D0EDBCF15F0B5 -:101580000E0EDBCF16F00F0E1FDBD9CFE9FFDACF3F -:10159000EAFFEECF20F0EECF21F0EECF22F0EFCF3A -:1015A00023F08BEC10F0D4DB246E0D0EE15E2450A2 -:1015B000180EDBCF08F0190EDBCF09F01A0EDBCFC7 -:1015C0000AF01B0EFBDA100EDBCF14F0110EDBCF8E -:1015D00015F0120EDBCF16F0130EF6DA040EDBCF89 -:1015E00020F0050EDBCF21F0060EDBCF22F0070E38 -:1015F000DBCF23F08BEC10F088EC10F0E66E0BDD07 -:10160000246E0D0EE15E2450EBEC11F01C0EE15C3B -:1016100002E2E16AE552E16E1FD319DB3C0EE126DE -:10162000CFDB3CEC12F07EEC11F0B5EC11F0CCEC21 -:1016300024F0C9DB9AEC11F0A0EC10F071EC11F081 -:1016400093EC0FF06ADA70EC10F067DAA9DAE3ECE9 -:1016500023F06CDA336A346A800E6EEC0FF0380EC9 -:101660002EC0DBFF390E2FC0DBFF3A0E30C0DBFF90 -:101670003B0E31C0DBFF3CEC12F058DA6DDBA0EC26 -:1016800010F0A9DA69DB2BEC2DF0086E080EE15E94 -:101690000850080E2DC0DBFF090E2EC0DBFF0A0E1E -:1016A0002FC0DBFF0B0E30C0DBFF73DBF60EDB5011 -:1016B00007E0D950F40FE9EC10F0EE50ED1039E1ED -:1016C000EEDA080EDBCF0EF0090EDBCF0FF00A0EBC -:1016D000DBCF10F00B0EF1EC0FF0FED9A5EC10F003 -:1016E0002E6A2F6A800E306E400E316E380EDBCFC0 -:1016F00033F0390EDBCF34F03A0EDBCF35F03B0E52 -:10170000CCEC10F02DDB28DB8ADB2DC002F02EC0E4 -:1017100003F02FC004F030C005F02DC02EF006EC11 -:1017200011F0BCEC10F0EBDD0A6E060EE15E0A5023 -:10173000A3D1380EDBCF04F0390EDBCF05F03A0E23 -:10174000DBCF06F03B0EDBCF07F0F9DB3FEC12F00E -:10175000CCEC24F0CDEC0FF01DEC12F0CFDAE3DB93 -:1017600021EC11F09AEC11F0D8D9ECD9E3EC23F08C -:101770002DDB28EC11F09BEC10F068EC10F0B1ECD4 -:1017800011F071DB046A056A28EC11F0A0EC10F08E -:1017900068EC10F0B1EC11F01C0E2EC0DBFF1D0E3A -:1017A0002FC0DBFF1E0E30C0DBFF1F0E31C0DBFF82 -:1017B0001C0EDBCF00F01D0EDBCF01F01E0EDBCFC9 -:1017C00002F01F0EDBCF03F023DBB1EC11F0200E93 -:1017D0002EC0DBFF210E2FC0DBFF220E30C0DBFF4F -:1017E000230E31C0DBFFD950180FE96EDACFEAFFC4 -:1017F000240EEECFDBFF250EEECFDBFF260EEECF65 -:10180000DBFF270EEECFDBFF9BEC10F0D2EC11F0EC -:10181000200EDBCF33F0210EDBCF34F0220EDBCFF6 -:1018200035F0230E00EC12F0280E2EC0DBFF290E3F -:101830002FC0DBFF2A0E30C0DBFF2B0E31C0DBFFD9 -:10184000A0EC10F0D2EC11F0240EDBCF33F0250E1B -:10185000DBCF34F0260EDBCF35F0270E00EC12F094 -:101860002C0E2EC0DBFF2D0E2FC0DBFF2E0E30C046 -:10187000DBFF2F0E31C0DBFF2C0EDBCF04F02D0E73 -:10188000DBCF05F02E0EDBCF06F02F0EDBCF07F0FF -:10189000BFDA86D9CCEC24F07CEC10F0300E2EC0F0 -:1018A000DBFF310E2FC0DBFF320E30C0DBFF330E0B -:1018B00031C0DBFF280EDBCF2EF0290EDBCF2FF05F -:1018C0002A0EDBCF30F02B0EDBCF31F07CEC10F0AA -:1018D000340E2EC0DBFF350E2FC0DBFF360E30C0BE -:1018E000DBFF370E31C0DBFFD950300FB9D9D950EB -:1018F000340FB6D92BEC2DF0006E080EE15E0050CF -:101900000C0E2DC0DBFF0D0E2EC0DBFF0E0E2FC008 -:10191000DBFF0F0E30C0DBFF006A016A026A400E77 -:10192000036E00C0E6FF01C0E6FF02C0E6FFE66E00 -:10193000BED93FEC12F0E2DA0FDAC2EC10F02DC0A3 -:1019400014F02EC015F02FC016F030C017F064EC64 -:1019500011F02BEC2DF0186E080EE15E1850E552D8 -:10196000E7CF03F0E552E7CF02F0E552E7CF01F011 -:10197000E552E7CF00F02DC004F02EC005F02FC0D7 -:1019800006F030C007F031DAB1EC11F05FDAF60E94 -:10199000DB5002081FE1A3EC11F0E2EC23F0E4ECD1 -:1019A00011F0E3EC23F027D978DA060E2FC0DBFF25 -:1019B000070E30C0DBFF000EDFCF2FF0010E0BD97A -:1019C000020EF3EC10F0E9DA79DB040E2FC0DBFF36 -:1019D000050E35D053D9AAD80C0EDBCF04F00D0E6E -:1019E000DBCF05F00E0EDBCF06F00F0EDBCF07F0DE -:1019F00004C033F005C034F006C035F007C036F03F -:101A0000E2EC23F03DDAA3EC11F0E3EC23F0E4EC9C -:101A100011F0E2EC23F0EFD840DA040E2FC0DBFF28 -:101A2000050E30C0DBFF020EDBCF2FF0030ED3D844 -:101A3000C5DBB3DA43DB060E2FC0DBFF070E30C079 -:101A4000DBFF4AD8B6D8040EDBCF2FF0050E9DDAA7 -:101A500064EC11F0B3DB4DD87BD9206E0D0EE15E46 -:101A60002050A7D8060EDBCF2FF0070E8EDA54DAFF -:101A7000BADB3FD84DDB5ED93C0EE15C02E2E16AA5 -:101A8000E552E16EE9D0E66A3EEC09F0E55201016B -:101A90005F512D5C066E60512E58076E61512F58B4 -:101AA000086E6251B8D0010EE66E3EEC09F0E552C8 -:101AB000010163512D5C066E64512E58076E65510D -:101AC0002F58086E6651A7D0040EABDB03E0040E5E -:101AD0007DDB01E1000C010CF7DF0009FDE01200E5 -:101AE00016EC12F0F5DB9FDA2BDB4FDAEDDB23DBB4 -:101AF0006BD32EC01CF02FC01DF030C01EF031C0C3 -:101B00001FF0E6DB42EC12F02DC018F02EC019F0E9 -:101B10002FC01AF030C01BF012002EC033F02FC0BF -:101B200034F030C035F031C036F012002EC000F075 -:101B30002FC001F030C002F031C003F0120018DBFA -:101B400098EF10F000C02EF001C02FF002C030F06E -:101B500003C031F01200E66E0BDBEEEF10F0FA0E70 -:101B6000DBCF00F0FB0EDBCF01F0FC0EDBCF02F091 -:101B7000FD0EDBCF03F0000E006C011E0122021EE1 -:101B80000222031E032200C0DFFF010E01C0DBFFA3 -:101B9000020E02C0DBFF030E03C0DBFF04EF12F0F6 -:101BA00004C02EF005C02FF006C030F007C031F0A1 -:101BB000120031EC12F08CDB13EF10F0DBCF0BF0E6 -:101BC00087DBD3DB13EF10F0DBCF17F081DB88DA94 -:101BD0009FDB64EF11F085DB75EF11F002C02EF092 -:101BE00015DBE2EC23F0C8DA90EC09F0126E060E79 -:101BF000E15E12501200100EDBCF33F0110EDBCF7E -:101C000034F0120EDBCF35F0130EC6DA39EF25F0C3 -:101C100010DBE76E12003058096E06C02DF007C0C9 -:101C20002EF008C02FF0306EC9EC23F02EC002F069 -:101C30002FC003F030C004F031C005F049DB79EC6F -:101C400024F0E9DB2FC0F3FF30C0F4FF1200D9CF3E -:101C5000E6FFE1CFD9FF1200E552E7CFD9FF12002E -:101C6000E96EDACFEAFFD0EF10F00CC02EF00DC015 -:101C70002FF00EC030F00FC031F012002E6A2F6A24 -:101C8000306A400E316E080EDBCF33F0090EDBCF29 -:101C900034F00A0EDBCF35F00B0ECCEF10F055DA36 -:101CA000026A036AB40E046E420E056E1200140E30 -:101CB000DBCF0CF0150EDBCF0DF0160EDBCF0EF0E8 -:101CC000170EDBCF0FF01200350E336EFA0E346EA6 -:101CD0000E0E356E3C0E366E1200000E186C191E7C -:101CE00019221A1E1A221B1E1B2218C0E6FF19C039 -:101CF000E6FF1AC0E6FF1BC0E6FF1200F40EDBCFC2 -:101D00002FF0F50E61D2060EE7CFDBFFDBCFE6FF4B -:101D1000070EDBCFE6FF040EDBCFE6FF050EDBCFC1 -:101D2000E6FF72DBC7EF10F018EC07F0E552E55262 -:101D300000091200E66E0BEC08F0206E0D0EE15E5D -:101D40002050EBEF11F014DAB8EC06F0E552120077 -:101D5000BBDAE66A0BEF08F088DB31C0E6FF120061 -:101D60002EC006F02FC007F030C008F031C009F0D7 -:101D70001200D950F60F2DDA040EEECFDBFF050E60 -:101D8000EECFDBFF060EEECFDBFF070EEECFDBFF65 -:101D90001200020EE66E30EC07F0E5521200040E5F -:101DA000DBCF00F0050EDBCF01F0060EDBCF02F03B -:101DB000070EDBCF03F000500110021003101200D9 -:101DC0005BDBCDEF0FF091DABBD9FED1140E2EC044 -:101DD000DBFF150E2FC0DBFF160E30C0DBFF170E2A -:101DE00031C0DBFF046A056A12002DC033F02EC03B -:101DF00034F02FC035F030C036F01200080EDBCFC3 -:101E0000E6FF090EDBCFE6FF1200B2D924EF11F096 -:101E1000336A346A800E356EBF0E366E12003EECA9 -:101E200029F0E552FFD2336A346A356A400E366EC5 -:101E30001200080EDBCF00F0090EDBCF01F00A0E16 -:101E4000DBCF02F00B0EDBCF03F01200100E2EC022 -:101E5000DBFF110E2FC0DBFF120E30C0DBFF130EB5 -:101E600031C0DBFF1200180E2EC0DBFF190E2FC091 -:101E7000DBFF1A0E30C0DBFF1B0E31C0DBFF120090 -:101E80000C0E2EC0DBFF0D0E2FC0DBFF0E0E30C080 -:101E9000DBFF0F0E31C0DBFF1200020E2FC0DBFF95 -:101EA000030E30C0DBFFF90EDBCF2FF0FA0EDBCFD5 -:101EB00030F01200010EE66E98EF10F0D950080FC6 -:101EC000E96EDACFEAFFEE52ED881200FE0EDB502B -:101ED00002081200356E430E366E1200356E400E4B -:101EE000366E79EF24F0DECF2DF0DECF2EF0DECF90 -:101EF0002FF0DDCF30F0DD52DD521200E2EC23F0A6 -:101F0000CDEF0FF00CC033F00DC034F00EC035F043 -:101F10000FC036F0E2EF23F0D7D9020E1200336A79 -:101F2000800E346E12002EC018F02FC019F030C091 -:101F30001AF031C01BF0120027EC07F073D20C6AC4 -:101F40000D6A0E6A400E0F6E1200286E0D0EE15ED5 -:101F50002850120043D9020EE66E120009D930EC67 -:101F600007F0E55212003BEC07F0006E090EE15E4F -:101F700000501200020EF3CFDBFF030EF4CFDBFFA5 -:101F80001200E66E010EE66E1200ABD9D3D9A0D9CD -:101F9000CCEC24F0F3D988EF11F02EC008F02FC05C -:101FA00009F030C00AF031C00BF0120099DD2EC0EC -:101FB00024F02FC025F030C026F031C027F084DE99 -:101FC000CCEC24F02EC020F02FC021F030C022F045 -:101FD00031C023F0A4DF810E7DDFCCEC24F079EF5B -:101FE0000DF0DBCF11F0336A346A340E73DF0EC0AC -:101FF0002EF00FC02FF010C030F011C031F0CCEC3B -:1020000024F02EC00AF02FC00BF030C00CF031C00D -:102010000DF0DB0E336E0F0E346E490E5FDFA0DE67 -:102020007CDDEEEF0DF0CCEC24F05FD9CC0E336EFE -:10203000BC0E346E8C0E356E3B0E366E23DA2DC020 -:1020400000F02EC001F02FC002F030C003F064EFAA -:1020500011F0B4D96BDD106A116A800E126E3F0E5A -:10206000136E080EDBCF14F0090EDBCF15F00A0E4D -:10207000DBCF16F00B0EDBCF17F014C033F015C01A -:1020800034F016C035F017C036F0DFD95BDD79EFDC -:1020900024F0140EDBCF00F0150EDBCF01F0160E8E -:1020A000DBCF02F0170EDBCF03F039DF010E12DFBA -:1020B000A2EF0DF063D931DD35EF0EF0BED9F90E88 -:1020C000DBCF2FF0FA0E0DD919D94BD939EF25F006 -:1020D00008D930D98DEF0DF0DBCFE6FF9FEF0DF083 -:1020E00014C02EF015C02FF016C030F017C031F01C -:1020F000CCEC24F0BEEF11F0140EDBCF33F0150E54 -:10210000DBCF34F0160EDBCF35F0170EFAEF11F0FF -:10211000DBD8010E1200D8DD20C02EF021C02FF038 -:1021200022C030F023C031F0CCEC24F079EF0DF078 -:1021300025EC05F077D1FD0EDBCF2FF0FE0E12005F -:10214000FB0EDBCF2FF0FC0E1200F70EDBCFE6FF0D -:10215000F80EDBCFE6FFF90EDBCFE6FFFA0EDBCFA2 -:10216000E6FF1200E66E0BEC08F0EFDE34D974D512 -:10217000FE0EDBCFE6FF12004ED92FC0E6FF30C0C7 -:10218000E6FF1200D950380F6BDD0FEF0FF0DECFF6 -:10219000E6FFDDCFE6FF1200DBCF36F0CCEF24F018 -:1021A000EECFE6FFEECFE6FFEECFE6FFEFCFE6FFA6 -:1021B00012004DDDEEDD94DC79EF0DF0000EDFCF87 -:1021C0002FF0010E71EF11F071EF11F0DADE94EFE4 -:1021D0000EF0E96EFF0EDA20EA6E1200A6EC04F0B3 -:1021E000E552E5521200DBCF2FF0030E71EF11F034 -:1021F0002EDD040EE12666EF0FF0ADDC06DEBAEF51 -:102200000FF011DECCEC24F096EF0DF003C02FF0B0 -:1022100004C030F005C031F012007FDC93DCE2EF47 -:1022200023F0E66EE66A94EF0EF0E66EE66A9FEF44 -:102230000DF0E66E98EC31F0E552120077DC57EFC6 -:102240000EF0F1DD79EF24F00AEC06F0E552120011 -:10225000800E066E3F0E076E72DE04C0E6FF05C0FC -:10226000E6FF06C0E6FF07C0E6FF0CC0E6FF0DC0B4 -:10227000E6FF0EC0E6FFE66E85DFE552E7CF0FF022 -:10228000E552E7CF0EF0E552E7CF0DF0E552E7CF8C -:102290000CF0E552E7CF07F0E552E7CF06F0E55244 -:1022A000E7CF05F0E552E7CF04F02DC010F02EC0C7 -:1022B00011F02FC012F030C013F097DDD6DCCCEC5B -:1022C00024F06BDE1DEF12F02DC0E6FF35EF12F0AB -:1022D000330E336EE20E346EC20E356E420E366E23 -:1022E0001200DBCF30F0B4EF23F02EC004F02FC08B -:1022F00005F030C006F031C007F012002EC00CF01F -:102300002FC00DF030C00EF031C00FF08DEF0DF08A -:10231000BD0E336E370E346E860E356E410E366E40 -:10232000B1D82DC00CF02EC00DF02FC00EF030C073 -:102330000FF012002EC014F02FC015F030C016F0B0 -:1023400031C017F01200ABDC0C0EDBCF0EF00D0E1F -:10235000DBCF0FF00E0EDBCF10F00F0E42DE49EF99 -:1023600010F0A2EC0DF0CCEF24F008C02EF009C064 -:102370002FF00AC030F00BC031F012002EC010F068 -:102380002FC011F030C012F031C013F01200060E51 -:10239000DBCFE6FF070EA0DE040EDBCFE6FF050E67 -:1023A0006CEF10F018DC4DDF49DF69D8E2EF23F065 -:1023B000FC0EDBCFE6FFFD0E6CEF10F08DEC0DF0A8 -:1023C000D0EC0DF0CCEF24F016DC2FC0DEFF30C0D7 -:1023D000DDFF49EF10F0020EE66EF7EC08F0E55273 -:1023E0001200F70EDBCF2FF0F80E120030DCD1DC3C -:1023F000D6EF0FF0DBCF36F079EC24F096EF0DF04E -:10240000CBDECBDD0DEF11F0020EDBCFE6FF030ECE -:10241000DBCFE6FF120039EC25F02FC000F030C012 -:1024200001F01200E552E552E5521200F90EDBCF41 -:102430002FF0FA0E56DFCDEF0FF08DEC0DF0D0EC53 -:102440000DF079EC24F096EF0DF010C02EF011C0D5 -:102450002FF012C030F013C031F0E3EC23F07EEF28 -:1024600011F0BFDF3EDFCDEF0FF02EC0E6FF2FC033 -:10247000E6FF30C0E6FF12005EDE71EF11F03EDCD9 -:0C2480005AEF10F0CCEC24F068EF25F0CF -:04248C00DACFE4FFC0 -:10249000E2CFDAFFE9CFE4FFEACFE4FFF6CFE4FFD3 -:1024A000F7CFE4FFF5CFE4FFF3CFE4FFF4CFE4FF91 -:1024B000FACFE4FF00EE29F0140EE80403E3EECFB8 -:1024C000E4FFFBD700EE00F0290EE80403E3EECFB3 -:1024D000E4FFFBD7E4EC1DF09EA013D0EEEC1DF062 -:1024E00001014D2B000E4E23E80E4D5D030E4E599B -:1024F00005E34D6B4E6B4F2B000E50235FEC2BF022 -:102500009E90F2A003D02EEC04F0F290F7EC1DF0B8 -:1025100002E2E16AE552E16EE552E7CFD9FFE5520A -:1025200000EE28F0290EE80403E3E5CFEDFFFBD72A -:1025300000EE3CF0140EE80403E3E5CFEDFFFBD71B -:10254000E5CFFAFFE5CFF4FFE5CFF3FFE5CFF5FFE9 -:10255000E5CFF7FFE5CFF6FFE5CFEAFFE5CFE9FFEF -:10256000E5CFDAFF1100D8CFE4FFE0CFE4FFE46E5F -:10257000DACFE4FFE2CFDAFFF3CFE4FFF4CFE4FFFA -:10258000E4EC1DF0F7EC1DF002E2E16AE552E16EC9 -:10259000E552E7CFD9FFE552E5CFF4FFE5CFF3FFF2 -:1025A000E5CFDAFFE550E5CFE0FFE5CFD8FF10003B -:1025B00004D842EC1EF063D8FCD70F0EC11202D82B -:1025C0000CEF1EF007EC1EF0E652BBEC1DF0010113 -:1025D000676F070E675D10E1E66A98EC31F0E5522F -:1025E000DF6E000EDF80FFEC1DF0E66A79EC32F062 -:1025F000E552DF70FFEC1DF01C0E9316D08EF28EAC -:10260000F28CF286F30E8C1695160101476B486B1F -:10261000496B4A6B010E4B6F92948094939881980A -:102620000D0EE66E7C0EE66EE10EE66E0BEC31F002 -:10263000E552E552E552C70E921694943F0E951658 -:10264000010EE66E56EC04F0E552838C808A82849B -:102650008088838E80868294010EE66EB4EC32F020 -:10266000E55282849D80C50EE66E09EC32F0E5529B -:10267000EEEC1DF0E552E552E7CFD9FF1200D9CFBD -:10268000E6FFE1CFD9FF0F0EE12601014B5102E039 -:1026900000EC1DF0200E0101005D03E36D50020B04 -:1026A00013E0010152510EE0E66A010EE66E020EE1 -:1026B000E66E32EC09F0E552E552E5526CEC0DF0B5 -:1026C0000101526BF6EF1CF0010149514A1102E180 -:1026D000000E08D049C1E9FF4AC1EAFFEF50800B64 -:1026E00001E0010E000947E101014651EA6A260FA7 -:1026F000E96E010EEA22EF5000083DE20501406B51 -:1027000001014C514C2B0501416F0501040E426F34 -:1027100001014651EA6A260FE96E010EEA22EFCF67 -:1027200043F5400EE66E400EE66E050EE66E010EB7 -:10273000E66E010EE66E5DEC22F0006E050EE15EC7 -:102740000050F3CF49F1F4CF4AF101014651EA6A52 -:10275000260FE96E010EEA22EF6A010146510008D8 -:1027600003E20101460707D001014551000803E2D9 -:1027700001011F0E466F010149514A1102E1000E8D -:1027800008D049C1E9FF4AC1EAFFEF50800B01E0E0 -:10279000010E00092CE10101520529E164EC0DF064 -:1027A000000925E00501406B01014C514C2B05014E -:1027B000416F05010A0E426F0501436B0501010ED1 -:1027C000486F400EE66E400EE66E050EE66E010E98 -:1027D000E66E010EE66E5DEC22F0006E050EE15E27 -:1027E0000050F3CF49F1F4CF4AF10101526B0101DE -:1027F0005151020A10E0030A01E021D0020EE66EF8 -:10280000ABEC2CF0E5528CEC07F0000903E0010181 -:10281000020E516F16D0200EE66E030EE66EC80E45 -:10282000E66EE66AE80EE66E030EE66E7FEC09F0F1 -:10283000006E060EE15E00500101516B02D00101F5 -:10284000516B01014751481102E1000E08D047C108 -:10285000E9FF48C1EAFFEF50800B01E0010E0009DB -:1028600002E0F6EF1CF005010251070A02E157EF02 -:102870001CF00D0A01E167D2010A01E126D20D0A1E -:1028800001E1BED1040A1AE0030A07E0010A02E0EE -:10289000B5EF1CF0FF00F6EF1CF0E66A98EC31F0A3 -:1028A000E552DF6E000EDB80DFCFE6FFE66A78ECF4 -:1028B00031F0E552E552FF00F6EF1CF001014951FD -:1028C0004A1102E1000E08D049C1E9FF4AC1EAFFFE -:1028D000EF50800B01E0010E000901E08FD100C52F -:1028E00040F50501416B0501030E426F0501436B85 -:1028F00005010851100A01E135D11F0A01E1F8D0A4 -:10290000080A01E1BBD0010A01E17ED0020A71E0B0 -:10291000070A64E0010A20E0030A06E0010A01E078 -:1029200043D167C148F543D10501486BED0E006EF8 -:10293000630E016E026A00C0E6FF01C0E6FF02C03E -:10294000E6FF480EE66E050EE66E5CEC31F0036EB7 -:10295000050EE15E03502BD10501486BE10E006EC0 -:10296000630E016E026A00C0E6FF01C0E6FF02C00E -:10297000E6FF480EE66E050EE66E5CEC31F0036E87 -:10298000050EE15E0350DF0E006E630E016E026AFB -:1029900000C0E6FF01C0E6FF02C0E6FF480EE66E9B -:1029A000050EE66E5CEC31F0036E050EE15E035041 -:1029B000D60E006E630E016E026A00C0E6FF01C013 -:1029C000E6FF02C0E6FF480EE66E050EE66E5CEC22 -:1029D00031F0036E050EE15E0350E9D092CF48F569 -:1029E00093CF49F594CF4AF595CF4BF596CF4CF55B -:1029F000DED080CF48F581CF49F582CF4AF583CF2D -:102A00004BF584CF4CF5D3D0E66A05EC2CF0E552BB -:102A1000010E2DC0DBFF020E2EC0DBFF030E2FC008 -:102A2000DBFF040E30C0DBFF040EDBCF48F5030EE6 -:102A3000DBCF49F5020EDBCF4AF5010EDBCF4BF5BC -:102A4000010EE66E05EC2CF0E552010E2DC0DBFF09 -:102A5000020E2EC0DBFF030E2FC0DBFF040E30C0C2 -:102A6000DBFF040EDBCF4CF5030EDBCF4DF5020E82 -:102A7000DBCF4EF5010EDBCF4FF599D0E66A3EEC89 -:102A800009F0E552010E2DC0DBFF020E2EC0DBFF68 -:102A9000030E2FC0DBFF040E30C0DBFF040EDBCFC4 -:102AA00048F5030EDBCF49F5020EDBCF4AF5010EE8 -:102AB000DBCF4BF5010EE66E3EEC09F0E552010E60 -:102AC0002DC0DBFF020E2EC0DBFF030E2FC0DBFF8D -:102AD000040E30C0DBFF040EDBCF4CF5030EDBCF62 -:102AE0004DF5020EDBCF4EF5010EDBCF4FF55FD07B -:102AF000E66A59EC09F0E552010E2DC0DBFF020E2B -:102B00002EC0DBFF030E2FC0DBFF040E30C0DBFF47 -:102B1000040EDBCF48F5030EDBCF49F5020EDBCF09 -:102B20004AF5010EDBCF4BF5010EE66E59EC09F0CC -:102B3000E552010E2DC0DBFF020E2EC0DBFF030E9F -:102B40002FC0DBFF040E30C0DBFF040EDBCF4CF5E3 -:102B5000030EDBCF4DF5020EDBCF4EF5010EDBCFC2 -:102B60004FF525D0E66A70EC09F0E552050EF3CF7B -:102B7000DBFF060EF4CFDBFF060EDBCF48F5050EBC -:102B8000DBCF49F5010EE66E70EC09F0E552050E5B -:102B9000F3CFDBFF060EF4CFDBFF060EDBCF4AF5EB -:102BA000050EDBCF4BF503D00501020E436F400E3F -:102BB000E66E400EE66E050EE66E010EE66E010E46 -:102BC000E66E5DEC22F0006E050EE15E0050F3CF84 -:102BD00049F1F4CF4AF1400EE66E000EE66E050EA6 -:102BE000E66EE66A010EE66E5DEC22F0006E050E02 -:102BF000E15E0050F3CF47F1F4CF48F1F6EF1CF05F -:102C000005010851030A37E0010A25E0030A13E031 -:102C1000010A01E040D005010951921205010A5153 -:102C2000931205010B51941205010C5195120501E7 -:102C30000D51961235D00501091D921605010A1D88 -:102C4000931605010B1D941605010C1D9516050123 -:102C50000D1D961625D00501091D891605010A1DB1 -:102C60008A1605010B1D8B1605010C1D8C1605011E -:102C70000D1D8D1615D005010951891205010A5146 -:102C80008A1205010B518B1205010C518C120501A2 -:102C90000D518D1205D0030EE66E46EC32F0E55272 -:102CA000400EE66E000EE66E050EE66EE66A010E5A -:102CB000E66E5DEC22F0006E050EE15E0050F3CF93 -:102CC00047F1F4CF48F1F6EF1CF005010851020A74 -:102CD00009E0030A01E01DD009C5E6FFABEC2CF0CA -:102CE000E5521CD009C5E6FFBBEC2CF0E552010112 -:102CF00052510EE0E66A010EE66E020EE66E32EC0E -:102D000009F0E552E552E5526CEC0DF00101526B11 -:102D100005D0010EE66E46EC32F0E552400EE66E4E -:102D2000000EE66E050EE66EE66A010EE66E5DECDE -:102D300022F0006E050EE15E0050F3CF47F1F4CFB4 -:102D400048F1F6EF1CF005010851060A02E116EF02 -:102D50001CF0080A02E1DCEF1BF0030A02E1D3EFEA -:102D60001BF0070A02E16FEF1BF0030A02E1B7EF65 -:102D70001AF0010A01E10BD30F0A01E1F4D2020AB1 -:102D800001E1A9D2150A01E16AD2140A01E139D29E -:102D9000070A01E108D2010A01E1D7D1030A01E1E2 -:102DA000A6D1010A01E1A0D10C0A01E126D1030A52 -:102DB00001E194D0040A02E03EEF1CF00501095144 -:102DC00004E0020E0501095D40E10AC5E6FF010EBF -:102DD000E66E78EC31F0E552E5520BC5E6FF020EE7 -:102DE000E66E78EC31F0E552E5520CC5E6FF030ED5 -:102DF000E66E78EC31F0E552E5520DC5E6FF040EC3 -:102E0000E66E78EC31F0E552E5520EC5E6FF050EB0 -:102E1000E66E78EC31F0E552E5520FC5E6FF060E9E -:102E2000E66E78EC31F0E552E55210C5E6FF070E8C -:102E3000E66E78EC31F0E552E55211C5E6FF080E7A -:102E4000E66E78EC31F0E552E5520501090504E043 -:102E5000020E0501095D40E10AC5E6FF090EE66EB6 -:102E600078EC31F0E552E5520BC5E6FF0A0EE66E4E -:102E700078EC31F0E552E5520CC5E6FF0B0EE66E3C -:102E800078EC31F0E552E5520DC5E6FF0C0EE66E2A -:102E900078EC31F0E552E5520EC5E6FF0D0EE66E18 -:102EA00078EC31F0E552E5520FC5E6FF0E0EE66E06 -:102EB00078EC31F0E552E55210C5E6FF0F0EE66EF4 -:102EC00078EC31F0E552E55211C5E6FF100EE66EE2 -:102ED00078EC31F0E552E55243EF1CF000C540F5C7 -:102EE0000501416B0501030E426F0501436B010EA5 -:102EF000E66E98EC31F0E5520501486F020EE66E81 -:102F000098EC31F0E5520501496F030EE66E98EC3E -:102F100031F0E55205014A6F040EE66E98EC31F08F -:102F2000E55205014B6F050EE66E98EC31F0E55267 -:102F300005014C6F060EE66E98EC31F0E552050186 -:102F40004D6F070EE66E98EC31F0E55205014E6FBD -:102F5000080EE66E98EC31F0E55205014F6F090E50 -:102F6000E66E98EC31F0E5520501506F0A0EE66E00 -:102F700098EC31F0E5520501516F0B0EE66E98ECBE -:102F800031F0E5520501526F0C0EE66E98EC31F00F -:102F9000E5520501536F0D0EE66E98EC31F0E552E7 -:102FA0000501546F0E0EE66E98EC31F0E552050106 -:102FB000556F0F0EE66E98EC31F0E5520501566F35 -:102FC000100EE66E98EC31F0E5520501576F400E99 -:102FD000E66E400EE66E050EE66E010EE66E010E22 -:102FE000E66E5DEC22F0006E050EE15E0050F3CF60 -:102FF00049F1F4CF4AF143EF1CF0E66A010EE66EA8 -:1030000078EC31F0E552E552010EE66E020EE66E06 -:1030100078EC31F0E552E552E66A030EE66E78ECA4 -:1030200031F0E552E552E66A040EE66E78EC31F0D6 -:10303000E552E552E66A050EE66E78EC31F0E552AF -:10304000E552E66A060EE66E78EC31F0E552E5529E -:10305000030EE66E070EE66E78EC31F0E552E552AF -:10306000E80EE66E080EE66E78EC31F0E552E552B9 -:10307000E66A090EE66E78EC31F0E552E552010E93 -:10308000E66E0A0EE66E78EC31F0E552E552E66A3D -:103090000B0EE66E78EC31F0E552E552E66A0C0E66 -:1030A000E66E78EC31F0E552E552E66A0D0EE66E1A -:1030B00078EC31F0E552E552E66A0E0EE66E78ECF9 -:1030C00031F0E552E552030EE66E0F0EE66E78EC37 -:1030D00031F0E552E552E80EE66E100EE66E78EC41 -:1030E00031F0E552E552CFD38CEC07F0CCD3060E8D -:1030F00009C5DBFF050E0AC5DBFF080E0BC5DBFFAC -:10310000070E0CC5DBFF0A0E0DC5DBFF090E0EC551 -:10311000DBFF090EDBCFE6FF0A0EDBCFE6FF070E73 -:10312000DBCFE6FF080EDBCFE6FF050EDBCFE6FFC9 -:10313000060EDBCFE6FF7FEC09F0006E060EE15EC7 -:1031400000500101010E526F9ED3060E09C5DBFF30 -:10315000050E0AC5DBFF080E0BC5DBFF070E0CC50D -:10316000DBFF0A0E0DC5DBFF090E0EC5DBFF090EE6 -:10317000DBCFE6FF0A0EDBCFE6FF070EDBCFE6FF75 -:10318000080EDBCFE6FF050EDBCFE6FF060EDBCF3A -:10319000E6FF87EC09F0006E060EE15E00500101CB -:1031A000010E526F70D3060E09C5DBFF050E0AC56E -:1031B000DBFF080E0BC5DBFF070E0CC5DBFF0A0E9D -:1031C0000DC5DBFF090E0EC5DBFF090EDBCFE6FFE9 -:1031D0000A0EDBCFE6FF070EDBCFE6FF080EDBCFE4 -:1031E000E6FF050EDBCFE6FF060EDBCFE6FF90EC39 -:1031F00009F0006E060EE15E00500101010E526FF3 -:1032000042D3060E09C5DBFF050E0AC5DBFF080E1B -:103210000BC5DBFF070E0CC5DBFF0A0E0DC5DBFF80 -:10322000090E0EC5DBFF090EDBCFE6FF0A0EDBCF72 -:10323000E6FF070EDBCFE6FF080EDBCFE6FF050E4D -:10324000DBCFE6FF060EDBCFE6FF9EEC09F0006E5B -:10325000060EE15E00500101010E526F14D3060EFE -:1032600009C5DBFF050E0AC5DBFF080E0BC5DBFF3A -:10327000070E0CC5DBFF0A0E0DC5DBFF090E0EC5E0 -:10328000DBFF0C0E0FC5DBFF0B0E10C5DBFF11C5FE -:10329000E6FF0B0EDBCFE6FF0C0EDBCFE6FF090EE1 -:1032A000DBCFE6FF0A0EDBCFE6FF070EDBCFE6FF44 -:1032B000080EDBCFE6FF050EDBCFE6FF060EDBCF09 -:1032C000E6FFABEC09F0006E090EE15E0050010173 -:1032D000010E526FD8D2060E09C5DBFF050E0AC5D6 -:1032E000DBFF080E0BC5DBFF070E0CC5DBFF0A0E6C -:1032F0000DC5DBFF090E0EC5DBFF0C0E0FC5DBFF96 -:103300000B0E10C5DBFF0E0E12C5DBFF0D0E13C535 -:10331000DBFF0D0EDBCFE6FF0E0EDBCFE6FF11C5A8 -:10332000E6FF0B0EDBCFE6FF0C0EDBCFE6FF090E50 -:10333000DBCFE6FF... [truncated message content] |