From 7808b2f63bc5ae5d3bad9527dbdfe3710ae444c3 Mon Sep 17 00:00:00 2001 From: Lenni Hein Date: Sat, 1 Dec 2018 20:59:20 +0100 Subject: [PATCH] Finished API and implementation needs more documentation though temp wtf just happened informative commit message woa --- MiniBug/api.h | 40 ++++++++++++++ MiniBug/assertion.c | 18 +++++++ MiniBug/assertion.h | 12 +++++ MiniBug/functions.c | 21 ++++++++ MiniBug/functions.h | 13 +++++ MiniBug/khh.h | 57 +++++++++++--------- MiniBug/makefile | 15 +++--- MiniBug/mdb.c | 86 ++++++++++++++++++++++-------- MiniBug/mdb.h | 6 ++- MiniBug/mview.c | 41 ++++++++++---- MiniBug/test/a.out | Bin 0 -> 8344 bytes MiniBug/test/test.c | 20 +++++++ MiniBug/todo.md | 3 ++ MiniBug/tools/hello_world | Bin 0 -> 944 bytes Week_1/stepper_singlesteps/main | Bin 8968 -> 0 bytes Week_1/stepper_singlesteps/main.o | Bin 2432 -> 0 bytes 16 files changed, 265 insertions(+), 67 deletions(-) create mode 100644 MiniBug/api.h create mode 100644 MiniBug/assertion.c create mode 100644 MiniBug/assertion.h create mode 100644 MiniBug/functions.c create mode 100644 MiniBug/functions.h create mode 100644 MiniBug/test/a.out create mode 100644 MiniBug/test/test.c create mode 100644 MiniBug/tools/hello_world delete mode 100644 Week_1/stepper_singlesteps/main delete mode 100644 Week_1/stepper_singlesteps/main.o diff --git a/MiniBug/api.h b/MiniBug/api.h new file mode 100644 index 0000000..9358664 --- /dev/null +++ b/MiniBug/api.h @@ -0,0 +1,40 @@ +#include + +#define __MSG_SIZE__ 0x40 +#define __REQ_SIZE__ 0x10 + +typedef struct MESSAGE +{ + char str[64]; +}MESSAGE; + +typedef struct REQUEST +{ + uint64_t control; + uint64_t value; +}REQUEST; + +// careful with stack alignment +// https://stackoverflow.com/a/5435890/8114293 +// #define __REQ_SIZE__ sizeof(struct REQUEST) + +// REQUESTS + +// control + +#define __EOF__ 0x00 +#define __REQ_REP__ 0x01 +#define __CMD__ 0x02 +#define __RECEIVED__ 0x03 +#define __DATA_SIZE__ 0x04 +#define __VALUE__ 0x05 +#define __UNRECOGN__ 0x06 + +// value + +#define __ANY__ 0x00 +#define __EXIT__ 0x01 + +#define __PEEK_REG__ 0x11 + +#define __NEXT_SYSCALL__ 0x21 // TODO diff --git a/MiniBug/assertion.c b/MiniBug/assertion.c new file mode 100644 index 0000000..1aa85fb --- /dev/null +++ b/MiniBug/assertion.c @@ -0,0 +1,18 @@ +#include "assertion.h" + +void __assertion_failed__(char *file, int line, char *msg, int do_exit) +{ + fprintf(stderr, "ASSERT%s: %s : %i\n", do_exit ? " " : "(soft)", file, line); + if(msg) fprintf(stderr, "MESSAGE%s: %s\n", do_exit ? " " : " ", msg); + if(do_exit) exit(EXIT_FAILURE); +} + +void print_bytes(void *ptr, int size) +{ + unsigned char *p = ptr; + int i; + for (i=0; i +#include + +#define assert(expr, msg) \ + if (!(expr)) \ + __assertion_failed__(__FILE__, __LINE__, msg, 1) + +#define assert_soft(expr, msg) if(!(expr))__assertion_failed__(__FILE__,__LINE__,msg,0) + +void __assertion_failed__(char *file, int line, char *msg, int do_exit); + +void print_bytes(void *ptr, int size); \ No newline at end of file diff --git a/MiniBug/functions.c b/MiniBug/functions.c new file mode 100644 index 0000000..659044e --- /dev/null +++ b/MiniBug/functions.c @@ -0,0 +1,21 @@ +#include "functions.h" + +void peek_reg(pid_t pid, int fd) +{ + int err; + REQUEST req; + req.control = __RECEIVED__; + req.value = __ANY__; + write(fd, &req, __REQ_SIZE__); + + err = read(fd, &req, __REQ_SIZE__); + assert(err == __REQ_SIZE__, ""); + + int rax = ptrace(PTRACE_PEEKUSER, pid, req.value, NULL); + + req.control = __VALUE__; + req.value = rax; + write(fd, &req, __REQ_SIZE__); + + printf("> Peek Reg\n"); +} diff --git a/MiniBug/functions.h b/MiniBug/functions.h new file mode 100644 index 0000000..d7ebbd8 --- /dev/null +++ b/MiniBug/functions.h @@ -0,0 +1,13 @@ +/* +* Functions +* +* every function has the same signature (apart from the name). +* +* void FUNCTION_NAME(pid_t pid, int fd); +* +*/ + +#include "api.h" +#include "khh.h" + +void peek_reg(pid_t pid, int fd); \ No newline at end of file diff --git a/MiniBug/khh.h b/MiniBug/khh.h index 3c7ec90..ba63c0b 100644 --- a/MiniBug/khh.h +++ b/MiniBug/khh.h @@ -20,34 +20,39 @@ // misc #include #include // waitpid +#include // defines #define __PORT__ 4711 #define __SOCKET_PATH__ "tmp_sock" -#define __MSG_SIZE__ 64 -/* assert - -Assertions - -void assert(expr, char* msg); -void assert_soft(expr, char* msg); - -assert() checks `expr`, if the expression is `false` assert() will produce output on the stderr, including `msg`. -assert() will then exit the program with `EXIT_FAILURE`, assert_soft() will only produce the warning. - -Attention: side effects in assert() will take place, e.g. `assert(++i == 0, "");` will increment i regardless of check. - -*/ -#define assert(expr, msg) \ - if (!(expr)) \ - __assertion_failed__(__FILE__, __LINE__, msg, 1) - -#define assert_soft(expr, msg) if(!(expr))__assertion_failed__(__FILE__,__LINE__,msg,0) - -void __assertion_failed__(char* file, int line, char* msg, int do_exit) -{ - fprintf(stderr, "ASSERT%s: %s : %i\n", do_exit?" ":"(soft)", file, line); - if(msg) fprintf(stderr, "MESSAGE%s: %s\n", do_exit?" ":" ",msg); - if(do_exit) exit(EXIT_FAILURE); -} \ No newline at end of file +#include "assertion.h" + +// registers +# define R15 8*00 +# define R14 8*01 +# define R13 8*02 +# define R12 8*03 +# define RBP 8*04 +# define RBX 8*05 +# define R11 8*06 +# define R10 8*07 +# define R9 8*08 +# define R8 8*09 +# define RAX 8*10 +# define RCX 8*11 +# define RDX 8*12 +# define RSI 8*13 +# define RDI 8*14 +# define ORIG_RAX 8*15 +# define RIP 8*16 +# define CS 8*17 +# define EFLAGS 8*18 +# define RSP 8*19 +# define SS 8*20 +# define FS_BASE 8*21 +# define GS_BASE 8*22 +# define DS 8*23 +# define ES 8*24 +# define FS 8*25 +# define GS 8*26 \ No newline at end of file diff --git a/MiniBug/makefile b/MiniBug/makefile index 3ea86ee..55e31cb 100644 --- a/MiniBug/makefile +++ b/MiniBug/makefile @@ -9,14 +9,15 @@ DEPS := $(wildcard *.h) dir_exists: | $(DIR) -%.o: %.c - @gcc -c -o $(DIR)$@ $^ $(CFLAGS) $(LIBS) +$(DIR)%.o: %.c + @gcc -c -o $@ $^ $(CFLAGS) $(LIBS) -compile_mdb: mdb.o - @gcc -o $(DIR)mdb $(DIR)$^ $(CFLAGS) $(LIBS) +# todo: OBJECTS PATSUBST +compile_mdb: $(DIR)mdb.o $(DIR)functions.o $(DIR)assertion.o + @gcc -o $(DIR)mdb $^ $(CFLAGS) $(LIBS) -compile_mview: mview.o - @gcc -o $(DIR)mview $(DIR)$^ $(CFLAGS) $(LIBS) +compile_mview: $(DIR)mview.o $(DIR)assertion.o + @gcc -o $(DIR)mview $^ $(CFLAGS) $(LIBS) clean: | compile_all @rm -r -f $(DIR) @@ -24,8 +25,6 @@ clean: | compile_all mdb: | compile_mdb @./$(DIR)mdb -# @rm tmp_sock # existence of tmp_sock creates problems with binding a berkeley socket - mview: | compile_mview @./$(DIR)mview diff --git a/MiniBug/mdb.c b/MiniBug/mdb.c index 26f5d37..e63c9d9 100644 --- a/MiniBug/mdb.c +++ b/MiniBug/mdb.c @@ -1,29 +1,72 @@ #include "mdb.h" +/* could be useful +* +* void checked_read(int fd, char* buf) { assert((int) read(fd, buf, __MSG_SIZE__)) == __MSG_SIZE__, "read unsuccessful"); } +* +* or a macro? +* +* #define checked_read(fd,buf) err=(int)read(fd,buf,__MSG_SIZE__);assert(err==__MSG_SIZE__,"read\ unsuccessful"); +*/ + int main() { + // initialise fprintf(stderr, "MiniBug service started\n"); init_log(); int fd = init_net(); int err; + char buf[__MSG_SIZE__]; - char buf[__MSG_SIZE__]; - memset(buf, 0, __MSG_SIZE__); - err = read(fd, buf, __MSG_SIZE__); + // awaiting target from client + err = (int) read(fd, buf, __MSG_SIZE__); assert(err == __MSG_SIZE__, "read unsuccessful"); printf("%s\n", buf); + + // creating and tracing tracee pid_t pid = init_tracee(buf); - // tracee now created and traced + // notifying client strncpy(buf, "successful", __MSG_SIZE__); write(fd, buf, __MSG_SIZE__); - // client notified + // debug routine + debug_loop(pid, fd); + + // destroy fprintf(stderr, "MiniBug shutting down (EXIT_SUCCESS)\n"); unlink(__SOCKET_PATH__); // free up file for further use on next startup return EXIT_SUCCESS; } +void debug_loop(pid_t pid, int fd) +{ + int err; + REQUEST req; + + loop: printf("> debug loop .... \n"); + err = (int) read(fd, &req, __REQ_SIZE__); + assert(err == __REQ_SIZE__, "read unsuccessful"); + assert(req.control == __CMD__, "did not receive a command"); + + switch(req.value) + { + case __EXIT__: goto exit; + case __PEEK_REG__: peek_reg(pid, fd); break; + + default: printf("> unrecognised command .. awaiting another\n"); + req.control = __UNRECOGN__; + req.value = __ANY__; + write(fd, &req, __REQ_SIZE__); + break; + } + goto loop; + + exit: err = kill(pid, SIGKILL); + assert(err != -1, "killing tracee failed"); + printf("> EXIT\n"); +} + int init_net() { int fd, socket_fd; @@ -35,7 +78,7 @@ int init_net() assert(socket_fd != -1, "Socket Creation Failed"); server_addr.sun_family = AF_UNIX; strncpy(server_addr.sun_path, __SOCKET_PATH__, strlen(__SOCKET_PATH__) + 1); - sockaddr_un_len = strlen(server_addr.sun_path) + sizeof(server_addr.sun_family); + sockaddr_un_len = (socklen_t) strlen(server_addr.sun_path) + sizeof(server_addr.sun_family); // check if file already exists int err = access(__SOCKET_PATH__, F_OK); // file exists -> err := zero @@ -45,12 +88,12 @@ int init_net() err = bind(socket_fd, (struct sockaddr *) &server_addr, sockaddr_un_len); assert(err != -1, "Bind failed"); - printf("listening: .."); + printf("> listening .."); err = listen(socket_fd, 5); assert(err != -1, "Listen failed"); - fd = accept(socket_fd, (struct sockaddr *) &client_addr, &sockaddr_un_len); + fd = accept(socket_fd, (struct sockaddr *) &client_addr, &sockaddr_un_len); assert(fd != -1, "Accept failed"); printf(".. Connection established\n"); @@ -58,7 +101,7 @@ int init_net() return fd; } -pid_t init_tracee(char* str) +pid_t init_tracee(char *str) { //convert string to tokens int counter = 1; @@ -66,20 +109,18 @@ pid_t init_tracee(char* str) { if(str[i] == 32) counter++; } - char** tokens = malloc(sizeof(void*) * counter); + char **tokens = malloc(sizeof(void *) * counter); counter = 0; - tokens[0] = str+counter; + tokens[0] = str + counter; for(int i = 0; str[i] != 0x0; i++) { - if(str[i] == 32) + if(str[i] == 32) { - tokens[++counter] = str+i+1; + tokens[++counter] = str + i + 1; str[i] = 0x0; } } - fprintf(stderr, "%s", tokens[0]); - // create tracee pid_t pid; int status, err; @@ -89,26 +130,27 @@ pid_t init_tracee(char* str) if(!(pid)) // child { ptrace(PTRACE_TRACEME, 0, NULL, NULL); - // close(STDOUT_FILENO); + // close(STDOUT_FILENO); // currently we are writing stdout to log.txt anyway + raise(SIGSTOP); err = execvp(tokens[0], tokens); exit(EXIT_FAILURE); - } + } // wait for tracee waitpid(pid, &status, 0); assert(!WIFEXITED(status), "execvp() failed"); - printf("Tracee created, traced, and interrupted\n"); + printf("> Tracee created, traced, and interrupted\n"); return pid; } void init_log() { - FILE* log_out = fopen("log.txt", "w"); - int log_fd = fileno(log_out); + FILE *log_out = fopen("log.txt", "w"); + int log_fd = fileno(log_out); close(1); //closing stdout dup(log_fd); //stdout is now written to "log.txt" fclose(log_out); // closing stream close(log_fd); // closing File Descriptor - // only stdout is open, and leads towards log.txt - printf("Log output redirected\n"); + // only stdout is open, and leads towards log.txt + printf("> Log output redirected\n"); } \ No newline at end of file diff --git a/MiniBug/mdb.h b/MiniBug/mdb.h index 6ae09d3..c127131 100644 --- a/MiniBug/mdb.h +++ b/MiniBug/mdb.h @@ -1,7 +1,9 @@ -#include "khh.h" +#include "functions.h" int init_net(); // initialises berkeley socket server void init_log(); // closes `stdout` and redirects every output to `stdout` to `log.txt` -pid_t init_tracee(char* str); // starts and traces tracee \ No newline at end of file +pid_t init_tracee(char *str); // starts and traces tracee + +void debug_loop(pid_t pid, int fd); \ No newline at end of file diff --git a/MiniBug/mview.c b/MiniBug/mview.c index 5ce3d1e..33b0fde 100644 --- a/MiniBug/mview.c +++ b/MiniBug/mview.c @@ -1,36 +1,59 @@ -#include "khh.h" +#include "functions.h" int init_net(); int main() { int fd = init_net(); - + REQUEST req; char buf[__MSG_SIZE__]; // asking server to trace "touch test.txt" - strncpy(buf, "touch test.txt", __MSG_SIZE__); + strncpy(buf, "tools/hello_world", __MSG_SIZE__); write(fd, buf, __MSG_SIZE__); // awaiting confirmation from server read(fd, buf, __MSG_SIZE__); assert(!strcmp("successful", buf), "Server creating tracee was unsuccessful"); - close(fd); + loop: + req.control = __CMD__; + req.value = __PEEK_REG__; + write(fd, &req, __REQ_SIZE__); + read(fd, &req, __REQ_SIZE__); + assert(req.control == __RECEIVED__, ""); + req.control = __VALUE__; + req.value = RAX; + write(fd, &req, __REQ_SIZE__); + read(fd, &req, __REQ_SIZE__); + printf("RAX: %lu\n", req.value); + printf("more? (y/n)"); + scanf("%s", buf); + if(strcmp(buf, "y") == 0) goto loop; + + req.control = __CMD__; + req.value = __EXIT__; + print_bytes(&req, __REQ_SIZE__); + write(fd, &req, __REQ_SIZE__); + + close(fd); return EXIT_SUCCESS; } +/* fixme sockaddr_un_len is never used, + * fixme do we need to use it instead of sizeof(struct sockaddr_un)? + */ int init_net() { - int err, fd; + int err, fd; struct sockaddr_un dest; fd = socket(AF_UNIX, SOCK_STREAM, 0); - assert(fd!=-1, "Socket Creation Failed"); + assert(fd != -1, "Socket Creation Failed"); dest.sun_family = AF_UNIX; - strncpy( dest.sun_path, __SOCKET_PATH__, strlen(__SOCKET_PATH__) + 1); - socklen_t sockaddr_un_len = strlen(dest.sun_path) + sizeof(dest.sun_family); - err = connect(fd, (struct sockaddr*) &dest, sizeof(struct sockaddr_un)); + strncpy(dest.sun_path, __SOCKET_PATH__, strlen(__SOCKET_PATH__) + 1); + socklen_t sockaddr_un_len = (socklen_t) strlen(dest.sun_path) + sizeof(dest.sun_family); + err = connect(fd, (struct sockaddr *) &dest, sizeof(struct sockaddr_un)); assert(err != -1, "Connect failed"); return fd; diff --git a/MiniBug/test/a.out b/MiniBug/test/a.out new file mode 100644 index 0000000000000000000000000000000000000000..3272f39e6ae05e545dfac16286e7298efcf076a8 GIT binary patch literal 8344 zcmeHMeQX>@6`#9{6DP6H7w4nS2joZ-lmxtSz8t4*THpC2>&p3P>I5p9Y|g&3eeHcj zcYDQ-5LmdWIEqVzDpUy}s6eWKf>KqW6p7;Cs89){M51a%i)5mtaw;N>N+VMmAMef1 zZ*O;fCY9h1{>VssZ{Ba-d-G=I?d+SmuXJ>G`h7lu5)k(b=0>V4q*XP1ezmF)X%#JE zG5vl*tP=}~Um!87z11SrYLyvf8njyB0ivwe;CVSXMw!DnAAlg&wo4H?H)?l^*D{atsvXAGd^*;1Si|eDiWx`46gwE4HPQz0JF}rQ(gLWTr6GIMmYI z*t|>2XSE%2+-#p^_a8hed*b!R)UwYj=wXc8?|%8+YddRB{^6CkH%8y=`OZiC-uUG* z*2P2Bk6qeHGF(BL{i&~je|jGLB;jFtyk#i?mF#2*4||1)zl)v?6>vfG*T>V6qfTge@LtoCJ6(Z}|^ zOERUE&7|{>y7d&?1U*8`QGKlHA)@-;8NGPTTurVmVU}F0JzkpZ*Xq_kDeWJhV6VzN z>91zNvEB93%$8Zw*DuTl^y0LBVd??h_nLlr)@&eymlsEHZ3sHU_;?xyK#IrF?5Jw$&-zF#D2(h6K9dX?yBX$E+I z=HfejMEHh6zO^-rs?Yisg&5~=vQGM+VF6Vt%L}oQ+FAask4mK`mJNnFgAEVXE&XEk zhN8H@x&Px;$w@s6|3m+1K#jU&PB(O~GC z{%Ek_nLtM{JhmVj-29CyJ=pZrLOs|ry68Z#H5Y7&1e+qk&Cy_(m>s_77%Doa&0_)Fz1>X-Fk$*q6_%cKIP9`64S(S!xl{py*0PL6Ga6Q+XKnV)^YL zA$(`laAbbXx-$zb3&2|x55LE)W;(Z81^s_g@sRsh$r>Ncr-bNpAjjLF?9t~@@|f>w z#rswJKNXL0DD(d_f^(e;n+tlD?;p{ijQ_D_=ESn zQ{r>yA+79SUxuAwDL;2UpCi1I|MQLOd(uw5Sci=Z9n53rr?P$dob}?|*(c_%*Kd_P zz6X+}pFhdU-1xacxUa(c2512FH2>o&4)Gc&hv0s%|k*d zyh1cYan<07^Q@A`eJjpXFA>i2-g)?ylK;B;(8@Cr+5U~h;a!>jk#P3kYiE-1a9PZ* zeMtBQn=4m-LU=uWy^&YgEqysNZx;IdwLVe4iZaZ!(Z`ojdAf*-XN`eWwl|hC;$}9N zH)4e$(U(o1N+rxhT-(#Ux4E(qUxOu$SS}YEHWC>#H!S*dv2?>AU*!i*K&z?%#5kqzSdUPZJzh8&)dwJ)`cE*>Au}F z;`yvG7|X=@=CA7zNyU>HqmWO~5X;{2BoW`6&nq+XMv<={yXql{;&?3>UMl&{`xPeST>n$YdQaKqH8gqlO{Gia{ z!x^$?Q8Q?c{#mu_T41%C{X0(=!0dQ z*9y|1r*B>K{b8zS*9|XmDghXWV&ff__IoF3i@<+K3KplS!gC6J(v^ANf9LwI|>)Z!r5h zRXBIXITraL{wMUxg9m+sbn6`YI6s_M7ZQ*o5m~^4{)JGEJ@k)r2L6Y||E-8m=wTf> z&*mXQALo&C>=c#57O{V!5BeUpIQ8v(QFVZRU;ujHr>Vji`bYj1Qi@)A&vJ+lNSCoD zdYlFNTb&@)q3@(vd#7kC99I*^-xB$|{d>^lP +#include +#include +#include + +int main() +{ + printf("%lu\n", sizeof(long)); + printf("%lu\n", sizeof(unsigned long)); + printf("%lu\n", sizeof(long long)); + printf("%lu\n", sizeof(unsigned long)); + printf("%lu\n", sizeof(int64_t)); + printf("%lu\n", sizeof(uint64_t)); + + printf("%lu\n", sizeof(uint8_t)); + printf("%lu\n", sizeof(uint16_t)); + // uint8_t control; + // uint16_t value; + exit(EXIT_SUCCESS); +} \ No newline at end of file diff --git a/MiniBug/todo.md b/MiniBug/todo.md index fba1adb..bc73b9e 100644 --- a/MiniBug/todo.md +++ b/MiniBug/todo.md @@ -2,3 +2,6 @@ - [ ] acknowledgements for TCP [so-link](https://stackoverflow.com/questions/19794764/linux-socket-how-to-make-send-wait-for-recv) +- [ ] messages and requests can be structs :o -> refactoring + +- [ ] refactor message into something thoughtful \ No newline at end of file diff --git a/MiniBug/tools/hello_world b/MiniBug/tools/hello_world new file mode 100644 index 0000000000000000000000000000000000000000..3b7ca2da9989ec00bcd7031e464edc0b4897fcb9 GIT binary patch literal 944 zcmbu7u};G<5QhIIO#}!*Sr8ISVL>brBLhNRKpof_(^QGXkhW6n0VZClW5ocEK_7sj zBYlE$XWz9|T3E1Te|Nv{d^yLjcMtbLqX8WOZo%Fd9Vht}xC)#r+BE{&j}f`pXthOF zM?B9@@svQ@DO@9_IdvYh=Pc#E=t|9-aN-9q-FJH9R$ws#*%TfDrRF(N2 zOMi`!y3l^t<3j3EYpBkZo0u=uSNbBG@dqwozF76)GfoMuEp?Bb9^gyv!$$+>zv!2u z&ua0og|SIy1~9hbnU=*6Y1%g?H8!g((jw1nMi}NmVqOL|>l1C|`J|RDo-Gm=s~__Z za^L#z`53+Tv7C7!RJ7C(o)I}e6kq?3zN7j*HziKNxob~ZWz59-7IGfH&mHkkgu6to cEt12O52lfLELV}2{t;Q*@?-g^djIwOAK5NNga7~l literal 0 HcmV?d00001 diff --git a/Week_1/stepper_singlesteps/main b/Week_1/stepper_singlesteps/main deleted file mode 100644 index 13bb63b50053169fcf008274c562d0cb6be9f9b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8968 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 rlZEAWD0Yo_H{7;FCyI)w0TmAnBFaSoH diff --git a/Week_1/stepper_singlesteps/main.o b/Week_1/stepper_singlesteps/main.o deleted file mode 100644 index d8fa3df1c218d70c92402b0987f054aeb84cca20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2432 zcmbtVO-NKx6h7manrWJ~Ffw`@!$2Q1rb7jWrqwk{#29KfJZIkE;QaCCjaktjHqqlD zxN+5@HtpL4{ZI}BMVp{av}_Y3w5Xj?Fr9PXz0UPHv#B%Od(ZvOcYf~Qn_H*PpJ@mL zKuQ2kLUkrlfYByJ=jtf5Ln}m?^OfECPCm}7wo0YKoTq?8g1L>oeMn@^>5Xvt8@V{8 z9<(gIq8^IppA+_iy4TdLQTL2GPF|xbxW?QPMP$p|Lf zn9TVgY;K86PN|a>kqJF%d6UEMCN?tL7lg2 zZD^}j$=v88=I%huTLjjl8gJZYZt*^*SYhsJ9>WRlr1NXi`N5aH#lx$=x-pn<=aziy zdoc)K@%uNF6lNx;wGpj1onCD9=3|$=d7{5{W@56cUsUu7$!SHWv*Y6@w7%$UF>4pK zVSPvs4Md837QPvd=%FEf_=tyVgQ0LF6bT*2O#65?fWWmG2rPC64zxA5tl*LLAWn_s zIvwHI?#_D+wR9sE!o{BRvyuY(WQ!AI)gkTFtOJ$*zC<7j;k3sRe@Gw-;k&U({5OFp{`gIF@dVz1 zqvY=rIMt}$nr?+p=PLPw3a-W(@x_sM;he%(pwAWxpj$a_63=BaW)^MPoNel7r=kP=5RpJ`=3Fdk z85wgk&wnZ!`qR?drp3O|UXm(bbhjYW`yt%_ zC3z|Q1Z{Kh!~JNXnE&b@Mqi4#