From 20ec920174fcbd77a425d241a5efaf7574917a43 Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Thu, 4 Dec 2025 00:21:45 +0100 Subject: [PATCH] =?UTF-8?q?on=20peut=20choisir=20le=20nombre=20de=20ligne?= =?UTF-8?q?=20et=20colonne=20mais=20il=20y=20a=20un=20probl=C3=A8me=20de?= =?UTF-8?q?=20dimension=20de=20l'image,=20le=20compteur=20a=20=C3=A9t?= =?UTF-8?q?=C3=A9=20ajouter=20,=20mais=20on=20peut=20toujours=20pas=20cont?= =?UTF-8?q?roler=20avec=20la=20souris?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- #config.h# | 9 -- affichage.c | 39 +++++---- affichage.h | 4 +- config.h | 2 +- main.c | 239 +++++++++++++++++++++++++++++++++++++--------------- partie.c | 55 ++++++------ partie.h | 10 +-- taquin | Bin 0 -> 20760 bytes 8 files changed, 227 insertions(+), 131 deletions(-) delete mode 100644 #config.h# create mode 100755 taquin diff --git a/#config.h# b/#config.h# deleted file mode 100644 index 1e41a15..0000000 --- a/#config.h# +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef CONFIG_H -#define CONFIG_H - -#define NB_LIGNES 4 -#define NB_COLS - -#define TAILLE_CASE 100 - -#endif diff --git a/affichage.c b/affichage.c index 6a95825..3d4ed28 100644 --- a/affichage.c +++ b/affichage.c @@ -4,11 +4,11 @@ #include "config.h" -void init_affichage(void){ +void init_affichage(int nb_ligne,int nb_colonne){ InitialiserGraphique(); /*La fenetre vass faire la taille de la grille*/ - CreerFenetre(100, 100, NB_COLS * TAILLE_CASE, NB_LIGNES * TAILLE_CASE); + CreerFenetre(100, 100, nb_colonne * TAILLE_CASE, (nb_ligne * TAILLE_CASE)+60); } void charger_image_source(char *nom_fichier) { @@ -22,36 +22,43 @@ void charger_image_source(char *nom_fichier) { ChoisirEcran(0); } -void afficher_plateau(int grille[NB_LIGNES][NB_COLS]){ +void afficher_plateau(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne,int coups){ int i,j; - int x_ecran, y_ecran; - int num_tuile; + int x, y; + int num; int src_x, src_y; + char text_coups[50]; EffacerEcran(CouleurParNom("black")); + /*Compteur de coups*/ + ChoisirCouleurDessin(CouleurParNom("white")); + sprintf(text_coups,"Coups : %d",coups); + /*Comme la taille de l'écran chage y n'est pas fixe*/ + EcrireTexte(10,nb_ligne*TAILLE_CASE + 40, text_coups,2); + - for (i = 0; i < NB_LIGNES; i++){ - for(j = 0; j < NB_COLS; j++){ + for (i = 0; i < nb_ligne; i++){ + for(j = 0; j < nb_colonne; j++){ /*Calcul en pixel de la taille d'une case*/ - num_tuile = grille[i][j]; - x_ecran = j * TAILLE_CASE; - y_ecran = i * TAILLE_CASE; + num = grille[i][j]; + x = j * TAILLE_CASE; + y = i * TAILLE_CASE; /*Ici on saute la case vide du taquin*/ - if (num_tuile == 0) { + if (num == 0) { ChoisirCouleurDessin(CouleurParNom("black")); - RemplirRectangle(x_ecran, y_ecran, TAILLE_CASE, TAILLE_CASE); + RemplirRectangle(x, y, TAILLE_CASE, TAILLE_CASE); continue; } - src_x = ((num_tuile - 1) % NB_COLS) * TAILLE_CASE; - src_y = ((num_tuile - 1) / NB_COLS) * TAILLE_CASE; + src_x = ((num - 1) % nb_colonne) * TAILLE_CASE; + src_y = ((num - 1) / nb_colonne) * TAILLE_CASE; - CopierZone(1, 0, src_x, src_y, TAILLE_CASE, TAILLE_CASE, x_ecran, y_ecran); + CopierZone(1, 0, src_x, src_y, TAILLE_CASE, TAILLE_CASE, x, y); /*ET on ecrit le numéro dans un rectagle*/ ChoisirCouleurDessin(CouleurParNom("black")); - DessinerRectangle(x_ecran, y_ecran, TAILLE_CASE, TAILLE_CASE); + DessinerRectangle(x, y, TAILLE_CASE, TAILLE_CASE); } } } diff --git a/affichage.h b/affichage.h index 81eaa00..591804c 100644 --- a/affichage.h +++ b/affichage.h @@ -2,9 +2,9 @@ #define AFFICHAGE_H #include "config.h" -void init_affichage(void); +void init_affichage(int nb_ligne,int nb_colonne); void fermer_affichage(void); void charger_image_source(char *nom_fichier); -void afficher_plateau(int grille[NB_LIGNES][NB_COLS]); +void afficher_plateau(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne,int coups); #endif diff --git a/config.h b/config.h index e05d241..e794870 100644 --- a/config.h +++ b/config.h @@ -2,6 +2,6 @@ #define CONFIG_H /*La grille doit être en 3 et 8 */ #define MAX_TAILLE 8 -#define TAILLE_CASE 100 +#define TAILLE_CASE 60 #endif diff --git a/main.c b/main.c index dc642d4..bd0a4f0 100644 --- a/main.c +++ b/main.c @@ -6,85 +6,190 @@ #include "partie.h" int main(void){ - int grille[NB_LIGNES][NB_COLS], touche; + int grille[MAX_TAILLE][MAX_TAILLE]; + int ligne=0, colonne=0, touche, coups; char *nom_image = NULL; - int choix_fait = 0,jeu_fini = 0; + int choix_image_fait = 0; + int choix_lignes_fait = 0; + int choix_colonne_fait = 0; + int jeu_fini = 0; + int vouloir_rejouer=1; - init_affichage(); - - EffacerEcran(CouleurParNom("white")); - ChoisirCouleurDessin(CouleurParNom("black")); - - EcrireTexte(50, 50, "MENU TAQUIN", 2); - EcrireTexte(50, 100, "Choisissez votre image :", 1); - EcrireTexte(50, 150, "Touche 1 : Image 1", 1); - EcrireTexte(50, 180, "Touche 2 : Image 2", 1); - EcrireTexte(50, 210, "Touche 3 : Image 3", 1); - EcrireTexte(50, 300, "(Appuyez sur q pour quitter)", 1); - - while(choix_fait == 0) { - if(ToucheEnAttente()) { - touche = Touche(); - - - if(touche == XK_1 || touche == XK_KP_1) { - nom_image = "image1.png"; - choix_fait = 1; - } - else if(touche == XK_2 || touche == XK_KP_2) { - nom_image = "image2.png"; - choix_fait = 2; - } - else if(touche == XK_3 || touche == XK_KP_3) { - nom_image = "image3.png"; - choix_fait = 3; + InitialiserGraphique(); + + while(vouloir_rejouer ==1){ + choix_image_fait = 0; + choix_lignes_fait = 0; + choix_colonne_fait =0; + jeu_fini = 0; + coups=0; + ligne=0; + colonne =0; + /*Fenetre du menu*/ + CreerFenetre(100,100,400,400); + /*Le choix de l'image*/ + + EffacerEcran(CouleurParNom("white")); + ChoisirCouleurDessin(CouleurParNom("black")); + + EcrireTexte(50, 50, "MENU TAQUIN", 2); + EcrireTexte(50, 100, "Choisissez votre image :", 1); + EcrireTexte(50, 150, "Touche 1 : Image 1", 1); + EcrireTexte(50, 180, "Touche 2 : Image 2", 1); + EcrireTexte(50, 210, "Touche 3 : Image 3", 1); + EcrireTexte(50, 300, "(Appuyez sur q pour quitter)", 1); + + while(choix_image_fait == 0) { + if(ToucheEnAttente()) { + touche = Touche(); + + + if(touche == XK_1 || touche == XK_KP_1) { + nom_image = "image1.png"; + choix_image_fait = 1; + } + else if(touche == XK_2 || touche == XK_KP_2) { + nom_image = "image2.png"; + choix_image_fait = 2; + } + else if(touche == XK_3 || touche == XK_KP_3) { + nom_image = "image3.png"; + choix_image_fait = 3; } else if(touche == XK_q || touche == XK_Q) { fermer_affichage(); return EXIT_SUCCESS; } - } - } - - charger_image_source(nom_image); + } + } + /*Choix de la taille*/ + /*Lignes*/ + EffacerEcran(CouleurParNom("white")); + EcrireTexte(20,30,"Combien de lignes ?",2); + EcrireTexte(20,80,"Appuyez sur une touche",1); + EcrireTexte(20,110,"entre 3 et 8",1); + + while(choix_lignes_fait ==0){ + if(ToucheEnAttente()){ + touche=Touche(); + + if (touche == XK_3 || touche == XK_KP_3) { + ligne = 3; choix_lignes_fait = 1; + } + else if (touche == XK_4 || touche == XK_KP_4) { + ligne = 4; choix_lignes_fait = 1; + } + else if (touche == XK_5 || touche == XK_KP_5) { + ligne = 5; choix_lignes_fait = 1; + } + else if (touche == XK_6 || touche == XK_KP_6) { + ligne = 6; choix_lignes_fait = 1; + } + else if (touche == XK_7 || touche == XK_KP_7) { + ligne = 7; choix_lignes_fait = 1; + } + else if (touche == XK_8 || touche == XK_KP_8) { + ligne = 8; choix_lignes_fait = 1; + } + + if (touche == XK_q) { FermerGraphique(); return EXIT_SUCCESS; } - initialiser_plateau(grille); - - melanger_plateau(grille); - - afficher_plateau(grille); - - while(jeu_fini == 0){ - - if (ToucheEnAttente()){ - touche = Touche(); - - /* Pour quitter on clique sur q */ - if (touche == XK_q || touche == XK_Q) break; - - - /* Déplacement +on affiche la nouvelle grille */ - deplacer(grille, touche); - afficher_plateau(grille); - /*On vérifie si on a gagner */ - if(verifier_victoire(grille) == 1 ){ - jeu_fini = 1; } } - } - - if (jeu_fini == 1){ - ChoisirCouleurDessin(CouleurParNom("white")); - RemplirRectangle(50,150,300,100); - - ChoisirCouleurDessin(CouleurParNom("red")); - EcrireTexte(60,200,"Bravo",2); - EcrireTexte(60,230,"Appuyer pour quitter...",1); - - Touche(); - } + /*Colonne*/ + EffacerEcran(CouleurParNom("white")); + EcrireTexte(20,30,"Combien de colonne ?",2); + EcrireTexte(20,80,"Appuyez sur une touche",1); + EcrireTexte(20,110,"entre 3 et 8",1); + while(choix_colonne_fait ==0){ + if(ToucheEnAttente()){ + touche=Touche(); + + if (touche == XK_3 || touche == XK_KP_3) { + colonne = 3; choix_colonne_fait = 1; + } + else if (touche == XK_4 || touche == XK_KP_4) { + colonne = 4; choix_colonne_fait = 1; + } + else if (touche == XK_5 || touche == XK_KP_5) { + colonne = 5; choix_colonne_fait = 1; + } + else if (touche == XK_6 || touche == XK_KP_6) { + colonne = 6; choix_colonne_fait = 1; + } + else if (touche == XK_7 || touche == XK_KP_7) { + colonne = 7; choix_colonne_fait = 1; + } + else if (touche == XK_8 || touche == XK_KP_8) { + colonne = 8; choix_colonne_fait = 1; + } + + if (touche == XK_q) { FermerGraphique(); return EXIT_SUCCESS; } + + } + } + + FermerGraphique(); + init_affichage(ligne,colonne); + + + + + + charger_image_source(nom_image); + + initialiser_plateau(grille,ligne,colonne); + + melanger_plateau(grille,ligne,colonne); + + afficher_plateau(grille,ligne,colonne,coups); + + while(jeu_fini == 0){ + + if (ToucheEnAttente()){ + touche = Touche(); + + /* Pour quitter on clique sur q */ + if (touche == XK_q || touche == XK_Q) break; + + + /* Déplacement +on affiche la nouvelle grille */ + deplacer(grille,ligne,colonne,touche); + coups++; + afficher_plateau(grille,ligne,colonne,coups); + /*On vérifie si on a gagner */ + if(verifier_victoire(grille,ligne,colonne) == 1 ){ + jeu_fini = 1; + } + } + + } + + if (jeu_fini == 1){ + ChoisirCouleurDessin(CouleurParNom("white")); + RemplirRectangle(50,150,300,100); + + ChoisirCouleurDessin(CouleurParNom("red")); + EcrireTexte(60,200,"Bravo",2); + EcrireTexte(60,230,"Rejouer ? (O/N)",1); + while(1) { + touche = Touche(); + if (touche == XK_o || touche == XK_O) { + FermerGraphique(); + InitialiserGraphique(); + break; + } + if (touche == XK_n || touche == XK_N) { + vouloir_rejouer = 0; + break; + } + } + } + + } + fermer_affichage(); diff --git a/partie.c b/partie.c index c3a1b47..df5efe8 100644 --- a/partie.c +++ b/partie.c @@ -1,35 +1,35 @@ #include "partie.h" -/* On inclut stdio au cas où */ #include #include #include #include -void initialiser_plateau(int grille[NB_LIGNES][NB_COLS]){ +void initialiser_plateau(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne){ int i, j; int compteur = 1; - for (i = 0; i < NB_LIGNES; i++){ - for(j = 0; j < NB_COLS; j++){ + grille[0][0]=0; + + for (i = 0; i < nb_ligne; i++){ + for(j = 0; j < nb_colonne; j++){ + /*On saute la 1er case*/ + if (i == 0 && j== 0)continue; grille[i][j] = compteur; compteur++; } } - /*On laisse la dernière case du tableu vide pour le taquin*/ - grille[NB_LIGNES - 1 ][NB_COLS - 1] = 0; } -void deplacer(int grille[NB_LIGNES][NB_COLS], int touche) { +void deplacer(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne,int touche) { int i, j; - int vide_i, vide_j; + int vide_i = -1, vide_j = -1; int cible_i, cible_j; int temp; /* Trouver la case vide */ - vide_i = -1; - for(i = 0; i < NB_LIGNES; i++) { - for(j = 0; j< NB_COLS; j++) { + for(i = 0; i < nb_ligne; i++) { + for(j = 0; j< nb_colonne; j++) { if (grille[i][j] == 0) { /*vide i/j est l'adresse du trou*/ vide_i = i; @@ -49,8 +49,8 @@ if(touche == XK_Up) cible_i = vide_i - 1; if(touche == XK_Down) cible_i = vide_i + 1; /* Vérifier les bords */ -if (cible_i < 0 || cible_i >= NB_LIGNES || - cible_j < 0 || cible_j >= NB_COLS) { +if (cible_i < 0 || cible_i >= nb_ligne || + cible_j < 0 || cible_j >= nb_colonne) { return; } @@ -60,7 +60,7 @@ grille[cible_i][cible_j] = 0; grille[vide_i][vide_j] = temp; } -void melanger_plateau(int grille[NB_LIGNES][NB_COLS]) { +void melanger_plateau(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne) { int i; int touche_aleatoire; int direction; @@ -76,28 +76,21 @@ void melanger_plateau(int grille[NB_LIGNES][NB_COLS]) { else if (direction == 1)touche_aleatoire = XK_Up; else if (direction == 2)touche_aleatoire = XK_Right; else touche_aleatoire = XK_Down; - deplacer(grille, touche_aleatoire); + deplacer(grille,nb_ligne,nb_colonne,touche_aleatoire); } } -int verifier_victoire(int grille[NB_LIGNES][NB_COLS]){ +int verifier_victoire(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne){ int i,j,compteur = 1; - for(i = 0; i < NB_LIGNES; i++) { - for(j = 0; j< NB_COLS; j++) { - /*La dernière case en bas a droite doit être vide */ - if (i == NB_LIGNES - 1 && j == NB_COLS - 1){ - if(grille[i][j] != 0){ - return 0; - } - } - else { - /*les autres cases doivent être dans l'orde*/ - if(grille[i][j] != compteur){ - return 0; - } - compteur++; - } + if(grille[0][0]!= 0)return 0; + + for(i = 0; i < nb_ligne; i++) { + for(j = 0; j< nb_colonne; j++) { + if (i == 0 && j == 0)continue; + + if(grille[i][j] != compteur)return 0; + compteur++; } } return 1; diff --git a/partie.h b/partie.h index 88e87dc..e150450 100644 --- a/partie.h +++ b/partie.h @@ -3,11 +3,11 @@ #include "config.h" -void initialiser_plateau(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_cologne); -void deplacer(int grille[MAX_TAILLE][MAX_TAILLE], int touche); -void deplacer_souris(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_cologne,int clic_x,int clic_y); -void melanger_plateau(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_cologne); +void initialiser_plateau(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne); +void deplacer(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne, int touche); +void deplacer_souris(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne,int clic_x,int clic_y); +void melanger_plateau(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne); -int verifier_victoire(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_cologne); +int verifier_victoire(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne); #endif diff --git a/taquin b/taquin new file mode 100755 index 0000000000000000000000000000000000000000..6ddb01e21232c81c01fa72d9c57618be48a43fde GIT binary patch literal 20760 zcmb<-^>JfjWMqH=W(GS35HCRxBH{p{7-o1v84L^z4h$9yybKNuatyKzYzzzxEMPH+ zJWM@|zQF_$htV7mE(0@Ep9F}(z`%e`%Rtq^XpoygLLeGsABc?&pWuRs!e|Bo2p^=6 z6~u({Vd5~_7Ag*-Vd5ZtVEYU}ni&`v&}bg0`(ZS)K2X>ku!ZP5;EPJXfQHKlC=JsG z;)3*Dfa<#d)d!iYzyPCR;R$jh2wOnigHFTZ14g6ktAOf5r(Gb6)4773b?2fvpF*3zQT>^_Fo+GpAUPNY@rlK27#J9YuqbZCAr7)b0gL)mIMlo05dVQgJO_t( z4-WBo9O9tx!sbpL1_lOf;;xJg3`$u16~c%;eCFV=HwcILM;zkfILx=lA$}i+IeT%4 zv*9qu0f)FQ4si_};tcWe>ACrN@x>*HMJ4g^4Dp^JzVRukMXBkT#U-glA->Kz`FW`! ziAg!B5IL+euE|B2MX4dF6(y+*&Kdcc#hFE}$wi5I46bQuiOH!@4phcDzceScw8$m3 zxHvP9!8yMmGqorxKQEObB)>E{Bh@v}v7{t5uOyYhEwv~&waC3Fu^=O}ur!q+C^fer zC$lIhHMt})FFhxf!MP|kwa6_sFSVp7mBBMFvm`SyC$kt?3&fICBs~yI7@&>_NG$Tp z&t-7VNGwWEE%MAwOiy*o&r4y52L(uSc6@S1c6?f5W)4G1W^O7&e0)x3QZh)Ys3bl& zF*A>$xF`{!85m&VF#Z95h&ZT> zhgL;kffGpL(5f9QegR3G8!Q4LZXk*CK!m{L10->Aun3fZx`&;C0o?9^iZXB@i9@Rf zu#^CjIC42Gfg}#96Tpf=We$=!$Zs%l4J2`p-7s+jBym_6f#fWZ#5q9%Q0#yt&I=U- zQ65O*d>{cR4nPv;hl+uy2qbY(843~u;RGacXp;~m%#eX34vliKcma~QFjxdaR3M3i z>OF`k149FnxF}4Jfq|g|Nn8v`d;*fV1d{kDb2J1-Ltr!nMnizK5cte5_sgUC4TncJ z>qdJ929MSQB~1S>cr+j3I1D!Ezv(G^28REtXY3gm_~jiK{;Puc86dfr5B~rE|6lcx zJp)4qs5S8N0+_!G#0OQGFAsqEn?QU}mHu)An7<0d2UVRf7l8STKzvY@`Eml7KMTYM zRh2Ir!2C%dKB$U(SpepDf%u@R@nr&--vr`=s>GK8V15;d4{9pBbO7^07GC`=hVdTj+k@zBf41)?l}l!$tCv&z{)qK5PT1Ah4ikix@I+N0O@AxN^< z^cINH{O8g6!QX^=P&|1R8ko=zLnj>(OmnX9sfP23rP(7s>zs|3AiBV#mP17<(Au-ot4KHYk07 z%zK&s|Ns9`kIttajc-8xjTDb=7F7)f1_qB#*B^!lj<+89_y0f06USRmKv^EgTVFt# z$6G<+2$8-57rOyx-GQ?};SWl9J3xwGH2wYm|K($L1_t5{I0H8d(?vTcFfuUg0ulQ_ zV-fp7#EW--|Nr;sWj!qe^2_lT`XFxS@fYDBx|ekqR9FJU?L7WM;qU+dJ3%?YqnC9F zSnkk1(CEQ_5b@&Cpa1`Nf}HQs%Q^`v3$g?vdjv_g7b-iAfq?-cy9`OT2`akM+7g_WASw|H}&u3=EJ!&HeNLf9nDMmVI!M)qno~?`(bY@Bjbi zy&%%Cgr^bA*!Z7;p;XGFm(>JpC^$YLQ33Mg>w1WCBbf3{Fy#X1%0VIaIsl^F7^ZwP zO!*sWP}n1x4k}t+D?*ePmT*ECfu;N}{5hb$c=?2tfuVUXI9c(xDE|k?Av@Td<1ey* z|NrmNdHluX--yVX43;~zPYx7lpw{XOQ;;mkA0EA|olsd&OLRY2RvbyT2`ZZh*ZcF= z|Nk#R;|!1>mHG_{Qe#G_^Ik;!Mh#L_PfJ4b3&@+tTd(~4{~zRxmp2$dUIImc2`q@V zfPx6B8dSa_sa^$FZ3f*DC^2qd`8VM@0nDFv0; zNJ=#!N-bbYcYu_NKpX%n&Jju>3JXg`AOR-%>;Hc+>!l0}$kU)OVBl|A_YWM8_L89V zaQwyMpOAPw{Sy(7%u*mZl$$|pVqnGs{Sm&XAh176DS@*%AoNGj@}mrKmPyko(eLj8(c+nUh6#m!j6f7!J`|T z-$B_lhlzm!s-_oIXnXXwf~w`tb0En)7Ce%oYzz$Dy`Ul=s(&kzevs~PCI*I=8{q|A z(RWDv&WDR^_>LOCh5Rl3@QfA6-_pbYvH_GQaoFGsO24fjCotl5$yr7`{&)#0%ziMI zavg64RfV8b)VvqOV&HFa`VT6WK^#W@*6W}ex0h8;43r6uzi9df$sk?d{{PY2a&|33kt*`u@e$9|AMU(EUnE_bepLV{Hr z#O*x(A{az>yZ!*Br0ZY*|KAUC=ZoC0NTwWV@aU|a(OEjBGju|yZx33t$fK9F32Nr` zFOaDE52AZn3!%aXK-|vbFHU^<|Gzu5$D`NvfJZNHBv=-d{vlqw1(J20l6}CYw?G4= z2GRuSJhUIwD1MRs<^TWVu1i3!d&$Mfz;N7k1(^K~lz3g2c+BuP_<+@;^N>fk>kJRZ zL*1?`JZ5yWG2_TK3MSVL-L6Z(j4jQzYZyw6J$hMBia-KG4(dWRkQ++3bh~cY z2}&iqKt$*97yCc||Njy+!_e)zruhZq%u-kV- zpd;8A#~omEK=A}}G9)^xKmY&l(R@U}qnFhg>WUd4q0Zwk7JUByzZ=sPl3)J+Z+2b5 z*zLN)+I0ed4;v`cxGrJrc3ooaI)%UI)xZD$CwO$bf|3%X-CDx>;>c%MQi6nX%jf_9 zC&WV1R%h*t&eA8Hp%0F`{sAQsk8al&$3ZS+IPUrdM8Ebv?h2atV0dlTT>FKgl&!h; z2SbT!x9b<=;C|uJ%fkdpK{L8T|8$BpHoN{|e9bta+4Towx9bmU*9SF+nq9vzcDsJD zc70N_b^^ls8=a+BIzumX`kp!N`Ucc#Iqv!aLOlUn?{eJr1(>1V?fL}S${XMqegTf* z)&r$H-L6kMUEg%OzUXxQ(CqqxvD@{9wd;kNlg+MA7`t7cSi4@S+0yO$rqlIHx9f*a z*B_0wX97XhIA^!(hvpZI5RqWG$N{KG5LDz1Sk0Hl+A|?=5s;cMpirqO0sHJqZ4M}O zD$>AyzEB&77D^B&{{TC=)AbK7+2bsr(wL#!^$n_j!9o1N0~*Ay8DW9g{6@h89*>Z` zYxwE^|IXttZhZu07)U&(z2E@}9_qYs@Q3`t7jle;njbN19_kGJ(_H(9p_KEu>km+P zyjE?l{lf_6g1r7(thx3N6PODMo7e2eU4MWApxgIHcj$xe(kGw<11dLkL9J@nFO1E# zUzqBqOn?wD>v`mdt`-$;=KEpwMKdixxyLz;O-Cv@*3yp}4e2p-`b9A4HXA zmXxFxX)=IKH`FW0ONTIx5KLn*(>XskDKj-sAthBICo?@SwOGNP0olOPyi|n}@LEuY z)I5-TjTKT$6f78!^d;x#jVY{2GC-HFZcfcpTfYvVDjMq{~87c2Hl7M|Lq&NTn*Dx|LTz~uj z{~SgJhT?bs|L84?72F5*j29+6%Ga{{R1KAO$Y$pfv~# zDj+v7Ffc^i`~M#_*UrEv;KnE6#m`;N(ZFCYWvykb0$$z>(i_9Tz>xXi|Nkz~G>s#l zKpT@YFB@|!2M;?314tg^kIOIq{|BuAV1UV2fMglK@}RZPA71?b4_ey|muGSWD*)*S z`Cshi|NkdILq#zC%!e643PAFpaM}0j|9{Y83AlbAkSxS}P_5Xi8$bT^XOjTe7 zApM|l{-g z(GVC7fzc2c4S~@R7!85Z5Eu=C!5#tupq0iTM?z^((;LJEwRJ%>j1Su51>%DiK7(l3 zhA+^Z457<`?)|1lR)C& zJ_iG${{&jJ1`>zw^#ZLBXJBA}i90|Y45b(jfD|(@FhG?t!0iA1AL1Vd=$5sAFg{e{ ze<&a7e1;ED{yC^cKcRe>yP?+5or3KjN4MAv+>2yjaD&oeP&y4tmqF<^C_N2IFN4zC zp!6{)eGN)KgVNuiG#j|n$G{*4rPZLc8I*Q|(qT{<=1$oDKzCn6(T7bO)X&By4$_NFToxq3APC>b4(39S z31DOpho@7RIH>Q;$RNsq9v{t&p#8}b3^PEhQDKT17#Kjw9GbO}L>U-B;}F=yv%&j; z`52hxA?)KOY*-;4uXT z28MJT<~M@(&tk@JACCR!E1~A=LBj!-Ep~y$K`ubW=WvMM!y*0}z zjrVW~Vu*M5@pp3ciT8JN3w8~O4{>zzagAq)cZu|K^!0ScvLzm|ojx};CowNQwJ5$I zC$S_ou@rr)e==m#dpvl&HoiE&v?v+JE_%?`_DlwpP5zKQ{Lt<5nTW0TaLcf6_J?e~ zN9^!NIUWGt(E}hG;^AS&5bx<9UtE%snHOJLoSMQ=mRgjVmYG@{zwM93a~hWL2ojr$I;jrpKG_-Ww72axQ9?&?QTuhIT~Y**DN8LX&dkq4;lvj)=oO{rB!VQ^>XoEc zlrZR}W#(lv=oRII{j8Uo5ua9+n421(ky69}=RtJDCl(bYRzh^Z*eR8HiMg4{40`GL zC164iYyrfuq~c-*z2yAd+|;}hNM@&;1QlnXwhyd*jO%X_k7lJm2BDo*dpMcSzErcL-F!#gkfzfpg3=E*Y3XBi;Ak?9- z_(OL;$V?FKg|>BI`eFSg7!B($!R&_`3-32ghw66%83w|zjun)K)w3Y|pgtP9{)N!< zI6(3s?Vu(YG7U=KU_O*UkAG0R7Zj#2{R+^22#f~Ll|l7_D5x~tn&oKr!`jU-`T}T& zFi0a5!}LSB3~SN!!`j6#8rJWIsYiGJW~hEx_@kdYrUmjGOfxjBk+=+?b~i`~Oh2x3 zwqSbD?LUcT{{-lHT`(FncL~!AqG9m|VuSEy1_lOD5J9so{G1rrIb7)KVSE@3I`0Uy z=^CaVHr{Xo+AxQy1K9<_Fg}ca4IOKM>4){VVCSmA&QAlSe`Nizcm%EY2ZbL@KkR&( z1NI=*3=E*{%n%lYgxL$De?r3#rXMz5@dB!U14J8~gz1CPOpK88Xkhwb{lXd0j0PJ@(@+(X)h~|ab5AF7Vguoc4A3guU^dr--v