/*  POTM ENTRY:  QuackTheDuck */
/*  Wolfram Hinderer (Eulfe)  */
/*  Your email:  bords@my-dejanews.com */
/*  compile instructions: cc QuackTheDuck.c    */

#include <stdio.h>
#include <string.h>

#include <sys/times.h>

#define TRUE 1 
#define FALSE 0

#define MAXGA 6                         
/* Maximal number of guesses that are collected before a guess is made.
   Only used in specialmode, i.e. after a guess with wordlen-1 hits. */
#define MAXWLEN 9  
/* maximal lenght of word */
#define MAXGUESSES 101
/* Maximal number of guesses that are allowed. It's funny that Fred did not
  make this 100, but 101. I had planned to submit another entry using 101 
  guesses for every word, but I did not have the time to do it. */

FILE *f;
/* Used for storing data between runs of the program. Stores the rank list
   afer the first run, which decompresses it. */

int wordlen;

char rank[MAXWLEN-2][26][26][27]; 
/* rank[pos][c1][c2][] stores the rank list of characters on position pos+2,
   given that on positions pos and pos+1 there are the character c1 and c2,
   respectively. */
char rank1[26];  /* rank list of the first letters of words */
char rank2[26][27]; 
/* rank list of the second letters of words, given the first letter */

char arank[MAXWLEN-2][26][26][27];  
char arank1[26];
char arank2[26][27];
/* the rank lists are saved in arank, arank1, arank2. rank, rank1 and rank2
   are filled up from these. */

int guesses;                   /* number of guesses already made */
char s[MAXGUESSES][MAXWLEN];   /* these guesses */
/* 0..25 are used for storing of characters. Exception: finalguess */
char h[MAXGUESSES],m[MAXGUESSES],nh[MAXGUESSES],nm[MAXGUESSES];
/* Number of hits, misses, non-hits, non-misses of the guesses. Should probably be integers or shorts. */
char h1[MAXGUESSES],nh1[MAXGUESSES],nm1[MAXGUESSES];
/* Number of hits, non-hits, non-misses if the word in the array guess was the
   hidden word. Builds up as guess builds up. */
char charanz[MAXGUESSES][26];
/* charanz[g][c] is the number of letters c in guess number g */
int charinguess[26]; /* Number of character in (new) guess */
char guess[MAXWLEN],finalguess[MAXWLEN+1],guessarr[MAXGA][MAXWLEN];
/* new guess (building up), the guess that is written,
   array of possible guesses (in specialmode) */
int anzpossguesses;    /* Number of possible guesses (in specialmode) */
int specialmode;       /* TRUE iff a guess with wordlen-1 hits has been made. */
char specialword[MAXWLEN];  /* the guess with wordeln-1 hits */

int bestsum;           
/* When no possible guess is found in 10 seconds, I guess the following word:
   whenever a word is found, that is possible except for that it has not enough
   non-misses for one of the previous guesses, the "number of non-misses" minus
   the "number of non-misses if this word was the hidden word" is summed 
   over all previous guesses. A word minimizing this sum is the output. */
   
int maxdepth;
/* only letters with a rank not exceeding maxdepth are used */

char relaxed;
/* If I can't find a possbile guess, then I relax the conditions, 
   i.e. the rank lists are filled up with the missing letters. */


void relax()   
/* Fills up ranklists with missing letters.
   Called when no possible guess can be found.
   For example, if the hidden word was QQQQQQQ, the rank lists for "QQ" would
   be empty, and earlier or later the program would find out, that there is
   no guess possible. The ranklists then are filled up, and every combination
   will appear somewhere, and is thus possible. */
{ 
  int i,j,k,l,m; 
  char d[26],d1[26];
  for (i=0;i<26;i++) d1[arank1[i]] = i;
  /* d1 stores which rank each letter has in the rank list for 
     the first letter */
  for (i=0;i<26;i++) {
      memcpy(d,arank1,26);
      k=0;
      for (j=0;j<26;j++) 
          if (arank2[i][j]>=0) 
             d[d1[arank2[i][j]]]=-1;
          else{
             for (;d[k]<0;k++);
             arank2[i][j] = d[k++];
          }
  }
  for (i=0; i<wordlen-2; i++)
    for (j=0; j<=25;j++)
        for (k=0; k<=25;k++) {
            memcpy(d,arank1,26);
            m=0;
            for (l=0;l<26;l++)
                if (arank[i][j][k][l]>=0)
                   d[d1[arank[i][j][k][l]]]=-1;
                else{
                   for (;d[m]<0;m++);
                   arank[i][j][k][l] = d[m++];
                }
        }
   /* The missing letters are added to the rank lists */
   maxdepth=1;    /* Start it all over */
   relaxed=TRUE;  /* Now we are in relaxed mode */
}




void saveandexit()
/* I finally found a guess. Save state in temporary file, print guess, exit */
{ 
  if (specialmode)  
/* If I have already found a word which right except for one letter, 
   I do something special */
  { 
    int i,j,anzdca,aapg=anzpossguesses;
    char dca[MAXGA*2],notnew[MAXGA*2],c,nnpos[MAXGA];
    for (i=0;i<anzpossguesses;i++)
      for (j=0;j<wordlen;j++)
          if (guessarr[i][j] != specialword[j])
             {dca[i] = dca[anzpossguesses+i-1]=guessarr[i][j]; nnpos[i]=j;}
    /* The collection of possible guesses is compared to specialword, i.e. the
       guess which was almost right. The different letter and its location
       are stored. */
    for (i=1;i<anzpossguesses;i++)
        for (j=0; (j < i) && (i<anzpossguesses);)
            if (dca[i] == dca[j]) 
               {dca[i] = dca[anzpossguesses-1];nnpos[i]=nnpos[--anzpossguesses];}
            else 
               j++;
    /* Only different letters are interesting in special mode */               
    anzdca = 0; 
    /* The number of letters that are possible for the new guess, but 
       appear already in specialword. The corresponding guesses will now be
       moved to the start of the array. */
    for (i=0;i<anzpossguesses;i++){
       notnew[i] = FALSE;
       for (j=0;j<wordlen;j++)
           if (dca[i] == specialword[j])
              notnew[i] = TRUE;
       if (notnew[i]){
          notnew[i] = notnew[anzdca];
          notnew[anzdca] = TRUE;
          c = dca[anzdca];
          dca[anzdca] = dca[i];
          dca[i] = c;
          nnpos[anzdca] = nnpos[i];
          anzdca++;
          }
     }
     
     if ((anzpossguesses>=4) || ((anzpossguesses==3) && (aapg>4)))
     /* It only makes sense to use special output if there are at least 4 
        different (new) letters in the possible guesses. Or if there are 3,
        but before uniquifying them there were more than 4. */
     {
        finalguess[0] = dca[anzdca]+'A';
        for (i=1; i<wordlen; i++)
            if (i<=2) finalguess[i] = dca[anzdca+1]+'A';
            else if (i<=5) finalguess[i] = dca[anzdca+2]+'A';
            else  finalguess[i] = dca[anzdca+3]+'A';
        /* Use one letter one, another letter twice, another letter thrice, 
           and fill the word up with another letter. */
        for (i=0; i < anzdca; i++){
          finalguess[wordlen-1] = finalguess[nnpos[i]];
          finalguess[nnpos[i]] = dca[i]+'A';
        }
        /* Guessing letters that are already in specialword does not 
           give information unless they are placed in their possible
           location. */
    }
    else if ((aapg!=0) || (finalguess[i]==-1))  
        /* This should be (finalguess[0]==-1), I think. Another Error! 
           But I think it was meaningless anyway. */
        /* If there have been 1 to 3 possible guesses, use the first of them.*/
         for (i=0; i<wordlen; i++) finalguess[i] = guessarr[0][i]+'A';
         
         
         
    if ((aapg==0) && (relaxed) && (finalguess[i]==-1))
    /* If no word was found, and we are in relaxed mode, and some other 
       funny condition is fulfilled (no word was almost right), then 
       something with high ranks is printed. Note that this can only happen
       when time is almost over: in relaxed mode every combination on letters
       will be found, if there is enough time. */
    {
      guess[0]=arank1[guesses];
      guess[1]=arank2[guess[0]][guesses];
      for (i=2;i<wordlen;i++) guess[i]=arank[i-2][guess[i-2]][guess[i-1]][guesses];
      for (i=0; i<wordlen; i++) finalguess[i] = guess[i]+'A';
    }  
         
    
    if ((aapg==0) && (!relaxed)) relax();
    /* No possible word and not yet relaxed: relax! Can happen only when time
       is over. finalguess has already been determined by checktime() */
          
    finalguess[wordlen]=0;
  }
  
  printf("%s",finalguess);
  
  f = fopen("TEMP.QuackTheDuck1","w");  /* filename proposed by Fred */
  fwrite(&wordlen,sizeof(wordlen),1,f);
  fwrite(&guesses,sizeof(guesses),1,f);
  fwrite(arank1,26,1,f);
  fwrite(arank2,26*27,1,f);
  fwrite(arank,(MAXWLEN-2)*26*26*27,1,f);
  fwrite(&maxdepth,sizeof(maxdepth),1,f);
  fwrite(s,MAXGUESSES*MAXWLEN,1,f);
  fwrite(h,MAXGUESSES,1,f);
  fwrite(m,MAXGUESSES,1,f);
  fwrite(nh,MAXGUESSES,1,f);
  fwrite(nm,MAXGUESSES,1,f);
  fwrite(charanz,MAXGUESSES*26,1,f);
  fwrite(&specialmode,4,1,f);
  fwrite(specialword,wordlen,1,f);
  fwrite(&relaxed,sizeof(relaxed),1,f);
  close(f);
  /* Everything I might need again is saved. */

  exit(0);
} 
 
  


void checktime()
/* Is there enough time left to look for possible guesses? */
{
static struct tms TMS;
times(&TMS);
if (TMS.tms_stime + TMS.tms_utime > 950)  /* 9.5 seconds over, time to go! */
{
   int i,j=0;
   if (anzpossguesses==0) 
   if (finalguess[0]==-1)
   /* time is over, but no guess found */
   {  
      for (j=0; j<maxdepth; j++)
          if (rank1[j]>=0) guess[0]=rank1[j];
      guess[wordlen-1] = guess[0];
      for (j=0; j<maxdepth; j++)
          if (rank2[guess[0]][j]>=0) guess[1]=rank2[guess[0]][j];
      for (i=2; i<wordlen; i++)
          for (j=0; j<maxdepth; j++)
              if(rank[i-2][guess[i-2]][guess[i-1]][j]>=0) {guess[i] = rank[i-2][guess[i-2]][guess[i-1]][j];}
      for (j=0; j<wordlen; j++) finalguess[j]=guess[j]+'A'; 
      /* finalguess is filled with high ranked letters */
      finalguess[wordlen]=0;
      if (relaxed) for (j=0;j<wordlen;j++) {finalguess[j]+=j+guesses*wordlen;while ((finalguess[j]>'Z') || (finalguess[j]<'A')) finalguess[j]-=26;}
      /* seems to be useful, as relaxed rank lists look to similar: 
         I don't want to guess QQQQQQQQQ over and over again. */
/*      if (maxdepth<25) maxdepth++; */ 
/* Not sure if this is useful, but seemed no longer necessary */
   }
   saveandexit();
}
}


void doguess()
/* Hey, I found a possible guess! What should I do with it? */
{
  int i,j;
  char newguess=TRUE;
  /*           ^^^^^ this was missing in the submitted version */
  
  
  /* I played around a little with restrictions on the first guesses:
     no repeated letters and so on. Not sure if it's useful. */
  if ((guesses<1) && (wordlen<=9))
  {
    for (i=0; i<26; i++)
        if (charinguess[i]>1) return;
    if (charinguess[guess[wordlen-1]]>0) return;
    if (charinguess[25]>0) return;
  }
  else if ((guesses>0) && (guesses<3) && (h[guesses-1]<2) && (wordlen<=9))
  {
    for (i=0; i<26; i++)
        if (charinguess[i]>h[guesses-1]+guesses/2+1) return;
    if (charinguess[guess[wordlen-1]]>h[guesses-1]+guesses/2) return;
  }


  
  for (i=0; i<wordlen; i++) finalguess[i] = guess[i]+'A';
  finalguess[wordlen] = 0;
  /* the final guess is determined... */  
  if (!specialmode) saveandexit();
  /* ... unless I am in specialmode! */
  for (j=0;j<anzpossguesses;j++)  
  /* I have to check if this guess is already in my list: when maxdepth is
     increased, all possible guesses in the list will be found again. */
      {
      newguess=FALSE;
      for (i=0; i < wordlen; i++) 
          if (guess[i]!=guessarr[j][i]) newguess=TRUE;
      if (!newguess) break;
      /* If one letter differs, then the words are different */
      }
  /* guess has been compared to every word in the list. If it's not new,
     everything is ok, nothing has to be done. But if it is not new, then
     the value of newguess is only defined if the list is not empty. So if
     the list is empty, it might stay empty... something like that was what
     happened with my entry. */
  if (newguess) {memcpy(guessarr[anzpossguesses++],guess,wordlen);}
  if (anzpossguesses >= MAXGA) saveandexit();
  /* more than 6 guesses are not needed */
}





void generateguess2(int n)
/* guess n-th letter (n>2) */
{
  int j,k;
  char r,possible;
  char  ah1[MAXGUESSES],anh1[MAXGUESSES],anm1[MAXGUESSES]; 
  /* store old (german: alt) arrays of information */
  char *ch;
  
  ch = rank[n-2][guess[n-2]][guess[n-1]];
  /* Here starts the rank list */
  
  if (*ch<0) return; 
  /* If no combination is possible: return immediately.
     (This might be possible because there are short words with funny endings
      that are not part of a triple in longer words.)
     I'm not sure if it's worth it. Saves time for copying the arrays. */
  if ((n==3) /*|| (n==wordlen-2)*/) checktime();
  memcpy(ah1,h1,guesses); 
  memcpy(anm1,nm1,guesses);
  memcpy(anh1,nh1,guesses);

  while (0<= (r =*ch) )
  {
    possible = TRUE;
    for (j=0; j < guesses; j++) 
    {
       if (s[j][n] == r) { if ((++h1[j]) > h[j]) {possible = FALSE;break;}}
       /* If current letter (in rank list) would be a hit, increase number of
          hits of current guess for previous guess no. j, and compare it to 
          the number of hits actually in guess no. j. */
          else           { if ((++nh1[j]) > nh[j]) {possible = FALSE;break;}}
       /* Do the some with non-hits... */   
       if (charinguess[r]==0) { if ((nm1[j]+=charanz[j][r])>nm[j]) {possible = FALSE;break;}}
       /* ...and with non-misses */
    }
    if (possible) 
    { int sum=0;
      guess[n] = r;
      /* So, the n-th letter of the new guess becomes the letter in 
         the rank list */
      if (n==wordlen-1){
         /* Hey, the new guess is completed!*/
         for (k=0; k < guesses; k++) sum+=nm[k]-nm1[k];
         /* ...unless there are not enough non-misses */
         if (sum==0)
            doguess();  /* Number of non-misses is ok */
         else if (sum<bestsum) 
            /* The number of non-misses in not ok, but the difference is lower
               than ever before. If no possible word is found, this will be the
               guess. */
               {for (k=0;k<wordlen;k++) finalguess[k]=guess[k]+'A'; 
                bestsum=sum;}
      } 
      else { 
      /* If there are more letters to generate, increase the count of 
         characters r in the word, and generate the next letter! */
         charinguess[r]++;
         generateguess2(n+1);
         charinguess[r]--;
      }
    }
    memcpy(h1,ah1,guesses); 
    memcpy(nm1,anm1,guesses); 
    memcpy(nh1,anh1,guesses);
    ch++;
    /* For the next character, restore the values of the arrays with the 
       counters. */
  }
}


void generateguess1()
/* Generate the second letter of a new guess. Similar to generateguess2. */
{
  int j;
  char r,possible;
  char  ah1[MAXGUESSES],anh1[MAXGUESSES],anm1[MAXGUESSES];
  char *ch;
  
  memcpy(ah1,h1,guesses); 
  memcpy(anm1,nm1,guesses);
  memcpy(anh1,nh1,guesses);
  
  ch = rank2[guess[0]];
  
  while (0<= (r=*ch))
  {
    possible=TRUE;
    for (j=0; j < guesses; j++) 
    {
       if (s[j][1] == r) { if ((++h1[j])>h[j]) possible = FALSE;}
          else           { if ((++nh1[j])>nh[j]) possible = FALSE;}
       if (charinguess[r]==0) { if ((nm1[j]+=charanz[j][r])>nm[j]) possible = FALSE;}
    }
    if (possible) 
    {
      guess[1] = r;
      charinguess[r]++;
      generateguess2(2);
      charinguess[r]--;
    }   
    memcpy(h1,ah1,guesses); 
    memcpy(nm1,anm1,guesses); 
    memcpy(nh1,anh1,guesses);
    ch++;
    checktime();
  }
}



void generateguess()
/* Generate the first letter of a new guess. Similar to generateguess2
   and generateguess1, but simpler, and with a few initializations. */
{
  int i,j;
  char r,possible;
  
  for (i=0; i<=25; charinguess[i++]=0);
  for (i=0;i<wordlen; guess[i++]=-1);
  while  (maxdepth<=25)
  { 
    rank1[maxdepth] = arank1[maxdepth];
    for (i=0;i<26;i++) rank2[i][maxdepth] = arank2[i][maxdepth];
    for (i=0;i<wordlen-2;i++) for (j=0;j<26;j++) for (r=0;r<26;r++) rank[i][j][r][maxdepth] = arank[i][j][r][maxdepth];
    maxdepth++;
    /* The rank lists are filled with one more letter. */
    i=0;
    while (0<= (r=rank1[i++]))
    {
      possible = TRUE;
      for (j=0; j<guesses; j++)
      {
        if (s[j][0] == r) { h1[j]=1; nh1[j]=0; if (h1[j]>h[j]) possible = FALSE;}
        else              { h1[j]=0; nh1[j]=1; if (nh1[j]>nh[j]) possible=FALSE;}
        if ((nm1[j]=charanz[j][r]) > nm[j]) possible=FALSE;
      }
      if (possible)
      {
        guess[0] = r;
        charinguess[r]++;
        generateguess1();
        charinguess[r]--;
      }
     }
   }
}



void answerguess(char s2[], int h2, int m2)
/* The last guess, s2, had h2 hits and m2 misses. */
{
  int i;
  memcpy(s[guesses],s2,wordlen);
  h[guesses] = h2;
  nh[guesses] = wordlen-h2;
  /* hits and non-hits */
  for (i=0; i<=25; i++) charanz[guesses][i] = 0;
  for (i=0; i<wordlen; i++) charanz[guesses][s2[i]]++;
  /* The count of each character in the guess is computed. */
  m[guesses] = m2;
  nm[guesses] = wordlen-m2;
  /* misses and non-misses */
  guesses++;
  
  if (h2 == wordlen-1) {specialmode = TRUE; memcpy(specialword,s2,wordlen);}
  /* If all letters except for one are hits, turn on specialmode.
     This means, that not the first possible word is printed, but that
     several are collected, and a guess yielding (hopefully) more information
     is printed. (If there are less then 4 possible guesses, behaviour
     should not change.)
     
     I have to say it again: On Fred's machine, no guesses were collected,
     as a variable was not (or wrongly) initialized. This was a problem only
     for an empty list, but the list remained empty because of this bug...
     
     [The specialmode workes quite good, and for the word WITHOUT there
     were less than 4 possible guesses left, and the first word found was
     WITHOUT, so QuackTheDuck would have been better without specialmode
     in this special case (without the buggy specialmode, that is).]
     
     For Fred's twelve extra word, specialmode was a big help. */
}

  
void main()
{
  int i,hinp,minp,l,k,j,emptylines;
  char s1[20];
  unsigned char c,c1,c2,c3,c4,c5;
  unsigned long n;
  char datastr[] = ".¢vÑhG:QD“rv—A~Q©LaÞ&mwJ–ØF<:½³g¬&r„7Z–)¬KuOƒŒ:{´˜O*‚~£Tfë¹ácy™œ4i.OQ€> 7m´R¸¿Nn9ï†¬aèO$¬û$^•ü†Xg®4i-(.A)tjNð8šq-•�ºgr`®4$S8Ž«¶±®8·{—E+Óm!hkQØ]¯IYF®†¡9x•”­Ï@)#j Ê•.£GK¶z$N¨¡:[ÝœH†± ·•.´¦xþ�éfƒ1ž!z•ü¹O8€„¯¹ÈH”;€•øzLO*“Î¹^„º:pN×Iõ¸¬Kž±– g,ºmT±d:wQY¸3E¹¸Å�¹Of¶‹ƒ´qøJiº,·<3q[ÿ¹žRˆ¹H!k(àrö–>Z·K�¢1$`7r•/2˜�å’PlH-à­Ë] —;¹^J×7QbÄ—ú.~EØq(7­b>o:Œ|./[G)8rÐtFb{ è«’4–…^k™º@Pœ$HZ•`Ù¹Rq¸;s$St4†¬Š_(Þ¬Fx{ Hš¸¦­!éŠeŽ£Ij�*~˜ÅîcìnnC9[w�@n²@$¦:~Åè–’�ýi#E©5gIHÂ}r`®4n0‹WeîO:q]¥Ø‡-¡;;W¿>aÕ�~œÌ1¹OÊ=ª ”aá1�ˆ”zÜÅóNð…®’Cnµw>`Nq<•$oØb€q4‹Í-ÿ>TŽï´‘Äªq°¬Tb�(î,;9YšÜ0m„ÙgLEÞ Ên.Qx®_±NŸ˜IBDm0c`–›³(Üƒ,D#–vLVÄaŒhBÕ,…m sˆ¥¯²a”ÝÂ:R�—r-À„JŽ‚ŒS7y¬$N|•üoØ„rŽc}2ü}�¸ÒNdo´ìa`Šÿš›)ú¸¼Jj–ª•:hþkãcêAI«ò¶ŽFù`†Šñ;{;h¹i`ô4 (Ä]Îƒ}{+8�q4’DCN#†Uí}xJÕ•¸/áIêq2¹Ê9äs<fŒ›n/ÞŠ¯h*LÆ‚¼ºh.-`µ¹˜!d;v{ :NIÐ–n;;pR™…~Š_),Z�=þ´—á�ÀŠ=œÃ)poæ‰ý‘°&b+¥´-$ž”~ÅètaDßNb¨º7­;¼r`Åôb�9BF×2Ö„[fÒ�8´‘C[ %„¡�Êhh7�Åç7ND¦›µ=}rð‹q<”x$„cæ‚ê#Qnn:Í>VÄˆ9xÅX<:3isJ%««xÛ†ÍgY‰“¡Ð)²FÙ<ó$»P=:5,8“ú¨B«Ãaáƒ{,>'ÊxTÖÈsÏ•½(^‘ˆ2Å,�¬ŒÄt„�&Ú:O/g{‰!óCqO,;z``z`¸¯rÙPJºn!ÿ¶¬?ë.÷l»!f„e¯y>¹ÁŽ‰$¦P©šJº$c�Æ·+¤‰‡7[Ê0¹Ôg–yœœÁˆ¶´¦ÈÌ¢Y9T@'Ê/EÙ`�‰{¬Tm&+±)W2l6{Š=E�#4]U×;…‰'¨–·Ig;Ý†]#7Qçœ„eœaÞ,?:9E$¡Æ“Ü¬D9“#X¢>k¾7dŠ£$¥•$†î1†f ¾¥–Ù+Ð¢YETš5r°¦Qkm‰MfC,î51HÊ„KËÄŠ==G.ú8ös 5ƒÄt v”Å…ý'B­ïxÅak·ŠA)Ÿ>¿Oboýs![C¿C�5Dž2²]×h¹±Ûšh¡™¶šZÚa£7M'5¾³m÷_ÃE´N¬®�oî-~E‡iO7J³:·N4Abóœ†fÂH´wÞ´”�÷mÿ>ã;FO‚Ê2�Ækâ…—hæEøxî1­X®Fr”p�Úx1rÝIy¿ø0 'êxÄ!ßIn§q…›k‰4f•¸#£¥Â×Œb€1ËBÁxìjM¾Û‹VŒyUà@1s<Žr5œrd5°ŽÞ·&¸x¸Ÿ$P·Ë«tˆÐRŽkT`z.¾# „®ºt;��KÈ¾ŠD#vô`b¢y›Ò(ö!òO‚¢SK¶’@-Å¹nNd9n¸T=¨­E¹‚²è�Îb¥•wàŸáT`Ê2E23`'E*Nš•º½ªNn9ük²8ÿŠ¢œb2ø´xÅ`:p¬N·K…cQ€sCfF2úšˆu¨!dºt7X¸Òm-e¶³Ë=~ZÜE¡�Ê¿wNƒÕ¬2½wK‹ ŸŠ?¿²pÊ<wJ_Å2WmF8�—a„¸ÅçqÈ“ÈCB›§s÷&·9;˜ÔŠyeÈ¡?z³l]}g×…'Ò=‰x¤ƒ{¼à5¼cüœ©NØF!&=§¢‰àusH¡O$¾4‚¸`m3uzŸ¡è(¾ÅîP˜–ˆ¸ˆD™Žˆ¥Â]õ=Fq/RÁ®4¸¸r`®4r”xu`”pºh…«=dq-3ÍWŒ p7Zƒ¾KË˜ ‚ŒPœºty•-�O?2z³À è·JNd¿Ža­.™Zm·Ú„�ˆs-§]8r+šÄÈºb�Š027>.ÅZO!lºva­EÎy—ˆhr‰–£aÚgïNn«êZm$”:xÅîg¥+×8þ3Ñ½– ¸{J(ŸŠ¼ú$t!è¹a {­Ów.2Ê‘“wJ%ál([×F%~áKo3NwÛ+Ú¾’‰†+ÄkÐ;xKÀR�9‹„`„C5Q¢4‹Ë˜ŠeŽð8ó Œ×9æm“!+™ý³6Â<�[¢¨D²ÄùdDb“P‡šš56«È~ÈíP,22'÷wý8œ¶Ž�É‚îw<±Š‡�aÒ:|�­8œ•øÉ(9Trû›¿n1u‘dë„ŸFcrú–Ü!émNÊÉÓà¸4eÐ¢+Î¹J0|fÆ‡1kt–°9•gRpY4Bd¸GÍ¹s7o– †P1Ê^2Qpq'.áeüwÉºr7´`¨hV­E=_Œ|3k;n#1làCŠ<süx­ u`P,ƒ-m64�hæ@Œ³2r¹´!dJÓ–´9&QlhÞ.â=ŠHÃFÕ®…9¶fÁsè•™‚ÞCfN»9^sè@x)»~+¸õ�à`,¹Pw“ð„³]7·�’LNq&`g5.“›Î@ßLb–i’Q8n,êg~¤²”Žº,çŠä? ®_o‘E³�¶(OZ¸¨¯;�q(ºk[¹8&#4„cBü8š�þ®‡qÊnCeô {@‰y›;|°¸3À�ò+Ñ;mNnÀB¸Ì­ýkÇºNu€`VŠÆ;{RÀq°u„†œ4«f0œ…N|:~,j–Ú$P‹fR•¿TmÿŽ7xÅ†š”Š!Ú·Ñ7NNŽ?4g¶šrq¹´Pœbà¡€5©ˆÝ;Ž_¸;u¶ˆNð;|¹°–Ý?/zvLÊ¹ÊNð®>¹¦#Xƒ.’JƒO1”ÉÈ`+g÷O‚RÛƒ4m.$`~yhy¾ºNd·J-ë9ˆÑ—ü7N·Ú¬Drz$y®k8œuV/òe‹8š¸¸½�†Î4‡kªx�C Ÿ˜—ï9äN’¹{ZžÌbó/‡¹u4¨BÄsù'¡wù�â5®�Ë„Ž,€HÆOnºQrdbˆ?ü$`9ì`¼Š>;iNn¬álbŠï‘÷=YxÉuL$L�PPFq$./œÃŠ5LvlÙu^„e¨m0¬š4–Oq-Eò´¡@o[k¡ÈmÆeýCŸ¢’„Vq°yð‰‡—éfÚˆá‘r-´Z*2XJ÷ Ü’O8’-çale¤¹'×IÔtb®ze¯º‘…k&iZÚ;t`¹ÈNdqž(ígN­iQ†”p;€¢U3Í[Grû¶š<)rÔùL¿ƒ;$©RºsÞRä¼à“4gœÄÓo|7½¿C‰‘wð¶šm/r|À4Nþ�>Šê Ì;¸$„¾ÇŠeh›N×Z¶)ZEþË´7Qqsg¦OJ�o™ÌË*�Á.'9B4ÉOqÄX;v•°¢?–Jkª�ä4Ï!jÃ…9€bà’˜g¥1¹`­$~b³nhm7'Æ�Æ,ï¹û‚˜­Ór`^<:Sq1o8;j‰ƒ:zv†c†¬�/Ÿ®?Û)P¹·:Q–#l†7FsÌhÂ¢{;�R´Z�¹¾IÔ„²cì�Tq–Š0”Í=Yl„;~xÈŠy_ÄFõZ“Š {?`Í¡_cð…‰–Bˆ®¢µ;b§PŸ¶“;| {PSDžvù]A®†yöHêe„E •–45l-ºp,Ï!dŠ ­%i‰ öb²;yq($;lNsC¢¹¿$HO)ZbË�*†“oºl’„x²Šçm]„K=£�àÂ<$Ÿ’Fm79)½».•„s5X–Q)Ú¨²¹%q°¹XIN;t„µºtkàhFˆÁD7z|ŽÅÞ;vr`¶š-�Ž÷ˆ°=%²ùV±$v­ÏqÊ#XnPº$ŠxIH·Ú�^–ªÓ™Á«rZ˜?œL¿‰„qËqÊ�Pƒ:r`i¯Šñ.°O[¥år± Ê$PŠK8`ó¢£²—…^�&OÞ`ô¿Ž†˜!ÙÄî·0DŸ.•‚sqÍ• 8š„2–Ú`b‰E9&‚~�dÄï†«Š&.²dg¿m„×(Þ]…OdœÒIhuaQ/ræ”ä‚t”Š„°¬¬Š¢ Ê-¡ŠËœÍR2¹›aì“È;y–�q($Z•$APs#zJŠÂ7g§ßtjRŒkë¹hq(®4NzuV Ä¹p.z(èP›bízž_Êta¹ÊNn¹´O$y;#£Hå;rsÌ”Ü¢SG ,†&o¸ rdº`‚x·>’@1ªr÷ºK’P4ilþz˜Cž–g*-P0ö—iºcNjt@‚¿;lEøˆC`œJú„�ºš‹]59gQN’’HNeOrìs@U`­ýkúbto†-~EÏ¶µ;vq(ºtN×�LœÀZÆeàE={1'Ä<ø4B•ß‹f=£F6s4UÀ–”´›xÇ’N`F„rw±:•± O*K‡¬ÀZY¸Ä’LhHlÛBÒrbŸ“®;Ké’HQL-üa§¡îl`’LIÐ-Übòxåºq�ÁbžvöšÓ·d!dkúˆK'3hK¹šN¬=G®+º:6P11¡„Ó;{ªè†±Že`RŠÔO�†°¸Ò/È9e3<¨N¹_Pœ¹D.¹3M7RwÒ; !z•üm¤Q}‰öC<ƒ:cR´7NRœK R–9Œm#†ª�/¿;G,ÀÈ8€-Ó‹œxÃ=û´`]1}WR“¶ŽˆGO#¸Ã!d¸ÌˆÐ1Å›“«ÊPÂ~ã))¿ötP¬D9o�òw>)G<û–1½v:(¸œNd$`NþŠž`Ñ;€QH£–�çquhè&¤CWUÀ³‹€‡!V—ìNzIN;zQ�¸ÂIH‰ñº,g¦N«EÐ#½„Ñaaºœ;p$tŠ¤7®s? _3B¸0¸¼q°O�`Ÿ–‘ŠŸ¶š;vgLr»kj„?;žˆH7ZuVcüeÛ8šHžºq$”Šr`;€i•'†­¾d/ì¾(bÍ'Í>V–>]Õ½o$sy˜›°a&”§O,k[>Ö‚ÅyèŠÆ·ÛuHy¯mB–#›N$“q¸;| ÊsÌ¸`>ãkƒŽi$ld*xÆ¿ýaÕ4bN½Ij­ø(ÒŽ«!lC`?}T�L5ºnHâ�Ä#aŠ|5°! Š|¡D–�b²ƒ-±P=4­óŽÞFü#T‰órl_Êcåk«ˆ°œm%ç$W¹¸1t¸Àyç8ÐE­ iœÌº0gÝq$?à�8,²Ž‰8Ð V@Ûrù–“’?„œ9¶�Ä(›ö—íŠþQy9¢_Åg+?J—¡}ÒK¶Oú9ž_±’P-zNrƒ� lw]«ÉÀa·Ä’8O$¸Ã‰„´Ø-ØRœ3�ˆ™‡3‰ù67_ø9…œ~a//BlYÀ°P…xÊŠ$ŽéËÛ!Ð‚é¸îRÀ�>hV`­›î£Å¿R‰„„Âa]Äôj(;áiÙ½þ`ôKh†¼3bŠ_u[N{¹¾`NkÄ:$paÞŽ�`z“Î¹L†ôPœcØ¸Ôo¢Ž[ƒÊcìq$9þl‘Šþ3=?t�*Pk¾•;™O*_Å*&CNü+ºqŸl”IŸ�>R”ƒ�mˆ—ú!z”~„‡’Ky,8v$ž$žbŽ0T„Fa½„£¼l†œÈš/Ðcâ!aŠ|ºqK¦rd_ÄŒ1O*só«l¢¡?%¸â„c’JNõs?ºt”¼sÌhuvÛq:Nü¸Ÿ„Iˆ¿BÌO+­Ès?8š‘Ûö•ºwËº%PÀhv«$ƒFZ†k«8’“Æ²ŠIe¢Ä�òwšK®rk=4®<Qª:f4`aZn zµšˆ•ùK¶OgÇYôC3IZ‰“.Þk[@áŸ�o‘ŽŽgR7öO*ªî¹k?‰„·Urdˆê(ämEHž;y²ðº`…‰.“•&cð«˜Šxcª—ör`†©4c�&NxR¡sÞ·Ja×&€qû¹j$LO*ªî8š¶Ž†œ–Ú¡/YíÞ¾�8€—®�j7œs‡cð!q¹vŠï�žmH¹%$L½pIÐŠï�×xç„rœØ·Á;l•ø·¤¹RyÅQ'#7¬Ô¹_!d?2�ã­°’N —xéfB(¢¿ˆbœ`¢¨xå@(‚ã¹ÞNt·>Nð8š4N•½‹•IÛ#ó=fxZ¶š;|#^ºh­@P²‚„«¢Šþa¯s50hm7h”³v­Îx¹èƒ4ræ9&#è¸¿Še1{&Ž§6šf¹”Nn¹OfÄYöqÊ/à�$qµ…²a¦1£¨Œ«¬Nnrz·0Ndnâa±rtŽ¢u]½�q$’@Nþ”7LÎ/ÐŠï(5´(8›¾ˆOXR“]&3r-Å›÷º‰rÐNq’J8Š2 ¸Ã`h!*Ig)Äœ`3æn']ïeÚšl·²“Ä�à«q7Z`’f…ºr‚xDîÇgV—úˆêJdcåNÐ#>?�HÈ­°8šs|_æºl,?ˆÐDÜ•šL©bŽ.¹;k‰ox0¡.¹ÊˆSNò`¹L})}g+@N¸å:;,ç1„`µ¸ê,W‹T_¾«Å¸­eðN—;yƒ°;€ð¸Þ7H;jˆH·¡cæ•-eÙ7­�ß‡<ŠV#789O*t[ùÀ<ox„>¨<CPÀb;h• Rº–žC3Ä8Nð;v¸ã‰„L†(3¸ :^`«Éõo¤(íC3¢Pš°f%¾¢†˜Š_ Ÿ¡™fHO+ªë…f:fŸkO7Š…oŒˆ›gP&j¹Ô;Œq( Ê®88štP’JsÑ`NI�®€8š$wPœºtH£$R;v‰ôe‘$y$”aÞ: ‚£.â®}ha_ÂPwœÄ*œ`b”YŠ~uO*¸¸r`nRNð„VkîO]œ¨q<•$¹_'¨­Î¼koŸ‹]'Ÿ—ô`ôktº* ºK¤tô„NO*E³Tœ¹¼‰!œ­D�wQ’L`õ­<L¸!%fÑˆÞºk’<R•;hcê‰„t/%è„e/L7ZŠ¨•!s?­©Eæ2üQJq-&¯šÄ¹]„m”;{#8þN�rA®Œ˜!�ÖˆØ§#ïk¦'Å¢È:fŠ‚wôeÈ®1º#�T,¼²úƒmKi¼ Ê­@¶šµ*•$¸¸„bˆ¥kmŒŸ¬]bñ‡y3–e“m;)ÁÄôŒlkÍ—cIh$ž�Üg®R¾;v·ÀuV·Ä`Ù�À$¨¸Ò’I$„rç�?h+Ö4ÿx7`¨†±7N®BJâQ�­¯O*aú@•+±¶°„–.²eìc<=¡JúºDƒ(ŠxC¨º+9ä¸À9xo€Ž¢šš3ÌgQ9–”ÀkˆØ_È¸wrd­È3t 5J¦�Ã·êrd–¨I4¸Ÿ¹´‚ÅŽ&'ÆP›Kö;/LÁ!dqæg]#k:fH˜¢VR sìKÀ„y’P3r+¤mú¦qO*¸¸­8D;s@$W¸tE‘�Ä‰_ZTcçNd…f1¨¸é¸¿†œ4et7#¤wí´§–2–3�>.oE«8ß·KPœº`Nd®>¹sˆÐ¸À›µ4X”;¸T!Ð‰ŽKÓ'‰@Ýq;Žºrõ·Jkë�é�Ûn ˆŽZ{!PO5º-#T;v�W_¾†d;rð–#)Á @kŸEo†«ŽŽ£KfT9kO‚)Xº†– „@;hQSq4K­)¼?o$^¸¼kª7S>î²‚w(ºQq4;pb fœ­±¹šPœº`q°O*q8¹Â–Ý­ÊmFx�7U¡ ¥çua„@¹ÊNn;l– H£xz3=¬Õ ÊsÌ–¯/‹º$!Þ9C&@Z}§uO*•øHª;pr¸x8€Ž–-U¹O&€rÔ––^@”à�H„>­Ð”Ša«:1r„f¸Åk½OŽ„kR�ˆøq3ºt7QbžR•cØŠW§Ö Ê;p–°_ø)¾º$rd3<œÒLº% ¸s÷`…¡ì;€‰†­K,,©?3æg;l/.™·�s€OŽ_ÃFZ¹M’Ll”eìC:tïal¶ºŽ²!o).IŠ®^8v‹T_¾&Ixê•µ’P4e.j(WºA!do†bœ&dfT–ÎrT¹S›ˆ5°:(·J-Åb )ÃuNuß`IŽjDm§l˜!¸Òq°müºs-Å23]¿CuP7H¹ÈuV…rPˆ¢wqÖºo`ô#î¾û8Ž¹°Ž¨”@R‰l;'cã„—CM‡$Ãa8›Hž�CDžeô¡¾)Ih•y$_Pœ–³LÐQ”rÌ„0O*aúHÅkh/L#kÀ…’=c&Ôrg]Ï¨˜;�“Î„D;z!Ô‰j¸„q°oŒˆˆœ§qØ1£g.XH–2O*!Þ­?¡Q�Á8šˆN&t$[rdb¬®}�+O*sè�D•µoŽ)+¢WC([Ø�Â5gøqÊH›ƒÂºtRœ«ž‹p;org#cb.R  ·„¼­Ó>í‘úŒ~EIeÉ›o;yq($·8·83D¹u)øm$­Ù–Ò3e¸æ•ø$P:~a!¹o¸¸Še�È&^w€¢žOLºQ—ðO!;v`­ ƒE4üx¦o�4^,crÝ<ñ—÷;vð„À;{q(Nz”~7Zcæ•å¢xw9º‰PœˆK(¨¹Ê7TO*­8b@HÊ;uq(‰ý@äeº.)†Ÿ7K‰Œ¿±{@·‰cãnd(–›ò4ìf®‚ŠqÄ!V¹R¶ŽŠe-orö Ø¢mRŸq49þ;v!n4i`àe¼¢ysNšf‹XEˆ}7$3;�;p¬@$V¹´Ndn.–H.“NˆCªu]RÀ9xºt•pIX(ê¹û`ô#îKf·hkab¤x1u[·Àq¸{<„Dº*„@„VŸßŠU'¶ˆSƒ�JRNð�JºtO1‚m4$V8þ'ç=ùy/fnCöìQ›$U…rx÷&§›^·Ú¹Ø Ã[Cb§>î®=w.ˆÜNm5ŸC;:2`¸›céq¸ˆS—ünv:0 y1¢f‡Z¿®hŽºNg~ê/”a[K¶!d.–`M²ÐO+$YO*·JcÜ3ŠeµHê�¡b‘4e#reT|nU »t/F6u¡b�•{¬Bd¹½­l¡`ÀˆÀu[u;hRQs?†¬ˆ·:Yºurt·Ú·Ä‹Yƒ+O+ºrˆØq8Nzˆêx;®‹C–¹Kta¾¢ªècÜ•¾wÊ¢~9’Ð×’`ŠZ¶É$ˆÇg]uU¹Êi¨9VQV;»g°$W˜xPœH´­ÙÞ;›dr'êuK–ˆ8v¸ZÈ†¥ŽŽ#j¹O`ôro|$Z·þq¸“Ø¹ss€fÀqÊ<¹�?8EÝ’C`ð¿ŽNþR•:^¸ÄPŸ‰Rs‡+%Ýuv¶šb›�Áoäbœn3É—¸q¬KŸðh^cå!n)´8v� _Â/Ž;|ˆH)¾l'/I�Ã!æ.Õ;vreqÊƒp#]q:•�aÞˆ™C_ºh;vð5am!¹¾‰ôŽ€­8?ÀHÉ;|%Øs÷hÈ¹—4„:*:¬º)è½ßvÔIâa×¿Ž8ƒˆS-`„frÙŒ|:T]7­8~’O*”ê+²b‡flº‘nCZÚ;yq(_ÊŠ‚O5;uºhO¹°!y†œm/eò+Ö­jO*_È$z4NóQnu�N2+q{ššO,q8O+aÞªñtSNº†¯9“ªè·J<ô‰ôn.‰ò$IëŠobÍBçšÚu„uŠþlÿ ¸>ï){O,rð­(@‰Šë�¾NˆÕb¿w”4;¡a'äinwºUO–Ý Êrtg°�È›^3¨¨·8œpŒ|•:ƒ._Â¸ �Í8’vÜ0U½žng&àƒ²ˆ¸$]•ü¸d“Î;oc˜n.hkq+7zŽíºPrt;h„Dºtq(9n {³›(3œZ•µºR;Œ#è¹¾r`·Ji%ta`òº›·œu!dºtrOPT_ø ƒ:3¹LR�9x8›†Î�ãmC—>C)¡Áq::��Ä’PI@,ô„FR tT#òbw'ðg®°û�é(L[EQª8ú�Æk˜7Z–)O‚rQ”n¾‰CwouY#7lR «›jƒGeÛ¸¨%Ôm´[Þºrˆ¿,ä“ä`µ B[5búy¡=�´]:f`÷„ºkhŒ¢ ¸›·D»y¢«µ1Î·øQ[!@&F`«­h¹µ‰„q3`0–‘zÿœ„;uq(q:‰„&cºm!d¢bf01¹O*´¤`2Šñ[Au£Šþ7‹ ³¬ÿO*sóe˜¹Qoœ.°57ù;¶­@$·J•�1Æ;¸r`$`¹–QLcžcå„r¾fR¬n/Ž‡f€w�u]¸Óˆ½sG7Kx7;}¹RP0ˆX:fŠT'¤ºtc17dqŽ–»·Û!d¹ÈNð$Pœ¸‚„µ!ß7�¹¸rÔq;•$’PN’LÃ8šb˜$y¾�o�a±x4�Ù¢š$a¿Žq1Šþlÿ�ö:pœ8R ¿Ž·>:¡+Ò1‚`»·Û7X$P:6¹¸!d†¬3�s$EÛ/& ¤¾¢NnQ†O*>Îf©®2¢r‚Š‰ð·Ú½l¿ìbÉHÙŠçg.8š•�k^$YˆØKbçºq!d–³s:Œ€nµb¿ZîR� ÈtcŠéJ¾”pƒ¾o´¹ÊNdPFªäqž$[q¸h|F÷Nd‹Om’+Ï@ä¢Åo�Šø-oCƒ¸äJþŽ¨g¸—ü Ê-˜¡ªx­’KN÷eŽ,†x�!zŠ|—³.o=;º‘.”O*¾ˆ�TqËe¾lnÈUÕ�Šì4SÔukz�éL*§–9’¶š†©‹Oc�f|P²so|bœ³€$H¸®!d¸Ð·0¶„œÍqê]­$ZrksLÌQz†_ùºlNn{)Ršr½p¾ô…‰, )ÂœÃ¡ÈuO¬@Jâ;yŠ€•�·²ˆ½oCe‚¦v7o–Eº-rt¹�¸¸¸¸7•@.2h²òxÕ¡áu_O*¸¦‰„#î)uw¦$[Š|·JEšŠVRTh››ËK0K¶…X¸Ó(;2´O*sï#ë5©#>„dEG;$PRº’&#�m#�?Šï¦rf�wí9&–°¹R;v„ž�Ûe‹@å—þ¾�·>�å±b!ÏÄØ È;pq(;€• „ž‹ƒ-oºD‰ð#4o>—ü¸Ò¬Ng+¹Ã’?„�Ë7[$t†ÍDŸ-‘ŠWIO;~#^8vq(ap;zˆH„³KÍ=@¢{†°ŽŽ/‹9=šˆra–2ƒ°ˆê¬´ƒÿ$8ŽŠn.°$)y.`=…ÐÀ QL<û-ÌR›qÈ;hO*tà—ünh„R&Jq×ºQ¸ÃRœ:fJÐgá+Ä›fRžsìc�…­C›’Qhl¸M·8½lô;}¬@kÖŠ÷O*óq$9ë•p¬®O*# (3Œy¹GNeŠñ‚ŠDØuP7L-Î…c¶ÿ;v‰ô¬Ó:®P/�H?ìºoNdŠ�s@R ì«Û�U@B„úo�‰ÿƒû·�K|– _È¹Ê:T1‚&Dlé@Þ•’O*‰o•øxžO*!OgÊºq…‰Dž(L¶ËNd;v<f®R–$LO¸~†¦Pv(î«Û¸S ¾Jâ4O�Éê´˜C˜¹ãa$$Y8šªî„PoŠ.°Ïy»·J;p¬@$¹´Œl•åbÄ7Ârú;}¬´¿89€IZ!nºsq¸#ò’L-~¿!r`$}æ:À®!d’úPvCWzÅŠå¢œIJqÊº`N÷#^;ysðÏ®54r‚ƒ-yŸüD8“òwñºQa$q°;z#è¹ONdkú�Ú ×Bò›‹¹Ç;vaºl¬DŠxº'!d­ÖO*%âgQ�Uºt›º…²4‡7ly.=XV*;€JÐ„�R¾—¤JÈŽº2¾+§O*!ÞtW´�(–¡U4r9¤5�æO*º`Nn¾ûs„e¯¿_kž4GaYQìŠ9”Š¶˜„¯Nðq:…r`Iis”r%æwñ¦…rzqÊ;yq(mK)€¹µq™ lb­e·C£¾ä¬Db˜¹QPœ$`:‚$P¸¼b�”X=¢¹â!d„¯m.¿šrdªô�ë‚ª¸™‰„Ï•â=Lš®„z8ì.�y5·J7N.£R¿m/&ÙÊiK”©u`NðLÉrÌ¸ÒkÍg^¥4O6Iœ�;˜!`$Y;|ðgÃ@æwmBø¹–qu‰ðfTFG(e‚ìÅ¬RD•øq:¹´rdoxs!”3wr�TA)‰Îr$}– ºd�TIB ð;€¬´Dø†¬Š0kœrÑEO$tOŠbGH¡;prø¹w…‡OY$U&‹Š€:f[GrÎO*`B­Öb²•å#/¸xL½kæ“Ò¶šbÍˆ¹;�¸0‹LOrÏ«mE;�kQ‰�5¦C;Z˜°Â…º¹”ªè:^—óO*kbC]­9;j!sqo¸^!dK®gd¸ÅR”;Œ•¦nwC^'¤9æ$šŠþ¬¹¢oËŽ7•`QŽÕÁ�©Š$ÄHÄÖc)Áae•Ã7Z$V¹·Pœ†ª8ï(À$NrÔO+o†7›`­¨–O,­þ7ZO*•æ†£¹¾¾�LÆO#LÐx¶¾�eÕ¿›3N„Œh…1”�*½­Ûgp0¹E¸¸uS·ÑkÍ—ú–2¸ÒŒQ!|rÐ Ê¥Ú?>;r‰‡!{¹¾`òLÆÄ`dl(¡ÈÊˆ½gY9qBïO,$VÄO†îÄsNûÀ0Nûq8:f[G­¯ŠxO*öºq“Ë‰.;{`ƒo¹Â7NaÞŠðCNuaO*ºr‰‹�L#S®ZZ¶¹P!d­J4–8‚BÒ­E¿Šy:8‡5ÔˆØ]$eÈ„J¹ÕO#JJ—¬O*‰j–†¹ŒE«„F;q($l”;z;p!r$UbÖ„†:.¹ºNû4P?;2’·+­bx;Ârx·Kmˆ•�¥´$¦rd;|;vŠþ`«’±d nK.exÈ$€¿Ž‚î!ÙŽ¬O,ªìt[�ç�>Šx7·w-;¡Œ(;hr`eœlþxC§ØN|·>R–Š|e‹¹ÁŠïfg0bc«(éŠAš‹q:$`9&† n;Nû¹¼r`;|$P¸¼7M.›?S)ÚÅ~O(7Z·J�í³Š¦-¹ÂulNðu``÷·¶9§Z¾H7NR´’i4­_æg9uN_È¹y”ïr¨­¬`z„°F ¹ÂŠWN¹x¦bú=®­Ð ÊE r¹´‘q1vfÂ¹y;h‰ôŠ&¬D?H�ã;}kXw&¸ÐˆãNÎk[ƒ’ºœ‰!¹ÃNsy3¹ÊOntDŒ„n1©w=¸<K®7�|¬aë–IŒ€Ž¨ÒI|ZŒs„Ð�èO*Œh8€’F·8O‚~O*/Ö§ß$y4Om.;€l¢küŽj¦í«¬`¶š†œm“qÌ¼X«üŠ&½­a×Bð„Ï‡6n;8ú¼cNû#F¹lŠ…7ˆRÅO*À0!drÞDî�a7Â$›PœK¶$tPx„³jGoœ( �Î¢˜wËqÊ¶”$VŠþ7:WN¶®�f‘Qª$VO*9n.—‚{Àg¯0!d7Z¹p•$cØn(OC�ä:Í$VutNdu;{sð@Û†©7R¾¸`’`o§…‡-–¹oNktT$`‰„ak•ÿO*‰ìCZºs4Fn¯Ÿ»¹µ@Ø–ÐL¸#]'4À;;Œ·À`ô# ¹�Nd¹vˆÖ�ø4¢­B•îŠ÷³/`z�à–<¹ÊfÄJ+¸LÃfCrraX8š�ðq4/¯¹I¹t!duV;h¹”;h¶ˆ¿±—½Ó�CM³�¹øNn$r4N‹Y«›uH7T¸Ó`m††¶š;h·Øq°O*¹Ê¾�¬N#juV¾Ærd�AN¹4p–=Ižu]Hª;vð4r­ý§P ¸C)`Ú$¹¸·ÄoxŽ¹BÒrª=‹ÅQ¬Dsè;|Š€·J g•Ô…~QVuX¯SR�YäR›ˆè!JŒ�n_`aºH·Ärd³³�,�?(ŸNº5~ºBNû…®„ �Ûªë²áˆ›„<”P·Û$P¸¼ðºk–‘@.K¶7HtbO˜iÚ.•ƒ³bÛhQ+ÖCs[0;~_ÄO*K´;hð„³Œ|`M:dq-˜!·>`rt4#ôº)¸¼ŒQ�ò•üZÛ({d3O¸¸ È·JNdŒ€mH–Ý›Ó˜C­RO*�þ¹ºˆØc–‹±œ ÊŠ‡·Ó·Ä½�$T·Ä1É�ãNz¸PbO€�¿8š®>¹nkÎON¹š:xÜŠ~3Ÿ‹W¶™;|O*ˆºgL'�–IO*(¸­jŒs!dt/`À·aZy�é=¬O*q2˜ ‰š4€¬ÐDu=f¹»�T–¨r¯;€�à_†[�òE‘›÷O*º`QL_½q×;€ˆêBÈr&R„Š`OQW4Q�6,PÅ£NþˆTo�„¬+«Å/Nd;€·Jm-NÚ¢~;|Š€RÄ·>rdºjq¸bòb²¼kÀÈ!dbÛe±‰:xH?·¹ÿ‰„rÌ;|`ÌôŒv!d¸Ã…[_½«£fzryºR:p¸Ãrd¬¬·J7M‹N)â›_fŒºA;l·Ò8˜¸¸Nð­ÖO*ŠxuS¢�RO›]>à.™�›�b7K¾ü!d¹¾!d[*;{ðL~¹».”b/·=!d$VrdxK'ÿC3†Z¢œ#jºn7Nƒ ‚Š4raÕ#ä³óO*®>•:O*ªîoƒ�þ:—&>?ãÀh;($O(7Z¹po|a±=„œ®q:•”¹ÊR–·lrd…X•¤†¤fÒ¶šP˜(ùP9ƒþ¡¾‰a;|¹¸#W¾“ˆ½`mP˜f‹—ÿ¸¸q°O*Œ.„<o}7–°ÅŠ;4�Ã®RD;h¸¸Q”n.bB:|(À�N®±q<:xiÀ�W;|!Ô¸6 �(Ä.*R•q:—;ycà,?lYR ¹sK •pCŠ¶ˆn&b¿AQHª’n3–x ·K:L•+.–;m(Àrð,F#0ZàRš¹Âb«;”n@%èqú�ÈO*Û¸ÃIÔj¿g’Ì'ïO‚‡5`NÈù!ÙqÂ”_-‹¿‘†k'¯=‰$N`{4NIK¿šNd-ÎŽŽ¾ÿ‰„O*;zO*ºraùO,È6…[3¡¾ŒÜŠ'õŠ21Š¸¼q+7Z‚ö¹Œ¿ˆo†Æ6NdqÊ½�œ…:f$t‰ƒQ†•üIZ¸À$U7ZR–O+Šþ4uÉõ7•ÃÒºdR¬·…00Îkoƒ!æ¹lð‰t¸Ntä¹kA8;{#^¹u¹h4A�ë‰ÎO+cê22� ;€Nrºt,?O«Ø[¹Lê¿<;#‰ö+³gšˆêO�ºnPœ�ßZHºt�Æ`‡RŸ^,ŠT##;l/ÖngC]Râ4N!ß7•ÊÀ�$Šð«¬$¤sE•�$§†ä�ÎŽ½�×yÅ,=Œém÷­`«¬‰ô¹Ã°½ˆã•û¿¯«¢O*Åôg[‚‚Ž~qÌ:C`þŽº?ãÕØm4.½‰;·Lˆ½ ½¡2¼û+­:;5¨n;<n0ˆætÐ7•.¾¢gN6}b©ù¹¼·0Z£ºtˆÛBÈ�ÂŠnŽ�¾&fÎºr¹HõÃöŠ$=£�P7Z¹Â7›qžOXo‘·ÔŒšF¤_ÃQ1•û�òN¬¶˜qÂIãºq…d ÊŒp·0�À:B-‡‡67®–³:B,laÖ¨Mtü·KrÝu´ˆê„Vn{E�ÂÊ4F`m`{#F¹lˆÝ-ØÆ5#ä;šoŠƒ Å¬ul;o¼aoä/I�Ä–F4uka9;·ÓoÔw‹ù@örú¯ƒ¸¼¼à„µyç”¼¢R¼j¸¼;vrÞŒ€Ž~aã.w¸/·;:(K¦P£;|ˆF¹—4F�/�-¯*ŽØl†ÈŒˆDcëˆè¸»¹lˆÖYó•.`T•î‰ý#`ô¹Êˆ°�H:f[×+®ºhˆèOŠ„<º˜¹t;ØÈR™nÕlrkÙ:9o÷Å,è¤pXŠ÷NÎCˆ¨Ž¸Òºn�bŒ€m÷#óC3²ü½«#9.¡<2XÅ€ ÈQV7ZG4/L�Âkà­×½†u`;lH¢Œ€¸èoÄÀT…‰P.C^;rÄó‚é_Â-Ñ³«2 „k¯‡·JŠ|Šn–Ý¸»qÃcó„—ˆŽIC¢žŽ»`äˆêÒ—¨4rm-;3e‚cñb²$LNˆ¡=³•û;�¯0O+h^bòužqÊ•p:B‚{¬*’@Š4ÐÐ† .¯¸{Nd!Â«ªŒpA;NsŒ: Ä5ÄkªÀT5œ ¸hž­Cˆê¬@Œi�T1ˆ5žmJ�Áˆêr<˜ ˆÆh�lØ,øqýO*KªIZQ~•Œ�òx©fÆ;yoxbœ¹š·Ä¹l’<HåËzŠçÂø7RaÞ7ˆŠç ÌŒÈb‚ºO¾ ;l:B­@nv×ò¬DbÛDàyºŸÝ·–¬8v¹º Â­C¹”Šçkë«Hº+_Äˆê9o.¬yÑ_â½8·B;€QH;s“Ò¹—t]#§-–a[¹y;štàqÊ¹ŒsìH¨ºŒw’¸rÍ¤„��àI[¹¾Œhbw.¹¹´; rÔuH‘q:(4¢FÉ¬[ˆÐ«ª7Z;z„žO@¹——ðqË•Œ;€rr_ÁiÀQYd·�Áf€x}Lô5¼nIPÀ¦Ü—ê««`ð¹Â-åˆå•ŒŽÐ$…¯@¹l¼à¡…rÿ z`öÅc!x·>;vP˜¹s �@.Éð¾+„Oºm¹s[/ˆêb²„‡·n’caÖ;�9&QH¹Ã5ªE»7’¹Ê�Z¾ ŠXNf�Ì9&K¤ºr8n;Œ�Ú‚}‡;`NË™#94QC�G†oQSÅ‡5œ‰ýkàÅj�å=~ÀL¹lÊ9¾’4sÊ¡›¤Œƒaä¿m5ÇšQ¼kÆ1Œ|·0†œIZqËQ†O*·OŠñ4uÉ­Ž­ÂÌ½�¾7«š¹o«¢Aj;{¾”1ÅŠïˆë:B3#Œhw€‹f7COîÀ=‰`5kÌ·Óˆã¬×ˆê�÷’Q·J¾v5Î6*9öÂ…ÅäGÔm;R½4s;Á$`¹ƒâÔ{*Öik¯‚‚ö9fÀk$p�ÚÅüÃý«�Úw„‡ZÇ¾K8Û Ê…r3IŒ{ Êg¯5l�ã= ¯4·0:;ªã¸®¿n;2¹’:^K’iÀ;y¹‚Œ{¨W¹aÄì¯ƒÕ^Œábw’Œ/Ú¯pŒl:BnR<MÖXgŸˆÉe‘™¯~:h¹†Öi-y;z:BHš¸Ë¹l‚î`š¯=ŽÈÉþ¶„5Tg^ˆêFè�Ü2°¸Â…e�ò2;¹s9C­c;:ŒKŠJÈšÝ´‡1ŠW`s$ÌãiŒ1Œ½·Ä…[is0kq2¹ƒˆèr`¡��é´®e¾p^ÊÃˆ¹0eÂ2�À[Ë;ž·´7R5«:9­÷:C+»¿ð¯:nT$ÅK’¬D�ò¸�’8g—JSqÊºrŒz¯;¿8‚»Œž5œˆD�ëˆê%è:BEä·À[ÓŽÑŒs¬ :Cg@n_¸¸#0Š7#Fr@Œz„ßŠo¯+3X4QÄFˆX7ZÂÌ4‰–Æ<|dÄ3ØŠñ8w�ò5°¢6�À·n‰` ƒk÷¹ƒŒ€ˆê¡jwiÄù·Ø¹�³Ÿ·Hd¸¾v4skñÅÔ• #kâ‰›¯@¿RŠñ¹†d¾ƒu½‡…[9`­ä/Ô¾¾¯(†äZ�Å;¼hNdh‚¾;ð·J±NAI½†�ý Ì¹—¸îŽ£ˆëÀCF¤s4;{·¯K|ÕzŒßm÷�µ°_4Q¹‡Œ¤ÎºÓÈn¯}pCÊÃÛç;ØÔ=ŒüÊ—v À±";
  /* That's the table with the statistics.
     I used my spell dictionary to create it.
     I compressed the rank lists by putting 3 characters in 2 bytes.
     I tried not to use special characters, as I tried to send it by plain mail.
  */
  c=getchar();
  ungetc(c,stdin);
  if ((c>='0') && (c<='9'))
    {
    scanf("%s",s1);
    }
  else
    {
    scanf("%s%d%d",s1,&hinp,&minp);
    }
  
    
  if (strlen(s1)==1)  
  /* New game! Initialize everything., */
  {
    wordlen = s1[0]-'0';

    f = fopen("TEMP.QuackTheDuck1","w");
    for (i=0; i < strlen(datastr); i++)
    {
      c4 = datastr[i];
      if(c4==10)c4=datastr[++i];
      c5 = datastr[++i];
      if(c5==10)c5=datastr[++i];
      
      if (c4==31) c4=34; 
      else if (c4==30) c4=92;
      if (c5==31)  c5=34; 
      else if (c5==30) c5=92;
      
      n = ((long)c4-(long)32)*(long)(256-32) + (long)c5-32;
      
      c3 = (char)(n / (long)(36*36));
      n = n % (36*36);
      c2 = (char)(n / (long)36);
      c1 = (char)(n % (long)36);
      if (c1>=26) c1 += '0'-26; else c1 += 'A';
      if (c2>=26) c2 += '0'-26; else c2 += 'A';
      if (c3>=26) c3 += '0'-26; else c3 += 'A';
      fprintf(f,"%c%c%c",c1,c2,c3);
    }
    
    fprintf(f,"0\n");
    fflush(f);
    close(f);
    
    f = fopen("TEMP.QuackTheDuck1","r");
    /* here only used for an intermediate stage */

    for (i=0;i<=25;arank1[i++]=-1);
    for (i=0;i<=25;i++)
        for(j=0;j<=26;arank2[i][j++]=-1);
    for (i=0; i<wordlen-2; i++)
        for (j=0;j<=25;j++)
            for (k=0; k<= 25;k++)
                for (l=0; l<= 26; arank[i][j][k][l++]=-1);   
    
    
    l= 0; 
    fscanf(f,"%c",&c);
    fscanf(f,"%c",&c);
    while ((c>='A') && (c<='Z'))
    {
      arank1[l++] = c-'A';
      fscanf(f,"%c",&c);
    }
    k=-1;
    i=j=0;
    while (j==0){
      if ((c>='0') && (c<='9')){
       emptylines = 0;
       while ((c>='0') && (c<='9')){
         emptylines = 10*emptylines+c-'0';
         fscanf(f,"%c",&c);}
       l = 0;
       k += emptylines+1;
       j += k/26;
       k %= 26;
       i += j/26;
       j %= 26;
      }
      else{
        arank2[k][l++] = c-'A';
        fscanf(f,"%c",&c);}
    }   
    j=0;
    while (i<wordlen-2){
     if ((c>='0') && (c<='9')){
        emptylines = 0;
        while ((c>='0') && (c<='9'))
       {
         emptylines = 10*emptylines+c-'0';
         fscanf(f,"%c",&c);
       }
       l = 0;
       k += emptylines+1;
       j += k/26;
       k %= 26;
       i += j/26;
       j %= 26;
     }
     else{
       arank[i][j][k][l++] = c-'A';
       fscanf(f,"%c",&c);
     }
    }
    close(f);
    maxdepth = guesses = 0;
    specialmode = FALSE;
    relaxed = FALSE;    
  }
  else  
  /* If we are continuing, read data saved in the temporary file */
  {
    f = fopen("TEMP.QuackTheDuck1","r");
    fread(&wordlen,4,1,f);
    fread(&guesses,4,1,f);
    fread(arank1,26,1,f);
    fread(arank2,26*27,1,f);
    fread(arank,(MAXWLEN-2)*26*26*27,1,f);
    fread(&maxdepth,sizeof(maxdepth),1,f);
    fread(s,MAXGUESSES*MAXWLEN,1,f);
    fread(h,MAXGUESSES,1,f);
    fread(m,MAXGUESSES,1,f);
    fread(nh,MAXGUESSES,1,f);
    fread(nm,MAXGUESSES,1,f);
    fread(charanz,MAXGUESSES*26,1,f); 
    fread(&specialmode,4,1,f);
    fread(specialword,wordlen,1,f);
    fread(&relaxed,sizeof(relaxed),1,f);
    close(f);
    for (i=0; i < wordlen; i++) s1[i] -= 'A';
    if (guesses<=3) maxdepth=0; else maxdepth--;
    /* As the first guesses are treated specially, reset maxdepth. */
    answerguess(s1,hinp,minp);
    /* create tables for the guess */
  }  

  memcpy(rank1,arank1,26);
  memcpy(rank2,arank2,26*27);
  memcpy(rank,arank,7*26*26*27);
  for (i=maxdepth+1;i<=25;rank1[i++]=-1);
  for (i=0;i<=25;i++)
   for(j=maxdepth+1;j<=25;rank2[i][j++]=-1);
  for (i=0; i<wordlen-2; i++)
   for (j=0;j<=25;j++)
    for (k=0; k<= 25;k++)
     for (l=maxdepth+1; l<= 25; rank[i][j][k][l++]=-1);   

  
  anzpossguesses = 0;
  finalguess[0]=-1;
  bestsum=100000;
  
  /* initializations */
  
  generateguess();
  /* Finally! Find a guess! */
  
  
  if (anzpossguesses==0) {
   /*No solution found, so drop restrictions...*/

   relax();

   memcpy(rank1,arank1,26);
   memcpy(rank2,arank2,26*26);
   memcpy(rank,arank,7*26*26*26);
   for (i=maxdepth+1;i<=25;rank1[i++]=-1);
   for (i=0;i<=25;i++)
    for(j=maxdepth+1;j<=25;rank2[i][j++]=-1);
   for (i=0; i<wordlen-2; i++)
    for (j=0;j<=25;j++)
     for (k=0; k<= 25;k++)
      for (l=maxdepth+1; l<= 25; rank[i][j][k][l++]=-1);   
   generateguess();
   /* ... and try again */
  }

  saveandexit();
  /* This is necessary for (at least) specialmode when less than 6
     guesses are possible. */
}
