From fe1f457038868c33f0c7bc4a3441c2c978d715c0 Mon Sep 17 00:00:00 2001 From: Rory Healy Date: Thu, 9 Sep 2021 17:10:24 +1000 Subject: [PATCH] Refactored headers for cleaner design, started stage 1 --- Makefile | 7 +++- common.c | 12 +++++- common.h | 11 +++++ common.o | Bin 5840 -> 6536 bytes dcel.c | 29 +++---------- dcel.h | 28 +++++++++---- dcel.o | Bin 7088 -> 7352 bytes geometry.c | 23 +++++++++++ geometry.h | 9 ++++ geometry.o | Bin 0 -> 3864 bytes input.c | 15 +++---- input.h | 24 ----------- input.o | Bin 9400 -> 8752 bytes main.c | 48 ++++----------------- main.o | Bin 9240 -> 7288 bytes voronoi.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++----- voronoi.h | 39 +++++++++++------- voronoi.o | Bin 9528 -> 16024 bytes voronoi2 | Bin 28272 -> 33712 bytes 19 files changed, 229 insertions(+), 135 deletions(-) create mode 100644 geometry.c create mode 100644 geometry.h create mode 100644 geometry.o diff --git a/Makefile b/Makefile index 8efc526..c786681 100644 --- a/Makefile +++ b/Makefile @@ -16,12 +16,15 @@ # gcc -Wall -Wextra -Werror -pedantic -g -o main.o main.c -c # Link command: -voronoi2: common.o dcel.o voronoi.o input.o main.o - gcc -Wall -Wextra -Werror -pedantic -g -o voronoi2 main.o input.o voronoi.o dcel.o common.o +voronoi2: common.o geometry.o dcel.o voronoi.o input.o main.o + gcc -Wall -Wextra -Werror -pedantic -g -o voronoi2 main.o input.o voronoi.o dcel.o geometry.o common.o common.o: common.c gcc -Wall -Wextra -Werror -pedantic -g -o common.o common.c -c +geometry.o: geometry.c + gcc -Wall -Wextra -Werror -pedantic -g -o geometry.o geometry.c -c + dcel.o: dcel.c gcc -Wall -Wextra -Werror -pedantic -g -o dcel.o dcel.c -c diff --git a/common.c b/common.c index 374d165..d0bc6c3 100644 --- a/common.c +++ b/common.c @@ -2,7 +2,7 @@ * * Created by Rory Healy (healyr@student.unimelb.edu.au) * Created on 25th August 2021 - * Last modified 8th September 2021 + * Last modified 9th September 2021 * * Contains functions for general use throughout other files. * @@ -12,10 +12,18 @@ #include "common.h" #endif -/* Checks if a given pointer is null. Used for malloc() and realloc(). */ void checkNullPointer(void *ptr) { if (!ptr) { fputs("Error: Cannot allocate memory.\n", stderr); exit(EXIT_FAILURE); } } + +FILE *safeFileOpen(FILE **f, char *fileName, char *mode) { + *f = fopen(fileName, mode); + if (*f == NULL) { + fprintf(stderr, "Error: Unable to open file %s\n", fileName); + exit(EXIT_FAILURE); + } + return *f; +} diff --git a/common.h b/common.h index 2656928..7709843 100644 --- a/common.h +++ b/common.h @@ -12,9 +12,20 @@ #endif +#ifndef STRING_HEADER +#define STRING_HEADER + +#include + +#endif + #ifndef COMMON_HEADER #define COMMON_HEADER +/* Checks if a pointer assigned through dynamic memory allocation is NULL */ void checkNullPointer(void *ptr); +/* Opens a file and checks if the file is safe to use */ +FILE *safeFileOpen(FILE **f, char *fileName, char *mode); + #endif diff --git a/common.o b/common.o index 7b4137ceaa6e4e8d39db94d63e64397fdbf3d338..734d90fe2cbc13637b2445741bbe533d8901260f 100644 GIT binary patch delta 1270 zcmZ8hU1$_n6u$TFPIhK@c6MiG|0WT$f~85NuIt}wly&`yPF`yB5Sv=4UEAFljl0R3 zMHEDXC@w+BdO&p1iwv}-`ro)+IZ?AK<)?O~=aD_ir4#L6?aKW} z1c4NW8L~Bdl-OtPmfP)7NkpF7=hxNE%Ka&>>lM?qVTq!j?(tY>sZ=a=#J6V)g(`%X z3Ad+^-9M0v4;SOb!CWDp??>l@BVN+ts*bn9OxQi~%LwasqhZ91~G~Y%UbOIgTris#gWjZdBcX@4ZD@gLdDvHOGq(Sw|5sY7fdeplZ~*EuzDV zq8Ui42|55-d|rpDx{Lk~b85o6Bl4dw%0CXv{89Q3Z1nG<7huFcO`Bn>7G-W1?A3PC zcDSZRt(&6wA-~gz##UCt18pC*AsIMIe}3=@K8ObPlOY6_BOO4-8?p97MiRv0s5Y>x!v zW}5wIz!NjAoUQ*T2w9Ht6ss9vOz)Foa%4WZuImw7vm4(GW)f delta 688 zcmZ8eL1+^}6x~0`)}7rnyPIsXSv?r*B0((?gvQ#EDh8|4LyxftH3(`%+q6c4&`UvR zPSWxysCZB>ww^4xc+eK{Am}B%34+pt!rp|`TMwOPM-Tll|MTa)H}B6(^K`p^F~`R3 zrQ;Jz+dliuFi3~7Xhd7rXr3LidK4KYS?Rf1tIsNAVJy0iE2?qARF#N!))+Ddjmt@v z5xkRPu`XYes<4z`J1#}Bp#C*YQq_(cd7%AL=>?0lUiSoqW$k9-?)22HY&TV>>dKAV zm029+AMlf3h2vyeH9brCW|Y*uBM)LN=3+c{307~JI;i$;cm;Mma;N}RDs`*gy?4X*x|I#OVM!W zRA`j;Sflk77r( sPc-ypiu|4Aok2BI;593>%wSb?fBs{E=yG!0@ZQ6o&zq9{NxnpE7r?lTNdN!< diff --git a/dcel.c b/dcel.c index a2ab3be..52af33b 100644 --- a/dcel.c +++ b/dcel.c @@ -2,7 +2,7 @@ * * Created by Rory Healy (healyr@student.unimelb.edu.au) * Created on 25th August 2021 - * Last modified 25th August 2021 + * Last modified 9th September 2021 * * Contains functions for the DCEL data structure, including creating, * splitting an edge, and identifying towers in faces. @@ -17,36 +17,17 @@ #include "common.h" #endif -struct halfEdge { - halfEdge_t *previous; - halfEdge_t *next; - halfEdge_t *twin; - int face; - int edge; -}; - -struct vertex { - double x; - double y; -}; - -struct edge { - halfEdge_t halfEdge; -}; - -struct face { - halfEdge_t start; -}; - /* Reads the polygon file and stores the information in the vertices array. */ -vertex_t **readPolygon(vertex_t **vertices, FILE *polygonFile, int *numVertices) { +vertex_t **readPolygon(vertex_t **vertices, FILE *polygonFile, \ + int *numVertices) { double currentX, currentY; int maxSizeVertices = 1; while ((fscanf(polygonFile, "%lf %lf", ¤tX, ¤tY)) != EOF) { /* Check if there enough space in the towers array */ if (*numVertices == maxSizeVertices) { maxSizeVertices *= 2; - vertex_t **temp = realloc(vertices, maxSizeVertices * sizeof(*vertices)); + vertex_t **temp = realloc(vertices, \ + maxSizeVertices * sizeof(*vertices)); checkNullPointer(temp); vertices = temp; } diff --git a/dcel.h b/dcel.h index 5066490..cabca01 100644 --- a/dcel.h +++ b/dcel.h @@ -1,20 +1,32 @@ +#ifndef GEOMETRY_HEADER +#include "geometry.h" +#endif + #ifndef STDIO_HEADER - -#define STDIO_HEADER #include - #endif #ifndef DCEL_HEADER - #define DCEL_HEADER -typedef struct halfEdge halfEdge_t; -typedef struct vertex vertex_t; -typedef struct edge edge_t; -typedef struct face face_t; +typedef struct halfEdge { + struct halfEdge *previous; + struct halfEdge *next; + struct halfEdge *twin; + int face; + int edge; +} halfEdge_t; + +typedef struct edge { + halfEdge_t halfEdge; +} edge_t; + +typedef struct face { + halfEdge_t start; +} face_t; vertex_t **readPolygon(vertex_t **vertices, FILE *polygonFile, \ int *numVertices); void freeVertices(vertex_t **vertices, int numVertices); + #endif diff --git a/dcel.o b/dcel.o index 4c5763bd68ee750d41db6bdae67ce5d765c7b439..bda734f713c1d1a341d894a0b4ff16c59e7b38d0 100644 GIT binary patch literal 7352 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 ovGyNix, vertexB->y); + return "hi"; +} diff --git a/geometry.h b/geometry.h new file mode 100644 index 0000000..ddd4b3d --- /dev/null +++ b/geometry.h @@ -0,0 +1,9 @@ +#ifndef GEOMETRY_HEADER +#define GEOMETRY_HEADER + +typedef struct vertex { + double x; + double y; +} vertex_t; + +#endif \ No newline at end of file diff --git a/geometry.o b/geometry.o new file mode 100644 index 0000000000000000000000000000000000000000..46d9a01e5cae9d3490b76db79a450b5440fa4d4f GIT binary patch literal 3864 zcmbtXU2GIp6h1Sv+ugG5c3}Z&FlHV^LEUMq1WHYD+giGq2BLyNj9I4J*`K(bDf5F} z6)_=EE5S%i3?@7%iBI~bCN;j0@S-oqXWx7<(ZmPP7a}Hj&Yg4Va67)}NoLOZzI*=W z-aB`8&&|#s(lrgFXmAkLkz@fb_pjSkVOC)~Y=b|C9{B5cZS|Mh`QJ;m)w8#1tI>_x zh1nZ_43(;RG;Y-{KyzsKcg@<6d#!eHl0w&Xy!}d6?P8YH_t#e@%w654*%N9Lv^#Jc z`3wz0Ui32{?8I#@VN*gV>6y~AsErlSvjb#-(F46tn0d(LMLJPX&lwdQ&g66CmC3|P z%L}A4>Wh&G=*wg~ZioQ_f4Op85Yj&q3=+Sc3^3TBa=YFBO{BPLSYx{GZ6Qk&s; z3{OEWe}cla&DySFxnLA`7B_2Ka;5vwxvUw*LSdrtWZ^(TE927*f{~Bm;qrI^J9-cb zg@YIbklhYOQH}xh@d&n;8$zeU7@oJZr-r4|!^4NmRH(Y+qv>Hv-k(h*(05=4`I=Z z7P=0^-Q3$?+`Y&ZyK~eO>uH!fa@?F5+i#AIT2EM`W@RaiTxYW7xQ^dxAhi8Pdvaxb zUuEB3v(hpvO*`nhjkfQ(UKCU!_tlQOSP5-xAi%*Ov>UHfmVGZ2O;>^t9VsdvXmstM zEr;=8aG=plU|jK;nF(|E@rB3@Bkrj(76~}EhY7KgxFu1SXif3Lr=SgVjW`1@lC7}< z?X~AXTPbNf2XgrjaEsiJJY6JWgUuF8Z|gIIeQ%;eOsC%ItjNI4J86SP>d8jEh_`w} zhymgSPvO%$FaY1d6ft0M153x*mP9}DB{Gqx`BG&c5@~#LZ>DX;`rQ1{>8bhp(L;xx zpFLJTHZ?szTZd&I_hyr7jB+7*-)K$#z7xv?^R!l*68seN(qBHYoGJ26&Za!JiO=D6 zljAqDmi#i~Z3=&c@i1#z-@9i6+IyI%JhBI(tOQSWe`0)0;lE=1qQZa9xTWwr8M_LP zN3M`a;a_L`hQfc#_`JgZ!1z6dr_UA1?YNE% z!Fpgdye0a2faT&bYvIv{$1EPZj9YGG;Q_piUxyy&aoY8!Z!bCgVEkPKQOBA0rX3ozZ%cqZf=a`k0^Eio{yC+fgi^nY-f8iBsVNlN-${{iQeVPBX(# - -#endif - -#ifndef STDLIB_HEADER -#define STDLIB_HEADER - -#include - -#endif - -#ifndef STRING_HEADER - -#define STRING_HEADER -#include - -#endif - #ifndef INPUT_HEADER #define INPUT_HEADER @@ -42,7 +21,4 @@ int getExpectedArgs(enum stages stage); /* Prints the corresponding usage strings for a given stage */ void printArgError(enum stages stage, char *errorMessage); -/* Opens a file and checks if the file is safe to use */ -FILE *safeFileOpen(FILE **f, char *fileName, char *mode); - #endif diff --git a/input.o b/input.o index c647f13e85f822d7aae811264d430ba3b355f004..325dbb47f8f935acdcbeb60b68960fe5217e05f2 100644 GIT binary patch delta 3024 zcmZ9Oe{2**6vt=w_IkUw?Ol(>UYAyTZO?L`#e#ST1>2$oIa9E0Oe_&-ZJ=obX-hZ~ z3?_>$#tT)sG6`^4O-&>c!yiY=AN_;Gqo9cze-WdA8cp<%lJpOan&?03o0+$Vok?!q ze7^6^%)9xqyL0Kn)?7j>)LvfwFP+V6XMFSk>ne-6cPS|qjko;zUZ~6TGH!fap`zAA z?Gv@GbKQkl|L{nLlyTC&iXH+JFan$cx-fS;k4>3Z6F z7xFnOVaKv8z;OvX!>0hoB|Kvsf#D`3bcbI7$V%8%QGl?Vgy*9<@SKyd+j$dUM#3JE z&qWLN5Y}<8$xT7J`hxob<|Oos@S9b$o*kq~c8fTy_f-if)HU#rcuH^j!lOgU17 z(hxe$&*(Bvw5z@uj5c+U*n(Gzlg68iyn@n6r#njFD`OZgd#`NfheMm{C(C&#bt<^q zD||b6q0=(jslCdA!CF_RzEGQGS!uh~+GK6CC`|235MQVkR#6uXSOtHaSXP_mgUeA? z1x^{8hS&glLU5SF5Clud4R-}?7~8V$jcZl>uj>W~Ew4(I6j*H=V6y}3OKIBXiG=G( z+I|EAE7zCe(ssME*8 z8e@+|>Si;MY05h6q1mFH)mX7A;e3q`C9%&i7{B{`sv*~bjUA?4(D5x-=uL% z=}w^IAGF@~UBQVhoXFGL<+77%RY!hM(R0Y_mgw-D^X_o_5(hjPF_BJ1??>LH=)Ys4 zgNiH1ozGv|f+@`ObEQKg zcKA-wN01j3{Y#AhQ_;Pfqv1TTm9DtPb-0(|dk&$?j|)O-6+MOnuTu0ckduo362?EN z=s#=X{}a-!IA)OdD0&eG+OOz;;Xi&&(dSSN|z3X%m9Xf7>r$>-2wBA78+pa;0_r_VP=-=RkTbAnUND_rkwB7{x z$4KAO4&)@ecK_Mgu?G^AzktryC4&j^zJ)IyjoqnB(p4-HYlpf!)^4`otfyE$mNGvO zpA3YIvfHs#upnOIgj_6RE9#Tx8dJ`=p6#knnFIX)Lup|zM{IVfKCboFu$%R5=4o_f znbVNcvNf!yq0L+&zIq7R$?^>;b0{qPHi^EA4RP&_Fn?3BTtsINH^#MGnDsQanFWkH s%JPjVbEZc2+RknRCB(N5e5)}ho-&L0-Ww7l9*oD$1&qEf^Q$ZW4}Vz?zW@LL literal 9400 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 literal 9240 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 diff --git a/voronoi.c b/voronoi.c index 0d02e27..816641e 100644 --- a/voronoi.c +++ b/voronoi.c @@ -2,10 +2,11 @@ * * Created by Rory Healy (healyr@student.unimelb.edu.au) * Created on 12th August 2021 - * Last modified 25th August 2021 - * - * Contains functions involving the reading of the dataset CSV file. + * Last modified 9th September 2021 * + * Contains functions involving the generation of the Voronoi diagram, and + * running each stage of the assignment. + * */ #ifndef COMMON_HEADER @@ -16,8 +17,6 @@ #include "voronoi.h" #endif -#include - #define BASE_10 10 #define MAX_CSV_ENTRY_LEN 512 #define MAX_FIELD_LEN 128 @@ -32,13 +31,12 @@ struct tower { double y; }; -/* Reads the CSV file and stores the information in the towers array. */ -tower_t **readTowers(tower_t **towers, FILE* datasetFile, int *numTowers) { +tower_t **readTowers(tower_t **towers, FILE *datasetFile, int *numTowers) { /* Maximum length of a single CSV line */ size_t lineBufferSize = MAX_CSV_ENTRY_LEN + 1; /* Stores the current line from the CSV */ - char *lineBuffer = malloc(lineBufferSize * sizeof(char)); + char *lineBuffer = malloc(lineBufferSize * sizeof(*lineBuffer)); checkNullPointer(lineBuffer); int maxSizetowers = 1; @@ -57,15 +55,14 @@ tower_t **readTowers(tower_t **towers, FILE* datasetFile, int *numTowers) { /* The current tower being filled in with information */ towers[*numTowers] = malloc(sizeof(*towers[*numTowers])); - readCurrentLine(lineBuffer, towers[*numTowers]); + readCurrentTower(lineBuffer, towers[*numTowers]); *numTowers += 1; } free(lineBuffer); return towers; } -/* Takes a line from the CSV and converts the data into a tower_t format */ -void readCurrentLine(char* lineBuffer, tower_t* tower) { +void readCurrentTower(char *lineBuffer, tower_t *tower) { /* Stores the current CSV field for the current line */ char *token = strtok(lineBuffer, ","); size_t tokenLength; @@ -120,3 +117,103 @@ void freeTowers(tower_t **towers, int numTowers) { } free(towers); } + +vertex_t **readPoints(vertex_t **points, FILE *pointsFile, int *numPoints) { + /* Current length of a single points line */ + size_t lineBufferSize = 1; + + /* Stores the current line from the points file */ + char *lineBuffer = malloc(lineBufferSize * sizeof(*lineBuffer)); + checkNullPointer(lineBuffer); + + /* Assuming that pointsFile is valid, there must be at least two points */ + int maxSizePoints = 2; + + while (getline(&lineBuffer, &lineBufferSize, pointsFile) > 0) { + /* Check if there is enough space in the points array */ + if (*numPoints == maxSizePoints) { + maxSizePoints *= 2; + vertex_t **temp = realloc(points, maxSizePoints * sizeof(*points)); + checkNullPointer(temp); + points = temp; + } + + double xCoordinateA, yCoordinateA, xCoordinateB, yCoordinateB; + sscanf(lineBuffer, "%lf %lf %lf %lf", &xCoordinateA, &yCoordinateA, \ + &xCoordinateB, &yCoordinateB); + + points[*numPoints] = malloc(sizeof(*points[*numPoints])); + points[*numPoints]->x = xCoordinateA; + points[*numPoints]->y = yCoordinateA; + *numPoints += 1; + + points[*numPoints] = malloc(sizeof(*points[*numPoints])); + points[*numPoints]->x = xCoordinateB; + points[*numPoints]->y = yCoordinateB; + *numPoints += 1; + } + + free(lineBuffer); + return points; +} + +void freePoints(vertex_t **points, int numPoints) { + for (int i = 0; i < numPoints; i++) { + free(points[i]); + } + free(points); +} + +void stage1(char *pointsFileName, char *outputFileName) { + FILE *pointsFile = NULL, *outputFile = NULL; + pointsFile = safeFileOpen(&pointsFile, pointsFileName, "r"); + outputFile = safeFileOpen(&outputFile, outputFileName, "w"); + + vertex_t **points = malloc(sizeof(*points)); + checkNullPointer(points); + int numPoints = 0; + // points = readPoints(points, pointsFile, &numPoints); + + freePoints(points, numPoints); + fclose(pointsFile); + fclose(outputFile); +} + +void stage2(char *pointsFileName, char *polygonFileName, char *outputFileName) { + FILE *pointsFile = NULL, *polygonFile = NULL, *outputFile = NULL; + pointsFile = safeFileOpen(&pointsFile, pointsFileName, "r"); + polygonFile = safeFileOpen(&polygonFile, polygonFileName, "r"); + outputFile = safeFileOpen(&outputFile, outputFileName, "w"); + + + + fclose(pointsFile); + fclose(polygonFile); + fclose(outputFile); +} + +void stage3(char *dataFileName, char *polygonFileName, char *outputFileName) { + FILE *dataFile = NULL, *polygonFile = NULL, *outputFile = NULL; + dataFile = safeFileOpen(&dataFile, dataFileName, "r"); + polygonFile = safeFileOpen(&polygonFile, polygonFileName, "r"); + outputFile = safeFileOpen(&outputFile, outputFileName, "w"); + + + + fclose(dataFile); + fclose(polygonFile); + fclose(outputFile); +} + +void stage4(char *dataFileName, char *polygonFileName, char *outputFileName) { + FILE *dataFile = NULL, *polygonFile = NULL, *outputFile = NULL; + dataFile = safeFileOpen(&dataFile, dataFileName, "r"); + polygonFile = safeFileOpen(&polygonFile, polygonFileName, "r"); + outputFile = safeFileOpen(&outputFile, outputFileName, "w"); + + + + fclose(dataFile); + fclose(polygonFile); + fclose(outputFile); +} diff --git a/voronoi.h b/voronoi.h index 10113b1..a5e8d0c 100644 --- a/voronoi.h +++ b/voronoi.h @@ -1,25 +1,34 @@ -#ifndef STDIO_HEADER - -#define STDIO_HEADER -#include - -#endif - -#ifndef STDLIB_HEADER - -#define STDLIB_HEADER -#include - +#ifndef DCEL_HEADER +#include "dcel.h" #endif #ifndef VORONOI_HEADER - #define VORONOI_HEADER typedef struct tower tower_t; -tower_t** readTowers(tower_t **towers, FILE* datasetFile, int *numTowers); -void readCurrentLine(char* lineBuffer, tower_t* tower); +/* Reads the CSV file and stores the information in the towers array */ +tower_t **readTowers(tower_t **towers, FILE *datasetFile, int *numTowers); + +/* Reads the current row from the CSV into a new tower */ +void readCurrentTower(char *lineBuffer, tower_t *tower); + +/* Takes a line from the CSV and converts the data into a tower_t format */ void freeTowers(tower_t **towers, int numTowers); +/* Reads a points file and stores the information in the points array */ +vertex_t **readPoints(vertex_t **points, FILE *pointsFile, int *numPoints); + +/* Outputs the bisector equations from pointsFile into outputFile */ +void stage1(char *pointsFileName, char *outputFileName); + +/* Outputs the intersections the bisectors make with the polygon */ +void stage2(char *pointsFileName, char *polygonFileName, char *outputFileName); + +/* Constructs a Voronoi diagram and prints the resulting diameters */ +void stage3(char *dataFileName, char *polygonFileName, char *outputFileName); + +/* Same as stage3, but prints diameters in ascending order */ +void stage4(char *dataFileName, char *polygonFileName, char *outputFileName); + #endif diff --git a/voronoi.o b/voronoi.o index d96fd7cacedae9daad12f23ef940e94cf3a2eaaa..7a5cc090f4018ec4a16809219fbc4514b8498fa0 100644 GIT binary patch literal 16024 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 KAF{vp{Qm(VECo#f literal 9528 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 diff --git a/voronoi2 b/voronoi2 index 878fc9a8524c55583827110995b6dcb217123d6e..8f53c7b2ddc6240ddac1def550f3ca2df8f4b273 100755 GIT binary patch literal 33712 zcmeHwd7M;No$syXcHg3Usb=32Dv$^y&@@{DBtSP%P$UpK2`FSMitg&}8oH}GwXmoW zq?1V7c0xPqFg`S7bPSGB@jVwbaY8mBW1d5NE^*w@muR=dNZMsE6Rr3Cp5@l9OE)p< zXP$p>`_uJ1zxAB+JHOvK=ia)v?w-iH)n1Rs(1*`hW)M3(Qc~&_$&zens9Q)#z2S}nBP2&dBP4O^nJg;Y z4Zl4~%4w+ic71h{Z@A!o)gcX?di2eVrBZLk`cl}h{9>v8Ydw;ww@B$NQhFMmRgTb5 z`;$K5{~~424PDJP+CJzl+2aj7`$~FHv^))KJy$hrrH+)W#4GndDH$jhn z`BM))%r~q0h8qWWd@A=EbJ~;Ju3j*wy?J(fGL_#od)K0?XJ5UbHk+=UCz`-^h4Igr zT65zj1LJm_G(DW&y%N{<$Q!NrlrMXteBZ_uou8Q5{?Hd@=ce5H`K94YDZ_SChcY~9 zPlbxWSsssn$_RgW-c7ofv+44u=-Q1T4>q3D&v z&{qyaf8Q{4=Jina?;eIec9{Nt0P<7u?>=^bP-9Fq!i|!n=Mf{D%QSWFHWIs%Iin@r znMfJ2STdV#TD&-x%{IkTEx@z6c+>V+Q``1fOFY?bWD@cA_H+|fbLnOYwoA}X(C#$S zB8{{(wWqTQqeE*pCo&nMWoIUtOBgMknPe*0Vzef5NZJG{Y}yr%wIoyV_T<|WwAj?q z2`W;%iEYW`Vjb~h%4o?X5(bG(@2ib9>(;JV8JkzTz%E^5m*&+jG-7Kvu8*PKL~Ame zOJp{#U)i2cB{s&lwX@3Bj&w>Hk4e!X1!Y!yk>6hN=U0&VO^T*VuB6f99&nxj)brcu zWD=p{H@>cD;{@(AzOC^5#AJZlKL*Z2uS0s=_NsNSPOUSVUa#nuYn(Oy!Uk!NbC7d> zI_;pVrC12|JLrsceVldB$7v$qIR~9{n?7{hao**8r;mCiUk(C7+CHKVI_FY-G&<;< zclEK^K^OZ4#n|egJJ+E$2c326qtijxJ|%CLgN}i*kG&3h(54#3eh0n6K|kQ2S2^eh z9rS7k{jh_sV~6Y`4tkA4{-}fQoKKE9=qf~n)^P`&>zqDLI_P6G5%83QKGs3MSiIfr}pa@A1H|t1o>m+V!#(?J>W%+%Tf|9?y9Tr=nd?TTh7w6c&yEd9ZLr5TJUB zLHRav1_yppC=?C|oD1&Y!1FfF4Z+~R6E@C;cW~fyHqHfiaNr>u=R!L;&}ZXZU62M6x5aW1HX192PYLOM8blZ|uZF*wj*<6KY&2j<#17t+Cj%WRw*lEHx*8|Q*L zIN-7IYJtD{N8Mj8pyDz+V1D?jCTJt z+V$eu#*OQG%`$jA+FSVm1|r(Kl>6brn2}KV%>kf`QHb`M^9UB7%Z)*3zk<_JhIXKE zx_Zi9h#OBS2>F1JU+5*6`NwGY+2|9mERQ~M&KLE3E&BW)bE9G48D+pKoNf{0ru7;B zdzb!@r@i^BHbuLZ{u7JQ?w4{E(VnHB0Mh^aKNJf6%?PHinO^|zxdXa({nQ`W2__4h zpoe4(ci;VTv^#&g>+Y95`I>0&!q{ZPcpNf?{+}Y%qCJt*(XQi2S=4i)zaFIS$hn@# zIUt`w>UBq6?}@yAZRF)#4Tw;m3w7{50l}`j&-ttGIf^EV(gWX;C0{NB+*kd;(-QaO zg227Gs|NlTdm}3xAMFXLA|UGi4y&JmmPL4^}kxaUnM{2kKy z%v+VAH#8qYvY(lOAzN{+Vf1Wb{~IT9L{1z-oko8UqwzRAVf4QnB|&@kDTnhz(eAs? zp)x8imx}!-UN02xJ)SQ=M!hpJ#hs?OpVVAVduJLHw_I_1G?$a$nQ4l9W};|Pe~0FB zN<3p8;~tMdKB;8) zJM8`lk=Q>0vT_6p|5XzAA@mhp@aGotbI;ZI^yQ}VbI+Cd^yDmjdUJs@laC2^)g9x) zab~6jQze*$*oTMyAY=Z2Vh)yd{XOa`diEBi*=CING5Gdqw0qN$=4g-qiW&4&ccg#r z@#u-jDG$aI!*z;5``gzF1#n&f{sQq^5M?JK&k5J|Y&sh4U4JUtOO^=naj0wHK^p6c z9O*F@N1n@H^L*mDp2&02gVEm6&wxV~Dih`xl;<`5c3Qmmc=ZEZJs~A}yXNJZVE8JQKw?ZqA>Y?4c@VzP#1}WSfIeQ}VGW$Qk_<_h-_V{YaJBJz1 ztbR`qI6aY<;i-EmiMjlG*y!4q`OXwP$MS%LmKhl$Wb3mb)nCqcq^p<@7Ydi*4& z8;vq~q%-b4Cwc@S%ASM0uc1jJWs_{91xj@*qm7))pipnIzME~cz>9Wg+jfPxHvDCF z1AYApcP9TTIt3dCAS|tSH;y0ppp>yI-&ayOo5{*Uto+;90NHr4@}vK$JJsmu)tTk2 z*{<|c5Ne55zw0GU`bv0wFy{&*zEpUqE(TzU6GePVzlmG#BI)j zk`M?Z1p2%4FP@0JPNjh!d@wDY!QT&`bBN?9z4W_6VOR;-=_fBJA_nEb3y8pNd%^CC zyzUXJ)ghTI`4qPWwy&8{&58;MDS$`bdesFIpa$m#h2yXx5 zm?n(=CF~UDU9{yaL-QcGCn7(f@t#dTAXNrmKxV^f%6#b8!a<_#??w3l#Li*nmrEpO z{ttp!lJfQTtlz!q76{za#Y4+nAgT;P4Da*nKUqt!5K0N{AU$akN#dT2CCw{Anb~*d>V3B*heHy?uU)84%aC=nRr>_^eJ0#cHr_UC- zn`L1#5N>mYm*&O}NNlPx)W_73Q6D zh3b1J$|OE-r}h#AFx!>x)WW69^aW?ORjk2YJBu^hEYM45wh*kI!_3CPJ&T1zED-0S zJw{9QjFZ@Tq%dPG{WMPCk8ySEzl|;HH9rMHNuWwII14rMS4Mlx+-!FDiLXq7jz06) z3!VP2LtpOjKX+bJ*g@Hp?oEh9{&Nl#Ywazpm*UoqBP7r{QhudY68EreQR^b#3=|8aA!%{%ym?hVIul zMSEvI2J$WIX8r+7fYra}WwhamKlpM}=6+vYk670|xUTz^Roy>tD2)DbwCgEPbny@K zzu@(_+wN$%z2T0AI~!t8wG`{*nd?)in~*k(SMEfUE`D6}z(o&S^uR?AT=c+24_x%X zMGsu`z(o&S^nmRFkGgwrZK^4q$t0R`;e0mUny593gjBv`TOt!qw}g|a&U`LgOXXW~ zkP7dNXTzy|tq<>rx91b#8CNvV#MSP(#yn%bvA~FAGU?2c@DJ8d}W+pOhMlzksI@(ZdTSt65 z+>*?-g+~O~YGpU9nl^019R8ReZjR^Tq9qq-Rcj)Z$i#CA(TZd$nM=mo?b?!bi`}7F z;r94$I72ySXFS)`mP_x%m`cZETm{RnHZ5^wVpiC$YeWEDQUe!mPR3g^@s3&Hcyn_y z)f&dAbflY;ExU>6zBj{GmctUy!6R|EayXd{H^G;=Oui|XXr2|$COX+In!qi-x`87C z@Vpq@Bm!|~D%_L+Q@EK@xzc_J=C%ZFj0lMPg|q0pj15QURj(;s8{UYHIe2sh+nZ_* zCv#bLwIhL{XLDs#X?yM%bByDHHy+1ZU^a{#!p+FYrunnN+b~M1f?{j3;dmy&K}u(E z+c6VyL_oI)9^<{x3E9K;c%~IahWpwS@-W$~Ov@Zb=FURyoqVxSxa6fmVF&&{jQ_Lv z5B;oAxT3u!?D#h_#!f@w#xCS8*t-Q7VYDSh78^RRSH@GE2gF_349bo~M>?~+c7*0{ zO7Zq+I*qr6hg+EHm#3bLf&%qYHz%UMfzfj=KyQhCpD9ivn3&^`0!au^D58wxW zTqtY?e&6XrVHe<-pA-rQ0X;u06h04_27CeV#Q!Z6UI+X)^lLIMGChF4T?hCN{e{9- zz+VFH1^ntjp>P-x+ZPfj+P?$rBRptCD2G39#m>mt{ z;D5-z8dagyRpYO(4(_z}8p|gxxpMyHQz=LN+wp%CJ`#!~;vhYT|0AH+p&os(uJ_^p zlc?`*(j!%&`@AbF%X~Qxnk3rt2*_pd=>vc^-+Ld~Vmvr5dGKF$@=*@spW_k1IHUlJ zx(T66QW*agsP_TLaLjC(NSDudy=a2;2Y63m9DVS+E#rI5Zet_(pTKyE@62@{ypM@` zSVt%LHz1xZr#|bDCPW<{fXp1kz*`}2*Wq0+Y|u}Podo!&O86&i{*8_I0~bAT(F1?;9?;K8>F1(2Rr7d40;57f{a}`U#_8lV$-oUX;?U1u;U*?=@GE*A zxZzG5`Z+AFOFT6Hw|^|8i62$_3_W*7)x$^%7%wQkJj=pA`M(;_&tJO@)~U@{y@HJjZdI^T!MzF|Q1GyV zM-@D-;3)-9D|l8xJaj3Jkb+?a>lCb4uu(yGJKqS`&-JZYxpGN(#-?rgR4yN$TUR^3 zwr=*^yg=v9R0MGnAp=AXUpKzl=OH$lvRLvt3z*kfhOv?IWh(jxRB)9D1CjEdModfj zU*X;s9{;AJNTT+qlz$kv?MwMDhb8O&3)=6(H|SD+%~UDB#t~Ze#`5zX2RcI zZ+U@aPuW!hGp_+K{U*+hp<>gKr1eW!+C?{m8cg?6o$~+KttB0@-IxBWHtk z187~=bQ-v+`Zgf@tyuz&l9;rH0Ox*BE{|u z+z4>g>LMpLVgZn2)ln`M>DbSszX zRxZ=6+$++pT;>_3Ce(Cr0>h(Bq&eqbsPc?RIQS~XmI$#KL6v9Z)CEpvtocfb0vZJj=sc zS5W2Iy+HN{KS!M{l}7;%1XZ3L0Ow#(<=OuLayY2+jLkU`RC%@sI!A*l&v-g|EU5B~ zZ95)RdG-)=o;J!>S2+27O*~q zPa*p`6ol+3P&vRM=2>}96&Z*U<{1Kuc~dmwiwzlrIZeO4r-c)5A)7E+qcyiJ%-8?D#_LqcN)fSFDI)eNMZ{jE7NMQ?DzyxVy-Kmw_9{ihUZuD;+pAO~5POy4l4Y+_ zObC0G+6cs6rI-o!Dis6AUZwsHh`ma&Irb{WZH~Q4F-q)Jifyx3sZQuTZFp7oa2;~3 zQu84oHx@yT8{1XEz#x@76tzm-%A#DQ5-1AUy;_#56bBfQ!HhvnF=NU%BL+id{t)jG ztlVXknH4Md8U@k(%YjOI>_VnyD*X!QpKI$fgm)$b7KGNQh|V|zkb+Il`nXJB;Lmq>JT z=&J&qC(*4&)uWVts;uU`nx}#xYksP<=BG+)e#%wz)1@^(U0U~lCbr~}5G`Ta3}F&9Jf9JR@9kTMu)G9} zGV5^+PStNIdbn(yYKFK7i>7!E?O`*7p~I7_`YU1w_G4AU-vM2Nt;`>BTeSL@a)U>K<`Jf7q&|BD~UXgsl zkM9)trA$E)xAO%)i@3M1KGZGHB@&I+WR$sUq%|XSjP>mwFa5(wuFPWhtJdk%e@z5a;cPGZ^Hx4HVeG?Jb!{kE~@4yE)lr9`iG7QI?#eII&d*4NR*s)bZ- zC|fgL%8IWVQ1l$S4NG6O@J_=eGG3$AoHjfS^Qg|g)w2~Vh3^<7Gs#^gT#F5CO-7mI zHv~M`iq)zWx8uv1Nz|SiWFPcuD!vSXsOOOE;nXm>9GB|VLb_It>)}1J%Tw#+xE|ai z$MtemdA%Ig>8feb(1)mfr5e@8_S7WRC7RMcd=J3hzy?~ov6{4ffobGy zu-*Y$SAg4X^QLNUU-t(-N6wbYF9IA0aJy~ZHjca5g8}X?%-bh$w|qFj?Y4P`XwH$q zixj&v@GgL(0dBX=*obBz#{%4Ln_ETOjt98iHn&+kt$W%qxnU?PpYZRH8^P_ic~w=A z+ilC@mc+8isNlGXZ8Zaf)NSAeKP-xUEQ$@O#jmV{?3Yler0gija)1#T+%O=fxM8Sz z79r=kvh3B%fZ!<3(9;p#)!z}^OIhYzaz>!D7#o|zaZl` z`k<{ZLBTF_+kLHTE^_0~%}x72g!9Ml5K zg~SysV+sze5$Ga`ZpH3zGZ@Asc-L=S4xZ}%1{B%-`_))~o>Dk^*!{^UTs*1Km)^J% zUOcH$Cn|r@NsYerCRX&46P&8e4BN5gtl_I#61+CJIJg$qy#3YSU>a8fNSHEG$SNP@@l^$bQq}{4Rq0S& z1g${P7M6oi;9fTYuJw4x@$0m3VG+DbL~8VSH9>H9g=f zdf>k&fZ#<-2Q4G7sE z-4B1!k!GojMH(Uri-{>>jouHqV`@ZE73rsAszS$9rH-jL=QZu58n=^1UeHN@S`Pjt zo+-MdT<4v2!6pUV5i#VnP;}z|mk>Wc-(ADy3Py%`N$iH)y>!hNc9I~)Q&?ks#?P7T zp8u+<#HaX~c&x6>`4d zHr!hKCy30+?e0vJ3L5wU;AE<{35~#;-(dLAG=J@ZL*0W}y%QUUA=4IZ6 zW6Vkrufyke%`0ywav6~ek>MshxZM0 z8eFcwqwtOQn1Nrz>$PU+hP+ulB-~+oZZ)s1!ywFoR~cTpLqCe*;E9Uz_q>=CSsf6+bh_-)jcHVwyLYfyYd9rx~YF1>6w$Y&awwU7x(1`%yb&}duO1=KVRH12IXI?=IM^tUcP0yp|x@B%h zf7J{k3bm7`*iH`IXNJ7BV~U;*EoFI%6*fbCx-|MhGxW1J6shoS*TXVi56gTEi?iEv zWOsF=KcyOdFB`ph8OXtxOn7)?ml?7Sm?LixV8S}n{H_^z6tQBB!e~EgHd<{~PRTB? z#Yf#>))ckO8y^+2H)`2S_L=kcnV~K;=z#eb%X-IQ8f_C(>No#(Qn?wAo5(ya&B`~w ziW%n3NZl`o(Kj5v(M;XI&&*(6MbRZ&Och0AA2mnbha@tm4w~VQnj@F8JPiRfvQL-B zK4@0TqZOh|T3=jg0ZHwbw3V3@#Ygl~bQ`ux|3eWNJjxzB~Qr5vG5pPq#TN%>D zS`w*d5ZmLeS=*=}HRUt0rgVG01Mh)AWlibkMAMF((VWhU*CeFdo7vuMB4^yPv0+Ul zHdn!U3eHz>fl%*=XSOHM9log{lgP5|f-c_sAbKjg7B1-k>&?b@BxEnuhB1a0PHa~# zo@d1Hz#3l+fv2w=_Sk_rZ3x&ocxG|;oK@+jd`AKgD9(vz=^vKspbPUfrhLxrCEk9~ ziH8Fd%?%m&1Fvuiubg|0x@j^zyCauRC65@%A*)8$x?o?A7 zpNh<9XXjHpld0y}IX*X)1rv>I+CIB8lg^2!AZKHL%W>0;ruKNYO|$WIA{b3A4jf$- zKFk`nj}RLfL;6h&E&8)F*_?>+**7D$L)5GXNkrGx3!L#KV#oHe81z_YyczGu$fxqz zMDslE%=vZ>Jd?IVcxxMaknfbk0b)~eJlpXm4K?7An{VE5v)JA{Mnu$w*Lp;p{?!{& z)RE4tPh|Prsv%wh0{4sOP5CB}Tg2cNpD;CY>FtTsx8Y75SDH6s3x>Baz7^b{YEF$Q$v*o?`I{O@S7l0Tig-U^PL`eg;!;I^rp`k*00B zkxSs6Bt;937Tm&@mf*oX(XuRDvWt{P@vJO*!R9g_6aj)x7DlQwoy{@tL@$+*T`SXg zh!Af?$t4;L2eLxCMRXHM$*w`aGvAI!G1DnwL0M;&%9!?vvD<0YfvnJt7Ol-HU!rLu z8)^jvI!@B^u8!?q#C8$=o4E&t*6R4HW||o2X(Wd3R|2j5Tas* zdYCwJS6=pz6(x2xs3xv3>`6TvZ%NP{8~92a&VFJfo7xgh+i%Rbw+pXeB!)Y%a^XDl z)q4o_14hxy!FCsgp5-om7oG)MHh+=)_g_R&nsxwS`<8Z+F%C0 zD&oQR@z{iak1^KJ&mRaPKHiCc*1K1o7i;={6g+r}KtIo*=?|kYRDVA+44q#`4kdql z82X7}=-lEBWoI~lejoB4JUw~OA{1Q5P<94{%$W21^BU+LW1QiBKENj&d%l18z9o+G zUVS@=uxl7ILHFS44E_9tA{*ih06tw3(i91oLw+QP$EQggm;S}U@3>qcBIsK|4@;4f z&kkHF3G+=lDjqbG-=)*O`{s=I2)dRk!VfEX_boF2Jd8YlvTdk#eiQT%+7oiM=X=A* zuO;1EW9a8>bc-Ti8@Ka zH8pX(DC~rcMirk4MgPq(_RBF34&~3^LNA2*s?HS;ya%8CJ*<>?+QH+pVeIf8Alh-q zRfCWZop*cAIz_KmH#6y5vfifX`Z}S00gk82TSUXFRz5$vZH^&W5Y<<)E`Y z`g~R2G*PGM?)xdP0e$Kac6f^>?YM9Bh=D%jd+Baz%H-zO;*2F0-nIUbXD50~Tiimb{f&Lb+*I6|#A2&&Zdf0Q zMQ&Ub!>i^>jpD3q)s`C@)~{Vz%E4YMgVVSePEKNxsIm}Ub+Zv$vu?wRhIO$Gt5@F= z*%;f{uwq?=R{37MSW`AHx+gYg_4);QZ}c)e$5xT=-s{|5qUqSX+HVS!FZr{@uECy= zuLiUUqQ-e8R@+?lmckO2>$QQR*X=He=4?79e`iOW81cG6D#jBn=O8h#u<7P&6 zVZ~Zp1ZXvccpFagjoRkjDO4dLF7gNt&R?=TQ*$CQ@G^<^I2BZ>vpr|jiXf>)v9>i0 zlm+~zkx`2iAfTMaAe|OjR-0&36IWX^tZ7WzkTaOn&}CE=??}R!R7V^cwLF)?j0jp{ zTfP;N@f3cgMx)78OInxX+qPvAJ2WO<;;EG2!68>g)4I4Z|hUJSQqW z-UbxE{-4(E*Uyt{I75l!j$d)O+aCuNH&@vGe?hfhLq0UZgKebmv_5XB5JwW9RMGY8 z=hrpV&#OymX+xI@@4`Qy1=sre`EL#NX_aojmeY{8vhvw-jUQ!0acEdCu=Crm$VM*; z^r_a@&%0~*f)dpAyZiqSN`Hlt)6dV_Pz4rT<6)Qn)*30Pp_U&`|ENp9Q|W8y9)E35!!Nt^53BvZhF2(i?)o+U zxJzH3H)@C*%1RD*{yd}f_4w=a9u4=n6!iFMqyO8budf4W_?#A0&}Gh$*DZ?i*SJs$ zYN+QSZN^>yOJLv@Kaqo!(bsSE`_bL<8rSeu=u|uO_4T5u~kdIcr0Kf`uO7HU-ebuN0SUJ|Zw(b-lW8ctODl3M&+STDgm#^23dM&tfoll*5`fyZW<+j$AtyQ<@UrRakuQsVe}{7Ddj&KkWhcR^?7}ZG`Ihr zZIv2)Aj^4ZeJ8YY*C80~kjOz5cvFG$5hES9di`Sa^w>)c`FT1gVaAoPx?U~I>1ina On|DizTU`n+)cAi_$Sg1b literal 28272 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