alecpl
2009-10-02 fefed62caa38a83b10f20db07467f13dcc330c70
program/lib/imap.inc
@@ -199,7 +199,7 @@
function iil_PutLine($fp, $string, $endln=true) {
   global $my_prefs;
   
   if(!empty($my_prefs['debug_mode']))
   if (!empty($my_prefs['debug_mode']))
          write_log('imap', 'C: '. rtrim($string));
   
        return fputs($fp, $string . ($endln ? "\r\n" : ''));
@@ -243,14 +243,15 @@
    
   do {
          $buffer = fgets($fp, $size);
          if ($buffer === false) {
              break;
          }
      if(!empty($my_prefs['debug_mode']))
      if (!empty($my_prefs['debug_mode']))
         write_log('imap', 'S: '. chop($buffer));
          $line .= $buffer;
   } while ($buffer[strlen($buffer)-1] != "\n");
   return $line;
}
@@ -277,38 +278,41 @@
   $len  = 0;
   do {
      $d = fread($fp, $bytes-$len);
      if (!empty($my_prefs['debug_mode']))
         write_log('imap', 'S: '. $d);
                $data .= $d;
      if ($len == strlen($data)) {
      $data_len = strlen($data);
      if ($len == $data_len) {
                  break; //nothing was read -> exit to avoid apache lockups
          }
      if(!empty($my_prefs['debug_mode']))
         write_log('imap', 'S: '. $d);
          $len = strlen($data);
          $len = $data_len;
   } while ($len < $bytes);
   
   return $data;
}
// don't use it in loops, until you exactly know what you're doing
function iil_ReadReply($fp) {
   do {
      $line = trim(iil_ReadLine($fp, 1024));
   } while ($line[0] == '*');
   return $line;
}
function iil_ParseResult($string) {
   $a = explode(' ', $string);
   if (count($a) > 2) {
      if (strcasecmp($a[1], 'OK') == 0) {
   $a = explode(' ', trim($string));
   if (count($a) >= 2) {
      $res = strtoupper($a[1]);
      if ($res == 'OK') {
         return 0;
      } else if (strcasecmp($a[1], 'NO') == 0) {
      } else if ($res == 'NO') {
         return -1;
      } else if (strcasecmp($a[1], 'BAD') == 0) {
      } else if ($res == 'BAD') {
         return -2;
      } else if (strcasecmp($a[1], 'BYE') == 0) {
      } else if ($res == 'BYE') {
         return -3;
          }
      }
   }
   return -4;
}
@@ -328,7 +332,7 @@
   return false;
}
function iil_StartsWithI($string, $match, $bye=false) {
function iil_StartsWithI($string, $match, $error=false) {
   $len = strlen($match);
   if ($len == 0) {
      return false;
@@ -336,9 +340,8 @@
   if (strncasecmp($string, $match, $len) == 0) {
      return true;
   }
   if ($bye && strncmp($string, '* BYE ', 6) == 0) {
   if ($error && preg_match('/^\* (BYE|BAD) /i', $string)) {
      return true;
   }
   return false;
}
@@ -441,13 +444,8 @@
    iil_PutLine($conn->fp, 'a001 LOGIN "'.iil_Escape($user).'" "'.iil_Escape($password).'"');
    do {
        $line = iil_ReadReply($conn->fp);
        if ($line === false) {
            break;
        }
    } while (!iil_StartsWith($line, 'a001 ', true));
    $line = iil_ReadReply($conn->fp);
    // process result
    $result = iil_ParseResult($line);
@@ -557,7 +555,7 @@
   if (is_array($options)) {
      foreach($options as $optkey => $optval) {
         if ($optkey == 'imap') {
            $auth_method = $optval;
            $auth_method = strtoupper($optval);
         } else if ($optkey == 'rootdir') {
                $my_prefs['rootdir'] = $optval;
         } else if ($optkey == 'delimiter') {
@@ -569,7 +567,7 @@
   }
   if (empty($auth_method))
          $auth_method = 'check';
          $auth_method = 'CHECK';
      
   $message = "INITIAL: $auth_method\n";
      
@@ -588,7 +586,6 @@
   } else if ($my_prefs['sort_field'] == 'DATE') {
          $IMAP_USE_INTERNAL_DATE = false;
   }
   //echo '<!-- conn sort_field: '.$my_prefs['sort_field'].' //-->';
   
   //check input
   if (empty($host)) {
@@ -615,7 +612,7 @@
      $host = $ICL_SSL . '://' . $host;
   }
   $conn->fp = fsockopen($host, $ICL_PORT, $errno, $errstr, 10);
   $conn->fp = @fsockopen($host, $ICL_PORT, $errno, $errstr, 10);
   if (!$conn->fp) {
          $iil_error = "Could not connect to $host at port $ICL_PORT: $errstr";
          $iil_errornum = -2;
@@ -623,7 +620,10 @@
   }
   stream_set_timeout($conn->fp, 10);
   $line = stream_get_line($conn->fp, 8192, "\r\n");
   $line = trim(fgets($conn->fp, 8192));
   if ($my_prefs['debug_mode'] && $line)
      write_log('imap', 'S: '. $line);
   // Connected to wrong port or connection error?
   if (!preg_match('/^\* (OK|PREAUTH)/i', $line)) {
@@ -634,13 +634,13 @@
           $iil_errornum = -2;
           return false;
   }
   // RFC3501 [7.1] optional CAPABILITY response
   if (preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) {
      $conn->capability = explode(' ', strtoupper($matches[1]));
   }
   $conn->message .= $line;
   $conn->message .= $line . "\n";
   // TLS connection
   if ($ICL_SSL == 'tls' && iil_C_GetCapability($conn, 'STARTTLS')) {
@@ -665,29 +665,23 @@
           }
   }
   if (strcasecmp($auth_method, "check") == 0) {
   if ($auth_method == 'CHECK') {
      //check for supported auth methods
      if (iil_C_GetCapability($conn, 'AUTH=CRAM-MD5') || iil_C_GetCapability($conn, 'AUTH=CRAM_MD5')) {
         $auth_method = 'auth';
         $auth_method = 'AUTH';
      }
      else {
         //default to plain text auth
         $auth_method = 'plain';
         $auth_method = 'PLAIN';
      }
   }
   if (strcasecmp($auth_method, 'auth') == 0) {
      $conn->message .= "Trying CRAM-MD5\n";
   if ($auth_method == 'AUTH') {
      //do CRAM-MD5 authentication
      iil_PutLine($conn->fp, "a000 AUTHENTICATE CRAM-MD5");
      $line = trim(iil_ReadLine($conn->fp, 1024));
      $conn->message .= "$line\n";
      if ($line[0] == '+') {
         $conn->message .= 'Got challenge: ' . htmlspecialchars($line) . "\n";
         //got a challenge string, try CRAM-5
         $result = iil_C_Authenticate($conn, $user, $password, substr($line,2));
              
@@ -697,21 +691,19 @@
                     $iil_errornum = $conn->errorNum;
            return false;
         }
         $conn->message .= "Tried CRAM-MD5: $result \n";
         $conn->message .= "AUTH CRAM-MD5: $result\n";
      } else {
         $conn->message .='No challenge ('.htmlspecialchars($line)."), try plain\n";
         $auth = 'plain';
         $conn->message .= "AUTH CRAM-MD5: failed\n";
         $auth_method = 'PLAIN';
      }
   }
      
   if ((!$result)||(strcasecmp($auth, "plain") == 0)) {
   if (!$result || $auth_method == 'PLAIN') {
      //do plain text auth
      $result = iil_C_Login($conn, $user, $password);
      $conn->message .= "Tried PLAIN: $result \n";
      $conn->message .= "AUTH PLAIN: $result\n";
   }
      
   $conn->message .= $auth;
   if (!is_int($result)) {
      iil_C_Namespace($conn);
      return $conn;
@@ -779,7 +771,7 @@
   if (empty($mailbox)) {
      return false;
   }
   if (strcmp($conn->selected, $mailbox) == 0) {
   if ($conn->selected == $mailbox) {
      return true;
   }
    
@@ -788,10 +780,11 @@
         $line = chop(iil_ReadLine($conn->fp, 300));
         $a = explode(' ', $line);
         if (count($a) == 3) {
            if (strcasecmp($a[2], 'EXISTS') == 0) {
            $token = strtoupper($a[2]);
            if ($token == 'EXISTS') {
               $conn->exists = (int) $a[1];
            }
            if (strcasecmp($a[2], 'RECENT') == 0) {
            else if ($token == 'RECENT') {
               $conn->recent = (int) $a[1];
            }
         }
@@ -799,8 +792,6 @@
            $conn->permanentflags = explode(' ', $match[1]);
         }
      } while (!iil_StartsWith($line, 'sel1', true));
      $a = explode(' ', $line);
      if (strcasecmp($a[1], 'OK') == 0) {
         $conn->selected = $mailbox;
@@ -892,14 +883,14 @@
   $command  = 's ' . $is_uid . 'SORT (' . $field . ') ';
   $command .= $encoding . ' ALL' . $add;
   $line     = $data = '';
   if (!iil_PutLineC($conn->fp, $command)) {
       return false;
   }
   do {
      $line = chop(iil_ReadLine($conn->fp, 1024));
      $line = chop(iil_ReadLine($conn->fp));
      if (iil_StartsWith($line, '* SORT')) {
         $data .= ($data ? ' ' : '') . substr($line, 7);
         $data .= substr($line, 7);
          } else if (preg_match('/^[0-9 ]+$/', $line)) {
         $data .= $line;
      }
@@ -912,8 +903,7 @@
                return false;
   }
   
   $out = explode(' ',$data);
   return $out;
   return preg_split('/\s+/', $data, -1, PREG_SPLIT_NO_EMPTY);
}
function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field='', $skip_deleted=true) {
@@ -989,7 +979,7 @@
         }
         if ($mode == 1) {
            if (preg_match('/BODY\[HEADER\.FIELDS \((DATE|FROM|REPLY-TO|SENDER|TO|SUBJECT)\)\] (.*)/', $line, $matches)) {
            if (preg_match('/BODY\[HEADER\.FIELDS \("?(DATE|FROM|REPLY-TO|SENDER|TO|SUBJECT)"?\)\] (.*)/', $line, $matches)) {
               $value = preg_replace(array('/^"*[a-z]+:/i', '/\s+$/sm'), array('', ''), $matches[2]);
               $value = trim($value);
               if ($index_field == 'DATE') {
@@ -1478,13 +1468,13 @@
            $parts_count = count($a);
            if ($parts_count>=6) {
               for ($i=0; $i<$parts_count; $i=$i+2) {
                  if (strcasecmp($a[$i],'UID') == 0)
                  if ($a[$i] == 'UID')
                     $result[$id]->uid = $a[$i+1];
                  else if (strcasecmp($a[$i],'RFC822.SIZE') == 0)
                  else if ($a[$i] == 'RFC822.SIZE')
                     $result[$id]->size = $a[$i+1];
                  else if (strcasecmp($a[$i],'INTERNALDATE') == 0)
                  else if ($a[$i] == 'INTERNALDATE')
                     $time_str = $a[$i+1];
                  else if (strcasecmp($a[$i],'FLAGS') == 0)
                  else if ($a[$i] == 'FLAGS')
                     $flags_str = $a[$i+1];
               }
@@ -1502,7 +1492,7 @@
            if($bodystr) {
               while (!preg_match('/ BODYSTRUCTURE (.*) BODY\[HEADER.FIELDS/s', $line, $m)) {
                  $line2 = iil_ReadLine($fp, 1024);
                  $line .= iil_MultLine($fp, $line2);
                  $line .= iil_MultLine($fp, $line2, true);
               }
               $result[$id]->body_structure = $m[1];
            }
@@ -1511,11 +1501,11 @@
            preg_match('/ BODY\[HEADER.FIELDS \(.*?\)\]\s*(.*)$/s', $line, $m);
            $reslines = explode("\n", trim($m[1], '"'));
            // re-parse (see below)
            foreach ($reslines as $line) {
               if (ord($line[0])<=32) {
                  $lines[$ln] .= (empty($lines[$ln])?'':"\n").trim($line);
            foreach ($reslines as $resln) {
               if (ord($resln[0])<=32) {
                  $lines[$ln] .= (empty($lines[$ln])?'':"\n").trim($resln);
               } else {
                  $lines[++$ln] = trim($line);
                  $lines[++$ln] = trim($resln);
               }
            }
         }
@@ -1554,7 +1544,7 @@
               $lines[++$ln] = trim($line);
            }
         // patch from "Maksim Rubis" <siburny@hotmail.com>
         } while (trim($line[0]) != ')' && strncmp($line, $key, strlen($key)));
         } while ($line[0] != ')' && !iil_StartsWith($line, $key, true));
         if (strncmp($line, $key, strlen($key))) { 
            // process header, fill iilBasicHeader obj.
@@ -1645,23 +1635,24 @@
            $flags_a   = explode(' ', $flags_str);
               
            if (is_array($flags_a)) {
               reset($flags_a);
               while (list(,$val)=each($flags_a)) {
                  if (strcasecmp($val,'Seen') == 0) {
            //   reset($flags_a);
               foreach($flags_a as $flag) {
                  $flag = strtoupper($flag);
                  if ($flag == 'SEEN') {
                      $result[$id]->seen = true;
                  } else if (strcasecmp($val, 'Deleted') == 0) {
                      $result[$id]->deleted=true;
                  } else if (strcasecmp($val, 'Recent') == 0) {
                  } else if ($flag == 'DELETED') {
                      $result[$id]->deleted = true;
                  } else if ($flag == 'RECENT') {
                      $result[$id]->recent = true;
                  } else if (strcasecmp($val, 'Answered') == 0) {
                  } else if ($flag == 'ANSWERED') {
                     $result[$id]->answered = true;
                  } else if (strcasecmp($val, '$Forwarded') == 0) {
                  } else if ($flag == '$FORWARDED') {
                     $result[$id]->forwarded = true;
                  } else if (strcasecmp($val, 'Draft') == 0) {
                  } else if ($flag == 'DRAFT') {
                     $result[$id]->is_draft = true;
                  } else if (strcasecmp($val, '$MDNSent') == 0) {
                  } else if ($flag == '$MDNSENT') {
                     $result[$id]->mdn_sent = true;
                  } else if (strcasecmp($val, 'Flagged') == 0) {
                  } else if ($flag == 'FLAGGED') {
                           $result[$id]->flagged = true;
                  }
               }
@@ -1669,7 +1660,7 @@
            }
         }
      }
   } while (strcmp($a[0], $key) != 0);
   } while (!iil_StartsWith($line, $key, true));
   return $result;
}
@@ -1814,14 +1805,6 @@
   return iil_C_ModFlag($conn, $mailbox, $messages, 'DELETED', '+');
}
function iil_C_Undelete(&$conn, $mailbox, $messages) {
   return iil_C_ModFlag($conn, $mailbox, $messages, 'DELETED', '-');
}
function iil_C_Unseen(&$conn, $mailbox, $messages) {
   return iil_C_ModFlag($conn, $mailbox, $messages, 'SEEN', '-');
}
function iil_C_Copy(&$conn, $messages, $from, $to) {
   $fp = $conn->fp;
@@ -1833,7 +1816,7 @@
      $c=0;
      
      iil_PutLine($fp, "cpy1 UID COPY $messages \"".iil_Escape($to)."\"");
      $line=iil_ReadReply($fp);
      $line = iil_ReadReply($fp);
      return iil_ParseResult($line);
   } else {
      return -1;
@@ -1841,13 +1824,10 @@
}
function iil_C_CountUnseen(&$conn, $folder) {
   $index = iil_C_Search($conn, $folder, 'ALL UNSEEN');
   if (is_array($index)) {
      if (($cnt = count($index)) && $index[0] != '') {
         return $cnt;
      }
   }
   return false;
        $index = iil_C_Search($conn, $folder, 'ALL UNSEEN');
        if (is_array($index))
                return count($index);
        return false;
}
function iil_C_UID2ID(&$conn, $folder, $uid) {
@@ -1861,45 +1841,46 @@
}
function iil_C_ID2UID(&$conn, $folder, $id) {
   $fp = $conn->fp;
   if ($id == 0) {
       return    -1;
   }
   $result = -1;
   if (iil_C_Select($conn, $folder)) {
      $key = 'FUID';
      if (iil_PutLine($fp, "$key FETCH $id (UID)")) {
      $key = 'fuid';
      if (iil_PutLine($conn->fp, "$key FETCH $id (UID)")) {
         do {
            $line=chop(iil_ReadLine($fp, 1024));
            $line = chop(iil_ReadLine($conn->fp, 1024));
            if (preg_match("/^\* $id FETCH \(UID (.*)\)/i", $line, $r)) {
               $result = $r[1];
            }
         } while (!preg_match("/^$key/", $line));
         } while (!iil_StartsWith($line, $key, true));
      }
   }
   return $result;
}
function iil_C_Search(&$conn, $folder, $criteria) {
   $fp = $conn->fp;
   if (iil_C_Select($conn, $folder)) {
      $c = 0;
      $data = '';
      
      $query = 'srch1 SEARCH ' . chop($criteria);
      if (!iil_PutLineC($fp, $query)) {
      if (!iil_PutLineC($conn->fp, $query)) {
         return false;
      }
      do {
         $line=trim(iil_ReadLine($fp, 10000));
         if (preg_match('/^\* SEARCH/i', $line)) {
            $str = trim(substr($line, 8));
            $messages = explode(' ', $str);
         $line = trim(iil_ReadLine($conn->fp));
         if (iil_StartsWith($line, '* SEARCH')) {
            $data .= substr($line, 8);
             } else if (preg_match('/^[0-9 ]+$/', $line)) {
            $data .= $line;
         }
      } while (!iil_StartsWith($line, 'srch1', true));
      $result_code = iil_ParseResult($line);
      if ($result_code == 0) {
          return $messages;
          return preg_split('/\s+/', $data, -1, PREG_SPLIT_NO_EMPTY);
      }
      $conn->error = 'iil_C_Search: ' . $line . "\n";
      return false;   
@@ -2136,8 +2117,8 @@
   $query = 'sub1 SUBSCRIBE "' . iil_Escape($folder). '"';
   iil_PutLine($fp, $query);
   $line = trim(iil_ReadLine($fp, 10000));
   return iil_ParseResult($line);
   $line = trim(iil_ReadLine($fp, 512));
   return (iil_ParseResult($line) == 0);
}
function iil_C_UnSubscribe(&$conn, $folder) {
@@ -2146,8 +2127,8 @@
   $query = 'usub1 UNSUBSCRIBE "' . iil_Escape($folder) . '"';
   iil_PutLine($fp, $query);
    
   $line = trim(iil_ReadLine($fp, 10000));
   return iil_ParseResult($line);
   $line = trim(iil_ReadLine($fp, 512));
   return (iil_ParseResult($line) == 0);
}
function iil_C_FetchMIMEHeaders(&$conn, $mailbox, $id, $parts) {
@@ -2265,15 +2246,16 @@
                   $sizeStr  = substr($line, $from, $len);
              $bytes    = (int)$sizeStr;
         $prev     = '';
              while ($bytes > 0) {
                          $line      = iil_ReadLine($fp, 1024);
                     $len       = strlen($line);
                
                      if ($len > $bytes) {
                             $line = substr($line, 0, $bytes);
               $len = strlen($line);
                      }
                     $bytes -= strlen($line);
                     $bytes -= $len;
                      if ($mode == 1) {
               $line = rtrim($line, "\t\r\n\0\x0B");
@@ -2287,7 +2269,7 @@
               }
               else
                  $prev = '';
               if ($file)
                  fwrite($file, base64_decode($line));
                        else if ($print)
@@ -2323,7 +2305,6 @@
            }
              }
          }
           // read in anything up until last line
      if (!$end)
         do {
@@ -2331,18 +2312,17 @@
         } while (!iil_StartsWith($line, $key, true));
          if ($result) {
             $result = rtrim($result, "\t\r\n\0\x0B");
         if ($file) {
            fwrite($file, $result);
         } else if ($print) {
            echo $result;
         } else
            return $result; // substr($result, 0, strlen($result)-1);
            return $result;
         return true;
          }
   }
   return false;
}
@@ -2351,8 +2331,7 @@
   if (iil_PutLine($fp, 'c CREATE "' . iil_Escape($folder) . '"')) {
      do {
         $line=iil_ReadLine($fp, 300);
      } while ($line[0] != 'c');
        $conn->error = $line;
      } while (!iil_StartsWith($line, 'c ', true));
      return (iil_ParseResult($line) == 0);
   }
   return false;
@@ -2363,7 +2342,7 @@
   if (iil_PutLine($fp, 'r RENAME "' . iil_Escape($from) . '" "' . iil_Escape($to) . '"')) {
      do {
         $line = iil_ReadLine($fp, 300);
      } while ($line[0] != 'r');
      } while (!iil_StartsWith($line, 'r ', true));
      return (iil_ParseResult($line) == 0);
   }
   return false;
@@ -2374,40 +2353,47 @@
   if (iil_PutLine($fp, 'd DELETE "' . iil_Escape($folder). '"')) {
      do {
         $line=iil_ReadLine($fp, 300);
      } while ($line[0] != 'd');
      } while (!iil_StartsWith($line, 'd ', true));
      return (iil_ParseResult($line) == 0);
   }
   $conn->error = "Couldn't send command\n";
   return false;
}
function iil_C_Append(&$conn, $folder, &$message) {
   if (!$folder) {
          return false;
      return false;
   }
   $fp = $conn->fp;
   $message = str_replace("\r", '', $message);
   $message = str_replace("\n", "\r\n", $message);
   $message = str_replace("\n", "\r\n", $message);
   $len = strlen($message);
   if (!$len) {
          return false;
      return false;
   }
   $request = 'A APPEND "' . iil_Escape($folder) .'" (\\Seen) {' . $len . '}';
   $request = 'a APPEND "' . iil_Escape($folder) .'" (\\Seen) {' . $len . '}';
   if (iil_PutLine($fp, $request)) {
      $line=iil_ReadLine($fp, 100);
      $sent = fwrite($fp, $message."\r\n");
      $line = iil_ReadLine($fp, 512);
      if ($line[0] != '+') {
         // $errornum = iil_ParseResult($line);
         $conn->error .= "Cannot write to folder: $line\n";
         return false;
      }
      iil_PutLine($fp, $message);
      do {
         $line=iil_ReadLine($fp, 1000);
      } while ($line[0] != 'A');
         $line = iil_ReadLine($fp);
      } while (!iil_StartsWith($line, 'a ', true));
   
      $result = (iil_ParseResult($line) == 0);
      if (!$result) {
          $conn->error .= $line . "\n";
          }
      }
      return $result;
   }
@@ -2421,7 +2407,7 @@
   }
    
   //open message file
   $in_fp = false;
   $in_fp = false;
   if (file_exists(realpath($path))) {
      $in_fp = fopen($path, 'r');
   }
@@ -2437,31 +2423,35 @@
   }
    
   //send APPEND command
   $request    = 'A APPEND "' . iil_Escape($folder) . '" (\\Seen) {' . $len . '}';
   $bytes_sent = 0;
   $request    = 'a APPEND "' . iil_Escape($folder) . '" (\\Seen) {' . $len . '}';
   if (iil_PutLine($fp, $request)) {
      $line = iil_ReadLine($fp, 100);
      $line = iil_ReadLine($fp, 512);
      if ($line[0] != '+') {
         //$errornum = iil_ParseResult($line);
         $conn->error .= "Cannot write to folder: $line\n";
         return false;
      }
      //send file
      while (!feof($in_fp)) {
         $buffer      = fgets($in_fp, 4096);
         $bytes_sent += strlen($buffer);
         iil_PutLine($fp, $buffer, false);
      }
      fclose($in_fp);
      iil_PutLine($fp, '');
      iil_PutLine($fp, ''); // \r\n
      //read response
      do {
         $line = iil_ReadLine($fp, 1000);
      } while ($line[0] != 'A');
         $line = iil_ReadLine($fp);
      } while (!iil_StartsWith($line, 'a ', true));
      $result = (iil_ParseResult($line) == 0);
      if (!$result) {
          $conn->error .= $line . "\n";
      }
      return $result;
   }
   
@@ -2479,10 +2469,10 @@
      if (iil_PutLine($fp, $key . ($is_uid ? ' UID' : '') ." FETCH $id (BODYSTRUCTURE)")) {
         do {
            $line = iil_ReadLine($fp, 5000);
            $line = iil_MultLine($fp, $line);
            $line = iil_MultLine($fp, $line, true);
            if (!preg_match("/^$key/", $line))
               $result .= $line;
         } while (!preg_match("/^$key/", $line));
         } while (!iil_StartsWith($line, $key, true));
         $result = trim(substr($result, strpos($result, 'BODYSTRUCTURE')+13, -1));
      }