diff --git a/include/limesurvey/admin/access_denied.php b/include/limesurvey/admin/access_denied.php new file mode 100644 index 00000000..937de1d7 --- /dev/null +++ b/include/limesurvey/admin/access_denied.php @@ -0,0 +1,141 @@ +".$clang->gT("Access denied!")."
\n"; + + $action=returnglobal('action'); + if ( $action == "dumpdb" ) + { + $accesssummary .= "

".$clang->gT("You are not allowed dump the database!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "dumplabel") + { + $accesssummary .= "

".$clang->gT("You are not allowed export a label set!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "edituser") + { + $accesssummary .= $clang->gT("You are not allowed to change user data!"); + $accesssummary .= "

".$clang->gT("Continue")."
 \n"; + } + elseif($action == "newsurvey") + { + $accesssummary .= "

".$clang->gT("You are not allowed to create new surveys!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "deletesurvey") + { + $accesssummary .= "

".$clang->gT("You are not allowed to delete this survey!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "addquestion") + { + $accesssummary .= "

".$clang->gT("You are not allowed to add new questions for this survey!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "activate") + { + $accesssummary .= "

".$clang->gT("You are not allowed to activate this survey!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "deactivate") + { + $accesssummary .= "

".$clang->gT("You are not allowed to deactivate this survey!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "addgroup") + { + $accesssummary .= "

".$clang->gT("You are not allowed to add a group to this survey!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "ordergroups") + { + $accesssummary .= "

".$clang->gT("You are not allowed to order groups in this survey!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "editsurvey") + { + $accesssummary .= "

".$clang->gT("You are not allowed to edit this survey!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "editgroup") + { + $accesssummary .= "

".$clang->gT("You are not allowed to edit groups in this survey!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "browse_response" || $action == "listcolumn" || $action == "vvexport" || $action == "vvimport") + { + $accesssummary .= "

".$clang->gT("You are not allowed to browse responses!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "assessment") + { + $accesssummary .= "

".$clang->gT("You are not allowed to set assessment rules!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "delusergroup") + { + $accesssummary .= "

".$clang->gT("You are not allowed to delete this group!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "importsurvey") + { + $accesssummary .= "

".$clang->gT("You are not allowed to import a survey!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + + elseif($action == "importgroup") + { + $accesssummary .= "

".$clang->gT("You are not allowed to import a group!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "importquestion") + { + $accesssummary .= "

".$clang->gT("You are not allowed to to import a question!")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "CSRFwarn") + { + $accesssummary .= "

".$clang->gT("Security Alert").": ".$clang->gT("Someone may be trying to use your LimeSurvey session (CSRF attack suspected). If you just clicked on a malicious link, please report this to your system administrator.")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + elseif($action == "FakeGET") + { + $accesssummary .= "

".$clang->gT("Security Alert").": ".$clang->gT("Someone may be trying to use your LimeSurvey session by using dangerous GET requests (CSRF attack suspected). If you just clicked on a malicious link, please report this to your system administrator.")."

"; + $accesssummary .= "".$clang->gT("Continue")."
 \n"; + } + else + { + $accesssummary .= "
".$clang->gT("You are not allowed to perform this operation!")."
\n"; + if(!empty($sid)) + $accesssummary .= "

gT("Continue")."
 \n"; + } + else + $accesssummary .= "

".$clang->gT("Continue")."
 \n"; + } + + } +?> diff --git a/include/limesurvey/admin/activate.php b/include/limesurvey/admin/activate.php new file mode 100644 index 00000000..0bd6acb0 --- /dev/null +++ b/include/limesurvey/admin/activate.php @@ -0,0 +1,550 @@ +".$connect->ErrorMsg()); + while ($row=$result->FetchRow()) {$lastqid=$row['qid'];} + $newqid=$lastqid+1; + $query = "UPDATE {$dbprefix}questions SET qid=$newqid WHERE qid=$oldqid"; + $result = $connect->Execute($query) or safe_die($query."
".$connect->ErrorMsg()); + //Update conditions.. firstly conditions FOR this question + $query = "UPDATE {$dbprefix}conditions SET qid=$newqid WHERE qid=$oldqid"; + $result = $connect->Execute($query) or safe_die($query."
".$connect->ErrorMsg()); + //Now conditions based upon this question + $query = "SELECT cqid, cfieldname FROM {$dbprefix}conditions WHERE cqid=$oldqid"; + $result = db_execute_assoc($query) or safe_die($query."
".$connect->ErrorMsg()); + while ($row=$result->FetchRow()) + { + $switcher[]=array("cqid"=>$row['cqid'], "cfieldname"=>$row['cfieldname']); + } + if (isset($switcher)) + { + foreach ($switcher as $switch) + { + $query = "UPDATE {$dbprefix}conditions + SET cqid=$newqid, + cfieldname='".str_replace("X".$oldqid, "X".$newqid, $switch['cfieldname'])."' + WHERE cqid=$oldqid"; + $result = $connect->Execute($query) or safe_die($query."
".$connect->ErrorMsg()); + } + } + //Now question_attributes + $query = "UPDATE {$dbprefix}question_attributes SET qid=$newqid WHERE qid=$oldqid"; + $result = $connect->Execute($query) or safe_die($query."
".$connect->ErrorMsg()); + //Now answers + $query = "UPDATE {$dbprefix}answers SET qid=$newqid WHERE qid=$oldqid"; + $result = $connect->Execute($query) or safe_die($query."
".$connect->ErrorMsg()); + } + //CHECK TO MAKE SURE ALL QUESTION TYPES THAT REQUIRE ANSWERS HAVE ACTUALLY GOT ANSWERS + //THESE QUESTION TYPES ARE: + // # "L" -> LIST + // # "O" -> LIST WITH COMMENT + // # "M" -> MULTIPLE OPTIONS + // # "P" -> MULTIPLE OPTIONS WITH COMMENTS + // # "A", "B", "C", "E", "F", "H", "^" -> Various Array Types + // # "R" -> RANKING + // # "U" -> FILE CSV MORE + // # "I" -> FILE CSV ONE + // # "1" -> MULTI SCALE + + + + $chkquery = "SELECT qid, question, gid FROM {$dbprefix}questions WHERE sid={$_GET['sid']} AND type IN ('L', 'O', 'M', 'P', 'A', 'B', 'C', 'E', 'F', 'R', 'J', '!', '^', '1')"; + $chkresult = db_execute_assoc($chkquery) or safe_die ("Couldn't get list of questions
$chkquery
".$connect->ErrorMsg()); + while ($chkrow = $chkresult->FetchRow()) + { + $chaquery = "SELECT * FROM {$dbprefix}answers WHERE qid = {$chkrow['qid']} ORDER BY sortorder, answer"; + $charesult=$connect->Execute($chaquery); + $chacount=$charesult->RecordCount(); + if (!$chacount > 0) + { + $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("This question is a multiple answer type question but has no answers."), $chkrow['gid']); + } + } + + //NOW CHECK THAT ALL QUESTIONS HAVE A 'QUESTION TYPE' FIELD + $chkquery = "SELECT qid, question, gid FROM {$dbprefix}questions WHERE sid={$_GET['sid']} AND type = ''"; + $chkresult = db_execute_assoc($chkquery) or safe_die ("Couldn't check questions for missing types
$chkquery
".$connect->ErrorMsg()); + while ($chkrow = $chkresult->FetchRow()) + { + $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("This question does not have a question 'type' set."), $chkrow['gid']); + } + + + + + //CHECK THAT FLEXIBLE LABEL TYPE QUESTIONS HAVE AN "LID" SET + $chkquery = "SELECT qid, question, gid FROM {$dbprefix}questions WHERE sid={$_GET['sid']} AND type IN ('F', 'H', 'W', 'Z', '1') AND (lid = 0 OR lid is null)"; + $chkresult = db_execute_assoc($chkquery) or safe_die ("Couldn't check questions for missing LIDs
$chkquery
".$connect->ErrorMsg()); + while($chkrow = $chkresult->FetchRow()){ + $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("This question requires a Labelset, but none is set."), $chkrow['gid']); + } // while + + //CHECK THAT FLEXIBLE LABEL TYPE QUESTIONS HAVE AN "LID1" SET FOR MULTI SCALE + $chkquery = "SELECT qid, question, gid FROM {$dbprefix}questions WHERE sid={$_GET['sid']} AND (type ='1') AND (lid1 = 0 OR lid1 is null)"; + $chkresult = db_execute_assoc($chkquery) or safe_die ("Couldn't check questions for missing LIDs
$chkquery
".$connect->ErrorMsg()); + while($chkrow = $chkresult->FetchRow()){ + $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("This question requires a second Labelset, but none is set."), $chkrow['gid']); + } // while + + + //NOW check that all used labelsets have all necessary languages + $chkquery = "SELECT qid, question, gid, lid FROM {$dbprefix}questions WHERE sid={$_GET['sid']} AND type IN ('F', 'H', 'W', 'Z', '1') AND (lid > 0) AND (lid is not null)"; + $chkresult = db_execute_assoc($chkquery) or safe_die ("Couldn't check questions for missing LID languages
$chkquery
".$connect->ErrorMsg()); + $slangs = GetAdditionalLanguagesFromSurveyID($surveyid); + $baselang = GetBaseLanguageFromSurveyID($surveyid); + array_unshift($slangs,$baselang); + while ($chkrow = $chkresult->FetchRow()) + { + foreach ($slangs as $surveylanguage) + { + $chkquery2 = "SELECT lid FROM {$dbprefix}labels WHERE language='$surveylanguage' AND (lid = {$chkrow['lid']}) "; + $chkresult2 = db_execute_assoc($chkquery2); + if ($chkresult2->RecordCount()==0) + { + $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("The labelset used in this question does not exists or is missing a translation."), $chkrow['gid']); + } + } //foreach + } //while + + //CHECK THAT ALL CONDITIONS SET ARE FOR QUESTIONS THAT PRECEED THE QUESTION CONDITION + //A: Make an array of all the qids in order of appearance + // $qorderquery="SELECT * FROM {$dbprefix}questions, {$dbprefix}groups WHERE {$dbprefix}questions.gid={$dbprefix}groups.gid AND {$dbprefix}questions.sid={$_GET['sid']} ORDER BY {$dbprefix}groups.sortorder, {$dbprefix}questions.title"; + // $qorderresult=$connect->Execute($qorderquery) or safe_die("Couldn't generate a list of questions in order
$qorderquery
".$connect->ErrorMsg()); + // $qordercount=$qorderresult->RecordCount(); + // $c=0; + // while ($qorderrow=$qorderresult->FetchRow()) + // { + // $qidorder[]=array($c, $qorderrow['qid']); + // $c++; + // } + //TO AVOID NATURAL SORT ORDER ISSUES, FIRST GET ALL QUESTIONS IN NATURAL SORT ORDER, AND FIND OUT WHICH NUMBER IN THAT ORDER THIS QUESTION IS + $qorderquery = "SELECT * FROM {$dbprefix}questions WHERE sid=$surveyid AND type not in ('S', 'D', 'T', 'Q')"; + $qorderresult = db_execute_assoc($qorderquery) or safe_die ("$qorderquery
".$connect->ErrorMsg()); + $qrows = array(); //Create an empty array in case FetchRow does not return any rows + while ($qrow = $qorderresult->FetchRow()) {$qrows[] = $qrow;} // Get table output into array + usort($qrows, 'CompareGroupThenTitle'); // Perform a case insensitive natural sort on group name then question title of a multidimensional array + $c=0; + foreach ($qrows as $qr) + { + $qidorder[]=array($c, $qrow['qid']); + $c++; + } + $qordercount=""; + //1: Get each condition's question id + $conquery= "SELECT {$dbprefix}conditions.qid, cqid, {$dbprefix}questions.question, " + . "{$dbprefix}questions.gid " + . "FROM {$dbprefix}conditions, {$dbprefix}questions, {$dbprefix}groups " + . "WHERE {$dbprefix}conditions.qid={$dbprefix}questions.qid " + . "AND {$dbprefix}questions.gid={$dbprefix}groups.gid ORDER BY {$dbprefix}conditions.qid"; + $conresult=db_execute_assoc($conquery) or safe_die("Couldn't check conditions for relative consistency
$conquery
".$connect->ErrorMsg()); + //2: Check each conditions cqid that it occurs later than the cqid + while ($conrow=$conresult->FetchRow()) + { + $cqidfound=0; + $qidfound=0; + $b=0; + while ($b<$qordercount) + { + if ($conrow['cqid'] == $qidorder[$b][1]) + { + $cqidfound = 1; + $b=$qordercount; + } + if ($conrow['qid'] == $qidorder[$b][1]) + { + $qidfound = 1; + $b=$qordercount; + } + if ($qidfound == 1) + { + $failedcheck[]=array($conrow['qid'], $conrow['question'], ": ".$clang->gT("This question has a condition set, however the condition is based on a question that appears after it."), $conrow['gid']); + } + $b++; + } + } + //CHECK THAT ALL THE CREATED FIELDS WILL BE UNIQUE + $fieldmap=createFieldMap($surveyid, "full"); + if (isset($fieldmap)) + { + foreach($fieldmap as $fielddata) + { + $fieldlist[]=$fielddata['fieldname']; + } + $fieldlist=array_reverse($fieldlist); //let's always change the later duplicate, not the earlier one + } + $checkKeysUniqueComparison = create_function('$value','if ($value > 1) return true;'); + @$duplicates = array_keys (array_filter (array_count_values($fieldlist), $checkKeysUniqueComparison)); + if (isset($duplicates)) + { + foreach ($duplicates as $dup) + { + $badquestion=arraySearchByKey($dup, $fieldmap, "fieldname", 1); + $fix = "[Click Here to Fix]"; + $failedcheck[]=array($badquestion['qid'], $badquestion['question'], ": Bad duplicate fieldname $fix", $badquestion['gid']); + } + } + + //IF ANY OF THE CHECKS FAILED, PRESENT THIS SCREEN + if (isset($failedcheck) && $failedcheck) + { + $activateoutput .= "
\n\n"; + $activateoutput .= "\t\t\t\t\n"; + $activateoutput .= "\t\n"; + $activateoutput .= "\t\t\n"; + $activateoutput .= "\t\n"; + $activateoutput .= "\t\n"; + $activateoutput .= "\t\t\n"; + $activateoutput .= "\t\n"; + $activateoutput .= "
".$clang->gT("Activate Survey")." ($surveyid)
\n"; + $activateoutput .= "\t\t\t".$clang->gT("Error")."
\n"; + $activateoutput .= "\t\t\t".$clang->gT("Survey does not pass consistency check")."
\n"; + $activateoutput .= "\t\t
\n"; + $activateoutput .= "\t\t\t".$clang->gT("The following problems have been found:")."
\n"; + $activateoutput .= "\t\t\t
    \n"; + foreach ($failedcheck as $fc) + { + $activateoutput .= "\t\t\t\t
  • Question qid-{$fc[0]} (\"{$fc[1]}\"){$fc[2]}
  • \n"; + } + $activateoutput .= "\t\t\t
\n"; + $activateoutput .= "\t\t\t".$clang->gT("The survey cannot be activated until these problems have been resolved.")."\n"; + $activateoutput .= "\t\t

 \n"; + + return; + } + + $activateoutput .= "
\n\n"; + $activateoutput .= "\t\t\t\t\n"; + $activateoutput .= "\t\n"; + $activateoutput .= "\t\t\n"; + $activateoutput .= "\t\n"; + $activateoutput .= "\t\n"; + $activateoutput .= "\t\t\n"; + $activateoutput .= "\t\n"; + $activateoutput .= "\t\n"; + $activateoutput .= "\t\t\n"; + $activateoutput .= "\t\n"; + $activateoutput .= "
".$clang->gT("Activate Survey")." ($surveyid)
\n"; + $activateoutput .= "\t\t\t".$clang->gT("Warning")."
\n"; + $activateoutput .= "\t\t\t".$clang->gT("READ THIS CAREFULLY BEFORE PROCEEDING")."\n"; + $activateoutput .= "\t\t\t
\n"; + $activateoutput .= "\t\t
\n"; + $activateoutput .= $clang->gT("You should only activate a survey when you are absolutely certain that your survey setup is finished and will not need changing.")."

\n"; + $activateoutput .= $clang->gT("Once a survey is activated you can no longer:")."
  • ".$clang->gT("Add or delete groups")."
  • ".$clang->gT("Add or remove answers to Multiple Answer questions")."
  • ".$clang->gT("Add or delete questions")."
\n"; + $activateoutput .= $clang->gT("However you can still:")."
  • ".$clang->gT("Edit (change) your questions code, text or type")."
  • ".$clang->gT("Edit (change) your group names")."
  • ".$clang->gT("Add, Remove or Edit pre-defined question answers (except for Multi-answer questions)")."
  • ".$clang->gT("Change survey name or description")."
\n"; + $activateoutput .= $clang->gT("Once data has been entered into this survey, if you want to add or remove groups or questions, you will need to de-activate this survey, which will move all data that has already been entered into a separate archived table.")."

\n"; + $activateoutput .= "\t\t
\n"; +// $activateoutput .= "\t\t\tgT("Activate Survey")."\" onclick=\"window.open('$scriptname?action=activate&ok=Y&sid={$_GET['sid']}', '_top')\" />\n"; + $activateoutput .= "\t\t\tgT("Activate Survey")."\" onclick=\"".get2post("$scriptname?action=activate&ok=Y&sid={$_GET['sid']}")."\" />\n"; + $activateoutput .= "\t\t
 

 \n"; + +} +else +{ + //Create the survey responses table + $createsurvey = "id I NOTNULL AUTO PRIMARY,\n"; + $createsurvey .= " submitdate T,\n"; + $createsurvey .= " startlanguage C(20) NOTNULL ,\n"; + //Check for any additional fields for this survey and create necessary fields (token and datestamp) + $pquery = "SELECT private, allowregister, datestamp, ipaddr, refurl FROM {$dbprefix}surveys WHERE sid={$postsid}"; + $presult=db_execute_assoc($pquery); + while($prow=$presult->FetchRow()) + { + if ($prow['private'] == "N") + { + $createsurvey .= " token C(36),\n"; + $surveynotprivate="TRUE"; + } + if ($prow['allowregister'] == "Y") + { + $surveyallowsregistration="TRUE"; + } + if ($prow['datestamp'] == "Y") + { + $createsurvey .= " datestamp T NOTNULL,\n"; + $createsurvey .= " startdate T NOTNULL,\n"; + } + if ($prow['ipaddr'] == "Y") + { + $createsurvey .= " ipaddr X,\n"; + } + //Check to see if 'refurl' field is required. + if ($prow['refurl'] == "Y") + { + $createsurvey .= " refurl X,\n"; + } + } + //Get list of questions for the base language + $aquery = " SELECT * FROM ".db_table_name('questions').", ".db_table_name('groups') + ." WHERE ".db_table_name('questions').".gid=".db_table_name('groups').".gid " + ." AND ".db_table_name('questions').".sid={$postsid} " + ." AND ".db_table_name('groups').".language='".GetbaseLanguageFromSurveyid($postsid). "' " + ." AND ".db_table_name('questions').".language='".GetbaseLanguageFromSurveyid($postsid). "' " + ." ORDER BY ".db_table_name('groups').".group_order, title"; + $aresult = db_execute_assoc($aquery); + while ($arow=$aresult->FetchRow()) //With each question, create the appropriate field(s) + { + if ( substr($createsurvey, strlen($createsurvey)-2, 2) != ",\n") {$createsurvey .= ",\n";} + + if ($arow['type'] != "M" && $arow['type'] != "A" && $arow['type'] != "B" && + $arow['type'] != "C" && $arow['type'] != "E" && $arow['type'] != "F" && + $arow['type'] != "H" && $arow['type'] != "P" && $arow['type'] != "R" && + $arow['type'] != "Q" && $arow['type'] != "^" && $arow['type'] != "J" && + $arow['type'] != "K" && $arow['type'] != "1") + { + $createsurvey .= " `{$arow['sid']}X{$arow['gid']}X{$arow['qid']}`"; + switch($arow['type']) + { + case "N": //NUMERICAL + $createsurvey .= " C(20)"; + break; + case "S": //SHORT TEXT + if ($databasetype=='mysql') {$createsurvey .= " X";} + else {$createsurvey .= " C(255)";} + break; + case "L": //LIST (RADIO) + case "!": //LIST (DROPDOWN) + case "W": + case "Z": + $createsurvey .= " C(5)"; + if ($arow['other'] == "Y") + { + $createsurvey .= ",\n`{$arow['sid']}X{$arow['gid']}X{$arow['qid']}other` X"; + } + break; + case "I": // CSV ONE + $createsurvey .= " C(5)"; + break; + case "O": //DROPDOWN LIST WITH COMMENT + $createsurvey .= " C(5),\n `{$arow['sid']}X{$arow['gid']}X{$arow['qid']}comment` X"; + break; + case "T": //LONG TEXT + $createsurvey .= " X"; + break; + case "U": //HUGE TEXT + $createsurvey .= " X"; + break; + case "D": //DATE + $createsurvey .= " D"; + break; + case "5": //5 Point Choice + case "G": //Gender + case "Y": //YesNo + case "X": //Boilerplate + $createsurvey .= " C(1)"; + break; + } + } + elseif ($arow['type'] == "M" || $arow['type'] == "A" || $arow['type'] == "B" || + $arow['type'] == "C" || $arow['type'] == "E" || $arow['type'] == "F" || + $arow['type'] == "H" || $arow['type'] == "P" || $arow['type'] == "^") + { + //MULTI ENTRY + $abquery = "SELECT a.*, q.other FROM {$dbprefix}answers as a, {$dbprefix}questions as q" + ." WHERE a.qid=q.qid AND sid={$postsid} AND q.qid={$arow['qid']} " + ." AND a.language='".GetbaseLanguageFromSurveyid($postsid). "' " + ." AND q.language='".GetbaseLanguageFromSurveyid($postsid). "' " + ." ORDER BY a.sortorder, a.answer"; + $abresult=db_execute_assoc($abquery) or safe_die ("Couldn't get perform answers query
$abquery
".$connect->ErrorMsg()); + while ($abrow=$abresult->FetchRow()) + { + $createsurvey .= " `{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['code']}` C(5),\n"; + if ($abrow['other']=="Y") {$alsoother="Y";} + if ($arow['type'] == "P") + { + $createsurvey .= " `{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['code']}comment` X,\n"; + } + } + if ((isset($alsoother) && $alsoother=="Y") && ($arow['type']=="M" || $arow['type']=="P" || $arow['type']=="1")) //Sc: check! + { + $createsurvey .= " `{$arow['sid']}X{$arow['gid']}X{$arow['qid']}other` C(255),\n"; + if ($arow['type']=="P") + { + $createsurvey .= " `{$arow['sid']}X{$arow['gid']}X{$arow['qid']}othercomment` X,\n"; + } + } + } + elseif ($arow['type'] == "Q") + { + $abquery = "SELECT a.*, q.other FROM {$dbprefix}answers as a, {$dbprefix}questions as q WHERE a.qid=q.qid AND sid={$postsid} AND q.qid={$arow['qid']} " + ." AND a.language='".GetbaseLanguageFromSurveyid($postsid). "' " + ." AND q.language='".GetbaseLanguageFromSurveyid($postsid). "' " + ." ORDER BY a.sortorder, a.answer"; + $abresult=db_execute_assoc($abquery) or safe_die ("Couldn't get perform answers query
$abquery
".$connect->ErrorMsg()); + while ($abrow = $abresult->FetchRow()) + { + $createsurvey .= " `{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['code']}`"; + if ($databasetype=='mysql') + { + $createsurvey .= " X"; + } + else + { + $createsurvey .= " C(255)"; + } + $createsurvey .= ",\n"; + } + } + + elseif ($arow['type'] == "K") //Multiple Numeric - replica of multiple short text, except numbers only + { + $abquery = "SELECT a.*, q.other FROM {$dbprefix}answers as a, {$dbprefix}questions as q WHERE a.qid=q.qid AND sid={$postsid} AND q.qid={$arow['qid']} " + ." AND a.language='".GetbaseLanguageFromSurveyid($postsid). "' " + ." AND q.language='".GetbaseLanguageFromSurveyid($postsid). "' " + ." ORDER BY a.sortorder, a.answer"; + $abresult=db_execute_assoc($abquery) or safe_die ("Couldn't get perform answers query
$abquery
".$connect->ErrorMsg()); + while ($abrow = $abresult->FetchRow()) + { + $createsurvey .= " `{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['code']}` C(20),\n"; + } + } //End if ($arow['type'] == "K") +/* elseif ($arow['type'] == "J") + { + $abquery = "SELECT {$dbprefix}answers.*, {$dbprefix}questions.other FROM {$dbprefix}answers, {$dbprefix}questions WHERE {$dbprefix}answers.qid={$dbprefix}questions.qid AND sid={$_GET['sid']} AND {$dbprefix}questions.qid={$arow['qid']} ORDER BY {$dbprefix}answers.sortorder, {$dbprefix}answers.answer"; + $abresult=db_execute_assoc($abquery) or safe_die ("Couldn't get perform answers query
$abquery
".$connect->ErrorMsg()); + while ($abrow = $abresultt->FetchRow()) + { + $createsurvey .= " `{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['code']}` C(5),\n"; + } + }*/ + elseif ($arow['type'] == "R") + { + //MULTI ENTRY + $abquery = "SELECT a.*, q.other FROM {$dbprefix}answers as a, {$dbprefix}questions as q" + ." WHERE a.qid=q.qid AND sid={$postsid} AND q.qid={$arow['qid']} " + ." AND a.language='".GetbaseLanguageFromSurveyid($postsid). "' " + ." AND q.language='".GetbaseLanguageFromSurveyid($postsid). "' " + ." ORDER BY a.sortorder, a.answer"; + $abresult=$connect->Execute($abquery) or safe_die ("Couldn't get perform answers query
$abquery
".$connect->ErrorMsg()); + $abcount=$abresult->RecordCount(); + for ($i=1; $i<=$abcount; $i++) + { + $createsurvey .= " `{$arow['sid']}X{$arow['gid']}X{$arow['qid']}$i` C(5),\n"; + } + } + elseif ($arow['type'] == "1") + { + $abquery = "SELECT a.*, q.other FROM {$dbprefix}answers as a, {$dbprefix}questions as q" + ." WHERE a.qid=q.qid AND sid={$postsid} AND q.qid={$arow['qid']} " + ." AND a.language='".GetbaseLanguageFromSurveyid($postsid). "' " + ." AND q.language='".GetbaseLanguageFromSurveyid($postsid). "' " + ." ORDER BY a.sortorder, a.answer"; + $abresult=db_execute_assoc($abquery) or safe_die ("Couldn't get perform answers query
$abquery
".$connect->ErrorMsg()); + $abcount=$abresult->RecordCount(); + while ($abrow = $abresult->FetchRow()) + { + $abmultiscalequery = "SELECT a.*, q.other FROM {$dbprefix}answers as a, {$dbprefix}questions as q, {$dbprefix}labels as l" + ." WHERE a.qid=q.qid AND sid={$postsid} AND q.qid={$arow['qid']} " + ." AND l.lid=q.lid AND sid={$postsid} AND q.qid={$arow['qid']} AND l.title = '' " + ." AND l.language='".GetbaseLanguageFromSurveyid($postsid). "' " + ." AND q.language='".GetbaseLanguageFromSurveyid($postsid). "' "; + $abmultiscaleresult=$connect->Execute($abmultiscalequery) or safe_die ("Couldn't get perform answers query
$abmultiscalequery
".$connect->ErrorMsg()); + $abmultiscaleresultcount =$abmultiscaleresult->RecordCount(); + $abmultiscaleresultcount = 1; + for ($j=0; $j<=$abmultiscaleresultcount; $j++) + { + $createsurvey .= " `{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['code']}#$j` C(5),\n"; + } + } + } + } + + // If last question is of type MCABCEFHP^QKJR let's get rid of the ending coma in createsurvey + $createsurvey = rtrim($createsurvey, ",\n")."\n"; // Does nothing if not ending with a comma + $tabname = "{$dbprefix}survey_{$postsid}"; # not using db_table_name as it quotes the table name (as does CreateTableSQL) + + $taboptarray = array('mysql' => 'TYPE='.$databasetabletype.' CHARACTER SET utf8 COLLATE utf8_unicode_ci'); + $dict = NewDataDictionary($connect); + $sqlarray = $dict->CreateTableSQL($tabname, $createsurvey, $taboptarray); + $execresult=$dict->ExecuteSQLArray($sqlarray,1); + if ($execresult==0 || $execresult==1) + { + $activateoutput .= "
\n\n" . + "\n" . + "
".$clang->gT("Activate Survey")." ($surveyid)
\n" . + "".$clang->gT("Survey could not be actived.")."
\n" . + "
".$clang->gT("Main Admin Screen")."
\n" . + "DB ".$clang->gT("Error").":
\n" . $connect->ErrorMsg() . "\n" . + "
$createsurvey
\n" . + "

 \n" . + "\n"; + } + if ($execresult != 0 && $execresult !=1) + { + $anquery = "SELECT autonumber_start FROM {$dbprefix}surveys WHERE sid={$postsid}"; + if ($anresult=db_execute_assoc($anquery)) + { + //if there is an autonumber_start field, start auto numbering here + while($row=$anresult->FetchRow()) + { + if ($row['autonumber_start'] > 0) + { + $autonumberquery = "ALTER TABLE {$dbprefix}survey_{$postsid} AUTO_INCREMENT = ".$row['autonumber_start']; + if ($result = $connect->Execute($autonumberquery)) + { + //We're happy it worked! + } + else + { + //Continue regardless - it's not the end of the world + } + } + } + } + + $activateoutput .= "
\n\n"; + $activateoutput .= "\t\t\t\t\n"; + $activateoutput .= "\t\t\t\t
".$clang->gT("Activate Survey")." ($surveyid)
".$clang->gT("Survey has been activated. Results table has been successfully created.")."

\n"; + + $acquery = "UPDATE {$dbprefix}surveys SET active='Y' WHERE sid=".returnglobal('sid'); + $acresult = $connect->Execute($acquery); + +// Private means data privacy, not closed access survey +// if (isset($surveynotprivate) && $surveynotprivate) //This survey is tracked, and therefore a tokens table MUST exist +// { +// $activateoutput .= $clang->gT("This is not an anonymous survey. A token table must also be created.")."

\n"; +// $activateoutput .= "\n"; +// } +// elseif (isset($surveyallowsregistration) && $surveyallowsregistration == "TRUE") + if (isset($surveyallowsregistration) && $surveyallowsregistration == "TRUE") + { + $activateoutput .= $clang->gT("This survey allows public registration. A token table must also be created.")."

\n"; +// $activateoutput .= "\n"; + $activateoutput .= "\n"; + } + else + { + $activateoutput .= $clang->gT("This survey is now active, and responses can be recorded.")."

\n"; + $activateoutput .= "".$clang->gT("Open-access mode").": ".$clang->gT("No invitation code is needed to complete the survey.")."
".$clang->gT("You can switch to the closed-access mode by initialising a token table with the button below.")."

\n"; +// $activateoutput .= $clang->gT("Optional").": \n"; + $activateoutput .= $clang->gT("Optional").": \n"; + } + $activateoutput .= "\t\t\t\t

 \n"; + } + +} + +?> diff --git a/include/limesurvey/admin/admin.php b/include/limesurvey/admin/admin.php new file mode 100644 index 00000000..621ef5be --- /dev/null +++ b/include/limesurvey/admin/admin.php @@ -0,0 +1,656 @@ +=')) +{ + require_once(dirname(__FILE__).'/classes/core/domxml-php4-to-php5.php'); +} +require_once(dirname(__FILE__).'/../config-defaults.php'); +require_once(dirname(__FILE__).'/../common.php'); +require_once($rootdir.'/classes/core/html_entity_decode_php4.php'); // has been secured + + +require_once('htmleditor-functions.php'); + +//@ini_set('session.gc_maxlifetime', $sessionlifetime); Might cause problems in client?? + +// Reset FileManagerContext +$_SESSION['FileManagerContext']=''; + +if (!isset($adminlang)) {$adminlang=returnglobal('adminlang');} // Admin language +if (!isset($surveyid)) {$surveyid=returnglobal('sid');} //SurveyID +if (!isset($ugid)) {$ugid=returnglobal('ugid');} //Usergroup-ID +if (!isset($gid)) {$gid=returnglobal('gid');} //GroupID +if (!isset($qid)) {$qid=returnglobal('qid');} //QuestionID +if (!isset($lid)) {$lid=returnglobal('lid');} //LabelID +if (!isset($code)) {$code=returnglobal('code');} // ?? +if (!isset($action)) {$action=returnglobal('action');} //Desired action +if (!isset($subaction)) {$subaction=returnglobal('subaction');} //Desired subaction +if (!isset($editedaction)) {$editedaction=returnglobal('editedaction');} // for html editor integration + +if ($action != "showprintablesurvey") +{ + $adminoutput = helpscreenscript(); + $adminoutput .= "\n" + ."\t\n" + ."\t\t\n".helpscreen() + . "\t\n" + . "
\n"; +} else {$adminoutput='';} +include_once("login_check.php"); + + +if ( $action == 'CSRFwarn') +{ + include("access_denied.php"); +} + +if ( $action == 'FakeGET') +{ + include("access_denied.php"); +} + +if(isset($_SESSION['loginID']) && $action!='login') +{ + //VARIOUS DATABASE OPTIONS/ACTIONS PERFORMED HERE + if ($action == "delsurvey" || $action == "delgroup" || $action == "delgroupall" || + $action == "delquestion" || $action == "delquestionall" || $action == "insertnewsurvey" || + $action == "copynewquestion" || $action == "insertnewgroup" || $action == "insertCSV" || + $action == "insertnewquestion" || $action == "updatesurvey" || $action == "updatesurvey2" || + $action == "updategroup" || $action == "deactivate" || + $action == "updatequestion" || $action == "modanswer" || $action == "renumberquestions" || + $action == "delattribute" || $action == "addattribute" || $action == "editattribute") + { + include("database.php"); + } + +sendcacheheaders(); + +/* Check user right actions for validity + Currently existing user rights: + `configurator` + `create_survey` + `create_user` + `delete_user` + `manage_label` + `manage_template` + `superadmin` +*/ + +if ($action == "importsurvey") + { + if ($_SESSION['USER_RIGHT_CREATE_SURVEY']==1) {include("http_importsurvey.php");} + else { include("access_denied.php");} + } +elseif ($action == "dumpdb") + { + if ($_SESSION['USER_RIGHT_CONFIGURATOR']==1) {include("dumpdb.php");} + else { include("access_denied.php");} + } +elseif ($action == "dumplabel") + { + if ($_SESSION['USER_RIGHT_MANAGE_LABEL']==1) {include("dumplabel.php");} + else { include("access_denied.php");} + } +elseif ($action == "exportlabelresources") + { + if ($_SESSION['USER_RIGHT_MANAGE_TEMPLATE']==1) {$_SESSION['FileManagerContext']="edit:label:$lid"; include("export_resources_zip.php");} + else { include("access_denied.php");} + } +elseif ($action == "checkintegrity") + { + if ($_SESSION['USER_RIGHT_CONFIGURATOR']==1) {include("integritycheck.php");} + else { include("access_denied.php");} + } +elseif ($action=="labels" || $action=="newlabelset" || $action=="insertlabelset" || + $action=="deletelabelset" || $action=="editlabelset" || $action=="modlabelsetanswers" || + $action=="updateset" || $action=="importlabels" ||$action == "importlabelresources") + { + if ($_SESSION['USER_RIGHT_MANAGE_LABEL']==1) {$_SESSION['FileManagerContext']="edit:label:$lid"; include("labels.php");} + else { include("access_denied.php");} + } +elseif ($action=="templates" || $action=="templatecopy" || $action=="templatesavechanges" || + $action=="templaterename" || $action=="templateupload" || $action=="templatefiledelete" || + $action=="templatezip" || $action=="templaterefresh") + { + if ($_SESSION['USER_RIGHT_MANAGE_TEMPLATE']==1) {include("templates.php");} + else { include("access_denied.php");} + } + + + +/* Check survey right actions for validity + Currently existing survey rights: + `edit_survey_property` + `define_questions` + `browse_response` + `export` + `delete_survey` + `activate_survey` +*/ + +if (isset($surveyid) && $surveyid) +{ +$surquery = "SELECT * FROM {$dbprefix}surveys_rights WHERE sid=".db_quote($surveyid)." AND uid = ".db_quote($_SESSION['loginID']); //Getting rights for this survey +$surresult = db_execute_assoc($surquery); +$surrows = $surresult->FetchRow(); +} + +if ($action == "activate") + { + if($surrows['activate_survey'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("activate.php");} + else { include("access_denied.php");} + } +elseif ($action == "conditions") +{ + if($surrows['define_questions'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("conditions.php");} + else { include("access_denied.php");} + } +elseif ($action == "importsurvresources") + { + if ($surrows['define_questions'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {$_SESSION['FileManagerContext']="edit:survey:$surveyid";include("import_resources_zip.php");} + else { include("access_denied.php");} + } +elseif ($action == "exportstructurecsv") + { + if($surrows['export'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("export_structure_csv.php");} + else { include("access_denied.php");} + } +elseif ($action == "exportstructurequexml") + { + if($surrows['export'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("export_structure_quexml.php");} + else { include("access_denied.php");} + } +elseif ($action == "exportsurvresources") + { + if($surrows['export'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {$_SESSION['FileManagerContext']="edit:survey:$surveyid";include("export_resources_zip.php");} + else { include("access_denied.php");} + } +elseif ($action == "dumpquestion") + { + if($surrows['export'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("dumpquestion.php");} + else { include("access_denied.php");} + } +elseif ($action == "dumpgroup") + { + if($surrows['export'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("dumpgroup.php");} + else { include("access_denied.php");} + } +elseif ($action == "deactivate") + { + if($surrows['activate_survey'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("deactivate.php");} + else { include("access_denied.php");} + } +elseif ($action == "deletesurvey") + { + if($surrows['delete_survey'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("deletesurvey.php");} + else { include("access_denied.php");} + } +elseif ($action == "resetsurveylogic") + { + if($surrows['define_questions'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("resetsurveylogic.php");} + else { include("access_denied.php");} + } +elseif ($action == "importgroup") + { + if($surrows['define_questions'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("importgroup.php");} + else { include("access_denied.php");} + } +elseif ($action == "importquestion") + { + if($surrows['define_questions'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("importquestion.php");} + else { include("access_denied.php");} + } +elseif ($action == "listcolumn") + { + if($surrows['browse_response'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("listcolumn.php");} + else { include("access_denied.php");} + } +elseif ($action == "previewquestion") + { + if($surrows['define_questions'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("preview.php");} + else { include("access_denied.php");} + } +elseif ($action=="addgroup" || $action=="editgroup") + { + if($surrows['define_questions'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {$_SESSION['FileManagerContext']="edit:group:$surveyid"; include("grouphandling.php");} + else { include("access_denied.php");} + } +elseif ($action == "vvexport") + { + if($surrows['browse_response'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("vvexport.php");} + else { include("access_denied.php");} + } +elseif ($action == "vvimport") + { + if($surrows['browse_response'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("vvimport.php");} + else { include("access_denied.php");} + } +elseif ($action == "importoldresponses") + { + if($surrows['browse_response'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("importoldresponses.php");} + else { include("access_denied.php");} + } +elseif ($action == "saved") + { + if($surrows['browse_response'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("saved.php");} + else { include("access_denied.php");} + } +elseif ($action == "exportresults") + { + if($surrows['export'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("exportresults.php");} + else { include("access_denied.php");} + } +elseif ($action == "exportspss") + { + if($surrows['export'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("spss.php");} + else { include("access_denied.php");} + } +elseif ($action == "statistics") + { + if($surrows['browse_response'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("statistics.php");} + else { include("access_denied.php");} + } +elseif ($action == "dataentry") + { + if($surrows['browse_response'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("dataentry.php");} + else { include("access_denied.php");} + } +elseif ($action == "browse") + { + if($surrows['browse_response'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("browse.php");} + else { include("access_denied.php");} + } +elseif ($action == "tokens") + { + if($surrows['activate_survey'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {$_SESSION['FileManagerContext']="edit:emailsettings:$surveyid"; include("tokens.php");} + else { include("access_denied.php"); } + } +elseif ($action=="showprintablesurvey") + { + include("printablesurvey.php"); //No special right needed to show the printable survey + } +elseif ($action=="assessments" || $action=="assessmentdelete" || $action=="assessmentedit" || $action=="assessmentadd" || $action=="assessmentupdate") + { + if($surrows['define_questions'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {include("assessments.php");} + else { include("access_denied.php");} + } +elseif ($action == "replacementfields") + { + switch ($editedaction) + { + case 'labels': + if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || $_SESSION['USER_RIGHT_MANAGE_LABEL']==1) + { + include("fck_LimeReplacementFields.php");exit; + } + else + { + include("access_denied.php"); + } + break; + case 'newsurvey': + if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || $_SESSION['USER_RIGHT_CREATE_SURVEY'] == 1) + { + include("fck_LimeReplacementFields.php");exit; + } + else + { + include("access_denied.php"); + } + break; + case 'updatesurvey': + if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || $surrows['edit_survey_property']) + { + include("fck_LimeReplacementFields.php");exit; + } + else + { + include("access_denied.php"); + } + break; + case 'tokens': // email + if ( $_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || $surrows['activate_survey']) + { + include("fck_LimeReplacementFields.php");exit; + } + else + { + include("access_denied.php"); + } + case 'editquestion': + case 'copyquestion': + case 'editgroup': + case 'addquestion': + case 'addgroup': + case 'editanswer': + if ( $_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || $surrows['define_questions']) + { + include("fck_LimeReplacementFields.php");exit; + } + else + { + include("access_denied.php"); + } + break; + default: + break; + } + } + + + + if (!isset($assessmentsoutput) && !isset($statisticsoutput) && !isset($browseoutput) && !isset($savedsurveyoutput) && !isset( $listcolumnoutput ) && + !isset($dataentryoutput) && !isset($conditionsoutput) && !isset($importoldresponsesoutput) && + !isset($vvoutput) && !isset($tokenoutput) && !isset($exportoutput) && !isset($templatesoutput) && + (isset($surveyid) || $action=="listurveys" || $action=="changelang" || $action=="changehtmleditormode" || $action=="checksettings" || //Still to check + $action=="editsurvey" || $action=="updatesurvey" || $action=="ordergroups" || + $action=="newsurvey" || $action=="listsurveys" || + $action=="surveyrights" || $action=="quotas") ) +{ + if ($action=="editsurvey" || $action=="updatesurvey") + { + $_SESSION['FileManagerContext']="edit:survey:$surveyid"; + } + include("html.php"); +} + + if ($action=="addquestion" || $action=="copyquestion" || $action=="editquestion" || + $action=="orderquestions" || $action=="editattribute" || $action=="delattribute" || + $action=="addattribute" ) + {if($surrows['define_questions'] || $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) {$_SESSION['FileManagerContext']="edit:question:$surveyid";include("questionhandling.php");} + else { include("access_denied.php");} + } + + + if ($action=="adduser" || $action=="deluser" || $action=="moduser" || $action=="setusertemplates" || $action=="usertemplates" || //Still to check + $action=="userrights" || $action=="modifyuser" || $action=="editusers" || + $action=="addusergroup" || $action=="editusergroup" || $action=="mailusergroup" || + $action=="delusergroup" || $action=="usergroupindb" || $action=="mailsendusergroup" || + $action=="editusergroupindb" || $action=="editusergroups" || $action=="deleteuserfromgroup" || + $action=="addusertogroup" || $action=="setuserrights" || $action=="setasadminchild") + + { + include ("userrighthandling.php"); + } + + + // For some output we dont want to have the standard admin menu bar + if (!isset($labelsoutput) && !isset($templatesoutput) && !isset($printablesurveyoutput) && + !isset($assessmentsoutput) && !isset($tokenoutput) && !isset($browseoutput) && + !isset($dataentryoutput) && !isset($statisticsoutput)&& !isset($savedsurveyoutput) && + !isset($exportoutput) && !isset($importoldresponsesoutput) && !isset($conditionsoutput) && + !isset($vvoutput) && !isset($listcolumnoutput) && !isset($importlabelresources)) + { + $adminoutput.= showadminmenu(); + } + + + if (isset($databaseoutput)) {$adminoutput.= $databaseoutput;} + if (isset($templatesoutput)) {$adminoutput.= $templatesoutput;} + if (isset($accesssummary )) {$adminoutput.= $accesssummary;} + if (isset($surveysummary )) {$adminoutput.= $surveysummary;} + if (isset($usergroupsummary)){$adminoutput.= $usergroupsummary;} + if (isset($usersummary )) {$adminoutput.= $usersummary;} + if (isset($groupsummary )) {$adminoutput.= $groupsummary;} + if (isset($questionsummary)) {$adminoutput.= $questionsummary;} + if (isset($vasummary )) {$adminoutput.= $vasummary;} + if (isset($addsummary )) {$adminoutput.= $addsummary;} + if (isset($answersummary )) {$adminoutput.= $answersummary;} + if (isset($cssummary )) {$adminoutput.= $cssummary;} + if (isset($listcolumnoutput)) {$adminoutput.= $listcolumnoutput;} + + + if (isset($editgroup)) {$adminoutput.= $editgroup;} + if (isset($editquestion)) {$adminoutput.= $editquestion;} + if (isset($editsurvey)) {$adminoutput.= $editsurvey;} + if (isset($quotasoutput)) {$adminoutput.= $quotasoutput;} + if (isset($labelsoutput)) {$adminoutput.= $labelsoutput;} + if (isset($listsurveys)) {$adminoutput.= $listsurveys; } + if (isset($integritycheck)) {$adminoutput.= $integritycheck;} + if (isset($ordergroups)){$adminoutput.= $ordergroups;} + if (isset($orderquestions)) {$adminoutput.= $orderquestions;} + if (isset($surveysecurity)) {$adminoutput.= $surveysecurity;} + if (isset($exportstructure)) {$adminoutput.= $exportstructure;} + if (isset($newsurvey)) {$adminoutput.= $newsurvey;} + if (isset($newgroupoutput)) {$adminoutput.= $newgroupoutput;} + if (isset($newquestionoutput)) {$adminoutput.= $newquestionoutput;} + if (isset($newanswer)) {$adminoutput.= $newanswer;} + if (isset($editanswer)) {$adminoutput.= $editanswer;} + if (isset($assessmentsoutput)) {$adminoutput.= $assessmentsoutput;} + + if (isset($importsurvey)) {$adminoutput.= $importsurvey;} + if (isset($importsurvresourcesoutput)) {$adminoutput.= $importsurvresourcesoutput;} + if (isset($importgroup)) {$adminoutput.= $importgroup;} + if (isset($importquestion)) {$adminoutput.= $importquestion;} + if (isset($printablesurveyoutput)) {$adminoutput.= $printablesurveyoutput;} + if (isset($activateoutput)) {$adminoutput.= $activateoutput;} + if (isset($deactivateoutput)) {$adminoutput.= $deactivateoutput;} + if (isset($tokenoutput)) {$adminoutput.= $tokenoutput;} + if (isset($browseoutput)) {$adminoutput.= $browseoutput;} + if (isset($dataentryoutput)) {$adminoutput.= $dataentryoutput;} + if (isset($statisticsoutput)) {$adminoutput.= $statisticsoutput;} + if (isset($exportoutput)) {$adminoutput.= $exportoutput;} + if (isset($savedsurveyoutput)) {$adminoutput.= $savedsurveyoutput;} + if (isset($importoldresponsesoutput)) {$adminoutput.= $importoldresponsesoutput;} + if (isset($conditionsoutput)) {$adminoutput.= $conditionsoutput;} + if (isset($deletesurveyoutput)) {$adminoutput.= $deletesurveyoutput;} + if (isset($resetsurveylogicoutput)) {$adminoutput.= $resetsurveylogicoutput;} + if (isset($vvoutput)) {$adminoutput.= $vvoutput;} + if (isset($dumpdboutput)) {$adminoutput.= $dumpdboutput;} + + + if (!isset($printablesurveyoutput) && ($subaction!='export')) + { + if (!isset($_SESSION['metaHeader'])) {$_SESSION['metaHeader']='';} + + $adminoutput = getAdminHeader($_SESSION['metaHeader']).$adminoutput; // All future output is written into this and then outputted at the end of file + unset($_SESSION['metaHeader']); + $adminoutput.= "\t\t
\n"; + + $adminoutput .= "\n"; + + $adminoutput .= "" + . getAdminFooter("http://docs.limesurvey.org", $clang->gT("LimeSurvey Online Manual")); + } + +} + else + { //not logged in + sendcacheheaders(); + if (!isset($_SESSION['metaHeader'])) {$_SESSION['metaHeader']='';} + $adminoutput = getAdminHeader($_SESSION['metaHeader']).$adminoutput; // All future output is written into this and then outputted at the end of file + unset($_SESSION['metaHeader']); + $adminoutput.= "\t\t\n".helpscreen() + . "\t\n" + . "\n" + . getAdminFooter("http://docs.limesurvey.org", $clang->gT("LimeSurvey Online Manual")); + + } + +if (($action=='showphpinfo') && ($_SESSION['USER_RIGHT_CONFIGURATOR'] == 1)) +{ + phpinfo(); +} +else +{ + echo $adminoutput; +} + + + function helpscreenscript() + // returns the script part for online help to be included outside a table + { + $helpoutput= "\n"; + return $helpoutput; + } + + + function helpscreen() + // This functions loads the nescessary helpscreens for each action and hides the help window + // + { + global $homeurl, $langdir, $imagefiles; + global $surveyid, $gid, $qid, $action, $clang; + + $helpoutput="\t\t\n" + ."\t\t\t
" + ."\n" + ."\t\t\t\t\n" + ."\t\t\t\t\t\n" + ."\t\t\t\t\n" + ."\t\t\t\t\n" + ."\t\t\t\t\t\n" + ."\t\t\t\t\n" + ."\t\t\t\t\n" + ."\t\t\t\t\t" + ."\t\t\t\t\n" + ."\t\t\t
\n" + ."\t\t\t\t\t\t" + .$clang->gT("Help")."\n" + ."\t\t\t\t\t
\n" + ."\t\t\t\t\t\t\n" + ."\t\t\t\t\t\t\n" + ."\t\t\t\t\t
\n"; + //determine which help document to show + if (!$surveyid && $action != "editusers") + { + $helpdoc = "$langdir/admin.html"; + } + elseif (!$surveyid && $action=="editusers") + { + $helpdoc = "$langdir/users.html"; + } + elseif ($surveyid && !$gid) + { + $helpdoc = "$langdir/survey.html"; + } + elseif ($surveyid && $gid && !$qid) + { + $helpdoc = "$langdir/group.html"; + } + elseif ($surveyid && $gid && $qid && !returnglobal('viewanswer')) + { + $helpdoc = "$langdir/question.html"; + } + elseif ($surveyid && $gid && $qid && (returnglobal('viewanswer'))) + { + $helpdoc = "$langdir/answer.html"; + } + $helpoutput.= "\t\t\t\t\t\t\n" + ."\t\t\t\t\t
\n" + ."\t\t\n"; + return $helpoutput; + } + + + +function convertToArray($stringtoconvert, $seperator, $start, $end) +// this function is still used to read SQL files from version 1.0 or older +{ + $begin=strpos($stringtoconvert, $start)+strlen($start); + $len=strpos($stringtoconvert, $end)-$begin; + $stringtoconvert=substr($stringtoconvert, $begin, $len); + $stringtoconvert=str_replace('\n',"\n",$stringtoconvert); //removes masking + $stringtoconvert=stripslashes($stringtoconvert); + $resultarray=explode($seperator, $stringtoconvert); + return $resultarray; +} + +function get2post($url) +{ + $url = preg_replace('/&/i','&',$url); + list($calledscript,$query) = explode('?',$url); + $aqueryitems = explode('&',$query); + $arrayParam = Array(); + $arrayVal = Array(); + + foreach ($aqueryitems as $queryitem) + { + list($paramname, $value) = explode ('=', $queryitem); + //error_log("TIBO URL=$url Form Action=$calledscript, param=$paramname, value=$value"); + $arrayParam[] = "'".$paramname."'"; + $arrayVal[] = "'".$value."'"; + } +// $Paramlist = "[" . implode(",",$arrayParam) . "]"; +// $Valuelist = "[" . implode(",",$arrayVal) . "]"; + $Paramlist = "new Array(" . implode(",",$arrayParam) . ")"; + $Valuelist = "new Array(" . implode(",",$arrayVal) . ")"; + $callscript = "sendPost('$calledscript','".$_SESSION['checksessionpost']."',$Paramlist,$Valuelist);"; + //error_log("TIBO = $callscript"); + return $callscript; +} + +?> diff --git a/include/limesurvey/admin/assessments.php b/include/limesurvey/admin/assessments.php new file mode 100644 index 00000000..f0d0fa3c --- /dev/null +++ b/include/limesurvey/admin/assessments.php @@ -0,0 +1,223 @@ +Execute($actsurquery) or safe_die($connect->ErrorMsg()); +$actsurrows = $actsurresult->FetchRow(); + +if($_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || $actsurrows['edit_survey_property']){ + + if ($action == "assessmentadd") { + $inserttable=$dbprefix."assessments"; + $query = $connect->GetInsertSQL($inserttable, array( + 'sid' => $surveyid, + 'scope' => $_POST['scope'], + 'gid' => $_POST['gid'], + 'minimum' => $_POST['minimum'], + 'maximum' => $_POST['maximum'], + 'name' => $_POST['name'], + 'message' => $_POST['message'], + 'link' => $_POST['link'] )); + $result=$connect->Execute($query) or safe_die("Error inserting
$query
".$connect->ErrorMsg()); + } elseif ($action == "assessmentupdate") { + $query = "UPDATE {$dbprefix}assessments + SET scope='".db_quote($_POST['scope'])."', + gid=".sanitize_int($_POST['gid']).", + minimum='".sanitize_int($_POST['minimum'])."', + maximum='".sanitize_int($_POST['maximum'])."', + name='".db_quote($_POST['name'])."', + message='".db_quote($_POST['message'])."', + link='".db_quote($_POST['link'])."' + WHERE id=".sanitize_int($_POST['id']); + $result = $connect->Execute($query) or safe_die("Error updating
$query
".$connect->ErrorMsg()); + } elseif ($action == "assessmentdelete") { + $query = "DELETE FROM {$dbprefix}assessments + WHERE id=".sanitize_int($_POST['id']); + $result=$connect->Execute($query); + } + + $assessmentsoutput= "\n" + . "\t\n" + . "\t\t
\n" + . "\t\t\t\n" + . "\t\t\t\n" + . "\t\t\t\t\n"; + + $assessmentsoutput.= "\t\n" + . "\t\t\n" + . "\t\n"; + $assessmentsoutput.= ""; + + if ($surveyid == "") { + $assessmentsoutput.= $clang->gT("No SID Provided"); + exit; + } + + $assessments=getAssessments($surveyid); + //$assessmentsoutput.= "
";print_r($assessments);echo "
"; + $groups=getGroups($surveyid); + $groupselect="\n"; + $headings=array($clang->gT("Scope"), $clang->gT("Group"), $clang->gT("Minimum"), $clang->gT("Maximum"), $clang->gT("Heading"), $clang->gT("Message"), $clang->gT("URL")); + $inputs=array("", + $groupselect, + "", + "", + "", + "", + ""); + $actiontitle=$clang->gT("Add"); + $actionvalue="assessmentadd"; + $thisid=""; + + if ($action == "assessmentedit") { + $query = "SELECT * FROM {$dbprefix}assessments WHERE id=".sanitize_int($_POST['id']); + $results = db_execute_assoc($query); + while($row=$results->FetchRow()) { + $editdata=$row; + } + $scopeselect = ""; + $groupselect=str_replace("'".$editdata['gid']."'", "'".$editdata['gid']."' selected", $groupselect); + $inputs=array($scopeselect, + $groupselect, + "", + "", + "", + "", + ""); + $actiontitle=$clang->gT("Edit"); + $actionvalue="assessmentupdate"; + $thisid=$editdata['id']; + } + //$assessmentsoutput.= "
"; print_r($edits); $assessmentsoutput.= "
"; + //PRESENT THE PAGE + + $assessmentsoutput.= "
+ " + ."\n"; + foreach ($headings as $head) { + $assessmentsoutput.= "\n"; + } + $assessmentsoutput.= ""; + $assessmentsoutput.= "\n"; + $flipflop=true; + foreach($assessments as $assess) { + $flipflop=!$flipflop; + if ($flipflop==true){$assessmentsoutput.= "\n";} + else {$assessmentsoutput.= "\n";} + $assessmentsoutput.= "\n"; + $assessmentsoutput.= "\n"; + + if ($assess['scope'] == "T") { $assessmentsoutput.= "\n"; } + else {$assessmentsoutput.= "\n"; } + + $assessmentsoutput.= "\n"; + + $assessmentsoutput.= "\n"; + $assessmentsoutput.= "\n"; + $assessmentsoutput.= "\n"; + $assessmentsoutput.= "\n"; + $assessmentsoutput.= "\n"; + + $assessmentsoutput.= "\n"; + $assessmentsoutput.= "\n"; + } + $assessmentsoutput.= "
".$clang->gT("If you create any assessments in this page, for the currently selected survey, the assessment will be performed at the end of the survey after submission")."
IDSID$head".$clang->gT("Actions")."
".$assess['id']."".$assess['sid']."".$clang->gT("Total")."".$clang->gT("Group")."".$groups[$assess['gid']]['group_name']." (".$assess['gid'].")".$assess['minimum']."".$assess['maximum']."".stripslashes($assess['name'])."".stripslashes($assess['message'])."".stripslashes($assess['link'])." + + + + +
+ + + +
+ + + +
+
+
"; + $assessmentsoutput.= "
\n"; + $assessmentsoutput.= "\n"; + $i=0; + + foreach ($headings as $head) { + $assessmentsoutput.= "\n"; + $i++; + } + $assessmentsoutput.= "\n" + ."
$actiontitle
$head".$inputs[$i]."
\n"; + if ($action == "assessmentedit") $assessmentsoutput.= "    \n"; + $assessmentsoutput.= "\n" + ."\n" + ."\n" + ."
\n"; + } +else + { + $action = "assessment"; + include("access_denied.php"); + include("admin.php"); + } + +function getAssessments($surveyid) { + global $dbprefix, $connect; + $query = "SELECT id, sid, scope, gid, minimum, maximum, name, message, link + FROM ".db_table_name('assessments')." + WHERE sid='$surveyid' + ORDER BY scope, gid"; + $result=db_execute_assoc($query) or safe_die("Error getting assessments
$query
".$connect->ErrorMsg()); + $output=array(); + while($row=$result->FetchRow()) { + $output[]=$row; + } + return $output; +} + +function getGroups($surveyid) { + global $dbprefix, $connect; + $baselang = GetBaseLanguageFromSurveyID($surveyid); + $query = "SELECT gid, group_name + FROM ".db_table_name('groups')." + WHERE sid='$surveyid' and language='$baselang' + ORDER BY group_order"; + $result = db_execute_assoc($query) or safe_die("Error getting groups
$query
".$connect->ErrorMsg()); + $output=array(); + while($row=$result->FetchRow()) { + $output[$row['gid']]=$row; + } + return $output; +} +?> diff --git a/include/limesurvey/admin/browse.php b/include/limesurvey/admin/browse.php new file mode 100644 index 00000000..320d1092 --- /dev/null +++ b/include/limesurvey/admin/browse.php @@ -0,0 +1,728 @@ +MetaTables() or safe_die ("Error getting tokens
".$connect->ErrorMsg()); +foreach ($tablelist as $tbl) +{ + if (db_quote_id($tbl) == db_table_name('survey_'.$surveyid)) $resultsexist = 1; +} + +if (!isset($resultsexist)) die("Your results table is missing!"); + +$sumquery5 = "SELECT b.* FROM {$dbprefix}surveys AS a INNER JOIN {$dbprefix}surveys_rights AS b ON a.sid = b.sid WHERE a.sid=$surveyid AND b.uid = ".$_SESSION['loginID']; //Getting rights for this survey and user +$sumresult5 = db_execute_assoc($sumquery5); +$sumrows5 = $sumresult5->FetchRow(); + +require_once(dirname(__FILE__).'/sessioncontrol.php'); + +// Set language for questions and labels to base language of this survey + +if (isset($browselang) && $browselang!='') +{ + $_SESSION['browselang']=$browselang; + $language=$_SESSION['browselang']; +} +elseif (isset($_SESSION['browselang'])) +{ + $language=$_SESSION['browselang']; +} +else +{ + $language = GetBaseLanguageFromSurveyID($surveyid); +} + + +$surveyoptions = browsemenubar(); +$browseoutput = "
\n" +."\n"; + +if (!$database_exists) //DATABASE DOESN'T EXIST OR CAN'T CONNECT +{ + $browseoutput .= "\t\n" + ."\t\n" + ."\n"; + return; +} +if (!$surveyid && !$subaction) //NO SID OR ACTION PROVIDED +{ + $browseoutput .= "\t" + . $clang->gT("Browse Responses")."\n" + ."\t$setfont\n" + ."".$clang->gT("Error")."
\n" + . $clang->gT("You have not selected a survey to browse.")."

\n" + ."
\n" + ."\n"; + return; +} + +//CHECK IF SURVEY IS ACTIVATED AND EXISTS +$actquery = "SELECT * FROM ".db_table_name('surveys')." as a inner join ".db_table_name('surveys_languagesettings')." as b on (b.surveyls_survey_id=a.sid and b.surveyls_language=a.language) WHERE a.sid=$surveyid"; + +$actresult = db_execute_assoc($actquery); +$actcount = $actresult->RecordCount(); +if ($actcount > 0) +{ + while ($actrow = $actresult->FetchRow()) + { + $surveytable = db_table_name("survey_".$actrow['sid']); + $surveyname = "{$actrow['surveyls_title']}"; + if ($actrow['active'] == "N") //SURVEY IS NOT ACTIVE YET + { + $browseoutput .= "\t" + . $clang->gT("Browse Responses").": $surveyname\n" + ."\t\n" + ."".$clang->gT("Error")."
\n" + . $clang->gT("This survey has not been activated. There are no results to browse.")."

\n" + ."
\n" + ."\n" + ."\n"; + return; + } + } +} +else //SURVEY MATCHING $surveyid DOESN'T EXIST +{ + $browseoutput .= "\t" + . $clang->gT("Browse Responses")."\n" + ."\t\n" + ."".$clang->gT("Error")."
\n" + . $clang->gT("There is no matching survey.")." ($surveyid)

\n" + ."
\n" + ."\n" + ."\n"; + return; +} + +//OK. IF WE GOT THIS FAR, THEN THE SURVEY EXISTS AND IT IS ACTIVE, SO LETS GET TO WORK. +$qulanguage = GetBaseLanguageFromSurveyID($surveyid); +if ($subaction == "id") // Looking at a SINGLE entry +{ + //SHOW HEADER + $browseoutput .= "\t".$clang->gT("Browse Responses").": $surveyname\n"; + if (!isset($_POST['sql']) || !$_POST['sql']) {$browseoutput .= "$surveyoptions";} // Don't show options if coming from tokens script + $browseoutput .= "\n" + ."
\n"; + //FIRST LETS GET THE NAMES OF THE QUESTIONS AND MATCH THEM TO THE FIELD NAMES FOR THE DATABASE + $fnquery = "SELECT * FROM ".db_table_name("questions").", ".db_table_name("groups").", ".db_table_name("surveys")." + WHERE ".db_table_name("questions").".gid=".db_table_name("groups").".gid AND ".db_table_name("groups").".sid=".db_table_name("surveys").".sid + AND ".db_table_name("questions").".sid='$surveyid' AND + ".db_table_name("questions").".language='{$language}' AND ".db_table_name("groups").".language='{$language}' ORDER BY ".db_table_name("groups").".group_order, ".db_table_name("questions").".title"; + $fnresult = db_execute_assoc($fnquery); + $fncount = 0; + + $fnrows = array(); //Create an empty array in case fetch_array does not return any rows + while ($fnrow = $fnresult->FetchRow()) {++$fncount; $fnrows[] = $fnrow; $private = $fnrow['private']; $datestamp=$fnrow['datestamp']; $ipaddr=$fnrow['ipaddr']; $refurl=$fnrow['refurl'];} // Get table output into array + + // Perform a case insensitive natural sort on group name then question title of a multidimensional array + usort($fnrows, 'CompareGroupThenTitle'); + + $fnames[] = array("id", "id", "id"); + if ($private == "N") //add token to top ofl ist is survey is not private + { + $fnames[] = array("token", "token", $clang->gT("Token ID")); + } + + $fnames[] = array("completed", "Completed", $clang->gT("Completed"), "0"); + + if ($datestamp == "Y") //add datetime to list if survey is datestamped + { + // submitdate for not-datestamped surveys is always 1980/01/01 + // so only display it when datestamped + $fnames[] = array("startdate", "startdate", $clang->gT("Date Started")); + $fnames[] = array("datestamp", "datestamp", $clang->gT("Date Last Action")); + $fnames[] = array("submitdate", "submitdate", $clang->gT("Date Submitted")); + } + if ($ipaddr == "Y") //add ipaddr to list if survey should save submitters IP address + { + $fnames[] = array("ipaddr", "ipaddr", $clang->gT("IP Address")); + } + if ($refurl == "Y") //add refer_URL to list if survey should save referring URL + { + $fnames[] = array("refurl", "refurl", $clang->gT("Referring URL")); + } + foreach ($fnrows as $fnrow) + { + $field = "{$fnrow['sid']}X{$fnrow['gid']}X{$fnrow['qid']}"; + $ftitle = "Grp{$fnrow['gid']}Qst{$fnrow['title']}"; + $fquestion = $fnrow['question']; + if ($fnrow['type'] == "Q" || $fnrow['type'] == "M" || + $fnrow['type'] == "A" || $fnrow['type'] == "B" || + $fnrow['type'] == "C" || $fnrow['type'] == "E" || + $fnrow['type'] == "F" || $fnrow['type'] == "H" || + $fnrow['type'] == "J" || $fnrow['type'] == "K" || + $fnrow['type'] == "P" || $fnrow['type'] == "^") + { + $fnrquery = "SELECT * FROM ".db_table_name("answers")." WHERE qid={$fnrow['qid']} AND language='{$language}' ORDER BY sortorder, answer"; + $fnrresult = db_execute_assoc($fnrquery); + while ($fnrrow = $fnrresult->FetchRow()) + { + $fnames[] = array("$field{$fnrrow['code']}", "$ftitle ({$fnrrow['code']})", "{$fnrow['question']} ({$fnrrow['answer']})"); + if ($fnrow['type'] == "P") {$fnames[] = array("$field{$fnrrow['code']}"."comment", "$ftitle"."comment", "{$fnrow['question']} (".$clang->gT("Comment").")");} + } + if ($fnrow['other'] == "Y" and ($fnrow['type']=="!" or $fnrow['type']=="L" or $fnrow['type']=="M" or $fnrow['type']=="P" || $fnrow['type'] == "Z" || $fnrow['type'] == "W")) + { + $fnames[] = array("$field"."other", "$ftitle"."other", "{$fnrow['question']}(".$clang->gT("Other").")"); + } + } + elseif ($fnrow['type'] == "R") + { + $fnrquery = "SELECT * FROM ".db_table_name("answers")." WHERE qid={$fnrow['qid']} AND + language='{$language}' + ORDER BY sortorder, answer"; + $fnrresult = $connect->Execute($fnrquery); + $fnrcount = $fnrresult->RecordCount(); + for ($i=1; $i<=$fnrcount; $i++) + { + $fnames[] = array("$field$i", "$ftitle ($i)", "{$fnrow['question']} ($i)"); + } + } + elseif ($fnrow['type'] == "O") + { + $fnames[] = array("$field", "$ftitle", "{$fnrow['question']}"); + $field2 = $field."comment"; + $ftitle2 = $ftitle."[Comment]"; + $longtitle = "{$fnrow['question']}
[Comment]"; + $fnames[] = array("$field2", "$ftitle2", "$longtitle"); + } + elseif ($fnrow['type'] == "1") // multi scale + { + $i2query = "SELECT ".db_table_name("answers").".*, ".db_table_name("questions").".other FROM ".db_table_name("answers").", ".db_table_name("questions")." + WHERE ".db_table_name("answers").".qid=".db_table_name("questions").".qid AND + ".db_table_name("answers").".language='{$language}' AND ".db_table_name("questions").".language='{$language}' AND + ".db_table_name("questions").".qid={$fnrow['qid']} AND ".db_table_name("questions").".sid=$surveyid + ORDER BY ".db_table_name("answers").".sortorder, ".db_table_name("answers").".answer"; + $i2result = db_execute_assoc($i2query); + $otherexists = ""; + while ($i2row = $i2result->FetchRow()) + { + // first scale + $field = "{$fnrow['sid']}X{$fnrow['gid']}X{$fnrow['qid']}{$i2row['code']}#0"; + $ftitle = "Grp{$fnrow['gid']}Qst{$fnrow['title']}Opt{$i2row['code']}"; + if ($i2row['other'] == "Y") {$otherexists = "Y";} + $fnames[] = array("$field", "$ftitle", "{$fnrow['question']}
\n[{$i2row['answer']}]
[".$clang->gT("1. scale")."]", "{$fnrow['gid']}"); + // second scale + $field = "{$fnrow['sid']}X{$fnrow['gid']}X{$fnrow['qid']}{$i2row['code']}#1"; + $ftitle = "Grp{$fnrow['gid']}Qst{$fnrow['title']}Opt{$i2row['code']}"; + if ($i2row['other'] == "Y") {$otherexists = "Y";} + $fnames[] = array("$field", "$ftitle", "{$fnrow['question']}
\n[{$i2row['answer']}]
[".$clang->gT("2. scale")."]", "{$fnrow['gid']}"); + } + if ($otherexists == "Y") + { + $field = "{$fnrow['sid']}X{$fnrow['gid']}X{$fnrow['qid']}"."other"; + $ftitle = "Grp{$fnrow['gid']}Qst{$fnrow['title']}OptOther"; + $fnames[] = array("$field", "$ftitle", "{$fnrow['question']}
\n[Other]", "{$fnrow['gid']}"); + } + } + + else + { + $fnames[] = array("$field", "$ftitle", "{$fnrow['question']}"); + if (($fnrow['type'] == "L" || $fnrow['type'] == "!" || $fnrow['type'] == "W" || $fnrow['type'] == "Z") && $fnrow['other'] == "Y") + { + $fnames[] = array("$field"."other", "$ftitle"."other", "{$fnrow['question']}(".$clang->gT("Other").")"); + } + } + } + $nfncount = count($fnames)-1; + //SHOW INDIVIDUAL RECORD + $idquery = "SELECT *, CASE WHEN submitdate IS NULL THEN 'N' ELSE 'Y' END as completed FROM $surveytable WHERE "; + if (incompleteAnsFilterstate() === true) {$idquery .= "submitdate >= ".$connect->DBDate('1980-01-01'). " AND ";} + if ($id<1) {$id=1;} + if (isset($_POST['sql']) && $_POST['sql']) + { + if (get_magic_quotes_gpc()) {$idquery .= stripslashes($_POST['sql']);} + else {$idquery .= "{$_POST['sql']}";} + } + else {$idquery .= "id=$id";} + $idresult = db_execute_assoc($idquery) or safe_die ("Couldn't get entry
\n$idquery
\n".$connect->ErrorMsg()); + while ($idrow = $idresult->FetchRow()) {$id=$idrow['id']; $rlangauge=$idrow['startlanguage'];} + $next=$id+1; + $last=$id-1; + $browseoutput .= "\n" + ."\t\n" + ."\t\t\n" + ."\t\n" + ."\t\n" + ."\t\n"; + $idresult = db_execute_assoc($idquery) or safe_die ("Couldn't get entry
$idquery
".$connect->ErrorMsg()); + while ($idrow = $idresult->FetchRow()) + { + $i=0; + for ($i; $i<$nfncount+1; $i++) + { + $browseoutput .= "\t\n" + ."\t\t\n" + ."\t\t\n" + ."\t\n" + ."\t\n"; + } + } + $browseoutput .= "
" + . $clang->gT("View Response").": $id
\n" + ."\t\t\t\n" + ."\t\t\t\n"; + if (isset($rlangauge)) + { + $browseoutput .="\t\t\tgT("Edit this entry", "js")."')\">" . + "\n"; + } + if ($sumrows5['delete_survey']) + { +// $browseoutput .= "\t\t\tgT("Delete this entry", "js")."')\">" +// ."gT("Are you sure you want to delete this entry?","js")."')\" />\n"; + $browseoutput .= "\t\t\tgT("Delete this entry", "js")."')\">" + ."gT("Are you sure you want to delete this entry?","js")."')) {".get2post("$scriptname?action=dataentry&subaction=delete&id=$id&sid=$surveyid&surveytable=$surveytable")."}\" />\n"; + } + $browseoutput .= "\t\t\tgT("Export this Response", "js")."')\">" . + "". $clang->gT("Export this Response")."\n" + ."\t\t\t\n" + ."\t\t\t\n" + ."\t\t\tgT("Show previous...", "js")."')\">". + "\n" + ."\t\t\t\n" + ."\t\t\tgT("Show next...", "js")."')\">" . + "\n" + ."\t\t
" + ."$setfont{$fnames[$i][2]}$setfont" + .htmlspecialchars(getextendedanswer($fnames[$i][0], $idrow[$fnames[$i][0]]), ENT_QUOTES) + ."
\n" + ."\n" + ."\t\n" + ."\t\t\n" + ."\t\n" + ."
\n"; +// if (isset($_POST['sql']) && $_POST['sql']) {$browseoutput .= "\t\t\t\n";} + $browseoutput .= "\t\t
\n"; +} + +elseif ($subaction == "all") +{ + $browseoutput .= ("\t" + . $clang->gT("Browse Responses").": $surveyname\n"); + + if (!isset($_POST['sql'])) + {$browseoutput .= "$surveyoptions";} //don't show options when called from another script with a filter on + else + { + $browseoutput .= "\n\n" + ."\t\n" + ."\t\t\n" + ."\t\n" + ."
\n" + ."\t\t\t".$clang->gT("Showing Filtered Results")."
\n" + ."\t\t\t [".$clang->gT("Close")."]" + ."\t\t
\n"; + + } + $browseoutput .= "\n"; + //FIRST LETS GET THE NAMES OF THE QUESTIONS AND MATCH THEM TO THE FIELD NAMES FOR THE DATABASE + $fnquery = "SELECT * FROM ".db_table_name("questions").", ".db_table_name("groups").", + ".db_table_name("surveys")." WHERE ".db_table_name("questions").".gid=".db_table_name("groups").".gid AND + ".db_table_name("questions").".language='{$language}' AND ".db_table_name("groups").".language='{$language}' AND + ".db_table_name("groups").".sid=".db_table_name("surveys").".sid AND ".db_table_name("questions").".sid='$surveyid' ORDER BY ".db_table_name("groups").".group_order"; + $fnresult = db_execute_assoc($fnquery); + $fncount = 0; + $fnrows = array(); //Create an empty array in case FetchRow does not return any rows + while ($fnrow = $fnresult->FetchRow()) + { + ++$fncount; + $fnrows[] = $fnrow; + $private = $fnrow['private']; + $datestamp=$fnrow['datestamp']; + $ipaddr=$fnrow['ipaddr']; + $refurl=$fnrow['refurl']; + } // Get table output into array + + // Perform a case insensitive natural sort on group name then question title of a multidimensional array + usort($fnrows, 'CompareGroupThenTitle'); + + if ($private == "N") //Add token to list + { + $fnames[] = array("token", $clang->gT("Token"), $clang->gT("Token ID"), "0"); + } + + $fnames[] = array("completed", "Completed", $clang->gT("Completed"), "0"); + + if ($datestamp == "Y") //Add datestamp + { + // submitdate for not-datestamped surveys is always 1980/01/01 + // so only display it when datestamped + $fnames[] = array("startdate", "startdate", $clang->gT("Date Started"), "0"); + $fnames[] = array("datestamp", "Datestamp", $clang->gT("Date Last Action"), "0"); + $fnames[] = array("submitdate", "submitdate", $clang->gT("Date Submitted"), "0"); + + + } + if ($ipaddr == "Y") // Add IP Address + { + $fnames[] = array("ipaddr", "IPAddress", $clang->gT("IP Address"), "0"); + } + if ($refurl == "Y") // refurl + { + $fnames[] = array("refurl", "refurl", $clang->gT("Referring URL"), "0"); + } + foreach ($fnrows as $fnrow) + { + if ($fnrow['type'] != "Q" && $fnrow['type'] != "M" && $fnrow['type'] != "A" && + $fnrow['type'] != "B" && $fnrow['type'] != "C" && $fnrow['type'] != "E" && + $fnrow['type'] != "F" && $fnrow['type'] != "H" && $fnrow['type'] != "P" && + $fnrow['type'] != "J" && $fnrow['type'] != "K" && $fnrow['type'] != "1" && + $fnrow['type'] != "O" && $fnrow['type'] != "R" && $fnrow['type'] != "^") + { + $field = "{$fnrow['sid']}X{$fnrow['gid']}X{$fnrow['qid']}"; + $ftitle = "Grp{$fnrow['gid']}Qst{$fnrow['title']}"; + $fquestion = $fnrow['question']; + $fnames[] = array("$field", "$ftitle", "$fquestion", "{$fnrow['gid']}"); + if (($fnrow['type'] == "L" || $fnrow['type'] == "!" || $fnrow['type'] == "W" || $fnrow['type'] == "Z") && $fnrow['other'] == "Y") + { + $fnames[] = array("$field"."other", "$ftitle"."other", "{$fnrow['question']}(".$clang->gT("Other").")", "{$fnrow['gid']}"); + } + + } + elseif ($fnrow['type'] == "O") + { + $field = "{$fnrow['sid']}X{$fnrow['gid']}X{$fnrow['qid']}"; + $ftitle = "Grp{$fnrow['gid']}Qst{$fnrow['title']}"; + $fquestion = $fnrow['question']; + $fnames[] = array("$field", "$ftitle", "$fquestion", "{$fnrow['gid']}"); + $field .= "comment"; + $ftitle .= "[comment]"; + $fquestion .= " (comment)"; + $fnames[] = array("$field", "$ftitle", "$fquestion", "{$fnrow['gid']}"); + } + elseif ($fnrow['type'] == "1") // multi scale + { + $i2query = "SELECT ".db_table_name("answers").".*, ".db_table_name("questions").".other FROM ".db_table_name("answers").", ".db_table_name("questions")." + WHERE ".db_table_name("answers").".qid=".db_table_name("questions").".qid AND + ".db_table_name("answers").".language='{$language}' AND ".db_table_name("questions").".language='{$language}' AND + ".db_table_name("questions").".qid={$fnrow['qid']} AND ".db_table_name("questions").".sid=$surveyid + ORDER BY ".db_table_name("answers").".sortorder, ".db_table_name("answers").".answer"; + $i2result = db_execute_assoc($i2query); + $otherexists = ""; + while ($i2row = $i2result->FetchRow()) + { + // first scale + $field = "{$fnrow['sid']}X{$fnrow['gid']}X{$fnrow['qid']}{$i2row['code']}#0"; + $ftitle = "Grp{$fnrow['gid']}Qst{$fnrow['title']}Opt{$i2row['code']}"; + if ($i2row['other'] == "Y") {$otherexists = "Y";} + $fnames[] = array("$field", "$ftitle", "{$fnrow['question']}
\n[{$i2row['answer']}]
[".$clang->gT("1. scale")."]", "{$fnrow['gid']}"); + // second scale + $field = "{$fnrow['sid']}X{$fnrow['gid']}X{$fnrow['qid']}{$i2row['code']}#1"; + $ftitle = "Grp{$fnrow['gid']}Qst{$fnrow['title']}Opt{$i2row['code']}"; + if ($i2row['other'] == "Y") {$otherexists = "Y";} + $fnames[] = array("$field", "$ftitle", "{$fnrow['question']}
\n[{$i2row['answer']}]
[".$clang->gT("2. scale")."]", "{$fnrow['gid']}"); + } + if ($otherexists == "Y") + { + $field = "{$fnrow['sid']}X{$fnrow['gid']}X{$fnrow['qid']}"."other"; + $ftitle = "Grp{$fnrow['gid']}Qst{$fnrow['title']}OptOther"; + $fnames[] = array("$field", "$ftitle", "{$fnrow['question']}
\n[Other]", "{$fnrow['gid']}"); + if ($fnrow['type'] == "P") + { + $fnames[] = array("$field"."comment", "$ftitle"."Comment", "{$fnrow['question']}
\n[Other]
\n[Comment]", "{$fnrow['gid']}"); + } + } + } + elseif ($fnrow['type'] == "R") + { + $i2query = "SELECT ".db_table_name("answers").".*, ".db_table_name("questions").".other FROM + ".db_table_name("answers").", ".db_table_name("questions")." + WHERE ".db_table_name("answers").".qid=".db_table_name("questions").".qid AND + ".db_table_name("answers").".language='{$language}' AND ".db_table_name("questions").".language='{$language}' + AND ".db_table_name("questions").".qid={$fnrow['qid']} AND ".db_table_name("questions").".sid=$surveyid + ORDER BY ".db_table_name("answers").".sortorder, ".db_table_name("answers").".answer"; + $i2result = $connect->Execute($i2query); + $i2count = $i2result->RecordCount(); + for ($i=1; $i<=$i2count; $i++) + { + $field = "{$fnrow['sid']}X{$fnrow['gid']}X{$fnrow['qid']}$i"; + $ftitle = "Grp{$fnrow['qid']}Qst{$fnrow['title']}Opt$i"; + $fnames[] = array("$field", "$ftitle", "{$fnrow['question']}
\n[$i]", "{$fnrow['gid']}"); + } + } + else + { + $i2query = "SELECT ".db_table_name("answers").".*, ".db_table_name("questions").".other FROM ".db_table_name("answers").", ".db_table_name("questions")." + WHERE ".db_table_name("answers").".qid=".db_table_name("questions").".qid AND + ".db_table_name("answers").".language='{$language}' AND ".db_table_name("questions").".language='{$language}' AND + ".db_table_name("questions").".qid={$fnrow['qid']} AND ".db_table_name("questions").".sid=$surveyid + ORDER BY ".db_table_name("answers").".sortorder, ".db_table_name("answers").".answer"; + $i2result = db_execute_assoc($i2query); + $otherexists = ""; + while ($i2row = $i2result->FetchRow()) + { + $field = "{$fnrow['sid']}X{$fnrow['gid']}X{$fnrow['qid']}{$i2row['code']}"; + $ftitle = "Grp{$fnrow['gid']}Qst{$fnrow['title']}Opt{$i2row['code']}"; + if ($i2row['other'] == "Y") {$otherexists = "Y";} + $fnames[] = array("$field", "$ftitle", "{$fnrow['question']}
\n[{$i2row['answer']}]", "{$fnrow['gid']}"); + if ($fnrow['type'] == "P") {$fnames[] = array("$field"."comment", "$ftitle", "{$fnrow['question']}
\n[{$i2row['answer']}]
\n[Comment]", "{$fnrow['gid']}");} + } + if ($otherexists == "Y") + { + $field = "{$fnrow['sid']}X{$fnrow['gid']}X{$fnrow['qid']}"."other"; + $ftitle = "Grp{$fnrow['gid']}Qst{$fnrow['title']}OptOther"; + $fnames[] = array("$field", "$ftitle", "{$fnrow['question']}
\n[Other]", "{$fnrow['gid']}"); + if ($fnrow['type'] == "P") + { + $fnames[] = array("$field"."comment", "$ftitle"."Comment", "{$fnrow['question']}
\n[Other]
\n[Comment]", "{$fnrow['gid']}"); + } + } + } + } + $fncount = count($fnames); + + //NOW LETS CREATE A TABLE WITH THOSE HEADINGS + if ($fncount < 10) {$cellwidth = "10%";} else {$cellwidth = "100";} + $tableheader = ""; + if ($fncount < 10) {$tableheader .= "\n";} + else {$fnwidth = (($fncount-1)*180); $tableheader .= "\n";} + $tableheader .= "\t\n" + . "\t\t\n"; + foreach ($fnames as $fn) + { + if (!isset($currentgroup)) {$currentgroup = $fn[3]; $gbc = "oddrow";} + if ($currentgroup != $fn[3]) + { + $currentgroup = $fn[3]; + if ($gbc == "oddrow") {$gbc = "evenrow";} + else {$gbc = "oddrow";} + } + $tableheader .= "\t\t\n"; + } + $tableheader .= "\t\n\n"; + + $start=returnglobal('start'); + $limit=returnglobal('limit'); + if (!isset($limit) || $limit== '') {$limit = 50;} + if (!isset($start) || $start =='') {$start = 0;} + + //LETS COUNT THE DATA + $dtquery = "SELECT count(*) FROM $surveytable"; + if (incompleteAnsFilterstate() === true) {$dtquery .= " WHERE submitdate is not null ";} + $dtresult=db_execute_num($dtquery); + while ($dtrow=$dtresult->FetchRow()) {$dtcount=$dtrow[0];} + + if ($limit > $dtcount) {$limit=$dtcount;} + + //NOW LETS SHOW THE DATA + if (isset($_POST['sql'])) + { + if ($_POST['sql'] == "NULL") + { + $dtquery = "SELECT *, CASE WHEN submitdate IS NULL THEN 'N' ELSE 'Y' END as completed FROM $surveytable "; + if (incompleteAnsFilterstate() === true) {$dtquery .= " WHERE submitdate is not null ";} + $dtquery .= " ORDER BY id"; + } + else + { + $dtquery = "SELECT *, CASE WHEN submitdate IS NULL THEN 'N' ELSE 'Y' END as completed FROM $surveytable WHERE "; + if (incompleteAnsFilterstate() === true) { + $dtquery .= " submitdate is not null "; + if (stripcslashes($_POST['sql']) !== "") { $dtquery .= " AND "; } + } + if (stripcslashes($_POST['sql']) !== "") { $dtquery .= stripcslashes($_POST['sql'])." "; } + $dtquery .= " ORDER BY id"; + } + } + else + { + $dtquery = "SELECT *, CASE WHEN submitdate IS NULL THEN 'N' ELSE 'Y' END as completed FROM $surveytable "; + if (incompleteAnsFilterstate() === true) {$dtquery .= " WHERE submitdate is not null ";} + $dtquery .= " ORDER BY id"; + } + if ($order == "desc") {$dtquery .= " DESC";} + + if (isset($limit)) + { + if (!isset($start)) {$start = 0;} + $dtresult = db_select_limit_assoc($dtquery, $limit, $start) or safe_die("Couldn't get surveys
$dtquery
".$connect->ErrorMsg()); + } + else + { + $dtresult = db_execute_assoc($dtquery) or safe_die("Couldn't get surveys
$dtquery
".$connect->ErrorMsg()); + } + $dtcount2 = $dtresult->RecordCount(); + $cells = $fncount+1; + + + //CONTROL MENUBAR + $last=$start-$limit; + $next=$start+$limit; + $end=$dtcount-$limit; + if ($end < 0) {$end=0;} + if ($last <0) {$last=0;} + if ($next >= $dtcount) {$next=$dtcount-$limit;} + if ($end < 0) {$end=0;} + + $browseoutput .= "
id" + . strip_tags("$fn[2]") + . "
\n" + ."\n" + ."\t\n"; + if (!isset($_POST['sql'])) + { + $browseoutput .= "\t\n" + ."\t\t\n" + ."\t\n" + ."\n" + ."
\n"; + + $browseoutput .= $tableheader; + + while ($dtrow = $dtresult->FetchRow()) + { + if (!isset($bgcc)) {$bgcc="evenrow";} + else + { + if ($bgcc == "evenrow") {$bgcc = "oddrow";} + else {$bgcc = "evenrow";} + } + $browseoutput .= "\t\n" + ."\t\t\n" + ."\t\t\t" + ."{$dtrow['id']}\n"; + + $i = 0; + if ($private == "N") + { + $SQL = "Select * FROM ".db_table_name('tokens_'.$surveyid)." WHERE token=?"; + if ( db_tables_exist(db_table_name_nq('tokens_'.$surveyid)) && + $SQLResult = db_execute_assoc($SQL, $dtrow['token'])) + { + $TokenRow = $SQLResult->FetchRow(); + } + $browseoutput .= "\t\t\n"; + if (isset($TokenRow) && $TokenRow) + { + $browseoutput .= "\t\t"; + } + $browseoutput .= "{$dtrow['token']}"; + if (isset($TokenRow) && $TokenRow) + { + $browseoutput .= "\n"; + } + $i++; + } + + for ($i; $i<$fncount; $i++) + { + $browseoutput .= "\t\t" + . htmlspecialchars($dtrow[$fnames[$i][0]]) + ."\n"; + } + $browseoutput .= "\t\n"; + } + $browseoutput .= "\n
\n"; +} +else +{ + $browseoutput .= "\t" + . $clang->gT("Browse Responses").": $surveyname\n" + . $surveyoptions; + $browseoutput .= "\n"; + $num_total_answers=0; + $num_completed_answers=0; + $gnquery = "SELECT count(id) FROM $surveytable"; + $gnquery2 = "SELECT count(id) FROM $surveytable WHERE submitdate is not null"; + $gnresult = db_execute_num($gnquery); + $gnresult2 = db_execute_num($gnquery2); + + while ($gnrow=$gnresult->FetchRow()) {$num_total_answers=$gnrow[0];} + while ($gnrow2=$gnresult2->FetchRow()) {$num_completed_answers=$gnrow2[0];} + $browseoutput .= "\n" + ."\t\n" + ."
".sprintf($clang->gT("%d responses for this survey"), $num_total_answers)." (" + .sprintf($clang->gT("%d full responses"), $num_completed_answers).", " + .sprintf($clang->gT("%d responses not completely filled out"), $num_total_answers-$num_completed_answers).")" + ."\t
\n"; + +} + +?> diff --git a/include/limesurvey/admin/classes/core/class.progressbar.php b/include/limesurvey/admin/classes/core/class.progressbar.php new file mode 100644 index 00000000..48273ba8 --- /dev/null +++ b/include/limesurvey/admin/classes/core/class.progressbar.php @@ -0,0 +1,529 @@ + false); // ProgressBar Frame + /* 'show' => false, # frame show (true/false) + 'left' => 200, # frame position from left + 'top' => 100, # frame position from top + 'width' => 300, # frame width + 'height' => 75, # frame height + 'color' => '#c0c0c0', # frame color + 'border' => 2, # frame border + 'brd_color' => '#dfdfdf #404040 #404040 #dfdfdf' # frame border color + */ + + var $label = array(); // ProgressBar Labels + /* 'name' => array( # label name + 'type' => 'text', # label type (text,button,step,percent,crossbar) + 'value' => 'Please wait ...', # label value + 'left' => 10, # label position from left + 'top' => 20, # label position from top + 'width' => 0, # label width + 'height' => 0, # label height + 'align' => 'left', # label align + 'font-size' => 11, # label font size + 'font-family' => 'Verdana, Tahoma, Arial', # label font family + 'font-weight' => '', # label font weight + 'color' => '#000000', # label font color + 'bgr_color' => '' # label background color + ) + */ + + // constructor + + function ProgressBar($width=0,$height=0) + { + $this->code = substr(md5(microtime()), 0, 6); + if ($width>0) {$this->width = $width;} + if ($height>0) {$this->height = $height;} + } + + // private functions + + function _calculatePercent($step) + { + $percent = round(($step - $this->min) / ($this->max - $this->min) * 100); + if ($percent > 100) {$percent = 100;} + return $percent; + } + + function _calculatePosition($step) + { + switch ($this->direction) { + case 'right': + case 'left': + $bar = $this->width; + break; + case 'down': + case 'up': + $bar = $this->height; + break; + } + + $pixel = round(($step - $this->min) * ($bar - ($this->pedding * 2)) / ($this->max - $this->min)); + if ($step <= $this->min) {$pixel = 0;} + if ($step >= $this->max) {$pixel = $bar - ($this->pedding * 2);} + + switch ($this->direction) { + case 'right': + $position['left'] = $this->pedding; + $position['top'] = $this->pedding; + $position['width'] = $pixel; + $position['height'] = $this->height - ($this->pedding * 2); + break; + case 'left': + $position['left'] = $this->width - $this->pedding - $pixel; + $position['top'] = $this->pedding; + $position['width'] = $pixel; + $position['height'] = $this->height - ($this->pedding * 2); + break; + case 'down': + $position['left'] = $this->pedding; + $position['top'] = $this->pedding; + $position['width'] = $this->width - ($this->pedding * 2); + $position['height'] = $pixel; + break; + case 'up': + $position['left'] = $this->pedding; + $position['top'] = $this->height - $this->pedding - $pixel; + $position['width'] = $this->width - ($this->pedding * 2); + $position['height'] = $pixel; + break; + } + return $position; + } + + function _setStep($step) + { + if ($step > $this->max) {$step = $this->max;} + if ($step < $this->min) {$step = $this->min;} + $this->step = $step; + } + + // public functions + + function setFrame($width=0,$height=0) + { + $this->frame = array( + 'show' => true, + 'left' => 20, + 'top' => 35, + 'width' => 320, + 'height' => 90, + 'color' => '#c0c0c0', + 'border' => 2, + 'brd_color' => '#dfdfdf #404040 #404040 #dfdfdf' + ); + + if ($width>0) {$this->frame['width'] = $width;} + if ($height>0) {$this->frame['height'] = $height;} + } + + function addLabel($type,$name,$value=' ') + { + switch($type) { + case 'text': + $this->label[$name] = array( + 'type' => 'text', + 'value' => $value, + 'left' => $this->left, + 'top' => $this->top - 16, + 'width' => 0, + 'height' => 0, + 'align' => 'left', + 'font-size' => 11, + 'font-family' => 'Verdana, Tahoma, Arial', + 'font-weight' => 'normal', + 'color' => '#000000', + 'bgr_color' => '' + ); + break; + case 'button': + $this->label[$name] = array( + 'type' => 'button', + 'value' => $value, + 'action' => '', + 'target' => 'self', + 'left' => $this->left, + 'top' => $this->top + $this->height + 10, + 'width' => 0, + 'height' => 0, + 'align' => 'center', + 'font-size' => 11, + 'font-family' => 'Verdana, Tahoma, Arial', + 'font-weight' => 'normal', + 'color' => '#000000', + 'bgr_color' => '' + ); + break; + case 'step': + $this->label[$name] = array( + 'type' => 'step', + 'value' => $value, + 'left' => $this->left + 5, + 'top' => $this->top + 5, + 'width' => 10, + 'height' => 0, + 'align' => 'right', + 'font-size' => 11, + 'font-family' => 'Verdana, Tahoma, Arial', + 'font-weight' => 'normal', + 'color' => '#000000', + 'bgr_color' => '' + ); + break; + case 'percent': + $this->label[$name] = array( + 'type' => 'percent', + 'value' => $value, + 'left' => $this->left + $this->width - 50, + 'top' => $this->top - 16, + 'width' => 50, + 'height' => 0, + 'align' => 'right', + 'font-size' => 11, + 'font-family' => 'Verdana, Tahoma, Arial', + 'font-weight' => 'normal', + 'color' => '#000000', + 'bgr_color' => '' + ); + break; + case 'crossbar': + $this->label[$name] = array( + 'type' => 'crossbar', + 'value' => $value, + 'left' => $this->left + ($this->width / 2), + 'top' => $this->top - 16, + 'width' => 10, + 'height' => 0, + 'align' => 'center', + 'font-size' => 11, + 'font-family' => 'Verdana, Tahoma, Arial', + 'font-weight' => 'normal', + 'color' => '#000000', + 'bgr_color' => '' + ); + break; + } + } + + function addButton($name,$value,$action,$target='self') + { + $this->addLabel('button',$name,$value); + $this->label[$name]['action'] = $action; + $this->label[$name]['target'] = $target; + } + + function setLabelPosition($name,$left,$top,$width,$height,$align='') + { + $this->label[$name]['top'] = intval($top); + $this->label[$name]['left'] = intval($left); + $this->label[$name]['width'] = intval($width); + $this->label[$name]['height'] = intval($height); + if ($align!='') {$this->label[$name]['align'] = $align;} + + if ($this->status!='new') { + echo ''."\n"; + flush(); + } + } + + function setLabelColor($name,$color) + { + $this->label[$name]['color'] = $color; + if ($this->status!='new') { + echo ''."\n"; + flush(); + } + } + + function setLabelBackground($name,$color) + { + $this->label[$name]['bgr_color'] = $color; + if ($this->status!='new') { + echo ''."\n"; + flush(); + } + } + + function setLabelFont($name,$size,$family='',$weight='') + { + $this->label[$name]['font-size'] = intval($size); + if ($family!='') {$this->label[$name]['font-family'] = $family;} + if ($weight!='') {$this->label[$name]['font-weight'] = $weight;} + + if ($this->status!='new') { + echo ''."\n"; + flush(); + } + } + + function setLabelValue($name,$value) + { + $this->label[$name]['value'] = $value; + if ($this->status!='new') { + echo ''."\n"; + flush(); + } + } + + function setBarColor($color) + { + $this->color = $color; + if ($this->status!='new') { + echo ''."\n"; + flush(); + } + } + + function setBarBackground($color) + { + $this->bgr_color = $color; + if ($this->status!='new') { + echo ''."\n"; + flush(); + } + } + + function setBarDirection($direction) + { + $this->direction = $direction; + + if ($this->status!='new') { + $this->position = $this->_calculatePosition($this->step); + + echo ''."\n"; + flush(); + } + } + + function getHtml() + { + $html = ''; + $js = ''; + + $this->_setStep($this->step); + $this->position = $this->_calculatePosition($this->step); + + $style_brd = 'position:absolute;top:'.$this->top.'px;left:'.$this->left.'px;width:'.$this->width.'px;height:'.$this->height.'px;background:'.$this->bgr_color.';'; + if ($this->border>0) {$style_brd .= 'border:'.$this->border.'px solid;border-color:'.$this->brd_color.';';} + + $style_bar = 'position:absolute;top:'.$this->position['top'].'px;left:'.$this->position['left'].'px;'.'width:'.$this->position['width'].'px;height:'.$this->position['height'].'px;background:'.$this->color.';'; + + if ($this->frame['show']==true) { + if ($this->frame['border']>0) {$border = 'border:'.$this->frame['border'].'px solid;border-color:'.$this->frame['brd_color'].';';} + $html = '
'."\n"; + } + + $html .= '
'."\n"; + $html .= '
'."\n"; + + $js .= 'function PBposition'.$this->code.'(item,pixel) {'."\n"; + $js .= ' pixel = parseInt(pixel);'."\n"; + $js .= ' switch(item) {'."\n"; + $js .= ' case "left": document.getElementById("pbar'.$this->code.'").style.left=(pixel) + \'px\'; break;'."\n"; + $js .= ' case "top": document.getElementById("pbar'.$this->code.'").style.top=(pixel) + \'px\'; break;'."\n"; + $js .= ' case "width": document.getElementById("pbar'.$this->code.'").style.width=(pixel) + \'px\'; break;'."\n"; + $js .= ' case "height": document.getElementById("pbar'.$this->code.'").style.height=(pixel) + \'px\'; break;'."\n"; + $js .= ' }'."\n"; + $js .= '}'."\n"; + + foreach($this->label as $name => $data) { + $style_lbl = 'position:absolute;top:'.$data['top'].'px;left:'.$data['left'].'px;text-align:'.$data['align'].';'; + if ($data['width']>0) {$style_lbl .= 'width:'.$data['width'].'px;';} + if ($data['height']>0) {$style_lbl .= 'height:'.$data['height'].'px;';} + + if (array_key_exists('font-size', $data)) {$style_lbl .= 'font-size:'.$data['font-size'].'px;';} + if (array_key_exists('font-family', $data)) {$style_lbl .= 'font-family:'.$data['font-family'].';';} + if (array_key_exists('font-weight', $data)) {$style_lbl .= 'font-weight:'.$data['font-weight'].';';} + if (array_key_exists('bgr_color', $data) && ($data['bgr_color']!='')) {$style_lbl .= 'background:'.$data['bgr_color'].';';} + + if (array_key_exists('type', $data)) { + switch ($data['type']) { + case 'text': + $html .= '
'.$data['value'].'
'."\n"; + break; + case 'button': + $html .= '
'."\n"; + break; + case 'step': + $html .= '
'.$this->step.'
'."\n"; + break; + case 'percent': + $html .= '
'.$this->_calculatePercent($this->step).'%
'."\n"; + break; + case 'crossbar': + $html .= '
'.$data['value'].'
'."\n"; + + $js .= 'function PBrotaryCross'.$name.$this->code.'() {'."\n"; + $js .= ' cross = document.getElementById("plbl'.$name.$this->code.'").firstChild.nodeValue;'."\n"; + $js .= ' switch(cross) {'."\n"; + $js .= ' case "--": cross = "\\\\"; break;'."\n"; + $js .= ' case "\\\\": cross = "|"; break;'."\n"; + $js .= ' case "|": cross = "/"; break;'."\n"; + $js .= ' default: cross = "--"; break;'."\n"; + $js .= ' }'."\n"; + $js .= ' document.getElementById("plbl'.$name.$this->code.'").firstChild.nodeValue = cross;'."\n"; + $js .= '}'."\n"; + break; + } + } + } + + if(count($this->label)>0) { + + $js .= 'function PBlabelText'.$this->code.'(name,text) {'."\n"; + $js .= ' name = "plbl" + name + "'.$this->code.'";'."\n"; + $js .= ' document.getElementById(name).firstChild.nodeValue=text;'."\n"; + $js .= '}'."\n"; + } + + if ($this->frame['show']==true) { + $html .= '
'."\n"; + } + + $html .= ''."\n"; + + return $html; + } + + function show() + { + $this->status = 'show'; + echo $this->getHtml(); + flush(); + } + + function moveStep($step) + { + $last_step = $this->step; + $this->_setStep($step); + + $js = ''; + + $new_position = $this->_calculatePosition($this->step); + if ($new_position['width']!=$this->position['width'] && ($this->direction=='right' || $this->direction=='left')) { + if ($this->direction=='left') { + $js .= 'PBposition'.$this->code.'("left",'.$new_position['left'].');'; + } + $js .= 'PBposition'.$this->code.'("width",'.$new_position['width'].');'; + } + if ($new_position['height']!=$this->position['height'] && ($this->direction=='up' || $this->direction=='down')) { + if ($this->direction=='up') { + $js .= 'PBposition'.$this->code.'("top",'.$new_position['top'].');'; + } + $js .= 'PBposition'.$this->code.'("height",'.$new_position['height'].');'; + } + $this->position = $new_position; + + foreach($this->label as $name => $data) { + if (array_key_exists('type', $data)) { + switch($data['type']) { + case 'step': + if ($this->step!=$last_step) { + $js .= 'PBlabelText'.$this->code.'("'.$name.'","'.$this->step.'/'.$this->max.'");'; + } + break; + case 'percent': + $percent = $this->_calculatePercent($this->step); + if ($percent!=$this->_calculatePercent($last_step)) { + $js .= 'PBlabelText'.$this->code.'("'.$name.'","'.$percent.'%");'; + } + break; + case 'crossbar': + $js .= 'PBrotaryCross'.$name.$this->code.'();'; + break; + } + } + } + if ($js!='') { + echo ''."\n"; + flush (); + } + } + + function moveNext() + { + $this->moveStep($this->step + 1); + } + + function moveMin() + { + $this->moveStep($this->min); + } + + function hide() + { + if ($this->status=='show') { + $this->status = 'hide'; + + echo ''."\n"; + flush(); + } + } + + function unhide() + { + if ($this->status=='hide') { + $this->status = 'show'; + + echo ''."\n"; + flush(); + } + } + +} +?> diff --git a/include/limesurvey/admin/classes/core/domxml-php4-to-php5.php b/include/limesurvey/admin/classes/core/domxml-php4-to-php5.php new file mode 100644 index 00000000..cf2147ab --- /dev/null +++ b/include/limesurvey/admin/classes/core/domxml-php4-to-php5.php @@ -0,0 +1,483 @@ +=5.1 for XPath evaluation functions, and PHP>=5.1/libxml for DOMXML error reports) + + Typical use: + { + if (version_compare(PHP_VERSION,'5','>=')) + require_once('domxml-php4-to-php5.php'); + } + + Version 1.19, 2007-09-30, http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/ + + ------------------------------------------------------------------ + Written by Alexandre Alapetite, http://alexandre.alapetite.net/cv/ + + Copyright 2004-2007, Licence: Creative Commons "Attribution-ShareAlike 2.0 France" BY-SA (FR), + http://creativecommons.org/licenses/by-sa/2.0/fr/ + http://alexandre.alapetite.net/divers/apropos/#by-sa + - Attribution. You must give the original author credit + - Share Alike. If you alter, transform, or build upon this work, + you may distribute the resulting work only under a license identical to this one + (Can be included in GPL/LGPL projects) + - The French law is authoritative + - Any of these conditions can be waived if you get permission from Alexandre Alapetite + - Please send to Alexandre Alapetite the modifications you make, + in order to improve this file for the benefit of everybody + + If you want to distribute this code, please do it as a link to: + http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/ +*/ + +define('DOMXML_LOAD_PARSING',0); +define('DOMXML_LOAD_VALIDATING',1); +define('DOMXML_LOAD_RECOVERING',2); +define('DOMXML_LOAD_SUBSTITUTE_ENTITIES',4); +//define('DOMXML_LOAD_COMPLETE_ATTRS',8); +define('DOMXML_LOAD_DONT_KEEP_BLANKS',16); + +function domxml_new_doc($version) {return new php4DOMDocument();} +function domxml_new_xmldoc($version) {return new php4DOMDocument();} +function domxml_open_file($filename,$mode=DOMXML_LOAD_PARSING,&$error=null) +{ + $dom=new php4DOMDocument($mode); + $errorMode=(func_num_args()>2)&&defined('LIBXML_VERSION'); + if ($errorMode) libxml_use_internal_errors(true); + if (!$dom->myDOMNode->load($filename)) $dom=null; + if ($errorMode) + { + $error=array_map('_error_report',libxml_get_errors()); + libxml_clear_errors(); + } + return $dom; +} +function domxml_open_mem($str,$mode=DOMXML_LOAD_PARSING,&$error=null) +{ + $dom=new php4DOMDocument($mode); + $errorMode=(func_num_args()>2)&&defined('LIBXML_VERSION'); + if ($errorMode) libxml_use_internal_errors(true); + if (!$dom->myDOMNode->loadXML($str)) $dom=null; + if ($errorMode) + { + $error=array_map('_error_report',libxml_get_errors()); + libxml_clear_errors(); + } + return $dom; +} +function html_doc($html_doc,$from_file=false) +{ + $dom=new php4DOMDocument(); + if ($from_file) $result=$dom->myDOMNode->loadHTMLFile($html_doc); + else $result=$dom->myDOMNode->loadHTML($html_doc); + return $result ? $dom : null; +} +function html_doc_file($filename) {return html_doc($filename,true);} +function xmldoc($str) {return domxml_open_mem($str);} +function xmldocfile($filename) {return domxml_open_file($filename);} +function xpath_eval($xpath_context,$eval_str,$contextnode=null) {return $xpath_context->xpath_eval($eval_str,$contextnode);} +function xpath_new_context($dom_document) {return new php4DOMXPath($dom_document);} +function xpath_register_ns($xpath_context,$prefix,$namespaceURI) {return $xpath_context->myDOMXPath->registerNamespace($prefix,$namespaceURI);} +function _entityDecode($text) {return html_entity_decode_php4(strtr($text,array('''=>'\'')),ENT_QUOTES,'UTF-8');} +function _error_report($error) {return array('errormessage'=>$error->message,'nodename'=>'','line'=>$error->line,'col'=>$error->column)+($error->file==''?array():array('directory'=>dirname($error->file),'file'=>basename($error->file)));} + +class php4DOMAttr extends php4DOMNode +{ + function name() {return $this->myDOMNode->name;} + function set_content($text) {} + //function set_value($content) {return $this->myDOMNode->value=htmlspecialchars($content,ENT_QUOTES);} + function specified() {return $this->myDOMNode->specified;} + function value() {return $this->myDOMNode->value;} +} + +class php4DOMDocument extends php4DOMNode +{ + function php4DOMDocument($mode=DOMXML_LOAD_PARSING) + { + $this->myDOMNode=new DOMDocument(); + $this->myOwnerDocument=$this; + if ($mode & DOMXML_LOAD_VALIDATING) $this->myDOMNode->validateOnParse=true; + if ($mode & DOMXML_LOAD_RECOVERING) $this->myDOMNode->recover=true; + if ($mode & DOMXML_LOAD_SUBSTITUTE_ENTITIES) $this->myDOMNode->substituteEntities=true; + if ($mode & DOMXML_LOAD_DONT_KEEP_BLANKS) $this->myDOMNode->preserveWhiteSpace=false; + } + function add_root($name) + { + if ($this->myDOMNode->hasChildNodes()) $this->myDOMNode->removeChild($this->myDOMNode->firstChild); + return new php4DOMElement($this->myDOMNode->appendChild($this->myDOMNode->createElement($name)),$this->myOwnerDocument); + } + function create_attribute($name,$value) + { + $myAttr=$this->myDOMNode->createAttribute($name); + $myAttr->value=htmlspecialchars($value,ENT_QUOTES); + return new php4DOMAttr($myAttr,$this); + } + function create_cdata_section($content) {return new php4DOMNode($this->myDOMNode->createCDATASection($content),$this);} + function create_comment($data) {return new php4DOMNode($this->myDOMNode->createComment($data),$this);} + function create_element($name) {return new php4DOMElement($this->myDOMNode->createElement($name),$this);} + function create_element_ns($uri,$name,$prefix=null) + { + if ($prefix==null) $prefix=$this->myDOMNode->lookupPrefix($uri); + if (($prefix==null)&&(($this->myDOMNode->documentElement==null)||(!$this->myDOMNode->documentElement->isDefaultNamespace($uri)))) $prefix='a'.sprintf('%u',crc32($uri)); + return new php4DOMElement($this->myDOMNode->createElementNS($uri,$prefix==null ? $name : $prefix.':'.$name),$this); + } + function create_entity_reference($content) {return new php4DOMNode($this->myDOMNode->createEntityReference($content),$this);} //By Walter Ebert 2007-01-22 + function create_processing_instruction($target,$data=''){return new php4DomProcessingInstruction($this->myDOMNode->createProcessingInstruction($target,$data),$this);} + function create_text_node($content) {return new php4DOMText($this->myDOMNode->createTextNode($content),$this);} + function document_element() {return parent::_newDOMElement($this->myDOMNode->documentElement,$this);} + function dump_file($filename,$compressionmode=false,$format=false) + { + $format0=$this->myDOMNode->formatOutput; + $this->myDOMNode->formatOutput=$format; + $res=$this->myDOMNode->save($filename); + $this->myDOMNode->formatOutput=$format0; + return $res; + } + function dump_mem($format=false,$encoding=false) + { + $format0=$this->myDOMNode->formatOutput; + $this->myDOMNode->formatOutput=$format; + $encoding0=$this->myDOMNode->encoding; + if ($encoding) $this->myDOMNode->encoding=$encoding; + $dump=$this->myDOMNode->saveXML(); + $this->myDOMNode->formatOutput=$format0; + if ($encoding) $this->myDOMNode->encoding= $encoding0=='' ? 'UTF-8' : $encoding0; //UTF-8 is XML default encoding + return $dump; + } + function free() + { + if ($this->myDOMNode->hasChildNodes()) $this->myDOMNode->removeChild($this->myDOMNode->firstChild); + $this->myDOMNode=null; + $this->myOwnerDocument=null; + } + function get_element_by_id($id) {return parent::_newDOMElement($this->myDOMNode->getElementById($id),$this);} + function get_elements_by_tagname($name) + { + $myDOMNodeList=$this->myDOMNode->getElementsByTagName($name); + $nodeSet=array(); + $i=0; + if (isset($myDOMNodeList)) + while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMElement($node,$this); + return $nodeSet; + } + function html_dump_mem() {return $this->myDOMNode->saveHTML();} + function root() {return parent::_newDOMElement($this->myDOMNode->documentElement,$this);} + function xpath_new_context() {return new php4DOMXPath($this);} +} + +class php4DOMElement extends php4DOMNode +{ + function add_namespace($uri,$prefix) + { + if ($this->myDOMNode->hasAttributeNS('http://www.w3.org/2000/xmlns/',$prefix)) return false; + else + { + $this->myDOMNode->setAttributeNS('http://www.w3.org/2000/xmlns/','xmlns:'.$prefix,$uri); //By Daniel Walker 2006-09-08 + return true; + } + } + function get_attribute($name) {return $this->myDOMNode->getAttribute($name);} + function get_attribute_node($name) {return parent::_newDOMElement($this->myDOMNode->getAttributeNode($name),$this->myOwnerDocument);} + function get_elements_by_tagname($name) + { + $myDOMNodeList=$this->myDOMNode->getElementsByTagName($name); + $nodeSet=array(); + $i=0; + if (isset($myDOMNodeList)) + while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMElement($node,$this->myOwnerDocument); + return $nodeSet; + } + function has_attribute($name) {return $this->myDOMNode->hasAttribute($name);} + function remove_attribute($name) {return $this->myDOMNode->removeAttribute($name);} + function set_attribute($name,$value) + { + //return $this->myDOMNode->setAttribute($name,$value); //Does not return a DomAttr + $myAttr=$this->myDOMNode->ownerDocument->createAttribute($name); + $myAttr->value=htmlspecialchars($value,ENT_QUOTES); //Entity problem reported by AL-DesignWorks 2007-09-07 + $this->myDOMNode->setAttributeNode($myAttr); + return new php4DOMAttr($myAttr,$this->myOwnerDocument); + } + /*function set_attribute_node($attr) + { + $this->myDOMNode->setAttributeNode($this->_importNode($attr)); + return $attr; + }*/ + function set_name($name) + { + if ($this->myDOMNode->prefix=='') $newNode=$this->myDOMNode->ownerDocument->createElement($name); + else $newNode=$this->myDOMNode->ownerDocument->createElementNS($this->myDOMNode->namespaceURI,$this->myDOMNode->prefix.':'.$name); + $myDOMNodeList=$this->myDOMNode->attributes; + $i=0; + if (isset($myDOMNodeList)) + while ($node=$myDOMNodeList->item($i++)) + if ($node->namespaceURI=='') $newNode->setAttribute($node->name,$node->value); + else $newNode->setAttributeNS($node->namespaceURI,$node->nodeName,$node->value); + $myDOMNodeList=$this->myDOMNode->childNodes; + if (isset($myDOMNodeList)) + while ($node=$myDOMNodeList->item(0)) $newNode->appendChild($node); + $this->myDOMNode->parentNode->replaceChild($newNode,$this->myDOMNode); + $this->myDOMNode=$newNode; + return true; + } + function tagname() {return $this->myDOMNode->tagName;} +} + +class php4DOMNode +{ + public $myDOMNode; + public $myOwnerDocument; + function php4DOMNode($aDomNode,$aOwnerDocument) + { + $this->myDOMNode=$aDomNode; + $this->myOwnerDocument=$aOwnerDocument; + } + function __get($name) + { + switch ($name) + { + case 'type': return $this->myDOMNode->nodeType; + case 'tagname': return $this->myDOMNode->tagName; //DomElement + case 'content': return $this->myDOMNode->textContent; + case 'name': return $this->myDOMNode->name; //DomAttribute + case 'value': return $this->myDOMNode->value; + default: + $myErrors=debug_backtrace(); + trigger_error('Undefined property: '.get_class($this).'::$'.$name.' ['.$myErrors[0]['file'].':'.$myErrors[0]['line'].']',E_USER_NOTICE); + return false; + } + } + function add_child($newnode) {return append_child($newnode);} + function add_namespace($uri,$prefix) {return false;} + function append_child($newnode) {return self::_newDOMElement($this->myDOMNode->appendChild($this->_importNode($newnode)),$this->myOwnerDocument);} + function append_sibling($newnode) {return self::_newDOMElement($this->myDOMNode->parentNode->appendChild($this->_importNode($newnode)),$this->myOwnerDocument);} + function attributes() + { + $myDOMNodeList=$this->myDOMNode->attributes; + $nodeSet=array(); + $i=0; + if (isset($myDOMNodeList)) + while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMAttr($node,$this->myOwnerDocument); + return $nodeSet; + } + function child_nodes() + { + $myDOMNodeList=$this->myDOMNode->childNodes; + $nodeSet=array(); + $i=0; + if (isset($myDOMNodeList)) + while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=self::_newDOMElement($node,$this->myOwnerDocument); + return $nodeSet; + } + function children() {return $this->child_nodes();} + function clone_node($deep=false) {return self::_newDOMElement($this->myDOMNode->cloneNode($deep),$this->myOwnerDocument);} + //dump_node($node) should only be called on php4DOMDocument + function dump_node($node=null) {return $node==null ? $this->myOwnerDocument->myDOMNode->saveXML($this->myDOMNode) : $this->myOwnerDocument->myDOMNode->saveXML($node->myDOMNode);} + function first_child() {return self::_newDOMElement($this->myDOMNode->firstChild,$this->myOwnerDocument);} + function get_content() {return $this->myDOMNode->textContent;} + function has_attributes() {return $this->myDOMNode->hasAttributes();} + function has_child_nodes() {return $this->myDOMNode->hasChildNodes();} + function insert_before($newnode,$refnode) {return self::_newDOMElement($this->myDOMNode->insertBefore($this->_importNode($newnode),$refnode==null?null:$refnode->myDOMNode),$this->myOwnerDocument);} + function is_blank_node() {return ($this->myDOMNode->nodeType===XML_TEXT_NODE)&&preg_match('%^\s*$%',$this->myDOMNode->nodeValue);} + function last_child() {return self::_newDOMElement($this->myDOMNode->lastChild,$this->myOwnerDocument);} + function new_child($name,$content) + { + $mySubNode=$this->myDOMNode->ownerDocument->createElement($name); + $mySubNode->appendChild($this->myDOMNode->ownerDocument->createTextNode(_entityDecode($content))); + $this->myDOMNode->appendChild($mySubNode); + return new php4DOMElement($mySubNode,$this->myOwnerDocument); + } + function next_sibling() {return self::_newDOMElement($this->myDOMNode->nextSibling,$this->myOwnerDocument);} + function node_name() {return ($this->myDOMNode->nodeType===XML_ELEMENT_NODE) ? $this->myDOMNode->localName : $this->myDOMNode->nodeName;} //Avoid namespace prefix for DOMElement + function node_type() {return $this->myDOMNode->nodeType;} + function node_value() {return $this->myDOMNode->nodeValue;} + function owner_document() {return $this->myOwnerDocument;} + function parent_node() {return self::_newDOMElement($this->myDOMNode->parentNode,$this->myOwnerDocument);} + function prefix() {return $this->myDOMNode->prefix;} + function previous_sibling() {return self::_newDOMElement($this->myDOMNode->previousSibling,$this->myOwnerDocument);} + function remove_child($oldchild) {return self::_newDOMElement($this->myDOMNode->removeChild($oldchild->myDOMNode),$this->myOwnerDocument);} + function replace_child($newnode,$oldnode) {return self::_newDOMElement($this->myDOMNode->replaceChild($this->_importNode($newnode),$oldnode->myDOMNode),$this->myOwnerDocument);} + function replace_node($newnode) {return self::_newDOMElement($this->myDOMNode->parentNode->replaceChild($this->_importNode($newnode),$this->myDOMNode),$this->myOwnerDocument);} + function set_content($text) {return $this->myDOMNode->appendChild($this->myDOMNode->ownerDocument->createTextNode(_entityDecode($text)));} //Entity problem reported by AL-DesignWorks 2007-09-07 + //function set_name($name) {return $this->myOwnerDocument->renameNode($this->myDOMNode,$this->myDOMNode->namespaceURI,$name);} + function set_namespace($uri,$prefix=null) + {//Contributions by Daniel Walker 2006-09-08 + $nsprefix=$this->myDOMNode->lookupPrefix($uri); + if ($nsprefix==null) + { + $nsprefix= $prefix==null ? $nsprefix='a'.sprintf('%u',crc32($uri)) : $prefix; + if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE) + { + if (($prefix!=null)&&$this->myDOMNode->ownerElement->hasAttributeNS('http://www.w3.org/2000/xmlns/',$nsprefix)&& + ($this->myDOMNode->ownerElement->getAttributeNS('http://www.w3.org/2000/xmlns/',$nsprefix)!=$uri)) + {//Remove namespace + $parent=$this->myDOMNode->ownerElement; + $parent->removeAttributeNode($this->myDOMNode); + $parent->setAttribute($this->myDOMNode->localName,$this->myDOMNode->nodeValue); + $this->myDOMNode=$parent->getAttributeNode($this->myDOMNode->localName); + return; + } + $this->myDOMNode->ownerElement->setAttributeNS('http://www.w3.org/2000/xmlns/','xmlns:'.$nsprefix,$uri); + } + } + if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE) + { + $parent=$this->myDOMNode->ownerElement; + $parent->removeAttributeNode($this->myDOMNode); + $parent->setAttributeNS($uri,$nsprefix.':'.$this->myDOMNode->localName,$this->myDOMNode->nodeValue); + $this->myDOMNode=$parent->getAttributeNodeNS($uri,$this->myDOMNode->localName); + } + elseif ($this->myDOMNode->nodeType===XML_ELEMENT_NODE) + { + $NewNode=$this->myDOMNode->ownerDocument->createElementNS($uri,$nsprefix.':'.$this->myDOMNode->localName); + foreach ($this->myDOMNode->attributes as $n) $NewNode->appendChild($n->cloneNode(true)); + foreach ($this->myDOMNode->childNodes as $n) $NewNode->appendChild($n->cloneNode(true)); + $xpath=new DOMXPath($this->myDOMNode->ownerDocument); + $myDOMNodeList=$xpath->query('namespace::*[name()!="xml"]',$this->myDOMNode); //Add old namespaces + foreach ($myDOMNodeList as $n) $NewNode->setAttributeNS('http://www.w3.org/2000/xmlns/',$n->nodeName,$n->nodeValue); + $this->myDOMNode->parentNode->replaceChild($NewNode,$this->myDOMNode); + $this->myDOMNode=$NewNode; + } + } + function unlink_node() + { + if ($this->myDOMNode->parentNode!=null) + { + if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE) $this->myDOMNode->parentNode->removeAttributeNode($this->myDOMNode); + else $this->myDOMNode->parentNode->removeChild($this->myDOMNode); + } + } + protected function _importNode($newnode) {return $this->myOwnerDocument===$newnode->myOwnerDocument ? $newnode->myDOMNode : $this->myOwnerDocument->myDOMNode->importNode($newnode->myDOMNode,true);} //To import DOMNode from another DOMDocument + static function _newDOMElement($aDOMNode,$aOwnerDocument) + {//Check the PHP5 DOMNode before creating a new associated PHP4 DOMNode wrapper + if ($aDOMNode==null) return null; + switch ($aDOMNode->nodeType) + { + case XML_ELEMENT_NODE: return new php4DOMElement($aDOMNode,$aOwnerDocument); + case XML_TEXT_NODE: return new php4DOMText($aDOMNode,$aOwnerDocument); + case XML_ATTRIBUTE_NODE: return new php4DOMAttr($aDOMNode,$aOwnerDocument); + case XML_PI_NODE: return new php4DomProcessingInstruction($aDOMNode,$aOwnerDocument); + default: return new php4DOMNode($aDOMNode,$aOwnerDocument); + } + } +} + +class php4DomProcessingInstruction extends php4DOMNode +{ + function data() {return $this->myDOMNode->data;} + function target() {return $this->myDOMNode->target;} +} + +class php4DOMText extends php4DOMNode +{ + function __get($name) + { + if ($name==='tagname') return '#text'; + else return parent::__get($name); + } + function tagname() {return '#text';} + function set_content($text) {$this->myDOMNode->nodeValue=$text; return true;} +} + +if (!defined('XPATH_NODESET')) +{ + define('XPATH_UNDEFINED',0); + define('XPATH_NODESET',1); + define('XPATH_BOOLEAN',2); + define('XPATH_NUMBER',3); + define('XPATH_STRING',4); + /*define('XPATH_POINT',5); + define('XPATH_RANGE',6); + define('XPATH_LOCATIONSET',7); + define('XPATH_USERS',8); + define('XPATH_XSLT_TREE',9);*/ +} + +class php4DOMNodelist +{ + private $myDOMNodelist; + public $nodeset; + public $type; + public $value; + function php4DOMNodelist($aDOMNodelist,$aOwnerDocument) + { + if (is_object($aDOMNodelist)||is_array($aDOMNodelist)) + { + $this->myDOMNodelist=$aDOMNodelist; + $this->nodeset=array(); + if (isset($this->myDOMNodelist)) + { + $this->type=XPATH_NODESET; + $i=0; + while ($node=$this->myDOMNodelist->item($i++)) $this->nodeset[]=php4DOMNode::_newDOMElement($node,$aOwnerDocument); + } + else $this->type=XPATH_UNDEFINED; + } + elseif (is_int($aDOMNodelist)||is_float($aDOMNodelist)) + { + $this->type=XPATH_NUMBER; + $this->value=$aDOMNodelist; + } + elseif (is_bool($aDOMNodelist)) + { + $this->type=XPATH_BOOLEAN; + $this->value=$aDOMNodelist; + } + elseif (is_string($aDOMNodelist)) + { + $this->type=XPATH_STRING; + $this->value=$aDOMNodelist; + } + else $this->type=XPATH_UNDEFINED; + } +} + +class php4DOMXPath +{ + public $myDOMXPath; + private $myOwnerDocument; + function php4DOMXPath($dom_document) + { + //TODO: If $dom_document is a DomElement, make that default $contextnode and modify XPath. Ex: '/test' + $this->myOwnerDocument=$dom_document->myOwnerDocument; + $this->myDOMXPath=new DOMXPath($this->myOwnerDocument->myDOMNode); + } + function xpath_eval($eval_str,$contextnode=null) + { + if (method_exists($this->myDOMXPath,'evaluate')) + return isset($contextnode) ? new php4DOMNodelist($this->myDOMXPath->evaluate($eval_str,$contextnode->myDOMNode),$this->myOwnerDocument) : new php4DOMNodelist($this->myDOMXPath->evaluate($eval_str),$this->myOwnerDocument); + else return isset($contextnode) ? new php4DOMNodelist($this->myDOMXPath->query($eval_str,$contextnode->myDOMNode),$this->myOwnerDocument) : new php4DOMNodelist($this->myDOMXPath->query($eval_str),$this->myOwnerDocument); + } + function xpath_register_ns($prefix,$namespaceURI) {return $this->myDOMXPath->registerNamespace($prefix,$namespaceURI);} +} + +if (extension_loaded('xsl')) +{//See also: http://alexandre.alapetite.net/doc-alex/xslt-php4-php5/ + function domxml_xslt_stylesheet($xslstring) {return new php4DomXsltStylesheet(DOMDocument::loadXML($xslstring));} + function domxml_xslt_stylesheet_doc($dom_document) {return new php4DomXsltStylesheet($dom_document);} + function domxml_xslt_stylesheet_file($xslfile) {return new php4DomXsltStylesheet(DOMDocument::load($xslfile));} + class php4DomXsltStylesheet + { + private $myxsltProcessor; + function php4DomXsltStylesheet($dom_document) + { + $this->myxsltProcessor=new xsltProcessor(); + $this->myxsltProcessor->importStyleSheet($dom_document); + } + function process($dom_document,$xslt_parameters=array(),$param_is_xpath=false) + { + foreach ($xslt_parameters as $param=>$value) $this->myxsltProcessor->setParameter('',$param,$value); + $myphp4DOMDocument=new php4DOMDocument(); + $myphp4DOMDocument->myDOMNode=$this->myxsltProcessor->transformToDoc($dom_document->myDOMNode); + return $myphp4DOMDocument; + } + function result_dump_file($dom_document,$filename) + { + $html=$dom_document->myDOMNode->saveHTML(); + file_put_contents($filename,$html); + return $html; + } + function result_dump_mem($dom_document) {return $dom_document->myDOMNode->saveHTML();} + } +} +?> diff --git a/include/limesurvey/admin/classes/core/sha256.php b/include/limesurvey/admin/classes/core/sha256.php new file mode 100644 index 00000000..c1e4e770 --- /dev/null +++ b/include/limesurvey/admin/classes/core/sha256.php @@ -0,0 +1,485 @@ +> 28) & 0x0000000F; // top order bits + $L2 = $M << 3; // number of bits + $l = pack('N*', $L1, $L2); + + // 64 = 64 bits needed for the size mark. 1 = the 1 bit added to the + // end. 511 = 511 bits to get the number to be at least large enough + // to require one block. 512 is the block size. + $k = $L2 + 64 + 1 + 511; + $k -= $k % 512 + $L2 + 64 + 1; + $k >>= 3; // convert to byte count + + $str .= chr(0x80) . str_repeat(chr(0), $k) . $l; + + assert('strlen($str) % 64 == 0'); + + // break the binary string into 512-bit blocks + preg_match_all( '#.{64}#', $str, $this->chunks ); + $this->chunks = $this->chunks[0]; + + // H(0) + /* + $this->hash = array + ( + (int)0x6A09E667, (int)0xBB67AE85, + (int)0x3C6EF372, (int)0xA54FF53A, + (int)0x510E527F, (int)0x9B05688C, + (int)0x1F83D9AB, (int)0x5BE0CD19, + ); + */ + + $this->hash = array + ( + 1779033703, -1150833019, + 1013904242, -1521486534, + 1359893119, -1694144372, + 528734635, 1541459225, + ); + } +} + + +// static class. Access via SHA256::hash() +class SHA256 extends hash +{ + function hash($str, $mode = 'hex') + { + static $modes = array( 'hex', 'bin', 'bit' ); + $ret = false; + + if(!in_array(strtolower($mode), $modes)) + { + trigger_error('mode specified is unrecognized: ' . $mode, E_USER_WARNING); + } + else + { + $data =& new SHA256Data($str); + + SHA256::compute($data); + + $func = array('SHA256', 'hash' . $mode); + if(is_callable($func)) + { + $func = 'hash' . $mode; + $ret = SHA256::$func($data); + //$ret = call_user_func($func, $data); + } + else + { + trigger_error('SHA256::hash' . $mode . '() NOT IMPLEMENTED.', E_USER_WARNING); + } + } + + return $ret; + } + + // ------------ + // begin internal functions + + // 32-bit summation + function sum() + { + $T = 0; + for($x = 0, $y = func_num_args(); $x < $y; $x++) + { + // argument + $a = func_get_arg($x); + + // carry storage + $c = 0; + + for($i = 0; $i < 32; $i++) + { + // sum of the bits at $i + $j = (($T >> $i) & 1) + (($a >> $i) & 1) + $c; + // carry of the bits at $i + $c = ($j >> 1) & 1; + // strip the carry + $j &= 1; + // clear the bit + $T &= ~(1 << $i); + // set the bit + $T |= $j << $i; + } + } + + return $T; + } + + + // compute the hash + function compute(&$hashData) + { + static $vars = 'abcdefgh'; + static $K = null; + + if($K === null) + { + /* + $K = array( + (int)0x428A2F98, (int)0x71374491, (int)0xB5C0FBCF, (int)0xE9B5DBA5, + (int)0x3956C25B, (int)0x59F111F1, (int)0x923F82A4, (int)0xAB1C5ED5, + (int)0xD807AA98, (int)0x12835B01, (int)0x243185BE, (int)0x550C7DC3, + (int)0x72BE5D74, (int)0x80DEB1FE, (int)0x9BDC06A7, (int)0xC19BF174, + (int)0xE49B69C1, (int)0xEFBE4786, (int)0x0FC19DC6, (int)0x240CA1CC, + (int)0x2DE92C6F, (int)0x4A7484AA, (int)0x5CB0A9DC, (int)0x76F988DA, + (int)0x983E5152, (int)0xA831C66D, (int)0xB00327C8, (int)0xBF597FC7, + (int)0xC6E00BF3, (int)0xD5A79147, (int)0x06CA6351, (int)0x14292967, + (int)0x27B70A85, (int)0x2E1B2138, (int)0x4D2C6DFC, (int)0x53380D13, + (int)0x650A7354, (int)0x766A0ABB, (int)0x81C2C92E, (int)0x92722C85, + (int)0xA2BFE8A1, (int)0xA81A664B, (int)0xC24B8B70, (int)0xC76C51A3, + (int)0xD192E819, (int)0xD6990624, (int)0xF40E3585, (int)0x106AA070, + (int)0x19A4C116, (int)0x1E376C08, (int)0x2748774C, (int)0x34B0BCB5, + (int)0x391C0CB3, (int)0x4ED8AA4A, (int)0x5B9CCA4F, (int)0x682E6FF3, + (int)0x748F82EE, (int)0x78A5636F, (int)0x84C87814, (int)0x8CC70208, + (int)0x90BEFFFA, (int)0xA4506CEB, (int)0xBEF9A3F7, (int)0xC67178F2 + ); + */ + $K = array ( + 1116352408, 1899447441, -1245643825, -373957723, + 961987163, 1508970993, -1841331548, -1424204075, + -670586216, 310598401, 607225278, 1426881987, + 1925078388, -2132889090, -1680079193, -1046744716, + -459576895, -272742522, 264347078, 604807628, + 770255983, 1249150122, 1555081692, 1996064986, + -1740746414, -1473132947, -1341970488, -1084653625, + -958395405, -710438585, 113926993, 338241895, + 666307205, 773529912, 1294757372, 1396182291, + 1695183700, 1986661051, -2117940946, -1838011259, + -1564481375, -1474664885, -1035236496, -949202525, + -778901479, -694614492, -200395387, 275423344, + 430227734, 506948616, 659060556, 883997877, + 958139571, 1322822218, 1537002063, 1747873779, + 1955562222, 2024104815, -2067236844, -1933114872, + -1866530822, -1538233109, -1090935817, -965641998, + ); + } + + $W = array(); + for($i = 0, $numChunks = sizeof($hashData->chunks); $i < $numChunks; $i++) + { + // initialize the registers + for($j = 0; $j < 8; $j++) + ${$vars{$j}} = $hashData->hash[$j]; + + // the SHA-256 compression function + for($j = 0; $j < 64; $j++) + { + if($j < 16) + { + $T1 = ord($hashData->chunks[$i]{$j*4 }) & 0xFF; $T1 <<= 8; + $T1 |= ord($hashData->chunks[$i]{$j*4+1}) & 0xFF; $T1 <<= 8; + $T1 |= ord($hashData->chunks[$i]{$j*4+2}) & 0xFF; $T1 <<= 8; + $T1 |= ord($hashData->chunks[$i]{$j*4+3}) & 0xFF; + $W[$j] = $T1; + } + else + { + $W[$j] = SHA256::sum(((($W[$j-2] >> 17) & 0x00007FFF) | ($W[$j-2] << 15)) ^ ((($W[$j-2] >> 19) & 0x00001FFF) | ($W[$j-2] << 13)) ^ (($W[$j-2] >> 10) & 0x003FFFFF), $W[$j-7], ((($W[$j-15] >> 7) & 0x01FFFFFF) | ($W[$j-15] << 25)) ^ ((($W[$j-15] >> 18) & 0x00003FFF) | ($W[$j-15] << 14)) ^ (($W[$j-15] >> 3) & 0x1FFFFFFF), $W[$j-16]); + } + + $T1 = SHA256::sum($h, ((($e >> 6) & 0x03FFFFFF) | ($e << 26)) ^ ((($e >> 11) & 0x001FFFFF) | ($e << 21)) ^ ((($e >> 25) & 0x0000007F) | ($e << 7)), ($e & $f) ^ (~$e & $g), $K[$j], $W[$j]); + $T2 = SHA256::sum(((($a >> 2) & 0x3FFFFFFF) | ($a << 30)) ^ ((($a >> 13) & 0x0007FFFF) | ($a << 19)) ^ ((($a >> 22) & 0x000003FF) | ($a << 10)), ($a & $b) ^ ($a & $c) ^ ($b & $c)); + $h = $g; + $g = $f; + $f = $e; + $e = SHA256::sum($d, $T1); + $d = $c; + $c = $b; + $b = $a; + $a = SHA256::sum($T1, $T2); + } + + // compute the next hash set + for($j = 0; $j < 8; $j++) + $hashData->hash[$j] = SHA256::sum(${$vars{$j}}, $hashData->hash[$j]); + } + } + + + // set up the display of the hash in hex. + function hashHex(&$hashData) + { + $str = ''; + + reset($hashData->hash); + do + { + $str .= sprintf('%08x', current($hashData->hash)); + } + while(next($hashData->hash)); + + return $str; + } + + + // set up the output of the hash in binary + function hashBin(&$hashData) + { + $str = ''; + + reset($hashData->hash); + do + { + $str .= pack('N', current($hashData->hash)); + } + while(next($hashData->hash)); + + return $str; + } +} + + +//-------------- +// REMOVAL ALL FUNCTIONS AFTER THIS WHEN NOT TESTING +//-------------- + +// format a string into 4 byte hex chunks +function hexerize($str) +{ + $n = 0; + $b = 0; + if(is_array($str)) + { + reset($str); + $o = 'array(' . sizeof($str) . ')::' . "\n\n"; + while($s = current($str)) + { + $o .= hexerize($s); + next($str); + } + $o .= 'end array;'."\n"; + } + else + { + if(is_integer($str) || is_float($str)) + $str = pack('N',$str); + $o = 'string(' . strlen($str) . ')' . "::\n"; + for($i = 0, $j = strlen($str); $i < $j; $i++, $b = $i % 4) + { + $o .= sprintf('%02X', ord($str{$i})); + // only process when 32-bits have passed through + if($i != 0 && $b == 3) + { + // process new line points + if($n == 3) + $o .= "\n"; + else + $o .= ' '; + ++$n; + $n %= 4; + } + } + } + + return $o . "\n"; +} + + +// testing functions + +function test1() +{ + $it = 1; + + echo '
';
+
+        $test = array('abc','abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq');
+       
+        foreach($test as $str)
+        {
+                echo 'Testing ' . var_export($str,true) . "\n";
+                list($s1,$s2) = explode(' ', microtime());
+                for($x = 0; $x < $it; $x++)
+                        $data =& new SHA256Data($str);
+                list($e1,$e2) = explode(' ', microtime());
+                echo hexerize($data->chunks);
+                echo hexerize($data->hash);
+                echo 'processing took ' . (($e2 - $s2 + $e1 - $s1) / $it) . ' seconds.' . "\n\n\n";
+        }
+
+        echo '
'; +} + +function test2() +{ + $it = 1; + + echo '
';
+       
+        $test = array('abc','abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq');
+       
+        foreach($test as $str)
+        {
+                echo 'Testing ' . var_export($str,true) . "\n";
+                list($s1,$s2) = explode(' ', microtime());
+                for($x = 0; $x < $it; $x++)
+                        $o = SHA256::hash($str);
+                list($e1,$e2) = explode(' ', microtime());
+                echo $o;
+                echo 'processing took ' . (($e2 - $s2 + $e1 - $s1) / $it) . ' seconds.' . "\n\n\n";
+        }
+       
+        echo '
'; +} + +function testSum() +{ + echo '
';
+       
+        echo SHA256::sum(1,2,3,4,5,6,7,8,9,10);
+       
+        echo '
'; +} + +function testSpeedHash($it = 10) +{ + $it = intval($it); + if($it === 0) + $it = 10; + + set_time_limit(-1); + + echo '
' . "\n";
+       
+        $test = array(
+                ''=>'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
+                'abc'=>'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',
+                'message digest'=>'f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650',
+                'secure hash algorithm'=>'f30ceb2bb2829e79e4ca9753d35a8ecc00262d164cc077080295381cbd643f0d',
+                'SHA256 is considered to be safe'=>'6819d915c73f4d1e77e4e1b52d1fa0f9cf9beaead3939f15874bd988e2a23630',
+                'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'=>'248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1',
+                'For this sample, this 63-byte string will be used as input data'=>'f08a78cbbaee082b052ae0708f32fa1e50c5c421aa772ba5dbb406a2ea6be342',
+                'This is exactly 64 bytes long, not counting the terminating byte'=>'ab64eff7e88e2e46165e29f2bce41826bd4c7b3552f6b382a9e7d3af47c245f8',
+                );
+       
+        foreach($test as $str => $hash)
+        {
+                echo 'Testing ' . var_export($str,true) . "\n";
+                echo 'Start time: ' . date('Y-m-d H:i:s') . "\n";
+                if($it > 1)
+                {
+                        list($s1,$s2) = explode(' ', microtime());
+                        $o = SHA256::hash($str);
+                        list($e1,$e2) = explode(' ', microtime());
+                        echo 'estimated time to perform test: ' . (($e2 - $s2 + $e1 - $s1) * $it) . ' seconds for ' . $it . ' iterations.' . "\n";
+                }
+               
+                $t = 0;
+                for($x = 0; $x < $it; $x++)
+                {
+                        list($s1,$s2) = explode(' ', microtime());
+                        $o = SHA256::hash($str);
+                        list($e1,$e2) = explode(' ', microtime());
+                        $t += $e2 - $s2 + $e1 - $s1;
+                }
+                echo var_export($o,true) . ' == ' . var_export($hash,true) . ' ' . (strcasecmp($o,$hash)==0 ? 'PASSED' : 'FAILED') . "\n";
+                echo 'processing took ' . ($t / $it) . ' seconds.' . "\n\n\n";
+        }
+       
+        echo '
'; +} + +//testSpeedHash(1); + +//-------------- +// END REMOVAL HERE +//-------------- + +/* EOF :: Document Settings: tab:4; */ + +?> \ No newline at end of file diff --git a/include/limesurvey/admin/classes/pear/OLE/OLE.php b/include/limesurvey/admin/classes/pear/OLE/OLE.php new file mode 100644 index 00000000..bc6c2a22 --- /dev/null +++ b/include/limesurvey/admin/classes/pear/OLE/OLE.php @@ -0,0 +1,411 @@ + | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: OLE.php,v 1.7 2003/08/21 15:15:40 xnoguer Exp $ + + +/** +* Constants for OLE package +*/ +define('OLE_PPS_TYPE_ROOT', 5); +define('OLE_PPS_TYPE_DIR', 1); +define('OLE_PPS_TYPE_FILE', 2); +define('OLE_DATA_SIZE_SMALL', 0x1000); +define('OLE_LONG_INT_SIZE', 4); +define('OLE_PPS_SIZE', 0x80); + +if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} +require_once($homedir.'/classes/pear/PEAR.php'); +require_once $homedir.'/classes/pear/OLE/PPS.php'; + +/** +* OLE package base class. +* +* @author Xavier Noguer +* @category Structures +* @package OLE +*/ +class OLE extends PEAR +{ + /** + * The file handle for reading an OLE container + * @var resource + */ + var $_file_handle; + + /** + * Array of PPS's found on the OLE container + * @var array + */ + var $_list; + + /** + * Creates a new OLE object + * Remember to use ampersand when creating an OLE object ($my_ole =& new OLE();) + * @access public + */ + function OLE() + { + $this->_list = array(); + } + + /** + * Reads an OLE container from the contents of the file given. + * + * @acces public + * @param string $file + * @return mixed true on success, PEAR_Error on failure + */ + function read($file) + { + /* consider storing offsets as constants */ + $big_block_size_offset = 30; + $iBdbCnt_offset = 44; + $bd_start_offset = 68; + + $fh = @fopen($file, "r"); + if ($fh == false) { + return $this->raiseError("Can't open file $file"); + } + $this->_file_handle = $fh; + + /* begin reading OLE attributes */ + fseek($fh, 0); + $signature = fread($fh, 8); + if ("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" != $signature) { + return $this->raiseError("File doesn't seem to be an OLE container."); + } + fseek($fh, $big_block_size_offset); + $packed_array = unpack("v", fread($fh, 2)); + $big_block_size = pow(2, $packed_array['']); + + $packed_array = unpack("v", fread($fh, 2)); + $small_block_size = pow(2, $packed_array['']); + $i1stBdL = ($big_block_size - 0x4C) / OLE_LONG_INT_SIZE; + + fseek($fh, $iBdbCnt_offset); + $packed_array = unpack("V", fread($fh, 4)); + $iBdbCnt = $packed_array['']; + + $packed_array = unpack("V", fread($fh, 4)); + $pps_wk_start = $packed_array['']; + + fseek($fh, $bd_start_offset); + $packed_array = unpack("V", fread($fh, 4)); + $bd_start = $packed_array['']; + $packed_array = unpack("V", fread($fh, 4)); + $bd_count = $packed_array['']; + $packed_array = unpack("V", fread($fh, 4)); + $iAll = $packed_array['']; // this may be wrong + /* create OLE_PPS objects from */ + $ret = $this->_readPpsWks($pps_wk_start, $big_block_size); + if (PEAR::isError($ret)) { + return $ret; + } + return true; + } + + /** + * Destructor (using PEAR) + * Just closes the file handle on the OLE file. + * + * @access private + */ + function _OLE() + { + fclose($this->_file_handle); + } + + /** + * Gets information about all PPS's on the OLE container from the PPS WK's + * creates an OLE_PPS object for each one. + * + * @access private + * @param integer $pps_wk_start Position inside the OLE file where PPS WK's start + * @param integer $big_block_size Size of big blobks in the OLE file + * @return mixed true on success, PEAR_Error on failure + */ + function _readPpsWks($pps_wk_start, $big_block_size) + { + $pointer = ($pps_wk_start + 1) * $big_block_size; + while (1) + { + fseek($this->_file_handle, $pointer); + $pps_wk = fread($this->_file_handle, OLE_PPS_SIZE); + if (strlen($pps_wk) != OLE_PPS_SIZE) { + break; // Excel likes to add a trailing byte sometimes + //return $this->raiseError("PPS at $pointer seems too short: ".strlen($pps_wk)); + } + $name_length = unpack("c", substr($pps_wk, 64, 2)); // FIXME (2 bytes??) + $name_length = $name_length[''] - 2; + $name = substr($pps_wk, 0, $name_length); + $type = unpack("c", substr($pps_wk, 66, 1)); + if (($type[''] != OLE_PPS_TYPE_ROOT) and + ($type[''] != OLE_PPS_TYPE_DIR) and + ($type[''] != OLE_PPS_TYPE_FILE)) + { + return $this->raiseError("PPS at $pointer has unknown type: {$type['']}"); + } + $prev = unpack("V", substr($pps_wk, 68, 4)); + $next = unpack("V", substr($pps_wk, 72, 4)); + $dir = unpack("V", substr($pps_wk, 76, 4)); + // there is no magic number, it can take different values. + //$magic = unpack("V", strrev(substr($pps_wk, 92, 4))); + $time_1st = substr($pps_wk, 100, 8); + $time_2nd = substr($pps_wk, 108, 8); + $start_block = unpack("V", substr($pps_wk, 116, 4)); + $size = unpack("V", substr($pps_wk, 120, 4)); + // _data member will point to position in file!! + // OLE_PPS object is created with an empty children array!! + $this->_list[] = new OLE_PPS(null, '', $type[''], $prev[''], $next[''], + $dir[''], OLE::OLE2LocalDate($time_1st), + OLE::OLE2LocalDate($time_2nd), + ($start_block[''] + 1) * $big_block_size, array()); + // give it a size + $this->_list[count($this->_list) - 1]->Size = $size['']; + // check if the PPS tree (starting from root) is complete + if ($this->_ppsTreeComplete(0)) { + break; + } + $pointer += OLE_PPS_SIZE; + } + } + + /** + * It checks whether the PPS tree is complete (all PPS's read) + * starting with the given PPS (not necessarily root) + * + * @access private + * @param integer $index The index of the PPS from which we are checking + * @return boolean Whether the PPS tree for the given PPS is complete + */ + function _ppsTreeComplete($index) + { + if ($this->_list[$index]->NextPps != -1) { + if (!isset($this->_list[$this->_list[$index]->NextPps])) { + return false; + } + else { + return $this->_ppsTreeComplete($this->_list[$index]->NextPps); + } + } + if ($this->_list[$index]->DirPps != -1) { + if (!isset($this->_list[$this->_list[$index]->DirPps])) { + return false; + } + else { + return $this->_ppsTreeComplete($this->_list[$index]->DirPps); + } + } + return true; + } + + /** + * Checks whether a PPS is a File PPS or not. + * If there is no PPS for the index given, it will return false. + * + * @access public + * @param integer $index The index for the PPS + * @return bool true if it's a File PPS, false otherwise + */ + function isFile($index) + { + if (isset($this->_list[$index])) { + return ($this->_list[$index]->Type == OLE_PPS_TYPE_FILE); + } + return false; + } + + /** + * Checks whether a PPS is a Root PPS or not. + * If there is no PPS for the index given, it will return false. + * + * @access public + * @param integer $index The index for the PPS. + * @return bool true if it's a Root PPS, false otherwise + */ + function isRoot($index) + { + if (isset($this->_list[$index])) { + return ($this->_list[$index]->Type == OLE_PPS_TYPE_ROOT); + } + return false; + } + + /** + * Gives the total number of PPS's found in the OLE container. + * + * @access public + * @return integer The total number of PPS's found in the OLE container + */ + function ppsTotal() + { + return count($this->_list); + } + + /** + * Gets data from a PPS + * If there is no PPS for the index given, it will return an empty string. + * + * @access public + * @param integer $index The index for the PPS + * @param integer $position The position from which to start reading + * (relative to the PPS) + * @param integer $length The amount of bytes to read (at most) + * @return string The binary string containing the data requested + */ + function getData($index, $position, $length) + { + // if position is not valid return empty string + if (!isset($this->_list[$index]) or ($position >= $this->_list[$index]->Size) or ($position < 0)) { + return ''; + } + // Beware!!! _data member is actually a position + fseek($this->_file_handle, $this->_list[$index]->_data + $position); + return fread($this->_file_handle, $length); + } + + /** + * Gets the data length from a PPS + * If there is no PPS for the index given, it will return 0. + * + * @access public + * @param integer $index The index for the PPS + * @return integer The amount of bytes in data the PPS has + */ + function getDataLength($index) + { + if (isset($this->_list[$index])) { + return $this->_list[$index]->Size; + } + return 0; + } + + /** + * Utility function to transform ASCII text to Unicode + * + * @access public + * @static + * @param string $ascii The ASCII string to transform + * @return string The string in Unicode + */ + function Asc2Ucs($ascii) + { + $rawname = ''; + for ($i = 0; $i < strlen($ascii); $i++) { + $rawname .= $ascii{$i}."\x00"; + } + return $rawname; + } + + /** + * Utility function + * Returns a string for the OLE container with the date given + * + * @access public + * @static + * @param integer $date A timestamp + * @return string The string for the OLE container + */ + function LocalDate2OLE($date = null) + { + if (!isset($date)) { + return "\x00\x00\x00\x00\x00\x00\x00\x00"; + } + + // factor used for separating numbers into 4 bytes parts + $factor = pow(2,32); + + // days from 1-1-1601 until the beggining of UNIX era + $days = 134774; + // calculate seconds + $big_date = $days*24*3600 + gmmktime(date("H",$date),date("i",$date),date("s",$date), + date("m",$date),date("d",$date),date("Y",$date)); + // multiply just to make MS happy + $big_date *= 10000000; + + $high_part = floor($big_date/$factor); + // lower 4 bytes + $low_part = floor((($big_date/$factor) - $high_part)*$factor); + + // Make HEX string + $res = ''; + + for ($i=0; $i<4; $i++) + { + $hex = $low_part % 0x100; + $res .= pack('c', $hex); + $low_part /= 0x100; + } + for ($i=0; $i<4; $i++) + { + $hex = $high_part % 0x100; + $res .= pack('c', $hex); + $high_part /= 0x100; + } + return $res; + } + + /** + * Returns a timestamp from an OLE container's date + * + * @access public + * @static + * @param integer $string A binary string with the encoded date + * @return string The timestamp corresponding to the string + */ + function OLE2LocalDate($string) + { + if (strlen($string) != 8) { + return new PEAR_Error("Expecting 8 byte string"); + } + + // factor used for separating numbers into 4 bytes parts + $factor = pow(2,32); + $high_part = 0; + for ($i=0; $i<4; $i++) + { + $al = unpack('C', $string{(7 - $i)}); + $high_part += $al['']; + if ($i < 3) { + $high_part *= 0x100; + } + } + $low_part = 0; + for ($i=4; $i<8; $i++) + { + $al = unpack('C', $string{(7 - $i)}); + $low_part += $al['']; + if ($i < 7) { + $low_part *= 0x100; + } + } + $big_date = ($high_part*$factor) + $low_part; + // translate to seconds + $big_date /= 10000000; + + // days from 1-1-1601 until the beggining of UNIX era + $days = 134774; + + // translate to seconds from beggining of UNIX era + $big_date -= $days*24*3600; + return floor($big_date); + } +} +?> diff --git a/include/limesurvey/admin/classes/pear/OLE/PPS.php b/include/limesurvey/admin/classes/pear/OLE/PPS.php new file mode 100644 index 00000000..da94e937 --- /dev/null +++ b/include/limesurvey/admin/classes/pear/OLE/PPS.php @@ -0,0 +1,219 @@ + | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: PPS.php,v 1.5 2003/12/14 18:12:28 xnoguer Exp $ + +if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} +require_once($homedir.'/classes/pear/PEAR.php'); +require_once($homedir.'/classes/pear/OLE/OLE.php'); + +/** +* Class for creating PPS's for OLE containers +* +* @author Xavier Noguer +* @category Structures +* @package OLE +*/ +class OLE_PPS extends PEAR +{ + /** + * The PPS index + * @var integer + */ + var $No; + + /** + * The PPS name (in Unicode) + * @var string + */ + var $Name; + + /** + * The PPS type. Dir, Root or File + * @var integer + */ + var $Type; + + /** + * The index of the previous PPS + * @var integer + */ + var $PrevPps; + + /** + * The index of the next PPS + * @var integer + */ + var $NextPps; + + /** + * The index of it's first child if this is a Dir or Root PPS + * @var integer + */ + var $DirPps; + + /** + * A timestamp + * @var integer + */ + var $Time1st; + + /** + * A timestamp + * @var integer + */ + var $Time2nd; + + /** + * Starting block (small or big) for this PPS's data inside the container + * @var integer + */ + var $_StartBlock; + + /** + * The size of the PPS's data (in bytes) + * @var integer + */ + var $Size; + + /** + * The PPS's data (only used if it's not using a temporary file) + * @var string + */ + var $_data; + + /** + * Array of child PPS's (only used by Root and Dir PPS's) + * @var array + */ + var $children = array(); + + /** + * The constructor + * + * @access public + * @param integer $No The PPS index + * @param string $name The PPS name (in Unicode) + * @param integer $type The PPS type. Dir, Root or File + * @param integer $prev The index of the previous PPS + * @param integer $next The index of the next PPS + * @param integer $dir The index of it's first child if this is a Dir or Root PPS + * @param integer $time_1st A timestamp + * @param integer $time_2nd A timestamp + * @param array $children Array containing children PPS for this PPS + */ + function OLE_PPS($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children) + { + $this->No = $No; + $this->Name = $name; + $this->Type = $type; + $this->PrevPps = $prev; + $this->NextPps = $next; + $this->DirPps = $dir; + $this->Time1st = $time_1st; + $this->Time2nd = $time_2nd; + $this->_data = $data; + $this->children = $children; + if ($data != '') { + $this->Size = strlen($data); + } + else { + $this->Size = 0; + } + } + + /** + * Returns the amount of data saved for this PPS + * + * @access private + * @return integer The amount of data (in bytes) + */ + function _DataLen() + { + if (!isset($this->_data)) { + return 0; + } + if (isset($this->_PPS_FILE)) + { + fseek($this->_PPS_FILE, 0); + $stats = fstat($this->_PPS_FILE); + return $stats[7]; + } + else { + return strlen($this->_data); + } + } + + /** + * Returns a string with the PPS's WK (What is a WK?) + * + * @access private + * @return string The binary string + */ + function _getPpsWk() + { + $ret = $this->Name; + for ($i = 0; $i < (64 - strlen($this->Name)); $i++) { + $ret .= "\x00"; + } + $ret .= pack("v", strlen($this->Name) + 2) // 66 + . pack("c", $this->Type) // 67 + . pack("c", 0x00) //UK // 68 + . pack("V", $this->PrevPps) //Prev // 72 + . pack("V", $this->NextPps) //Next // 76 + . pack("V", $this->DirPps) //Dir // 80 + . "\x00\x09\x02\x00" // 84 + . "\x00\x00\x00\x00" // 88 + . "\xc0\x00\x00\x00" // 92 + . "\x00\x00\x00\x46" // 96 // Seems to be ok only for Root + . "\x00\x00\x00\x00" // 100 + . OLE::LocalDate2OLE($this->Time1st) // 108 + . OLE::LocalDate2OLE($this->Time2nd) // 116 + . pack("V", isset($this->_StartBlock)? + $this->_StartBlock:0) // 120 + . pack("V", $this->Size) // 124 + . pack("V", 0); // 128 + return $ret; + } + + /** + * Updates index and pointers to previous, next and children PPS's for this + * PPS. I don't think it'll work with Dir PPS's. + * + * @access private + * @param array &$pps_array Reference to the array of PPS's for the whole OLE + * container + * @return integer The index for this PPS + */ + function _savePpsSetPnt(&$pps_array) + { + $pps_array[count($pps_array)] = &$this; + $this->No = count($pps_array) - 1; + $this->PrevPps = 0xFFFFFFFF; + $this->NextPps = 0xFFFFFFFF; + if (count($this->children) > 0) { + $this->DirPps = $this->children[0]->_savePpsSetPnt($pps_array); + } + else { + $this->DirPps = 0xFFFFFFFF; + } + return $this->No; + } +} +?> diff --git a/include/limesurvey/admin/classes/pear/OLE/PPS/File.php b/include/limesurvey/admin/classes/pear/OLE/PPS/File.php new file mode 100644 index 00000000..fa0a9fe7 --- /dev/null +++ b/include/limesurvey/admin/classes/pear/OLE/PPS/File.php @@ -0,0 +1,114 @@ + | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: File.php,v 1.8 2003/12/12 21:10:10 xnoguer Exp $ + +if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} +require_once ($homedir.'/classes/pear/OLE/PPS.php'); + +/** +* Class for creating File PPS's for OLE containers +* +* @author Xavier Noguer +* @category Structures +* @package OLE +*/ +class OLE_PPS_File extends OLE_PPS +{ + /** + * The temporary dir for storing the OLE file + * @var string + */ + var $_tmp_dir; + + /** + * The constructor + * + * @access public + * @param string $name The name of the file (in Unicode) + * @see OLE::Asc2Ucs() + */ + function OLE_PPS_File($name) + { + $this->_tmp_dir = ''; + $this->OLE_PPS( + null, + $name, + OLE_PPS_TYPE_FILE, + null, + null, + null, + null, + null, + '', + array()); + } + + /** + * Sets the temp dir used for storing the OLE file + * + * @access public + * @param string $dir The dir to be used as temp dir + * @return true if given dir is valid, false otherwise + */ + function setTempDir($dir) + { + if (is_dir($dir)) { + $this->_tmp_dir = $dir; + return true; + } + return false; + } + + /** + * Initialization method. Has to be called right after OLE_PPS_File(). + * + * @access public + * @return mixed true on success. PEAR_Error on failure + */ + function init() + { + $this->_tmp_filename = tempnam($this->_tmp_dir, "OLE_PPS_File"); + $fh = @fopen($this->_tmp_filename, "w+b"); + if ($fh == false) { + return $this->raiseError("Can't create temporary file"); + } + $this->_PPS_FILE = $fh; + if ($this->_PPS_FILE) { + fseek($this->_PPS_FILE, 0); + } + } + + /** + * Append data to PPS + * + * @access public + * @param string $data The data to append + */ + function append($data) + { + if ($this->_PPS_FILE) { + fwrite($this->_PPS_FILE, $data); + } + else { + $this->_data .= $data; + } + } +} +?> diff --git a/include/limesurvey/admin/classes/pear/OLE/PPS/Root.php b/include/limesurvey/admin/classes/pear/OLE/PPS/Root.php new file mode 100644 index 00000000..1e9a5947 --- /dev/null +++ b/include/limesurvey/admin/classes/pear/OLE/PPS/Root.php @@ -0,0 +1,519 @@ + | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: Root.php,v 1.7 2003/12/12 21:10:10 xnoguer Exp $ + +if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} +require_once ($homedir.'/classes/pear/OLE/PPS.php'); + +/** +* Class for creating Root PPS's for OLE containers +* +* @author Xavier Noguer +* @category Structures +* @package OLE +*/ +class OLE_PPS_Root extends OLE_PPS +{ + /** + * The temporary dir for storing the OLE file + * @var string + */ + var $_tmp_dir; + + /** + * Constructor + * + * @access public + * @param integer $time_1st A timestamp + * @param integer $time_2nd A timestamp + */ + function OLE_PPS_Root($time_1st, $time_2nd, $raChild) + { + $this->_tmp_dir = ''; + $this->OLE_PPS( + null, + OLE::Asc2Ucs('Root Entry'), + OLE_PPS_TYPE_ROOT, + null, + null, + null, + $time_1st, + $time_2nd, + null, + $raChild); + } + + /** + * Sets the temp dir used for storing the OLE file + * + * @access public + * @param string $dir The dir to be used as temp dir + * @return true if given dir is valid, false otherwise + */ + function setTempDir($dir) + { + if (is_dir($dir)) { + $this->_tmp_dir = $dir; + return true; + } + return false; + } + + /** + * Method for saving the whole OLE container (including files). + * In fact, if called with an empty argument (or '-'), it saves to a + * temporary file and then outputs it's contents to stdout. + * + * @param string $filename The name of the file where to save the OLE container + * @access public + * @return mixed true on success, PEAR_Error on failure + */ + function save($filename) + { + // Initial Setting for saving + $this->_BIG_BLOCK_SIZE = pow(2, + ((isset($this->_BIG_BLOCK_SIZE))? $this->_adjust2($this->_BIG_BLOCK_SIZE) : 9)); + $this->_SMALL_BLOCK_SIZE= pow(2, + ((isset($this->_SMALL_BLOCK_SIZE))? $this->_adjust2($this->_SMALL_BLOCK_SIZE): 6)); + + // Open temp file if we are sending output to stdout + if (($filename == '-') or ($filename == '')) + { + $this->_tmp_filename = tempnam($this->_tmp_dir, "OLE_PPS_Root"); + $this->_FILEH_ = @fopen($this->_tmp_filename,"w+b"); + if ($this->_FILEH_ == false) { + return $this->raiseError("Can't create temporary file."); + } + } + else + { + $this->_FILEH_ = @fopen($filename, "wb"); + if ($this->_FILEH_ == false) { + return $this->raiseError("Can't open $filename. It may be in use or protected."); + } + } + // Make an array of PPS's (for Save) + $aList = array(); + $this->_savePpsSetPnt($aList); + // calculate values for header + list($iSBDcnt, $iBBcnt, $iPPScnt) = $this->_calcSize($aList); //, $rhInfo); + // Save Header + $this->_saveHeader($iSBDcnt, $iBBcnt, $iPPScnt); + + // Make Small Data string (write SBD) + $this->_data = $this->_makeSmallData($aList); + + // Write BB + $this->_saveBigData($iSBDcnt, $aList); + // Write PPS + $this->_savePps($aList); + // Write Big Block Depot and BDList and Adding Header informations + $this->_saveBbd($iSBDcnt, $iBBcnt, $iPPScnt); + // Close File, send it to stdout if necessary + if(($filename == '-') or ($filename == '')) + { + fseek($this->_FILEH_, 0); + fpassthru($this->_FILEH_); + @fclose($this->_FILEH_); + // Delete the temporary file. + @unlink($this->_tmp_filename); + } + else { + @fclose($this->_FILEH_); + } + return true; + } + + /** + * Calculate some numbers + * + * @access private + * @param array $raList Reference to an array of PPS's + * @return array The array of numbers + */ + function _calcSize(&$raList) + { + // Calculate Basic Setting + list($iSBDcnt, $iBBcnt, $iPPScnt) = array(0,0,0); + $iSmallLen = 0; + $iSBcnt = 0; + for ($i = 0; $i < count($raList); $i++) { + if($raList[$i]->Type == OLE_PPS_TYPE_FILE) { + $raList[$i]->Size = $raList[$i]->_DataLen(); + if($raList[$i]->Size < OLE_DATA_SIZE_SMALL) { + $iSBcnt += floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0); + } + else { + $iBBcnt += (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0)); + } + } + } + $iSmallLen = $iSBcnt * $this->_SMALL_BLOCK_SIZE; + $iSlCnt = floor($this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE); + $iSBDcnt = floor($iSBcnt / $iSlCnt) + (($iSBcnt % $iSlCnt)? 1:0); + $iBBcnt += (floor($iSmallLen / $this->_BIG_BLOCK_SIZE) + + (( $iSmallLen % $this->_BIG_BLOCK_SIZE)? 1: 0)); + $iCnt = count($raList); + $iBdCnt = $this->_BIG_BLOCK_SIZE / OLE_PPS_SIZE; + $iPPScnt = (floor($iCnt/$iBdCnt) + (($iCnt % $iBdCnt)? 1: 0)); + + return array($iSBDcnt, $iBBcnt, $iPPScnt); + } + + /** + * Helper function for caculating a magic value for block sizes + * + * @access private + * @param integer $i2 The argument + * @see save() + * @return integer + */ + function _adjust2($i2) + { + $iWk = log($i2)/log(2); + return ($iWk > floor($iWk))? floor($iWk)+1:$iWk; + } + + /** + * Save OLE header + * + * @access private + * @param integer $iSBDcnt + * @param integer $iBBcnt + * @param integer $iPPScnt + */ + function _saveHeader($iSBDcnt, $iBBcnt, $iPPScnt) + { + $FILE = $this->_FILEH_; + + // Calculate Basic Setting + $iBlCnt = $this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE; + $i1stBdL = ($this->_BIG_BLOCK_SIZE - 0x4C) / OLE_LONG_INT_SIZE; + + $iBdExL = 0; + $iAll = $iBBcnt + $iPPScnt + $iSBDcnt; + $iAllW = $iAll; + $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0); + $iBdCnt = floor(($iAll + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0); + + // Calculate BD count + if ($iBdCnt >$i1stBdL) + { + while (1) + { + $iBdExL++; + $iAllW++; + $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0); + $iBdCnt = floor(($iAllW + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0); + if ($iBdCnt <= ($iBdExL*$iBlCnt+ $i1stBdL)) { + break; + } + } + } + + // Save Header + fwrite($FILE, + "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . pack("v", 0x3b) + . pack("v", 0x03) + . pack("v", -2) + . pack("v", 9) + . pack("v", 6) + . pack("v", 0) + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . pack("V", $iBdCnt) + . pack("V", $iBBcnt+$iSBDcnt) //ROOT START + . pack("V", 0) + . pack("V", 0x1000) + . pack("V", 0) //Small Block Depot + . pack("V", 1) + ); + // Extra BDList Start, Count + if ($iBdCnt < $i1stBdL) + { + fwrite($FILE, + pack("V", -2). // Extra BDList Start + pack("V", 0) // Extra BDList Count + ); + } + else + { + fwrite($FILE, pack("V", $iAll+$iBdCnt) . pack("V", $iBdExL)); + } + + // BDList + for ($i=0; $i<$i1stBdL and $i < $iBdCnt; $i++) { + fwrite($FILE, pack("V", $iAll+$i)); + } + if ($i < $i1stBdL) + { + for ($j = 0; $j < ($i1stBdL-$i); $j++) { + fwrite($FILE, (pack("V", -1))); + } + } + } + + /** + * Saving big data (PPS's with data bigger than OLE_DATA_SIZE_SMALL) + * + * @access private + * @param integer $iStBlk + * @param array &$raList Reference to array of PPS's + */ + function _saveBigData($iStBlk, &$raList) + { + $FILE = $this->_FILEH_; + + // cycle through PPS's + for ($i = 0; $i < count($raList); $i++) + { + if($raList[$i]->Type != OLE_PPS_TYPE_DIR) + { + $raList[$i]->Size = $raList[$i]->_DataLen(); + if(($raList[$i]->Size >= OLE_DATA_SIZE_SMALL) or + (($raList[$i]->Type == OLE_PPS_TYPE_ROOT) and isset($raList[$i]->_data))) + { + // Write Data + if(isset($raList[$i]->_PPS_FILE)) + { + $iLen = 0; + fseek($raList[$i]->_PPS_FILE, 0); // To The Top + while($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) + { + $iLen += strlen($sBuff); + fwrite($FILE, $sBuff); + } + } + else { + fwrite($FILE, $raList[$i]->_data); + } + + if ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE) + { + for ($j = 0; $j < ($this->_BIG_BLOCK_SIZE - ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)); $j++) { + fwrite($FILE, "\x00"); + } + } + // Set For PPS + $raList[$i]->_StartBlock = $iStBlk; + $iStBlk += + (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0)); + } + // Close file for each PPS, and unlink it + if (isset($raList[$i]->_PPS_FILE)) + { + @fclose($raList[$i]->_PPS_FILE); + $raList[$i]->_PPS_FILE = null; + @unlink($raList[$i]->_tmp_filename); + } + } + } + } + + /** + * get small data (PPS's with data smaller than OLE_DATA_SIZE_SMALL) + * + * @access private + * @param array &$raList Reference to array of PPS's + */ + function _makeSmallData(&$raList) + { + $sRes = ''; + $FILE = $this->_FILEH_; + $iSmBlk = 0; + + for ($i = 0; $i < count($raList); $i++) + { + // Make SBD, small data string + if ($raList[$i]->Type == OLE_PPS_TYPE_FILE) + { + if ($raList[$i]->Size <= 0) { + continue; + } + if ($raList[$i]->Size < OLE_DATA_SIZE_SMALL) + { + $iSmbCnt = floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0); + // Add to SBD + for ($j = 0; $j < ($iSmbCnt-1); $j++) { + fwrite($FILE, pack("V", $j+$iSmBlk+1)); + } + fwrite($FILE, pack("V", -2)); + + // Add to Data String(this will be written for RootEntry) + if ($raList[$i]->_PPS_FILE) + { + fseek($raList[$i]->_PPS_FILE, 0); // To The Top + while ($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) { + $sRes .= $sBuff; + } + } + else { + $sRes .= $raList[$i]->_data; + } + if($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE) + { + for ($j = 0; $j < ($this->_SMALL_BLOCK_SIZE - ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)); $j++) { + $sRes .= "\x00"; + } + } + // Set for PPS + $raList[$i]->_StartBlock = $iSmBlk; + $iSmBlk += $iSmbCnt; + } + } + } + $iSbCnt = floor($this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE); + if($iSmBlk % $iSbCnt) + { + for ($i = 0; $i < ($iSbCnt - ($iSmBlk % $iSbCnt)); $i++) { + fwrite($FILE, pack("V", -1)); + } + } + return $sRes; + } + + /** + * Saves all the PPS's WKs + * + * @access private + * @param array $raList Reference to an array with all PPS's + */ + function _savePps(&$raList) + { + // Save each PPS WK + for ($i = 0; $i < count($raList); $i++) { + fwrite($this->_FILEH_, $raList[$i]->_getPpsWk()); + } + // Adjust for Block + $iCnt = count($raList); + $iBCnt = $this->_BIG_BLOCK_SIZE / OLE_PPS_SIZE; + if ($iCnt % $iBCnt) + { + for ($i = 0; $i < (($iBCnt - ($iCnt % $iBCnt)) * OLE_PPS_SIZE); $i++) { + fwrite($this->_FILEH_, "\x00"); + } + } + } + + /** + * Saving Big Block Depot + * + * @access private + * @param integer $iSbdSize + * @param integer $iBsize + * @param integer $iPpsCnt + */ + function _saveBbd($iSbdSize, $iBsize, $iPpsCnt) + { + $FILE = $this->_FILEH_; + // Calculate Basic Setting + $iBbCnt = $this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE; + $i1stBdL = ($this->_BIG_BLOCK_SIZE - 0x4C) / OLE_LONG_INT_SIZE; + + $iBdExL = 0; + $iAll = $iBsize + $iPpsCnt + $iSbdSize; + $iAllW = $iAll; + $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0); + $iBdCnt = floor(($iAll + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0); + // Calculate BD count + if ($iBdCnt >$i1stBdL) + { + while (1) + { + $iBdExL++; + $iAllW++; + $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0); + $iBdCnt = floor(($iAllW + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0); + if ($iBdCnt <= ($iBdExL*$iBbCnt+ $i1stBdL)) { + break; + } + } + } + + // Making BD + // Set for SBD + if ($iSbdSize > 0) + { + for ($i = 0; $i<($iSbdSize-1); $i++) { + fwrite($FILE, pack("V", $i+1)); + } + fwrite($FILE, pack("V", -2)); + } + // Set for B + for ($i = 0; $i<($iBsize-1); $i++) { + fwrite($FILE, pack("V", $i+$iSbdSize+1)); + } + fwrite($FILE, pack("V", -2)); + + // Set for PPS + for ($i = 0; $i<($iPpsCnt-1); $i++) { + fwrite($FILE, pack("V", $i+$iSbdSize+$iBsize+1)); + } + fwrite($FILE, pack("V", -2)); + // Set for BBD itself ( 0xFFFFFFFD : BBD) + for ($i=0; $i<$iBdCnt;$i++) { + fwrite($FILE, pack("V", 0xFFFFFFFD)); + } + // Set for ExtraBDList + for ($i=0; $i<$iBdExL;$i++) { + fwrite($FILE, pack("V", 0xFFFFFFFC)); + } + // Adjust for Block + if (($iAllW + $iBdCnt) % $iBbCnt) + { + for ($i = 0; $i < ($iBbCnt - (($iAllW + $iBdCnt) % $iBbCnt)); $i++) { + fwrite($FILE, pack("V", -1)); + } + } + // Extra BDList + if ($iBdCnt > $i1stBdL) + { + $iN=0; + $iNb=0; + for ($i=$i1stBdL;$i<$iBdCnt; $i++, $iN++) + { + if ($iN>=($iBbCnt-1)) + { + $iN = 0; + $iNb++; + fwrite($FILE, pack("V", $iAll+$iBdCnt+$iNb)); + } + fwrite($FILE, pack("V", $iBsize+$iSbdSize+$iPpsCnt+$i)); + } + if (($iBdCnt-$i1stBdL) % ($iBbCnt-1)) + { + for ($i = 0; $i < (($iBbCnt-1) - (($iBdCnt-$i1stBdL) % ($iBbCnt-1))); $i++) { + fwrite($FILE, pack("V", -1)); + } + } + fwrite($FILE, pack("V", -2)); + } + } +} +?> diff --git a/include/limesurvey/admin/classes/pear/PEAR.php b/include/limesurvey/admin/classes/pear/PEAR.php new file mode 100644 index 00000000..2cf28266 --- /dev/null +++ b/include/limesurvey/admin/classes/pear/PEAR.php @@ -0,0 +1,1095 @@ + + * @author Stig Bakken + * @author Tomas V.V.Cox + * @author Greg Beaver + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: PEAR.php,v 1.96 2005/09/21 00:12:35 cellog Exp $ + * @link http://pear.php.net/package/PEAR + * @since File available since Release 0.1 + */ + +/**#@+ + * ERROR constants + */ +define('PEAR_ERROR_RETURN', 1); +define('PEAR_ERROR_PRINT', 2); +define('PEAR_ERROR_TRIGGER', 4); +define('PEAR_ERROR_DIE', 8); +define('PEAR_ERROR_CALLBACK', 16); +/** + * WARNING: obsolete + * @deprecated + */ +define('PEAR_ERROR_EXCEPTION', 32); +/**#@-*/ +define('PEAR_ZE2', (function_exists('version_compare') && + version_compare(zend_version(), "2-dev", "ge"))); + +if (substr(PHP_OS, 0, 3) == 'WIN') { + define('OS_WINDOWS', true); + define('OS_UNIX', false); + define('PEAR_OS', 'Windows'); +} else { + define('OS_WINDOWS', false); + define('OS_UNIX', true); + define('PEAR_OS', 'Unix'); // blatant assumption +} + +// instant backwards compatibility +if (!defined('PATH_SEPARATOR')) { + if (OS_WINDOWS) { + define('PATH_SEPARATOR', ';'); + } else { + define('PATH_SEPARATOR', ':'); + } +} + +$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN; +$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; +$GLOBALS['_PEAR_destructor_object_list'] = array(); +$GLOBALS['_PEAR_shutdown_funcs'] = array(); +$GLOBALS['_PEAR_error_handler_stack'] = array(); + +@ini_set('track_errors', true); + +/** + * Base class for other PEAR classes. Provides rudimentary + * emulation of destructors. + * + * If you want a destructor in your class, inherit PEAR and make a + * destructor method called _yourclassname (same name as the + * constructor, but with a "_" prefix). Also, in your constructor you + * have to call the PEAR constructor: $this->PEAR();. + * The destructor method will be called without parameters. Note that + * at in some SAPI implementations (such as Apache), any output during + * the request shutdown (in which destructors are called) seems to be + * discarded. If you need to get any debug information from your + * destructor, use error_log(), syslog() or something similar. + * + * IMPORTANT! To use the emulated destructors you need to create the + * objects by reference: $obj =& new PEAR_child; + * + * @category pear + * @package PEAR + * @author Stig Bakken + * @author Tomas V.V. Cox + * @author Greg Beaver + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.4.5 + * @link http://pear.php.net/package/PEAR + * @see PEAR_Error + * @since Class available since PHP 4.0.2 + * @link http://pear.php.net/manual/en/core.pear.php#core.pear.pear + */ +class PEAR +{ + // {{{ properties + + /** + * Whether to enable internal debug messages. + * + * @var bool + * @access private + */ + var $_debug = false; + + /** + * Default error mode for this object. + * + * @var int + * @access private + */ + var $_default_error_mode = null; + + /** + * Default error options used for this object when error mode + * is PEAR_ERROR_TRIGGER. + * + * @var int + * @access private + */ + var $_default_error_options = null; + + /** + * Default error handler (callback) for this object, if error mode is + * PEAR_ERROR_CALLBACK. + * + * @var string + * @access private + */ + var $_default_error_handler = ''; + + /** + * Which class to use for error objects. + * + * @var string + * @access private + */ + var $_error_class = 'PEAR_Error'; + + /** + * An array of expected errors. + * + * @var array + * @access private + */ + var $_expected_errors = array(); + + // }}} + + // {{{ constructor + + /** + * Constructor. Registers this object in + * $_PEAR_destructor_object_list for destructor emulation if a + * destructor object exists. + * + * @param string $error_class (optional) which class to use for + * error objects, defaults to PEAR_Error. + * @access public + * @return void + */ + function PEAR($error_class = null) + { + $classname = strtolower(get_class($this)); + if ($this->_debug) { + print "PEAR constructor called, class=$classname\n"; + } + if ($error_class !== null) { + $this->_error_class = $error_class; + } + while ($classname && strcasecmp($classname, "pear")) { + $destructor = "_$classname"; + if (method_exists($this, $destructor)) { + global $_PEAR_destructor_object_list; + $_PEAR_destructor_object_list[] = &$this; + if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { + register_shutdown_function("_PEAR_call_destructors"); + $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; + } + break; + } else { + $classname = get_parent_class($classname); + } + } + } + + // }}} + // {{{ destructor + + /** + * Destructor (the emulated type of...). Does nothing right now, + * but is included for forward compatibility, so subclass + * destructors should always call it. + * + * See the note in the class desciption about output from + * destructors. + * + * @access public + * @return void + */ + function _PEAR() { + if ($this->_debug) { + printf("PEAR destructor called, class=%s\n", strtolower(get_class($this))); + } + } + + // }}} + // {{{ getStaticProperty() + + /** + * If you have a class that's mostly/entirely static, and you need static + * properties, you can use this method to simulate them. Eg. in your method(s) + * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar'); + * You MUST use a reference, or they will not persist! + * + * @access public + * @param string $class The calling classname, to prevent clashes + * @param string $var The variable to retrieve. + * @return mixed A reference to the variable. If not set it will be + * auto initialised to NULL. + */ + function &getStaticProperty($class, $var) + { + static $properties; + return $properties[$class][$var]; + } + + // }}} + // {{{ registerShutdownFunc() + + /** + * Use this function to register a shutdown method for static + * classes. + * + * @access public + * @param mixed $func The function name (or array of class/method) to call + * @param mixed $args The arguments to pass to the function + * @return void + */ + function registerShutdownFunc($func, $args = array()) + { + $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args); + } + + // }}} + // {{{ isError() + + /** + * Tell whether a value is a PEAR error. + * + * @param mixed $data the value to test + * @param int $code if $data is an error object, return true + * only if $code is a string and + * $obj->getMessage() == $code or + * $code is an integer and $obj->getCode() == $code + * @access public + * @return bool true if parameter is an error + */ + function isError($data, $code = null) + { + if (is_a($data, 'PEAR_Error')) { + if (is_null($code)) { + return true; + } elseif (is_string($code)) { + return $data->getMessage() == $code; + } else { + return $data->getCode() == $code; + } + } + return false; + } + + // }}} + // {{{ setErrorHandling() + + /** + * Sets how errors generated by this object should be handled. + * Can be invoked both in objects and statically. If called + * statically, setErrorHandling sets the default behaviour for all + * PEAR objects. If called in an object, setErrorHandling sets + * the default behaviour for that object. + * + * @param int $mode + * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, + * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION. + * + * @param mixed $options + * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one + * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). + * + * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected + * to be the callback function or method. A callback + * function is a string with the name of the function, a + * callback method is an array of two elements: the element + * at index 0 is the object, and the element at index 1 is + * the name of the method to call in the object. + * + * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is + * a printf format string used when printing the error + * message. + * + * @access public + * @return void + * @see PEAR_ERROR_RETURN + * @see PEAR_ERROR_PRINT + * @see PEAR_ERROR_TRIGGER + * @see PEAR_ERROR_DIE + * @see PEAR_ERROR_CALLBACK + * @see PEAR_ERROR_EXCEPTION + * + * @since PHP 4.0.5 + */ + + function setErrorHandling($mode = null, $options = null) + { + if (isset($this) && is_a($this, 'PEAR')) { + $setmode = &$this->_default_error_mode; + $setoptions = &$this->_default_error_options; + } else { + $setmode = &$GLOBALS['_PEAR_default_error_mode']; + $setoptions = &$GLOBALS['_PEAR_default_error_options']; + } + + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $setmode = $mode; + $setoptions = $options; + break; + + case PEAR_ERROR_CALLBACK: + $setmode = $mode; + // class/object method callback + if (is_callable($options)) { + $setoptions = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + } + + // }}} + // {{{ expectError() + + /** + * This method is used to tell which errors you expect to get. + * Expected errors are always returned with error mode + * PEAR_ERROR_RETURN. Expected error codes are stored in a stack, + * and this method pushes a new element onto it. The list of + * expected errors are in effect until they are popped off the + * stack with the popExpect() method. + * + * Note that this method can not be called statically + * + * @param mixed $code a single error code or an array of error codes to expect + * + * @return int the new depth of the "expected errors" stack + * @access public + */ + function expectError($code = '*') + { + if (is_array($code)) { + array_push($this->_expected_errors, $code); + } else { + array_push($this->_expected_errors, array($code)); + } + return sizeof($this->_expected_errors); + } + + // }}} + // {{{ popExpect() + + /** + * This method pops one element off the expected error codes + * stack. + * + * @return array the list of error codes that were popped + */ + function popExpect() + { + return array_pop($this->_expected_errors); + } + + // }}} + // {{{ _checkDelExpect() + + /** + * This method checks unsets an error code if available + * + * @param mixed error code + * @return bool true if the error code was unset, false otherwise + * @access private + * @since PHP 4.3.0 + */ + function _checkDelExpect($error_code) + { + $deleted = false; + + foreach ($this->_expected_errors AS $key => $error_array) { + if (in_array($error_code, $error_array)) { + unset($this->_expected_errors[$key][array_search($error_code, $error_array)]); + $deleted = true; + } + + // clean up empty arrays + if (0 == count($this->_expected_errors[$key])) { + unset($this->_expected_errors[$key]); + } + } + return $deleted; + } + + // }}} + // {{{ delExpect() + + /** + * This method deletes all occurences of the specified element from + * the expected error codes stack. + * + * @param mixed $error_code error code that should be deleted + * @return mixed list of error codes that were deleted or error + * @access public + * @since PHP 4.3.0 + */ + function delExpect($error_code) + { + $deleted = false; + + if ((is_array($error_code) && (0 != count($error_code)))) { + // $error_code is a non-empty array here; + // we walk through it trying to unset all + // values + foreach($error_code as $key => $error) { + if ($this->_checkDelExpect($error)) { + $deleted = true; + } else { + $deleted = false; + } + } + return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME + } elseif (!empty($error_code)) { + // $error_code comes alone, trying to unset it + if ($this->_checkDelExpect($error_code)) { + return true; + } else { + return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME + } + } else { + // $error_code is empty + return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME + } + } + + // }}} + // {{{ raiseError() + + /** + * This method is a wrapper that returns an instance of the + * configured error class with this object's default error + * handling applied. If the $mode and $options parameters are not + * specified, the object's defaults are used. + * + * @param mixed $message a text error message or a PEAR error object + * + * @param int $code a numeric error code (it is up to your class + * to define these if you want to use codes) + * + * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, + * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION. + * + * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter + * specifies the PHP-internal error level (one of + * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). + * If $mode is PEAR_ERROR_CALLBACK, this + * parameter specifies the callback function or + * method. In other error modes this parameter + * is ignored. + * + * @param string $userinfo If you need to pass along for example debug + * information, this parameter is meant for that. + * + * @param string $error_class The returned error object will be + * instantiated from this class, if specified. + * + * @param bool $skipmsg If true, raiseError will only pass error codes, + * the error message parameter will be dropped. + * + * @access public + * @return object a PEAR error object + * @see PEAR::setErrorHandling + * @since PHP 4.0.5 + */ + function &raiseError($message = null, + $code = null, + $mode = null, + $options = null, + $userinfo = null, + $error_class = null, + $skipmsg = false) + { + // The error is yet a PEAR error object + if (is_object($message)) { + $code = $message->getCode(); + $userinfo = $message->getUserInfo(); + $error_class = $message->getType(); + $message->error_message_prefix = ''; + $message = $message->getMessage(); + } + + if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) { + if ($exp[0] == "*" || + (is_int(reset($exp)) && in_array($code, $exp)) || + (is_string(reset($exp)) && in_array($message, $exp))) { + $mode = PEAR_ERROR_RETURN; + } + } + // No mode given, try global ones + if ($mode === null) { + // Class error handler + if (isset($this) && isset($this->_default_error_mode)) { + $mode = $this->_default_error_mode; + $options = $this->_default_error_options; + // Global error handler + } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) { + $mode = $GLOBALS['_PEAR_default_error_mode']; + $options = $GLOBALS['_PEAR_default_error_options']; + } + } + + if ($error_class !== null) { + $ec = $error_class; + } elseif (isset($this) && isset($this->_error_class)) { + $ec = $this->_error_class; + } else { + $ec = 'PEAR_Error'; + } + if ($skipmsg) { + $a = &new $ec($code, $mode, $options, $userinfo); + return $a; + } else { + $a = &new $ec($message, $code, $mode, $options, $userinfo); + return $a; + } + } + + // }}} + // {{{ throwError() + + /** + * Simpler form of raiseError with fewer options. In most cases + * message, code and userinfo are enough. + * + * @param string $message + * + */ + function &throwError($message = null, + $code = null, + $userinfo = null) + { + if (isset($this) && is_a($this, 'PEAR')) { + $a = &$this->raiseError($message, $code, null, null, $userinfo); + return $a; + } else { + $a = &PEAR::raiseError($message, $code, null, null, $userinfo); + return $a; + } + } + + // }}} + function staticPushErrorHandling($mode, $options = null) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + $def_mode = &$GLOBALS['_PEAR_default_error_mode']; + $def_options = &$GLOBALS['_PEAR_default_error_options']; + $stack[] = array($def_mode, $def_options); + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $def_mode = $mode; + $def_options = $options; + break; + + case PEAR_ERROR_CALLBACK: + $def_mode = $mode; + // class/object method callback + if (is_callable($options)) { + $def_options = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + $stack[] = array($mode, $options); + return true; + } + + function staticPopErrorHandling() + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + $setmode = &$GLOBALS['_PEAR_default_error_mode']; + $setoptions = &$GLOBALS['_PEAR_default_error_options']; + array_pop($stack); + list($mode, $options) = $stack[sizeof($stack) - 1]; + array_pop($stack); + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $setmode = $mode; + $setoptions = $options; + break; + + case PEAR_ERROR_CALLBACK: + $setmode = $mode; + // class/object method callback + if (is_callable($options)) { + $setoptions = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + return true; + } + + // {{{ pushErrorHandling() + + /** + * Push a new error handler on top of the error handler options stack. With this + * you can easily override the actual error handler for some code and restore + * it later with popErrorHandling. + * + * @param mixed $mode (same as setErrorHandling) + * @param mixed $options (same as setErrorHandling) + * + * @return bool Always true + * + * @see PEAR::setErrorHandling + */ + function pushErrorHandling($mode, $options = null) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + if (isset($this) && is_a($this, 'PEAR')) { + $def_mode = &$this->_default_error_mode; + $def_options = &$this->_default_error_options; + } else { + $def_mode = &$GLOBALS['_PEAR_default_error_mode']; + $def_options = &$GLOBALS['_PEAR_default_error_options']; + } + $stack[] = array($def_mode, $def_options); + + if (isset($this) && is_a($this, 'PEAR')) { + $this->setErrorHandling($mode, $options); + } else { + PEAR::setErrorHandling($mode, $options); + } + $stack[] = array($mode, $options); + return true; + } + + // }}} + // {{{ popErrorHandling() + + /** + * Pop the last error handler used + * + * @return bool Always true + * + * @see PEAR::pushErrorHandling + */ + function popErrorHandling() + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + array_pop($stack); + list($mode, $options) = $stack[sizeof($stack) - 1]; + array_pop($stack); + if (isset($this) && is_a($this, 'PEAR')) { + $this->setErrorHandling($mode, $options); + } else { + PEAR::setErrorHandling($mode, $options); + } + return true; + } + + // }}} + // {{{ loadExtension() + + /** + * OS independant PHP extension load. Remember to take care + * on the correct extension name for case sensitive OSes. + * + * @param string $ext The extension name + * @return bool Success or not on the dl() call + */ + function loadExtension($ext) + { + if (!extension_loaded($ext)) { + // if either returns true dl() will produce a FATAL error, stop that + if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) { + return false; + } + if (OS_WINDOWS) { + $suffix = '.dll'; + } elseif (PHP_OS == 'HP-UX') { + $suffix = '.sl'; + } elseif (PHP_OS == 'AIX') { + $suffix = '.a'; + } elseif (PHP_OS == 'OSX') { + $suffix = '.bundle'; + } else { + $suffix = '.so'; + } + return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix); + } + return true; + } + + // }}} +} + +// {{{ _PEAR_call_destructors() + +function _PEAR_call_destructors() +{ + global $_PEAR_destructor_object_list; + if (is_array($_PEAR_destructor_object_list) && + sizeof($_PEAR_destructor_object_list)) + { + reset($_PEAR_destructor_object_list); + if (@PEAR::getStaticProperty('PEAR', 'destructlifo')) { + $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list); + } + while (list($k, $objref) = each($_PEAR_destructor_object_list)) { + $classname = get_class($objref); + while ($classname) { + $destructor = "_$classname"; + if (method_exists($objref, $destructor)) { + $objref->$destructor(); + break; + } else { + $classname = get_parent_class($classname); + } + } + } + // Empty the object list to ensure that destructors are + // not called more than once. + $_PEAR_destructor_object_list = array(); + } + + // Now call the shutdown functions + if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) { + foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) { + call_user_func_array($value[0], $value[1]); + } + } +} + +// }}} +/** + * Standard PEAR error class for PHP 4 + * + * This class is supserseded by {@link PEAR_Exception} in PHP 5 + * + * @category pear + * @package PEAR + * @author Stig Bakken + * @author Tomas V.V. Cox + * @author Gregory Beaver + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.4.5 + * @link http://pear.php.net/manual/en/core.pear.pear-error.php + * @see PEAR::raiseError(), PEAR::throwError() + * @since Class available since PHP 4.0.2 + */ +class PEAR_Error +{ + // {{{ properties + + var $error_message_prefix = ''; + var $mode = PEAR_ERROR_RETURN; + var $level = E_USER_NOTICE; + var $code = -1; + var $message = ''; + var $userinfo = ''; + var $backtrace = null; + + // }}} + // {{{ constructor + + /** + * PEAR_Error constructor + * + * @param string $message message + * + * @param int $code (optional) error code + * + * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN, + * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER, + * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION + * + * @param mixed $options (optional) error level, _OR_ in the case of + * PEAR_ERROR_CALLBACK, the callback function or object/method + * tuple. + * + * @param string $userinfo (optional) additional user/debug info + * + * @access public + * + */ + function PEAR_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + if ($mode === null) { + $mode = PEAR_ERROR_RETURN; + } + $this->message = $message; + $this->code = $code; + $this->mode = $mode; + $this->userinfo = $userinfo; + if (function_exists("debug_backtrace")) { + if (@!PEAR::getStaticProperty('PEAR_Error', 'skiptrace')) { + $this->backtrace = debug_backtrace(); + } + } + if ($mode & PEAR_ERROR_CALLBACK) { + $this->level = E_USER_NOTICE; + $this->callback = $options; + } else { + if ($options === null) { + $options = E_USER_NOTICE; + } + $this->level = $options; + $this->callback = null; + } + if ($this->mode & PEAR_ERROR_PRINT) { + if (is_null($options) || is_int($options)) { + $format = "%s"; + } else { + $format = $options; + } + printf($format, $this->getMessage()); + } + if ($this->mode & PEAR_ERROR_TRIGGER) { + trigger_error($this->getMessage(), $this->level); + } + if ($this->mode & PEAR_ERROR_DIE) { + $msg = $this->getMessage(); + if (is_null($options) || is_int($options)) { + $format = "%s"; + if (substr($msg, -1) != "\n") { + $msg .= "\n"; + } + } else { + $format = $options; + } + die(sprintf($format, $msg)); + } + if ($this->mode & PEAR_ERROR_CALLBACK) { + if (is_callable($this->callback)) { + call_user_func($this->callback, $this); + } + } + if ($this->mode & PEAR_ERROR_EXCEPTION) { + trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING); + eval('$e = new Exception($this->message, $this->code);throw($e);'); + } + } + + // }}} + // {{{ getMode() + + /** + * Get the error mode from an error object. + * + * @return int error mode + * @access public + */ + function getMode() { + return $this->mode; + } + + // }}} + // {{{ getCallback() + + /** + * Get the callback function/method from an error object. + * + * @return mixed callback function or object/method array + * @access public + */ + function getCallback() { + return $this->callback; + } + + // }}} + // {{{ getMessage() + + + /** + * Get the error message from an error object. + * + * @return string full error message + * @access public + */ + function getMessage() + { + return ($this->error_message_prefix . $this->message); + } + + + // }}} + // {{{ getCode() + + /** + * Get error code from an error object + * + * @return int error code + * @access public + */ + function getCode() + { + return $this->code; + } + + // }}} + // {{{ getType() + + /** + * Get the name of this error/exception. + * + * @return string error/exception name (type) + * @access public + */ + function getType() + { + return get_class($this); + } + + // }}} + // {{{ getUserInfo() + + /** + * Get additional user-supplied information. + * + * @return string user-supplied information + * @access public + */ + function getUserInfo() + { + return $this->userinfo; + } + + // }}} + // {{{ getDebugInfo() + + /** + * Get additional debug information supplied by the application. + * + * @return string debug information + * @access public + */ + function getDebugInfo() + { + return $this->getUserInfo(); + } + + // }}} + // {{{ getBacktrace() + + /** + * Get the call backtrace from where the error was generated. + * Supported with PHP 4.3.0 or newer. + * + * @param int $frame (optional) what frame to fetch + * @return array Backtrace, or NULL if not available. + * @access public + */ + function getBacktrace($frame = null) + { + if (defined('PEAR_IGNORE_BACKTRACE')) { + return null; + } + if ($frame === null) { + return $this->backtrace; + } + return $this->backtrace[$frame]; + } + + // }}} + // {{{ addUserInfo() + + function addUserInfo($info) + { + if (empty($this->userinfo)) { + $this->userinfo = $info; + } else { + $this->userinfo .= " ** $info"; + } + } + + // }}} + // {{{ toString() + + /** + * Make a string representation of this object. + * + * @return string a string with an object summary + * @access public + */ + function toString() { + $modes = array(); + $levels = array(E_USER_NOTICE => 'notice', + E_USER_WARNING => 'warning', + E_USER_ERROR => 'error'); + if ($this->mode & PEAR_ERROR_CALLBACK) { + if (is_array($this->callback)) { + $callback = (is_object($this->callback[0]) ? + strtolower(get_class($this->callback[0])) : + $this->callback[0]) . '::' . + $this->callback[1]; + } else { + $callback = $this->callback; + } + return sprintf('[%s: message="%s" code=%d mode=callback '. + 'callback=%s prefix="%s" info="%s"]', + strtolower(get_class($this)), $this->message, $this->code, + $callback, $this->error_message_prefix, + $this->userinfo); + } + if ($this->mode & PEAR_ERROR_PRINT) { + $modes[] = 'print'; + } + if ($this->mode & PEAR_ERROR_TRIGGER) { + $modes[] = 'trigger'; + } + if ($this->mode & PEAR_ERROR_DIE) { + $modes[] = 'die'; + } + if ($this->mode & PEAR_ERROR_RETURN) { + $modes[] = 'return'; + } + return sprintf('[%s: message="%s" code=%d mode=%s level=%s '. + 'prefix="%s" info="%s"]', + strtolower(get_class($this)), $this->message, $this->code, + implode("|", $modes), $levels[$this->level], + $this->error_message_prefix, + $this->userinfo); + } + + // }}} +} + +/* + * Local Variables: + * mode: php + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ +?> diff --git a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer.php b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer.php new file mode 100644 index 00000000..ac29404c --- /dev/null +++ b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer.php @@ -0,0 +1,105 @@ + +* +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} +require_once $homedir.'/classes/pear/PEAR.php'; +require_once $homedir.'/classes/pear/Spreadsheet/Excel/Writer/Workbook.php'; + +/** +* Class for writing Excel Spreadsheets. This class should change COMPLETELY. +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer extends Spreadsheet_Excel_Writer_Workbook +{ + /** + * The constructor. It just creates a Workbook + * + * @param string $filename The optional filename for the Workbook. + * @return Spreadsheet_Excel_Writer_Workbook The Workbook created + */ + function Spreadsheet_Excel_Writer($filename = '') + { + $this->_filename = $filename; + $this->Spreadsheet_Excel_Writer_Workbook($filename); + } + + /** + * Send HTTP headers for the Excel file. + * + * @param string $filename The filename to use for HTTP headers + * @access public + */ + function send($filename) + { + header("Content-type: application/vnd.ms-excel"); + header("Content-Disposition: attachment; filename=\"$filename\""); + header("Expires: 0"); + header("Cache-Control: must-revalidate, post-check=0,pre-check=0"); + header("Pragma: public"); + } + + /** + * Utility function for writing formulas + * Converts a cell's coordinates to the A1 format. + * + * @access public + * @static + * @param integer $row Row for the cell to convert (0-indexed). + * @param integer $col Column for the cell to convert (0-indexed). + * @return string The cell identifier in A1 format + */ + function rowcolToCell($row, $col) + { + if ($col > 255) { //maximum column value exceeded + return new PEAR_Error("Maximum column value exceeded: $col"); + } + + $int = (int)($col / 26); + $frac = $col % 26; + $chr1 = ''; + + if ($int > 0) { + $chr1 = chr(ord('A') + $int - 1); + } + + $chr2 = chr(ord('A') + $frac); + $row++; + + return $chr1 . $chr2 . $row; + } +} +?> diff --git a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/BIFFwriter.php b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/BIFFwriter.php new file mode 100644 index 00000000..bbf861ed --- /dev/null +++ b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/BIFFwriter.php @@ -0,0 +1,239 @@ + +* +* The majority of this is _NOT_ my code. I simply ported it from the +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@php.net +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} +require_once $homedir.'/classes/pear/PEAR.php'; + +/** +* Class for writing Excel BIFF records. +* +* From "MICROSOFT EXCEL BINARY FILE FORMAT" by Mark O'Brien (Microsoft Corporation): +* +* BIFF (BInary File Format) is the file format in which Excel documents are +* saved on disk. A BIFF file is a complete description of an Excel document. +* BIFF files consist of sequences of variable-length records. There are many +* different types of BIFF records. For example, one record type describes a +* formula entered into a cell; one describes the size and location of a +* window into a document; another describes a picture format. +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_BIFFwriter extends PEAR +{ + /** + * The BIFF/Excel version (5). + * @var integer + */ + var $_BIFF_version = 0x0500; + + /** + * The byte order of this architecture. 0 => little endian, 1 => big endian + * @var integer + */ + var $_byte_order; + + /** + * The string containing the data of the BIFF stream + * @var string + */ + var $_data; + + /** + * The size of the data in bytes. Should be the same as strlen($this->_data) + * @var integer + */ + var $_datasize; + + /** + * The maximun length for a BIFF record. See _addContinue() + * @var integer + * @see _addContinue() + */ + var $_limit; + + /** + * Constructor + * + * @access public + */ + function Spreadsheet_Excel_Writer_BIFFwriter() + { + $this->_byte_order = ''; + $this->_data = ''; + $this->_datasize = 0; + $this->_limit = 2080; + // Set the byte order + $this->_setByteOrder(); + } + + /** + * Determine the byte order and store it as class data to avoid + * recalculating it for each call to new(). + * + * @access private + */ + function _setByteOrder() + { + // Check if "pack" gives the required IEEE 64bit float + $teststr = pack("d", 1.2345); + $number = pack("C8", 0x8D, 0x97, 0x6E, 0x12, 0x83, 0xC0, 0xF3, 0x3F); + if ($number == $teststr) { + $byte_order = 0; // Little Endian + } elseif ($number == strrev($teststr)){ + $byte_order = 1; // Big Endian + } else { + // Give up. I'll fix this in a later version. + return $this->raiseError("Required floating point format ". + "not supported on this platform."); + } + $this->_byte_order = $byte_order; + } + + /** + * General storage function + * + * @param string $data binary data to prepend + * @access private + */ + function _prepend($data) + { + if (strlen($data) > $this->_limit) { + $data = $this->_addContinue($data); + } + $this->_data = $data.$this->_data; + $this->_datasize += strlen($data); + } + + /** + * General storage function + * + * @param string $data binary data to append + * @access private + */ + function _append($data) + { + if (strlen($data) > $this->_limit) { + $data = $this->_addContinue($data); + } + $this->_data = $this->_data.$data; + $this->_datasize += strlen($data); + } + + /** + * Writes Excel BOF record to indicate the beginning of a stream or + * sub-stream in the BIFF file. + * + * @param integer $type Type of BIFF file to write: 0x0005 Workbook, + * 0x0010 Worksheet. + * @access private + */ + function _storeBof($type) + { + $record = 0x0809; // Record identifier + + // According to the SDK $build and $year should be set to zero. + // However, this throws a warning in Excel 5. So, use magic numbers. + if ($this->_BIFF_version == 0x0500) { + $length = 0x0008; + $unknown = ''; + $build = 0x096C; + $year = 0x07C9; + } elseif ($this->_BIFF_version == 0x0600) { + $length = 0x0010; + $unknown = pack("VV", 0x00000041, 0x00000006); //unknown last 8 bytes for BIFF8 + $build = 0x0DBB; + $year = 0x07CC; + } + $version = $this->_BIFF_version; + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $version, $type, $build, $year); + $this->_prepend($header . $data . $unknown); + } + + /** + * Writes Excel EOF record to indicate the end of a BIFF stream. + * + * @access private + */ + function _storeEof() + { + $record = 0x000A; // Record identifier + $length = 0x0000; // Number of bytes to follow + $header = pack("vv", $record, $length); + $this->_append($header); + } + + /** + * Excel limits the size of BIFF records. In Excel 5 the limit is 2084 bytes. In + * Excel 97 the limit is 8228 bytes. Records that are longer than these limits + * must be split up into CONTINUE blocks. + * + * This function takes a long BIFF record and inserts CONTINUE records as + * necessary. + * + * @param string $data The original binary data to be written + * @return string A very convenient string of continue blocks + * @access private + */ + function _addContinue($data) + { + $limit = $this->_limit; + $record = 0x003C; // Record identifier + + // The first 2080/8224 bytes remain intact. However, we have to change + // the length field of the record. + $tmp = substr($data, 0, 2).pack("v", $limit-4).substr($data, 4, $limit - 4); + + $header = pack("vv", $record, $limit); // Headers for continue records + + // Retrieve chunks of 2080/8224 bytes +4 for the header. + $data_length = strlen($data); + for ($i = $limit; $i < ($data_length - $limit); $i += $limit) { + $tmp .= $header; + $tmp .= substr($data, $i, $limit); + } + + // Retrieve the last chunk of data + $header = pack("vv", $record, strlen($data) - $i); + $tmp .= $header; + $tmp .= substr($data, $i, strlen($data) - $i); + + return $tmp; + } +} +?> diff --git a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Format.php b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Format.php new file mode 100644 index 00000000..45a0cee5 --- /dev/null +++ b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Format.php @@ -0,0 +1,1103 @@ + +* +* The majority of this is _NOT_ my code. I simply ported it from the +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} +require_once $homedir.'/classes/pear/PEAR.php'; + +/** +* Class for generating Excel XF records (formats) +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_Format extends PEAR +{ + /** + * The index given by the workbook when creating a new format. + * @var integer + */ + var $_xf_index; + + /** + * Index to the FONT record. + * @var integer + */ + var $font_index; + + /** + * The font name (ASCII). + * @var string + */ + var $_font_name; + + /** + * Height of font (1/20 of a point) + * @var integer + */ + var $_size; + + /** + * Bold style + * @var integer + */ + var $_bold; + + /** + * Bit specifiying if the font is italic. + * @var integer + */ + var $_italic; + + /** + * Index to the cell's color + * @var integer + */ + var $_color; + + /** + * The text underline property + * @var integer + */ + var $_underline; + + /** + * Bit specifiying if the font has strikeout. + * @var integer + */ + var $_font_strikeout; + + /** + * Bit specifiying if the font has outline. + * @var integer + */ + var $_font_outline; + + /** + * Bit specifiying if the font has shadow. + * @var integer + */ + var $_font_shadow; + + /** + * 2 bytes specifiying the script type for the font. + * @var integer + */ + var $_font_script; + + /** + * Byte specifiying the font family. + * @var integer + */ + var $_font_family; + + /** + * Byte specifiying the font charset. + * @var integer + */ + var $_font_charset; + + /** + * An index (2 bytes) to a FORMAT record (number format). + * @var integer + */ + var $_num_format; + + /** + * Bit specifying if formulas are hidden. + * @var integer + */ + var $_hidden; + + /** + * Bit specifying if the cell is locked. + * @var integer + */ + var $_locked; + + /** + * The three bits specifying the text horizontal alignment. + * @var integer + */ + var $_text_h_align; + + /** + * Bit specifying if the text is wrapped at the right border. + * @var integer + */ + var $_text_wrap; + + /** + * The three bits specifying the text vertical alignment. + * @var integer + */ + var $_text_v_align; + + /** + * 1 bit, apparently not used. + * @var integer + */ + var $_text_justlast; + + /** + * The two bits specifying the text rotation. + * @var integer + */ + var $_rotation; + + /** + * The cell's foreground color. + * @var integer + */ + var $_fg_color; + + /** + * The cell's background color. + * @var integer + */ + var $_bg_color; + + /** + * The cell's background fill pattern. + * @var integer + */ + var $_pattern; + + /** + * Style of the bottom border of the cell + * @var integer + */ + var $_bottom; + + /** + * Color of the bottom border of the cell. + * @var integer + */ + var $_bottom_color; + + /** + * Style of the top border of the cell + * @var integer + */ + var $_top; + + /** + * Color of the top border of the cell. + * @var integer + */ + var $_top_color; + + /** + * Style of the left border of the cell + * @var integer + */ + var $_left; + + /** + * Color of the left border of the cell. + * @var integer + */ + var $_left_color; + + /** + * Style of the right border of the cell + * @var integer + */ + var $_right; + + /** + * Color of the right border of the cell. + * @var integer + */ + var $_right_color; + + /** + * Constructor + * + * @access private + * @param integer $index the XF index for the format. + * @param array $properties array with properties to be set on initialization. + */ + function Spreadsheet_Excel_Writer_Format($BIFF_version, $index = 0, $properties = array()) + { + $this->_xf_index = $index; + $this->_BIFF_version = $BIFF_version; + $this->font_index = 0; + $this->_font_name = 'Arial'; + $this->_size = 10; + $this->_bold = 0x0190; + $this->_italic = 0; + $this->_color = 0x7FFF; + $this->_underline = 0; + $this->_font_strikeout = 0; + $this->_font_outline = 0; + $this->_font_shadow = 0; + $this->_font_script = 0; + $this->_font_family = 0; + $this->_font_charset = 0; + + $this->_num_format = 0; + + $this->_hidden = 0; + $this->_locked = 0; + + $this->_text_h_align = 0; + $this->_text_wrap = 0; + $this->_text_v_align = 2; + $this->_text_justlast = 0; + $this->_rotation = 0; + + $this->_fg_color = 0x40; + $this->_bg_color = 0x41; + + $this->_pattern = 0; + + $this->_bottom = 0; + $this->_top = 0; + $this->_left = 0; + $this->_right = 0; + $this->_diag = 0; + + $this->_bottom_color = 0x40; + $this->_top_color = 0x40; + $this->_left_color = 0x40; + $this->_right_color = 0x40; + $this->_diag_color = 0x40; + + // Set properties passed to Spreadsheet_Excel_Writer_Workbook::addFormat() + foreach ($properties as $property => $value) + { + if (method_exists($this, 'set'.ucwords($property))) { + $method_name = 'set'.ucwords($property); + $this->$method_name($value); + } + } + } + + + /** + * Generate an Excel BIFF XF record (style or cell). + * + * @param string $style The type of the XF record ('style' or 'cell'). + * @return string The XF record + */ + function getXf($style) + { + // Set the type of the XF record and some of the attributes. + if ($style == 'style') { + $style = 0xFFF5; + } else { + $style = $this->_locked; + $style |= $this->_hidden << 1; + } + + // Flags to indicate if attributes have been set. + $atr_num = ($this->_num_format != 0)?1:0; + $atr_fnt = ($this->font_index != 0)?1:0; + $atr_alc = ($this->_text_wrap)?1:0; + $atr_bdr = ($this->_bottom || + $this->_top || + $this->_left || + $this->_right)?1:0; + $atr_pat = (($this->_fg_color != 0x40) || + ($this->_bg_color != 0x41) || + $this->_pattern)?1:0; + $atr_prot = $this->_locked | $this->_hidden; + + // Zero the default border colour if the border has not been set. + if ($this->_bottom == 0) { + $this->_bottom_color = 0; + } + if ($this->_top == 0) { + $this->_top_color = 0; + } + if ($this->_right == 0) { + $this->_right_color = 0; + } + if ($this->_left == 0) { + $this->_left_color = 0; + } + if ($this->_diag == 0) { + $this->_diag_color = 0; + } + + $record = 0x00E0; // Record identifier + if ($this->_BIFF_version == 0x0500) { + $length = 0x0010; // Number of bytes to follow + } + if ($this->_BIFF_version == 0x0600) { + $length = 0x0014; + } + + $ifnt = $this->font_index; // Index to FONT record + $ifmt = $this->_num_format; // Index to FORMAT record + if ($this->_BIFF_version == 0x0500) { + $align = $this->_text_h_align; // Alignment + $align |= $this->_text_wrap << 3; + $align |= $this->_text_v_align << 4; + $align |= $this->_text_justlast << 7; + $align |= $this->_rotation << 8; + $align |= $atr_num << 10; + $align |= $atr_fnt << 11; + $align |= $atr_alc << 12; + $align |= $atr_bdr << 13; + $align |= $atr_pat << 14; + $align |= $atr_prot << 15; + + $icv = $this->_fg_color; // fg and bg pattern colors + $icv |= $this->_bg_color << 7; + + $fill = $this->_pattern; // Fill and border line style + $fill |= $this->_bottom << 6; + $fill |= $this->_bottom_color << 9; + + $border1 = $this->_top; // Border line style and color + $border1 |= $this->_left << 3; + $border1 |= $this->_right << 6; + $border1 |= $this->_top_color << 9; + + $border2 = $this->_left_color; // Border color + $border2 |= $this->_right_color << 7; + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvv", $ifnt, $ifmt, $style, $align, + $icv, $fill, + $border1, $border2); + } elseif ($this->_BIFF_version == 0x0600) { + $align = $this->_text_h_align; // Alignment + $align |= $this->_text_wrap << 3; + $align |= $this->_text_v_align << 4; + $align |= $this->_text_justlast << 7; + + $used_attrib = $atr_num << 2; + $used_attrib |= $atr_fnt << 3; + $used_attrib |= $atr_alc << 4; + $used_attrib |= $atr_bdr << 5; + $used_attrib |= $atr_pat << 6; + $used_attrib |= $atr_prot << 7; + + $icv = $this->_fg_color; // fg and bg pattern colors + $icv |= $this->_bg_color << 7; + + $border1 = $this->_left; // Border line style and color + $border1 |= $this->_right << 4; + $border1 |= $this->_top << 8; + $border1 |= $this->_bottom << 12; + $border1 |= $this->_left_color << 16; + $border1 |= $this->_right_color << 23; + $diag_tl_to_rb = 0; // FIXME: add method + $diag_tr_to_lb = 0; // FIXME: add method + $border1 |= $diag_tl_to_rb << 30; + $border1 |= $diag_tr_to_lb << 31; + + $border2 = $this->_top_color; // Border color + $border2 |= $this->_bottom_color << 7; + $border2 |= $this->_diag_color << 14; + $border2 |= $this->_diag << 21; + $border2 |= $this->_pattern << 26; + + $header = pack("vv", $record, $length); + + $rotation = 0x00; + $biff8_options = 0x00; + $data = pack("vvvC", $ifnt, $ifmt, $style, $align); + $data .= pack("CCC", $rotation, $biff8_options, $used_attrib); + $data .= pack("VVv", $border1, $border2, $icv); + } + + return($header . $data); + } + + /** + * Generate an Excel BIFF FONT record. + * + * @return string The FONT record + */ + function getFont() + { + $dyHeight = $this->_size * 20; // Height of font (1/20 of a point) + $icv = $this->_color; // Index to color palette + $bls = $this->_bold; // Bold style + $sss = $this->_font_script; // Superscript/subscript + $uls = $this->_underline; // Underline + $bFamily = $this->_font_family; // Font family + $bCharSet = $this->_font_charset; // Character set + $encoding = 0; // TODO: Unicode support + + $cch = strlen($this->_font_name); // Length of font name + $record = 0x31; // Record identifier + if ($this->_BIFF_version == 0x0500) { + $length = 0x0F + $cch; // Record length + } elseif ($this->_BIFF_version == 0x0600) { + $length = 0x10 + $cch; + } + $reserved = 0x00; // Reserved + $grbit = 0x00; // Font attributes + if ($this->_italic) { + $grbit |= 0x02; + } + if ($this->_font_strikeout) { + $grbit |= 0x08; + } + if ($this->_font_outline) { + $grbit |= 0x10; + } + if ($this->_font_shadow) { + $grbit |= 0x20; + } + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0500) { + $data = pack("vvvvvCCCCC", $dyHeight, $grbit, $icv, $bls, + $sss, $uls, $bFamily, + $bCharSet, $reserved, $cch); + } elseif ($this->_BIFF_version == 0x0600) { + $data = pack("vvvvvCCCCCC", $dyHeight, $grbit, $icv, $bls, + $sss, $uls, $bFamily, + $bCharSet, $reserved, $cch, $encoding); + } + return($header . $data . $this->_font_name); + } + + /** + * Returns a unique hash key for a font. + * Used by Spreadsheet_Excel_Writer_Workbook::_storeAllFonts() + * + * The elements that form the key are arranged to increase the probability of + * generating a unique key. Elements that hold a large range of numbers + * (eg. _color) are placed between two binary elements such as _italic + * + * @return string A key for this font + */ + function getFontKey() + { + $key = "$this->_font_name$this->_size"; + $key .= "$this->_font_script$this->_underline"; + $key .= "$this->_font_strikeout$this->_bold$this->_font_outline"; + $key .= "$this->_font_family$this->_font_charset"; + $key .= "$this->_font_shadow$this->_color$this->_italic"; + $key = str_replace(' ', '_', $key); + return ($key); + } + + /** + * Returns the index used by Spreadsheet_Excel_Writer_Worksheet::_XF() + * + * @return integer The index for the XF record + */ + function getXfIndex() + { + return($this->_xf_index); + } + + /** + * Used in conjunction with the set_xxx_color methods to convert a color + * string into a number. Color range is 0..63 but we will restrict it + * to 8..63 to comply with Gnumeric. Colors 0..7 are repeated in 8..15. + * + * @access private + * @param string $name_color name of the color (i.e.: 'blue', 'red', etc..). Optional. + * @return integer The color index + */ + function _getColor($name_color = '') + { + $colors = array( + 'aqua' => 0x0F, + 'cyan' => 0x0F, + 'black' => 0x08, + 'blue' => 0x0C, + 'brown' => 0x10, + 'magenta' => 0x0E, + 'fuchsia' => 0x0E, + 'gray' => 0x17, + 'grey' => 0x17, + 'green' => 0x11, + 'lime' => 0x0B, + 'navy' => 0x12, + 'orange' => 0x35, + 'purple' => 0x14, + 'red' => 0x0A, + 'silver' => 0x16, + 'white' => 0x09, + 'yellow' => 0x0D + ); + + // Return the default color, 0x7FFF, if undef, + if ($name_color == '') { + return(0x7FFF); + } + + // or the color string converted to an integer, + if (isset($colors[$name_color])) { + return($colors[$name_color]); + } + + // or the default color if string is unrecognised, + if (preg_match("/\D/",$name_color)) { + return(0x7FFF); + } + + // or an index < 8 mapped into the correct range, + if ($name_color < 8) { + return($name_color + 8); + } + + // or the default color if arg is outside range, + if ($name_color > 63) { + return(0x7FFF); + } + + // or an integer in the valid range + return($name_color); + } + + /** + * Set cell alignment. + * + * @access public + * @param string $location alignment for the cell ('left', 'right', etc...). + */ + function setAlign($location) + { + if (preg_match("/\d/",$location)) { + return; // Ignore numbers + } + + $location = strtolower($location); + + if ($location == 'left') { + $this->_text_h_align = 1; + } + if ($location == 'centre') { + $this->_text_h_align = 2; + } + if ($location == 'center') { + $this->_text_h_align = 2; + } + if ($location == 'right') { + $this->_text_h_align = 3; + } + if ($location == 'fill') { + $this->_text_h_align = 4; + } + if ($location == 'justify') { + $this->_text_h_align = 5; + } + if ($location == 'merge') { + $this->_text_h_align = 6; + } + if ($location == 'equal_space') { // For T.K. + $this->_text_h_align = 7; + } + if ($location == 'top') { + $this->_text_v_align = 0; + } + if ($location == 'vcentre') { + $this->_text_v_align = 1; + } + if ($location == 'vcenter') { + $this->_text_v_align = 1; + } + if ($location == 'bottom') { + $this->_text_v_align = 2; + } + if ($location == 'vjustify') { + $this->_text_v_align = 3; + } + if ($location == 'vequal_space') { // For T.K. + $this->_text_v_align = 4; + } + } + + /** + * Set cell horizontal alignment. + * + * @access public + * @param string $location alignment for the cell ('left', 'right', etc...). + */ + function setHAlign($location) + { + if (preg_match("/\d/",$location)) { + return; // Ignore numbers + } + + $location = strtolower($location); + + if ($location == 'left') { + $this->_text_h_align = 1; + } + if ($location == 'centre') { + $this->_text_h_align = 2; + } + if ($location == 'center') { + $this->_text_h_align = 2; + } + if ($location == 'right') { + $this->_text_h_align = 3; + } + if ($location == 'fill') { + $this->_text_h_align = 4; + } + if ($location == 'justify') { + $this->_text_h_align = 5; + } + if ($location == 'merge') { + $this->_text_h_align = 6; + } + if ($location == 'equal_space') { // For T.K. + $this->_text_h_align = 7; + } + } + + /** + * Set cell vertical alignment. + * + * @access public + * @param string $location alignment for the cell ('top', 'vleft', 'vright', etc...). + */ + function setVAlign($location) + { + if (preg_match("/\d/",$location)) { + return; // Ignore numbers + } + + $location = strtolower($location); + + if ($location == 'top') { + $this->_text_v_align = 0; + } + if ($location == 'vcentre') { + $this->_text_v_align = 1; + } + if ($location == 'vcenter') { + $this->_text_v_align = 1; + } + if ($location == 'bottom') { + $this->_text_v_align = 2; + } + if ($location == 'vjustify') { + $this->_text_v_align = 3; + } + if ($location == 'vequal_space') { // For T.K. + $this->_text_v_align = 4; + } + } + + /** + * This is an alias for the unintuitive setAlign('merge') + * + * @access public + */ + function setMerge() + { + $this->setAlign('merge'); + } + + /** + * Sets the boldness of the text. + * Bold has a range 100..1000. + * 0 (400) is normal. 1 (700) is bold. + * + * @access public + * @param integer $weight Weight for the text, 0 maps to 400 (normal text), + 1 maps to 700 (bold text). Valid range is: 100-1000. + It's Optional, default is 1 (bold). + */ + function setBold($weight = 1) + { + if ($weight == 1) { + $weight = 0x2BC; // Bold text + } + if ($weight == 0) { + $weight = 0x190; // Normal text + } + if ($weight < 0x064) { + $weight = 0x190; // Lower bound + } + if ($weight > 0x3E8) { + $weight = 0x190; // Upper bound + } + $this->_bold = $weight; + } + + + /************************************ + * FUNCTIONS FOR SETTING CELLS BORDERS + */ + + /** + * Sets the width for the bottom border of the cell + * + * @access public + * @param integer $style style of the cell border. 1 => thin, 2 => thick. + */ + function setBottom($style) + { + $this->_bottom = $style; + } + + /** + * Sets the width for the top border of the cell + * + * @access public + * @param integer $style style of the cell top border. 1 => thin, 2 => thick. + */ + function setTop($style) + { + $this->_top = $style; + } + + /** + * Sets the width for the left border of the cell + * + * @access public + * @param integer $style style of the cell left border. 1 => thin, 2 => thick. + */ + function setLeft($style) + { + $this->_left = $style; + } + + /** + * Sets the width for the right border of the cell + * + * @access public + * @param integer $style style of the cell right border. 1 => thin, 2 => thick. + */ + function setRight($style) + { + $this->_right = $style; + } + + + /** + * Set cells borders to the same style + * + * @access public + * @param integer $style style to apply for all cell borders. 1 => thin, 2 => thick. + */ + function setBorder($style) + { + $this->setBottom($style); + $this->setTop($style); + $this->setLeft($style); + $this->setRight($style); + } + + + /******************************************* + * FUNCTIONS FOR SETTING CELLS BORDERS COLORS + */ + + /** + * Sets all the cell's borders to the same color + * + * @access public + * @param mixed $color The color we are setting. Either a string (like 'blue'), + * or an integer (range is [8...63]). + */ + function setBorderColor($color) + { + $this->setBottomColor($color); + $this->setTopColor($color); + $this->setLeftColor($color); + $this->setRightColor($color); + } + + /** + * Sets the cell's bottom border color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setBottomColor($color) + { + $value = $this->_getColor($color); + $this->_bottom_color = $value; + } + + /** + * Sets the cell's top border color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setTopColor($color) + { + $value = $this->_getColor($color); + $this->_top_color = $value; + } + + /** + * Sets the cell's left border color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setLeftColor($color) + { + $value = $this->_getColor($color); + $this->_left_color = $value; + } + + /** + * Sets the cell's right border color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setRightColor($color) + { + $value = $this->_getColor($color); + $this->_right_color = $value; + } + + + /** + * Sets the cell's foreground color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setFgColor($color) + { + $value = $this->_getColor($color); + $this->_fg_color = $value; + if ($this->_pattern == 0) { // force color to be seen + $this->_pattern = 1; + } + } + + /** + * Sets the cell's background color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setBgColor($color) + { + $value = $this->_getColor($color); + $this->_bg_color = $value; + if ($this->_pattern == 0) { // force color to be seen + $this->_pattern = 1; + } + } + + /** + * Sets the cell's color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setColor($color) + { + $value = $this->_getColor($color); + $this->_color = $value; + } + + /** + * Sets the fill pattern attribute of a cell + * + * @access public + * @param integer $arg Optional. Defaults to 1. Meaningful values are: 0-18, + * 0 meaning no background. + */ + function setPattern($arg = 1) + { + $this->_pattern = $arg; + } + + /** + * Sets the underline of the text + * + * @access public + * @param integer $underline The value for underline. Possible values are: + * 1 => underline, 2 => double underline. + */ + function setUnderline($underline) + { + $this->_underline = $underline; + } + + /** + * Sets the font style as italic + * + * @access public + */ + function setItalic() + { + $this->_italic = 1; + } + + /** + * Sets the font size + * + * @access public + * @param integer $size The font size (in pixels I think). + */ + function setSize($size) + { + $this->_size = $size; + } + + /** + * Sets text wrapping + * + * @access public + */ + function setTextWrap() + { + $this->_text_wrap = 1; + } + + /** + * Sets the orientation of the text + * + * @access public + * @param integer $angle The rotation angle for the text (clockwise). Possible + values are: 0, 90, 270 and -1 for stacking top-to-bottom. + */ + function setTextRotation($angle) + { + switch ($angle) + { + case 0: + $this->_rotation = 0; + break; + case 90: + $this->_rotation = 3; + break; + case 270: + $this->_rotation = 2; + break; + case -1: + $this->_rotation = 1; + break; + default : + return $this->raiseError("Invalid value for angle.". + " Possible values are: 0, 90, 270 and -1 ". + "for stacking top-to-bottom."); + $this->_rotation = 0; + break; + } + } + + /** + * Sets the numeric format. + * It can be date, time, currency, etc... + * + * @access public + * @param integer $num_format The numeric format. + */ + function setNumFormat($num_format) + { + $this->_num_format = $num_format; + } + + /** + * Sets font as strikeout. + * + * @access public + */ + function setStrikeOut() + { + $this->_font_strikeout = 1; + } + + /** + * Sets outlining for a font. + * + * @access public + */ + function setOutLine() + { + $this->_font_outline = 1; + } + + /** + * Sets font as shadow. + * + * @access public + */ + function setShadow() + { + $this->_font_shadow = 1; + } + + /** + * Sets the script type of the text + * + * @access public + * @param integer $script The value for script type. Possible values are: + * 1 => superscript, 2 => subscript. + */ + function setScript($script) + { + $this->_font_script = $script; + } + + /** + * Locks a cell. + * + * @access public + */ + function setLocked() + { + $this->_locked = 1; + } + + /** + * Unlocks a cell. Useful for unprotecting particular cells of a protected sheet. + * + * @access public + */ + function setUnLocked() + { + $this->_locked = 0; + } + + /** + * Sets the font family name. + * + * @access public + * @param string $fontfamily The font family name. Possible values are: + * 'Times New Roman', 'Arial', 'Courier'. + */ + function setFontFamily($font_family) + { + $this->_font_name = $font_family; + } +} +?> diff --git a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Parser.php b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Parser.php new file mode 100644 index 00000000..4335ea46 --- /dev/null +++ b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Parser.php @@ -0,0 +1,1690 @@ +" +*/ +define('SPREADSHEET_EXCEL_WRITER_GT', ">"); + +/** +* @const SPREADSHEET_EXCEL_WRITER_LT token identifier for character "<" +*/ +define('SPREADSHEET_EXCEL_WRITER_LT', "<"); + +/** +* @const SPREADSHEET_EXCEL_WRITER_LE token identifier for character "<=" +*/ +define('SPREADSHEET_EXCEL_WRITER_LE', "<="); + +/** +* @const SPREADSHEET_EXCEL_WRITER_GE token identifier for character ">=" +*/ +define('SPREADSHEET_EXCEL_WRITER_GE', ">="); + +/** +* @const SPREADSHEET_EXCEL_WRITER_EQ token identifier for character "=" +*/ +define('SPREADSHEET_EXCEL_WRITER_EQ', "="); + +/** +* @const SPREADSHEET_EXCEL_WRITER_NE token identifier for character "<>" +*/ +define('SPREADSHEET_EXCEL_WRITER_NE', "<>"); + + +if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} +require_once $homedir.'/classes/pear/PEAR.php'; + +/** +* Class for parsing Excel formulas +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_Parser extends PEAR +{ + /** + * The index of the character we are currently looking at + * @var integer + */ + var $_current_char; + + /** + * The token we are working on. + * @var string + */ + var $_current_token; + + /** + * The formula to parse + * @var string + */ + var $_formula; + + /** + * The character ahead of the current char + * @var string + */ + var $_lookahead; + + /** + * The parse tree to be generated + * @var string + */ + var $_parse_tree; + + /** + * The byte order. 1 => big endian, 0 => little endian. + * @var integer + */ + var $_byte_order; + + /** + * Array of external sheets + * @var array + */ + var $_ext_sheets; + + /** + * Array of sheet references in the form of REF structures + * @var array + */ + var $_references; + + /** + * The BIFF version for the workbook + * @var integer + */ + var $_BIFF_version; + + /** + * The class constructor + * + * @param integer $byte_order The byte order (Little endian or Big endian) of the architecture + (optional). 1 => big endian, 0 (default) little endian. + */ + function Spreadsheet_Excel_Writer_Parser($byte_order, $biff_version) + { + $this->_current_char = 0; + $this->_BIFF_version = $biff_version; + $this->_current_token = ''; // The token we are working on. + $this->_formula = ''; // The formula to parse. + $this->_lookahead = ''; // The character ahead of the current char. + $this->_parse_tree = ''; // The parse tree to be generated. + $this->_initializeHashes(); // Initialize the hashes: ptg's and function's ptg's + $this->_byte_order = $byte_order; // Little Endian or Big Endian + $this->_ext_sheets = array(); + $this->_references = array(); + } + + /** + * Initialize the ptg and function hashes. + * + * @access private + */ + function _initializeHashes() + { + // The Excel ptg indices + $this->ptg = array( + 'ptgExp' => 0x01, + 'ptgTbl' => 0x02, + 'ptgAdd' => 0x03, + 'ptgSub' => 0x04, + 'ptgMul' => 0x05, + 'ptgDiv' => 0x06, + 'ptgPower' => 0x07, + 'ptgConcat' => 0x08, + 'ptgLT' => 0x09, + 'ptgLE' => 0x0A, + 'ptgEQ' => 0x0B, + 'ptgGE' => 0x0C, + 'ptgGT' => 0x0D, + 'ptgNE' => 0x0E, + 'ptgIsect' => 0x0F, + 'ptgUnion' => 0x10, + 'ptgRange' => 0x11, + 'ptgUplus' => 0x12, + 'ptgUminus' => 0x13, + 'ptgPercent' => 0x14, + 'ptgParen' => 0x15, + 'ptgMissArg' => 0x16, + 'ptgStr' => 0x17, + 'ptgAttr' => 0x19, + 'ptgSheet' => 0x1A, + 'ptgEndSheet' => 0x1B, + 'ptgErr' => 0x1C, + 'ptgBool' => 0x1D, + 'ptgInt' => 0x1E, + 'ptgNum' => 0x1F, + 'ptgArray' => 0x20, + 'ptgFunc' => 0x21, + 'ptgFuncVar' => 0x22, + 'ptgName' => 0x23, + 'ptgRef' => 0x24, + 'ptgArea' => 0x25, + 'ptgMemArea' => 0x26, + 'ptgMemErr' => 0x27, + 'ptgMemNoMem' => 0x28, + 'ptgMemFunc' => 0x29, + 'ptgRefErr' => 0x2A, + 'ptgAreaErr' => 0x2B, + 'ptgRefN' => 0x2C, + 'ptgAreaN' => 0x2D, + 'ptgMemAreaN' => 0x2E, + 'ptgMemNoMemN' => 0x2F, + 'ptgNameX' => 0x39, + 'ptgRef3d' => 0x3A, + 'ptgArea3d' => 0x3B, + 'ptgRefErr3d' => 0x3C, + 'ptgAreaErr3d' => 0x3D, + 'ptgArrayV' => 0x40, + 'ptgFuncV' => 0x41, + 'ptgFuncVarV' => 0x42, + 'ptgNameV' => 0x43, + 'ptgRefV' => 0x44, + 'ptgAreaV' => 0x45, + 'ptgMemAreaV' => 0x46, + 'ptgMemErrV' => 0x47, + 'ptgMemNoMemV' => 0x48, + 'ptgMemFuncV' => 0x49, + 'ptgRefErrV' => 0x4A, + 'ptgAreaErrV' => 0x4B, + 'ptgRefNV' => 0x4C, + 'ptgAreaNV' => 0x4D, + 'ptgMemAreaNV' => 0x4E, + 'ptgMemNoMemN' => 0x4F, + 'ptgFuncCEV' => 0x58, + 'ptgNameXV' => 0x59, + 'ptgRef3dV' => 0x5A, + 'ptgArea3dV' => 0x5B, + 'ptgRefErr3dV' => 0x5C, + 'ptgAreaErr3d' => 0x5D, + 'ptgArrayA' => 0x60, + 'ptgFuncA' => 0x61, + 'ptgFuncVarA' => 0x62, + 'ptgNameA' => 0x63, + 'ptgRefA' => 0x64, + 'ptgAreaA' => 0x65, + 'ptgMemAreaA' => 0x66, + 'ptgMemErrA' => 0x67, + 'ptgMemNoMemA' => 0x68, + 'ptgMemFuncA' => 0x69, + 'ptgRefErrA' => 0x6A, + 'ptgAreaErrA' => 0x6B, + 'ptgRefNA' => 0x6C, + 'ptgAreaNA' => 0x6D, + 'ptgMemAreaNA' => 0x6E, + 'ptgMemNoMemN' => 0x6F, + 'ptgFuncCEA' => 0x78, + 'ptgNameXA' => 0x79, + 'ptgRef3dA' => 0x7A, + 'ptgArea3dA' => 0x7B, + 'ptgRefErr3dA' => 0x7C, + 'ptgAreaErr3d' => 0x7D + ); + + // Thanks to Michael Meeks and Gnumeric for the initial arg values. + // + // The following hash was generated by "function_locale.pl" in the distro. + // Refer to function_locale.pl for non-English function names. + // + // The array elements are as follow: + // ptg: The Excel function ptg code. + // args: The number of arguments that the function takes: + // >=0 is a fixed number of arguments. + // -1 is a variable number of arguments. + // class: The reference, value or array class of the function args. + // vol: The function is volatile. + // + $this->_functions = array( + // function ptg args class vol + 'COUNT' => array( 0, -1, 0, 0 ), + 'IF' => array( 1, -1, 1, 0 ), + 'ISNA' => array( 2, 1, 1, 0 ), + 'ISERROR' => array( 3, 1, 1, 0 ), + 'SUM' => array( 4, -1, 0, 0 ), + 'AVERAGE' => array( 5, -1, 0, 0 ), + 'MIN' => array( 6, -1, 0, 0 ), + 'MAX' => array( 7, -1, 0, 0 ), + 'ROW' => array( 8, -1, 0, 0 ), + 'COLUMN' => array( 9, -1, 0, 0 ), + 'NA' => array( 10, 0, 0, 0 ), + 'NPV' => array( 11, -1, 1, 0 ), + 'STDEV' => array( 12, -1, 0, 0 ), + 'DOLLAR' => array( 13, -1, 1, 0 ), + 'FIXED' => array( 14, -1, 1, 0 ), + 'SIN' => array( 15, 1, 1, 0 ), + 'COS' => array( 16, 1, 1, 0 ), + 'TAN' => array( 17, 1, 1, 0 ), + 'ATAN' => array( 18, 1, 1, 0 ), + 'PI' => array( 19, 0, 1, 0 ), + 'SQRT' => array( 20, 1, 1, 0 ), + 'EXP' => array( 21, 1, 1, 0 ), + 'LN' => array( 22, 1, 1, 0 ), + 'LOG10' => array( 23, 1, 1, 0 ), + 'ABS' => array( 24, 1, 1, 0 ), + 'INT' => array( 25, 1, 1, 0 ), + 'SIGN' => array( 26, 1, 1, 0 ), + 'ROUND' => array( 27, 2, 1, 0 ), + 'LOOKUP' => array( 28, -1, 0, 0 ), + 'INDEX' => array( 29, -1, 0, 1 ), + 'REPT' => array( 30, 2, 1, 0 ), + 'MID' => array( 31, 3, 1, 0 ), + 'LEN' => array( 32, 1, 1, 0 ), + 'VALUE' => array( 33, 1, 1, 0 ), + 'TRUE' => array( 34, 0, 1, 0 ), + 'FALSE' => array( 35, 0, 1, 0 ), + 'AND' => array( 36, -1, 0, 0 ), + 'OR' => array( 37, -1, 0, 0 ), + 'NOT' => array( 38, 1, 1, 0 ), + 'MOD' => array( 39, 2, 1, 0 ), + 'DCOUNT' => array( 40, 3, 0, 0 ), + 'DSUM' => array( 41, 3, 0, 0 ), + 'DAVERAGE' => array( 42, 3, 0, 0 ), + 'DMIN' => array( 43, 3, 0, 0 ), + 'DMAX' => array( 44, 3, 0, 0 ), + 'DSTDEV' => array( 45, 3, 0, 0 ), + 'VAR' => array( 46, -1, 0, 0 ), + 'DVAR' => array( 47, 3, 0, 0 ), + 'TEXT' => array( 48, 2, 1, 0 ), + 'LINEST' => array( 49, -1, 0, 0 ), + 'TREND' => array( 50, -1, 0, 0 ), + 'LOGEST' => array( 51, -1, 0, 0 ), + 'GROWTH' => array( 52, -1, 0, 0 ), + 'PV' => array( 56, -1, 1, 0 ), + 'FV' => array( 57, -1, 1, 0 ), + 'NPER' => array( 58, -1, 1, 0 ), + 'PMT' => array( 59, -1, 1, 0 ), + 'RATE' => array( 60, -1, 1, 0 ), + 'MIRR' => array( 61, 3, 0, 0 ), + 'IRR' => array( 62, -1, 0, 0 ), + 'RAND' => array( 63, 0, 1, 1 ), + 'MATCH' => array( 64, -1, 0, 0 ), + 'DATE' => array( 65, 3, 1, 0 ), + 'TIME' => array( 66, 3, 1, 0 ), + 'DAY' => array( 67, 1, 1, 0 ), + 'MONTH' => array( 68, 1, 1, 0 ), + 'YEAR' => array( 69, 1, 1, 0 ), + 'WEEKDAY' => array( 70, -1, 1, 0 ), + 'HOUR' => array( 71, 1, 1, 0 ), + 'MINUTE' => array( 72, 1, 1, 0 ), + 'SECOND' => array( 73, 1, 1, 0 ), + 'NOW' => array( 74, 0, 1, 1 ), + 'AREAS' => array( 75, 1, 0, 1 ), + 'ROWS' => array( 76, 1, 0, 1 ), + 'COLUMNS' => array( 77, 1, 0, 1 ), + 'OFFSET' => array( 78, -1, 0, 1 ), + 'SEARCH' => array( 82, -1, 1, 0 ), + 'TRANSPOSE' => array( 83, 1, 1, 0 ), + 'TYPE' => array( 86, 1, 1, 0 ), + 'ATAN2' => array( 97, 2, 1, 0 ), + 'ASIN' => array( 98, 1, 1, 0 ), + 'ACOS' => array( 99, 1, 1, 0 ), + 'CHOOSE' => array( 100, -1, 1, 0 ), + 'HLOOKUP' => array( 101, -1, 0, 0 ), + 'VLOOKUP' => array( 102, -1, 0, 0 ), + 'ISREF' => array( 105, 1, 0, 0 ), + 'LOG' => array( 109, -1, 1, 0 ), + 'CHAR' => array( 111, 1, 1, 0 ), + 'LOWER' => array( 112, 1, 1, 0 ), + 'UPPER' => array( 113, 1, 1, 0 ), + 'PROPER' => array( 114, 1, 1, 0 ), + 'LEFT' => array( 115, -1, 1, 0 ), + 'RIGHT' => array( 116, -1, 1, 0 ), + 'EXACT' => array( 117, 2, 1, 0 ), + 'TRIM' => array( 118, 1, 1, 0 ), + 'REPLACE' => array( 119, 4, 1, 0 ), + 'SUBSTITUTE' => array( 120, -1, 1, 0 ), + 'CODE' => array( 121, 1, 1, 0 ), + 'FIND' => array( 124, -1, 1, 0 ), + 'CELL' => array( 125, -1, 0, 1 ), + 'ISERR' => array( 126, 1, 1, 0 ), + 'ISTEXT' => array( 127, 1, 1, 0 ), + 'ISNUMBER' => array( 128, 1, 1, 0 ), + 'ISBLANK' => array( 129, 1, 1, 0 ), + 'T' => array( 130, 1, 0, 0 ), + 'N' => array( 131, 1, 0, 0 ), + 'DATEVALUE' => array( 140, 1, 1, 0 ), + 'TIMEVALUE' => array( 141, 1, 1, 0 ), + 'SLN' => array( 142, 3, 1, 0 ), + 'SYD' => array( 143, 4, 1, 0 ), + 'DDB' => array( 144, -1, 1, 0 ), + 'INDIRECT' => array( 148, -1, 1, 1 ), + 'CALL' => array( 150, -1, 1, 0 ), + 'CLEAN' => array( 162, 1, 1, 0 ), + 'MDETERM' => array( 163, 1, 2, 0 ), + 'MINVERSE' => array( 164, 1, 2, 0 ), + 'MMULT' => array( 165, 2, 2, 0 ), + 'IPMT' => array( 167, -1, 1, 0 ), + 'PPMT' => array( 168, -1, 1, 0 ), + 'COUNTA' => array( 169, -1, 0, 0 ), + 'PRODUCT' => array( 183, -1, 0, 0 ), + 'FACT' => array( 184, 1, 1, 0 ), + 'DPRODUCT' => array( 189, 3, 0, 0 ), + 'ISNONTEXT' => array( 190, 1, 1, 0 ), + 'STDEVP' => array( 193, -1, 0, 0 ), + 'VARP' => array( 194, -1, 0, 0 ), + 'DSTDEVP' => array( 195, 3, 0, 0 ), + 'DVARP' => array( 196, 3, 0, 0 ), + 'TRUNC' => array( 197, -1, 1, 0 ), + 'ISLOGICAL' => array( 198, 1, 1, 0 ), + 'DCOUNTA' => array( 199, 3, 0, 0 ), + 'ROUNDUP' => array( 212, 2, 1, 0 ), + 'ROUNDDOWN' => array( 213, 2, 1, 0 ), + 'RANK' => array( 216, -1, 0, 0 ), + 'ADDRESS' => array( 219, -1, 1, 0 ), + 'DAYS360' => array( 220, -1, 1, 0 ), + 'TODAY' => array( 221, 0, 1, 1 ), + 'VDB' => array( 222, -1, 1, 0 ), + 'MEDIAN' => array( 227, -1, 0, 0 ), + 'SUMPRODUCT' => array( 228, -1, 2, 0 ), + 'SINH' => array( 229, 1, 1, 0 ), + 'COSH' => array( 230, 1, 1, 0 ), + 'TANH' => array( 231, 1, 1, 0 ), + 'ASINH' => array( 232, 1, 1, 0 ), + 'ACOSH' => array( 233, 1, 1, 0 ), + 'ATANH' => array( 234, 1, 1, 0 ), + 'DGET' => array( 235, 3, 0, 0 ), + 'INFO' => array( 244, 1, 1, 1 ), + 'DB' => array( 247, -1, 1, 0 ), + 'FREQUENCY' => array( 252, 2, 0, 0 ), + 'ERROR.TYPE' => array( 261, 1, 1, 0 ), + 'REGISTER.ID' => array( 267, -1, 1, 0 ), + 'AVEDEV' => array( 269, -1, 0, 0 ), + 'BETADIST' => array( 270, -1, 1, 0 ), + 'GAMMALN' => array( 271, 1, 1, 0 ), + 'BETAINV' => array( 272, -1, 1, 0 ), + 'BINOMDIST' => array( 273, 4, 1, 0 ), + 'CHIDIST' => array( 274, 2, 1, 0 ), + 'CHIINV' => array( 275, 2, 1, 0 ), + 'COMBIN' => array( 276, 2, 1, 0 ), + 'CONFIDENCE' => array( 277, 3, 1, 0 ), + 'CRITBINOM' => array( 278, 3, 1, 0 ), + 'EVEN' => array( 279, 1, 1, 0 ), + 'EXPONDIST' => array( 280, 3, 1, 0 ), + 'FDIST' => array( 281, 3, 1, 0 ), + 'FINV' => array( 282, 3, 1, 0 ), + 'FISHER' => array( 283, 1, 1, 0 ), + 'FISHERINV' => array( 284, 1, 1, 0 ), + 'FLOOR' => array( 285, 2, 1, 0 ), + 'GAMMADIST' => array( 286, 4, 1, 0 ), + 'GAMMAINV' => array( 287, 3, 1, 0 ), + 'CEILING' => array( 288, 2, 1, 0 ), + 'HYPGEOMDIST' => array( 289, 4, 1, 0 ), + 'LOGNORMDIST' => array( 290, 3, 1, 0 ), + 'LOGINV' => array( 291, 3, 1, 0 ), + 'NEGBINOMDIST' => array( 292, 3, 1, 0 ), + 'NORMDIST' => array( 293, 4, 1, 0 ), + 'NORMSDIST' => array( 294, 1, 1, 0 ), + 'NORMINV' => array( 295, 3, 1, 0 ), + 'NORMSINV' => array( 296, 1, 1, 0 ), + 'STANDARDIZE' => array( 297, 3, 1, 0 ), + 'ODD' => array( 298, 1, 1, 0 ), + 'PERMUT' => array( 299, 2, 1, 0 ), + 'POISSON' => array( 300, 3, 1, 0 ), + 'TDIST' => array( 301, 3, 1, 0 ), + 'WEIBULL' => array( 302, 4, 1, 0 ), + 'SUMXMY2' => array( 303, 2, 2, 0 ), + 'SUMX2MY2' => array( 304, 2, 2, 0 ), + 'SUMX2PY2' => array( 305, 2, 2, 0 ), + 'CHITEST' => array( 306, 2, 2, 0 ), + 'CORREL' => array( 307, 2, 2, 0 ), + 'COVAR' => array( 308, 2, 2, 0 ), + 'FORECAST' => array( 309, 3, 2, 0 ), + 'FTEST' => array( 310, 2, 2, 0 ), + 'INTERCEPT' => array( 311, 2, 2, 0 ), + 'PEARSON' => array( 312, 2, 2, 0 ), + 'RSQ' => array( 313, 2, 2, 0 ), + 'STEYX' => array( 314, 2, 2, 0 ), + 'SLOPE' => array( 315, 2, 2, 0 ), + 'TTEST' => array( 316, 4, 2, 0 ), + 'PROB' => array( 317, -1, 2, 0 ), + 'DEVSQ' => array( 318, -1, 0, 0 ), + 'GEOMEAN' => array( 319, -1, 0, 0 ), + 'HARMEAN' => array( 320, -1, 0, 0 ), + 'SUMSQ' => array( 321, -1, 0, 0 ), + 'KURT' => array( 322, -1, 0, 0 ), + 'SKEW' => array( 323, -1, 0, 0 ), + 'ZTEST' => array( 324, -1, 0, 0 ), + 'LARGE' => array( 325, 2, 0, 0 ), + 'SMALL' => array( 326, 2, 0, 0 ), + 'QUARTILE' => array( 327, 2, 0, 0 ), + 'PERCENTILE' => array( 328, 2, 0, 0 ), + 'PERCENTRANK' => array( 329, -1, 0, 0 ), + 'MODE' => array( 330, -1, 2, 0 ), + 'TRIMMEAN' => array( 331, 2, 0, 0 ), + 'TINV' => array( 332, 2, 1, 0 ), + 'CONCATENATE' => array( 336, -1, 1, 0 ), + 'POWER' => array( 337, 2, 1, 0 ), + 'RADIANS' => array( 342, 1, 1, 0 ), + 'DEGREES' => array( 343, 1, 1, 0 ), + 'SUBTOTAL' => array( 344, -1, 0, 0 ), + 'SUMIF' => array( 345, -1, 0, 0 ), + 'COUNTIF' => array( 346, 2, 0, 0 ), + 'COUNTBLANK' => array( 347, 1, 0, 0 ), + 'ROMAN' => array( 354, -1, 1, 0 ) + ); + } + + /** + * Convert a token to the proper ptg value. + * + * @access private + * @param mixed $token The token to convert. + * @return mixed the converted token on success. PEAR_Error if the token + * is not recognized + */ + function _convert($token) + { + if (preg_match("/^\"[^\"]{0,255}\"$/", $token)) { + return $this->_convertString($token); + + } elseif (is_numeric($token)) { + return $this->_convertNumber($token); + + // match references like A1 or $A$1 + } elseif (preg_match('/^\$?([A-Ia-i]?[A-Za-z])\$?(\d+)$/',$token)) { + return $this->_convertRef2d($token); + + // match external references like Sheet1!A1 or Sheet1:Sheet2!A1 + } elseif (preg_match("/^\w+(\:\w+)?\![A-Ia-i]?[A-Za-z](\d+)$/u",$token)) { + return $this->_convertRef3d($token); + + // match external references like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1 + } elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\![A-Ia-i]?[A-Za-z](\d+)$/u",$token)) { + return $this->_convertRef3d($token); + + // match ranges like A1:B2 + } elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)\:(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/",$token)) { + return $this->_convertRange2d($token); + + // match ranges like A1..B2 + } elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/",$token)) { + return $this->_convertRange2d($token); + + // match external ranges like Sheet1!A1 or Sheet1:Sheet2!A1:B2 + } elseif (preg_match("/^\w+(\:\w+)?\!([A-Ia-i]?[A-Za-z])?(\d+)\:([A-Ia-i]?[A-Za-z])?(\d+)$/u",$token)) { + return $this->_convertRange3d($token); + + // match external ranges like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1:B2 + } elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\!([A-Ia-i]?[A-Za-z])?(\d+)\:([A-Ia-i]?[A-Za-z])?(\d+)$/u",$token)) { + return $this->_convertRange3d($token); + + // operators (including parentheses) + } elseif (isset($this->ptg[$token])) { + return pack("C", $this->ptg[$token]); + + // commented so argument number can be processed correctly. See toReversePolish(). + /*elseif (preg_match("/[A-Z0-9\xc0-\xdc\.]+/",$token)) + { + return($this->_convertFunction($token,$this->_func_args)); + }*/ + + // if it's an argument, ignore the token (the argument remains) + } elseif ($token == 'arg') { + return ''; + } + // TODO: use real error codes + return $this->raiseError("Unknown token $token"); + } + + /** + * Convert a number token to ptgInt or ptgNum + * + * @access private + * @param mixed $num an integer or double for conversion to its ptg value + */ + function _convertNumber($num) + { + // Integer in the range 0..2**16-1 + if ((preg_match("/^\d+$/", $num)) and ($num <= 65535)) { + return pack("Cv", $this->ptg['ptgInt'], $num); + } else { // A float + if ($this->_byte_order) { // if it's Big Endian + $num = strrev($num); + } + return pack("Cd", $this->ptg['ptgNum'], $num); + } + } + + /** + * Convert a string token to ptgStr + * + * @access private + * @param string $string A string for conversion to its ptg value. + * @return mixed the converted token on success. PEAR_Error if the string + * is longer than 255 characters. + */ + function _convertString($string) + { + // chop away beggining and ending quotes + $string = substr($string, 1, strlen($string) - 2); + if (strlen($string) > 255) { + return $this->raiseError("String is too long"); + } + + if ($this->_BIFF_version == 0x0500) { + return pack("CC", $this->ptg['ptgStr'], strlen($string)).$string; + } elseif ($this->_BIFF_version == 0x0600) { + $encoding = 0; // TODO: Unicode support + return pack("CCC", $this->ptg['ptgStr'], strlen($string), $encoding).$string; + } + } + + /** + * Convert a function to a ptgFunc or ptgFuncVarV depending on the number of + * args that it takes. + * + * @access private + * @param string $token The name of the function for convertion to ptg value. + * @param integer $num_args The number of arguments the function receives. + * @return string The packed ptg for the function + */ + function _convertFunction($token, $num_args) + { + $args = $this->_functions[$token][1]; + $volatile = $this->_functions[$token][3]; + + // Fixed number of args eg. TIME($i,$j,$k). + if ($args >= 0) { + return pack("Cv", $this->ptg['ptgFuncV'], $this->_functions[$token][0]); + } + // Variable number of args eg. SUM($i,$j,$k, ..). + if ($args == -1) { + return pack("CCv", $this->ptg['ptgFuncVarV'], $num_args, $this->_functions[$token][0]); + } + } + + /** + * Convert an Excel range such as A1:D4 to a ptgRefV. + * + * @access private + * @param string $range An Excel range in the A1:A2 or A1..A2 format. + */ + function _convertRange2d($range) + { + $class = 2; // as far as I know, this is magick. + + // Split the range into 2 cell refs + if (preg_match("/^([A-Ia-i]?[A-Za-z])(\d+)\:([A-Ia-i]?[A-Za-z])(\d+)$/", $range)) { + list($cell1, $cell2) = split(':', $range); + } elseif (preg_match("/^([A-Ia-i]?[A-Za-z])(\d+)\.\.([A-Ia-i]?[A-Za-z])(\d+)$/", $range)) { + list($cell1, $cell2) = split('\.\.', $range); + + } else { + // TODO: use real error codes + return $this->raiseError("Unknown range separator", 0, PEAR_ERROR_DIE); + } + + // Convert the cell references + $cell_array1 = $this->_cellToPackedRowcol($cell1); + if (PEAR::isError($cell_array1)) { + return $cell_array1; + } + list($row1, $col1) = $cell_array1; + $cell_array2 = $this->_cellToPackedRowcol($cell2); + if (PEAR::isError($cell_array2)) { + return $cell_array2; + } + list($row2, $col2) = $cell_array2; + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgArea = pack("C", $this->ptg['ptgArea']); + } elseif ($class == 1) { + $ptgArea = pack("C", $this->ptg['ptgAreaV']); + } elseif ($class == 2) { + $ptgArea = pack("C", $this->ptg['ptgAreaA']); + } else { + // TODO: use real error codes + return $this->raiseError("Unknown class $class", 0, PEAR_ERROR_DIE); + } + return $ptgArea . $row1 . $row2 . $col1. $col2; + } + + /** + * Convert an Excel 3d range such as "Sheet1!A1:D4" or "Sheet1:Sheet2!A1:D4" to + * a ptgArea3d. + * + * @access private + * @param string $token An Excel range in the Sheet1!A1:A2 format. + * @return mixed The packed ptgArea3d token on success, PEAR_Error on failure. + */ + function _convertRange3d($token) + { + $class = 2; // as far as I know, this is magick. + + // Split the ref at the ! symbol + list($ext_ref, $range) = split('!', $token); + + // Convert the external reference part (different for BIFF8) + if ($this->_BIFF_version == 0x0500) { + $ext_ref = $this->_packExtRef($ext_ref); + if (PEAR::isError($ext_ref)) { + return $ext_ref; + } + } elseif ($this->_BIFF_version == 0x0600) { + $ext_ref = $this->_getRefIndex($ext_ref); + if (PEAR::isError($ext_ref)) { + return $ext_ref; + } + } + + // Split the range into 2 cell refs + list($cell1, $cell2) = split(':', $range); + + // Convert the cell references + if (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/", $cell1)) { + $cell_array1 = $this->_cellToPackedRowcol($cell1); + if (PEAR::isError($cell_array1)) { + return $cell_array1; + } + list($row1, $col1) = $cell_array1; + $cell_array2 = $this->_cellToPackedRowcol($cell2); + if (PEAR::isError($cell_array2)) { + return $cell_array2; + } + list($row2, $col2) = $cell_array2; + } else { // It's a rows range (like 26:27) + $cells_array = $this->_rangeToPackedRange($cell1.':'.$cell2); + if (PEAR::isError($cells_array)) { + return $cells_array; + } + list($row1, $col1, $row2, $col2) = $cells_array; + } + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgArea = pack("C", $this->ptg['ptgArea3d']); + } elseif ($class == 1) { + $ptgArea = pack("C", $this->ptg['ptgArea3dV']); + } elseif ($class == 2) { + $ptgArea = pack("C", $this->ptg['ptgArea3dA']); + } else { + return $this->raiseError("Unknown class $class", 0, PEAR_ERROR_DIE); + } + + return $ptgArea . $ext_ref . $row1 . $row2 . $col1. $col2; + } + + /** + * Convert an Excel reference such as A1, $B2, C$3 or $D$4 to a ptgRefV. + * + * @access private + * @param string $cell An Excel cell reference + * @return string The cell in packed() format with the corresponding ptg + */ + function _convertRef2d($cell) + { + $class = 2; // as far as I know, this is magick. + + // Convert the cell reference + $cell_array = $this->_cellToPackedRowcol($cell); + if (PEAR::isError($cell_array)) { + return $cell_array; + } + list($row, $col) = $cell_array; + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgRef = pack("C", $this->ptg['ptgRef']); + } elseif ($class == 1) { + $ptgRef = pack("C", $this->ptg['ptgRefV']); + } elseif ($class == 2) { + $ptgRef = pack("C", $this->ptg['ptgRefA']); + } else { + // TODO: use real error codes + return $this->raiseError("Unknown class $class"); + } + return $ptgRef.$row.$col; + } + + /** + * Convert an Excel 3d reference such as "Sheet1!A1" or "Sheet1:Sheet2!A1" to a + * ptgRef3d. + * + * @access private + * @param string $cell An Excel cell reference + * @return mixed The packed ptgRef3d token on success, PEAR_Error on failure. + */ + function _convertRef3d($cell) + { + $class = 2; // as far as I know, this is magick. + + // Split the ref at the ! symbol + list($ext_ref, $cell) = split('!', $cell); + + // Convert the external reference part (different for BIFF8) + if ($this->_BIFF_version == 0x0500) { + $ext_ref = $this->_packExtRef($ext_ref); + if (PEAR::isError($ext_ref)) { + return $ext_ref; + } + } elseif ($this->_BIFF_version == 0x0600) { + $ext_ref = $this->_getRefIndex($ext_ref); + if (PEAR::isError($ext_ref)) { + return $ext_ref; + } + } + + // Convert the cell reference part + list($row, $col) = $this->_cellToPackedRowcol($cell); + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgRef = pack("C", $this->ptg['ptgRef3d']); + } elseif ($class == 1) { + $ptgRef = pack("C", $this->ptg['ptgRef3dV']); + } elseif ($class == 2) { + $ptgRef = pack("C", $this->ptg['ptgRef3dA']); + } else { + return $this->raiseError("Unknown class $class", 0, PEAR_ERROR_DIE); + } + + return $ptgRef . $ext_ref. $row . $col; + } + + /** + * Convert the sheet name part of an external reference, for example "Sheet1" or + * "Sheet1:Sheet2", to a packed structure. + * + * @access private + * @param string $ext_ref The name of the external reference + * @return string The reference index in packed() format + */ + function _packExtRef($ext_ref) + { + $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. + $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. + + // Check if there is a sheet range eg., Sheet1:Sheet2. + if (preg_match("/:/", $ext_ref)) { + list($sheet_name1, $sheet_name2) = split(':', $ext_ref); + + $sheet1 = $this->_getSheetIndex($sheet_name1); + if ($sheet1 == -1) { + return $this->raiseError("Unknown sheet name $sheet_name1 in formula"); + } + $sheet2 = $this->_getSheetIndex($sheet_name2); + if ($sheet2 == -1) { + return $this->raiseError("Unknown sheet name $sheet_name2 in formula"); + } + + // Reverse max and min sheet numbers if necessary + if ($sheet1 > $sheet2) { + list($sheet1, $sheet2) = array($sheet2, $sheet1); + } + } else { // Single sheet name only. + $sheet1 = $this->_getSheetIndex($ext_ref); + if ($sheet1 == -1) { + return $this->raiseError("Unknown sheet name $ext_ref in formula"); + } + $sheet2 = $sheet1; + } + + // References are stored relative to 0xFFFF. + $offset = -1 - $sheet1; + + return pack('vdvv', $offset, 0x00, $sheet1, $sheet2); + } + + /** + * Look up the REF index that corresponds to an external sheet name + * (or range). If it doesn't exist yet add it to the workbook's references + * array. It assumes all sheet names given must exist. + * + * @access private + * @param string $ext_ref The name of the external reference + * @return mixed The reference index in packed() format on success, + * PEAR_Error on failure + */ + function _getRefIndex($ext_ref) + { + $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. + $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. + + // Check if there is a sheet range eg., Sheet1:Sheet2. + if (preg_match("/:/", $ext_ref)) { + list($sheet_name1, $sheet_name2) = split(':', $ext_ref); + + $sheet1 = $this->_getSheetIndex($sheet_name1); + if ($sheet1 == -1) { + return $this->raiseError("Unknown sheet name $sheet_name1 in formula"); + } + $sheet2 = $this->_getSheetIndex($sheet_name2); + if ($sheet2 == -1) { + return $this->raiseError("Unknown sheet name $sheet_name2 in formula"); + } + + // Reverse max and min sheet numbers if necessary + if ($sheet1 > $sheet2) { + list($sheet1, $sheet2) = array($sheet2, $sheet1); + } + } else { // Single sheet name only. + $sheet1 = $this->_getSheetIndex($ext_ref); + if ($sheet1 == -1) { + return $this->raiseError("Unknown sheet name $ext_ref in formula"); + } + $sheet2 = $sheet1; + } + + // assume all references belong to this document + $supbook_index = 0x00; + $ref = pack('vvv', $supbook_index, $sheet1, $sheet2); + $total_references = count($this->_references); + $index = -1; + for ($i = 0; $i < $total_references; $i++) { + if ($ref == $this->_references[$i]) { + $index = $i; + break; + } + } + // if REF was not found add it to references array + if ($index == -1) { + $this->_references[$total_references] = $ref; + $index = $total_references; + } + + return pack('v', $index); + } + + /** + * Look up the index that corresponds to an external sheet name. The hash of + * sheet names is updated by the addworksheet() method of the + * Spreadsheet_Excel_Writer_Workbook class. + * + * @access private + * @return integer The sheet index, -1 if the sheet was not found + */ + function _getSheetIndex($sheet_name) + { + if (!isset($this->_ext_sheets[$sheet_name])) { + return -1; + } else { + return $this->_ext_sheets[$sheet_name]; + } + } + + /** + * This method is used to update the array of sheet names. It is + * called by the addWorksheet() method of the + * Spreadsheet_Excel_Writer_Workbook class. + * + * @access public + * @see Spreadsheet_Excel_Writer_Workbook::addWorksheet() + * @param string $name The name of the worksheet being added + * @param integer $index The index of the worksheet being added + */ + function setExtSheet($name, $index) + { + $this->_ext_sheets[$name] = $index; + } + + /** + * pack() row and column into the required 3 or 4 byte format. + * + * @access private + * @param string $cell The Excel cell reference to be packed + * @return array Array containing the row and column in packed() format + */ + function _cellToPackedRowcol($cell) + { + $cell = strtoupper($cell); + list($row, $col, $row_rel, $col_rel) = $this->_cellToRowcol($cell); + if ($col >= 256) { + return $this->raiseError("Column in: $cell greater than 255"); + } + // FIXME: change for BIFF8 + if ($row >= 16384) { + return $this->raiseError("Row in: $cell greater than 16384 "); + } + + // Set the high bits to indicate if row or col are relative. + if ($this->_BIFF_version == 0x0500) { + $row |= $col_rel << 14; + $row |= $row_rel << 15; + $col = pack('C', $col); + } elseif ($this->_BIFF_version == 0x0600) { + $col |= $col_rel << 14; + $col |= $row_rel << 15; + $col = pack('v', $col); + } + $row = pack('v', $row); + + return array($row, $col); + } + + /** + * pack() row range into the required 3 or 4 byte format. + * Just using maximum col/rows, which is probably not the correct solution + * + * @access private + * @param string $range The Excel range to be packed + * @return array Array containing (row1,col1,row2,col2) in packed() format + */ + function _rangeToPackedRange($range) + { + preg_match('/(\$)?(\d+)\:(\$)?(\d+)/', $range, $match); + // return absolute rows if there is a $ in the ref + $row1_rel = empty($match[1]) ? 1 : 0; + $row1 = $match[2]; + $row2_rel = empty($match[3]) ? 1 : 0; + $row2 = $match[4]; + // Convert 1-index to zero-index + $row1--; + $row2--; + // Trick poor inocent Excel + $col1 = 0; + $col2 = 16383; // FIXME: maximum possible value for Excel 5 (change this!!!) + + // FIXME: this changes for BIFF8 + if (($row1 >= 16384) or ($row2 >= 16384)) { + return $this->raiseError("Row in: $range greater than 16384 "); + } + + // Set the high bits to indicate if rows are relative. + if ($this->_BIFF_version == 0x0500) { + $row1 |= $row1_rel << 14; // FIXME: probably a bug + $row2 |= $row2_rel << 15; + $col1 = pack('C', $col1); + $col2 = pack('C', $col2); + } elseif ($this->_BIFF_version == 0x0600) { + $col1 |= $row1_rel << 15; + $col2 |= $row2_rel << 15; + $col1 = pack('v', $col1); + $col2 = pack('v', $col2); + } + $row1 = pack('v', $row1); + $row2 = pack('v', $row2); + + return array($row1, $col1, $row2, $col2); + } + + /** + * Convert an Excel cell reference such as A1 or $B2 or C$3 or $D$4 to a zero + * indexed row and column number. Also returns two (0,1) values to indicate + * whether the row or column are relative references. + * + * @access private + * @param string $cell The Excel cell reference in A1 format. + * @return array + */ + function _cellToRowcol($cell) + { + preg_match('/(\$)?([A-I]?[A-Z])(\$)?(\d+)/',$cell,$match); + // return absolute column if there is a $ in the ref + $col_rel = empty($match[1]) ? 1 : 0; + $col_ref = $match[2]; + $row_rel = empty($match[3]) ? 1 : 0; + $row = $match[4]; + + // Convert base26 column string to a number. + $expn = strlen($col_ref) - 1; + $col = 0; + $col_ref_length = strlen($col_ref); + for ($i = 0; $i < $col_ref_length; $i++) { + $col += (ord($col_ref{$i}) - ord('A') + 1) * pow(26, $expn); + $expn--; + } + + // Convert 1-index to zero-index + $row--; + $col--; + + return array($row, $col, $row_rel, $col_rel); + } + + /** + * Advance to the next valid token. + * + * @access private + */ + function _advance() + { + $i = $this->_current_char; + $formula_length = strlen($this->_formula); + // eat up white spaces + if ($i < $formula_length) { + while ($this->_formula{$i} == " ") { + $i++; + } + + if ($i < ($formula_length - 1)) { + $this->_lookahead = $this->_formula{$i+1}; + } + $token = ''; + } + + while ($i < $formula_length) { + $token .= $this->_formula{$i}; + if ($i < ($formula_length - 1)) { + $this->_lookahead = $this->_formula{$i+1}; + } else { + $this->_lookahead = ''; + } + + if ($this->_match($token) != '') { + //if ($i < strlen($this->_formula) - 1) { + // $this->_lookahead = $this->_formula{$i+1}; + //} + $this->_current_char = $i + 1; + $this->_current_token = $token; + return 1; + } + + if ($i < ($formula_length - 2)) { + $this->_lookahead = $this->_formula{$i+2}; + } else { // if we run out of characters _lookahead becomes empty + $this->_lookahead = ''; + } + $i++; + } + //die("Lexical error ".$this->_current_char); + } + + /** + * Checks if it's a valid token. + * + * @access private + * @param mixed $token The token to check. + * @return mixed The checked token or false on failure + */ + function _match($token) + { + switch($token) { + case SPREADSHEET_EXCEL_WRITER_ADD: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_SUB: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_MUL: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_DIV: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_OPEN: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_CLOSE: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_COMA: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_SEMICOLON: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_GT: + if ($this->_lookahead == '=') { // it's a GE token + break; + } + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_LT: + // it's a LE or a NE token + if (($this->_lookahead == '=') or ($this->_lookahead == '>')) { + break; + } + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_GE: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_LE: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_EQ: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_NE: + return $token; + break; + default: + // if it's a reference + if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$token) and + !ereg("[0-9]",$this->_lookahead) and + ($this->_lookahead != ':') and ($this->_lookahead != '.') and + ($this->_lookahead != '!')) + { + return $token; + } + // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1) + elseif (preg_match("/^\w+(\:\w+)?\![A-Ia-i]?[A-Za-z][0-9]+$/u",$token) and + !ereg("[0-9]",$this->_lookahead) and + ($this->_lookahead != ':') and ($this->_lookahead != '.')) + { + return $token; + } + // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1) + elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\![A-Ia-i]?[A-Za-z][0-9]+$/u",$token) and + !ereg("[0-9]",$this->_lookahead) and + ($this->_lookahead != ':') and ($this->_lookahead != '.')) + { + return $token; + } + // if it's a range (A1:A2) + elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$token) and + !ereg("[0-9]",$this->_lookahead)) + { + return $token; + } + // if it's a range (A1..A2) + elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$token) and + !ereg("[0-9]",$this->_lookahead)) + { + return $token; + } + // If it's an external range like Sheet1!A1 or Sheet1:Sheet2!A1:B2 + elseif (preg_match("/^\w+(\:\w+)?\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/u",$token) and + !ereg("[0-9]",$this->_lookahead)) + { + return $token; + } + // If it's an external range like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1:B2 + elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/u",$token) and + !ereg("[0-9]",$this->_lookahead)) + { + return $token; + } + // If it's a number (check that it's not a sheet name or range) + elseif (is_numeric($token) and + (!is_numeric($token.$this->_lookahead) or ($this->_lookahead == '')) and + ($this->_lookahead != '!') and ($this->_lookahead != ':')) + { + return $token; + } + // If it's a string (of maximum 255 characters) + elseif (ereg("^\"[^\"]{0,255}\"$",$token)) + { + return $token; + } + // if it's a function call + elseif (eregi("^[A-Z0-9\xc0-\xdc\.]+$",$token) and ($this->_lookahead == "(")) + { + return $token; + } + return ''; + } + } + + /** + * The parsing method. It parses a formula. + * + * @access public + * @param string $formula The formula to parse, without the initial equal + * sign (=). + * @return mixed true on success, PEAR_Error on failure + */ + function parse($formula) + { + $this->_current_char = 0; + $this->_formula = $formula; + $this->_lookahead = $formula{1}; + $this->_advance(); + $this->_parse_tree = $this->_condition(); + if (PEAR::isError($this->_parse_tree)) { + return $this->_parse_tree; + } + return true; + } + + /** + * It parses a condition. It assumes the following rule: + * Cond -> Expr [(">" | "<") Expr] + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _condition() + { + $result = $this->_expression(); + if (PEAR::isError($result)) { + return $result; + } + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_LT) { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgLT', $result, $result2); + } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_GT) { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgGT', $result, $result2); + } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_LE) { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgLE', $result, $result2); + } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_GE) { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgGE', $result, $result2); + } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_EQ) { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgEQ', $result, $result2); + } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_NE) { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgNE', $result, $result2); + } + return $result; + } + + /** + * It parses a expression. It assumes the following rule: + * Expr -> Term [("+" | "-") Term] + * -> "string" + * -> "-" Term + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _expression() + { + // If it's a string return a string node + if (ereg("^\"[^\"]{0,255}\"$", $this->_current_token)) { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_SUB) { + // catch "-" Term + $this->_advance(); + $result2 = $this->_expression(); + $result = $this->_createTree('ptgUminus', $result2, ''); + return $result; + } + $result = $this->_term(); + if (PEAR::isError($result)) { + return $result; + } + while (($this->_current_token == SPREADSHEET_EXCEL_WRITER_ADD) or + ($this->_current_token == SPREADSHEET_EXCEL_WRITER_SUB)) { + /**/ + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_ADD) { + $this->_advance(); + $result2 = $this->_term(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgAdd', $result, $result2); + } else { + $this->_advance(); + $result2 = $this->_term(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgSub', $result, $result2); + } + } + return $result; + } + + /** + * This function just introduces a ptgParen element in the tree, so that Excel + * doesn't get confused when working with a parenthesized formula afterwards. + * + * @access private + * @see _fact() + * @return array The parsed ptg'd tree + */ + function _parenthesizedExpression() + { + $result = $this->_createTree('ptgParen', $this->_expression(), ''); + return $result; + } + + /** + * It parses a term. It assumes the following rule: + * Term -> Fact [("*" | "/") Fact] + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _term() + { + $result = $this->_fact(); + if (PEAR::isError($result)) { + return $result; + } + while (($this->_current_token == SPREADSHEET_EXCEL_WRITER_MUL) or + ($this->_current_token == SPREADSHEET_EXCEL_WRITER_DIV)) { + /**/ + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_MUL) { + $this->_advance(); + $result2 = $this->_fact(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgMul', $result, $result2); + } else { + $this->_advance(); + $result2 = $this->_fact(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgDiv', $result, $result2); + } + } + return $result; + } + + /** + * It parses a factor. It assumes the following rule: + * Fact -> ( Expr ) + * | CellRef + * | CellRange + * | Number + * | Function + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _fact() + { + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_OPEN) { + $this->_advance(); // eat the "(" + $result = $this->_parenthesizedExpression(); + if ($this->_current_token != SPREADSHEET_EXCEL_WRITER_CLOSE) { + return $this->raiseError("')' token expected."); + } + $this->_advance(); // eat the ")" + return $result; + } + // if it's a reference + if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1) + elseif (preg_match("/^\w+(\:\w+)?\![A-Ia-i]?[A-Za-z][0-9]+$/u",$this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1) + elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\![A-Ia-i]?[A-Za-z][0-9]+$/u",$this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // if it's a range + elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$this->_current_token) or + preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$this->_current_token)) + { + $result = $this->_current_token; + $this->_advance(); + return $result; + } + // If it's an external range (Sheet1!A1 or Sheet1!A1:B2) + elseif (preg_match("/^\w+(\:\w+)?\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/u",$this->_current_token)) + { + $result = $this->_current_token; + $this->_advance(); + return $result; + } + // If it's an external range ('Sheet1'!A1 or 'Sheet1'!A1:B2) + elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/u",$this->_current_token)) + { + $result = $this->_current_token; + $this->_advance(); + return $result; + } + elseif (is_numeric($this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // if it's a function call + elseif (eregi("^[A-Z0-9\xc0-\xdc\.]+$",$this->_current_token)) + { + $result = $this->_func(); + return $result; + } + return $this->raiseError("Syntax error: ".$this->_current_token. + ", lookahead: ".$this->_lookahead. + ", current char: ".$this->_current_char); + } + + /** + * It parses a function call. It assumes the following rule: + * Func -> ( Expr [,Expr]* ) + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _func() + { + $num_args = 0; // number of arguments received + $function = strtoupper($this->_current_token); + $result = ''; // initialize result + $this->_advance(); + $this->_advance(); // eat the "(" + while ($this->_current_token != ')') { + /**/ + if ($num_args > 0) { + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_COMA or + $this->_current_token == SPREADSHEET_EXCEL_WRITER_SEMICOLON) + { + $this->_advance(); // eat the "," or ";" + } else { + return $this->raiseError("Syntax error: comma expected in ". + "function $function, arg #{$num_args}"); + } + $result2 = $this->_condition(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('arg', $result, $result2); + } else { // first argument + $result2 = $this->_condition(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('arg', '', $result2); + } + $num_args++; + } + if (!isset($this->_functions[$function])) { + return $this->raiseError("Function $function() doesn't exist"); + } + $args = $this->_functions[$function][1]; + // If fixed number of args eg. TIME($i,$j,$k). Check that the number of args is valid. + if (($args >= 0) and ($args != $num_args)) { + return $this->raiseError("Incorrect number of arguments in function $function() "); + } + + $result = $this->_createTree($function, $result, $num_args); + $this->_advance(); // eat the ")" + return $result; + } + + /** + * Creates a tree. In fact an array which may have one or two arrays (sub-trees) + * as elements. + * + * @access private + * @param mixed $value The value of this node. + * @param mixed $left The left array (sub-tree) or a final node. + * @param mixed $right The right array (sub-tree) or a final node. + * @return array A tree + */ + function _createTree($value, $left, $right) + { + return array('value' => $value, 'left' => $left, 'right' => $right); + } + + /** + * Builds a string containing the tree in reverse polish notation (What you + * would use in a HP calculator stack). + * The following tree: + * + * + + * / \ + * 2 3 + * + * produces: "23+" + * + * The following tree: + * + * + + * / \ + * 3 * + * / \ + * 6 A1 + * + * produces: "36A1*+" + * + * In fact all operands, functions, references, etc... are written as ptg's + * + * @access public + * @param array $tree The optional tree to convert. + * @return string The tree in reverse polish notation + */ + function toReversePolish($tree = array()) + { + $polish = ""; // the string we are going to return + if (empty($tree)) { // If it's the first call use _parse_tree + $tree = $this->_parse_tree; + } + if (is_array($tree['left'])) { + $converted_tree = $this->toReversePolish($tree['left']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } elseif ($tree['left'] != '') { // It's a final node + $converted_tree = $this->_convert($tree['left']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } + if (is_array($tree['right'])) { + $converted_tree = $this->toReversePolish($tree['right']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } elseif ($tree['right'] != '') { // It's a final node + $converted_tree = $this->_convert($tree['right']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } + // if it's a function convert it here (so we can set it's arguments) + if (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/",$tree['value']) and + !preg_match('/^([A-Ia-i]?[A-Za-z])(\d+)$/',$tree['value']) and + !preg_match("/^[A-Ia-i]?[A-Za-z](\d+)\.\.[A-Ia-i]?[A-Za-z](\d+)$/",$tree['value']) and + !is_numeric($tree['value']) and + !isset($this->ptg[$tree['value']])) + { + // left subtree for a function is always an array. + if ($tree['left'] != '') { + $left_tree = $this->toReversePolish($tree['left']); + } else { + $left_tree = ''; + } + if (PEAR::isError($left_tree)) { + return $left_tree; + } + // add it's left subtree and return. + return $left_tree.$this->_convertFunction($tree['value'], $tree['right']); + } else { + $converted_tree = $this->_convert($tree['value']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + } + $polish .= $converted_tree; + return $polish; + } +} +?> diff --git a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Validator.php b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Validator.php new file mode 100644 index 00000000..0f091c61 --- /dev/null +++ b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Validator.php @@ -0,0 +1,230 @@ + +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +//require_once('PEAR.php'); + +// Possible operator types + +/* +FIXME: change prefixes +*/ +define("OP_BETWEEN", 0x00); +define("OP_NOTBETWEEN", 0x01); +define("OP_EQUAL", 0x02); +define("OP_NOTEQUAL", 0x03); +define("OP_GT", 0x04); +define("OP_LT", 0x05); +define("OP_GTE", 0x06); +define("OP_LTE", 0x07); + +/** +* Baseclass for generating Excel DV records (validations) +* +* @author Herman Kuiper +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ +class Spreadsheet_Excel_Writer_Validator +{ + var $_type; + var $_style; + var $_fixedList; + var $_blank; + var $_incell; + var $_showprompt; + var $_showerror; + var $_title_prompt; + var $_descr_prompt; + var $_title_error; + var $_descr_error; + var $_operator; + var $_formula1; + var $_formula2; + /** + * The parser from the workbook. Used to parse validation formulas also + * @var Spreadsheet_Excel_Writer_Parser + */ + var $_parser; + + function Spreadsheet_Excel_Writer_Validator(&$parser) + { + $this->_parser = $parser; + $this->_type = 0x01; // FIXME: add method for setting datatype + $this->_style = 0x00; + $this->_fixedList = false; + $this->_blank = false; + $this->_incell = false; + $this->_showprompt = false; + $this->_showerror = true; + $this->_title_prompt = "\x00"; + $this->_descr_prompt = "\x00"; + $this->_title_error = "\x00"; + $this->_descr_error = "\x00"; + $this->_operator = 0x00; // default is equal + $this->_formula1 = ''; + $this->_formula2 = ''; + } + + function setPrompt($promptTitle = "\x00", $promptDescription = "\x00", $showPrompt = true) + { + $this->_showprompt = $showPrompt; + $this->_title_prompt = $promptTitle; + $this->_descr_prompt = $promptDescription; + } + + function setError($errorTitle = "\x00", $errorDescription = "\x00", $showError = true) + { + $this->_showerror = $showError; + $this->_title_error = $errorTitle; + $this->_descr_error = $errorDescription; + } + + function allowBlank() + { + $this->_blank = true; + } + + function onInvalidStop() + { + $this->_style = 0x00; + } + + function onInvalidWarn() + { + $this->_style = 0x01; + } + + function onInvalidInfo() + { + $this->_style = 0x02; + } + + function setFormula1($formula) + { + // Parse the formula using the parser in Parser.php + $error = $this->_parser->parse($formula); + if (PEAR::isError($error)) { + return $this->_formula1; + } + + $this->_formula1 = $this->_parser->toReversePolish(); + if (PEAR::isError($this->_formula1)) { + return $this->_formula1; + } + return true; + } + + function setFormula2($formula) + { + // Parse the formula using the parser in Parser.php + $error = $this->_parser->parse($formula); + if (PEAR::isError($error)) { + return $this->_formula2; + } + + $this->_formula2 = $this->_parser->toReversePolish(); + if (PEAR::isError($this->_formula2)) { + return $this->_formula2; + } + return true; + } + + function _getOptions() + { + $options = $this->_type; + $options |= $this->_style << 3; + if ($this->_fixedList) { + $options |= 0x80; + } + if ($this->_blank) { + $options |= 0x100; + } + if (!$this->_incell) { + $options |= 0x200; + } + if ($this->_showprompt) { + $options |= 0x40000; + } + if ($this->_showerror) { + $options |= 0x80000; + } + $options |= $this->_operator << 20; + + return $options; + } + + function _getData() + { + $title_prompt_len = strlen($this->_title_prompt); + $descr_prompt_len = strlen($this->_descr_prompt); + $title_error_len = strlen($this->_title_error); + $descr_error_len = strlen($this->_descr_error); + + $formula1_size = strlen($this->_formula1); + $formula2_size = strlen($this->_formula2); + + $data = pack("V", $this->_getOptions()); + $data .= pack("vC", $title_prompt_len, 0x00) . $this->_title_prompt; + $data .= pack("vC", $title_error_len, 0x00) . $this->_title_error; + $data .= pack("vC", $descr_prompt_len, 0x00) . $this->_descr_prompt; + $data .= pack("vC", $descr_error_len, 0x00) . $this->_descr_error; + + $data .= pack("vv", $formula1_size, 0x0000) . $this->_formula1; + $data .= pack("vv", $formula2_size, 0x0000) . $this->_formula2; + + return $data; + } +} + +/*class Spreadsheet_Excel_Writer_Validation_List extends Spreadsheet_Excel_Writer_Validation +{ + function Spreadsheet_Excel_Writer_Validation_list() + { + parent::Spreadsheet_Excel_Writer_Validation(); + $this->_type = 0x03; + } + + function setList($source, $incell = true) + { + $this->_incell = $incell; + $this->_fixedList = true; + + $source = implode("\x00", $source); + $this->_formula1 = pack("CCC", 0x17, strlen($source), 0x0c) . $source; + } + + function setRow($row, $col1, $col2, $incell = true) + { + $this->_incell = $incell; + //$this->_formula1 = ...; + } + + function setCol($col, $row1, $row2, $incell = true) + { + $this->_incell = $incell; + //$this->_formula1 = ...; + } +}*/ + +?> diff --git a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Workbook.php b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Workbook.php new file mode 100644 index 00000000..586f4b2b --- /dev/null +++ b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Workbook.php @@ -0,0 +1,1605 @@ + +* +* The majority of this is _NOT_ my code. I simply ported it from the +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} +require_once $homedir.'/classes/pear/Spreadsheet/Excel/Writer/Format.php'; +require_once $homedir.'/classes/pear/Spreadsheet/Excel/Writer/BIFFwriter.php'; +require_once $homedir.'/classes/pear/Spreadsheet/Excel/Writer/Worksheet.php'; +require_once $homedir.'/classes/pear/Spreadsheet/Excel/Writer/Parser.php'; +require_once $homedir.'/classes/pear/OLE/PPS/Root.php'; +require_once $homedir.'/classes/pear/OLE/PPS/File.php'; + +/** +* Class for generating Excel Spreadsheets +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwriter +{ + /** + * Filename for the Workbook + * @var string + */ + var $_filename; + + /** + * Formula parser + * @var object Parser + */ + var $_parser; + + /** + * Flag for 1904 date system (0 => base date is 1900, 1 => base date is 1904) + * @var integer + */ + var $_1904; + + /** + * The active worksheet of the workbook (0 indexed) + * @var integer + */ + var $_activesheet; + + /** + * 1st displayed worksheet in the workbook (0 indexed) + * @var integer + */ + var $_firstsheet; + + /** + * Number of workbook tabs selected + * @var integer + */ + var $_selected; + + /** + * Index for creating adding new formats to the workbook + * @var integer + */ + var $_xf_index; + + /** + * Flag for preventing close from being called twice. + * @var integer + * @see close() + */ + var $_fileclosed; + + /** + * The BIFF file size for the workbook. + * @var integer + * @see _calcSheetOffsets() + */ + var $_biffsize; + + /** + * The default sheetname for all sheets created. + * @var string + */ + var $_sheetname; + + /** + * The default XF format. + * @var object Format + */ + var $_tmp_format; + + /** + * Array containing references to all of this workbook's worksheets + * @var array + */ + var $_worksheets; + + /** + * Array of sheetnames for creating the EXTERNSHEET records + * @var array + */ + var $_sheetnames; + + /** + * Array containing references to all of this workbook's formats + * @var array + */ + var $_formats; + + /** + * Array containing the colour palette + * @var array + */ + var $_palette; + + /** + * The default format for URLs. + * @var object Format + */ + var $_url_format; + + /** + * The codepage indicates the text encoding used for strings + * @var integer + */ + var $_codepage; + + /** + * The country code used for localization + * @var integer + */ + var $_country_code; + + /** + * The temporary dir for storing the OLE file + * @var string + */ + var $_tmp_dir; + + /** + * number of bytes for sizeinfo of strings + * @var integer + */ + var $_string_sizeinfo_size; + + /** + * Class constructor + * + * @param string filename for storing the workbook. "-" for writing to stdout. + * @access public + */ + function Spreadsheet_Excel_Writer_Workbook($filename) + { + // It needs to call its parent's constructor explicitly + $this->Spreadsheet_Excel_Writer_BIFFwriter(); + + $this->_filename = $filename; + $this->_parser =& new Spreadsheet_Excel_Writer_Parser($this->_byte_order, $this->_BIFF_version); + $this->_1904 = 0; + $this->_activesheet = 0; + $this->_firstsheet = 0; + $this->_selected = 0; + $this->_xf_index = 16; // 15 style XF's and 1 cell XF. + $this->_fileclosed = 0; + $this->_biffsize = 0; + $this->_sheetname = 'Sheet'; + $this->_tmp_format =& new Spreadsheet_Excel_Writer_Format($this->_BIFF_version); + $this->_worksheets = array(); + $this->_sheetnames = array(); + $this->_formats = array(); + $this->_palette = array(); + $this->_codepage = 0x04E4; // FIXME: should change for BIFF8 + $this->_country_code = -1; + $this->_string_sizeinfo = 3; + + // Add the default format for hyperlinks + $this->_url_format =& $this->addFormat(array('color' => 'blue', 'underline' => 1)); + $this->_str_total = 0; + $this->_str_unique = 0; + $this->_str_table = array(); + $this->_setPaletteXl97(); + $this->_tmp_dir = ''; + } + + /** + * Calls finalization methods. + * This method should always be the last one to be called on every workbook + * + * @access public + * @return mixed true on success. PEAR_Error on failure + */ + function close() + { + if ($this->_fileclosed) { // Prevent close() from being called twice. + return true; + } + $res = $this->_storeWorkbook(); + if ($this->isError($res)) { + return $this->raiseError($res->getMessage()); + } + $this->_fileclosed = 1; + return true; + } + + /** + * An accessor for the _worksheets[] array + * Returns an array of the worksheet objects in a workbook + * It actually calls to worksheets() + * + * @access public + * @see worksheets() + * @return array + */ + function sheets() + { + return $this->worksheets(); + } + + /** + * An accessor for the _worksheets[] array. + * Returns an array of the worksheet objects in a workbook + * + * @access public + * @return array + */ + function worksheets() + { + return $this->_worksheets; + } + + /** + * Sets the BIFF version. + * This method exists just to access experimental functionality + * from BIFF8. It will be deprecated ! + * Only possible value is 8 (Excel 97/2000). + * For any other value it fails silently. + * + * @access public + * @param integer $version The BIFF version + */ + function setVersion($version) + { + if ($version == 8) { // only accept version 8 + $version = 0x0600; + $this->_BIFF_version = $version; + // change BIFFwriter limit for CONTINUE records + $this->_limit = 8228; + $this->_tmp_format->_BIFF_version = $version; + $this->_url_format->_BIFF_version = $version; + $this->_parser->_BIFF_version = $version; + + $total_worksheets = count($this->_worksheets); + // change version for all worksheets too + for ($i = 0; $i < $total_worksheets; $i++) { + $this->_worksheets[$i]->_BIFF_version = $version; + } + + $total_formats = count($this->_formats); + // change version for all formats too + for ($i = 0; $i < $total_formats; $i++) { + $this->_formats[$i]->_BIFF_version = $version; + } + } + } + + /** + * Set the country identifier for the workbook + * + * @access public + * @param integer $code Is the international calling country code for the + * chosen country. + */ + function setCountry($code) + { + $this->_country_code = $code; + } + + /** + * Add a new worksheet to the Excel workbook. + * If no name is given the name of the worksheet will be Sheeti$i, with + * $i in [1..]. + * + * @access public + * @param string $name the optional name of the worksheet + * @return mixed reference to a worksheet object on success, PEAR_Error + * on failure + */ + function &addWorksheet($name = '') + { + $index = count($this->_worksheets); + $sheetname = $this->_sheetname; + + if ($name == '') { + $name = $sheetname.($index+1); + } + + // Check that sheetname is <= 31 chars (Excel limit before BIFF8). + if ($this->_BIFF_version != 0x0600) + { + if (strlen($name) > 31) { + return $this->raiseError("Sheetname $name must be <= 31 chars"); + } + } + + // Check that the worksheet name doesn't already exist: a fatal Excel error. + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + if ($this->_worksheets[$i]->getName() == $name) { + return $this->raiseError("Worksheet '$name' already exists"); + } + } + + $worksheet = new Spreadsheet_Excel_Writer_Worksheet($this->_BIFF_version, + $name, $index, + $this->_activesheet, $this->_firstsheet, + $this->_str_total, $this->_str_unique, + $this->_str_table, $this->_url_format, + $this->_parser); + + $this->_worksheets[$index] = &$worksheet; // Store ref for iterator + $this->_sheetnames[$index] = $name; // Store EXTERNSHEET names + $this->_parser->setExtSheet($name, $index); // Register worksheet name with parser + return $worksheet; + } + + /** + * Add a new format to the Excel workbook. + * Also, pass any properties to the Format constructor. + * + * @access public + * @param array $properties array with properties for initializing the format. + * @return &Spreadsheet_Excel_Writer_Format reference to an Excel Format + */ + function &addFormat($properties = array()) + { + $format = new Spreadsheet_Excel_Writer_Format($this->_BIFF_version, $this->_xf_index, $properties); + $this->_xf_index += 1; + $this->_formats[] = &$format; + return $format; + } + + /** + * Create new validator. + * + * @access public + * @return &Spreadsheet_Excel_Writer_Validator reference to a Validator + */ + function &addValidator() + { + include_once 'Spreadsheet/Excel/Writer/Validator.php'; + /* FIXME: check for successful inclusion*/ + $valid = new Spreadsheet_Excel_Writer_Validator($this->_parser); + return $valid; + } + + /** + * Change the RGB components of the elements in the colour palette. + * + * @access public + * @param integer $index colour index + * @param integer $red red RGB value [0-255] + * @param integer $green green RGB value [0-255] + * @param integer $blue blue RGB value [0-255] + * @return integer The palette index for the custom color + */ + function setCustomColor($index, $red, $green, $blue) + { + // Match a HTML #xxyyzz style parameter + /*if (defined $_[1] and $_[1] =~ /^#(\w\w)(\w\w)(\w\w)/ ) { + @_ = ($_[0], hex $1, hex $2, hex $3); + }*/ + + // Check that the colour index is the right range + if ($index < 8 or $index > 64) { + // TODO: assign real error codes + return $this->raiseError("Color index $index outside range: 8 <= index <= 64"); + } + + // Check that the colour components are in the right range + if (($red < 0 or $red > 255) || + ($green < 0 or $green > 255) || + ($blue < 0 or $blue > 255)) + { + return $this->raiseError("Color component outside range: 0 <= color <= 255"); + } + + $index -= 8; // Adjust colour index (wingless dragonfly) + + // Set the RGB value + $this->_palette[$index] = array($red, $green, $blue, 0); + return($index + 8); + } + + /** + * Sets the colour palette to the Excel 97+ default. + * + * @access private + */ + function _setPaletteXl97() + { + $this->_palette = array( + array(0x00, 0x00, 0x00, 0x00), // 8 + array(0xff, 0xff, 0xff, 0x00), // 9 + array(0xff, 0x00, 0x00, 0x00), // 10 + array(0x00, 0xff, 0x00, 0x00), // 11 + array(0x00, 0x00, 0xff, 0x00), // 12 + array(0xff, 0xff, 0x00, 0x00), // 13 + array(0xff, 0x00, 0xff, 0x00), // 14 + array(0x00, 0xff, 0xff, 0x00), // 15 + array(0x80, 0x00, 0x00, 0x00), // 16 + array(0x00, 0x80, 0x00, 0x00), // 17 + array(0x00, 0x00, 0x80, 0x00), // 18 + array(0x80, 0x80, 0x00, 0x00), // 19 + array(0x80, 0x00, 0x80, 0x00), // 20 + array(0x00, 0x80, 0x80, 0x00), // 21 + array(0xc0, 0xc0, 0xc0, 0x00), // 22 + array(0x80, 0x80, 0x80, 0x00), // 23 + array(0x99, 0x99, 0xff, 0x00), // 24 + array(0x99, 0x33, 0x66, 0x00), // 25 + array(0xff, 0xff, 0xcc, 0x00), // 26 + array(0xcc, 0xff, 0xff, 0x00), // 27 + array(0x66, 0x00, 0x66, 0x00), // 28 + array(0xff, 0x80, 0x80, 0x00), // 29 + array(0x00, 0x66, 0xcc, 0x00), // 30 + array(0xcc, 0xcc, 0xff, 0x00), // 31 + array(0x00, 0x00, 0x80, 0x00), // 32 + array(0xff, 0x00, 0xff, 0x00), // 33 + array(0xff, 0xff, 0x00, 0x00), // 34 + array(0x00, 0xff, 0xff, 0x00), // 35 + array(0x80, 0x00, 0x80, 0x00), // 36 + array(0x80, 0x00, 0x00, 0x00), // 37 + array(0x00, 0x80, 0x80, 0x00), // 38 + array(0x00, 0x00, 0xff, 0x00), // 39 + array(0x00, 0xcc, 0xff, 0x00), // 40 + array(0xcc, 0xff, 0xff, 0x00), // 41 + array(0xcc, 0xff, 0xcc, 0x00), // 42 + array(0xff, 0xff, 0x99, 0x00), // 43 + array(0x99, 0xcc, 0xff, 0x00), // 44 + array(0xff, 0x99, 0xcc, 0x00), // 45 + array(0xcc, 0x99, 0xff, 0x00), // 46 + array(0xff, 0xcc, 0x99, 0x00), // 47 + array(0x33, 0x66, 0xff, 0x00), // 48 + array(0x33, 0xcc, 0xcc, 0x00), // 49 + array(0x99, 0xcc, 0x00, 0x00), // 50 + array(0xff, 0xcc, 0x00, 0x00), // 51 + array(0xff, 0x99, 0x00, 0x00), // 52 + array(0xff, 0x66, 0x00, 0x00), // 53 + array(0x66, 0x66, 0x99, 0x00), // 54 + array(0x96, 0x96, 0x96, 0x00), // 55 + array(0x00, 0x33, 0x66, 0x00), // 56 + array(0x33, 0x99, 0x66, 0x00), // 57 + array(0x00, 0x33, 0x00, 0x00), // 58 + array(0x33, 0x33, 0x00, 0x00), // 59 + array(0x99, 0x33, 0x00, 0x00), // 60 + array(0x99, 0x33, 0x66, 0x00), // 61 + array(0x33, 0x33, 0x99, 0x00), // 62 + array(0x33, 0x33, 0x33, 0x00), // 63 + ); + } + + /** + * Assemble worksheets into a workbook and send the BIFF data to an OLE + * storage. + * + * @access private + * @return mixed true on success. PEAR_Error on failure + */ + function _storeWorkbook() + { + // Ensure that at least one worksheet has been selected. + if ($this->_activesheet == 0) { + $this->_worksheets[0]->selected = 1; + } + + // Calculate the number of selected worksheet tabs and call the finalization + // methods for each worksheet + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + if ($this->_worksheets[$i]->selected) { + $this->_selected++; + } + $this->_worksheets[$i]->close($this->_sheetnames); + } + + // Add Workbook globals + $this->_storeBof(0x0005); + $this->_storeCodepage(); + if ($this->_BIFF_version == 0x0600) { + $this->_storeWindow1(); + } + if ($this->_BIFF_version == 0x0500) { + $this->_storeExterns(); // For print area and repeat rows + } + $this->_storeNames(); // For print area and repeat rows + if ($this->_BIFF_version == 0x0500) { + $this->_storeWindow1(); + } + $this->_storeDatemode(); + $this->_storeAllFonts(); + $this->_storeAllNumFormats(); + $this->_storeAllXfs(); + $this->_storeAllStyles(); + $this->_storePalette(); + $this->_calcSheetOffsets(); + + // Add BOUNDSHEET records + for ($i = 0; $i < $total_worksheets; $i++) { + $this->_storeBoundsheet($this->_worksheets[$i]->name,$this->_worksheets[$i]->offset); + } + + if ($this->_country_code != -1) { + $this->_storeCountry(); + } + + if ($this->_BIFF_version == 0x0600) { + //$this->_storeSupbookInternal(); + /* TODO: store external SUPBOOK records and XCT and CRN records + in case of external references for BIFF8 */ + //$this->_storeExternsheetBiff8(); + $this->_storeSharedStringsTable(); + } + + // End Workbook globals + $this->_storeEof(); + + // Store the workbook in an OLE container + $res = $this->_storeOLEFile(); + if ($this->isError($res)) { + return $this->raiseError($res->getMessage()); + } + return true; + } + + /** + * Sets the temp dir used for storing the OLE file + * + * @access public + * @param string $dir The dir to be used as temp dir + * @return true if given dir is valid, false otherwise + */ + function setTempDir($dir) + { + if (is_dir($dir)) { + $this->_tmp_dir = $dir; + return true; + } + return false; + } + + /** + * Store the workbook in an OLE container + * + * @access private + * @return mixed true on success. PEAR_Error on failure + */ + function _storeOLEFile() + { + $OLE = new OLE_PPS_File(OLE::Asc2Ucs('Book')); + if ($this->_tmp_dir != '') { + $OLE->setTempDir($this->_tmp_dir); + } + $res = $OLE->init(); + if ($this->isError($res)) { + return $this->raiseError("OLE Error: ".$res->getMessage()); + } + $OLE->append($this->_data); + + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + while ($tmp = $this->_worksheets[$i]->getData()) { + $OLE->append($tmp); + } + } + + $root = new OLE_PPS_Root(time(), time(), array($OLE)); + if ($this->_tmp_dir != '') { + $root->setTempDir($this->_tmp_dir); + } + + $res = $root->save($this->_filename); + if ($this->isError($res)) { + return $this->raiseError("OLE Error: ".$res->getMessage()); + } + return true; + } + + /** + * Calculate offsets for Worksheet BOF records. + * + * @access private + */ + function _calcSheetOffsets() + { + if ($this->_BIFF_version == 0x0600) { + $boundsheet_length = 12; // fixed length for a BOUNDSHEET record + } else { + $boundsheet_length = 11; + } + $EOF = 4; + $offset = $this->_datasize; + + if ($this->_BIFF_version == 0x0600) { + // add the length of the SST + /* TODO: check this works for a lot of strings (> 8224 bytes) */ + $offset += $this->_calculateSharedStringsSizes(); + if ($this->_country_code != -1) { + $offset += 8; // adding COUNTRY record + } + // add the lenght of SUPBOOK, EXTERNSHEET and NAME records + //$offset += 8; // FIXME: calculate real value when storing the records + } + $total_worksheets = count($this->_worksheets); + // add the length of the BOUNDSHEET records + for ($i = 0; $i < $total_worksheets; $i++) { + $offset += $boundsheet_length + strlen($this->_worksheets[$i]->name); + } + $offset += $EOF; + + for ($i = 0; $i < $total_worksheets; $i++) { + $this->_worksheets[$i]->offset = $offset; + $offset += $this->_worksheets[$i]->_datasize; + } + $this->_biffsize = $offset; + } + + /** + * Store the Excel FONT records. + * + * @access private + */ + function _storeAllFonts() + { + // tmp_format is added by the constructor. We use this to write the default XF's + $format = $this->_tmp_format; + $font = $format->getFont(); + + // Note: Fonts are 0-indexed. According to the SDK there is no index 4, + // so the following fonts are 0, 1, 2, 3, 5 + // + for ($i = 1; $i <= 5; $i++){ + $this->_append($font); + } + + // Iterate through the XF objects and write a FONT record if it isn't the + // same as the default FONT and if it hasn't already been used. + // + $fonts = array(); + $index = 6; // The first user defined FONT + + $key = $format->getFontKey(); // The default font from _tmp_format + $fonts[$key] = 0; // Index of the default font + + $total_formats = count($this->_formats); + for ($i = 0; $i < $total_formats; $i++) { + $key = $this->_formats[$i]->getFontKey(); + if (isset($fonts[$key])) { + // FONT has already been used + $this->_formats[$i]->font_index = $fonts[$key]; + } else { + // Add a new FONT record + $fonts[$key] = $index; + $this->_formats[$i]->font_index = $index; + $index++; + $font = $this->_formats[$i]->getFont(); + $this->_append($font); + } + } + } + + /** + * Store user defined numerical formats i.e. FORMAT records + * + * @access private + */ + function _storeAllNumFormats() + { + // Leaning num_format syndrome + $hash_num_formats = array(); + $num_formats = array(); + $index = 164; + + // Iterate through the XF objects and write a FORMAT record if it isn't a + // built-in format type and if the FORMAT string hasn't already been used. + $total_formats = count($this->_formats); + for ($i = 0; $i < $total_formats; $i++) { + $num_format = $this->_formats[$i]->_num_format; + + // Check if $num_format is an index to a built-in format. + // Also check for a string of zeros, which is a valid format string + // but would evaluate to zero. + // + if (!preg_match("/^0+\d/", $num_format)) { + if (preg_match("/^\d+$/", $num_format)) { // built-in format + continue; + } + } + + if (isset($hash_num_formats[$num_format])) { + // FORMAT has already been used + $this->_formats[$i]->_num_format = $hash_num_formats[$num_format]; + } else{ + // Add a new FORMAT + $hash_num_formats[$num_format] = $index; + $this->_formats[$i]->_num_format = $index; + array_push($num_formats,$num_format); + $index++; + } + } + + // Write the new FORMAT records starting from 0xA4 + $index = 164; + foreach ($num_formats as $num_format) { + $this->_storeNumFormat($num_format,$index); + $index++; + } + } + + /** + * Write all XF records. + * + * @access private + */ + function _storeAllXfs() + { + // _tmp_format is added by the constructor. We use this to write the default XF's + // The default font index is 0 + // + $format = $this->_tmp_format; + for ($i = 0; $i <= 14; $i++) { + $xf = $format->getXf('style'); // Style XF + $this->_append($xf); + } + + $xf = $format->getXf('cell'); // Cell XF + $this->_append($xf); + + // User defined XFs + $total_formats = count($this->_formats); + for ($i = 0; $i < $total_formats; $i++) { + $xf = $this->_formats[$i]->getXf('cell'); + $this->_append($xf); + } + } + + /** + * Write all STYLE records. + * + * @access private + */ + function _storeAllStyles() + { + $this->_storeStyle(); + } + + /** + * Write the EXTERNCOUNT and EXTERNSHEET records. These are used as indexes for + * the NAME records. + * + * @access private + */ + function _storeExterns() + { + // Create EXTERNCOUNT with number of worksheets + $this->_storeExterncount(count($this->_worksheets)); + + // Create EXTERNSHEET for each worksheet + foreach ($this->_sheetnames as $sheetname) { + $this->_storeExternsheet($sheetname); + } + } + + /** + * Write the NAME record to define the print area and the repeat rows and cols. + * + * @access private + */ + function _storeNames() + { + // Create the print area NAME records + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + // Write a Name record if the print area has been defined + if (isset($this->_worksheets[$i]->print_rowmin)) { + $this->_storeNameShort( + $this->_worksheets[$i]->index, + 0x06, // NAME type + $this->_worksheets[$i]->print_rowmin, + $this->_worksheets[$i]->print_rowmax, + $this->_worksheets[$i]->print_colmin, + $this->_worksheets[$i]->print_colmax + ); + } + } + + // Create the print title NAME records + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + $rowmin = $this->_worksheets[$i]->title_rowmin; + $rowmax = $this->_worksheets[$i]->title_rowmax; + $colmin = $this->_worksheets[$i]->title_colmin; + $colmax = $this->_worksheets[$i]->title_colmax; + + // Determine if row + col, row, col or nothing has been defined + // and write the appropriate record + // + if (isset($rowmin) && isset($colmin)) { + // Row and column titles have been defined. + // Row title has been defined. + $this->_storeNameLong( + $this->_worksheets[$i]->index, + 0x07, // NAME type + $rowmin, + $rowmax, + $colmin, + $colmax + ); + } elseif (isset($rowmin)) { + // Row title has been defined. + $this->_storeNameShort( + $this->_worksheets[$i]->index, + 0x07, // NAME type + $rowmin, + $rowmax, + 0x00, + 0xff + ); + } elseif (isset($colmin)) { + // Column title has been defined. + $this->_storeNameShort( + $this->_worksheets[$i]->index, + 0x07, // NAME type + 0x0000, + 0x3fff, + $colmin, + $colmax + ); + } else { + // Print title hasn't been defined. + } + } + } + + + + + /****************************************************************************** + * + * BIFF RECORDS + * + */ + + /** + * Stores the CODEPAGE biff record. + * + * @access private + */ + function _storeCodepage() + { + $record = 0x0042; // Record identifier + $length = 0x0002; // Number of bytes to follow + $cv = $this->_codepage; // The code page + + $header = pack('vv', $record, $length); + $data = pack('v', $cv); + + $this->_append($header . $data); + } + + /** + * Write Excel BIFF WINDOW1 record. + * + * @access private + */ + function _storeWindow1() + { + $record = 0x003D; // Record identifier + $length = 0x0012; // Number of bytes to follow + + $xWn = 0x0000; // Horizontal position of window + $yWn = 0x0000; // Vertical position of window + $dxWn = 0x25BC; // Width of window + $dyWn = 0x1572; // Height of window + + $grbit = 0x0038; // Option flags + $ctabsel = $this->_selected; // Number of workbook tabs selected + $wTabRatio = 0x0258; // Tab to scrollbar ratio + + $itabFirst = $this->_firstsheet; // 1st displayed worksheet + $itabCur = $this->_activesheet; // Active worksheet + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvvv", $xWn, $yWn, $dxWn, $dyWn, + $grbit, + $itabCur, $itabFirst, + $ctabsel, $wTabRatio); + $this->_append($header . $data); + } + + /** + * Writes Excel BIFF BOUNDSHEET record. + * FIXME: inconsistent with BIFF documentation + * + * @param string $sheetname Worksheet name + * @param integer $offset Location of worksheet BOF + * @access private + */ + function _storeBoundsheet($sheetname,$offset) + { + $record = 0x0085; // Record identifier + if ($this->_BIFF_version == 0x0600) { + $length = 0x08 + strlen($sheetname); // Number of bytes to follow + } else { + $length = 0x07 + strlen($sheetname); // Number of bytes to follow + } + + $grbit = 0x0000; // Visibility and sheet type + $cch = strlen($sheetname); // Length of sheet name + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0600) { + $data = pack("Vvv", $offset, $grbit, $cch); + } else { + $data = pack("VvC", $offset, $grbit, $cch); + } + $this->_append($header.$data.$sheetname); + } + + /** + * Write Internal SUPBOOK record + * + * @access private + */ + function _storeSupbookInternal() + { + $record = 0x01AE; // Record identifier + $length = 0x0004; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vv", count($this->_worksheets), 0x0104); + $this->_append($header . $data); + } + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. + * + * @param string $sheetname Worksheet name + * @access private + */ + function _storeExternsheetBiff8() + { + $total_references = count($this->_parser->_references); + $record = 0x0017; // Record identifier + $length = 2 + 6 * $total_references; // Number of bytes to follow + + $supbook_index = 0; // FIXME: only using internal SUPBOOK record + $header = pack("vv", $record, $length); + $data = pack('v', $total_references); + for ($i = 0; $i < $total_references; $i++) { + $data .= $this->_parser->_references[$i]; + } + $this->_append($header . $data); + } + + /** + * Write Excel BIFF STYLE records. + * + * @access private + */ + function _storeStyle() + { + $record = 0x0293; // Record identifier + $length = 0x0004; // Bytes to follow + + $ixfe = 0x8000; // Index to style XF + $BuiltIn = 0x00; // Built-in style + $iLevel = 0xff; // Outline style level + + $header = pack("vv", $record, $length); + $data = pack("vCC", $ixfe, $BuiltIn, $iLevel); + $this->_append($header . $data); + } + + + /** + * Writes Excel FORMAT record for non "built-in" numerical formats. + * + * @param string $format Custom format string + * @param integer $ifmt Format index code + * @access private + */ + function _storeNumFormat($format, $ifmt) + { + $record = 0x041E; // Record identifier + + if ($this->_BIFF_version == 0x0600) { + $length = 5 + strlen($format); // Number of bytes to follow + $encoding = 0x0; + } elseif ($this->_BIFF_version == 0x0500) { + $length = 3 + strlen($format); // Number of bytes to follow + } + + $cch = strlen($format); // Length of format string + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0600) { + $data = pack("vvC", $ifmt, $cch, $encoding); + } elseif ($this->_BIFF_version == 0x0500) { + $data = pack("vC", $ifmt, $cch); + } + $this->_append($header . $data . $format); + } + + /** + * Write DATEMODE record to indicate the date system in use (1904 or 1900). + * + * @access private + */ + function _storeDatemode() + { + $record = 0x0022; // Record identifier + $length = 0x0002; // Bytes to follow + + $f1904 = $this->_1904; // Flag for 1904 date system + + $header = pack("vv", $record, $length); + $data = pack("v", $f1904); + $this->_append($header . $data); + } + + + /** + * Write BIFF record EXTERNCOUNT to indicate the number of external sheet + * references in the workbook. + * + * Excel only stores references to external sheets that are used in NAME. + * The workbook NAME record is required to define the print area and the repeat + * rows and columns. + * + * A similar method is used in Worksheet.php for a slightly different purpose. + * + * @param integer $cxals Number of external references + * @access private + */ + function _storeExterncount($cxals) + { + $record = 0x0016; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cxals); + $this->_append($header . $data); + } + + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. NAME record is required to define the print area and the repeat + * rows and columns. + * + * A similar method is used in Worksheet.php for a slightly different purpose. + * + * @param string $sheetname Worksheet name + * @access private + */ + function _storeExternsheet($sheetname) + { + $record = 0x0017; // Record identifier + $length = 0x02 + strlen($sheetname); // Number of bytes to follow + + $cch = strlen($sheetname); // Length of sheet name + $rgch = 0x03; // Filename encoding + + $header = pack("vv", $record, $length); + $data = pack("CC", $cch, $rgch); + $this->_append($header . $data . $sheetname); + } + + + /** + * Store the NAME record in the short format that is used for storing the print + * area, repeat rows only and repeat columns only. + * + * @param integer $index Sheet index + * @param integer $type Built-in name type + * @param integer $rowmin Start row + * @param integer $rowmax End row + * @param integer $colmin Start colum + * @param integer $colmax End column + * @access private + */ + function _storeNameShort($index, $type, $rowmin, $rowmax, $colmin, $colmax) + { + $record = 0x0018; // Record identifier + $length = 0x0024; // Number of bytes to follow + + $grbit = 0x0020; // Option flags + $chKey = 0x00; // Keyboard shortcut + $cch = 0x01; // Length of text name + $cce = 0x0015; // Length of text definition + $ixals = $index + 1; // Sheet index + $itab = $ixals; // Equal to ixals + $cchCustMenu = 0x00; // Length of cust menu text + $cchDescription = 0x00; // Length of description text + $cchHelptopic = 0x00; // Length of help topic text + $cchStatustext = 0x00; // Length of status bar text + $rgch = $type; // Built-in name type + + $unknown03 = 0x3b; + $unknown04 = 0xffff-$index; + $unknown05 = 0x0000; + $unknown06 = 0x0000; + $unknown07 = 0x1087; + $unknown08 = 0x8005; + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $data .= pack("C", $chKey); + $data .= pack("C", $cch); + $data .= pack("v", $cce); + $data .= pack("v", $ixals); + $data .= pack("v", $itab); + $data .= pack("C", $cchCustMenu); + $data .= pack("C", $cchDescription); + $data .= pack("C", $cchHelptopic); + $data .= pack("C", $cchStatustext); + $data .= pack("C", $rgch); + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", $rowmin); + $data .= pack("v", $rowmax); + $data .= pack("C", $colmin); + $data .= pack("C", $colmax); + $this->_append($header . $data); + } + + + /** + * Store the NAME record in the long format that is used for storing the repeat + * rows and columns when both are specified. This shares a lot of code with + * _storeNameShort() but we use a separate method to keep the code clean. + * Code abstraction for reuse can be carried too far, and I should know. ;-) + * + * @param integer $index Sheet index + * @param integer $type Built-in name type + * @param integer $rowmin Start row + * @param integer $rowmax End row + * @param integer $colmin Start colum + * @param integer $colmax End column + * @access private + */ + function _storeNameLong($index, $type, $rowmin, $rowmax, $colmin, $colmax) + { + $record = 0x0018; // Record identifier + $length = 0x003d; // Number of bytes to follow + $grbit = 0x0020; // Option flags + $chKey = 0x00; // Keyboard shortcut + $cch = 0x01; // Length of text name + $cce = 0x002e; // Length of text definition + $ixals = $index + 1; // Sheet index + $itab = $ixals; // Equal to ixals + $cchCustMenu = 0x00; // Length of cust menu text + $cchDescription = 0x00; // Length of description text + $cchHelptopic = 0x00; // Length of help topic text + $cchStatustext = 0x00; // Length of status bar text + $rgch = $type; // Built-in name type + + $unknown01 = 0x29; + $unknown02 = 0x002b; + $unknown03 = 0x3b; + $unknown04 = 0xffff-$index; + $unknown05 = 0x0000; + $unknown06 = 0x0000; + $unknown07 = 0x1087; + $unknown08 = 0x8008; + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $data .= pack("C", $chKey); + $data .= pack("C", $cch); + $data .= pack("v", $cce); + $data .= pack("v", $ixals); + $data .= pack("v", $itab); + $data .= pack("C", $cchCustMenu); + $data .= pack("C", $cchDescription); + $data .= pack("C", $cchHelptopic); + $data .= pack("C", $cchStatustext); + $data .= pack("C", $rgch); + $data .= pack("C", $unknown01); + $data .= pack("v", $unknown02); + // Column definition + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", 0x0000); + $data .= pack("v", 0x3fff); + $data .= pack("C", $colmin); + $data .= pack("C", $colmax); + // Row definition + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", $rowmin); + $data .= pack("v", $rowmax); + $data .= pack("C", 0x00); + $data .= pack("C", 0xff); + // End of data + $data .= pack("C", 0x10); + $this->_append($header . $data); + } + + /** + * Stores the COUNTRY record for localization + * + * @access private + */ + function _storeCountry() + { + $record = 0x008C; // Record identifier + $length = 4; // Number of bytes to follow + + $header = pack('vv', $record, $length); + /* using the same country code always for simplicity */ + $data = pack('vv', $this->_country_code, $this->_country_code); + $this->_append($header . $data); + } + + /** + * Stores the PALETTE biff record. + * + * @access private + */ + function _storePalette() + { + $aref = $this->_palette; + + $record = 0x0092; // Record identifier + $length = 2 + 4 * count($aref); // Number of bytes to follow + $ccv = count($aref); // Number of RGB values to follow + $data = ''; // The RGB data + + // Pack the RGB data + foreach ($aref as $color) { + foreach ($color as $byte) { + $data .= pack("C",$byte); + } + } + + $header = pack("vvv", $record, $length, $ccv); + $this->_append($header . $data); + } + +/** + * Calculate + * Handling of the SST continue blocks is complicated by the need to include an + * additional continuation byte depending on whether the string is split between + * blocks or whether it starts at the beginning of the block. (There are also + * additional complications that will arise later when/if Rich Strings are + * supported). + * + * @access private + */ + function _calculateSharedStringsSizes() + { + /* Iterate through the strings to calculate the CONTINUE block sizes. + For simplicity we use the same size for the SST and CONTINUE records: + 8228 : Maximum Excel97 block size + -4 : Length of block header + -8 : Length of additional SST header information + -8 : Arbitrary number to keep within _add_continue() limit + = 8208 + */ + $continue_limit = 8208; + $block_length = 0; + $written = 0; + $this->_block_sizes = array(); + $continue = 0; + + foreach (array_keys($this->_str_table) as $string) { + $string_length = strlen($string); + $headerinfo = unpack("vlength/Cencoding", $string); + $encoding = $headerinfo["encoding"]; + $split_string = 0; + + // Block length is the total length of the strings that will be + // written out in a single SST or CONTINUE block. + $block_length += $string_length; + + // We can write the string if it doesn't cross a CONTINUE boundary + if ($block_length < $continue_limit) { + $written += $string_length; + continue; + } + + // Deal with the cases where the next string to be written will exceed + // the CONTINUE boundary. If the string is very long it may need to be + // written in more than one CONTINUE record. + while ($block_length >= $continue_limit) { + + // We need to avoid the case where a string is continued in the first + // n bytes that contain the string header information. + $header_length = 3; // Min string + header size -1 + $space_remaining = $continue_limit - $written - $continue; + + + /* TODO: Unicode data should only be split on char (2 byte) + boundaries. Therefore, in some cases we need to reduce the + amount of available + */ + $align = 0; + + # Only applies to Unicode strings + if ($encoding == 1) { + # Min string + header size -1 + $header_length = 4; + + if ($space_remaining > $header_length) { + # String contains 3 byte header => split on odd boundary + if (!$split_string && $space_remaining % 2 != 1) { + $space_remaining--; + $align = 1; + } + # Split section without header => split on even boundary + else if ($split_string && $space_remaining % 2 == 1) { + $space_remaining--; + $align = 1; + } + + $split_string = 1; + } + } + + + if ($space_remaining > $header_length) { + // Write as much as possible of the string in the current block + $written += $space_remaining; + + // Reduce the current block length by the amount written + $block_length -= $continue_limit - $continue - $align; + + // Store the max size for this block + $this->_block_sizes[] = $continue_limit - $align; + + // If the current string was split then the next CONTINUE block + // should have the string continue flag (grbit) set unless the + // split string fits exactly into the remaining space. + if ($block_length > 0) { + $continue = 1; + } else { + $continue = 0; + } + } else { + // Store the max size for this block + $this->_block_sizes[] = $written + $continue; + + // Not enough space to start the string in the current block + $block_length -= $continue_limit - $space_remaining - $continue; + $continue = 0; + + } + + // If the string (or substr) is small enough we can write it in the + // new CONTINUE block. Else, go through the loop again to write it in + // one or more CONTINUE blocks + if ($block_length < $continue_limit) { + $written = $block_length; + } else { + $written = 0; + } + } + } + + // Store the max size for the last block unless it is empty + if ($written + $continue) { + $this->_block_sizes[] = $written + $continue; + } + + + /* Calculate the total length of the SST and associated CONTINUEs (if any). + The SST record will have a length even if it contains no strings. + This length is required to set the offsets in the BOUNDSHEET records since + they must be written before the SST records + */ + + $tmp_block_sizes = array(); + $tmp_block_sizes = $this->_block_sizes; + + $length = 12; + if (!empty($tmp_block_sizes)) { + $length += array_shift($tmp_block_sizes); # SST + } + while (!empty($tmp_block_sizes)) { + $length += 4 + array_shift($tmp_block_sizes); # CONTINUEs + } + + return $length; + } + + /** + * Write all of the workbooks strings into an indexed array. + * See the comments in _calculate_shared_string_sizes() for more information. + * + * The Excel documentation says that the SST record should be followed by an + * EXTSST record. The EXTSST record is a hash table that is used to optimise + * access to SST. However, despite the documentation it doesn't seem to be + * required so we will ignore it. + * + * @access private + */ + function _storeSharedStringsTable() + { + $record = 0x00fc; // Record identifier + $length = 0x0008; // Number of bytes to follow + $total = 0x0000; + + // Iterate through the strings to calculate the CONTINUE block sizes + $continue_limit = 8208; + $block_length = 0; + $written = 0; + $continue = 0; + + // sizes are upside down + $tmp_block_sizes = $this->_block_sizes; +// $tmp_block_sizes = array_reverse($this->_block_sizes); + + # The SST record is required even if it contains no strings. Thus we will + # always have a length + # + if (!empty($tmp_block_sizes)) { + $length = 8 + array_shift($tmp_block_sizes); + } + else { + # No strings + $length = 8; + } + + + + // Write the SST block header information + $header = pack("vv", $record, $length); + $data = pack("VV", $this->_str_total, $this->_str_unique); + $this->_append($header . $data); + + + + + /* TODO: not good for performance */ + foreach (array_keys($this->_str_table) as $string) { + + $string_length = strlen($string); + $headerinfo = unpack("vlength/Cencoding", $string); + $encoding = $headerinfo["encoding"]; + $split_string = 0; + + // Block length is the total length of the strings that will be + // written out in a single SST or CONTINUE block. + // + $block_length += $string_length; + + + // We can write the string if it doesn't cross a CONTINUE boundary + if ($block_length < $continue_limit) { + $this->_append($string); + $written += $string_length; + continue; + } + + // Deal with the cases where the next string to be written will exceed + // the CONTINUE boundary. If the string is very long it may need to be + // written in more than one CONTINUE record. + // + while ($block_length >= $continue_limit) { + + // We need to avoid the case where a string is continued in the first + // n bytes that contain the string header information. + // + $header_length = 3; // Min string + header size -1 + $space_remaining = $continue_limit - $written - $continue; + + + // Unicode data should only be split on char (2 byte) boundaries. + // Therefore, in some cases we need to reduce the amount of available + // space by 1 byte to ensure the correct alignment. + $align = 0; + + // Only applies to Unicode strings + if ($encoding == 1) { + // Min string + header size -1 + $header_length = 4; + + if ($space_remaining > $header_length) { + // String contains 3 byte header => split on odd boundary + if (!$split_string && $space_remaining % 2 != 1) { + $space_remaining--; + $align = 1; + } + // Split section without header => split on even boundary + else if ($split_string && $space_remaining % 2 == 1) { + $space_remaining--; + $align = 1; + } + + $split_string = 1; + } + } + + + if ($space_remaining > $header_length) { + // Write as much as possible of the string in the current block + $tmp = substr($string, 0, $space_remaining); + $this->_append($tmp); + + // The remainder will be written in the next block(s) + $string = substr($string, $space_remaining); + + // Reduce the current block length by the amount written + $block_length -= $continue_limit - $continue - $align; + + // If the current string was split then the next CONTINUE block + // should have the string continue flag (grbit) set unless the + // split string fits exactly into the remaining space. + // + if ($block_length > 0) { + $continue = 1; + } else { + $continue = 0; + } + } else { + // Not enough space to start the string in the current block + $block_length -= $continue_limit - $space_remaining - $continue; + $continue = 0; + } + + // Write the CONTINUE block header + if (!empty($this->_block_sizes)) { + $record = 0x003C; + $length = array_shift($tmp_block_sizes); + + $header = pack('vv', $record, $length); + if ($continue) { + $header .= pack('C', $encoding); + } + $this->_append($header); + } + + // If the string (or substr) is small enough we can write it in the + // new CONTINUE block. Else, go through the loop again to write it in + // one or more CONTINUE blocks + // + if ($block_length < $continue_limit) { + $this->_append($string); + $written = $block_length; + } else { + $written = 0; + } + } + } + } +} +?> diff --git a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Worksheet.php b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Worksheet.php new file mode 100644 index 00000000..17060038 --- /dev/null +++ b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Worksheet.php @@ -0,0 +1,3503 @@ + +* +* The majority of this is _NOT_ my code. I simply ported it from the +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} +require_once $homedir.'/classes/pear/Spreadsheet/Excel/Writer/Parser.php'; +require_once $homedir.'/classes/pear/Spreadsheet/Excel/Writer/BIFFwriter.php'; + +/** +* Class for generating Excel Spreadsheets +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwriter +{ + /** + * Name of the Worksheet + * @var string + */ + var $name; + + /** + * Index for the Worksheet + * @var integer + */ + var $index; + + /** + * Reference to the (default) Format object for URLs + * @var object Format + */ + var $_url_format; + + /** + * Reference to the parser used for parsing formulas + * @var object Format + */ + var $_parser; + + /** + * Filehandle to the temporary file for storing data + * @var resource + */ + var $_filehandle; + + /** + * Boolean indicating if we are using a temporary file for storing data + * @var bool + */ + var $_using_tmpfile; + + /** + * Maximum number of rows for an Excel spreadsheet (BIFF5) + * @var integer + */ + var $_xls_rowmax; + + /** + * Maximum number of columns for an Excel spreadsheet (BIFF5) + * @var integer + */ + var $_xls_colmax; + + /** + * Maximum number of characters for a string (LABEL record in BIFF5) + * @var integer + */ + var $_xls_strmax; + + /** + * First row for the DIMENSIONS record + * @var integer + * @see _storeDimensions() + */ + var $_dim_rowmin; + + /** + * Last row for the DIMENSIONS record + * @var integer + * @see _storeDimensions() + */ + var $_dim_rowmax; + + /** + * First column for the DIMENSIONS record + * @var integer + * @see _storeDimensions() + */ + var $_dim_colmin; + + /** + * Last column for the DIMENSIONS record + * @var integer + * @see _storeDimensions() + */ + var $_dim_colmax; + + /** + * Array containing format information for columns + * @var array + */ + var $_colinfo; + + /** + * Array containing the selected area for the worksheet + * @var array + */ + var $_selection; + + /** + * Array containing the panes for the worksheet + * @var array + */ + var $_panes; + + /** + * The active pane for the worksheet + * @var integer + */ + var $_active_pane; + + /** + * Bit specifying if panes are frozen + * @var integer + */ + var $_frozen; + + /** + * Bit specifying if the worksheet is selected + * @var integer + */ + var $selected; + + /** + * The paper size (for printing) (DOCUMENT!!!) + * @var integer + */ + var $_paper_size; + + /** + * Bit specifying paper orientation (for printing). 0 => landscape, 1 => portrait + * @var integer + */ + var $_orientation; + + /** + * The page header caption + * @var string + */ + var $_header; + + /** + * The page footer caption + * @var string + */ + var $_footer; + + /** + * The horizontal centering value for the page + * @var integer + */ + var $_hcenter; + + /** + * The vertical centering value for the page + * @var integer + */ + var $_vcenter; + + /** + * The margin for the header + * @var float + */ + var $_margin_head; + + /** + * The margin for the footer + * @var float + */ + var $_margin_foot; + + /** + * The left margin for the worksheet in inches + * @var float + */ + var $_margin_left; + + /** + * The right margin for the worksheet in inches + * @var float + */ + var $_margin_right; + + /** + * The top margin for the worksheet in inches + * @var float + */ + var $_margin_top; + + /** + * The bottom margin for the worksheet in inches + * @var float + */ + var $_margin_bottom; + + /** + * First row to reapeat on each printed page + * @var integer + */ + var $title_rowmin; + + /** + * Last row to reapeat on each printed page + * @var integer + */ + var $title_rowmax; + + /** + * First column to reapeat on each printed page + * @var integer + */ + var $title_colmin; + + /** + * First row of the area to print + * @var integer + */ + var $print_rowmin; + + /** + * Last row to of the area to print + * @var integer + */ + var $print_rowmax; + + /** + * First column of the area to print + * @var integer + */ + var $print_colmin; + + /** + * Last column of the area to print + * @var integer + */ + var $print_colmax; + + /** + * Whether to use outline. + * @var integer + */ + var $_outline_on; + + /** + * Auto outline styles. + * @var bool + */ + var $_outline_style; + + /** + * Whether to have outline summary below. + * @var bool + */ + var $_outline_below; + + /** + * Whether to have outline summary at the right. + * @var bool + */ + var $_outline_right; + + /** + * Outline row level. + * @var integer + */ + var $_outline_row_level; + + /** + * Whether to fit to page when printing or not. + * @var bool + */ + var $_fit_page; + + /** + * Number of pages to fit wide + * @var integer + */ + var $_fit_width; + + /** + * Number of pages to fit high + * @var integer + */ + var $_fit_height; + + /** + * Reference to the total number of strings in the workbook + * @var integer + */ + var $_str_total; + + /** + * Reference to the number of unique strings in the workbook + * @var integer + */ + var $_str_unique; + + /** + * Reference to the array containing all the unique strings in the workbook + * @var array + */ + var $_str_table; + + /** + * Merged cell ranges + * @var array + */ + var $_merged_ranges; + + /** + * Charset encoding currently used when calling writeString() + * @var string + */ + var $_input_encoding; + + /** + * Constructor + * + * @param string $name The name of the new worksheet + * @param integer $index The index of the new worksheet + * @param mixed &$activesheet The current activesheet of the workbook we belong to + * @param mixed &$firstsheet The first worksheet in the workbook we belong to + * @param mixed &$url_format The default format for hyperlinks + * @param mixed &$parser The formula parser created for the Workbook + * @access private + */ + function Spreadsheet_Excel_Writer_Worksheet($BIFF_version, $name, + $index, &$activesheet, + &$firstsheet, &$str_total, + &$str_unique, &$str_table, + &$url_format, &$parser) + { + // It needs to call its parent's constructor explicitly + $this->Spreadsheet_Excel_Writer_BIFFwriter(); + $this->_BIFF_version = $BIFF_version; + $rowmax = 65536; // 16384 in Excel 5 + $colmax = 256; + + $this->name = $name; + $this->index = $index; + $this->activesheet = &$activesheet; + $this->firstsheet = &$firstsheet; + $this->_str_total = &$str_total; + $this->_str_unique = &$str_unique; + $this->_str_table = &$str_table; + $this->_url_format = &$url_format; + $this->_parser = &$parser; + + //$this->ext_sheets = array(); + $this->_filehandle = ''; + $this->_using_tmpfile = true; + //$this->fileclosed = 0; + //$this->offset = 0; + $this->_xls_rowmax = $rowmax; + $this->_xls_colmax = $colmax; + $this->_xls_strmax = 255; + $this->_dim_rowmin = $rowmax + 1; + $this->_dim_rowmax = 0; + $this->_dim_colmin = $colmax + 1; + $this->_dim_colmax = 0; + $this->_colinfo = array(); + $this->_selection = array(0,0,0,0); + $this->_panes = array(); + $this->_active_pane = 3; + $this->_frozen = 0; + $this->selected = 0; + + $this->_paper_size = 0x0; + $this->_orientation = 0x1; + $this->_header = ''; + $this->_footer = ''; + $this->_hcenter = 0; + $this->_vcenter = 0; + $this->_margin_head = 0.50; + $this->_margin_foot = 0.50; + $this->_margin_left = 0.75; + $this->_margin_right = 0.75; + $this->_margin_top = 1.00; + $this->_margin_bottom = 1.00; + + $this->title_rowmin = null; + $this->title_rowmax = null; + $this->title_colmin = null; + $this->title_colmax = null; + $this->print_rowmin = null; + $this->print_rowmax = null; + $this->print_colmin = null; + $this->print_colmax = null; + + $this->_print_gridlines = 1; + $this->_screen_gridlines = 1; + $this->_print_headers = 0; + + $this->_fit_page = 0; + $this->_fit_width = 0; + $this->_fit_height = 0; + + $this->_hbreaks = array(); + $this->_vbreaks = array(); + + $this->_protect = 0; + $this->_password = null; + + $this->col_sizes = array(); + $this->_row_sizes = array(); + + $this->_zoom = 100; + $this->_print_scale = 100; + + $this->_outline_row_level = 0; + $this->_outline_style = 0; + $this->_outline_below = 1; + $this->_outline_right = 1; + $this->_outline_on = 1; + + $this->_merged_ranges = array(); + + $this->_input_encoding = ''; + + $this->_dv = array(); + + $this->_initialize(); + } + + /** + * Open a tmp file to store the majority of the Worksheet data. If this fails, + * for example due to write permissions, store the data in memory. This can be + * slow for large files. + * + * @access private + */ + function _initialize() + { + // Open tmp file for storing Worksheet data + $fh = @tmpfile(); + if ($fh) { + // Store filehandle + $this->_filehandle = $fh; + } else { + // If tmpfile() fails store data in memory + $this->_using_tmpfile = false; + } + } + + /** + * Add data to the beginning of the workbook (note the reverse order) + * and to the end of the workbook. + * + * @access public + * @see Spreadsheet_Excel_Writer_Workbook::storeWorkbook() + * @param array $sheetnames The array of sheetnames from the Workbook this + * worksheet belongs to + */ + function close($sheetnames) + { + $num_sheets = count($sheetnames); + + /*********************************************** + * Prepend in reverse order!! + */ + + // Prepend the sheet dimensions + $this->_storeDimensions(); + + // Prepend the sheet password + $this->_storePassword(); + + // Prepend the sheet protection + $this->_storeProtect(); + + // Prepend the page setup + $this->_storeSetup(); + + /* FIXME: margins are actually appended */ + // Prepend the bottom margin + $this->_storeMarginBottom(); + + // Prepend the top margin + $this->_storeMarginTop(); + + // Prepend the right margin + $this->_storeMarginRight(); + + // Prepend the left margin + $this->_storeMarginLeft(); + + // Prepend the page vertical centering + $this->_storeVcenter(); + + // Prepend the page horizontal centering + $this->_storeHcenter(); + + // Prepend the page footer + $this->_storeFooter(); + + // Prepend the page header + $this->_storeHeader(); + + // Prepend the vertical page breaks + $this->_storeVbreak(); + + // Prepend the horizontal page breaks + $this->_storeHbreak(); + + // Prepend WSBOOL + $this->_storeWsbool(); + + // Prepend GRIDSET + $this->_storeGridset(); + + // Prepend GUTS + if ($this->_BIFF_version == 0x0500) { + $this->_storeGuts(); + } + + // Prepend PRINTGRIDLINES + $this->_storePrintGridlines(); + + // Prepend PRINTHEADERS + $this->_storePrintHeaders(); + + // Prepend EXTERNSHEET references + if ($this->_BIFF_version == 0x0500) { + for ($i = $num_sheets; $i > 0; $i--) { + $sheetname = $sheetnames[$i-1]; + $this->_storeExternsheet($sheetname); + } + } + + // Prepend the EXTERNCOUNT of external references. + if ($this->_BIFF_version == 0x0500) { + $this->_storeExterncount($num_sheets); + } + + // Prepend the COLINFO records if they exist + if (!empty($this->_colinfo)) { + $colcount = count($this->_colinfo); + for ($i = 0; $i < $colcount; $i++) { + $this->_storeColinfo($this->_colinfo[$i]); + } + $this->_storeDefcol(); + } + + // Prepend the BOF record + $this->_storeBof(0x0010); + + /* + * End of prepend. Read upwards from here. + ***********************************************/ + + // Append + $this->_storeWindow2(); + $this->_storeZoom(); + if (!empty($this->_panes)) { + $this->_storePanes($this->_panes); + } + $this->_storeSelection($this->_selection); + $this->_storeMergedCells(); + /* TODO: add data validity */ + /*if ($this->_BIFF_version == 0x0600) { + $this->_storeDataValidity(); + }*/ + $this->_storeEof(); + } + + /** + * Retrieve the worksheet name. + * This is usefull when creating worksheets without a name. + * + * @access public + * @return string The worksheet's name + */ + function getName() + { + return $this->name; + } + + /** + * Retrieves data from memory in one chunk, or from disk in $buffer + * sized chunks. + * + * @return string The data + */ + function getData() + { + $buffer = 4096; + + // Return data stored in memory + if (isset($this->_data)) { + $tmp = $this->_data; + unset($this->_data); + $fh = $this->_filehandle; + if ($this->_using_tmpfile) { + fseek($fh, 0); + } + return $tmp; + } + // Return data stored on disk + if ($this->_using_tmpfile) { + if ($tmp = fread($this->_filehandle, $buffer)) { + return $tmp; + } + } + + // No data to return + return ''; + } + + /** + * Sets a merged cell range + * + * @access public + * @param integer $first_row First row of the area to merge + * @param integer $first_col First column of the area to merge + * @param integer $last_row Last row of the area to merge + * @param integer $last_col Last column of the area to merge + */ + function setMerge($first_row, $first_col, $last_row, $last_col) + { + if (($last_row < $first_row) || ($last_col < $first_col)) { + return; + } + // don't check rowmin, rowmax, etc... because we don't know when this + // is going to be called + $this->_merged_ranges[] = array($first_row, $first_col, $last_row, $last_col); + } + + /** + * Set this worksheet as a selected worksheet, + * i.e. the worksheet has its tab highlighted. + * + * @access public + */ + function select() + { + $this->selected = 1; + } + + /** + * Set this worksheet as the active worksheet, + * i.e. the worksheet that is displayed when the workbook is opened. + * Also set it as selected. + * + * @access public + */ + function activate() + { + $this->selected = 1; + $this->activesheet = $this->index; + } + + /** + * Set this worksheet as the first visible sheet. + * This is necessary when there are a large number of worksheets and the + * activated worksheet is not visible on the screen. + * + * @access public + */ + function setFirstSheet() + { + $this->firstsheet = $this->index; + } + + /** + * Set the worksheet protection flag + * to prevent accidental modification and to + * hide formulas if the locked and hidden format properties have been set. + * + * @access public + * @param string $password The password to use for protecting the sheet. + */ + function protect($password) + { + $this->_protect = 1; + $this->_password = $this->_encodePassword($password); + } + + /** + * Set the width of a single column or a range of columns. + * + * @access public + * @param integer $firstcol first column on the range + * @param integer $lastcol last column on the range + * @param integer $width width to set + * @param mixed $format The optional XF format to apply to the columns + * @param integer $hidden The optional hidden atribute + * @param integer $level The optional outline level + */ + function setColumn($firstcol, $lastcol, $width, $format = null, $hidden = 0, $level = 0) + { + $this->_colinfo[] = array($firstcol, $lastcol, $width, &$format, $hidden, $level); + + // Set width to zero if column is hidden + $width = ($hidden) ? 0 : $width; + + for ($col = $firstcol; $col <= $lastcol; $col++) { + $this->col_sizes[$col] = $width; + } + } + + /** + * Set which cell or cells are selected in a worksheet + * + * @access public + * @param integer $first_row first row in the selected quadrant + * @param integer $first_column first column in the selected quadrant + * @param integer $last_row last row in the selected quadrant + * @param integer $last_column last column in the selected quadrant + */ + function setSelection($first_row,$first_column,$last_row,$last_column) + { + $this->_selection = array($first_row,$first_column,$last_row,$last_column); + } + + /** + * Set panes and mark them as frozen. + * + * @access public + * @param array $panes This is the only parameter received and is composed of the following: + * 0 => Vertical split position, + * 1 => Horizontal split position + * 2 => Top row visible + * 3 => Leftmost column visible + * 4 => Active pane + */ + function freezePanes($panes) + { + $this->_frozen = 1; + $this->_panes = $panes; + } + + /** + * Set panes and mark them as unfrozen. + * + * @access public + * @param array $panes This is the only parameter received and is composed of the following: + * 0 => Vertical split position, + * 1 => Horizontal split position + * 2 => Top row visible + * 3 => Leftmost column visible + * 4 => Active pane + */ + function thawPanes($panes) + { + $this->_frozen = 0; + $this->_panes = $panes; + } + + /** + * Set the page orientation as portrait. + * + * @access public + */ + function setPortrait() + { + $this->_orientation = 1; + } + + /** + * Set the page orientation as landscape. + * + * @access public + */ + function setLandscape() + { + $this->_orientation = 0; + } + + /** + * Set the paper type. Ex. 1 = US Letter, 9 = A4 + * + * @access public + * @param integer $size The type of paper size to use + */ + function setPaper($size = 0) + { + $this->_paper_size = $size; + } + + + /** + * Set the page header caption and optional margin. + * + * @access public + * @param string $string The header text + * @param float $margin optional head margin in inches. + */ + function setHeader($string,$margin = 0.50) + { + if (strlen($string) >= 255) { + //carp 'Header string must be less than 255 characters'; + return; + } + $this->_header = $string; + $this->_margin_head = $margin; + } + + /** + * Set the page footer caption and optional margin. + * + * @access public + * @param string $string The footer text + * @param float $margin optional foot margin in inches. + */ + function setFooter($string,$margin = 0.50) + { + if (strlen($string) >= 255) { + //carp 'Footer string must be less than 255 characters'; + return; + } + $this->_footer = $string; + $this->_margin_foot = $margin; + } + + /** + * Center the page horinzontally. + * + * @access public + * @param integer $center the optional value for centering. Defaults to 1 (center). + */ + function centerHorizontally($center = 1) + { + $this->_hcenter = $center; + } + + /** + * Center the page vertically. + * + * @access public + * @param integer $center the optional value for centering. Defaults to 1 (center). + */ + function centerVertically($center = 1) + { + $this->_vcenter = $center; + } + + /** + * Set all the page margins to the same value in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMargins($margin) + { + $this->setMarginLeft($margin); + $this->setMarginRight($margin); + $this->setMarginTop($margin); + $this->setMarginBottom($margin); + } + + /** + * Set the left and right margins to the same value in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMargins_LR($margin) + { + $this->setMarginLeft($margin); + $this->setMarginRight($margin); + } + + /** + * Set the top and bottom margins to the same value in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMargins_TB($margin) + { + $this->setMarginTop($margin); + $this->setMarginBottom($margin); + } + + /** + * Set the left margin in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMarginLeft($margin = 0.75) + { + $this->_margin_left = $margin; + } + + /** + * Set the right margin in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMarginRight($margin = 0.75) + { + $this->_margin_right = $margin; + } + + /** + * Set the top margin in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMarginTop($margin = 1.00) + { + $this->_margin_top = $margin; + } + + /** + * Set the bottom margin in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMarginBottom($margin = 1.00) + { + $this->_margin_bottom = $margin; + } + + /** + * Set the rows to repeat at the top of each printed page. + * + * @access public + * @param integer $first_row First row to repeat + * @param integer $last_row Last row to repeat. Optional. + */ + function repeatRows($first_row, $last_row = null) + { + $this->title_rowmin = $first_row; + if (isset($last_row)) { //Second row is optional + $this->title_rowmax = $last_row; + } else { + $this->title_rowmax = $first_row; + } + } + + /** + * Set the columns to repeat at the left hand side of each printed page. + * + * @access public + * @param integer $first_col First column to repeat + * @param integer $last_col Last column to repeat. Optional. + */ + function repeatColumns($first_col, $last_col = null) + { + $this->title_colmin = $first_col; + if (isset($last_col)) { // Second col is optional + $this->title_colmax = $last_col; + } else { + $this->title_colmax = $first_col; + } + } + + /** + * Set the area of each worksheet that will be printed. + * + * @access public + * @param integer $first_row First row of the area to print + * @param integer $first_col First column of the area to print + * @param integer $last_row Last row of the area to print + * @param integer $last_col Last column of the area to print + */ + function printArea($first_row, $first_col, $last_row, $last_col) + { + $this->print_rowmin = $first_row; + $this->print_colmin = $first_col; + $this->print_rowmax = $last_row; + $this->print_colmax = $last_col; + } + + + /** + * Set the option to hide gridlines on the printed page. + * + * @access public + */ + function hideGridlines() + { + $this->_print_gridlines = 0; + } + + /** + * Set the option to hide gridlines on the worksheet (as seen on the screen). + * + * @access public + */ + function hideScreenGridlines() + { + $this->_screen_gridlines = 0; + } + + /** + * Set the option to print the row and column headers on the printed page. + * + * @access public + * @param integer $print Whether to print the headers or not. Defaults to 1 (print). + */ + function printRowColHeaders($print = 1) + { + $this->_print_headers = $print; + } + + /** + * Set the vertical and horizontal number of pages that will define the maximum area printed. + * It doesn't seem to work with OpenOffice. + * + * @access public + * @param integer $width Maximun width of printed area in pages + * @param integer $height Maximun heigth of printed area in pages + * @see setPrintScale() + */ + function fitToPages($width, $height) + { + $this->_fit_page = 1; + $this->_fit_width = $width; + $this->_fit_height = $height; + } + + /** + * Store the horizontal page breaks on a worksheet (for printing). + * The breaks represent the row after which the break is inserted. + * + * @access public + * @param array $breaks Array containing the horizontal page breaks + */ + function setHPagebreaks($breaks) + { + foreach ($breaks as $break) { + array_push($this->_hbreaks, $break); + } + } + + /** + * Store the vertical page breaks on a worksheet (for printing). + * The breaks represent the column after which the break is inserted. + * + * @access public + * @param array $breaks Array containing the vertical page breaks + */ + function setVPagebreaks($breaks) + { + foreach ($breaks as $break) { + array_push($this->_vbreaks, $break); + } + } + + + /** + * Set the worksheet zoom factor. + * + * @access public + * @param integer $scale The zoom factor + */ + function setZoom($scale = 100) + { + // Confine the scale to Excel's range + if ($scale < 10 || $scale > 400) { + $this->raiseError("Zoom factor $scale outside range: 10 <= zoom <= 400"); + $scale = 100; + } + + $this->_zoom = floor($scale); + } + + /** + * Set the scale factor for the printed page. + * It turns off the "fit to page" option + * + * @access public + * @param integer $scale The optional scale factor. Defaults to 100 + */ + function setPrintScale($scale = 100) + { + // Confine the scale to Excel's range + if ($scale < 10 || $scale > 400) { + $this->raiseError("Print scale $scale outside range: 10 <= zoom <= 400"); + $scale = 100; + } + + // Turn off "fit to page" option + $this->_fit_page = 0; + + $this->_print_scale = floor($scale); + } + + /** + * Map to the appropriate write method acording to the token recieved. + * + * @access public + * @param integer $row The row of the cell we are writing to + * @param integer $col The column of the cell we are writing to + * @param mixed $token What we are writing + * @param mixed $format The optional format to apply to the cell + */ + function write($row, $col, $token, $format = null) + { + // Check for a cell reference in A1 notation and substitute row and column + /*if ($_[0] =~ /^\D/) { + @_ = $this->_substituteCellref(@_); + }*/ + + if (preg_match("/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/", $token)) { + // Match number + return $this->writeNumber($row, $col, $token, $format); + } elseif (preg_match("/^[fh]tt?p:\/\//", $token)) { + // Match http or ftp URL + return $this->writeUrl($row, $col, $token, '', $format); + } elseif (preg_match("/^mailto:/", $token)) { + // Match mailto: + return $this->writeUrl($row, $col, $token, '', $format); + } elseif (preg_match("/^(?:in|ex)ternal:/", $token)) { + // Match internal or external sheet link + return $this->writeUrl($row, $col, $token, '', $format); + } elseif (preg_match("/^=/", $token)) { + // Match formula + return $this->writeFormula($row, $col, $token, $format); + } elseif (preg_match("/^@/", $token)) { + // Match formula + return $this->writeFormula($row, $col, $token, $format); + } elseif ($token == '') { + // Match blank + return $this->writeBlank($row, $col, $format); + } else { + // Default: match string + return $this->writeString($row, $col, $token, $format); + } + } + + /** + * Write an array of values as a row + * + * @access public + * @param integer $row The row we are writing to + * @param integer $col The first col (leftmost col) we are writing to + * @param array $val The array of values to write + * @param mixed $format The optional format to apply to the cell + * @return mixed PEAR_Error on failure + */ + + function writeRow($row, $col, $val, $format = null) + { + $retval = ''; + if (is_array($val)) { + foreach ($val as $v) { + if (is_array($v)) { + $this->writeCol($row, $col, $v, $format); + } else { + $this->write($row, $col, $v, $format); + } + $col++; + } + } else { + $retval = new PEAR_Error('$val needs to be an array'); + } + return($retval); + } + + /** + * Write an array of values as a column + * + * @access public + * @param integer $row The first row (uppermost row) we are writing to + * @param integer $col The col we are writing to + * @param array $val The array of values to write + * @param mixed $format The optional format to apply to the cell + * @return mixed PEAR_Error on failure + */ + + function writeCol($row, $col, $val, $format = null) + { + $retval = ''; + if (is_array($val)) { + foreach ($val as $v) { + $this->write($row, $col, $v, $format); + $row++; + } + } else { + $retval = new PEAR_Error('$val needs to be an array'); + } + return($retval); + } + + /** + * Returns an index to the XF record in the workbook + * + * @access private + * @param mixed &$format The optional XF format + * @return integer The XF record index + */ + function _XF(&$format) + { + if ($format) { + return($format->getXfIndex()); + } else { + return(0x0F); + } + } + + + /****************************************************************************** + ******************************************************************************* + * + * Internal methods + */ + + + /** + * Store Worksheet data in memory using the parent's class append() or to a + * temporary file, the default. + * + * @access private + * @param string $data The binary data to append + */ + function _append($data) + { + if ($this->_using_tmpfile) { + // Add CONTINUE records if necessary + if (strlen($data) > $this->_limit) { + $data = $this->_addContinue($data); + } + fwrite($this->_filehandle, $data); + $this->_datasize += strlen($data); + } else { + parent::_append($data); + } + } + + /** + * Substitute an Excel cell reference in A1 notation for zero based row and + * column values in an argument list. + * + * Ex: ("A4", "Hello") is converted to (3, 0, "Hello"). + * + * @access private + * @param string $cell The cell reference. Or range of cells. + * @return array + */ + function _substituteCellref($cell) + { + $cell = strtoupper($cell); + + // Convert a column range: 'A:A' or 'B:G' + if (preg_match("/([A-I]?[A-Z]):([A-I]?[A-Z])/", $cell, $match)) { + list($no_use, $col1) = $this->_cellToRowcol($match[1] .'1'); // Add a dummy row + list($no_use, $col2) = $this->_cellToRowcol($match[2] .'1'); // Add a dummy row + return(array($col1, $col2)); + } + + // Convert a cell range: 'A1:B7' + if (preg_match("/\$?([A-I]?[A-Z]\$?\d+):\$?([A-I]?[A-Z]\$?\d+)/", $cell, $match)) { + list($row1, $col1) = $this->_cellToRowcol($match[1]); + list($row2, $col2) = $this->_cellToRowcol($match[2]); + return(array($row1, $col1, $row2, $col2)); + } + + // Convert a cell reference: 'A1' or 'AD2000' + if (preg_match("/\$?([A-I]?[A-Z]\$?\d+)/", $cell)) { + list($row1, $col1) = $this->_cellToRowcol($match[1]); + return(array($row1, $col1)); + } + + // TODO use real error codes + $this->raiseError("Unknown cell reference $cell", 0, PEAR_ERROR_DIE); + } + + /** + * Convert an Excel cell reference in A1 notation to a zero based row and column + * reference; converts C1 to (0, 2). + * + * @access private + * @param string $cell The cell reference. + * @return array containing (row, column) + */ + function _cellToRowcol($cell) + { + preg_match("/\$?([A-I]?[A-Z])\$?(\d+)/",$cell,$match); + $col = $match[1]; + $row = $match[2]; + + // Convert base26 column string to number + $chars = split('', $col); + $expn = 0; + $col = 0; + + while ($chars) { + $char = array_pop($chars); // LS char first + $col += (ord($char) -ord('A') +1) * pow(26,$expn); + $expn++; + } + + // Convert 1-index to zero-index + $row--; + $col--; + + return(array($row, $col)); + } + + /** + * Based on the algorithm provided by Daniel Rentz of OpenOffice. + * + * @access private + * @param string $plaintext The password to be encoded in plaintext. + * @return string The encoded password + */ + function _encodePassword($plaintext) + { + $password = 0x0000; + $i = 1; // char position + + // split the plain text password in its component characters + $chars = preg_split('//', $plaintext, -1, PREG_SPLIT_NO_EMPTY); + foreach ($chars as $char) { + $value = ord($char) << $i; // shifted ASCII value + $rotated_bits = $value >> 15; // rotated bits beyond bit 15 + $value &= 0x7fff; // first 15 bits + $password ^= ($value | $rotated_bits); + $i++; + } + + $password ^= strlen($plaintext); + $password ^= 0xCE4B; + + return($password); + } + + /** + * This method sets the properties for outlining and grouping. The defaults + * correspond to Excel's defaults. + * + * @param bool $visible + * @param bool $symbols_below + * @param bool $symbols_right + * @param bool $auto_style + */ + function setOutline($visible = true, $symbols_below = true, $symbols_right = true, $auto_style = false) + { + $this->_outline_on = $visible; + $this->_outline_below = $symbols_below; + $this->_outline_right = $symbols_right; + $this->_outline_style = $auto_style; + + // Ensure this is a boolean vale for Window2 + if ($this->_outline_on) { + $this->_outline_on = 1; + } + } + + /****************************************************************************** + ******************************************************************************* + * + * BIFF RECORDS + */ + + + /** + * Write a double to the specified row and column (zero indexed). + * An integer can be written as a double. Excel will display an + * integer. $format is optional. + * + * Returns 0 : normal termination + * -2 : row or column out of range + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param float $num The number to write + * @param mixed $format The optional XF format + * @return integer + */ + function writeNumber($row, $col, $num, $format = null) + { + $record = 0x0203; // Record identifier + $length = 0x000E; // Number of bytes to follow + + $xf = $this->_XF($format); // The cell format + + // Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) { + return(-2); + } + if ($col >= $this->_xls_colmax) { + return(-2); + } + if ($row < $this->_dim_rowmin) { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) { + $this->_dim_colmax = $col; + } + + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $xf); + $xl_double = pack("d", $num); + if ($this->_byte_order) { // if it's Big Endian + $xl_double = strrev($xl_double); + } + + $this->_append($header.$data.$xl_double); + return(0); + } + + /** + * Write a string to the specified row and column (zero indexed). + * NOTE: there is an Excel 5 defined limit of 255 characters. + * $format is optional. + * Returns 0 : normal termination + * -2 : row or column out of range + * -3 : long string truncated to 255 chars + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $str The string to write + * @param mixed $format The XF format for the cell + * @return integer + */ + function writeString($row, $col, $str, $format = null) + { + if ($this->_BIFF_version == 0x0600) { + return $this->writeStringBIFF8($row, $col, $str, $format); + } + $strlen = strlen($str); + $record = 0x0204; // Record identifier + $length = 0x0008 + $strlen; // Bytes to follow + $xf = $this->_XF($format); // The cell format + + $str_error = 0; + + // Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) { + return(-2); + } + if ($col >= $this->_xls_colmax) { + return(-2); + } + if ($row < $this->_dim_rowmin) { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) { + $this->_dim_colmax = $col; + } + + if ($strlen > $this->_xls_strmax) { // LABEL must be < 255 chars + $str = substr($str, 0, $this->_xls_strmax); + $length = 0x0008 + $this->_xls_strmax; + $strlen = $this->_xls_strmax; + $str_error = -3; + } + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row, $col, $xf, $strlen); + $this->_append($header . $data . $str); + return($str_error); + } + + /** + * Sets Input Encoding for writing strings + * + * @access public + * @param string $encoding The encoding. Ex: 'UTF-16LE', 'utf-8', 'ISO-859-7' + */ + function setInputEncoding($encoding) + { + if ($encoding != 'UTF-16LE' && !function_exists('iconv')) { + $this->raiseError("Using an input encoding other than UTF-16LE requires PHP support for iconv"); + } + $this->_input_encoding = $encoding; + } + + /** + * Write a string to the specified row and column (zero indexed). + * This is the BIFF8 version (no 255 chars limit). + * $format is optional. + * Returns 0 : normal termination + * -2 : row or column out of range + * -3 : long string truncated to 255 chars + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $str The string to write + * @param mixed $format The XF format for the cell + * @return integer + */ + function writeStringBIFF8($row, $col, $str, $format = null) + { + if ($this->_input_encoding == 'UTF-16LE') + { + $strlen = function_exists('mb_strlen') ? mb_strlen($str, 'UTF-16LE') : (strlen($str) / 2); + $encoding = 0x1; + } + elseif ($this->_input_encoding != '') + { + $str = @iconv($this->_input_encoding, 'UTF-16LE', $str); + $strlen = function_exists('mb_strlen') ? mb_strlen($str, 'UTF-16LE') : (strlen($str) / 2); + $encoding = 0x1; + } + else + { + $strlen = strlen($str); + $encoding = 0x0; + } + $record = 0x00FD; // Record identifier + $length = 0x000A; // Bytes to follow + $xf = $this->_XF($format); // The cell format + + $str_error = 0; + + // Check that row and col are valid and store max and min values + if ($this->_checkRowCol($row, $col) == false) { + return -2; + } + + $str = pack('vC', $strlen, $encoding).$str; + + /* check if string is already present */ + if (!isset($this->_str_table[$str])) { + $this->_str_table[$str] = $this->_str_unique++; + } + $this->_str_total++; + + $header = pack('vv', $record, $length); + $data = pack('vvvV', $row, $col, $xf, $this->_str_table[$str]); + $this->_append($header.$data); + return $str_error; + } + + /** + * Check row and col before writing to a cell, and update the sheet's + * dimensions accordingly + * + * @access private + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @return boolean true for success, false if row and/or col are grester + * then maximums allowed. + */ + function _checkRowCol($row, $col) + { + if ($row >= $this->_xls_rowmax) { + return false; + } + if ($col >= $this->_xls_colmax) { + return false; + } + if ($row < $this->_dim_rowmin) { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) { + $this->_dim_colmax = $col; + } + return true; + } + + /** + * Writes a note associated with the cell given by the row and column. + * NOTE records don't have a length limit. + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $note The note to write + */ + function writeNote($row, $col, $note) + { + $note_length = strlen($note); + $record = 0x001C; // Record identifier + $max_length = 2048; // Maximun length for a NOTE record + //$length = 0x0006 + $note_length; // Bytes to follow + + // Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) { + return(-2); + } + if ($col >= $this->_xls_colmax) { + return(-2); + } + if ($row < $this->_dim_rowmin) { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) { + $this->_dim_colmax = $col; + } + + // Length for this record is no more than 2048 + 6 + $length = 0x0006 + min($note_length, 2048); + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $note_length); + $this->_append($header . $data . substr($note, 0, 2048)); + + for ($i = $max_length; $i < $note_length; $i += $max_length) { + $chunk = substr($note, $i, $max_length); + $length = 0x0006 + strlen($chunk); + $header = pack("vv", $record, $length); + $data = pack("vvv", -1, 0, strlen($chunk)); + $this->_append($header.$data.$chunk); + } + return(0); + } + + /** + * Write a blank cell to the specified row and column (zero indexed). + * A blank cell is used to specify formatting without adding a string + * or a number. + * + * A blank cell without a format serves no purpose. Therefore, we don't write + * a BLANK record unless a format is specified. + * + * Returns 0 : normal termination (including no format) + * -1 : insufficient number of arguments + * -2 : row or column out of range + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param mixed $format The XF format + */ + function writeBlank($row, $col, $format) + { + // Don't write a blank cell unless it has a format + if (!$format) { + return(0); + } + + $record = 0x0201; // Record identifier + $length = 0x0006; // Number of bytes to follow + $xf = $this->_XF($format); // The cell format + + // Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) { + return(-2); + } + if ($col >= $this->_xls_colmax) { + return(-2); + } + if ($row < $this->_dim_rowmin) { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) { + $this->_dim_colmax = $col; + } + + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $xf); + $this->_append($header . $data); + return 0; + } + + /** + * Write a formula to the specified row and column (zero indexed). + * The textual representation of the formula is passed to the parser in + * Parser.php which returns a packed binary string. + * + * Returns 0 : normal termination + * -1 : formula errors (bad formula) + * -2 : row or column out of range + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $formula The formula text string + * @param mixed $format The optional XF format + * @return integer + */ + function writeFormula($row, $col, $formula, $format = null) + { + $record = 0x0006; // Record identifier + + // Excel normally stores the last calculated value of the formula in $num. + // Clearly we are not in a position to calculate this a priori. Instead + // we set $num to zero and set the option flags in $grbit to ensure + // automatic calculation of the formula when the file is opened. + // + $xf = $this->_XF($format); // The cell format + $num = 0x00; // Current value of formula + $grbit = 0x03; // Option flags + $unknown = 0x0000; // Must be zero + + + // Check that row and col are valid and store max and min values + if ($this->_checkRowCol($row, $col) == false) { + return -2; + } + + // Strip the '=' or '@' sign at the beginning of the formula string + if (preg_match("/^=/", $formula)) { + $formula = preg_replace("/(^=)/", "", $formula); + } elseif (preg_match("/^@/", $formula)) { + $formula = preg_replace("/(^@)/", "", $formula); + } else { + // Error handling + $this->writeString($row, $col, 'Unrecognised character for formula'); + return -1; + } + + // Parse the formula using the parser in Parser.php + $error = $this->_parser->parse($formula); + if ($this->isError($error)) { + $this->writeString($row, $col, $error->getMessage()); + return -1; + } + + $formula = $this->_parser->toReversePolish(); + if ($this->isError($formula)) { + $this->writeString($row, $col, $formula->getMessage()); + return -1; + } + + $formlen = strlen($formula); // Length of the binary string + $length = 0x16 + $formlen; // Length of the record data + + $header = pack("vv", $record, $length); + $data = pack("vvvdvVv", $row, $col, $xf, $num, + $grbit, $unknown, $formlen); + + $this->_append($header . $data . $formula); + return 0; + } + + /** + * Write a hyperlink. + * This is comprised of two elements: the visible label and + * the invisible link. The visible label is the same as the link unless an + * alternative string is specified. The label is written using the + * writeString() method. Therefore the 255 characters string limit applies. + * $string and $format are optional. + * + * The hyperlink can be to a http, ftp, mail, internal sheet (not yet), or external + * directory url. + * + * Returns 0 : normal termination + * -2 : row or column out of range + * -3 : long string truncated to 255 chars + * + * @access public + * @param integer $row Row + * @param integer $col Column + * @param string $url URL string + * @param string $string Alternative label + * @param mixed $format The cell format + * @return integer + */ + function writeUrl($row, $col, $url, $string = '', $format = null) + { + // Add start row and col to arg list + return($this->_writeUrlRange($row, $col, $row, $col, $url, $string, $format)); + } + + /** + * This is the more general form of writeUrl(). It allows a hyperlink to be + * written to a range of cells. This function also decides the type of hyperlink + * to be written. These are either, Web (http, ftp, mailto), Internal + * (Sheet1!A1) or external ('c:\temp\foo.xls#Sheet1!A1'). + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @param string $string Alternative label + * @param mixed $format The cell format + * @return integer + */ + + function _writeUrlRange($row1, $col1, $row2, $col2, $url, $string = '', $format = null) + { + + // Check for internal/external sheet links or default to web link + if (preg_match('[^internal:]', $url)) { + return($this->_writeUrlInternal($row1, $col1, $row2, $col2, $url, $string, $format)); + } + if (preg_match('[^external:]', $url)) { + return($this->_writeUrlExternal($row1, $col1, $row2, $col2, $url, $string, $format)); + } + return($this->_writeUrlWeb($row1, $col1, $row2, $col2, $url, $string, $format)); + } + + + /** + * Used to write http, ftp and mailto hyperlinks. + * The link type ($options) is 0x03 is the same as absolute dir ref without + * sheet. However it is differentiated by the $unknown2 data stream. + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @param string $str Alternative label + * @param mixed $format The cell format + * @return integer + */ + function _writeUrlWeb($row1, $col1, $row2, $col2, $url, $str, $format = null) + { + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + if (!$format) { + $format = $this->_url_format; + } + + // Write the visible label using the writeString() method. + if ($str == '') { + $str = $url; + } + $str_error = $this->writeString($row1, $col1, $str, $format); + if (($str_error == -2) || ($str_error == -3)) { + return $str_error; + } + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); + $unknown2 = pack("H*", "E0C9EA79F9BACE118C8200AA004BA90B"); + + // Pack the option flags + $options = pack("V", 0x03); + + // Convert URL to a null terminated wchar string + $url = join("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); + $url = $url . "\0\0\0"; + + // Pack the length of the URL + $url_len = pack("V", strlen($url)); + + // Calculate the data length + $length = 0x34 + strlen($url); + + // Pack the header data + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row1, $row2, $col1, $col2); + + // Write the packed data + $this->_append($header . $data . + $unknown1 . $options . + $unknown2 . $url_len . $url); + return($str_error); + } + + /** + * Used to write internal reference hyperlinks such as "Sheet1!A1". + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @param string $str Alternative label + * @param mixed $format The cell format + * @return integer + */ + function _writeUrlInternal($row1, $col1, $row2, $col2, $url, $str, $format = null) + { + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + if (!$format) { + $format = $this->_url_format; + } + + // Strip URL type + $url = preg_replace('/^internal:/', '', $url); + + // Write the visible label + if ($str == '') { + $str = $url; + } + $str_error = $this->writeString($row1, $col1, $str, $format); + if (($str_error == -2) || ($str_error == -3)) { + return $str_error; + } + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); + + // Pack the option flags + $options = pack("V", 0x08); + + // Convert the URL type and to a null terminated wchar string + $url = join("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); + $url = $url . "\0\0\0"; + + // Pack the length of the URL as chars (not wchars) + $url_len = pack("V", floor(strlen($url)/2)); + + // Calculate the data length + $length = 0x24 + strlen($url); + + // Pack the header data + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row1, $row2, $col1, $col2); + + // Write the packed data + $this->_append($header . $data . + $unknown1 . $options . + $url_len . $url); + return($str_error); + } + + /** + * Write links to external directory names such as 'c:\foo.xls', + * c:\foo.xls#Sheet1!A1', '../../foo.xls'. and '../../foo.xls#Sheet1!A1'. + * + * Note: Excel writes some relative links with the $dir_long string. We ignore + * these cases for the sake of simpler code. + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @param string $str Alternative label + * @param mixed $format The cell format + * @return integer + */ + function _writeUrlExternal($row1, $col1, $row2, $col2, $url, $str, $format = null) + { + // Network drives are different. We will handle them separately + // MS/Novell network drives and shares start with \\ + if (preg_match('[^external:\\\\]', $url)) { + return; //($this->_writeUrlExternal_net($row1, $col1, $row2, $col2, $url, $str, $format)); + } + + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + if (!$format) { + $format = $this->_url_format; + } + + // Strip URL type and change Unix dir separator to Dos style (if needed) + // + $url = preg_replace('/^external:/', '', $url); + $url = preg_replace('/\//', "\\", $url); + + // Write the visible label + if ($str == '') { + $str = preg_replace('/\#/', ' - ', $url); + } + $str_error = $this->writeString($row1, $col1, $str, $format); + if (($str_error == -2) or ($str_error == -3)) { + return $str_error; + } + + // Determine if the link is relative or absolute: + // relative if link contains no dir separator, "somefile.xls" + // relative if link starts with up-dir, "..\..\somefile.xls" + // otherwise, absolute + + $absolute = 0x02; // Bit mask + if (!preg_match("/\\\/", $url)) { + $absolute = 0x00; + } + if (preg_match("/^\.\.\\\/", $url)) { + $absolute = 0x00; + } + $link_type = 0x01 | $absolute; + + // Determine if the link contains a sheet reference and change some of the + // parameters accordingly. + // Split the dir name and sheet name (if it exists) + /*if (preg_match("/\#/", $url)) { + list($dir_long, $sheet) = split("\#", $url); + } else { + $dir_long = $url; + } + + if (isset($sheet)) { + $link_type |= 0x08; + $sheet_len = pack("V", strlen($sheet) + 0x01); + $sheet = join("\0", split('', $sheet)); + $sheet .= "\0\0\0"; + } else { + $sheet_len = ''; + $sheet = ''; + }*/ + $dir_long = $url; + if (preg_match("/\#/", $url)) { + $link_type |= 0x08; + } + + + + // Pack the link type + $link_type = pack("V", $link_type); + + // Calculate the up-level dir count e.g.. (..\..\..\ == 3) + $up_count = preg_match_all("/\.\.\\\/", $dir_long, $useless); + $up_count = pack("v", $up_count); + + // Store the short dos dir name (null terminated) + $dir_short = preg_replace("/\.\.\\\/", '', $dir_long) . "\0"; + + // Store the long dir name as a wchar string (non-null terminated) + //$dir_long = join("\0", split('', $dir_long)); + $dir_long = $dir_long . "\0"; + + // Pack the lengths of the dir strings + $dir_short_len = pack("V", strlen($dir_short) ); + $dir_long_len = pack("V", strlen($dir_long) ); + $stream_len = pack("V", 0);//strlen($dir_long) + 0x06); + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*",'D0C9EA79F9BACE118C8200AA004BA90B02000000' ); + $unknown2 = pack("H*",'0303000000000000C000000000000046' ); + $unknown3 = pack("H*",'FFFFADDE000000000000000000000000000000000000000'); + $unknown4 = pack("v", 0x03 ); + + // Pack the main data stream + $data = pack("vvvv", $row1, $row2, $col1, $col2) . + $unknown1 . + $link_type . + $unknown2 . + $up_count . + $dir_short_len. + $dir_short . + $unknown3 . + $stream_len ;/*. + $dir_long_len . + $unknown4 . + $dir_long . + $sheet_len . + $sheet ;*/ + + // Pack the header data + $length = strlen($data); + $header = pack("vv", $record, $length); + + // Write the packed data + $this->_append($header. $data); + return($str_error); + } + + + /** + * This method is used to set the height and format for a row. + * + * @access public + * @param integer $row The row to set + * @param integer $height Height we are giving to the row. + * Use null to set XF without setting height + * @param mixed $format XF format we are giving to the row + * @param bool $hidden The optional hidden attribute + * @param integer $level The optional outline level for row, in range [0,7] + */ + function setRow($row, $height, $format = null, $hidden = false, $level = 0) + { + $record = 0x0208; // Record identifier + $length = 0x0010; // Number of bytes to follow + + $colMic = 0x0000; // First defined column + $colMac = 0x0000; // Last defined column + $irwMac = 0x0000; // Used by Excel to optimise loading + $reserved = 0x0000; // Reserved + $grbit = 0x0000; // Option flags + $ixfe = $this->_XF($format); // XF index + + // set _row_sizes so _sizeRow() can use it + $this->_row_sizes[$row] = $height; + + // Use setRow($row, null, $XF) to set XF format without setting height + if ($height != null) { + $miyRw = $height * 20; // row height + } else { + $miyRw = 0xff; // default row height is 256 + } + + $level = max(0, min($level, 7)); // level should be between 0 and 7 + $this->_outline_row_level = max($level, $this->_outline_row_level); + + + // Set the options flags. fUnsynced is used to show that the font and row + // heights are not compatible. This is usually the case for WriteExcel. + // The collapsed flag 0x10 doesn't seem to be used to indicate that a row + // is collapsed. Instead it is used to indicate that the previous row is + // collapsed. The zero height flag, 0x20, is used to collapse a row. + + $grbit |= $level; + if ($hidden) { + $grbit |= 0x0020; + } + $grbit |= 0x0040; // fUnsynced + if ($format) { + $grbit |= 0x0080; + } + $grbit |= 0x0100; + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvv", $row, $colMic, $colMac, $miyRw, + $irwMac,$reserved, $grbit, $ixfe); + $this->_append($header.$data); + } + + /** + * Writes Excel DIMENSIONS to define the area in which there is data. + * + * @access private + */ + function _storeDimensions() + { + $record = 0x0200; // Record identifier + $row_min = $this->_dim_rowmin; // First row + $row_max = $this->_dim_rowmax + 1; // Last row plus 1 + $col_min = $this->_dim_colmin; // First column + $col_max = $this->_dim_colmax + 1; // Last column plus 1 + $reserved = 0x0000; // Reserved by Excel + + if ($this->_BIFF_version == 0x0500) { + $length = 0x000A; // Number of bytes to follow + $data = pack("vvvvv", $row_min, $row_max, + $col_min, $col_max, $reserved); + } elseif ($this->_BIFF_version == 0x0600) { + $length = 0x000E; + $data = pack("VVvvv", $row_min, $row_max, + $col_min, $col_max, $reserved); + } + $header = pack("vv", $record, $length); + $this->_prepend($header.$data); + } + + /** + * Write BIFF record Window2. + * + * @access private + */ + function _storeWindow2() + { + $record = 0x023E; // Record identifier + if ($this->_BIFF_version == 0x0500) { + $length = 0x000A; // Number of bytes to follow + } elseif ($this->_BIFF_version == 0x0600) { + $length = 0x0012; + } + + $grbit = 0x00B6; // Option flags + $rwTop = 0x0000; // Top row visible in window + $colLeft = 0x0000; // Leftmost column visible in window + + + // The options flags that comprise $grbit + $fDspFmla = 0; // 0 - bit + $fDspGrid = $this->_screen_gridlines; // 1 + $fDspRwCol = 1; // 2 + $fFrozen = $this->_frozen; // 3 + $fDspZeros = 1; // 4 + $fDefaultHdr = 1; // 5 + $fArabic = 0; // 6 + $fDspGuts = $this->_outline_on; // 7 + $fFrozenNoSplit = 0; // 0 - bit + $fSelected = $this->selected; // 1 + $fPaged = 1; // 2 + + $grbit = $fDspFmla; + $grbit |= $fDspGrid << 1; + $grbit |= $fDspRwCol << 2; + $grbit |= $fFrozen << 3; + $grbit |= $fDspZeros << 4; + $grbit |= $fDefaultHdr << 5; + $grbit |= $fArabic << 6; + $grbit |= $fDspGuts << 7; + $grbit |= $fFrozenNoSplit << 8; + $grbit |= $fSelected << 9; + $grbit |= $fPaged << 10; + + $header = pack("vv", $record, $length); + $data = pack("vvv", $grbit, $rwTop, $colLeft); + // FIXME !!! + if ($this->_BIFF_version == 0x0500) { + $rgbHdr = 0x00000000; // Row/column heading and gridline color + $data .= pack("V", $rgbHdr); + } elseif ($this->_BIFF_version == 0x0600) { + $rgbHdr = 0x0040; // Row/column heading and gridline color index + $zoom_factor_page_break = 0x0000; + $zoom_factor_normal = 0x0000; + $data .= pack("vvvvV", $rgbHdr, 0x0000, $zoom_factor_page_break, $zoom_factor_normal, 0x00000000); + } + $this->_append($header.$data); + } + + /** + * Write BIFF record DEFCOLWIDTH if COLINFO records are in use. + * + * @access private + */ + function _storeDefcol() + { + $record = 0x0055; // Record identifier + $length = 0x0002; // Number of bytes to follow + $colwidth = 0x0008; // Default column width + + $header = pack("vv", $record, $length); + $data = pack("v", $colwidth); + $this->_prepend($header . $data); + } + + /** + * Write BIFF record COLINFO to define column widths + * + * Note: The SDK says the record length is 0x0B but Excel writes a 0x0C + * length record. + * + * @access private + * @param array $col_array This is the only parameter received and is composed of the following: + * 0 => First formatted column, + * 1 => Last formatted column, + * 2 => Col width (8.43 is Excel default), + * 3 => The optional XF format of the column, + * 4 => Option flags. + * 5 => Optional outline level + */ + function _storeColinfo($col_array) + { + if (isset($col_array[0])) { + $colFirst = $col_array[0]; + } + if (isset($col_array[1])) { + $colLast = $col_array[1]; + } + if (isset($col_array[2])) { + $coldx = $col_array[2]; + } else { + $coldx = 8.43; + } + if (isset($col_array[3])) { + $format = $col_array[3]; + } else { + $format = 0; + } + if (isset($col_array[4])) { + $grbit = $col_array[4]; + } else { + $grbit = 0; + } + if (isset($col_array[5])) { + $level = $col_array[5]; + } else { + $level = 0; + } + $record = 0x007D; // Record identifier + $length = 0x000B; // Number of bytes to follow + + $coldx += 0.72; // Fudge. Excel subtracts 0.72 !? + $coldx *= 256; // Convert to units of 1/256 of a char + + $ixfe = $this->_XF($format); + $reserved = 0x00; // Reserved + + $level = max(0, min($level, 7)); + $grbit |= $level << 8; + + $header = pack("vv", $record, $length); + $data = pack("vvvvvC", $colFirst, $colLast, $coldx, + $ixfe, $grbit, $reserved); + $this->_prepend($header.$data); + } + + /** + * Write BIFF record SELECTION. + * + * @access private + * @param array $array array containing ($rwFirst,$colFirst,$rwLast,$colLast) + * @see setSelection() + */ + function _storeSelection($array) + { + list($rwFirst,$colFirst,$rwLast,$colLast) = $array; + $record = 0x001D; // Record identifier + $length = 0x000F; // Number of bytes to follow + + $pnn = $this->_active_pane; // Pane position + $rwAct = $rwFirst; // Active row + $colAct = $colFirst; // Active column + $irefAct = 0; // Active cell ref + $cref = 1; // Number of refs + + if (!isset($rwLast)) { + $rwLast = $rwFirst; // Last row in reference + } + if (!isset($colLast)) { + $colLast = $colFirst; // Last col in reference + } + + // Swap last row/col for first row/col as necessary + if ($rwFirst > $rwLast) { + list($rwFirst, $rwLast) = array($rwLast, $rwFirst); + } + + if ($colFirst > $colLast) { + list($colFirst, $colLast) = array($colLast, $colFirst); + } + + $header = pack("vv", $record, $length); + $data = pack("CvvvvvvCC", $pnn, $rwAct, $colAct, + $irefAct, $cref, + $rwFirst, $rwLast, + $colFirst, $colLast); + $this->_append($header . $data); + } + + /** + * Store the MERGEDCELLS record for all ranges of merged cells + * + * @access private + */ + function _storeMergedCells() + { + // if there are no merged cell ranges set, return + if (count($this->_merged_ranges) == 0) { + return; + } + $record = 0x00E5; + $length = 2 + count($this->_merged_ranges) * 8; + + $header = pack('vv', $record, $length); + $data = pack('v', count($this->_merged_ranges)); + foreach ($this->_merged_ranges as $range) { + $data .= pack('vvvv', $range[0], $range[2], $range[1], $range[3]); + } + $this->_append($header . $data); + } + + /** + * Write BIFF record EXTERNCOUNT to indicate the number of external sheet + * references in a worksheet. + * + * Excel only stores references to external sheets that are used in formulas. + * For simplicity we store references to all the sheets in the workbook + * regardless of whether they are used or not. This reduces the overall + * complexity and eliminates the need for a two way dialogue between the formula + * parser the worksheet objects. + * + * @access private + * @param integer $count The number of external sheet references in this worksheet + */ + function _storeExterncount($count) + { + $record = 0x0016; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $count); + $this->_prepend($header . $data); + } + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. A formula references a sheet name via an index. Since we store a + * reference to all of the external worksheets the EXTERNSHEET index is the same + * as the worksheet index. + * + * @access private + * @param string $sheetname The name of a external worksheet + */ + function _storeExternsheet($sheetname) + { + $record = 0x0017; // Record identifier + + // References to the current sheet are encoded differently to references to + // external sheets. + // + if ($this->name == $sheetname) { + $sheetname = ''; + $length = 0x02; // The following 2 bytes + $cch = 1; // The following byte + $rgch = 0x02; // Self reference + } else { + $length = 0x02 + strlen($sheetname); + $cch = strlen($sheetname); + $rgch = 0x03; // Reference to a sheet in the current workbook + } + + $header = pack("vv", $record, $length); + $data = pack("CC", $cch, $rgch); + $this->_prepend($header . $data . $sheetname); + } + + /** + * Writes the Excel BIFF PANE record. + * The panes can either be frozen or thawed (unfrozen). + * Frozen panes are specified in terms of an integer number of rows and columns. + * Thawed panes are specified in terms of Excel's units for rows and columns. + * + * @access private + * @param array $panes This is the only parameter received and is composed of the following: + * 0 => Vertical split position, + * 1 => Horizontal split position + * 2 => Top row visible + * 3 => Leftmost column visible + * 4 => Active pane + */ + function _storePanes($panes) + { + $y = $panes[0]; + $x = $panes[1]; + $rwTop = $panes[2]; + $colLeft = $panes[3]; + if (count($panes) > 4) { // if Active pane was received + $pnnAct = $panes[4]; + } else { + $pnnAct = null; + } + $record = 0x0041; // Record identifier + $length = 0x000A; // Number of bytes to follow + + // Code specific to frozen or thawed panes. + if ($this->_frozen) { + // Set default values for $rwTop and $colLeft + if (!isset($rwTop)) { + $rwTop = $y; + } + if (!isset($colLeft)) { + $colLeft = $x; + } + } else { + // Set default values for $rwTop and $colLeft + if (!isset($rwTop)) { + $rwTop = 0; + } + if (!isset($colLeft)) { + $colLeft = 0; + } + + // Convert Excel's row and column units to the internal units. + // The default row height is 12.75 + // The default column width is 8.43 + // The following slope and intersection values were interpolated. + // + $y = 20*$y + 255; + $x = 113.879*$x + 390; + } + + + // Determine which pane should be active. There is also the undocumented + // option to override this should it be necessary: may be removed later. + // + if (!isset($pnnAct)) { + if ($x != 0 && $y != 0) { + $pnnAct = 0; // Bottom right + } + if ($x != 0 && $y == 0) { + $pnnAct = 1; // Top right + } + if ($x == 0 && $y != 0) { + $pnnAct = 2; // Bottom left + } + if ($x == 0 && $y == 0) { + $pnnAct = 3; // Top left + } + } + + $this->_active_pane = $pnnAct; // Used in _storeSelection + + $header = pack("vv", $record, $length); + $data = pack("vvvvv", $x, $y, $rwTop, $colLeft, $pnnAct); + $this->_append($header . $data); + } + + /** + * Store the page setup SETUP BIFF record. + * + * @access private + */ + function _storeSetup() + { + $record = 0x00A1; // Record identifier + $length = 0x0022; // Number of bytes to follow + + $iPaperSize = $this->_paper_size; // Paper size + $iScale = $this->_print_scale; // Print scaling factor + $iPageStart = 0x01; // Starting page number + $iFitWidth = $this->_fit_width; // Fit to number of pages wide + $iFitHeight = $this->_fit_height; // Fit to number of pages high + $grbit = 0x00; // Option flags + $iRes = 0x0258; // Print resolution + $iVRes = 0x0258; // Vertical print resolution + $numHdr = $this->_margin_head; // Header Margin + $numFtr = $this->_margin_foot; // Footer Margin + $iCopies = 0x01; // Number of copies + + $fLeftToRight = 0x0; // Print over then down + $fLandscape = $this->_orientation; // Page orientation + $fNoPls = 0x0; // Setup not read from printer + $fNoColor = 0x0; // Print black and white + $fDraft = 0x0; // Print draft quality + $fNotes = 0x0; // Print notes + $fNoOrient = 0x0; // Orientation not set + $fUsePage = 0x0; // Use custom starting page + + $grbit = $fLeftToRight; + $grbit |= $fLandscape << 1; + $grbit |= $fNoPls << 2; + $grbit |= $fNoColor << 3; + $grbit |= $fDraft << 4; + $grbit |= $fNotes << 5; + $grbit |= $fNoOrient << 6; + $grbit |= $fUsePage << 7; + + $numHdr = pack("d", $numHdr); + $numFtr = pack("d", $numFtr); + if ($this->_byte_order) { // if it's Big Endian + $numHdr = strrev($numHdr); + $numFtr = strrev($numFtr); + } + + $header = pack("vv", $record, $length); + $data1 = pack("vvvvvvvv", $iPaperSize, + $iScale, + $iPageStart, + $iFitWidth, + $iFitHeight, + $grbit, + $iRes, + $iVRes); + $data2 = $numHdr.$numFtr; + $data3 = pack("v", $iCopies); + $this->_prepend($header . $data1 . $data2 . $data3); + } + + /** + * Store the header caption BIFF record. + * + * @access private + */ + function _storeHeader() + { + $record = 0x0014; // Record identifier + + $str = $this->_header; // header string + $cch = strlen($str); // Length of header string + if ($this->_BIFF_version == 0x0600) { + $encoding = 0x0; // TODO: Unicode support + $length = 3 + $cch; // Bytes to follow + } else { + $length = 1 + $cch; // Bytes to follow + } + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0600) { + $data = pack("vC", $cch, $encoding); + } else { + $data = pack("C", $cch); + } + + $this->_prepend($header.$data.$str); + } + + /** + * Store the footer caption BIFF record. + * + * @access private + */ + function _storeFooter() + { + $record = 0x0015; // Record identifier + + $str = $this->_footer; // Footer string + $cch = strlen($str); // Length of footer string + if ($this->_BIFF_version == 0x0600) { + $encoding = 0x0; // TODO: Unicode support + $length = 3 + $cch; // Bytes to follow + } else { + $length = 1 + $cch; + } + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0600) { + $data = pack("vC", $cch, $encoding); + } else { + $data = pack("C", $cch); + } + + $this->_prepend($header . $data . $str); + } + + /** + * Store the horizontal centering HCENTER BIFF record. + * + * @access private + */ + function _storeHcenter() + { + $record = 0x0083; // Record identifier + $length = 0x0002; // Bytes to follow + + $fHCenter = $this->_hcenter; // Horizontal centering + + $header = pack("vv", $record, $length); + $data = pack("v", $fHCenter); + + $this->_prepend($header.$data); + } + + /** + * Store the vertical centering VCENTER BIFF record. + * + * @access private + */ + function _storeVcenter() + { + $record = 0x0084; // Record identifier + $length = 0x0002; // Bytes to follow + + $fVCenter = $this->_vcenter; // Horizontal centering + + $header = pack("vv", $record, $length); + $data = pack("v", $fVCenter); + $this->_prepend($header . $data); + } + + /** + * Store the LEFTMARGIN BIFF record. + * + * @access private + */ + function _storeMarginLeft() + { + $record = 0x0026; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_left; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if ($this->_byte_order) { // if it's Big Endian + $data = strrev($data); + } + + $this->_prepend($header . $data); + } + + /** + * Store the RIGHTMARGIN BIFF record. + * + * @access private + */ + function _storeMarginRight() + { + $record = 0x0027; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_right; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if ($this->_byte_order) { // if it's Big Endian + $data = strrev($data); + } + + $this->_prepend($header . $data); + } + + /** + * Store the TOPMARGIN BIFF record. + * + * @access private + */ + function _storeMarginTop() + { + $record = 0x0028; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_top; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if ($this->_byte_order) { // if it's Big Endian + $data = strrev($data); + } + + $this->_prepend($header . $data); + } + + /** + * Store the BOTTOMMARGIN BIFF record. + * + * @access private + */ + function _storeMarginBottom() + { + $record = 0x0029; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_bottom; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if ($this->_byte_order) { // if it's Big Endian + $data = strrev($data); + } + + $this->_prepend($header . $data); + } + + /** + * Merges the area given by its arguments. + * This is an Excel97/2000 method. It is required to perform more complicated + * merging than the normal setAlign('merge'). + * + * @access public + * @param integer $first_row First row of the area to merge + * @param integer $first_col First column of the area to merge + * @param integer $last_row Last row of the area to merge + * @param integer $last_col Last column of the area to merge + */ + function mergeCells($first_row, $first_col, $last_row, $last_col) + { + $record = 0x00E5; // Record identifier + $length = 0x000A; // Bytes to follow + $cref = 1; // Number of refs + + // Swap last row/col for first row/col as necessary + if ($first_row > $last_row) { + list($first_row, $last_row) = array($last_row, $first_row); + } + + if ($first_col > $last_col) { + list($first_col, $last_col) = array($last_col, $first_col); + } + + $header = pack("vv", $record, $length); + $data = pack("vvvvv", $cref, $first_row, $last_row, + $first_col, $last_col); + + $this->_append($header.$data); + } + + /** + * Write the PRINTHEADERS BIFF record. + * + * @access private + */ + function _storePrintHeaders() + { + $record = 0x002a; // Record identifier + $length = 0x0002; // Bytes to follow + + $fPrintRwCol = $this->_print_headers; // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fPrintRwCol); + $this->_prepend($header . $data); + } + + /** + * Write the PRINTGRIDLINES BIFF record. Must be used in conjunction with the + * GRIDSET record. + * + * @access private + */ + function _storePrintGridlines() + { + $record = 0x002b; // Record identifier + $length = 0x0002; // Bytes to follow + + $fPrintGrid = $this->_print_gridlines; // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fPrintGrid); + $this->_prepend($header . $data); + } + + /** + * Write the GRIDSET BIFF record. Must be used in conjunction with the + * PRINTGRIDLINES record. + * + * @access private + */ + function _storeGridset() + { + $record = 0x0082; // Record identifier + $length = 0x0002; // Bytes to follow + + $fGridSet = !($this->_print_gridlines); // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fGridSet); + $this->_prepend($header . $data); + } + + /** + * Write the GUTS BIFF record. This is used to configure the gutter margins + * where Excel outline symbols are displayed. The visibility of the gutters is + * controlled by a flag in WSBOOL. + * + * @see _storeWsbool() + * @access private + */ + function _storeGuts() + { + $record = 0x0080; // Record identifier + $length = 0x0008; // Bytes to follow + + $dxRwGut = 0x0000; // Size of row gutter + $dxColGut = 0x0000; // Size of col gutter + + $row_level = $this->_outline_row_level; + $col_level = 0; + + // Calculate the maximum column outline level. The equivalent calculation + // for the row outline level is carried out in setRow(). + $colcount = count($this->_colinfo); + for ($i = 0; $i < $colcount; $i++) { + // Skip cols without outline level info. + if (count($col_level) >= 6) { + $col_level = max($this->_colinfo[$i][5], $col_level); + } + } + + // Set the limits for the outline levels (0 <= x <= 7). + $col_level = max(0, min($col_level, 7)); + + // The displayed level is one greater than the max outline levels + if ($row_level) { + $row_level++; + } + if ($col_level) { + $col_level++; + } + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $dxRwGut, $dxColGut, $row_level, $col_level); + + $this->_prepend($header.$data); + } + + + /** + * Write the WSBOOL BIFF record, mainly for fit-to-page. Used in conjunction + * with the SETUP record. + * + * @access private + */ + function _storeWsbool() + { + $record = 0x0081; // Record identifier + $length = 0x0002; // Bytes to follow + $grbit = 0x0000; + + // The only option that is of interest is the flag for fit to page. So we + // set all the options in one go. + // + /*if ($this->_fit_page) { + $grbit = 0x05c1; + } else { + $grbit = 0x04c1; + }*/ + // Set the option flags + $grbit |= 0x0001; // Auto page breaks visible + if ($this->_outline_style) { + $grbit |= 0x0020; // Auto outline styles + } + if ($this->_outline_below) { + $grbit |= 0x0040; // Outline summary below + } + if ($this->_outline_right) { + $grbit |= 0x0080; // Outline summary right + } + if ($this->_fit_page) { + $grbit |= 0x0100; // Page setup fit to page + } + if ($this->_outline_on) { + $grbit |= 0x0400; // Outline symbols displayed + } + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $this->_prepend($header . $data); + } + + /** + * Write the HORIZONTALPAGEBREAKS BIFF record. + * + * @access private + */ + function _storeHbreak() + { + // Return if the user hasn't specified pagebreaks + if (empty($this->_hbreaks)) { + return; + } + + // Sort and filter array of page breaks + $breaks = $this->_hbreaks; + sort($breaks, SORT_NUMERIC); + if ($breaks[0] == 0) { // don't use first break if it's 0 + array_shift($breaks); + } + + $record = 0x001b; // Record identifier + $cbrk = count($breaks); // Number of page breaks + if ($this->_BIFF_version == 0x0600) { + $length = 2 + 6*$cbrk; // Bytes to follow + } else { + $length = 2 + 2*$cbrk; // Bytes to follow + } + + $header = pack("vv", $record, $length); + $data = pack("v", $cbrk); + + // Append each page break + foreach ($breaks as $break) { + if ($this->_BIFF_version == 0x0600) { + $data .= pack("vvv", $break, 0x0000, 0x00ff); + } else { + $data .= pack("v", $break); + } + } + + $this->_prepend($header.$data); + } + + + /** + * Write the VERTICALPAGEBREAKS BIFF record. + * + * @access private + */ + function _storeVbreak() + { + // Return if the user hasn't specified pagebreaks + if (empty($this->_vbreaks)) { + return; + } + + // 1000 vertical pagebreaks appears to be an internal Excel 5 limit. + // It is slightly higher in Excel 97/200, approx. 1026 + $breaks = array_slice($this->_vbreaks,0,1000); + + // Sort and filter array of page breaks + sort($breaks, SORT_NUMERIC); + if ($breaks[0] == 0) { // don't use first break if it's 0 + array_shift($breaks); + } + + $record = 0x001a; // Record identifier + $cbrk = count($breaks); // Number of page breaks + if ($this->_BIFF_version == 0x0600) { + $length = 2 + 6*$cbrk; // Bytes to follow + } else { + $length = 2 + 2*$cbrk; // Bytes to follow + } + + $header = pack("vv", $record, $length); + $data = pack("v", $cbrk); + + // Append each page break + foreach ($breaks as $break) { + if ($this->_BIFF_version == 0x0600) { + $data .= pack("vvv", $break, 0x0000, 0xffff); + } else { + $data .= pack("v", $break); + } + } + + $this->_prepend($header . $data); + } + + /** + * Set the Biff PROTECT record to indicate that the worksheet is protected. + * + * @access private + */ + function _storeProtect() + { + // Exit unless sheet protection has been specified + if ($this->_protect == 0) { + return; + } + + $record = 0x0012; // Record identifier + $length = 0x0002; // Bytes to follow + + $fLock = $this->_protect; // Worksheet is protected + + $header = pack("vv", $record, $length); + $data = pack("v", $fLock); + + $this->_prepend($header.$data); + } + + /** + * Write the worksheet PASSWORD record. + * + * @access private + */ + function _storePassword() + { + // Exit unless sheet protection and password have been specified + if (($this->_protect == 0) || (!isset($this->_password))) { + return; + } + + $record = 0x0013; // Record identifier + $length = 0x0002; // Bytes to follow + + $wPassword = $this->_password; // Encoded password + + $header = pack("vv", $record, $length); + $data = pack("v", $wPassword); + + $this->_prepend($header . $data); + } + + + /** + * Insert a 24bit bitmap image in a worksheet. + * + * @access public + * @param integer $row The row we are going to insert the bitmap into + * @param integer $col The column we are going to insert the bitmap into + * @param string $bitmap The bitmap filename + * @param integer $x The horizontal position (offset) of the image inside the cell. + * @param integer $y The vertical position (offset) of the image inside the cell. + * @param integer $scale_x The horizontal scale + * @param integer $scale_y The vertical scale + */ + function insertBitmap($row, $col, $bitmap, $x = 0, $y = 0, $scale_x = 1, $scale_y = 1) + { + $bitmap_array = $this->_processBitmap($bitmap); + if ($this->isError($bitmap_array)) { + $this->writeString($row, $col, $bitmap_array->getMessage()); + return; + } + list($width, $height, $size, $data) = $bitmap_array; //$this->_processBitmap($bitmap); + + // Scale the frame of the image. + $width *= $scale_x; + $height *= $scale_y; + + // Calculate the vertices of the image and write the OBJ record + $this->_positionImage($col, $row, $x, $y, $width, $height); + + // Write the IMDATA record to store the bitmap data + $record = 0x007f; + $length = 8 + $size; + $cf = 0x09; + $env = 0x01; + $lcb = $size; + + $header = pack("vvvvV", $record, $length, $cf, $env, $lcb); + $this->_append($header.$data); + } + + /** + * Calculate the vertices that define the position of the image as required by + * the OBJ record. + * + * +------------+------------+ + * | A | B | + * +-----+------------+------------+ + * | |(x1,y1) | | + * | 1 |(A1)._______|______ | + * | | | | | + * | | | | | + * +-----+----| BITMAP |-----+ + * | | | | | + * | 2 | |______________. | + * | | | (B2)| + * | | | (x2,y2)| + * +---- +------------+------------+ + * + * Example of a bitmap that covers some of the area from cell A1 to cell B2. + * + * Based on the width and height of the bitmap we need to calculate 8 vars: + * $col_start, $row_start, $col_end, $row_end, $x1, $y1, $x2, $y2. + * The width and height of the cells are also variable and have to be taken into + * account. + * The values of $col_start and $row_start are passed in from the calling + * function. The values of $col_end and $row_end are calculated by subtracting + * the width and height of the bitmap from the width and height of the + * underlying cells. + * The vertices are expressed as a percentage of the underlying cell width as + * follows (rhs values are in pixels): + * + * x1 = X / W *1024 + * y1 = Y / H *256 + * x2 = (X-1) / W *1024 + * y2 = (Y-1) / H *256 + * + * Where: X is distance from the left side of the underlying cell + * Y is distance from the top of the underlying cell + * W is the width of the cell + * H is the height of the cell + * + * @access private + * @note the SDK incorrectly states that the height should be expressed as a + * percentage of 1024. + * @param integer $col_start Col containing upper left corner of object + * @param integer $row_start Row containing top left corner of object + * @param integer $x1 Distance to left side of object + * @param integer $y1 Distance to top of object + * @param integer $width Width of image frame + * @param integer $height Height of image frame + */ + function _positionImage($col_start, $row_start, $x1, $y1, $width, $height) + { + // Initialise end cell to the same as the start cell + $col_end = $col_start; // Col containing lower right corner of object + $row_end = $row_start; // Row containing bottom right corner of object + + // Zero the specified offset if greater than the cell dimensions + if ($x1 >= $this->_sizeCol($col_start)) { + $x1 = 0; + } + if ($y1 >= $this->_sizeRow($row_start)) { + $y1 = 0; + } + + $width = $width + $x1 -1; + $height = $height + $y1 -1; + + // Subtract the underlying cell widths to find the end cell of the image + while ($width >= $this->_sizeCol($col_end)) { + $width -= $this->_sizeCol($col_end); + $col_end++; + } + + // Subtract the underlying cell heights to find the end cell of the image + while ($height >= $this->_sizeRow($row_end)) { + $height -= $this->_sizeRow($row_end); + $row_end++; + } + + // Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell + // with zero eight or width. + // + if ($this->_sizeCol($col_start) == 0) { + return; + } + if ($this->_sizeCol($col_end) == 0) { + return; + } + if ($this->_sizeRow($row_start) == 0) { + return; + } + if ($this->_sizeRow($row_end) == 0) { + return; + } + + // Convert the pixel values to the percentage value expected by Excel + $x1 = $x1 / $this->_sizeCol($col_start) * 1024; + $y1 = $y1 / $this->_sizeRow($row_start) * 256; + $x2 = $width / $this->_sizeCol($col_end) * 1024; // Distance to right side of object + $y2 = $height / $this->_sizeRow($row_end) * 256; // Distance to bottom of object + + $this->_storeObjPicture($col_start, $x1, + $row_start, $y1, + $col_end, $x2, + $row_end, $y2); + } + + /** + * Convert the width of a cell from user's units to pixels. By interpolation + * the relationship is: y = 7x +5. If the width hasn't been set by the user we + * use the default value. If the col is hidden we use a value of zero. + * + * @access private + * @param integer $col The column + * @return integer The width in pixels + */ + function _sizeCol($col) + { + // Look up the cell value to see if it has been changed + if (isset($this->col_sizes[$col])) { + if ($this->col_sizes[$col] == 0) { + return(0); + } else { + return(floor(7 * $this->col_sizes[$col] + 5)); + } + } else { + return(64); + } + } + + /** + * Convert the height of a cell from user's units to pixels. By interpolation + * the relationship is: y = 4/3x. If the height hasn't been set by the user we + * use the default value. If the row is hidden we use a value of zero. (Not + * possible to hide row yet). + * + * @access private + * @param integer $row The row + * @return integer The width in pixels + */ + function _sizeRow($row) + { + // Look up the cell value to see if it has been changed + if (isset($this->_row_sizes[$row])) { + if ($this->_row_sizes[$row] == 0) { + return(0); + } else { + return(floor(4/3 * $this->_row_sizes[$row])); + } + } else { + return(17); + } + } + + /** + * Store the OBJ record that precedes an IMDATA record. This could be generalise + * to support other Excel objects. + * + * @access private + * @param integer $colL Column containing upper left corner of object + * @param integer $dxL Distance from left side of cell + * @param integer $rwT Row containing top left corner of object + * @param integer $dyT Distance from top of cell + * @param integer $colR Column containing lower right corner of object + * @param integer $dxR Distance from right of cell + * @param integer $rwB Row containing bottom right corner of object + * @param integer $dyB Distance from bottom of cell + */ + function _storeObjPicture($colL,$dxL,$rwT,$dyT,$colR,$dxR,$rwB,$dyB) + { + $record = 0x005d; // Record identifier + $length = 0x003c; // Bytes to follow + + $cObj = 0x0001; // Count of objects in file (set to 1) + $OT = 0x0008; // Object type. 8 = Picture + $id = 0x0001; // Object ID + $grbit = 0x0614; // Option flags + + $cbMacro = 0x0000; // Length of FMLA structure + $Reserved1 = 0x0000; // Reserved + $Reserved2 = 0x0000; // Reserved + + $icvBack = 0x09; // Background colour + $icvFore = 0x09; // Foreground colour + $fls = 0x00; // Fill pattern + $fAuto = 0x00; // Automatic fill + $icv = 0x08; // Line colour + $lns = 0xff; // Line style + $lnw = 0x01; // Line weight + $fAutoB = 0x00; // Automatic border + $frs = 0x0000; // Frame style + $cf = 0x0009; // Image format, 9 = bitmap + $Reserved3 = 0x0000; // Reserved + $cbPictFmla = 0x0000; // Length of FMLA structure + $Reserved4 = 0x0000; // Reserved + $grbit2 = 0x0001; // Option flags + $Reserved5 = 0x0000; // Reserved + + + $header = pack("vv", $record, $length); + $data = pack("V", $cObj); + $data .= pack("v", $OT); + $data .= pack("v", $id); + $data .= pack("v", $grbit); + $data .= pack("v", $colL); + $data .= pack("v", $dxL); + $data .= pack("v", $rwT); + $data .= pack("v", $dyT); + $data .= pack("v", $colR); + $data .= pack("v", $dxR); + $data .= pack("v", $rwB); + $data .= pack("v", $dyB); + $data .= pack("v", $cbMacro); + $data .= pack("V", $Reserved1); + $data .= pack("v", $Reserved2); + $data .= pack("C", $icvBack); + $data .= pack("C", $icvFore); + $data .= pack("C", $fls); + $data .= pack("C", $fAuto); + $data .= pack("C", $icv); + $data .= pack("C", $lns); + $data .= pack("C", $lnw); + $data .= pack("C", $fAutoB); + $data .= pack("v", $frs); + $data .= pack("V", $cf); + $data .= pack("v", $Reserved3); + $data .= pack("v", $cbPictFmla); + $data .= pack("v", $Reserved4); + $data .= pack("v", $grbit2); + $data .= pack("V", $Reserved5); + + $this->_append($header . $data); + } + + /** + * Convert a 24 bit bitmap into the modified internal format used by Windows. + * This is described in BITMAPCOREHEADER and BITMAPCOREINFO structures in the + * MSDN library. + * + * @access private + * @param string $bitmap The bitmap to process + * @return array Array with data and properties of the bitmap + */ + function _processBitmap($bitmap) + { + // Open file. + $bmp_fd = @fopen($bitmap,"rb"); + if (!$bmp_fd) { + $this->raiseError("Couldn't import $bitmap"); + } + + // Slurp the file into a string. + $data = fread($bmp_fd, filesize($bitmap)); + + // Check that the file is big enough to be a bitmap. + if (strlen($data) <= 0x36) { + $this->raiseError("$bitmap doesn't contain enough data.\n"); + } + + // The first 2 bytes are used to identify the bitmap. + $identity = unpack("A2ident", $data); + if ($identity['ident'] != "BM") { + $this->raiseError("$bitmap doesn't appear to be a valid bitmap image.\n"); + } + + // Remove bitmap data: ID. + $data = substr($data, 2); + + // Read and remove the bitmap size. This is more reliable than reading + // the data size at offset 0x22. + // + $size_array = unpack("Vsa", substr($data, 0, 4)); + $size = $size_array['sa']; + $data = substr($data, 4); + $size -= 0x36; // Subtract size of bitmap header. + $size += 0x0C; // Add size of BIFF header. + + // Remove bitmap data: reserved, offset, header length. + $data = substr($data, 12); + + // Read and remove the bitmap width and height. Verify the sizes. + $width_and_height = unpack("V2", substr($data, 0, 8)); + $width = $width_and_height[1]; + $height = $width_and_height[2]; + $data = substr($data, 8); + if ($width > 0xFFFF) { + $this->raiseError("$bitmap: largest image width supported is 65k.\n"); + } + if ($height > 0xFFFF) { + $this->raiseError("$bitmap: largest image height supported is 65k.\n"); + } + + // Read and remove the bitmap planes and bpp data. Verify them. + $planes_and_bitcount = unpack("v2", substr($data, 0, 4)); + $data = substr($data, 4); + if ($planes_and_bitcount[2] != 24) { // Bitcount + $this->raiseError("$bitmap isn't a 24bit true color bitmap.\n"); + } + if ($planes_and_bitcount[1] != 1) { + $this->raiseError("$bitmap: only 1 plane supported in bitmap image.\n"); + } + + // Read and remove the bitmap compression. Verify compression. + $compression = unpack("Vcomp", substr($data, 0, 4)); + $data = substr($data, 4); + + //$compression = 0; + if ($compression['comp'] != 0) { + $this->raiseError("$bitmap: compression not supported in bitmap image.\n"); + } + + // Remove bitmap data: data size, hres, vres, colours, imp. colours. + $data = substr($data, 20); + + // Add the BITMAPCOREHEADER data + $header = pack("Vvvvv", 0x000c, $width, $height, 0x01, 0x18); + $data = $header . $data; + + return (array($width, $height, $size, $data)); + } + + /** + * Store the window zoom factor. This should be a reduced fraction but for + * simplicity we will store all fractions with a numerator of 100. + * + * @access private + */ + function _storeZoom() + { + // If scale is 100 we don't need to write a record + if ($this->_zoom == 100) { + return; + } + + $record = 0x00A0; // Record identifier + $length = 0x0004; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vv", $this->_zoom, 100); + $this->_append($header . $data); + } + + /** + * FIXME: add comments + */ + function setValidation($row1, $col1, $row2, $col2, &$validator) + { + $this->_dv[] = $validator->_getData() . + pack("vvvvv", 1, $row1, $row2, $col1, $col2); + } + + /** + * Store the DVAL and DV records. + * + * @access private + */ + function _storeDataValidity() + { + $record = 0x01b2; // Record identifier + $length = 0x0012; // Bytes to follow + + $grbit = 0x0002; // Prompt box at cell, no cached validity data at DV records + $horPos = 0x00000000; // Horizontal position of prompt box, if fixed position + $verPos = 0x00000000; // Vertical position of prompt box, if fixed position + $objId = 0xffffffff; // Object identifier of drop down arrow object, or -1 if not visible + + $header = pack('vv', $record, $length); + $data = pack('vVVVV', $grbit, $horPos, $verPos, $objId, + count($this->_dv)); + $this->_append($header.$data); + + $record = 0x01be; // Record identifier + foreach ($this->_dv as $dv) { + $length = strlen($dv); // Bytes to follow + $header = pack("vv", $record, $length); + $this->_append($header . $dv); + } + } +} +?> diff --git a/include/limesurvey/admin/classes/phpzip/phpzip.inc.php b/include/limesurvey/admin/classes/phpzip/phpzip.inc.php new file mode 100644 index 00000000..b1c64243 --- /dev/null +++ b/include/limesurvey/admin/classes/phpzip/phpzip.inc.php @@ -0,0 +1,273 @@ + GetFileList($dir); + } + + if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir); + else chdir($curdir); + + if (count($filelist)>0) + { + foreach($filelist as $filename) + { + if (is_file($filename)) + { + $fd = fopen ($filename, "r"); + $content = fread ($fd, filesize ($filename)); + fclose ($fd); + + if (is_array($dir)) $filename = basename($filename); + $this -> addFile($content, $filename); + } + } + $out = $this -> file(); + + chdir($curdir); + $fp = fopen($zipfilename, "w"); + fwrite($fp, $out, strlen($out)); + fclose($fp); + } + return 1; + } + else return 0; + } + + function GetFileList($dir) + { + $file=Array(); + if (file_exists($dir)) + { + $args = func_get_args(); + if(isset($args[1])) {$pref = $args[1];} else {$pref="";} + + $dh = opendir($dir); + while($files = readdir($dh)) + { + if (($files!=".")&&($files!="..")) + { + if (!is_dir($dir.$files)) + { + $file[]=$pref.$files; + } + } + } + closedir($dh); + } + return $file; + } + + var $datasec = array(); + var $ctrl_dir = array(); + var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; + var $old_offset = 0; + + /** + * Converts an Unix timestamp to a four byte DOS date and time format (date + * in high two bytes, time in low two bytes allowing magnitude comparison). + * + * @param integer the current Unix timestamp + * + * @return integer the current date in a four byte DOS format + * + * @access private + */ + function unix2DosTime($unixtime = 0) { + $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime); + + if ($timearray['year'] < 1980) { + $timearray['year'] = 1980; + $timearray['mon'] = 1; + $timearray['mday'] = 1; + $timearray['hours'] = 0; + $timearray['minutes'] = 0; + $timearray['seconds'] = 0; + } // end if + + return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | + ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1); + } // end of the 'unix2DosTime()' method + + + /** + * Adds "file" to archive + * + * @param string file contents + * @param string name of the file in the archive (may contains the path) + * @param integer the current timestamp + * + * @access public + */ + function addFile($data, $name, $time = 0) + { + $name = str_replace('\\', '/', $name); + + $dtime = dechex($this->unix2DosTime($time)); + $hexdtime = '\x' . $dtime[6] . $dtime[7] + . '\x' . $dtime[4] . $dtime[5] + . '\x' . $dtime[2] . $dtime[3] + . '\x' . $dtime[0] . $dtime[1]; + eval('$hexdtime = "' . $hexdtime . '";'); + + $fr = "\x50\x4b\x03\x04"; + $fr .= "\x14\x00"; // ver needed to extract + $fr .= "\x00\x00"; // gen purpose bit flag + $fr .= "\x08\x00"; // compression method + $fr .= $hexdtime; // last mod time and date + + // "local file header" segment + $unc_len = strlen($data); + $crc = crc32($data); + $zdata = gzcompress($data); + $c_len = strlen($zdata); + $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug + $fr .= pack('V', $crc); // crc32 + $fr .= pack('V', $c_len); // compressed filesize + $fr .= pack('V', $unc_len); // uncompressed filesize + $fr .= pack('v', strlen($name)); // length of filename + $fr .= pack('v', 0); // extra field length + $fr .= $name; + + // "file data" segment + $fr .= $zdata; + + // "data descriptor" segment (optional but necessary if archive is not + // served as file) + $fr .= pack('V', $crc); // crc32 + $fr .= pack('V', $c_len); // compressed filesize + $fr .= pack('V', $unc_len); // uncompressed filesize + + // add this entry to array + $this -> datasec[] = $fr; + $new_offset = strlen(implode('', $this->datasec)); + + // now add to central directory record + $cdrec = "\x50\x4b\x01\x02"; + $cdrec .= "\x00\x00"; // version made by + $cdrec .= "\x14\x00"; // version needed to extract + $cdrec .= "\x00\x00"; // gen purpose bit flag + $cdrec .= "\x08\x00"; // compression method + $cdrec .= $hexdtime; // last mod time & date + $cdrec .= pack('V', $crc); // crc32 + $cdrec .= pack('V', $c_len); // compressed filesize + $cdrec .= pack('V', $unc_len); // uncompressed filesize + $cdrec .= pack('v', strlen($name) ); // length of filename + $cdrec .= pack('v', 0 ); // extra field length + $cdrec .= pack('v', 0 ); // file comment length + $cdrec .= pack('v', 0 ); // disk number start + $cdrec .= pack('v', 0 ); // internal file attributes + $cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set + + $cdrec .= pack('V', $this -> old_offset ); // relative offset of local header + $this -> old_offset = $new_offset; + + $cdrec .= $name; + + // optional extra field, file comment goes here + // save to central directory + $this -> ctrl_dir[] = $cdrec; + } // end of the 'addFile()' method + + + /** + * Dumps out file + * + * @return string the zipped file + * + * @access public + */ + function file() + { + $data = implode('', $this -> datasec); + $ctrldir = implode('', $this -> ctrl_dir); + + return + $data . + $ctrldir . + $this -> eof_ctrl_dir . + pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk" + pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall + pack('V', strlen($ctrldir)) . // size of central dir + pack('V', strlen($data)) . // offset to start of central dir + "\x00\x00"; // .zip file comment length + } // end of the 'file()' method + + +// This comes from http://de.tikiwiki.org/xref-BRANCH-1-9/nav.html?lib/sheet/include/org/apicnet/io/archive/CZip.php.source.html +function extract($dir, $zipfilename){ + if (function_exists("zip_open")) { + //$dir = eregi_replace("(\..*$)", "", $zipfilename); + + $this->createDir($dir); + $zip = zip_open($zipfilename); + if ($zip) { + while ($zip_entry = zip_read($zip)) { + if (zip_entry_open($zip, $zip_entry, "r")) { + $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); +// if (eregi("(\/)", zip_entry_name($zip_entry))) $this->createDir($dir."/".eregi_replace("\/.*$", "", zip_entry_name($zip_entry))); + +// LimeSurvey Only extract first dir for the moment + if ( ! eregi("(\/)", zip_entry_name($zip_entry))) + { + $this->createFile($dir."/".zip_entry_name($zip_entry), $buf,zip_entry_filesize($zip_entry)); + } + zip_entry_close($zip_entry); + } + } + zip_close($zip); + } + else + { + return "Error:OpenZip"; + } + } + return 'OK'; + } + + function createDir($dir){ + if (eregi("(\/$)", $dir)) @mkdir (substr($dir, 0, strlen($dir) - 1)); + else @mkdir ($dir); + } + + + // This comes from http://fr.php.net/zip + function createFile($file, $data, $size){ + //$file = new File($file, TRUE); + //if ($file->exists()) { + // $file->delFile(); + // $file->createFile(); + //} + //$file->writeData($data); + + if (is_file($file)) + { + unlink($file); + } + $fopen = fopen($file, "w"); + fwrite($fopen,$data,$size); + } + +} // end of the 'PHPZip' class +?> diff --git a/include/limesurvey/admin/classes/tcpdf/checkphpversion.php b/include/limesurvey/admin/classes/tcpdf/checkphpversion.php new file mode 100644 index 00000000..692d0938 --- /dev/null +++ b/include/limesurvey/admin/classes/tcpdf/checkphpversion.php @@ -0,0 +1,10 @@ +')) +{ + require_once('tcpdf_php4.php'); +} +else if (version_compare(PHP_VERSION, '5.0.0', '>')) +{ + require_once('tcpdf.php'); +} +?> diff --git a/include/limesurvey/admin/classes/tcpdf/config/tcpdf_config.php b/include/limesurvey/admin/classes/tcpdf/config/tcpdf_config.php new file mode 100644 index 00000000..619a459c --- /dev/null +++ b/include/limesurvey/admin/classes/tcpdf/config/tcpdf_config.php @@ -0,0 +1,199 @@ + diff --git a/include/limesurvey/admin/classes/tcpdf/extensiontcpdf.php b/include/limesurvey/admin/classes/tcpdf/extensiontcpdf.php new file mode 100644 index 00000000..79a52893 --- /dev/null +++ b/include/limesurvey/admin/classes/tcpdf/extensiontcpdf.php @@ -0,0 +1,103 @@ +')) + { + parent::TCPDF($orientation,$unit,$format); + } + else if(version_compare(PHP_VERSION, '5.0.0', '>')) + { + parent::__construct($orientation,$unit,$format); + } + $this->SetAutoPageBreak(true,10); + $this->AliasNbPages(); + + } + + function intopdf($text,$format='') + { + $oldformat = $this->FontStyle; + $this->SetFont('',$format,$this->FontSizePt); + $this->Write(5,$text); + $this->ln(5); + $this->SetFont('',$oldformat,$this->FontSizePt); + } + function helptextintopdf($text) + { + $oldsize = $this->FontSizePt; + $this->SetFontSize($oldsize-2); + $this->Write(5,$text); + $this->ln(5); + $this->SetFontSize($oldsize); + } + function titleintopdf($title,$description='') + { + if(!empty($title)) + { + $oldsize = $this->FontSizePt; + $this->SetFontSize($oldsize+4); + $this->Line(5,$this->y,($this->w-5),$this->y); + $this->ln(3); + $this->MultiCell('','',$title,'','C',0); + if(!empty($description) && isset($description)) + { + $this->ln(7); + $this->SetFontSize($oldsize+2); + $this->MultiCell('','',$description,'','C',0); + $this->ln(2); + } + else + { + $this->ln(4); + } + $this->Line(5,$this->y,($this->w-5),$this->y); + $this->ln(5); + $this->SetFontSize($oldsize); + } + } + function tableintopdf($array) + { + $maxwidth = array(); + $maxwidth = $this->getmaxwidth($array); + for($a=0;$aCell($maxwidth[$b]*($this->FontSize),4,$array[$a][$b],0,0,'C'); + } + $this->ln(); + } + $this->ln(5); + } + function getmaxwidth($array) + { + for($i=0;$i=0) + { + if(strlen($array[($i-1)][$j]) < strlen($array[$i][$j])) + { + $width[$j] = strlen($array[$i][$j]); + } + } + else + { + $width[$j]=strlen($array[$i][$j]); + } + } + } + return ($width); + } + function write_out($name) + { + $this->Output($name,"D"); + } +} +?> diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/comicarousa.php b/include/limesurvey/admin/classes/tcpdf/fonts/comicarousa.php new file mode 100644 index 00000000..2c8a9c95 --- /dev/null +++ b/include/limesurvey/admin/classes/tcpdf/fonts/comicarousa.php @@ -0,0 +1,24 @@ +807,'Descent'=>-140,'CapHeight'=>585,'Flags'=>32,'FontBBox'=>'[-2 -140 717 807]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>426); +$up=-75; +$ut=50; +$cw=array( + chr(0)=>426,chr(1)=>426,chr(2)=>426,chr(3)=>426,chr(4)=>426,chr(5)=>426,chr(6)=>426,chr(7)=>426,chr(8)=>426,chr(9)=>426,chr(10)=>426,chr(11)=>426,chr(12)=>426,chr(13)=>426,chr(14)=>426,chr(15)=>426,chr(16)=>426,chr(17)=>426,chr(18)=>426,chr(19)=>426,chr(20)=>426,chr(21)=>426, + chr(22)=>426,chr(23)=>426,chr(24)=>426,chr(25)=>426,chr(26)=>426,chr(27)=>426,chr(28)=>426,chr(29)=>426,chr(30)=>426,chr(31)=>426,' '=>426,'!'=>426,'"'=>426,'#'=>426,'$'=>426,'%'=>426,'&'=>426,'\''=>426,'('=>426,')'=>426,'*'=>426,'+'=>426, + ','=>426,'-'=>426,'.'=>426,'/'=>426,'0'=>426,'1'=>426,'2'=>426,'3'=>426,'4'=>426,'5'=>426,'6'=>426,'7'=>426,'8'=>426,'9'=>426,':'=>426,';'=>426,'<'=>426,'='=>426,'>'=>426,'?'=>426,'@'=>426,'A'=>426, + 'B'=>426,'C'=>426,'D'=>426,'E'=>426,'F'=>426,'G'=>426,'H'=>426,'I'=>426,'J'=>426,'K'=>426,'L'=>426,'M'=>426,'N'=>426,'O'=>426,'P'=>426,'Q'=>426,'R'=>426,'S'=>426,'T'=>426,'U'=>426,'V'=>426,'W'=>426, + 'X'=>426,'Y'=>426,'Z'=>426,'['=>426,'\\'=>426,']'=>426,'^'=>426,'_'=>426,'`'=>426,'a'=>426,'b'=>426,'c'=>426,'d'=>426,'e'=>426,'f'=>426,'g'=>426,'h'=>426,'i'=>426,'j'=>426,'k'=>426,'l'=>426,'m'=>426, + 'n'=>426,'o'=>426,'p'=>426,'q'=>426,'r'=>426,'s'=>426,'t'=>426,'u'=>426,'v'=>426,'w'=>426,'x'=>426,'y'=>426,'z'=>426,'{'=>426,'|'=>426,'}'=>426,'~'=>426,chr(127)=>426,chr(128)=>426,chr(129)=>426,chr(130)=>426,chr(131)=>426, + chr(132)=>426,chr(133)=>426,chr(134)=>426,chr(135)=>426,chr(136)=>426,chr(137)=>426,chr(138)=>426,chr(139)=>426,chr(140)=>426,chr(141)=>426,chr(142)=>426,chr(143)=>426,chr(144)=>426,chr(145)=>426,chr(146)=>426,chr(147)=>426,chr(148)=>426,chr(149)=>426,chr(150)=>426,chr(151)=>426,chr(152)=>426,chr(153)=>426, + chr(154)=>426,chr(155)=>426,chr(156)=>426,chr(157)=>426,chr(158)=>426,chr(159)=>426,chr(160)=>426,chr(161)=>426,chr(162)=>426,chr(163)=>426,chr(164)=>426,chr(165)=>426,chr(166)=>426,chr(167)=>426,chr(168)=>426,chr(169)=>426,chr(170)=>426,chr(171)=>426,chr(172)=>426,chr(173)=>426,chr(174)=>426,chr(175)=>426, + chr(176)=>426,chr(177)=>426,chr(178)=>426,chr(179)=>426,chr(180)=>426,chr(181)=>426,chr(182)=>426,chr(183)=>426,chr(184)=>426,chr(185)=>426,chr(186)=>426,chr(187)=>426,chr(188)=>426,chr(189)=>426,chr(190)=>426,chr(191)=>426,chr(192)=>426,chr(193)=>426,chr(194)=>426,chr(195)=>426,chr(196)=>426,chr(197)=>426, + chr(198)=>426,chr(199)=>426,chr(200)=>426,chr(201)=>426,chr(202)=>426,chr(203)=>426,chr(204)=>426,chr(205)=>426,chr(206)=>426,chr(207)=>426,chr(208)=>426,chr(209)=>426,chr(210)=>426,chr(211)=>426,chr(212)=>426,chr(213)=>426,chr(214)=>426,chr(215)=>426,chr(216)=>426,chr(217)=>426,chr(218)=>426,chr(219)=>426, + chr(220)=>426,chr(221)=>426,chr(222)=>426,chr(223)=>426,chr(224)=>426,chr(225)=>426,chr(226)=>426,chr(227)=>426,chr(228)=>426,chr(229)=>426,chr(230)=>426,chr(231)=>426,chr(232)=>426,chr(233)=>426,chr(234)=>426,chr(235)=>426,chr(236)=>426,chr(237)=>426,chr(238)=>426,chr(239)=>426,chr(240)=>426,chr(241)=>426, + chr(242)=>426,chr(243)=>426,chr(244)=>426,chr(245)=>426,chr(246)=>426,chr(247)=>426,chr(248)=>426,chr(249)=>426,chr(250)=>426,chr(251)=>426,chr(252)=>426,chr(253)=>426,chr(254)=>426,chr(255)=>426); +$enc='gb2312'; +$diff='32 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef 128 /.notdef 130 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef 142 /.notdef 145 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef 158 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef'; +$file='comicarousa.z'; +$originalsize=78364; +?> diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/comicarousa.z b/include/limesurvey/admin/classes/tcpdf/fonts/comicarousa.z new file mode 100644 index 00000000..d5e35864 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/comicarousa.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-bold.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-bold.ctg.z new file mode 100644 index 00000000..e95b4f3c Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-bold.ctg.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-bold.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-bold.z new file mode 100644 index 00000000..14a2f849 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-bold.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-boldoblique.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-boldoblique.ctg.z new file mode 100644 index 00000000..ec0f2595 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-boldoblique.ctg.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-boldoblique.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-boldoblique.z new file mode 100644 index 00000000..3b5085c3 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-boldoblique.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-extralight.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-extralight.ctg.z new file mode 100644 index 00000000..db89b756 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-extralight.ctg.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-extralight.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-extralight.php new file mode 100644 index 00000000..e9246999 --- /dev/null +++ b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-extralight.php @@ -0,0 +1,112 @@ +928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>32,'FontBBox'=>'[-733 -339 1659 1114]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600); +$up=-42; +$ut=44; +$cw=array( + 0=>600, 32=>318, 33=>401, 34=>460, 35=>838, 36=>636, 37=>950, 38=>780, 39=>275, 40=>390, 41=>390, 42=>500, 43=>838, 44=>318, 45=>361, 46=>318, + 47=>337, 48=>636, 49=>636, 50=>636, 51=>636, 52=>636, 53=>636, 54=>636, 55=>636, 56=>636, 57=>636, 58=>337, 59=>337, 60=>838, 61=>838, 62=>838, + 63=>531, 64=>1000, 65=>684, 66=>655, 67=>698, 68=>770, 69=>632, 70=>575, 71=>775, 72=>752, 73=>295, 74=>295, 75=>656, 76=>557, 77=>863, 78=>748, + 79=>787, 80=>603, 81=>787, 82=>695, 83=>635, 84=>611, 85=>732, 86=>684, 87=>989, 88=>685, 89=>611, 90=>685, 91=>390, 92=>337, 93=>390, 94=>838, + 95=>500, 96=>500, 97=>613, 98=>635, 99=>550, 100=>635, 101=>615, 102=>352, 103=>600, 104=>634, 105=>278, 106=>278, 107=>579, 108=>278, 109=>974, 110=>634, + 111=>612, 112=>635, 113=>635, 114=>411, 115=>521, 116=>392, 117=>634, 118=>592, 119=>818, 120=>592, 121=>592, 122=>525, 123=>636, 124=>337, 125=>636, 126=>838, + 8364=>636, 1027=>557, 8218=>318, 402=>352, 8222=>518, 8230=>1000, 8224=>500, 8225=>500, 710=>500, 8240=>1342, 352=>635, 8249=>400, 338=>1070, 1036=>656, 381=>685, 1039=>752, + 8216=>318, 8217=>318, 8220=>518, 8221=>518, 8211=>500, 8212=>1000, 732=>500, 353=>521, 8250=>400, 339=>1023, 1116=>604, 382=>525, 376=>611, 160=>318, 161=>401, 162=>636, + 163=>636, 164=>636, 165=>636, 166=>337, 167=>500, 168=>500, 169=>1000, 170=>471, 171=>612, 172=>838, 173=>361, 174=>1000, 175=>500, 176=>500, 177=>838, 178=>401, + 179=>401, 180=>483, 181=>636, 182=>636, 183=>318, 184=>500, 185=>401, 186=>471, 187=>612, 188=>969, 189=>969, 190=>969, 191=>536, 192=>684, 193=>684, 194=>684, + 195=>684, 196=>684, 197=>684, 198=>974, 199=>698, 200=>632, 201=>632, 202=>632, 203=>632, 204=>295, 205=>295, 206=>295, 207=>295, 208=>775, 209=>748, 210=>787, + 211=>787, 212=>787, 213=>787, 214=>787, 215=>838, 216=>787, 217=>732, 218=>732, 219=>732, 220=>732, 221=>611, 222=>605, 223=>676, 224=>613, 225=>613, 226=>613, + 227=>613, 228=>613, 229=>613, 230=>982, 231=>550, 232=>615, 233=>615, 234=>615, 235=>615, 236=>278, 237=>278, 238=>278, 239=>278, 240=>612, 241=>634, 242=>612, + 243=>612, 244=>612, 245=>612, 246=>612, 247=>838, 248=>612, 249=>634, 250=>634, 251=>634, 252=>634, 253=>592, 254=>635, 255=>592, 256=>684, 257=>613, 258=>684, + 259=>613, 260=>684, 261=>613, 262=>698, 263=>550, 264=>698, 265=>550, 266=>698, 267=>550, 268=>698, 269=>550, 270=>770, 271=>635, 272=>775, 273=>635, 274=>632, + 275=>615, 276=>632, 277=>615, 278=>632, 279=>615, 280=>632, 281=>615, 282=>632, 283=>615, 284=>775, 285=>600, 286=>775, 287=>600, 288=>775, 289=>600, 290=>775, + 291=>600, 292=>752, 293=>634, 294=>916, 295=>695, 296=>295, 297=>278, 298=>295, 299=>278, 300=>295, 301=>278, 302=>295, 303=>278, 304=>295, 305=>278, 306=>590, + 307=>556, 308=>295, 309=>278, 310=>656, 311=>579, 312=>579, 313=>557, 314=>293, 315=>557, 316=>278, 317=>557, 318=>375, 319=>557, 320=>342, 321=>562, 322=>284, + 323=>748, 324=>634, 325=>748, 326=>634, 327=>748, 328=>634, 329=>813, 330=>757, 331=>634, 332=>787, 333=>612, 334=>787, 335=>612, 336=>787, 337=>612, 340=>695, + 341=>411, 342=>695, 343=>411, 344=>695, 345=>411, 346=>635, 347=>521, 348=>635, 349=>521, 350=>635, 351=>521, 354=>611, 355=>392, 356=>611, 357=>392, 358=>611, + 359=>392, 360=>732, 361=>634, 362=>732, 363=>634, 364=>732, 365=>634, 366=>732, 367=>634, 368=>732, 369=>634, 370=>732, 371=>634, 372=>989, 373=>818, 374=>611, + 375=>592, 377=>685, 378=>525, 379=>685, 380=>525, 383=>352, 384=>635, 385=>735, 386=>686, 387=>635, 390=>698, 391=>698, 392=>550, 393=>775, 394=>824, 395=>686, + 396=>635, 397=>612, 398=>632, 399=>787, 400=>585, 401=>575, 403=>775, 404=>685, 405=>965, 406=>354, 407=>295, 408=>690, 409=>526, 410=>278, 413=>748, 414=>634, + 415=>787, 416=>934, 417=>757, 420=>652, 421=>635, 423=>635, 424=>521, 425=>632, 427=>392, 428=>611, 429=>392, 430=>611, 431=>879, 432=>779, 433=>764, 434=>721, + 435=>696, 436=>805, 437=>685, 438=>525, 448=>295, 449=>492, 450=>459, 451=>295, 452=>1422, 453=>1299, 454=>1154, 455=>835, 456=>787, 457=>457, 458=>931, 459=>924, + 460=>797, 461=>684, 462=>613, 463=>295, 464=>278, 465=>787, 466=>612, 467=>732, 468=>634, 469=>732, 470=>634, 471=>732, 472=>634, 473=>732, 474=>634, 475=>732, + 476=>634, 477=>615, 478=>684, 479=>613, 480=>684, 481=>613, 482=>974, 483=>982, 486=>775, 487=>600, 488=>656, 489=>579, 490=>787, 491=>612, 492=>787, 493=>612, + 496=>278, 497=>1422, 498=>1299, 499=>1154, 500=>775, 501=>600, 504=>748, 505=>634, 506=>684, 507=>613, 508=>974, 509=>982, 510=>787, 511=>612, 512=>684, 513=>613, + 514=>684, 515=>613, 516=>632, 517=>615, 518=>632, 519=>615, 520=>295, 521=>278, 522=>295, 523=>278, 524=>787, 525=>612, 526=>787, 527=>612, 528=>695, 529=>411, + 530=>695, 531=>411, 532=>732, 533=>634, 534=>732, 535=>634, 536=>635, 537=>521, 538=>611, 539=>392, 542=>752, 543=>634, 550=>684, 551=>613, 552=>632, 553=>615, + 554=>787, 555=>612, 556=>787, 557=>612, 558=>787, 559=>612, 560=>787, 561=>612, 562=>611, 563=>592, 567=>278, 568=>1032, 569=>1032, 581=>684, 592=>614, 593=>635, + 594=>635, 595=>635, 596=>550, 598=>635, 599=>727, 600=>615, 601=>615, 603=>541, 604=>541, 607=>326, 608=>637, 609=>635, 611=>685, 613=>634, 616=>372, 617=>387, + 623=>974, 624=>974, 628=>634, 629=>612, 640=>602, 641=>602, 649=>634, 650=>618, 651=>598, 652=>592, 653=>818, 654=>592, 665=>580, 668=>661, 670=>667, 671=>583, + 675=>1014, 678=>824, 682=>641, 683=>654, 699=>318, 700=>318, 702=>307, 711=>500, 713=>500, 714=>483, 715=>500, 717=>500, 718=>500, 719=>483, 728=>500, 729=>500, + 730=>500, 731=>500, 733=>500, 755=>500, 759=>500, 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 773=>0, 774=>0, 775=>0, 776=>0, 777=>0, 778=>0, + 779=>0, 780=>0, 781=>0, 782=>0, 783=>0, 784=>0, 785=>0, 786=>0, 787=>0, 788=>0, 789=>0, 790=>0, 791=>0, 795=>0, 803=>0, 804=>0, + 805=>0, 806=>0, 807=>0, 808=>0, 812=>0, 813=>0, 814=>0, 815=>0, 816=>0, 817=>0, 818=>0, 819=>0, 820=>0, 821=>0, 822=>0, 823=>0, + 824=>0, 831=>0, 847=>0, 856=>0, 860=>0, 861=>0, 865=>0, 884=>278, 885=>278, 890=>361, 891=>549, 892=>550, 893=>549, 894=>337, 900=>483, 901=>500, + 902=>692, 903=>318, 904=>746, 905=>871, 906=>408, 908=>813, 910=>825, 911=>826, 912=>387, 913=>684, 914=>655, 915=>557, 916=>684, 917=>632, 918=>685, 919=>752, + 920=>787, 921=>295, 922=>656, 923=>684, 924=>863, 925=>748, 926=>632, 927=>787, 928=>752, 929=>603, 931=>632, 932=>611, 933=>611, 934=>787, 935=>685, 936=>787, + 937=>764, 938=>295, 939=>611, 940=>659, 941=>541, 942=>654, 943=>387, 944=>579, 945=>659, 946=>638, 947=>592, 948=>612, 949=>541, 950=>544, 951=>634, 952=>612, + 953=>387, 954=>604, 955=>592, 956=>636, 957=>559, 958=>558, 959=>612, 960=>602, 961=>635, 962=>587, 963=>634, 964=>602, 965=>579, 966=>660, 967=>592, 968=>660, + 969=>837, 970=>387, 971=>579, 972=>612, 973=>579, 974=>837, 988=>575, 1010=>550, 1011=>278, 1012=>787, 1013=>615, 1014=>615, 1015=>605, 1016=>635, 1017=>698, 1021=>698, + 1022=>698, 1023=>698, 1024=>632, 1025=>632, 1026=>786, 1028=>698, 1029=>635, 1030=>295, 1031=>295, 1032=>295, 1033=>1094, 1034=>1045, 1035=>786, 1037=>748, 1038=>609, 1040=>684, + 1041=>686, 1042=>655, 1043=>557, 1044=>776, 1045=>632, 1046=>863, 1047=>636, 1048=>748, 1049=>748, 1050=>656, 1051=>752, 1052=>863, 1053=>752, 1054=>787, 1055=>752, 1056=>603, + 1057=>698, 1058=>611, 1059=>609, 1060=>787, 1061=>685, 1062=>776, 1063=>686, 1064=>1003, 1065=>1025, 1066=>833, 1067=>882, 1068=>686, 1069=>698, 1070=>1031, 1071=>695, 1072=>613, + 1073=>612, 1074=>586, 1075=>491, 1076=>672, 1077=>615, 1078=>733, 1079=>541, 1080=>657, 1081=>657, 1082=>604, 1083=>639, 1084=>754, 1085=>661, 1086=>612, 1087=>660, 1088=>635, + 1089=>550, 1090=>529, 1091=>592, 1092=>917, 1093=>592, 1094=>681, 1095=>591, 1096=>873, 1097=>893, 1098=>703, 1099=>765, 1100=>589, 1101=>549, 1102=>813, 1103=>602, 1104=>615, + 1105=>615, 1106=>644, 1107=>491, 1108=>549, 1109=>521, 1110=>278, 1111=>278, 1112=>278, 1113=>898, 1114=>892, 1115=>637, 1117=>657, 1118=>592, 1119=>662, 1121=>837, 1124=>942, + 1125=>749, 1136=>787, 1137=>660, 1138=>787, 1168=>557, 1169=>491, 1176=>636, 1177=>541, 1188=>1014, 1189=>868, 1194=>698, 1195=>550, 1198=>611, 1199=>592, 1204=>934, 1205=>809, + 1210=>686, 1211=>634, 1216=>278, 1217=>863, 1218=>733, 1232=>684, 1233=>613, 1234=>684, 1235=>613, 1236=>974, 1237=>982, 1238=>632, 1239=>615, 1240=>787, 1241=>615, 1242=>787, + 1243=>615, 1244=>863, 1245=>733, 1246=>636, 1247=>541, 1250=>748, 1251=>657, 1252=>748, 1253=>657, 1254=>787, 1255=>612, 1256=>787, 1257=>612, 1258=>787, 1259=>612, 1260=>698, + 1261=>549, 1262=>609, 1263=>592, 1264=>609, 1265=>592, 1266=>609, 1267=>592, 1268=>686, 1269=>591, 1272=>882, 1273=>765, 1352=>732, 1357=>732, 1359=>635, 1363=>787, 1365=>787, + 1370=>318, 1373=>392, 1377=>974, 1387=>634, 1389=>1002, 1391=>634, 1392=>634, 1397=>278, 1400=>634, 1402=>974, 1405=>634, 1407=>1002, 1408=>634, 1409=>600, 1411=>1002, 1413=>612, + 1417=>337, 1652=>292, 7426=>982, 7428=>550, 7433=>278, 7435=>604, 7437=>754, 7438=>650, 7439=>612, 7440=>550, 7441=>684, 7442=>684, 7443=>684, 7444=>1023, 7446=>612, 7447=>612, + 7456=>592, 7457=>818, 7458=>525, 7462=>525, 7463=>592, 7464=>654, 7543=>635, 7680=>684, 7681=>613, 7682=>655, 7683=>635, 7684=>655, 7685=>635, 7686=>655, 7687=>635, 7688=>698, + 7689=>550, 7690=>770, 7691=>635, 7692=>770, 7693=>635, 7694=>770, 7695=>635, 7696=>770, 7697=>635, 7698=>770, 7699=>635, 7700=>632, 7701=>615, 7702=>632, 7703=>615, 7704=>632, + 7705=>615, 7706=>632, 7707=>615, 7708=>632, 7709=>615, 7710=>575, 7711=>352, 7712=>775, 7713=>600, 7714=>752, 7715=>634, 7716=>752, 7717=>634, 7718=>752, 7719=>634, 7720=>752, + 7721=>634, 7722=>752, 7723=>634, 7724=>295, 7725=>278, 7726=>295, 7727=>278, 7728=>656, 7729=>579, 7730=>656, 7731=>579, 7732=>656, 7733=>579, 7734=>557, 7735=>278, 7736=>557, + 7737=>278, 7738=>557, 7739=>278, 7740=>557, 7741=>278, 7742=>863, 7743=>974, 7744=>863, 7745=>974, 7746=>863, 7747=>974, 7748=>748, 7749=>634, 7750=>748, 7751=>634, 7752=>748, + 7753=>634, 7754=>748, 7755=>634, 7756=>787, 7757=>612, 7758=>787, 7759=>612, 7760=>787, 7761=>612, 7762=>787, 7763=>612, 7764=>603, 7765=>635, 7766=>603, 7767=>635, 7768=>695, + 7769=>411, 7770=>695, 7771=>411, 7772=>695, 7773=>411, 7774=>695, 7775=>411, 7776=>635, 7777=>521, 7778=>635, 7779=>521, 7780=>635, 7781=>521, 7782=>635, 7783=>521, 7784=>635, + 7785=>521, 7786=>611, 7787=>392, 7788=>611, 7789=>392, 7790=>611, 7791=>392, 7792=>611, 7793=>392, 7794=>732, 7795=>634, 7796=>732, 7797=>634, 7798=>732, 7799=>634, 7800=>732, + 7801=>634, 7802=>732, 7803=>634, 7804=>684, 7805=>592, 7806=>684, 7807=>592, 7808=>989, 7809=>818, 7810=>989, 7811=>818, 7812=>989, 7813=>818, 7814=>989, 7815=>818, 7816=>989, + 7817=>818, 7818=>685, 7819=>592, 7820=>685, 7821=>592, 7822=>611, 7823=>592, 7824=>685, 7825=>525, 7826=>685, 7827=>525, 7828=>685, 7829=>525, 7830=>634, 7831=>392, 7832=>818, + 7833=>592, 7834=>613, 7835=>352, 7840=>684, 7841=>613, 7842=>684, 7843=>613, 7844=>684, 7845=>613, 7846=>684, 7847=>613, 7848=>684, 7849=>613, 7850=>684, 7851=>613, 7852=>684, + 7853=>613, 7854=>684, 7855=>613, 7856=>684, 7857=>613, 7858=>684, 7859=>613, 7860=>684, 7861=>613, 7862=>684, 7863=>613, 7864=>632, 7865=>615, 7866=>632, 7867=>615, 7868=>632, + 7869=>615, 7870=>632, 7871=>615, 7872=>632, 7873=>615, 7874=>632, 7875=>615, 7876=>632, 7877=>615, 7878=>632, 7879=>615, 7880=>295, 7881=>278, 7882=>295, 7883=>278, 7884=>787, + 7885=>612, 7886=>787, 7887=>612, 7888=>787, 7889=>612, 7890=>787, 7891=>612, 7892=>787, 7893=>612, 7894=>787, 7895=>612, 7896=>787, 7897=>612, 7898=>934, 7899=>757, 7900=>934, + 7901=>757, 7902=>934, 7903=>757, 7904=>934, 7905=>757, 7906=>934, 7907=>757, 7908=>732, 7909=>634, 7910=>732, 7911=>634, 7912=>879, 7913=>779, 7914=>879, 7915=>779, 7916=>879, + 7917=>779, 7918=>879, 7919=>779, 7920=>879, 7921=>779, 7922=>611, 7923=>592, 7924=>611, 7925=>592, 7926=>611, 7927=>592, 7928=>611, 7929=>592, 7936=>659, 7937=>659, 7938=>659, + 7939=>659, 7940=>659, 7941=>659, 7942=>659, 7943=>659, 7944=>684, 7945=>684, 7946=>877, 7947=>877, 7948=>769, 7949=>801, 7950=>708, 7951=>743, 7952=>541, 7953=>541, 7954=>541, + 7955=>541, 7956=>541, 7957=>541, 7960=>711, 7961=>711, 7962=>966, 7963=>975, 7964=>898, 7965=>928, 7968=>634, 7969=>634, 7970=>634, 7971=>634, 7972=>634, 7973=>634, 7974=>634, + 7975=>634, 7976=>837, 7977=>835, 7978=>1086, 7979=>1089, 7980=>1027, 7981=>1051, 7982=>934, 7983=>947, 7984=>338, 7985=>338, 7986=>338, 7987=>338, 7988=>338, 7989=>338, 7990=>338, + 7991=>338, 7992=>380, 7993=>374, 7994=>635, 7995=>635, 7996=>570, 7997=>600, 7998=>489, 7999=>493, 8000=>612, 8001=>612, 8002=>612, 8003=>612, 8004=>612, 8005=>612, 8008=>804, + 8009=>848, 8010=>1095, 8011=>1100, 8012=>938, 8013=>970, 8016=>579, 8017=>579, 8018=>579, 8019=>579, 8020=>579, 8021=>579, 8022=>579, 8023=>579, 8025=>784, 8027=>998, 8029=>1012, + 8031=>897, 8032=>837, 8033=>837, 8034=>837, 8035=>837, 8036=>837, 8037=>837, 8038=>837, 8039=>837, 8040=>802, 8041=>843, 8042=>1089, 8043=>1095, 8044=>946, 8045=>972, 8046=>921, + 8047=>952, 8048=>659, 8049=>659, 8050=>541, 8051=>548, 8052=>634, 8053=>654, 8054=>338, 8055=>338, 8056=>612, 8057=>612, 8058=>579, 8059=>579, 8060=>837, 8061=>837, 8064=>659, + 8065=>659, 8066=>659, 8067=>659, 8068=>659, 8069=>659, 8070=>659, 8071=>659, 8072=>684, 8073=>684, 8074=>877, 8075=>877, 8076=>769, 8077=>801, 8078=>708, 8079=>743, 8080=>634, + 8081=>634, 8082=>634, 8083=>634, 8084=>634, 8085=>634, 8086=>634, 8087=>634, 8088=>837, 8089=>835, 8090=>1086, 8091=>1089, 8092=>1027, 8093=>1051, 8094=>934, 8095=>947, 8096=>837, + 8097=>837, 8098=>837, 8099=>837, 8100=>837, 8101=>837, 8102=>837, 8103=>837, 8104=>802, 8105=>843, 8106=>1089, 8107=>1095, 8108=>946, 8109=>972, 8110=>921, 8111=>952, 8112=>659, + 8113=>659, 8114=>659, 8115=>659, 8116=>659, 8118=>659, 8119=>659, 8120=>684, 8121=>684, 8122=>716, 8123=>692, 8124=>684, 8125=>500, 8126=>500, 8127=>500, 8128=>500, 8129=>500, + 8130=>634, 8131=>634, 8132=>654, 8134=>634, 8135=>634, 8136=>805, 8137=>746, 8138=>931, 8139=>871, 8140=>752, 8141=>500, 8142=>500, 8143=>500, 8144=>338, 8145=>338, 8146=>338, + 8147=>338, 8150=>338, 8151=>338, 8152=>295, 8153=>295, 8154=>475, 8155=>408, 8157=>500, 8158=>500, 8159=>500, 8160=>579, 8161=>579, 8162=>579, 8163=>579, 8164=>635, 8165=>635, + 8166=>579, 8167=>579, 8168=>611, 8169=>611, 8170=>845, 8171=>825, 8172=>685, 8173=>500, 8174=>500, 8175=>500, 8178=>837, 8179=>837, 8180=>837, 8182=>837, 8183=>837, 8184=>941, + 8185=>813, 8186=>922, 8187=>826, 8188=>764, 8189=>500, 8190=>500, 8192=>500, 8193=>1000, 8194=>500, 8195=>1000, 8196=>330, 8197=>250, 8198=>167, 8199=>636, 8200=>318, 8201=>200, + 8202=>100, 8203=>0, 8204=>0, 8205=>0, 8206=>0, 8207=>0, 8208=>361, 8209=>361, 8210=>636, 8213=>1000, 8214=>500, 8215=>500, 8219=>318, 8223=>518, 8228=>334, 8229=>667, + 8234=>0, 8235=>0, 8236=>0, 8237=>0, 8238=>0, 8239=>200, 8241=>1735, 8251=>838, 8252=>485, 8253=>531, 8254=>500, 8255=>804, 8256=>804, 8258=>1000, 8259=>500, 8260=>167, + 8261=>390, 8262=>390, 8263=>922, 8264=>733, 8265=>733, 8267=>636, 8268=>500, 8269=>500, 8270=>500, 8271=>337, 8272=>804, 8273=>500, 8274=>450, 8275=>838, 8276=>804, 8287=>222, + 8288=>0, 8289=>0, 8290=>0, 8291=>0, 8298=>0, 8299=>0, 8300=>0, 8301=>0, 8302=>0, 8303=>0, 8304=>401, 8305=>179, 8308=>401, 8320=>401, 8321=>401, 8322=>401, + 8323=>401, 8324=>401, 8363=>636, 8369=>635, 8451=>1123, 8457=>952, 8470=>1165, 8471=>1000, 8486=>764, 8487=>764, 8490=>656, 8491=>684, 8494=>854, 8498=>575, 8500=>462, 8523=>780, + 8531=>969, 8532=>969, 8543=>568, 8544=>295, 8545=>492, 8546=>689, 8547=>923, 8548=>684, 8549=>922, 8550=>1120, 8551=>1317, 8552=>917, 8553=>685, 8554=>933, 8555=>1131, 8556=>557, + 8557=>698, 8558=>770, 8559=>863, 8560=>278, 8561=>458, 8562=>637, 8563=>812, 8564=>592, 8565=>811, 8566=>991, 8567=>1170, 8568=>819, 8569=>592, 8570=>822, 8571=>1002, 8572=>278, + 8573=>550, 8574=>635, 8575=>974, 8576=>1285, 8579=>698, 8580=>549, 8592=>838, 8593=>838, 8594=>838, 8595=>838, 8596=>838, 8597=>838, 8598=>838, 8599=>838, 8600=>838, 8601=>838, + 8644=>838, 8645=>838, 8646=>838, 8647=>838, 8648=>838, 8649=>838, 8650=>838, 8704=>684, 8707=>632, 8710=>684, 8711=>684, 8722=>838, 8725=>167, 8726=>637, 8727=>626, 8728=>626, + 8756=>636, 8757=>636, 8758=>260, 8759=>636, 8764=>636, 9134=>521, 9167=>945, 10731=>494, 57344=>684, 57345=>684, 57346=>684, 57347=>684, 57348=>684, 57349=>684, 57351=>684, 57352=>684, + 57353=>684, 57354=>684, 57355=>684, 57356=>684, 57357=>684, 57358=>684, 57359=>684, 57360=>684, 57361=>684, 57362=>684, 57363=>684, 57364=>684, 64256=>689, 64257=>630, 64258=>630, 64259=>967, + 64260=>967, 64297=>838, 65024=>0, 65025=>0, 65026=>0, 65027=>0, 65028=>0, 65029=>0, 65030=>0, 65031=>0, 65032=>0, 65033=>0, 65034=>0, 65035=>0, 65036=>0, 65037=>0, + 65038=>0, 65039=>0, 65533=>1025); +$enc=''; +$diff=''; +$file='DejaVuSans-ExtraLight.z'; +$ctg='DejaVuSans-ExtraLight.ctg.z'; +$originalsize=132684; +?> diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-extralight.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-extralight.z new file mode 100644 index 00000000..908de771 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-extralight.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-oblique.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-oblique.ctg.z new file mode 100644 index 00000000..65a3e3d1 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-oblique.ctg.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-oblique.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-oblique.z new file mode 100644 index 00000000..c53204e8 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans-oblique.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.ctg.z new file mode 100644 index 00000000..fa197554 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.ctg.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.php new file mode 100644 index 00000000..6eef66fc --- /dev/null +++ b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.php @@ -0,0 +1,287 @@ +928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>32,'FontBBox'=>'[-1021 -356 1681 1068]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600); +$up=-42; +$ut=44; +$cw=array( + 0=>600, 32=>318, 33=>401, 34=>460, 35=>838, 36=>636, 37=>950, 38=>780, 39=>275, 40=>390, 41=>390, 42=>500, 43=>838, 44=>318, 45=>361, 46=>318, + 47=>337, 48=>636, 49=>636, 50=>636, 51=>636, 52=>636, 53=>636, 54=>636, 55=>636, 56=>636, 57=>636, 58=>337, 59=>337, 60=>838, 61=>838, 62=>838, + 63=>531, 64=>1000, 65=>684, 66=>686, 67=>698, 68=>770, 69=>632, 70=>575, 71=>775, 72=>752, 73=>295, 74=>295, 75=>656, 76=>557, 77=>863, 78=>748, + 79=>787, 80=>603, 81=>787, 82=>695, 83=>635, 84=>611, 85=>732, 86=>684, 87=>989, 88=>685, 89=>611, 90=>685, 91=>390, 92=>337, 93=>390, 94=>838, + 95=>500, 96=>500, 97=>613, 98=>635, 99=>550, 100=>635, 101=>615, 102=>352, 103=>635, 104=>634, 105=>278, 106=>278, 107=>579, 108=>278, 109=>974, 110=>634, + 111=>612, 112=>635, 113=>635, 114=>411, 115=>521, 116=>392, 117=>634, 118=>592, 119=>818, 120=>592, 121=>592, 122=>525, 123=>636, 124=>337, 125=>636, 126=>838, + 8364=>636, 1027=>610, 8218=>318, 402=>352, 8222=>518, 8230=>1000, 8224=>500, 8225=>500, 710=>500, 8240=>1342, 352=>635, 8249=>400, 338=>1070, 1036=>710, 381=>685, 1039=>752, + 8216=>318, 8217=>318, 8220=>518, 8221=>518, 8226=>590, 8211=>500, 8212=>1000, 732=>500, 8482=>1000, 353=>521, 8250=>400, 339=>1023, 1116=>604, 382=>525, 376=>611, 160=>318, + 161=>401, 162=>636, 163=>636, 164=>636, 165=>636, 166=>337, 167=>500, 168=>500, 169=>1000, 170=>471, 171=>612, 172=>838, 173=>361, 174=>1000, 175=>500, 176=>500, + 177=>838, 178=>401, 179=>401, 180=>500, 181=>636, 182=>636, 183=>318, 184=>500, 185=>401, 186=>471, 187=>612, 188=>969, 189=>969, 190=>969, 191=>531, 192=>684, + 193=>684, 194=>684, 195=>684, 196=>684, 197=>684, 198=>974, 199=>698, 200=>632, 201=>632, 202=>632, 203=>632, 204=>295, 205=>295, 206=>295, 207=>295, 208=>775, + 209=>748, 210=>787, 211=>787, 212=>787, 213=>787, 214=>787, 215=>838, 216=>787, 217=>732, 218=>732, 219=>732, 220=>732, 221=>611, 222=>605, 223=>630, 224=>613, + 225=>613, 226=>613, 227=>613, 228=>613, 229=>613, 230=>982, 231=>550, 232=>615, 233=>615, 234=>615, 235=>615, 236=>278, 237=>278, 238=>278, 239=>278, 240=>612, + 241=>634, 242=>612, 243=>612, 244=>612, 245=>612, 246=>612, 247=>838, 248=>612, 249=>634, 250=>634, 251=>634, 252=>634, 253=>592, 254=>635, 255=>592, 256=>684, + 257=>613, 258=>684, 259=>613, 260=>684, 261=>613, 262=>698, 263=>550, 264=>698, 265=>550, 266=>698, 267=>550, 268=>698, 269=>550, 270=>770, 271=>635, 272=>775, + 273=>635, 274=>632, 275=>615, 276=>632, 277=>615, 278=>632, 279=>615, 280=>632, 281=>615, 282=>632, 283=>615, 284=>775, 285=>635, 286=>775, 287=>635, 288=>775, + 289=>635, 290=>775, 291=>635, 292=>752, 293=>634, 294=>916, 295=>695, 296=>295, 297=>278, 298=>295, 299=>278, 300=>295, 301=>278, 302=>295, 303=>278, 304=>295, + 305=>278, 306=>590, 307=>556, 308=>295, 309=>278, 310=>656, 311=>579, 312=>579, 313=>557, 314=>293, 315=>557, 316=>278, 317=>557, 318=>375, 319=>557, 320=>342, + 321=>562, 322=>284, 323=>748, 324=>634, 325=>748, 326=>634, 327=>748, 328=>634, 329=>813, 330=>748, 331=>634, 332=>787, 333=>612, 334=>787, 335=>612, 336=>787, + 337=>612, 340=>695, 341=>411, 342=>695, 343=>411, 344=>695, 345=>411, 346=>635, 347=>521, 348=>635, 349=>521, 350=>635, 351=>521, 354=>611, 355=>392, 356=>611, + 357=>392, 358=>611, 359=>392, 360=>732, 361=>634, 362=>732, 363=>634, 364=>732, 365=>634, 366=>732, 367=>634, 368=>732, 369=>634, 370=>732, 371=>634, 372=>989, + 373=>818, 374=>611, 375=>592, 377=>685, 378=>525, 379=>685, 380=>525, 383=>352, 384=>635, 385=>735, 386=>686, 387=>635, 388=>686, 389=>635, 390=>703, 391=>698, + 392=>550, 393=>775, 394=>819, 395=>686, 396=>635, 397=>612, 398=>632, 399=>787, 400=>614, 401=>575, 403=>775, 404=>687, 405=>984, 406=>354, 407=>295, 408=>746, + 409=>579, 410=>278, 411=>592, 412=>974, 413=>748, 414=>634, 415=>787, 416=>913, 417=>612, 418=>949, 419=>759, 420=>652, 421=>635, 422=>695, 423=>635, 424=>521, + 425=>632, 426=>336, 427=>392, 428=>611, 429=>392, 430=>611, 431=>858, 432=>634, 433=>764, 434=>721, 435=>744, 436=>729, 437=>685, 438=>525, 439=>666, 440=>666, + 441=>578, 442=>525, 443=>636, 444=>666, 445=>578, 446=>510, 447=>635, 448=>295, 449=>492, 450=>459, 451=>295, 452=>1422, 453=>1299, 454=>1154, 455=>835, 456=>787, + 457=>457, 458=>931, 459=>924, 460=>797, 461=>684, 462=>613, 463=>295, 464=>278, 465=>787, 466=>612, 467=>732, 468=>634, 469=>732, 470=>634, 471=>732, 472=>634, + 473=>732, 474=>634, 475=>732, 476=>634, 477=>615, 478=>684, 479=>613, 480=>684, 481=>613, 482=>974, 483=>982, 484=>775, 485=>635, 486=>775, 487=>635, 488=>656, + 489=>579, 490=>787, 491=>612, 492=>787, 493=>612, 494=>666, 495=>578, 496=>278, 497=>1422, 498=>1299, 499=>1154, 500=>775, 501=>635, 502=>1113, 503=>682, 504=>748, + 505=>634, 506=>684, 507=>613, 508=>974, 509=>982, 510=>787, 511=>612, 512=>684, 513=>613, 514=>684, 515=>613, 516=>632, 517=>615, 518=>632, 519=>615, 520=>295, + 521=>278, 522=>295, 523=>278, 524=>787, 525=>612, 526=>787, 527=>612, 528=>695, 529=>411, 530=>695, 531=>411, 532=>732, 533=>634, 534=>732, 535=>634, 536=>635, + 537=>521, 538=>611, 539=>392, 540=>627, 541=>521, 542=>752, 543=>634, 544=>735, 545=>838, 546=>698, 547=>610, 548=>685, 549=>525, 550=>684, 551=>613, 552=>632, + 553=>615, 554=>787, 555=>612, 556=>787, 557=>612, 558=>787, 559=>612, 560=>787, 561=>612, 562=>611, 563=>592, 564=>475, 565=>843, 566=>477, 567=>278, 568=>998, + 569=>998, 570=>684, 571=>698, 572=>550, 573=>557, 574=>611, 575=>521, 576=>525, 577=>603, 578=>479, 579=>686, 580=>732, 581=>684, 582=>632, 583=>615, 584=>295, + 585=>278, 586=>781, 587=>635, 588=>695, 589=>411, 590=>611, 591=>592, 592=>600, 593=>635, 594=>635, 595=>635, 596=>549, 597=>550, 598=>635, 599=>696, 600=>615, + 601=>615, 602=>819, 603=>541, 604=>532, 605=>775, 606=>664, 607=>278, 608=>696, 609=>635, 610=>629, 611=>596, 612=>596, 613=>634, 614=>634, 615=>634, 616=>278, + 617=>338, 618=>372, 619=>396, 620=>487, 621=>278, 622=>706, 623=>974, 624=>974, 625=>974, 626=>646, 627=>642, 628=>634, 629=>612, 630=>858, 631=>728, 632=>660, + 633=>414, 634=>414, 635=>414, 636=>411, 637=>411, 638=>437, 639=>530, 640=>604, 641=>604, 642=>521, 643=>336, 644=>336, 645=>461, 646=>336, 647=>392, 648=>392, + 649=>634, 650=>618, 651=>598, 652=>592, 653=>818, 654=>592, 655=>611, 656=>525, 657=>525, 658=>578, 659=>578, 660=>510, 661=>510, 662=>510, 663=>510, 664=>787, + 665=>580, 666=>664, 667=>708, 668=>654, 669=>292, 670=>667, 671=>507, 672=>727, 673=>510, 674=>510, 675=>1014, 676=>1058, 677=>1013, 678=>824, 679=>610, 680=>778, + 681=>848, 682=>641, 683=>654, 684=>515, 685=>515, 686=>570, 687=>664, 688=>404, 689=>399, 690=>175, 691=>259, 692=>295, 693=>296, 694=>379, 695=>515, 696=>373, + 697=>278, 698=>460, 699=>318, 700=>318, 701=>318, 702=>307, 703=>307, 704=>370, 705=>370, 706=>500, 707=>500, 708=>500, 709=>500, 711=>500, 712=>275, 713=>500, + 714=>500, 715=>500, 716=>275, 717=>500, 718=>500, 719=>500, 720=>337, 721=>337, 722=>307, 723=>307, 724=>500, 725=>500, 726=>413, 727=>500, 728=>500, 729=>500, + 730=>500, 731=>500, 733=>500, 734=>315, 735=>500, 736=>426, 737=>166, 738=>373, 739=>444, 740=>370, 741=>493, 742=>493, 743=>493, 744=>493, 745=>493, 748=>500, + 749=>500, 750=>500, 755=>500, 759=>500, 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 773=>0, 774=>0, 775=>0, 776=>0, 777=>0, 778=>0, 779=>0, + 780=>0, 781=>0, 782=>0, 783=>0, 784=>0, 785=>0, 786=>0, 787=>0, 788=>0, 789=>0, 790=>0, 791=>0, 792=>0, 793=>0, 794=>0, 795=>0, + 796=>0, 797=>0, 798=>0, 799=>0, 800=>0, 801=>0, 802=>0, 803=>0, 804=>0, 805=>0, 806=>0, 807=>0, 808=>0, 809=>0, 810=>0, 811=>0, + 812=>0, 813=>0, 814=>0, 815=>0, 816=>0, 817=>0, 818=>0, 819=>0, 820=>0, 821=>0, 822=>0, 823=>0, 824=>0, 825=>0, 826=>0, 827=>0, + 828=>0, 829=>0, 830=>0, 831=>0, 832=>0, 833=>0, 834=>0, 835=>0, 836=>0, 837=>0, 838=>0, 839=>0, 840=>0, 841=>0, 842=>0, 843=>0, + 844=>0, 845=>0, 846=>0, 847=>0, 849=>0, 850=>0, 851=>0, 855=>0, 856=>0, 860=>0, 861=>0, 862=>0, 863=>0, 864=>0, 865=>0, 866=>0, + 884=>278, 885=>278, 890=>500, 891=>549, 892=>550, 893=>549, 894=>337, 900=>500, 901=>500, 902=>692, 903=>318, 904=>746, 905=>871, 906=>408, 908=>813, 910=>825, + 911=>826, 912=>338, 913=>684, 914=>686, 915=>557, 916=>684, 917=>632, 918=>685, 919=>752, 920=>787, 921=>295, 922=>656, 923=>684, 924=>863, 925=>748, 926=>632, + 927=>787, 928=>752, 929=>603, 931=>632, 932=>611, 933=>611, 934=>787, 935=>685, 936=>787, 937=>764, 938=>295, 939=>611, 940=>659, 941=>548, 942=>654, 943=>338, + 944=>579, 945=>659, 946=>638, 947=>592, 948=>612, 949=>541, 950=>544, 951=>634, 952=>612, 953=>338, 954=>589, 955=>592, 956=>636, 957=>559, 958=>558, 959=>612, + 960=>602, 961=>635, 962=>587, 963=>634, 964=>602, 965=>579, 966=>660, 967=>578, 968=>660, 969=>837, 970=>338, 971=>579, 972=>612, 973=>579, 974=>837, 976=>614, + 977=>619, 978=>699, 979=>842, 980=>699, 981=>660, 982=>837, 983=>664, 984=>787, 985=>612, 986=>648, 987=>587, 988=>575, 989=>458, 990=>660, 991=>660, 992=>865, + 993=>627, 994=>934, 995=>837, 996=>758, 997=>659, 998=>792, 999=>615, 1000=>687, 1001=>607, 1002=>768, 1003=>625, 1004=>699, 1005=>612, 1006=>611, 1007=>536, 1008=>664, + 1009=>635, 1010=>550, 1011=>278, 1012=>787, 1013=>615, 1014=>615, 1015=>605, 1016=>635, 1017=>698, 1018=>863, 1019=>651, 1020=>635, 1021=>703, 1022=>698, 1023=>703, 1024=>632, + 1025=>632, 1026=>786, 1028=>698, 1029=>635, 1030=>295, 1031=>295, 1032=>295, 1033=>1094, 1034=>1045, 1035=>786, 1037=>748, 1038=>609, 1040=>684, 1041=>686, 1042=>686, 1043=>610, + 1044=>781, 1045=>632, 1046=>1077, 1047=>641, 1048=>748, 1049=>748, 1050=>710, 1051=>752, 1052=>863, 1053=>752, 1054=>787, 1055=>752, 1056=>603, 1057=>698, 1058=>611, 1059=>609, + 1060=>861, 1061=>685, 1062=>776, 1063=>686, 1064=>1069, 1065=>1094, 1066=>833, 1067=>882, 1068=>686, 1069=>698, 1070=>1080, 1071=>695, 1072=>613, 1073=>617, 1074=>589, 1075=>525, + 1076=>691, 1077=>615, 1078=>901, 1079=>532, 1080=>650, 1081=>650, 1082=>604, 1083=>639, 1084=>754, 1085=>654, 1086=>612, 1087=>654, 1088=>635, 1089=>550, 1090=>583, 1091=>592, + 1092=>855, 1093=>592, 1094=>681, 1095=>591, 1096=>915, 1097=>942, 1098=>707, 1099=>790, 1100=>589, 1101=>549, 1102=>842, 1103=>602, 1104=>615, 1105=>615, 1106=>625, 1107=>525, + 1108=>549, 1109=>521, 1110=>278, 1111=>278, 1112=>278, 1113=>902, 1114=>898, 1115=>652, 1117=>650, 1118=>592, 1119=>654, 1120=>934, 1121=>837, 1122=>771, 1123=>672, 1124=>942, + 1125=>749, 1126=>879, 1127=>783, 1128=>1160, 1129=>1001, 1130=>787, 1131=>612, 1132=>1027, 1133=>824, 1134=>636, 1135=>541, 1136=>856, 1137=>876, 1138=>787, 1139=>592, 1140=>781, + 1141=>665, 1142=>781, 1143=>665, 1144=>992, 1145=>904, 1146=>953, 1147=>758, 1148=>1180, 1149=>1028, 1150=>934, 1151=>837, 1152=>698, 1153=>550, 1154=>502, 1155=>0, 1156=>0, + 1157=>0, 1158=>0, 1160=>418, 1161=>418, 1162=>772, 1163=>677, 1164=>686, 1165=>589, 1166=>603, 1167=>635, 1168=>610, 1169=>525, 1170=>675, 1171=>556, 1172=>624, 1173=>530, + 1174=>1077, 1175=>901, 1176=>641, 1177=>532, 1178=>710, 1179=>604, 1180=>710, 1181=>604, 1182=>710, 1183=>604, 1184=>856, 1185=>832, 1186=>752, 1187=>661, 1188=>1014, 1189=>877, + 1190=>1081, 1191=>916, 1192=>796, 1193=>651, 1194=>698, 1195=>550, 1196=>611, 1197=>529, 1198=>611, 1199=>592, 1200=>611, 1201=>592, 1202=>685, 1203=>592, 1204=>934, 1205=>807, + 1206=>686, 1207=>591, 1208=>686, 1209=>591, 1210=>686, 1211=>634, 1212=>941, 1213=>728, 1214=>941, 1215=>728, 1216=>295, 1217=>1077, 1218=>901, 1219=>656, 1220=>604, 1221=>776, + 1222=>670, 1223=>752, 1224=>661, 1225=>776, 1226=>681, 1227=>686, 1228=>591, 1229=>888, 1230=>774, 1231=>278, 1232=>684, 1233=>613, 1234=>684, 1235=>613, 1236=>974, 1237=>982, + 1238=>632, 1239=>615, 1240=>787, 1241=>615, 1242=>787, 1243=>615, 1244=>1077, 1245=>901, 1246=>641, 1247=>532, 1248=>666, 1249=>578, 1250=>748, 1251=>650, 1252=>748, 1253=>650, + 1254=>787, 1255=>612, 1256=>787, 1257=>612, 1258=>787, 1259=>612, 1260=>698, 1261=>549, 1262=>609, 1263=>592, 1264=>609, 1265=>592, 1266=>609, 1267=>592, 1268=>686, 1269=>591, + 1270=>557, 1271=>491, 1272=>882, 1273=>790, 1274=>675, 1275=>556, 1276=>685, 1277=>592, 1278=>685, 1279=>592, 1280=>686, 1281=>589, 1282=>1006, 1283=>897, 1284=>975, 1285=>869, + 1286=>679, 1287=>588, 1288=>1072, 1289=>957, 1290=>1072, 1291=>967, 1292=>775, 1293=>660, 1294=>773, 1295=>711, 1296=>614, 1297=>541, 1298=>752, 1299=>639, 1329=>867, 1330=>732, + 1331=>882, 1332=>882, 1333=>732, 1334=>644, 1335=>682, 1336=>732, 1337=>851, 1338=>882, 1339=>732, 1340=>557, 1341=>824, 1342=>986, 1343=>732, 1344=>707, 1345=>644, 1346=>882, + 1347=>777, 1348=>882, 1349=>732, 1350=>840, 1351=>732, 1352=>732, 1353=>732, 1354=>791, 1355=>644, 1356=>882, 1357=>732, 1358=>882, 1359=>635, 1360=>732, 1361=>732, 1362=>799, + 1363=>861, 1364=>790, 1365=>787, 1366=>635, 1369=>307, 1370=>318, 1371=>500, 1372=>500, 1373=>392, 1374=>526, 1375=>500, 1377=>974, 1378=>634, 1379=>762, 1380=>767, 1381=>634, + 1382=>697, 1383=>533, 1384=>634, 1385=>700, 1386=>697, 1387=>634, 1388=>404, 1389=>894, 1390=>641, 1391=>634, 1392=>634, 1393=>635, 1394=>702, 1395=>634, 1396=>659, 1397=>278, + 1398=>760, 1399=>516, 1400=>634, 1401=>453, 1402=>974, 1403=>516, 1404=>769, 1405=>634, 1406=>696, 1407=>974, 1408=>634, 1409=>635, 1410=>501, 1411=>974, 1412=>648, 1413=>612, + 1414=>629, 1415=>763, 1417=>337, 1418=>433, 1456=>0, 1457=>0, 1458=>0, 1459=>0, 1460=>0, 1461=>0, 1462=>0, 1463=>0, 1464=>0, 1465=>0, 1467=>0, 1468=>0, + 1469=>0, 1471=>0, 1472=>295, 1473=>0, 1474=>0, 1475=>295, 1478=>456, 1479=>0, 1488=>629, 1489=>608, 1490=>448, 1491=>594, 1492=>640, 1493=>272, 1494=>423, 1495=>640, + 1496=>648, 1497=>272, 1498=>592, 1499=>556, 1500=>599, 1501=>640, 1502=>659, 1503=>272, 1504=>441, 1505=>700, 1506=>636, 1507=>640, 1508=>604, 1509=>521, 1510=>581, 1511=>663, + 1512=>592, 1513=>808, 1514=>657, 1520=>471, 1521=>454, 1522=>471, 1548=>323, 1557=>0, 1563=>318, 1567=>531, 1569=>470, 1570=>278, 1571=>278, 1572=>483, 1573=>278, 1574=>783, + 1575=>278, 1576=>941, 1577=>524, 1578=>941, 1579=>941, 1580=>646, 1581=>646, 1582=>646, 1583=>445, 1584=>445, 1585=>483, 1586=>483, 1587=>1221, 1588=>1221, 1589=>1209, 1590=>1209, + 1591=>925, 1592=>925, 1593=>597, 1594=>597, 1600=>293, 1601=>1037, 1602=>776, 1603=>824, 1604=>727, 1605=>619, 1606=>734, 1607=>524, 1608=>483, 1609=>783, 1610=>783, 1611=>0, + 1612=>0, 1613=>0, 1614=>0, 1615=>0, 1616=>0, 1617=>0, 1618=>0, 1619=>0, 1620=>0, 1621=>0, 1626=>500, 1632=>537, 1633=>537, 1634=>537, 1635=>537, 1636=>537, + 1637=>537, 1638=>537, 1639=>537, 1640=>537, 1641=>537, 1642=>537, 1643=>325, 1644=>318, 1645=>545, 1646=>941, 1647=>776, 1652=>292, 1657=>941, 1658=>941, 1659=>941, 1660=>941, + 1661=>941, 1662=>941, 1663=>941, 1664=>941, 1665=>646, 1666=>646, 1667=>646, 1668=>646, 1669=>646, 1670=>646, 1671=>646, 1681=>483, 1682=>483, 1685=>610, 1688=>483, 1697=>1037, + 1700=>1037, 1702=>1037, 1705=>895, 1711=>895, 1717=>727, 1722=>734, 1727=>646, 1734=>483, 1740=>783, 1742=>783, 1749=>524, 1776=>537, 1777=>537, 1778=>537, 1779=>537, 1780=>537, + 1781=>537, 1782=>537, 1783=>537, 1784=>537, 1785=>537, 3647=>652, 3713=>670, 3714=>684, 3716=>688, 3719=>482, 3720=>628, 3722=>684, 3725=>688, 3732=>669, 3733=>642, 3734=>645, + 3735=>655, 3737=>659, 3738=>625, 3739=>625, 3740=>745, 3741=>767, 3742=>687, 3743=>687, 3745=>702, 3746=>688, 3747=>684, 3749=>649, 3751=>632, 3754=>703, 3755=>819, 3757=>633, + 3758=>684, 3759=>788, 3760=>632, 3761=>0, 3762=>539, 3763=>539, 3764=>0, 3765=>0, 3766=>0, 3767=>0, 3768=>0, 3769=>0, 3771=>0, 3772=>0, 3773=>663, 3776=>375, + 3777=>657, 3778=>460, 3779=>547, 3780=>491, 3782=>674, 3784=>0, 3785=>0, 3786=>0, 3787=>0, 3788=>0, 3789=>0, 3804=>1028, 3805=>1028, 5121=>684, 5122=>684, 5123=>684, + 5124=>684, 5125=>769, 5126=>769, 5127=>769, 5129=>769, 5130=>769, 5131=>769, 5132=>835, 5133=>834, 5134=>835, 5135=>834, 5136=>835, 5137=>834, 5138=>967, 5139=>1007, 5140=>967, + 5141=>1007, 5142=>769, 5143=>967, 5144=>1007, 5145=>967, 5146=>1007, 5147=>769, 5149=>256, 5150=>543, 5151=>423, 5152=>423, 5153=>389, 5154=>389, 5155=>393, 5156=>389, 5157=>466, + 5158=>385, 5159=>256, 5160=>389, 5161=>389, 5162=>389, 5163=>1090, 5164=>909, 5165=>953, 5166=>1117, 5167=>684, 5168=>684, 5169=>684, 5170=>684, 5171=>729, 5172=>729, 5173=>729, + 5175=>729, 5176=>729, 5177=>729, 5178=>835, 5179=>834, 5180=>835, 5181=>834, 5182=>835, 5183=>834, 5184=>967, 5185=>1007, 5186=>967, 5187=>1007, 5188=>967, 5189=>1007, 5190=>967, + 5191=>1007, 5192=>729, 5193=>508, 5194=>192, 5196=>732, 5197=>732, 5198=>732, 5199=>732, 5200=>730, 5201=>730, 5202=>730, 5204=>730, 5205=>730, 5206=>730, 5207=>921, 5208=>889, + 5209=>921, 5210=>889, 5211=>921, 5212=>889, 5213=>928, 5214=>900, 5215=>928, 5216=>900, 5217=>947, 5218=>900, 5219=>947, 5220=>900, 5221=>947, 5222=>434, 5223=>877, 5224=>877, + 5225=>866, 5226=>890, 5227=>628, 5228=>628, 5229=>628, 5230=>628, 5231=>628, 5232=>694, 5233=>628, 5234=>628, 5235=>628, 5236=>860, 5237=>771, 5238=>815, 5239=>816, 5240=>815, + 5241=>816, 5242=>860, 5243=>771, 5244=>860, 5245=>771, 5246=>815, 5247=>816, 5248=>815, 5249=>816, 5250=>815, 5251=>407, 5252=>407, 5253=>750, 5254=>775, 5255=>750, 5256=>775, + 5257=>628, 5258=>628, 5259=>628, 5260=>628, 5261=>628, 5262=>628, 5263=>628, 5264=>628, 5265=>628, 5266=>860, 5267=>771, 5268=>815, 5269=>816, 5270=>815, 5271=>816, 5272=>860, + 5273=>771, 5274=>860, 5275=>771, 5276=>815, 5277=>816, 5278=>815, 5279=>816, 5280=>815, 5281=>435, 5282=>435, 5283=>610, 5284=>557, 5285=>557, 5286=>557, 5287=>610, 5288=>522, + 5289=>610, 5290=>557, 5291=>557, 5292=>749, 5293=>769, 5294=>746, 5295=>764, 5296=>746, 5297=>764, 5298=>749, 5299=>769, 5300=>749, 5301=>769, 5302=>746, 5303=>764, 5304=>746, + 5305=>764, 5306=>746, 5307=>386, 5308=>508, 5309=>386, 5312=>852, 5313=>852, 5314=>852, 5315=>823, 5316=>852, 5317=>852, 5318=>852, 5319=>852, 5320=>852, 5321=>1069, 5322=>1035, + 5323=>1059, 5324=>852, 5325=>1059, 5326=>852, 5327=>852, 5328=>600, 5329=>453, 5330=>600, 5331=>852, 5332=>852, 5333=>852, 5334=>852, 5335=>852, 5336=>852, 5337=>852, 5338=>852, + 5339=>852, 5340=>1069, 5341=>1035, 5342=>1059, 5343=>1030, 5344=>1059, 5345=>1030, 5346=>1069, 5347=>1035, 5348=>1069, 5349=>1035, 5350=>1083, 5351=>1030, 5352=>1083, 5353=>1030, 5354=>600, + 5356=>729, 5357=>603, 5358=>603, 5359=>603, 5360=>603, 5361=>603, 5362=>661, 5363=>603, 5364=>603, 5365=>603, 5366=>834, 5367=>754, 5368=>792, 5369=>771, 5370=>792, 5371=>771, + 5372=>834, 5373=>754, 5374=>834, 5375=>754, 5376=>792, 5377=>771, 5378=>792, 5379=>771, 5380=>792, 5381=>418, 5382=>420, 5383=>418, 5392=>712, 5393=>712, 5394=>712, 5395=>892, + 5396=>892, 5397=>892, 5398=>892, 5399=>910, 5400=>872, 5401=>910, 5402=>872, 5403=>910, 5404=>872, 5405=>1140, 5406=>1100, 5407=>1140, 5408=>1100, 5409=>1140, 5410=>1100, 5411=>1140, + 5412=>1100, 5413=>641, 5414=>627, 5415=>627, 5416=>627, 5417=>627, 5418=>627, 5419=>667, 5420=>627, 5421=>627, 5422=>627, 5423=>844, 5424=>781, 5425=>816, 5426=>818, 5427=>816, + 5428=>818, 5429=>844, 5430=>781, 5431=>844, 5432=>781, 5433=>816, 5434=>818, 5435=>816, 5436=>818, 5437=>816, 5438=>418, 5440=>389, 5441=>484, 5442=>916, 5443=>916, 5444=>916, + 5445=>916, 5446=>916, 5447=>916, 5448=>603, 5449=>603, 5450=>603, 5451=>603, 5452=>603, 5453=>603, 5454=>834, 5455=>754, 5456=>418, 5458=>729, 5459=>684, 5460=>684, 5461=>684, + 5462=>684, 5463=>726, 5464=>726, 5465=>726, 5466=>726, 5467=>924, 5468=>1007, 5469=>508, 5470=>732, 5471=>732, 5472=>732, 5473=>732, 5474=>732, 5475=>732, 5476=>730, 5477=>730, + 5478=>730, 5479=>730, 5480=>947, 5481=>900, 5482=>508, 5492=>831, 5493=>831, 5494=>831, 5495=>831, 5496=>831, 5497=>831, 5498=>831, 5499=>563, 5500=>752, 5501=>484, 5502=>1047, + 5503=>1047, 5504=>1047, 5505=>1047, 5506=>1047, 5507=>1047, 5508=>1047, 5509=>825, 5514=>831, 5515=>831, 5516=>831, 5517=>831, 5518=>1259, 5519=>1259, 5520=>1259, 5521=>1002, 5522=>1002, + 5523=>1259, 5524=>1259, 5525=>700, 5526=>1073, 5536=>852, 5537=>852, 5538=>852, 5539=>852, 5540=>852, 5541=>852, 5542=>600, 5543=>643, 5544=>643, 5545=>643, 5546=>643, 5547=>643, + 5548=>643, 5549=>643, 5550=>418, 5551=>628, 5598=>770, 5601=>767, 5702=>468, 5703=>468, 5742=>444, 5743=>1047, 5744=>1310, 5745=>1632, 5746=>1632, 5747=>1375, 5748=>1375, 5749=>1632, + 5750=>1632, 7424=>592, 7425=>717, 7426=>982, 7427=>586, 7428=>550, 7429=>605, 7430=>605, 7431=>491, 7432=>541, 7433=>278, 7434=>395, 7435=>579, 7436=>583, 7437=>754, 7438=>650, + 7439=>612, 7440=>550, 7441=>684, 7442=>684, 7443=>684, 7444=>1023, 7446=>612, 7447=>612, 7448=>524, 7449=>602, 7450=>602, 7451=>583, 7452=>574, 7453=>737, 7454=>948, 7455=>638, + 7456=>592, 7457=>818, 7458=>525, 7459=>526, 7462=>583, 7463=>592, 7464=>564, 7465=>524, 7466=>590, 7467=>639, 7468=>431, 7469=>613, 7470=>432, 7472=>485, 7473=>398, 7474=>398, + 7475=>488, 7476=>474, 7477=>186, 7478=>186, 7479=>413, 7480=>351, 7481=>543, 7482=>471, 7483=>471, 7484=>496, 7485=>439, 7486=>380, 7487=>438, 7488=>385, 7489=>461, 7490=>623, + 7491=>392, 7492=>392, 7493=>405, 7494=>648, 7495=>428, 7496=>405, 7497=>417, 7498=>417, 7499=>360, 7500=>359, 7501=>405, 7502=>179, 7503=>426, 7504=>623, 7505=>409, 7506=>414, + 7507=>370, 7508=>414, 7509=>414, 7510=>428, 7511=>295, 7512=>405, 7513=>470, 7514=>623, 7515=>417, 7517=>402, 7518=>373, 7519=>385, 7520=>416, 7521=>364, 7522=>179, 7523=>259, + 7524=>405, 7525=>417, 7526=>402, 7527=>373, 7528=>385, 7529=>416, 7530=>364, 7543=>635, 7544=>474, 7547=>372, 7557=>278, 7579=>405, 7580=>370, 7581=>370, 7582=>414, 7583=>360, + 7584=>296, 7585=>233, 7586=>405, 7587=>405, 7588=>261, 7589=>250, 7590=>261, 7591=>261, 7592=>234, 7593=>250, 7594=>235, 7595=>376, 7596=>623, 7597=>623, 7598=>411, 7599=>479, + 7600=>409, 7601=>414, 7602=>414, 7603=>360, 7604=>287, 7605=>295, 7606=>508, 7607=>418, 7608=>361, 7609=>406, 7610=>417, 7611=>366, 7612=>437, 7613=>366, 7614=>392, 7615=>414, + 7620=>0, 7621=>0, 7622=>0, 7623=>0, 7624=>0, 7625=>0, 7680=>684, 7681=>613, 7682=>686, 7683=>635, 7684=>686, 7685=>635, 7686=>686, 7687=>635, 7688=>698, 7689=>550, + 7690=>770, 7691=>635, 7692=>770, 7693=>635, 7694=>770, 7695=>635, 7696=>770, 7697=>635, 7698=>770, 7699=>635, 7700=>632, 7701=>615, 7702=>632, 7703=>615, 7704=>632, 7705=>615, + 7706=>632, 7707=>615, 7708=>632, 7709=>615, 7710=>575, 7711=>352, 7712=>775, 7713=>635, 7714=>752, 7715=>634, 7716=>752, 7717=>634, 7718=>752, 7719=>634, 7720=>752, 7721=>634, + 7722=>752, 7723=>634, 7724=>295, 7725=>278, 7726=>295, 7727=>278, 7728=>656, 7729=>579, 7730=>656, 7731=>579, 7732=>656, 7733=>579, 7734=>557, 7735=>288, 7736=>557, 7737=>288, + 7738=>557, 7739=>278, 7740=>557, 7741=>278, 7742=>863, 7743=>974, 7744=>863, 7745=>974, 7746=>863, 7747=>974, 7748=>748, 7749=>634, 7750=>748, 7751=>634, 7752=>748, 7753=>634, + 7754=>748, 7755=>634, 7756=>787, 7757=>612, 7758=>787, 7759=>612, 7760=>787, 7761=>612, 7762=>787, 7763=>612, 7764=>603, 7765=>635, 7766=>603, 7767=>635, 7768=>695, 7769=>411, + 7770=>695, 7771=>411, 7772=>695, 7773=>411, 7774=>695, 7775=>411, 7776=>635, 7777=>521, 7778=>635, 7779=>521, 7780=>635, 7781=>521, 7782=>635, 7783=>521, 7784=>635, 7785=>521, + 7786=>611, 7787=>392, 7788=>611, 7789=>392, 7790=>611, 7791=>392, 7792=>611, 7793=>392, 7794=>732, 7795=>634, 7796=>732, 7797=>634, 7798=>732, 7799=>634, 7800=>732, 7801=>634, + 7802=>732, 7803=>634, 7804=>684, 7805=>592, 7806=>684, 7807=>592, 7808=>989, 7809=>818, 7810=>989, 7811=>818, 7812=>989, 7813=>818, 7814=>989, 7815=>818, 7816=>989, 7817=>818, + 7818=>685, 7819=>592, 7820=>685, 7821=>592, 7822=>611, 7823=>592, 7824=>685, 7825=>525, 7826=>685, 7827=>525, 7828=>685, 7829=>525, 7830=>634, 7831=>392, 7832=>818, 7833=>592, + 7834=>613, 7835=>352, 7840=>684, 7841=>613, 7842=>684, 7843=>613, 7844=>684, 7845=>613, 7846=>684, 7847=>613, 7848=>684, 7849=>613, 7850=>684, 7851=>613, 7852=>684, 7853=>613, + 7854=>684, 7855=>613, 7856=>684, 7857=>613, 7858=>684, 7859=>613, 7860=>684, 7861=>613, 7862=>684, 7863=>613, 7864=>632, 7865=>615, 7866=>632, 7867=>615, 7868=>632, 7869=>615, + 7870=>632, 7871=>615, 7872=>632, 7873=>615, 7874=>632, 7875=>615, 7876=>632, 7877=>615, 7878=>632, 7879=>615, 7880=>295, 7881=>278, 7882=>295, 7883=>278, 7884=>787, 7885=>612, + 7886=>787, 7887=>612, 7888=>787, 7889=>612, 7890=>787, 7891=>612, 7892=>787, 7893=>612, 7894=>787, 7895=>612, 7896=>787, 7897=>612, 7898=>913, 7899=>612, 7900=>913, 7901=>612, + 7902=>913, 7903=>612, 7904=>913, 7905=>612, 7906=>913, 7907=>612, 7908=>732, 7909=>634, 7910=>732, 7911=>634, 7912=>858, 7913=>634, 7914=>858, 7915=>634, 7916=>858, 7917=>634, + 7918=>858, 7919=>634, 7920=>858, 7921=>634, 7922=>611, 7923=>592, 7924=>611, 7925=>592, 7926=>611, 7927=>592, 7928=>611, 7929=>592, 7936=>659, 7937=>659, 7938=>659, 7939=>659, + 7940=>659, 7941=>659, 7942=>659, 7943=>659, 7944=>684, 7945=>684, 7946=>877, 7947=>877, 7948=>769, 7949=>801, 7950=>708, 7951=>743, 7952=>541, 7953=>541, 7954=>541, 7955=>541, + 7956=>541, 7957=>541, 7960=>711, 7961=>711, 7962=>966, 7963=>975, 7964=>898, 7965=>928, 7968=>634, 7969=>634, 7970=>634, 7971=>634, 7972=>634, 7973=>634, 7974=>634, 7975=>634, + 7976=>837, 7977=>835, 7978=>1086, 7979=>1089, 7980=>1027, 7981=>1051, 7982=>934, 7983=>947, 7984=>338, 7985=>338, 7986=>338, 7987=>338, 7988=>338, 7989=>338, 7990=>338, 7991=>338, + 7992=>380, 7993=>374, 7994=>635, 7995=>635, 7996=>570, 7997=>600, 7998=>489, 7999=>493, 8000=>612, 8001=>612, 8002=>612, 8003=>612, 8004=>612, 8005=>612, 8008=>804, 8009=>848, + 8010=>1095, 8011=>1100, 8012=>938, 8013=>970, 8016=>579, 8017=>579, 8018=>579, 8019=>579, 8020=>579, 8021=>579, 8022=>579, 8023=>579, 8025=>784, 8027=>998, 8029=>1012, 8031=>897, + 8032=>837, 8033=>837, 8034=>837, 8035=>837, 8036=>837, 8037=>837, 8038=>837, 8039=>837, 8040=>802, 8041=>843, 8042=>1089, 8043=>1095, 8044=>946, 8045=>972, 8046=>921, 8047=>952, + 8048=>659, 8049=>659, 8050=>541, 8051=>548, 8052=>634, 8053=>654, 8054=>338, 8055=>338, 8056=>612, 8057=>612, 8058=>579, 8059=>579, 8060=>837, 8061=>837, 8064=>659, 8065=>659, + 8066=>659, 8067=>659, 8068=>659, 8069=>659, 8070=>659, 8071=>659, 8072=>684, 8073=>684, 8074=>877, 8075=>877, 8076=>769, 8077=>801, 8078=>708, 8079=>743, 8080=>634, 8081=>634, + 8082=>634, 8083=>634, 8084=>634, 8085=>634, 8086=>634, 8087=>634, 8088=>837, 8089=>835, 8090=>1086, 8091=>1089, 8092=>1027, 8093=>1051, 8094=>934, 8095=>947, 8096=>837, 8097=>837, + 8098=>837, 8099=>837, 8100=>837, 8101=>837, 8102=>837, 8103=>837, 8104=>802, 8105=>843, 8106=>1089, 8107=>1095, 8108=>946, 8109=>972, 8110=>921, 8111=>952, 8112=>659, 8113=>659, + 8114=>659, 8115=>659, 8116=>659, 8118=>659, 8119=>659, 8120=>684, 8121=>684, 8122=>716, 8123=>692, 8124=>684, 8125=>500, 8126=>500, 8127=>500, 8128=>500, 8129=>500, 8130=>634, + 8131=>634, 8132=>654, 8134=>634, 8135=>634, 8136=>805, 8137=>746, 8138=>931, 8139=>871, 8140=>752, 8141=>500, 8142=>500, 8143=>500, 8144=>338, 8145=>338, 8146=>338, 8147=>338, + 8150=>338, 8151=>338, 8152=>295, 8153=>295, 8154=>475, 8155=>408, 8157=>500, 8158=>500, 8159=>500, 8160=>579, 8161=>579, 8162=>579, 8163=>579, 8164=>635, 8165=>635, 8166=>579, + 8167=>579, 8168=>611, 8169=>611, 8170=>845, 8171=>825, 8172=>685, 8173=>500, 8174=>500, 8175=>500, 8178=>837, 8179=>837, 8180=>837, 8182=>837, 8183=>837, 8184=>941, 8185=>813, + 8186=>922, 8187=>826, 8188=>764, 8189=>500, 8190=>500, 8192=>500, 8193=>1000, 8194=>500, 8195=>1000, 8196=>330, 8197=>250, 8198=>167, 8199=>636, 8200=>318, 8201=>200, 8202=>100, + 8203=>0, 8204=>0, 8205=>0, 8206=>0, 8207=>0, 8208=>361, 8209=>361, 8210=>636, 8213=>1000, 8214=>500, 8215=>500, 8219=>318, 8223=>518, 8227=>590, 8228=>334, 8229=>667, + 8231=>318, 8234=>0, 8235=>0, 8236=>0, 8237=>0, 8238=>0, 8239=>200, 8241=>1735, 8242=>227, 8243=>374, 8244=>520, 8245=>227, 8246=>374, 8247=>520, 8248=>339, 8251=>838, + 8252=>485, 8253=>531, 8254=>500, 8255=>804, 8256=>804, 8257=>250, 8258=>1000, 8259=>500, 8260=>167, 8261=>390, 8262=>390, 8263=>922, 8264=>733, 8265=>733, 8266=>497, 8267=>636, + 8268=>500, 8269=>500, 8270=>500, 8271=>337, 8272=>804, 8273=>500, 8274=>450, 8275=>838, 8276=>804, 8277=>838, 8278=>586, 8279=>663, 8280=>838, 8281=>838, 8282=>318, 8283=>797, + 8284=>838, 8285=>318, 8286=>318, 8287=>222, 8288=>0, 8289=>0, 8290=>0, 8291=>0, 8298=>0, 8299=>0, 8300=>0, 8301=>0, 8302=>0, 8303=>0, 8304=>401, 8305=>179, + 8308=>401, 8309=>401, 8310=>401, 8311=>401, 8312=>401, 8313=>401, 8314=>528, 8315=>528, 8316=>528, 8317=>246, 8318=>246, 8319=>398, 8320=>401, 8321=>401, 8322=>401, 8323=>401, + 8324=>401, 8325=>401, 8326=>401, 8327=>401, 8328=>401, 8329=>401, 8330=>528, 8331=>528, 8332=>528, 8333=>246, 8334=>246, 8336=>392, 8337=>417, 8338=>414, 8339=>444, 8340=>417, + 8352=>877, 8353=>636, 8354=>636, 8355=>636, 8356=>636, 8357=>974, 8358=>748, 8359=>1272, 8360=>1074, 8361=>989, 8362=>784, 8363=>636, 8365=>636, 8366=>636, 8367=>1272, 8368=>636, + 8369=>636, 8370=>636, 8371=>636, 8372=>774, 8373=>641, 8400=>0, 8401=>0, 8406=>0, 8407=>0, 8448=>1019, 8449=>1019, 8450=>698, 8451=>1123, 8452=>642, 8453=>1019, 8454=>1067, + 8455=>614, 8456=>698, 8457=>952, 8459=>988, 8460=>754, 8461=>850, 8462=>634, 8463=>634, 8464=>470, 8465=>697, 8466=>720, 8467=>413, 8468=>818, 8469=>801, 8470=>1040, 8471=>1000, + 8472=>697, 8473=>702, 8474=>787, 8475=>798, 8476=>814, 8477=>792, 8478=>896, 8479=>684, 8480=>1020, 8481=>1074, 8483=>684, 8484=>745, 8485=>578, 8486=>764, 8487=>764, 8488=>616, + 8489=>338, 8490=>656, 8491=>684, 8492=>786, 8493=>703, 8494=>854, 8495=>592, 8496=>605, 8497=>786, 8498=>575, 8499=>1069, 8500=>462, 8501=>745, 8502=>674, 8503=>469, 8504=>648, + 8505=>380, 8506=>926, 8507=>1194, 8508=>702, 8509=>728, 8510=>655, 8511=>849, 8512=>811, 8513=>775, 8514=>557, 8515=>557, 8516=>611, 8517=>819, 8518=>708, 8519=>615, 8520=>351, + 8521=>351, 8523=>780, 8526=>526, 8531=>969, 8532=>969, 8533=>969, 8534=>969, 8535=>969, 8536=>969, 8537=>969, 8538=>969, 8539=>969, 8540=>969, 8541=>969, 8542=>969, 8543=>568, + 8544=>295, 8545=>492, 8546=>689, 8547=>923, 8548=>684, 8549=>922, 8550=>1120, 8551=>1317, 8552=>917, 8553=>685, 8554=>933, 8555=>1131, 8556=>557, 8557=>698, 8558=>770, 8559=>863, + 8560=>278, 8561=>458, 8562=>637, 8563=>812, 8564=>592, 8565=>811, 8566=>991, 8567=>1170, 8568=>819, 8569=>592, 8570=>822, 8571=>1002, 8572=>278, 8573=>550, 8574=>635, 8575=>974, + 8576=>1245, 8577=>770, 8578=>1245, 8579=>703, 8580=>549, 8592=>838, 8593=>838, 8594=>838, 8595=>838, 8596=>838, 8597=>838, 8598=>838, 8599=>838, 8600=>838, 8601=>838, 8602=>838, + 8603=>838, 8604=>838, 8605=>838, 8606=>838, 8607=>838, 8608=>838, 8609=>838, 8610=>838, 8611=>838, 8612=>838, 8613=>838, 8614=>838, 8615=>838, 8616=>838, 8617=>838, 8618=>838, + 8619=>838, 8620=>838, 8621=>838, 8622=>838, 8623=>838, 8624=>838, 8625=>838, 8626=>838, 8627=>838, 8628=>838, 8629=>838, 8630=>838, 8631=>838, 8632=>838, 8633=>838, 8634=>838, + 8635=>838, 8636=>838, 8637=>838, 8638=>838, 8639=>838, 8640=>838, 8641=>838, 8642=>838, 8643=>838, 8644=>838, 8645=>838, 8646=>838, 8647=>838, 8648=>838, 8649=>838, 8650=>838, + 8651=>838, 8652=>838, 8653=>838, 8654=>838, 8655=>838, 8656=>838, 8657=>838, 8658=>838, 8659=>838, 8660=>838, 8661=>838, 8662=>838, 8663=>838, 8664=>838, 8665=>838, 8666=>838, + 8667=>838, 8668=>838, 8669=>838, 8670=>838, 8671=>838, 8672=>838, 8673=>838, 8674=>838, 8675=>838, 8676=>838, 8677=>838, 8678=>838, 8679=>838, 8680=>838, 8681=>838, 8682=>838, + 8683=>838, 8684=>838, 8685=>838, 8686=>838, 8687=>838, 8688=>838, 8689=>838, 8690=>838, 8691=>838, 8692=>838, 8693=>838, 8694=>838, 8695=>838, 8696=>838, 8697=>838, 8698=>838, + 8699=>838, 8700=>838, 8701=>838, 8702=>838, 8703=>838, 8704=>684, 8705=>636, 8706=>517, 8707=>632, 8708=>632, 8709=>871, 8710=>669, 8711=>669, 8712=>871, 8713=>871, 8714=>718, + 8715=>871, 8716=>871, 8717=>718, 8718=>636, 8719=>757, 8720=>757, 8721=>674, 8722=>838, 8723=>838, 8724=>838, 8725=>167, 8726=>637, 8727=>838, 8728=>626, 8729=>318, 8730=>637, + 8731=>637, 8732=>637, 8733=>677, 8734=>833, 8735=>838, 8736=>896, 8737=>896, 8738=>838, 8739=>500, 8740=>500, 8741=>500, 8742=>500, 8743=>732, 8744=>732, 8745=>732, 8746=>732, + 8747=>521, 8748=>789, 8749=>1057, 8750=>521, 8751=>789, 8752=>1057, 8753=>521, 8754=>521, 8755=>521, 8756=>636, 8757=>636, 8758=>260, 8759=>636, 8760=>838, 8761=>838, 8762=>838, + 8763=>838, 8764=>838, 8765=>838, 8766=>838, 8767=>838, 8768=>375, 8769=>838, 8770=>838, 8771=>838, 8772=>838, 8773=>838, 8774=>838, 8775=>838, 8776=>838, 8777=>838, 8778=>838, + 8779=>838, 8780=>838, 8781=>838, 8782=>838, 8783=>838, 8784=>838, 8785=>838, 8786=>839, 8787=>839, 8788=>1000, 8789=>1000, 8790=>838, 8791=>838, 8792=>838, 8793=>838, 8794=>838, + 8795=>838, 8796=>838, 8797=>838, 8798=>838, 8799=>838, 8800=>838, 8801=>838, 8802=>838, 8803=>838, 8804=>838, 8805=>838, 8806=>838, 8807=>838, 8808=>838, 8809=>838, 8810=>1047, + 8811=>1047, 8812=>464, 8813=>838, 8814=>838, 8815=>838, 8816=>838, 8817=>838, 8818=>838, 8819=>838, 8820=>838, 8821=>838, 8822=>838, 8823=>838, 8824=>838, 8825=>838, 8826=>838, + 8827=>838, 8828=>838, 8829=>838, 8830=>838, 8831=>838, 8832=>838, 8833=>838, 8834=>838, 8835=>838, 8836=>838, 8837=>838, 8838=>838, 8839=>838, 8840=>838, 8841=>838, 8842=>838, + 8843=>838, 8844=>732, 8845=>732, 8846=>732, 8847=>838, 8848=>838, 8849=>838, 8850=>838, 8851=>722, 8852=>722, 8853=>838, 8854=>838, 8855=>838, 8856=>838, 8857=>838, 8858=>838, + 8859=>838, 8860=>838, 8861=>838, 8862=>838, 8863=>838, 8864=>838, 8865=>838, 8866=>871, 8867=>871, 8868=>871, 8869=>871, 8870=>521, 8871=>521, 8872=>871, 8873=>871, 8874=>871, + 8875=>871, 8876=>871, 8877=>871, 8878=>871, 8879=>871, 8882=>838, 8883=>838, 8884=>838, 8885=>838, 8886=>1000, 8887=>1000, 8888=>838, 8889=>838, 8890=>521, 8891=>732, 8892=>732, + 8893=>732, 8896=>820, 8897=>820, 8898=>820, 8899=>820, 8900=>494, 8901=>318, 8902=>626, 8904=>1000, 8905=>1000, 8906=>1000, 8907=>1000, 8908=>1000, 8909=>838, 8918=>838, 8919=>838, + 8920=>1422, 8921=>1422, 8922=>838, 8923=>838, 8924=>838, 8925=>838, 8926=>838, 8927=>838, 8928=>838, 8929=>838, 8930=>838, 8931=>838, 8932=>838, 8933=>838, 8934=>838, 8935=>838, + 8936=>838, 8937=>838, 8938=>838, 8939=>838, 8940=>838, 8941=>838, 8946=>1000, 8947=>871, 8948=>718, 8949=>871, 8950=>871, 8951=>718, 8952=>871, 8953=>871, 8954=>1000, 8955=>871, + 8956=>718, 8957=>871, 8958=>718, 8959=>871, 8962=>635, 8966=>871, 8968=>390, 8969=>390, 8970=>390, 8971=>390, 8976=>838, 8977=>513, 8984=>1000, 8985=>838, 8992=>521, 8993=>521, + 8997=>1000, 9000=>1443, 9085=>757, 9115=>500, 9116=>500, 9117=>500, 9118=>500, 9119=>500, 9120=>500, 9121=>500, 9122=>500, 9123=>500, 9124=>500, 9125=>500, 9126=>500, 9127=>750, + 9128=>750, 9129=>750, 9130=>750, 9131=>750, 9132=>750, 9133=>750, 9134=>521, 9166=>838, 9167=>945, 9250=>635, 9251=>635, 9312=>896, 9313=>896, 9314=>896, 9315=>896, 9316=>896, + 9317=>896, 9318=>896, 9319=>896, 9320=>896, 9321=>896, 9600=>769, 9601=>769, 9602=>769, 9603=>769, 9604=>769, 9605=>769, 9606=>769, 9607=>769, 9608=>769, 9609=>769, 9610=>769, + 9611=>769, 9612=>769, 9613=>769, 9614=>769, 9615=>769, 9616=>769, 9617=>769, 9618=>769, 9619=>769, 9620=>769, 9621=>769, 9622=>769, 9623=>769, 9624=>769, 9625=>769, 9626=>769, + 9627=>769, 9628=>769, 9629=>769, 9630=>769, 9631=>769, 9632=>945, 9633=>945, 9634=>945, 9635=>945, 9636=>945, 9637=>945, 9638=>945, 9639=>945, 9640=>945, 9641=>945, 9642=>678, + 9643=>678, 9644=>945, 9645=>945, 9646=>550, 9647=>550, 9648=>769, 9649=>769, 9650=>769, 9651=>769, 9652=>502, 9653=>502, 9654=>769, 9655=>769, 9656=>502, 9657=>502, 9658=>769, + 9659=>769, 9660=>769, 9661=>769, 9662=>502, 9663=>502, 9664=>769, 9665=>769, 9666=>502, 9667=>502, 9668=>769, 9669=>769, 9670=>769, 9671=>769, 9672=>769, 9673=>873, 9674=>494, + 9675=>873, 9676=>873, 9677=>873, 9678=>873, 9679=>873, 9680=>873, 9681=>873, 9682=>873, 9683=>873, 9684=>873, 9685=>873, 9686=>527, 9687=>527, 9688=>791, 9689=>970, 9690=>970, + 9691=>970, 9692=>387, 9693=>387, 9694=>387, 9695=>387, 9696=>873, 9697=>873, 9698=>769, 9699=>769, 9700=>769, 9701=>769, 9702=>590, 9703=>945, 9704=>945, 9705=>945, 9706=>945, + 9707=>945, 9708=>769, 9709=>769, 9710=>769, 9711=>1119, 9712=>945, 9713=>945, 9714=>945, 9715=>945, 9716=>873, 9717=>873, 9718=>873, 9719=>873, 9720=>769, 9721=>769, 9722=>769, + 9723=>830, 9724=>830, 9725=>732, 9726=>732, 9727=>769, 9728=>896, 9729=>1000, 9730=>896, 9731=>896, 9732=>896, 9733=>896, 9734=>896, 9735=>573, 9736=>896, 9737=>896, 9738=>888, + 9739=>888, 9740=>671, 9741=>1013, 9742=>1246, 9743=>1250, 9744=>896, 9745=>896, 9746=>896, 9747=>532, 9748=>896, 9749=>896, 9750=>896, 9751=>896, 9752=>896, 9753=>896, 9754=>896, + 9755=>896, 9756=>896, 9757=>609, 9758=>896, 9759=>609, 9760=>896, 9761=>896, 9762=>896, 9763=>896, 9764=>669, 9765=>746, 9766=>649, 9767=>784, 9768=>545, 9769=>896, 9770=>896, + 9771=>896, 9772=>710, 9773=>896, 9774=>896, 9775=>896, 9776=>896, 9777=>896, 9778=>896, 9779=>896, 9780=>896, 9781=>896, 9782=>896, 9783=>896, 9784=>896, 9785=>896, 9786=>896, + 9787=>896, 9788=>896, 9789=>896, 9790=>896, 9791=>614, 9792=>731, 9793=>731, 9794=>896, 9795=>896, 9796=>896, 9797=>896, 9798=>896, 9799=>896, 9800=>896, 9801=>896, 9802=>896, + 9803=>896, 9804=>896, 9805=>896, 9806=>896, 9807=>896, 9808=>896, 9809=>896, 9810=>896, 9811=>896, 9812=>896, 9813=>896, 9814=>896, 9815=>896, 9816=>896, 9817=>896, 9818=>896, + 9819=>896, 9820=>896, 9821=>896, 9822=>896, 9823=>896, 9824=>896, 9825=>896, 9826=>896, 9827=>896, 9828=>896, 9829=>896, 9830=>896, 9831=>896, 9832=>896, 9833=>472, 9834=>638, + 9835=>896, 9836=>896, 9837=>472, 9838=>357, 9839=>484, 9840=>748, 9841=>766, 9842=>896, 9843=>896, 9844=>896, 9845=>896, 9846=>896, 9847=>896, 9848=>896, 9849=>896, 9850=>896, + 9851=>896, 9852=>896, 9853=>896, 9854=>896, 9855=>896, 9856=>869, 9857=>869, 9858=>869, 9859=>869, 9860=>869, 9861=>869, 9862=>896, 9863=>896, 9864=>896, 9865=>896, 9866=>896, + 9867=>896, 9868=>896, 9869=>896, 9870=>896, 9871=>896, 9872=>896, 9873=>896, 9874=>896, 9875=>896, 9876=>896, 9877=>541, 9878=>896, 9879=>896, 9880=>896, 9881=>896, 9882=>896, + 9883=>896, 9884=>896, 9888=>896, 9889=>702, 9890=>838, 9891=>838, 9892=>838, 9893=>838, 9894=>838, 9895=>838, 9896=>838, 9897=>838, 9898=>838, 9899=>838, 9900=>838, 9901=>838, + 9902=>838, 9903=>838, 9904=>844, 9905=>838, 9906=>731, 9985=>838, 9986=>838, 9987=>838, 9988=>838, 9990=>838, 9991=>838, 9992=>838, 9993=>838, 9996=>838, 9997=>838, 9998=>838, + 9999=>838, 10000=>838, 10001=>838, 10002=>838, 10003=>838, 10004=>838, 10005=>838, 10006=>838, 10007=>838, 10008=>838, 10009=>838, 10010=>838, 10011=>838, 10012=>838, 10013=>838, 10014=>838, + 10015=>838, 10016=>838, 10017=>838, 10018=>838, 10019=>838, 10020=>838, 10021=>838, 10022=>838, 10023=>838, 10025=>838, 10026=>838, 10027=>838, 10028=>838, 10029=>838, 10030=>838, 10031=>838, + 10032=>838, 10033=>838, 10034=>838, 10035=>838, 10036=>838, 10037=>838, 10038=>838, 10039=>838, 10040=>838, 10041=>838, 10042=>838, 10043=>838, 10044=>838, 10045=>838, 10046=>838, 10047=>838, + 10048=>838, 10049=>838, 10050=>838, 10051=>838, 10052=>838, 10053=>838, 10054=>838, 10055=>838, 10056=>838, 10057=>838, 10058=>838, 10059=>838, 10061=>896, 10063=>896, 10064=>896, 10065=>896, + 10066=>896, 10070=>896, 10072=>838, 10073=>838, 10074=>838, 10075=>322, 10076=>322, 10077=>538, 10078=>538, 10081=>838, 10082=>838, 10083=>838, 10084=>838, 10085=>838, 10086=>838, 10087=>838, + 10088=>838, 10089=>838, 10090=>838, 10091=>838, 10092=>838, 10093=>838, 10094=>838, 10095=>838, 10096=>838, 10097=>838, 10098=>838, 10099=>838, 10100=>838, 10101=>838, 10102=>896, 10103=>896, + 10104=>896, 10105=>896, 10106=>896, 10107=>896, 10108=>896, 10109=>896, 10110=>896, 10111=>896, 10112=>838, 10113=>838, 10114=>838, 10115=>838, 10116=>838, 10117=>838, 10118=>838, 10119=>838, + 10120=>838, 10121=>838, 10122=>838, 10123=>838, 10124=>838, 10125=>838, 10126=>838, 10127=>838, 10128=>838, 10129=>838, 10130=>838, 10131=>838, 10132=>838, 10136=>838, 10137=>838, 10138=>838, + 10139=>838, 10140=>838, 10141=>838, 10142=>838, 10143=>838, 10144=>838, 10145=>838, 10146=>838, 10147=>838, 10148=>838, 10149=>838, 10150=>838, 10151=>838, 10152=>838, 10153=>838, 10154=>838, + 10155=>838, 10156=>838, 10157=>838, 10158=>838, 10159=>838, 10161=>838, 10162=>838, 10163=>838, 10164=>838, 10165=>838, 10166=>838, 10167=>838, 10168=>838, 10169=>838, 10170=>838, 10171=>838, + 10172=>838, 10173=>838, 10174=>838, 10208=>494, 10214=>495, 10215=>495, 10216=>390, 10217=>390, 10218=>556, 10219=>556, 10224=>838, 10225=>838, 10226=>838, 10227=>838, 10228=>1157, 10229=>1434, + 10230=>1434, 10231=>1434, 10232=>1434, 10233=>1434, 10234=>1434, 10235=>1434, 10236=>1434, 10237=>1434, 10238=>1434, 10239=>1434, 10240=>732, 10241=>732, 10242=>732, 10243=>732, 10244=>732, 10245=>732, + 10246=>732, 10247=>732, 10248=>732, 10249=>732, 10250=>732, 10251=>732, 10252=>732, 10253=>732, 10254=>732, 10255=>732, 10256=>732, 10257=>732, 10258=>732, 10259=>732, 10260=>732, 10261=>732, + 10262=>732, 10263=>732, 10264=>732, 10265=>732, 10266=>732, 10267=>732, 10268=>732, 10269=>732, 10270=>732, 10271=>732, 10272=>732, 10273=>732, 10274=>732, 10275=>732, 10276=>732, 10277=>732, + 10278=>732, 10279=>732, 10280=>732, 10281=>732, 10282=>732, 10283=>732, 10284=>732, 10285=>732, 10286=>732, 10287=>732, 10288=>732, 10289=>732, 10290=>732, 10291=>732, 10292=>732, 10293=>732, + 10294=>732, 10295=>732, 10296=>732, 10297=>732, 10298=>732, 10299=>732, 10300=>732, 10301=>732, 10302=>732, 10303=>732, 10304=>732, 10305=>732, 10306=>732, 10307=>732, 10308=>732, 10309=>732, + 10310=>732, 10311=>732, 10312=>732, 10313=>732, 10314=>732, 10315=>732, 10316=>732, 10317=>732, 10318=>732, 10319=>732, 10320=>732, 10321=>732, 10322=>732, 10323=>732, 10324=>732, 10325=>732, + 10326=>732, 10327=>732, 10328=>732, 10329=>732, 10330=>732, 10331=>732, 10332=>732, 10333=>732, 10334=>732, 10335=>732, 10336=>732, 10337=>732, 10338=>732, 10339=>732, 10340=>732, 10341=>732, + 10342=>732, 10343=>732, 10344=>732, 10345=>732, 10346=>732, 10347=>732, 10348=>732, 10349=>732, 10350=>732, 10351=>732, 10352=>732, 10353=>732, 10354=>732, 10355=>732, 10356=>732, 10357=>732, + 10358=>732, 10359=>732, 10360=>732, 10361=>732, 10362=>732, 10363=>732, 10364=>732, 10365=>732, 10366=>732, 10367=>732, 10368=>732, 10369=>732, 10370=>732, 10371=>732, 10372=>732, 10373=>732, + 10374=>732, 10375=>732, 10376=>732, 10377=>732, 10378=>732, 10379=>732, 10380=>732, 10381=>732, 10382=>732, 10383=>732, 10384=>732, 10385=>732, 10386=>732, 10387=>732, 10388=>732, 10389=>732, + 10390=>732, 10391=>732, 10392=>732, 10393=>732, 10394=>732, 10395=>732, 10396=>732, 10397=>732, 10398=>732, 10399=>732, 10400=>732, 10401=>732, 10402=>732, 10403=>732, 10404=>732, 10405=>732, + 10406=>732, 10407=>732, 10408=>732, 10409=>732, 10410=>732, 10411=>732, 10412=>732, 10413=>732, 10414=>732, 10415=>732, 10416=>732, 10417=>732, 10418=>732, 10419=>732, 10420=>732, 10421=>732, + 10422=>732, 10423=>732, 10424=>732, 10425=>732, 10426=>732, 10427=>732, 10428=>732, 10429=>732, 10430=>732, 10431=>732, 10432=>732, 10433=>732, 10434=>732, 10435=>732, 10436=>732, 10437=>732, + 10438=>732, 10439=>732, 10440=>732, 10441=>732, 10442=>732, 10443=>732, 10444=>732, 10445=>732, 10446=>732, 10447=>732, 10448=>732, 10449=>732, 10450=>732, 10451=>732, 10452=>732, 10453=>732, + 10454=>732, 10455=>732, 10456=>732, 10457=>732, 10458=>732, 10459=>732, 10460=>732, 10461=>732, 10462=>732, 10463=>732, 10464=>732, 10465=>732, 10466=>732, 10467=>732, 10468=>732, 10469=>732, + 10470=>732, 10471=>732, 10472=>732, 10473=>732, 10474=>732, 10475=>732, 10476=>732, 10477=>732, 10478=>732, 10479=>732, 10480=>732, 10481=>732, 10482=>732, 10483=>732, 10484=>732, 10485=>732, + 10486=>732, 10487=>732, 10488=>732, 10489=>732, 10490=>732, 10491=>732, 10492=>732, 10493=>732, 10494=>732, 10495=>732, 10502=>838, 10503=>838, 10506=>838, 10507=>838, 10560=>683, 10561=>683, + 10702=>838, 10703=>1000, 10704=>1000, 10705=>1000, 10706=>1000, 10707=>1000, 10708=>1000, 10709=>1000, 10731=>494, 10752=>1000, 10753=>1000, 10754=>1000, 10764=>1325, 10765=>521, 10766=>521, 10767=>521, + 10768=>521, 10769=>521, 10770=>521, 10771=>521, 10772=>521, 10773=>521, 10774=>521, 10775=>521, 10776=>521, 10777=>521, 10778=>521, 10779=>521, 10780=>521, 10877=>838, 10878=>838, 10879=>838, + 10880=>838, 10881=>838, 10882=>838, 10883=>838, 10884=>838, 10885=>838, 10886=>838, 10887=>838, 10888=>838, 10889=>838, 10890=>838, 10891=>838, 10892=>838, 10893=>838, 10894=>838, 10895=>838, + 10896=>838, 10897=>838, 10898=>838, 10899=>838, 10900=>838, 10901=>838, 10902=>838, 10903=>838, 10904=>838, 10905=>838, 10906=>838, 10907=>838, 10908=>838, 10909=>838, 10910=>838, 10911=>838, + 10912=>838, 10926=>838, 10927=>838, 10928=>838, 10929=>838, 10930=>838, 10931=>838, 10932=>838, 10933=>838, 10934=>838, 10935=>838, 10936=>838, 10937=>838, 10938=>838, 11001=>838, 11002=>838, + 11008=>838, 11009=>838, 11010=>838, 11011=>838, 11012=>838, 11013=>838, 11014=>838, 11015=>838, 11016=>838, 11017=>838, 11018=>838, 11019=>838, 11020=>838, 11021=>838, 11022=>836, 11023=>836, + 11024=>836, 11025=>836, 11026=>945, 11027=>945, 11028=>945, 11029=>945, 11030=>769, 11031=>769, 11032=>769, 11033=>769, 11034=>945, 11040=>869, 11041=>873, 11042=>873, 11043=>873, 11360=>557, + 11361=>278, 11362=>557, 11363=>603, 11364=>695, 11365=>613, 11366=>392, 11367=>752, 11368=>634, 11369=>656, 11370=>579, 11371=>685, 11372=>525, 11380=>592, 11381=>654, 11382=>568, 11383=>660, + 61440=>977, 61441=>977, 61960=>781, 62047=>592, 63173=>612, 64256=>689, 64257=>630, 64258=>630, 64259=>967, 64260=>967, 64261=>686, 64262=>861, 64275=>1202, 64276=>1202, 64277=>1196, 64278=>1186, + 64279=>1529, 64285=>296, 64287=>494, 64288=>636, 64297=>838, 64298=>799, 64299=>799, 64300=>799, 64301=>799, 64302=>663, 64303=>663, 64304=>663, 64305=>655, 64306=>454, 64307=>607, 64308=>690, + 64309=>336, 64310=>437, 64312=>683, 64313=>336, 64314=>642, 64315=>666, 64316=>635, 64318=>736, 64320=>456, 64321=>771, 64323=>651, 64324=>666, 64326=>639, 64327=>688, 64328=>642, 64329=>799, + 64330=>726, 64331=>272, 64332=>655, 64333=>666, 64334=>666, 64338=>941, 64339=>982, 64340=>278, 64341=>302, 64342=>941, 64343=>982, 64344=>278, 64345=>302, 64346=>941, 64347=>982, 64348=>278, + 64349=>302, 64350=>941, 64351=>982, 64352=>278, 64353=>302, 64354=>941, 64355=>982, 64356=>278, 64357=>302, 64358=>941, 64359=>982, 64360=>278, 64361=>302, 64362=>1037, 64363=>1035, 64364=>478, + 64365=>506, 64366=>1037, 64367=>1035, 64368=>478, 64369=>506, 64370=>646, 64371=>646, 64372=>618, 64373=>646, 64374=>646, 64375=>646, 64376=>618, 64377=>646, 64378=>646, 64379=>646, 64380=>618, + 64381=>646, 64382=>646, 64383=>646, 64384=>618, 64385=>646, 64394=>483, 64395=>552, 64396=>483, 64397=>552, 64398=>895, 64399=>895, 64400=>476, 64401=>552, 64402=>895, 64403=>895, 64404=>476, + 64405=>552, 64414=>734, 64415=>761, 64473=>483, 64474=>517, 64488=>278, 64489=>302, 64508=>783, 64509=>833, 64510=>278, 64511=>302, 65024=>0, 65025=>0, 65026=>0, 65027=>0, 65028=>0, + 65029=>0, 65030=>0, 65031=>0, 65032=>0, 65033=>0, 65034=>0, 65035=>0, 65036=>0, 65037=>0, 65038=>0, 65039=>0, 65136=>293, 65137=>293, 65138=>293, 65139=>262, 65140=>293, + 65142=>293, 65143=>293, 65144=>293, 65145=>293, 65146=>293, 65147=>293, 65148=>293, 65149=>293, 65150=>293, 65151=>293, 65152=>470, 65153=>278, 65154=>305, 65155=>278, 65156=>305, 65157=>483, + 65158=>517, 65159=>278, 65160=>305, 65161=>783, 65162=>833, 65163=>278, 65164=>302, 65165=>278, 65166=>305, 65167=>941, 65168=>982, 65169=>278, 65170=>302, 65171=>524, 65172=>536, 65173=>941, + 65174=>982, 65175=>278, 65176=>302, 65177=>941, 65178=>982, 65179=>278, 65180=>302, 65181=>646, 65182=>646, 65183=>618, 65184=>646, 65185=>646, 65186=>646, 65187=>618, 65188=>646, 65189=>646, + 65190=>646, 65191=>618, 65192=>646, 65193=>445, 65194=>525, 65195=>445, 65196=>525, 65197=>483, 65198=>552, 65199=>483, 65200=>552, 65201=>1221, 65202=>1275, 65203=>838, 65204=>892, 65205=>1221, + 65206=>1275, 65207=>838, 65208=>892, 65209=>1209, 65210=>1225, 65211=>849, 65212=>867, 65213=>1209, 65214=>1225, 65215=>849, 65216=>867, 65217=>925, 65218=>949, 65219=>796, 65220=>820, 65221=>925, + 65222=>949, 65223=>796, 65224=>820, 65225=>597, 65226=>532, 65227=>597, 65228=>482, 65229=>597, 65230=>532, 65231=>523, 65232=>482, 65233=>1037, 65234=>1035, 65235=>478, 65236=>506, 65237=>776, + 65238=>834, 65239=>478, 65240=>506, 65241=>824, 65242=>843, 65243=>476, 65244=>552, 65245=>727, 65246=>757, 65247=>305, 65248=>331, 65249=>619, 65250=>666, 65251=>536, 65252=>578, 65253=>734, + 65254=>761, 65255=>278, 65256=>302, 65257=>524, 65258=>536, 65259=>527, 65260=>461, 65261=>483, 65262=>517, 65263=>783, 65264=>833, 65265=>783, 65266=>833, 65267=>278, 65268=>302, 65269=>570, + 65270=>597, 65271=>570, 65272=>597, 65273=>570, 65274=>597, 65275=>570, 65276=>597, 65279=>0, 65533=>1025); +$enc=''; +$diff=''; +$file='DejaVuSans.z'; +$ctg='DejaVuSans.ctg.z'; +$originalsize=520788; +?> diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.z new file mode 100644 index 00000000..79424a78 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansb.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansb.php new file mode 100644 index 00000000..a06ae38a --- /dev/null +++ b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansb.php @@ -0,0 +1,287 @@ +928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>32,'FontBBox'=>'[-1069 -388 1975 1123]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600); +$up=-42; +$ut=44; +$cw=array( + 0=>600, 32=>348, 33=>456, 34=>521, 35=>838, 36=>696, 37=>1002, 38=>872, 39=>306, 40=>457, 41=>457, 42=>523, 43=>838, 44=>380, 45=>415, 46=>380, + 47=>365, 48=>696, 49=>696, 50=>696, 51=>696, 52=>696, 53=>696, 54=>696, 55=>696, 56=>696, 57=>696, 58=>400, 59=>400, 60=>838, 61=>838, 62=>838, + 63=>580, 64=>1000, 65=>774, 66=>762, 67=>734, 68=>830, 69=>683, 70=>683, 71=>821, 72=>837, 73=>372, 74=>372, 75=>775, 76=>637, 77=>995, 78=>837, + 79=>850, 80=>733, 81=>850, 82=>770, 83=>720, 84=>682, 85=>812, 86=>774, 87=>1103, 88=>771, 89=>724, 90=>725, 91=>457, 92=>365, 93=>457, 94=>838, + 95=>500, 96=>500, 97=>675, 98=>716, 99=>593, 100=>716, 101=>678, 102=>435, 103=>716, 104=>712, 105=>343, 106=>343, 107=>665, 108=>343, 109=>1042, 110=>712, + 111=>687, 112=>716, 113=>716, 114=>493, 115=>595, 116=>478, 117=>712, 118=>652, 119=>924, 120=>645, 121=>652, 122=>582, 123=>712, 124=>365, 125=>712, 126=>838, + 8364=>696, 1027=>637, 8218=>380, 402=>435, 8222=>657, 8230=>1000, 8224=>500, 8225=>500, 710=>500, 8240=>1440, 352=>720, 8249=>412, 338=>1167, 1036=>817, 381=>725, 1039=>837, + 8216=>380, 8217=>380, 8220=>657, 8221=>657, 8226=>639, 8211=>500, 8212=>1000, 732=>500, 8482=>1000, 353=>595, 8250=>412, 339=>1094, 1116=>679, 382=>582, 376=>724, 160=>348, + 161=>456, 162=>696, 163=>696, 164=>636, 165=>696, 166=>365, 167=>500, 168=>500, 169=>1000, 170=>564, 171=>646, 172=>838, 173=>415, 174=>1000, 175=>500, 176=>500, + 177=>838, 178=>438, 179=>438, 180=>500, 181=>736, 182=>636, 183=>380, 184=>500, 185=>438, 186=>564, 187=>646, 188=>1035, 189=>1035, 190=>1035, 191=>580, 192=>774, + 193=>774, 194=>774, 195=>774, 196=>774, 197=>774, 198=>1085, 199=>734, 200=>683, 201=>683, 202=>683, 203=>683, 204=>372, 205=>372, 206=>372, 207=>372, 208=>838, + 209=>837, 210=>850, 211=>850, 212=>850, 213=>850, 214=>850, 215=>838, 216=>850, 217=>812, 218=>812, 219=>812, 220=>812, 221=>724, 222=>738, 223=>719, 224=>675, + 225=>675, 226=>675, 227=>675, 228=>675, 229=>675, 230=>1048, 231=>593, 232=>678, 233=>678, 234=>678, 235=>678, 236=>343, 237=>343, 238=>343, 239=>343, 240=>687, + 241=>712, 242=>687, 243=>687, 244=>687, 245=>687, 246=>687, 247=>838, 248=>687, 249=>712, 250=>712, 251=>712, 252=>712, 253=>652, 254=>716, 255=>652, 256=>774, + 257=>675, 258=>774, 259=>675, 260=>774, 261=>675, 262=>734, 263=>593, 264=>734, 265=>593, 266=>734, 267=>593, 268=>734, 269=>593, 270=>830, 271=>716, 272=>838, + 273=>716, 274=>683, 275=>678, 276=>683, 277=>678, 278=>683, 279=>678, 280=>683, 281=>678, 282=>683, 283=>678, 284=>821, 285=>716, 286=>821, 287=>716, 288=>821, + 289=>716, 290=>821, 291=>716, 292=>837, 293=>712, 294=>974, 295=>790, 296=>372, 297=>343, 298=>372, 299=>343, 300=>372, 301=>343, 302=>372, 303=>343, 304=>372, + 305=>343, 306=>744, 307=>686, 308=>372, 309=>343, 310=>775, 311=>665, 312=>665, 313=>637, 314=>343, 315=>637, 316=>343, 317=>637, 318=>479, 319=>637, 320=>557, + 321=>642, 322=>371, 323=>837, 324=>712, 325=>837, 326=>712, 327=>837, 328=>712, 329=>983, 330=>837, 331=>712, 332=>850, 333=>687, 334=>850, 335=>687, 336=>850, + 337=>687, 340=>770, 341=>493, 342=>770, 343=>493, 344=>770, 345=>493, 346=>720, 347=>595, 348=>720, 349=>595, 350=>720, 351=>595, 354=>682, 355=>478, 356=>682, + 357=>478, 358=>682, 359=>478, 360=>812, 361=>712, 362=>812, 363=>712, 364=>812, 365=>712, 366=>812, 367=>712, 368=>812, 369=>712, 370=>812, 371=>712, 372=>1103, + 373=>924, 374=>724, 375=>652, 377=>725, 378=>582, 379=>725, 380=>582, 383=>435, 384=>716, 385=>811, 386=>762, 387=>716, 388=>762, 389=>716, 390=>734, 391=>734, + 392=>593, 393=>838, 394=>879, 395=>757, 396=>716, 397=>688, 398=>683, 399=>849, 400=>696, 401=>683, 403=>821, 404=>793, 405=>1045, 406=>436, 407=>389, 408=>775, + 409=>665, 410=>360, 411=>592, 412=>1042, 413=>837, 414=>712, 415=>850, 416=>874, 417=>687, 418=>1114, 419=>962, 420=>782, 421=>716, 422=>770, 423=>720, 424=>595, + 425=>683, 426=>552, 427=>478, 428=>707, 429=>478, 430=>682, 431=>835, 432=>712, 433=>769, 434=>813, 435=>797, 436=>778, 437=>725, 438=>582, 439=>772, 440=>772, + 441=>641, 442=>582, 443=>696, 444=>772, 445=>641, 446=>573, 447=>716, 448=>372, 449=>659, 450=>544, 451=>372, 452=>1555, 453=>1412, 454=>1298, 455=>1009, 456=>980, + 457=>686, 458=>1209, 459=>1180, 460=>1055, 461=>774, 462=>675, 463=>372, 464=>343, 465=>850, 466=>687, 467=>812, 468=>712, 469=>812, 470=>712, 471=>812, 472=>712, + 473=>812, 474=>712, 475=>812, 476=>712, 477=>678, 478=>774, 479=>675, 480=>774, 481=>675, 482=>1085, 483=>1048, 484=>821, 485=>716, 486=>821, 487=>716, 488=>775, + 489=>665, 490=>850, 491=>687, 492=>850, 493=>687, 494=>772, 495=>582, 496=>343, 497=>1555, 498=>1412, 499=>1298, 500=>821, 501=>716, 502=>1289, 503=>787, 504=>837, + 505=>712, 506=>774, 507=>675, 508=>1085, 509=>1048, 510=>850, 511=>687, 512=>774, 513=>675, 514=>774, 515=>675, 516=>683, 517=>678, 518=>683, 519=>678, 520=>372, + 521=>343, 522=>372, 523=>343, 524=>850, 525=>687, 526=>850, 527=>687, 528=>770, 529=>493, 530=>770, 531=>493, 532=>812, 533=>712, 534=>812, 535=>712, 536=>720, + 537=>595, 538=>682, 539=>478, 540=>690, 541=>607, 542=>837, 543=>712, 544=>837, 545=>865, 546=>809, 547=>659, 548=>725, 549=>582, 550=>774, 551=>675, 552=>683, + 553=>678, 554=>850, 555=>687, 556=>850, 557=>687, 558=>850, 559=>687, 560=>850, 561=>687, 562=>724, 563=>652, 564=>492, 565=>867, 566=>512, 567=>343, 568=>1088, + 569=>1088, 570=>774, 571=>734, 572=>593, 573=>637, 574=>682, 575=>595, 576=>582, 577=>782, 578=>614, 579=>762, 580=>812, 581=>774, 582=>683, 583=>678, 584=>372, + 585=>343, 586=>860, 587=>791, 588=>770, 589=>493, 590=>724, 591=>652, 592=>675, 593=>716, 594=>716, 595=>716, 596=>593, 597=>593, 598=>717, 599=>792, 600=>678, + 601=>678, 602=>876, 603=>557, 604=>545, 605=>815, 606=>731, 607=>343, 608=>792, 609=>716, 610=>627, 611=>735, 612=>635, 613=>712, 614=>712, 615=>712, 616=>545, + 617=>440, 618=>545, 619=>559, 620=>693, 621=>343, 622=>841, 623=>1042, 624=>1042, 625=>1042, 626=>712, 627=>793, 628=>642, 629=>687, 630=>909, 631=>681, 632=>796, + 633=>538, 634=>538, 635=>650, 636=>493, 637=>493, 638=>596, 639=>596, 640=>642, 641=>642, 642=>595, 643=>415, 644=>435, 645=>605, 646=>552, 647=>478, 648=>478, + 649=>920, 650=>769, 651=>670, 652=>652, 653=>924, 654=>652, 655=>724, 656=>694, 657=>684, 658=>641, 659=>641, 660=>573, 661=>573, 662=>573, 663=>573, 664=>850, + 665=>633, 666=>731, 667=>685, 668=>691, 669=>343, 670=>732, 671=>539, 672=>792, 673=>573, 674=>573, 675=>1156, 676=>1214, 677=>1155, 678=>974, 679=>769, 680=>929, + 681=>1026, 682=>792, 683=>780, 684=>591, 685=>415, 686=>677, 687=>789, 688=>456, 689=>456, 690=>219, 691=>315, 692=>315, 693=>315, 694=>411, 695=>591, 696=>417, + 697=>302, 698=>521, 699=>380, 700=>380, 701=>380, 702=>366, 703=>366, 704=>326, 705=>326, 706=>500, 707=>500, 708=>500, 709=>500, 711=>500, 712=>306, 713=>500, + 714=>500, 715=>500, 716=>306, 717=>500, 718=>500, 719=>500, 720=>337, 721=>337, 722=>366, 723=>366, 724=>500, 725=>500, 726=>500, 727=>500, 728=>500, 729=>500, + 730=>500, 731=>500, 733=>500, 734=>351, 735=>500, 736=>412, 737=>219, 738=>381, 739=>413, 740=>326, 741=>500, 742=>500, 743=>500, 744=>500, 745=>500, 748=>500, + 749=>500, 750=>500, 755=>500, 759=>500, 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 773=>0, 774=>0, 775=>0, 776=>0, 777=>0, 778=>0, 779=>0, + 780=>0, 781=>0, 782=>0, 783=>0, 784=>0, 785=>0, 786=>0, 787=>0, 788=>0, 789=>0, 790=>0, 791=>0, 792=>0, 793=>0, 794=>0, 795=>0, + 796=>0, 797=>0, 798=>0, 799=>0, 800=>0, 801=>0, 802=>0, 803=>0, 804=>0, 805=>0, 806=>0, 807=>0, 808=>0, 809=>0, 810=>0, 811=>0, + 812=>0, 813=>0, 814=>0, 815=>0, 816=>0, 817=>0, 818=>0, 819=>0, 820=>0, 821=>0, 822=>0, 823=>0, 824=>0, 825=>0, 826=>0, 827=>0, + 828=>0, 829=>0, 830=>0, 831=>0, 832=>0, 833=>0, 834=>0, 835=>0, 836=>0, 837=>0, 838=>0, 839=>0, 840=>0, 841=>0, 842=>0, 843=>0, + 844=>0, 845=>0, 846=>0, 847=>0, 849=>0, 850=>0, 851=>0, 855=>0, 856=>0, 860=>0, 861=>0, 862=>0, 863=>0, 864=>0, 865=>0, 866=>0, + 884=>302, 885=>302, 890=>500, 891=>593, 892=>550, 893=>549, 894=>337, 900=>441, 901=>500, 902=>797, 903=>380, 904=>846, 905=>1009, 906=>563, 908=>891, 910=>980, + 911=>894, 912=>390, 913=>774, 914=>762, 915=>637, 916=>774, 917=>683, 918=>725, 919=>837, 920=>850, 921=>372, 922=>775, 923=>774, 924=>995, 925=>837, 926=>632, + 927=>850, 928=>837, 929=>733, 931=>683, 932=>682, 933=>724, 934=>850, 935=>771, 936=>850, 937=>850, 938=>372, 939=>724, 940=>687, 941=>557, 942=>712, 943=>390, + 944=>675, 945=>687, 946=>716, 947=>681, 948=>687, 949=>557, 950=>591, 951=>712, 952=>687, 953=>390, 954=>710, 955=>633, 956=>736, 957=>681, 958=>591, 959=>687, + 960=>791, 961=>716, 962=>593, 963=>779, 964=>638, 965=>675, 966=>782, 967=>645, 968=>794, 969=>869, 970=>390, 971=>675, 972=>687, 973=>675, 974=>869, 976=>651, + 977=>661, 978=>746, 979=>981, 980=>746, 981=>796, 982=>869, 983=>744, 984=>850, 985=>687, 986=>734, 987=>593, 988=>683, 989=>494, 990=>702, 991=>660, 992=>919, + 993=>627, 994=>1093, 995=>837, 996=>832, 997=>716, 998=>928, 999=>744, 1000=>733, 1001=>650, 1002=>789, 1003=>671, 1004=>752, 1005=>716, 1006=>682, 1007=>590, 1008=>744, + 1009=>716, 1010=>593, 1011=>343, 1012=>850, 1013=>645, 1014=>644, 1015=>738, 1016=>716, 1017=>734, 1018=>995, 1019=>732, 1020=>716, 1021=>698, 1022=>734, 1023=>698, 1024=>683, + 1025=>683, 1026=>878, 1028=>734, 1029=>720, 1030=>372, 1031=>372, 1032=>372, 1033=>1154, 1034=>1130, 1035=>878, 1037=>837, 1038=>771, 1040=>774, 1041=>762, 1042=>762, 1043=>637, + 1044=>891, 1045=>683, 1046=>1224, 1047=>710, 1048=>837, 1049=>837, 1050=>817, 1051=>831, 1052=>995, 1053=>837, 1054=>850, 1055=>837, 1056=>733, 1057=>734, 1058=>682, 1059=>771, + 1060=>992, 1061=>771, 1062=>928, 1063=>808, 1064=>1235, 1065=>1326, 1066=>939, 1067=>1036, 1068=>762, 1069=>734, 1070=>1174, 1071=>770, 1072=>675, 1073=>698, 1074=>633, 1075=>522, + 1076=>808, 1077=>678, 1078=>995, 1079=>581, 1080=>701, 1081=>701, 1082=>679, 1083=>732, 1084=>817, 1085=>691, 1086=>687, 1087=>691, 1088=>716, 1089=>593, 1090=>580, 1091=>652, + 1092=>992, 1093=>645, 1094=>741, 1095=>687, 1096=>1062, 1097=>1105, 1098=>751, 1099=>904, 1100=>632, 1101=>593, 1102=>972, 1103=>642, 1104=>678, 1105=>678, 1106=>714, 1107=>522, + 1108=>593, 1109=>595, 1110=>343, 1111=>343, 1112=>343, 1113=>991, 1114=>956, 1115=>734, 1117=>701, 1118=>652, 1119=>691, 1120=>1093, 1121=>869, 1122=>840, 1123=>736, 1124=>1012, + 1125=>839, 1126=>992, 1127=>832, 1128=>1358, 1129=>1121, 1130=>850, 1131=>687, 1132=>1236, 1133=>1007, 1134=>696, 1135=>557, 1136=>1075, 1137=>1061, 1138=>850, 1139=>667, 1140=>850, + 1141=>695, 1142=>850, 1143=>695, 1144=>1148, 1145=>1043, 1146=>1074, 1147=>863, 1148=>1405, 1149=>1173, 1150=>1093, 1151=>869, 1152=>734, 1153=>593, 1154=>652, 1155=>0, 1156=>0, + 1157=>0, 1158=>0, 1160=>418, 1161=>418, 1162=>957, 1163=>807, 1164=>762, 1165=>611, 1166=>733, 1167=>716, 1168=>637, 1169=>522, 1170=>666, 1171=>543, 1172=>808, 1173=>669, + 1174=>1224, 1175=>995, 1176=>710, 1177=>581, 1178=>775, 1179=>679, 1180=>817, 1181=>679, 1182=>817, 1183=>679, 1184=>1015, 1185=>826, 1186=>956, 1187=>808, 1188=>1103, 1189=>874, + 1190=>1273, 1191=>1017, 1192=>875, 1193=>710, 1194=>734, 1195=>593, 1196=>682, 1197=>580, 1198=>724, 1199=>652, 1200=>724, 1201=>652, 1202=>771, 1203=>645, 1204=>1112, 1205=>1000, + 1206=>808, 1207=>687, 1208=>808, 1209=>687, 1210=>808, 1211=>712, 1212=>1026, 1213=>810, 1214=>1026, 1215=>810, 1216=>372, 1217=>1224, 1218=>995, 1219=>775, 1220=>630, 1221=>951, + 1222=>805, 1223=>837, 1224=>691, 1225=>957, 1226=>807, 1227=>808, 1228=>687, 1229=>1115, 1230=>933, 1231=>343, 1232=>774, 1233=>675, 1234=>774, 1235=>675, 1236=>1085, 1237=>1048, + 1238=>683, 1239=>678, 1240=>849, 1241=>678, 1242=>849, 1243=>678, 1244=>1224, 1245=>995, 1246=>710, 1247=>581, 1248=>772, 1249=>641, 1250=>837, 1251=>701, 1252=>837, 1253=>701, + 1254=>850, 1255=>687, 1256=>850, 1257=>687, 1258=>850, 1259=>687, 1260=>734, 1261=>593, 1262=>771, 1263=>652, 1264=>771, 1265=>652, 1266=>771, 1267=>652, 1268=>808, 1269=>687, + 1270=>637, 1271=>522, 1272=>1036, 1273=>904, 1274=>666, 1275=>543, 1276=>771, 1277=>645, 1278=>771, 1279=>645, 1280=>762, 1281=>608, 1282=>1159, 1283=>893, 1284=>1119, 1285=>920, + 1286=>828, 1287=>693, 1288=>1242, 1289=>1017, 1290=>1248, 1291=>1013, 1292=>839, 1293=>638, 1294=>938, 1295=>803, 1296=>696, 1297=>557, 1298=>831, 1299=>732, 1329=>984, 1330=>812, + 1331=>984, 1332=>984, 1333=>812, 1334=>777, 1335=>812, 1336=>812, 1337=>975, 1338=>984, 1339=>812, 1340=>710, 1341=>1078, 1342=>1136, 1343=>812, 1344=>710, 1345=>757, 1346=>984, + 1347=>876, 1348=>984, 1349=>793, 1350=>984, 1351=>812, 1352=>812, 1353=>812, 1354=>958, 1355=>777, 1356=>984, 1357=>812, 1358=>984, 1359=>720, 1360=>812, 1361=>793, 1362=>895, + 1363=>850, 1364=>936, 1365=>850, 1366=>720, 1369=>366, 1370=>380, 1371=>550, 1372=>550, 1373=>380, 1374=>546, 1375=>521, 1377=>1042, 1378=>712, 1379=>866, 1380=>868, 1381=>712, + 1382=>817, 1383=>653, 1384=>712, 1385=>811, 1386=>817, 1387=>712, 1388=>498, 1389=>1018, 1390=>716, 1391=>712, 1392=>712, 1393=>716, 1394=>819, 1395=>712, 1396=>751, 1397=>343, + 1398=>882, 1399=>559, 1400=>712, 1401=>559, 1402=>1042, 1403=>559, 1404=>863, 1405=>712, 1406=>813, 1407=>1042, 1408=>712, 1409=>716, 1410=>571, 1411=>1042, 1412=>778, 1413=>687, + 1414=>720, 1415=>862, 1417=>400, 1418=>487, 1456=>0, 1457=>0, 1458=>0, 1459=>0, 1460=>0, 1461=>0, 1462=>0, 1463=>0, 1464=>0, 1465=>0, 1467=>0, 1468=>0, + 1469=>0, 1471=>0, 1472=>372, 1473=>0, 1474=>0, 1475=>372, 1478=>532, 1479=>0, 1488=>751, 1489=>731, 1490=>537, 1491=>684, 1492=>778, 1493=>372, 1494=>521, 1495=>778, + 1496=>770, 1497=>372, 1498=>778, 1499=>750, 1500=>718, 1501=>778, 1502=>856, 1503=>372, 1504=>532, 1505=>855, 1506=>720, 1507=>802, 1508=>777, 1509=>628, 1510=>751, 1511=>803, + 1512=>778, 1513=>963, 1514=>822, 1520=>692, 1521=>692, 1522=>692, 1548=>380, 1557=>0, 1563=>400, 1567=>580, 1569=>511, 1570=>343, 1571=>343, 1572=>622, 1573=>343, 1574=>917, + 1575=>343, 1576=>1005, 1577=>590, 1578=>1005, 1579=>1005, 1580=>721, 1581=>721, 1582=>721, 1583=>513, 1584=>513, 1585=>576, 1586=>576, 1587=>1380, 1588=>1380, 1589=>1345, 1590=>1345, + 1591=>1039, 1592=>1039, 1593=>683, 1594=>683, 1600=>342, 1601=>1162, 1602=>894, 1603=>917, 1604=>868, 1605=>733, 1606=>854, 1607=>590, 1608=>622, 1609=>917, 1610=>917, 1611=>0, + 1612=>0, 1613=>0, 1614=>0, 1615=>0, 1616=>0, 1617=>0, 1618=>0, 1619=>0, 1620=>0, 1621=>0, 1626=>500, 1632=>610, 1633=>610, 1634=>610, 1635=>610, 1636=>610, + 1637=>610, 1638=>610, 1639=>610, 1640=>610, 1641=>610, 1642=>610, 1643=>374, 1644=>380, 1645=>545, 1646=>1005, 1647=>894, 1652=>292, 1657=>1005, 1658=>1005, 1659=>1005, 1660=>1005, + 1661=>1005, 1662=>1005, 1663=>1005, 1664=>1005, 1665=>721, 1666=>721, 1667=>721, 1668=>721, 1669=>721, 1670=>721, 1671=>721, 1681=>576, 1682=>576, 1685=>681, 1688=>576, 1697=>1162, + 1700=>1162, 1702=>1162, 1705=>1024, 1711=>1024, 1717=>868, 1722=>854, 1727=>721, 1734=>622, 1740=>917, 1742=>917, 1749=>590, 1776=>610, 1777=>610, 1778=>610, 1779=>610, 1780=>610, + 1781=>610, 1782=>610, 1783=>610, 1784=>610, 1785=>610, 3647=>743, 3713=>790, 3714=>748, 3716=>749, 3719=>569, 3720=>742, 3722=>744, 3725=>761, 3732=>706, 3733=>704, 3734=>747, + 3735=>819, 3737=>730, 3738=>727, 3739=>727, 3740=>922, 3741=>827, 3742=>866, 3743=>866, 3745=>836, 3746=>761, 3747=>770, 3749=>769, 3751=>713, 3754=>827, 3755=>1031, 3757=>724, + 3758=>784, 3759=>934, 3760=>688, 3761=>0, 3762=>610, 3763=>610, 3764=>0, 3765=>0, 3766=>0, 3767=>0, 3768=>0, 3769=>0, 3771=>0, 3772=>0, 3773=>670, 3776=>516, + 3777=>860, 3778=>516, 3779=>650, 3780=>632, 3782=>759, 3784=>0, 3785=>0, 3786=>0, 3787=>0, 3788=>0, 3789=>0, 3804=>1363, 3805=>1363, 5121=>774, 5122=>774, 5123=>774, + 5124=>774, 5125=>905, 5126=>905, 5127=>905, 5129=>905, 5130=>905, 5131=>905, 5132=>1018, 5133=>1009, 5134=>1018, 5135=>1009, 5136=>1018, 5137=>1009, 5138=>1149, 5139=>1140, 5140=>1149, + 5141=>1140, 5142=>905, 5143=>1149, 5144=>1142, 5145=>1149, 5146=>1142, 5147=>905, 5149=>310, 5150=>529, 5151=>425, 5152=>425, 5153=>395, 5154=>395, 5155=>395, 5156=>395, 5157=>564, + 5158=>470, 5159=>310, 5160=>395, 5161=>395, 5162=>395, 5163=>1213, 5164=>986, 5165=>1216, 5166=>1297, 5167=>774, 5168=>774, 5169=>774, 5170=>774, 5171=>886, 5172=>886, 5173=>886, + 5175=>886, 5176=>886, 5177=>886, 5178=>1018, 5179=>1009, 5180=>1018, 5181=>1009, 5182=>1018, 5183=>1009, 5184=>1149, 5185=>1140, 5186=>1149, 5187=>1140, 5188=>1149, 5189=>1142, 5190=>1149, + 5191=>1142, 5192=>886, 5193=>576, 5194=>229, 5196=>812, 5197=>812, 5198=>812, 5199=>812, 5200=>815, 5201=>815, 5202=>815, 5204=>815, 5205=>815, 5206=>815, 5207=>1056, 5208=>1048, + 5209=>1056, 5210=>1048, 5211=>1056, 5212=>1048, 5213=>1060, 5214=>1054, 5215=>1060, 5216=>1054, 5217=>1060, 5218=>1052, 5219=>1060, 5220=>1052, 5221=>1060, 5222=>483, 5223=>1005, 5224=>1005, + 5225=>1023, 5226=>1017, 5227=>743, 5228=>743, 5229=>743, 5230=>743, 5231=>743, 5232=>755, 5233=>743, 5234=>743, 5235=>743, 5236=>1029, 5237=>975, 5238=>980, 5239=>975, 5240=>980, + 5241=>975, 5242=>1029, 5243=>975, 5244=>1029, 5245=>975, 5246=>980, 5247=>975, 5248=>980, 5249=>975, 5250=>980, 5251=>501, 5252=>501, 5253=>938, 5254=>938, 5255=>938, 5256=>938, + 5257=>743, 5258=>743, 5259=>743, 5260=>743, 5261=>743, 5262=>755, 5263=>743, 5264=>743, 5265=>743, 5266=>1029, 5267=>975, 5268=>1029, 5269=>975, 5270=>1029, 5271=>975, 5272=>1029, + 5273=>975, 5274=>1029, 5275=>975, 5276=>1029, 5277=>975, 5278=>1029, 5279=>975, 5280=>1029, 5281=>501, 5282=>501, 5283=>626, 5284=>626, 5285=>626, 5286=>626, 5287=>626, 5288=>667, + 5289=>626, 5290=>626, 5291=>626, 5292=>881, 5293=>854, 5294=>863, 5295=>874, 5296=>863, 5297=>874, 5298=>881, 5299=>874, 5300=>881, 5301=>874, 5302=>863, 5303=>874, 5304=>863, + 5305=>874, 5306=>863, 5307=>436, 5308=>548, 5309=>436, 5312=>988, 5313=>988, 5314=>988, 5315=>988, 5316=>931, 5317=>931, 5318=>931, 5319=>931, 5320=>931, 5321=>1238, 5322=>1247, + 5323=>1200, 5324=>1228, 5325=>1200, 5326=>1228, 5327=>931, 5328=>660, 5329=>497, 5330=>660, 5331=>988, 5332=>988, 5333=>988, 5334=>988, 5335=>931, 5336=>931, 5337=>931, 5338=>931, + 5339=>931, 5340=>1231, 5341=>1247, 5342=>1283, 5343=>1228, 5344=>1283, 5345=>1228, 5346=>1228, 5347=>1214, 5348=>1228, 5349=>1214, 5350=>1283, 5351=>1228, 5352=>1283, 5353=>1228, 5354=>660, + 5356=>886, 5357=>730, 5358=>730, 5359=>730, 5360=>730, 5361=>730, 5362=>755, 5363=>730, 5364=>730, 5365=>730, 5366=>998, 5367=>958, 5368=>967, 5369=>989, 5370=>967, 5371=>989, + 5372=>998, 5373=>958, 5374=>998, 5375=>958, 5376=>967, 5377=>989, 5378=>967, 5379=>989, 5380=>967, 5381=>493, 5382=>460, 5383=>493, 5392=>923, 5393=>923, 5394=>923, 5395=>1136, + 5396=>1136, 5397=>1136, 5398=>1136, 5399=>1209, 5400=>1202, 5401=>1209, 5402=>1202, 5403=>1209, 5404=>1202, 5405=>1431, 5406=>1420, 5407=>1431, 5408=>1420, 5409=>1431, 5410=>1420, 5411=>1431, + 5412=>1420, 5413=>746, 5414=>776, 5415=>776, 5416=>776, 5417=>776, 5418=>776, 5419=>776, 5420=>776, 5421=>776, 5422=>776, 5423=>1003, 5424=>1003, 5425=>1013, 5426=>996, 5427=>1013, + 5428=>996, 5429=>1003, 5430=>1003, 5431=>1003, 5432=>1003, 5433=>1013, 5434=>996, 5435=>1013, 5436=>996, 5437=>1013, 5438=>495, 5440=>395, 5441=>510, 5442=>1033, 5443=>1033, 5444=>976, + 5445=>976, 5446=>976, 5447=>976, 5448=>733, 5449=>733, 5450=>733, 5451=>733, 5452=>733, 5453=>733, 5454=>1003, 5455=>959, 5456=>495, 5458=>886, 5459=>774, 5460=>774, 5461=>774, + 5462=>774, 5463=>928, 5464=>928, 5465=>928, 5466=>928, 5467=>1172, 5468=>1142, 5469=>602, 5470=>812, 5471=>812, 5472=>812, 5473=>812, 5474=>812, 5475=>812, 5476=>815, 5477=>815, + 5478=>815, 5479=>815, 5480=>1060, 5481=>1052, 5482=>548, 5492=>977, 5493=>977, 5494=>977, 5495=>977, 5496=>977, 5497=>977, 5498=>977, 5499=>618, 5500=>837, 5501=>510, 5502=>1238, + 5503=>1238, 5504=>1238, 5505=>1238, 5506=>1238, 5507=>1238, 5508=>1238, 5509=>989, 5514=>977, 5515=>977, 5516=>977, 5517=>977, 5518=>1591, 5519=>1591, 5520=>1591, 5521=>1295, 5522=>1295, + 5523=>1591, 5524=>1591, 5525=>848, 5526=>1273, 5536=>988, 5537=>988, 5538=>931, 5539=>931, 5540=>931, 5541=>931, 5542=>660, 5543=>776, 5544=>776, 5545=>776, 5546=>776, 5547=>776, + 5548=>776, 5549=>776, 5550=>495, 5551=>743, 5598=>830, 5601=>830, 5702=>496, 5703=>496, 5742=>413, 5743=>1238, 5744=>1591, 5745=>2016, 5746=>2016, 5747=>1720, 5748=>1678, 5749=>2016, + 5750=>2016, 7424=>652, 7425=>833, 7426=>1048, 7427=>608, 7428=>593, 7429=>676, 7430=>676, 7431=>559, 7432=>557, 7433=>343, 7434=>494, 7435=>665, 7436=>539, 7437=>817, 7438=>701, + 7439=>687, 7440=>593, 7441=>660, 7442=>660, 7443=>660, 7444=>1094, 7446=>687, 7447=>687, 7448=>556, 7449=>642, 7450=>642, 7451=>580, 7452=>634, 7453=>737, 7454=>948, 7455=>695, + 7456=>652, 7457=>924, 7458=>582, 7459=>646, 7462=>539, 7463=>652, 7464=>691, 7465=>556, 7466=>781, 7467=>732, 7468=>487, 7469=>683, 7470=>480, 7472=>523, 7473=>430, 7474=>430, + 7475=>517, 7476=>527, 7477=>234, 7478=>234, 7479=>488, 7480=>401, 7481=>626, 7482=>527, 7483=>527, 7484=>535, 7485=>509, 7486=>461, 7487=>485, 7488=>430, 7489=>511, 7490=>695, + 7491=>458, 7492=>458, 7493=>479, 7494=>712, 7495=>479, 7496=>479, 7497=>479, 7498=>479, 7499=>386, 7500=>386, 7501=>479, 7502=>219, 7503=>487, 7504=>664, 7505=>456, 7506=>488, + 7507=>414, 7508=>488, 7509=>488, 7510=>479, 7511=>388, 7512=>456, 7513=>462, 7514=>664, 7515=>501, 7517=>451, 7518=>429, 7519=>433, 7520=>493, 7521=>406, 7522=>219, 7523=>315, + 7524=>456, 7525=>501, 7526=>451, 7527=>429, 7528=>433, 7529=>493, 7530=>406, 7543=>716, 7544=>527, 7547=>545, 7557=>514, 7579=>479, 7580=>414, 7581=>414, 7582=>488, 7583=>386, + 7584=>377, 7585=>348, 7586=>479, 7587=>456, 7588=>347, 7589=>281, 7590=>347, 7591=>347, 7592=>431, 7593=>326, 7594=>330, 7595=>370, 7596=>664, 7597=>664, 7598=>562, 7599=>562, + 7600=>448, 7601=>488, 7602=>542, 7603=>422, 7604=>396, 7605=>388, 7606=>583, 7607=>494, 7608=>399, 7609=>451, 7610=>501, 7611=>417, 7612=>523, 7613=>470, 7614=>455, 7615=>425, + 7620=>0, 7621=>0, 7622=>0, 7623=>0, 7624=>0, 7625=>0, 7680=>774, 7681=>675, 7682=>762, 7683=>716, 7684=>762, 7685=>716, 7686=>762, 7687=>716, 7688=>734, 7689=>593, + 7690=>830, 7691=>716, 7692=>830, 7693=>716, 7694=>830, 7695=>716, 7696=>830, 7697=>716, 7698=>830, 7699=>716, 7700=>683, 7701=>678, 7702=>683, 7703=>678, 7704=>683, 7705=>678, + 7706=>683, 7707=>678, 7708=>683, 7709=>678, 7710=>683, 7711=>435, 7712=>821, 7713=>716, 7714=>837, 7715=>712, 7716=>837, 7717=>712, 7718=>837, 7719=>712, 7720=>837, 7721=>712, + 7722=>837, 7723=>712, 7724=>372, 7725=>343, 7726=>372, 7727=>343, 7728=>775, 7729=>665, 7730=>775, 7731=>665, 7732=>775, 7733=>665, 7734=>637, 7735=>343, 7736=>637, 7737=>343, + 7738=>637, 7739=>343, 7740=>637, 7741=>343, 7742=>995, 7743=>1042, 7744=>995, 7745=>1042, 7746=>995, 7747=>1042, 7748=>837, 7749=>712, 7750=>837, 7751=>712, 7752=>837, 7753=>712, + 7754=>837, 7755=>712, 7756=>850, 7757=>687, 7758=>850, 7759=>687, 7760=>850, 7761=>687, 7762=>850, 7763=>687, 7764=>733, 7765=>716, 7766=>733, 7767=>716, 7768=>770, 7769=>493, + 7770=>770, 7771=>493, 7772=>770, 7773=>493, 7774=>770, 7775=>493, 7776=>720, 7777=>595, 7778=>720, 7779=>595, 7780=>720, 7781=>595, 7782=>720, 7783=>595, 7784=>720, 7785=>595, + 7786=>682, 7787=>478, 7788=>682, 7789=>478, 7790=>682, 7791=>478, 7792=>682, 7793=>478, 7794=>812, 7795=>712, 7796=>812, 7797=>712, 7798=>812, 7799=>712, 7800=>812, 7801=>712, + 7802=>812, 7803=>712, 7804=>774, 7805=>652, 7806=>774, 7807=>652, 7808=>1103, 7809=>924, 7810=>1103, 7811=>924, 7812=>1103, 7813=>924, 7814=>1103, 7815=>924, 7816=>1103, 7817=>924, + 7818=>771, 7819=>645, 7820=>771, 7821=>645, 7822=>724, 7823=>652, 7824=>725, 7825=>582, 7826=>725, 7827=>582, 7828=>725, 7829=>582, 7830=>712, 7831=>478, 7832=>924, 7833=>652, + 7834=>675, 7835=>435, 7840=>774, 7841=>675, 7842=>774, 7843=>675, 7844=>774, 7845=>675, 7846=>774, 7847=>675, 7848=>774, 7849=>675, 7850=>774, 7851=>675, 7852=>774, 7853=>675, + 7854=>774, 7855=>675, 7856=>774, 7857=>675, 7858=>774, 7859=>675, 7860=>774, 7861=>675, 7862=>774, 7863=>675, 7864=>683, 7865=>678, 7866=>683, 7867=>678, 7868=>683, 7869=>678, + 7870=>683, 7871=>678, 7872=>683, 7873=>678, 7874=>683, 7875=>678, 7876=>683, 7877=>678, 7878=>683, 7879=>678, 7880=>372, 7881=>343, 7882=>372, 7883=>343, 7884=>850, 7885=>687, + 7886=>850, 7887=>687, 7888=>850, 7889=>687, 7890=>850, 7891=>687, 7892=>850, 7893=>687, 7894=>850, 7895=>687, 7896=>850, 7897=>687, 7898=>874, 7899=>687, 7900=>874, 7901=>687, + 7902=>874, 7903=>687, 7904=>874, 7905=>687, 7906=>874, 7907=>687, 7908=>812, 7909=>712, 7910=>812, 7911=>712, 7912=>835, 7913=>712, 7914=>835, 7915=>712, 7916=>835, 7917=>712, + 7918=>835, 7919=>712, 7920=>835, 7921=>712, 7922=>724, 7923=>652, 7924=>724, 7925=>652, 7926=>724, 7927=>652, 7928=>724, 7929=>652, 7936=>687, 7937=>687, 7938=>687, 7939=>687, + 7940=>687, 7941=>687, 7942=>687, 7943=>687, 7944=>774, 7945=>774, 7946=>1041, 7947=>1043, 7948=>935, 7949=>963, 7950=>835, 7951=>859, 7952=>557, 7953=>557, 7954=>557, 7955=>557, + 7956=>557, 7957=>557, 7960=>792, 7961=>794, 7962=>1100, 7963=>1096, 7964=>1023, 7965=>1052, 7968=>712, 7969=>712, 7970=>712, 7971=>712, 7972=>712, 7973=>712, 7974=>712, 7975=>712, + 7976=>945, 7977=>951, 7978=>1250, 7979=>1250, 7980=>1180, 7981=>1206, 7982=>1054, 7983=>1063, 7984=>390, 7985=>390, 7986=>390, 7987=>390, 7988=>390, 7989=>390, 7990=>390, 7991=>390, + 7992=>483, 7993=>489, 7994=>777, 7995=>785, 7996=>712, 7997=>738, 7998=>604, 7999=>604, 8000=>687, 8001=>687, 8002=>687, 8003=>687, 8004=>687, 8005=>687, 8008=>892, 8009=>933, + 8010=>1221, 8011=>1224, 8012=>1053, 8013=>1082, 8016=>675, 8017=>675, 8018=>675, 8019=>675, 8020=>675, 8021=>675, 8022=>675, 8023=>675, 8025=>930, 8027=>1184, 8029=>1199, 8031=>1049, + 8032=>869, 8033=>869, 8034=>869, 8035=>869, 8036=>869, 8037=>869, 8038=>869, 8039=>869, 8040=>909, 8041=>958, 8042=>1246, 8043=>1251, 8044=>1076, 8045=>1105, 8046=>1028, 8047=>1076, + 8048=>687, 8049=>687, 8050=>557, 8051=>557, 8052=>712, 8053=>712, 8054=>390, 8055=>390, 8056=>687, 8057=>687, 8058=>675, 8059=>675, 8060=>869, 8061=>869, 8064=>687, 8065=>687, + 8066=>687, 8067=>687, 8068=>687, 8069=>687, 8070=>687, 8071=>687, 8072=>774, 8073=>774, 8074=>1041, 8075=>1043, 8076=>935, 8077=>963, 8078=>835, 8079=>859, 8080=>712, 8081=>712, + 8082=>712, 8083=>712, 8084=>712, 8085=>712, 8086=>712, 8087=>712, 8088=>945, 8089=>951, 8090=>1250, 8091=>1250, 8092=>1180, 8093=>1206, 8094=>1054, 8095=>1063, 8096=>869, 8097=>869, + 8098=>869, 8099=>869, 8100=>869, 8101=>869, 8102=>869, 8103=>869, 8104=>909, 8105=>958, 8106=>1246, 8107=>1251, 8108=>1076, 8109=>1105, 8110=>1028, 8111=>1076, 8112=>687, 8113=>687, + 8114=>687, 8115=>687, 8116=>687, 8118=>687, 8119=>687, 8120=>774, 8121=>774, 8122=>876, 8123=>797, 8124=>774, 8125=>500, 8126=>500, 8127=>500, 8128=>500, 8129=>500, 8130=>712, + 8131=>712, 8132=>712, 8134=>712, 8135=>712, 8136=>929, 8137=>846, 8138=>1080, 8139=>1009, 8140=>837, 8141=>500, 8142=>500, 8143=>500, 8144=>390, 8145=>390, 8146=>390, 8147=>390, + 8150=>390, 8151=>390, 8152=>372, 8153=>372, 8154=>621, 8155=>563, 8157=>500, 8158=>500, 8159=>500, 8160=>675, 8161=>675, 8162=>675, 8163=>675, 8164=>716, 8165=>716, 8166=>675, + 8167=>675, 8168=>724, 8169=>724, 8170=>1020, 8171=>980, 8172=>838, 8173=>500, 8174=>500, 8175=>500, 8178=>869, 8179=>869, 8180=>869, 8182=>869, 8183=>869, 8184=>1065, 8185=>891, + 8186=>1084, 8187=>894, 8188=>850, 8189=>500, 8190=>500, 8192=>500, 8193=>1000, 8194=>500, 8195=>1000, 8196=>330, 8197=>250, 8198=>167, 8199=>696, 8200=>380, 8201=>200, 8202=>100, + 8203=>0, 8204=>0, 8205=>0, 8206=>0, 8207=>0, 8208=>415, 8209=>415, 8210=>696, 8213=>1000, 8214=>500, 8215=>500, 8219=>380, 8223=>657, 8227=>639, 8228=>333, 8229=>667, + 8231=>348, 8234=>0, 8235=>0, 8236=>0, 8237=>0, 8238=>0, 8239=>200, 8241=>1887, 8242=>264, 8243=>447, 8244=>630, 8245=>264, 8246=>447, 8247=>630, 8248=>733, 8251=>972, + 8252=>627, 8253=>580, 8254=>500, 8255=>828, 8256=>828, 8257=>329, 8258=>1023, 8259=>500, 8260=>456, 8261=>457, 8262=>457, 8263=>1030, 8264=>829, 8265=>829, 8266=>513, 8267=>636, + 8268=>500, 8269=>500, 8270=>523, 8271=>400, 8272=>828, 8273=>523, 8274=>556, 8275=>838, 8276=>828, 8277=>838, 8278=>684, 8279=>813, 8280=>838, 8281=>838, 8282=>380, 8283=>872, + 8284=>838, 8285=>380, 8286=>380, 8287=>222, 8288=>0, 8289=>0, 8290=>0, 8291=>0, 8298=>0, 8299=>0, 8300=>0, 8301=>0, 8302=>0, 8303=>0, 8304=>438, 8305=>219, + 8308=>438, 8309=>438, 8310=>438, 8311=>438, 8312=>438, 8313=>438, 8314=>528, 8315=>528, 8316=>528, 8317=>288, 8318=>288, 8319=>456, 8320=>438, 8321=>438, 8322=>438, 8323=>438, + 8324=>438, 8325=>438, 8326=>438, 8327=>438, 8328=>438, 8329=>438, 8330=>528, 8331=>528, 8332=>528, 8333=>288, 8334=>288, 8336=>458, 8337=>479, 8338=>488, 8339=>413, 8340=>479, + 8352=>929, 8353=>696, 8354=>696, 8355=>696, 8356=>696, 8357=>1042, 8358=>837, 8359=>1518, 8360=>1205, 8361=>1103, 8362=>904, 8363=>696, 8365=>696, 8366=>682, 8367=>1392, 8368=>696, + 8369=>696, 8370=>696, 8371=>696, 8372=>859, 8373=>696, 8400=>0, 8401=>0, 8406=>0, 8407=>0, 8448=>1120, 8449=>1170, 8450=>734, 8451=>1211, 8452=>896, 8453=>1091, 8454=>1144, + 8455=>614, 8456=>698, 8457=>1086, 8459=>1073, 8460=>913, 8461=>850, 8462=>712, 8463=>712, 8464=>604, 8465=>694, 8466=>868, 8467=>472, 8468=>974, 8469=>837, 8470=>1203, 8471=>1000, + 8472=>697, 8473=>702, 8474=>850, 8475=>876, 8476=>814, 8477=>792, 8478=>896, 8479=>710, 8480=>1020, 8481=>1281, 8483=>755, 8484=>725, 8485=>578, 8486=>850, 8487=>769, 8488=>763, + 8489=>338, 8490=>775, 8491=>774, 8492=>928, 8493=>776, 8494=>854, 8495=>636, 8496=>738, 8497=>811, 8498=>683, 8499=>1193, 8500=>465, 8501=>794, 8502=>736, 8503=>503, 8504=>695, + 8505=>380, 8506=>945, 8507=>1348, 8508=>790, 8509=>737, 8510=>652, 8511=>845, 8512=>840, 8513=>775, 8514=>557, 8515=>637, 8516=>760, 8517=>830, 8518=>716, 8519=>678, 8520=>343, + 8521=>343, 8523=>872, 8526=>547, 8531=>1035, 8532=>1035, 8533=>1035, 8534=>1035, 8535=>1035, 8536=>1035, 8537=>1035, 8538=>1035, 8539=>1035, 8540=>1035, 8541=>1035, 8542=>1035, 8543=>615, + 8544=>372, 8545=>659, 8546=>945, 8547=>1099, 8548=>774, 8549=>1099, 8550=>1386, 8551=>1672, 8552=>1121, 8553=>771, 8554=>1120, 8555=>1407, 8556=>637, 8557=>734, 8558=>830, 8559=>995, + 8560=>343, 8561=>607, 8562=>872, 8563=>984, 8564=>652, 8565=>962, 8566=>1227, 8567=>1491, 8568=>969, 8569=>645, 8570=>969, 8571=>1233, 8572=>343, 8573=>593, 8574=>716, 8575=>1042, + 8576=>1289, 8577=>830, 8578=>1289, 8579=>734, 8580=>593, 8592=>838, 8593=>838, 8594=>838, 8595=>838, 8596=>838, 8597=>838, 8598=>838, 8599=>838, 8600=>838, 8601=>838, 8602=>838, + 8603=>838, 8604=>838, 8605=>838, 8606=>838, 8607=>838, 8608=>838, 8609=>838, 8610=>838, 8611=>838, 8612=>838, 8613=>838, 8614=>838, 8615=>838, 8616=>838, 8617=>838, 8618=>838, + 8619=>838, 8620=>838, 8621=>838, 8622=>838, 8623=>838, 8624=>838, 8625=>838, 8626=>838, 8627=>838, 8628=>838, 8629=>838, 8630=>838, 8631=>838, 8632=>838, 8633=>838, 8634=>838, + 8635=>838, 8636=>838, 8637=>838, 8638=>838, 8639=>838, 8640=>838, 8641=>838, 8642=>838, 8643=>838, 8644=>838, 8645=>838, 8646=>838, 8647=>838, 8648=>838, 8649=>838, 8650=>838, + 8651=>838, 8652=>838, 8653=>838, 8654=>838, 8655=>838, 8656=>838, 8657=>838, 8658=>838, 8659=>838, 8660=>838, 8661=>838, 8662=>838, 8663=>838, 8664=>838, 8665=>838, 8666=>838, + 8667=>838, 8668=>838, 8669=>838, 8670=>838, 8671=>838, 8672=>838, 8673=>838, 8674=>838, 8675=>838, 8676=>838, 8677=>838, 8678=>838, 8679=>838, 8680=>838, 8681=>838, 8682=>838, + 8683=>838, 8684=>838, 8685=>838, 8686=>838, 8687=>838, 8688=>838, 8689=>838, 8690=>838, 8691=>838, 8692=>838, 8693=>838, 8694=>838, 8695=>838, 8696=>838, 8697=>838, 8698=>838, + 8699=>838, 8700=>838, 8701=>838, 8702=>838, 8703=>838, 8704=>774, 8705=>696, 8706=>544, 8707=>683, 8708=>683, 8709=>856, 8710=>697, 8711=>697, 8712=>896, 8713=>896, 8714=>750, + 8715=>896, 8716=>896, 8717=>750, 8718=>636, 8719=>787, 8720=>787, 8721=>718, 8722=>838, 8723=>838, 8724=>696, 8725=>167, 8726=>696, 8727=>838, 8728=>626, 8729=>380, 8730=>667, + 8731=>667, 8732=>667, 8733=>669, 8734=>833, 8735=>838, 8736=>896, 8737=>896, 8738=>838, 8739=>500, 8740=>500, 8741=>500, 8742=>500, 8743=>812, 8744=>812, 8745=>812, 8746=>812, + 8747=>610, 8748=>929, 8749=>1295, 8750=>563, 8751=>977, 8752=>1313, 8753=>563, 8754=>563, 8755=>563, 8756=>696, 8757=>696, 8758=>294, 8759=>696, 8760=>838, 8761=>838, 8762=>838, + 8763=>838, 8764=>838, 8765=>838, 8766=>838, 8767=>838, 8768=>375, 8769=>838, 8770=>838, 8771=>838, 8772=>838, 8773=>838, 8774=>838, 8775=>838, 8776=>838, 8777=>838, 8778=>838, + 8779=>838, 8780=>838, 8781=>838, 8782=>838, 8783=>838, 8784=>838, 8785=>838, 8786=>838, 8787=>838, 8788=>1063, 8789=>1063, 8790=>838, 8791=>838, 8792=>838, 8793=>838, 8794=>838, + 8795=>838, 8796=>838, 8797=>838, 8798=>838, 8799=>838, 8800=>838, 8801=>838, 8802=>838, 8803=>838, 8804=>838, 8805=>838, 8806=>838, 8807=>838, 8808=>841, 8809=>841, 8810=>1047, + 8811=>1047, 8812=>500, 8813=>838, 8814=>838, 8815=>838, 8816=>838, 8817=>838, 8818=>838, 8819=>838, 8820=>838, 8821=>838, 8822=>838, 8823=>838, 8824=>838, 8825=>838, 8826=>838, + 8827=>838, 8828=>838, 8829=>838, 8830=>838, 8831=>838, 8832=>838, 8833=>838, 8834=>838, 8835=>838, 8836=>838, 8837=>838, 8838=>838, 8839=>838, 8840=>838, 8841=>838, 8842=>838, + 8843=>838, 8844=>812, 8845=>812, 8846=>812, 8847=>838, 8848=>838, 8849=>838, 8850=>838, 8851=>754, 8852=>754, 8853=>838, 8854=>838, 8855=>838, 8856=>838, 8857=>838, 8858=>838, + 8859=>838, 8860=>838, 8861=>838, 8862=>838, 8863=>838, 8864=>838, 8865=>838, 8866=>914, 8867=>914, 8868=>914, 8869=>914, 8870=>542, 8871=>542, 8872=>914, 8873=>914, 8874=>914, + 8875=>914, 8876=>914, 8877=>914, 8878=>914, 8879=>914, 8882=>838, 8883=>838, 8884=>838, 8885=>838, 8886=>1000, 8887=>1000, 8888=>838, 8889=>838, 8890=>542, 8891=>812, 8892=>812, + 8893=>812, 8896=>843, 8897=>843, 8898=>843, 8899=>843, 8900=>494, 8901=>380, 8902=>626, 8904=>1000, 8905=>1000, 8906=>1000, 8907=>1000, 8908=>1000, 8909=>838, 8918=>838, 8919=>838, + 8920=>1422, 8921=>1422, 8922=>838, 8923=>838, 8924=>838, 8925=>838, 8926=>838, 8927=>838, 8928=>838, 8929=>838, 8930=>838, 8931=>838, 8932=>838, 8933=>838, 8934=>838, 8935=>838, + 8936=>838, 8937=>838, 8938=>838, 8939=>838, 8940=>838, 8941=>838, 8946=>1158, 8947=>896, 8948=>750, 8949=>896, 8950=>896, 8951=>750, 8952=>896, 8953=>896, 8954=>1158, 8955=>896, + 8956=>750, 8957=>896, 8958=>750, 8959=>896, 8962=>716, 8966=>917, 8968=>457, 8969=>457, 8970=>457, 8971=>457, 8976=>838, 8977=>539, 8984=>928, 8985=>838, 8992=>610, 8993=>610, + 8997=>1000, 9000=>1443, 9085=>863, 9115=>500, 9116=>500, 9117=>500, 9118=>500, 9119=>500, 9120=>500, 9121=>500, 9122=>500, 9123=>500, 9124=>500, 9125=>500, 9126=>500, 9127=>750, + 9128=>750, 9129=>750, 9130=>750, 9131=>750, 9132=>750, 9133=>750, 9134=>610, 9166=>838, 9167=>945, 9250=>716, 9251=>716, 9312=>847, 9313=>847, 9314=>847, 9315=>847, 9316=>847, + 9317=>847, 9318=>847, 9319=>847, 9320=>847, 9321=>847, 9600=>769, 9601=>769, 9602=>769, 9603=>769, 9604=>769, 9605=>769, 9606=>769, 9607=>769, 9608=>769, 9609=>769, 9610=>769, + 9611=>769, 9612=>769, 9613=>769, 9614=>769, 9615=>769, 9616=>769, 9617=>769, 9618=>769, 9619=>769, 9620=>769, 9621=>769, 9622=>769, 9623=>769, 9624=>769, 9625=>769, 9626=>769, + 9627=>769, 9628=>769, 9629=>769, 9630=>769, 9631=>769, 9632=>945, 9633=>945, 9634=>945, 9635=>945, 9636=>945, 9637=>945, 9638=>945, 9639=>945, 9640=>945, 9641=>945, 9642=>678, + 9643=>678, 9644=>945, 9645=>945, 9646=>550, 9647=>550, 9648=>769, 9649=>769, 9650=>769, 9651=>769, 9652=>502, 9653=>502, 9654=>769, 9655=>769, 9656=>502, 9657=>502, 9658=>769, + 9659=>769, 9660=>769, 9661=>769, 9662=>502, 9663=>502, 9664=>769, 9665=>769, 9666=>502, 9667=>502, 9668=>769, 9669=>769, 9670=>769, 9671=>769, 9672=>769, 9673=>873, 9674=>494, + 9675=>873, 9676=>873, 9677=>873, 9678=>873, 9679=>873, 9680=>873, 9681=>873, 9682=>873, 9683=>873, 9684=>873, 9685=>873, 9686=>527, 9687=>527, 9688=>840, 9689=>970, 9690=>970, + 9691=>970, 9692=>387, 9693=>387, 9694=>387, 9695=>387, 9696=>769, 9697=>769, 9698=>769, 9699=>769, 9700=>769, 9701=>769, 9702=>639, 9703=>945, 9704=>945, 9705=>945, 9706=>945, + 9707=>945, 9708=>769, 9709=>769, 9710=>769, 9711=>1119, 9712=>945, 9713=>945, 9714=>945, 9715=>945, 9716=>873, 9717=>873, 9718=>873, 9719=>873, 9720=>769, 9721=>769, 9722=>769, + 9723=>830, 9724=>830, 9725=>732, 9726=>732, 9727=>769, 9728=>896, 9729=>1000, 9730=>896, 9731=>896, 9732=>896, 9733=>896, 9734=>896, 9735=>573, 9736=>896, 9737=>896, 9738=>888, + 9739=>888, 9740=>671, 9741=>1013, 9742=>1246, 9743=>1250, 9744=>896, 9745=>896, 9746=>896, 9747=>532, 9748=>896, 9749=>896, 9750=>896, 9751=>896, 9752=>896, 9753=>896, 9754=>896, + 9755=>896, 9756=>896, 9757=>609, 9758=>896, 9759=>609, 9760=>896, 9761=>896, 9762=>896, 9763=>896, 9764=>669, 9765=>746, 9766=>649, 9767=>784, 9768=>545, 9769=>896, 9770=>896, + 9771=>896, 9772=>710, 9773=>896, 9774=>896, 9775=>896, 9776=>896, 9777=>896, 9778=>896, 9779=>896, 9780=>896, 9781=>896, 9782=>896, 9783=>896, 9784=>896, 9785=>896, 9786=>896, + 9787=>896, 9788=>896, 9789=>896, 9790=>896, 9791=>614, 9792=>731, 9793=>731, 9794=>896, 9795=>896, 9796=>896, 9797=>896, 9798=>896, 9799=>896, 9800=>896, 9801=>896, 9802=>896, + 9803=>896, 9804=>896, 9805=>896, 9806=>896, 9807=>896, 9808=>896, 9809=>896, 9810=>896, 9811=>896, 9812=>896, 9813=>896, 9814=>896, 9815=>896, 9816=>896, 9817=>896, 9818=>896, + 9819=>896, 9820=>896, 9821=>896, 9822=>896, 9823=>896, 9824=>896, 9825=>896, 9826=>896, 9827=>896, 9828=>896, 9829=>896, 9830=>896, 9831=>896, 9832=>896, 9833=>472, 9834=>638, + 9835=>896, 9836=>896, 9837=>472, 9838=>357, 9839=>484, 9840=>748, 9841=>766, 9842=>896, 9843=>896, 9844=>896, 9845=>896, 9846=>896, 9847=>896, 9848=>896, 9849=>896, 9850=>896, + 9851=>896, 9852=>896, 9853=>896, 9854=>896, 9855=>896, 9856=>869, 9857=>869, 9858=>869, 9859=>869, 9860=>869, 9861=>869, 9862=>896, 9863=>896, 9864=>896, 9865=>896, 9866=>896, + 9867=>896, 9868=>896, 9869=>896, 9870=>896, 9871=>896, 9872=>896, 9873=>896, 9874=>896, 9875=>896, 9876=>896, 9877=>541, 9878=>896, 9879=>896, 9880=>896, 9881=>896, 9882=>896, + 9883=>896, 9884=>896, 9888=>896, 9889=>702, 9890=>838, 9891=>838, 9892=>838, 9893=>838, 9894=>838, 9895=>838, 9896=>838, 9897=>838, 9898=>838, 9899=>838, 9900=>838, 9901=>838, + 9902=>838, 9903=>838, 9904=>844, 9905=>838, 9906=>731, 9985=>838, 9986=>838, 9987=>838, 9988=>838, 9990=>838, 9991=>838, 9992=>838, 9993=>838, 9996=>838, 9997=>838, 9998=>838, + 9999=>838, 10000=>838, 10001=>838, 10002=>838, 10003=>838, 10004=>838, 10005=>838, 10006=>838, 10007=>838, 10008=>838, 10009=>838, 10010=>838, 10011=>838, 10012=>838, 10013=>838, 10014=>838, + 10015=>838, 10016=>838, 10017=>838, 10018=>838, 10019=>838, 10020=>838, 10021=>838, 10022=>838, 10023=>838, 10025=>838, 10026=>838, 10027=>838, 10028=>838, 10029=>838, 10030=>838, 10031=>838, + 10032=>838, 10033=>838, 10034=>838, 10035=>838, 10036=>838, 10037=>838, 10038=>838, 10039=>838, 10040=>838, 10041=>838, 10042=>838, 10043=>838, 10044=>838, 10045=>838, 10046=>838, 10047=>838, + 10048=>838, 10049=>838, 10050=>838, 10051=>838, 10052=>838, 10053=>838, 10054=>838, 10055=>838, 10056=>838, 10057=>838, 10058=>838, 10059=>838, 10061=>896, 10063=>896, 10064=>896, 10065=>896, + 10066=>896, 10070=>896, 10072=>838, 10073=>838, 10074=>838, 10075=>347, 10076=>347, 10077=>587, 10078=>587, 10081=>838, 10082=>838, 10083=>838, 10084=>838, 10085=>838, 10086=>838, 10087=>838, + 10088=>838, 10089=>838, 10090=>838, 10091=>838, 10092=>838, 10093=>838, 10094=>838, 10095=>838, 10096=>838, 10097=>838, 10098=>838, 10099=>838, 10100=>838, 10101=>838, 10102=>847, 10103=>847, + 10104=>847, 10105=>847, 10106=>847, 10107=>847, 10108=>847, 10109=>847, 10110=>847, 10111=>847, 10112=>838, 10113=>838, 10114=>838, 10115=>838, 10116=>838, 10117=>838, 10118=>838, 10119=>838, + 10120=>838, 10121=>838, 10122=>838, 10123=>838, 10124=>838, 10125=>838, 10126=>838, 10127=>838, 10128=>838, 10129=>838, 10130=>838, 10131=>838, 10132=>838, 10136=>838, 10137=>838, 10138=>838, + 10139=>838, 10140=>838, 10141=>838, 10142=>838, 10143=>838, 10144=>838, 10145=>838, 10146=>838, 10147=>838, 10148=>838, 10149=>838, 10150=>838, 10151=>838, 10152=>838, 10153=>838, 10154=>838, + 10155=>838, 10156=>838, 10157=>838, 10158=>838, 10159=>838, 10161=>838, 10162=>838, 10163=>838, 10164=>838, 10165=>838, 10166=>838, 10167=>838, 10168=>838, 10169=>838, 10170=>838, 10171=>838, + 10172=>838, 10173=>838, 10174=>838, 10208=>494, 10214=>487, 10215=>487, 10216=>457, 10217=>457, 10218=>721, 10219=>721, 10224=>838, 10225=>838, 10226=>838, 10227=>838, 10228=>1157, 10229=>1434, + 10230=>1434, 10231=>1434, 10232=>1434, 10233=>1434, 10234=>1434, 10235=>1434, 10236=>1434, 10237=>1434, 10238=>1434, 10239=>1434, 10240=>781, 10241=>781, 10242=>781, 10243=>781, 10244=>781, 10245=>781, + 10246=>781, 10247=>781, 10248=>781, 10249=>781, 10250=>781, 10251=>781, 10252=>781, 10253=>781, 10254=>781, 10255=>781, 10256=>781, 10257=>781, 10258=>781, 10259=>781, 10260=>781, 10261=>781, + 10262=>781, 10263=>781, 10264=>781, 10265=>781, 10266=>781, 10267=>781, 10268=>781, 10269=>781, 10270=>781, 10271=>781, 10272=>781, 10273=>781, 10274=>781, 10275=>781, 10276=>781, 10277=>781, + 10278=>781, 10279=>781, 10280=>781, 10281=>781, 10282=>781, 10283=>781, 10284=>781, 10285=>781, 10286=>781, 10287=>781, 10288=>781, 10289=>781, 10290=>781, 10291=>781, 10292=>781, 10293=>781, + 10294=>781, 10295=>781, 10296=>781, 10297=>781, 10298=>781, 10299=>781, 10300=>781, 10301=>781, 10302=>781, 10303=>781, 10304=>781, 10305=>781, 10306=>781, 10307=>781, 10308=>781, 10309=>781, + 10310=>781, 10311=>781, 10312=>781, 10313=>781, 10314=>781, 10315=>781, 10316=>781, 10317=>781, 10318=>781, 10319=>781, 10320=>781, 10321=>781, 10322=>781, 10323=>781, 10324=>781, 10325=>781, + 10326=>781, 10327=>781, 10328=>781, 10329=>781, 10330=>781, 10331=>781, 10332=>781, 10333=>781, 10334=>781, 10335=>781, 10336=>781, 10337=>781, 10338=>781, 10339=>781, 10340=>781, 10341=>781, + 10342=>781, 10343=>781, 10344=>781, 10345=>781, 10346=>781, 10347=>781, 10348=>781, 10349=>781, 10350=>781, 10351=>781, 10352=>781, 10353=>781, 10354=>781, 10355=>781, 10356=>781, 10357=>781, + 10358=>781, 10359=>781, 10360=>781, 10361=>781, 10362=>781, 10363=>781, 10364=>781, 10365=>781, 10366=>781, 10367=>781, 10368=>781, 10369=>781, 10370=>781, 10371=>781, 10372=>781, 10373=>781, + 10374=>781, 10375=>781, 10376=>781, 10377=>781, 10378=>781, 10379=>781, 10380=>781, 10381=>781, 10382=>781, 10383=>781, 10384=>781, 10385=>781, 10386=>781, 10387=>781, 10388=>781, 10389=>781, + 10390=>781, 10391=>781, 10392=>781, 10393=>781, 10394=>781, 10395=>781, 10396=>781, 10397=>781, 10398=>781, 10399=>781, 10400=>781, 10401=>781, 10402=>781, 10403=>781, 10404=>781, 10405=>781, + 10406=>781, 10407=>781, 10408=>781, 10409=>781, 10410=>781, 10411=>781, 10412=>781, 10413=>781, 10414=>781, 10415=>781, 10416=>781, 10417=>781, 10418=>781, 10419=>781, 10420=>781, 10421=>781, + 10422=>781, 10423=>781, 10424=>781, 10425=>781, 10426=>781, 10427=>781, 10428=>781, 10429=>781, 10430=>781, 10431=>781, 10432=>781, 10433=>781, 10434=>781, 10435=>781, 10436=>781, 10437=>781, + 10438=>781, 10439=>781, 10440=>781, 10441=>781, 10442=>781, 10443=>781, 10444=>781, 10445=>781, 10446=>781, 10447=>781, 10448=>781, 10449=>781, 10450=>781, 10451=>781, 10452=>781, 10453=>781, + 10454=>781, 10455=>781, 10456=>781, 10457=>781, 10458=>781, 10459=>781, 10460=>781, 10461=>781, 10462=>781, 10463=>781, 10464=>781, 10465=>781, 10466=>781, 10467=>781, 10468=>781, 10469=>781, + 10470=>781, 10471=>781, 10472=>781, 10473=>781, 10474=>781, 10475=>781, 10476=>781, 10477=>781, 10478=>781, 10479=>781, 10480=>781, 10481=>781, 10482=>781, 10483=>781, 10484=>781, 10485=>781, + 10486=>781, 10487=>781, 10488=>781, 10489=>781, 10490=>781, 10491=>781, 10492=>781, 10493=>781, 10494=>781, 10495=>781, 10502=>838, 10503=>838, 10506=>838, 10507=>838, 10560=>838, 10561=>838, + 10702=>838, 10703=>1046, 10704=>1046, 10705=>1000, 10706=>1000, 10707=>1000, 10708=>1000, 10709=>1000, 10731=>494, 10752=>1000, 10753=>1000, 10754=>1000, 10764=>1661, 10765=>563, 10766=>563, 10767=>563, + 10768=>563, 10769=>563, 10770=>563, 10771=>563, 10772=>563, 10773=>563, 10774=>563, 10775=>563, 10776=>563, 10777=>563, 10778=>563, 10779=>563, 10780=>563, 10877=>838, 10878=>838, 10879=>838, + 10880=>838, 10881=>838, 10882=>838, 10883=>838, 10884=>838, 10885=>838, 10886=>838, 10887=>838, 10888=>838, 10889=>838, 10890=>838, 10891=>838, 10892=>838, 10893=>838, 10894=>838, 10895=>838, + 10896=>838, 10897=>838, 10898=>838, 10899=>838, 10900=>838, 10901=>838, 10902=>838, 10903=>838, 10904=>838, 10905=>838, 10906=>838, 10907=>838, 10908=>838, 10909=>838, 10910=>838, 10911=>838, + 10912=>838, 10926=>838, 10927=>838, 10928=>838, 10929=>838, 10930=>838, 10931=>838, 10932=>838, 10933=>838, 10934=>838, 10935=>838, 10936=>838, 10937=>838, 10938=>838, 11001=>838, 11002=>838, + 11008=>838, 11009=>838, 11010=>838, 11011=>838, 11012=>838, 11013=>838, 11014=>838, 11015=>838, 11016=>838, 11017=>838, 11018=>838, 11019=>838, 11020=>838, 11021=>838, 11022=>838, 11023=>838, + 11024=>838, 11025=>838, 11026=>945, 11027=>945, 11028=>945, 11029=>945, 11030=>769, 11031=>769, 11032=>769, 11033=>769, 11034=>945, 11040=>869, 11041=>873, 11042=>873, 11043=>873, 11360=>637, + 11361=>360, 11362=>637, 11363=>733, 11364=>770, 11365=>675, 11366=>478, 11367=>956, 11368=>712, 11369=>775, 11370=>665, 11371=>725, 11372=>582, 11380=>652, 11381=>649, 11382=>516, 11383=>782, + 61960=>860, 62047=>720, 63173=>687, 64256=>810, 64257=>741, 64258=>741, 64259=>1115, 64260=>1116, 64261=>808, 64262=>1020, 64275=>1388, 64276=>1384, 64277=>1378, 64278=>1384, 64279=>1713, 64285=>372, + 64287=>692, 64288=>720, 64297=>838, 64298=>963, 64299=>963, 64300=>963, 64301=>963, 64302=>751, 64303=>751, 64304=>751, 64305=>731, 64306=>537, 64307=>684, 64308=>778, 64309=>467, 64310=>521, + 64312=>770, 64313=>467, 64314=>778, 64315=>750, 64316=>718, 64318=>856, 64320=>532, 64321=>855, 64323=>802, 64324=>777, 64326=>751, 64327=>803, 64328=>778, 64329=>963, 64330=>822, 64331=>372, + 64332=>731, 64333=>754, 64334=>777, 64338=>1005, 64339=>1059, 64340=>375, 64341=>408, 64342=>1005, 64343=>1059, 64344=>375, 64345=>408, 64346=>1005, 64347=>1059, 64348=>375, 64349=>408, 64350=>1005, + 64351=>1059, 64352=>375, 64353=>408, 64354=>1005, 64355=>1059, 64356=>375, 64357=>408, 64358=>1005, 64359=>1059, 64360=>375, 64361=>408, 64362=>1162, 64363=>1191, 64364=>655, 64365=>720, 64366=>1162, + 64367=>1191, 64368=>655, 64369=>720, 64370=>721, 64371=>721, 64372=>721, 64373=>721, 64374=>721, 64375=>721, 64376=>721, 64377=>721, 64378=>721, 64379=>721, 64380=>721, 64381=>721, 64382=>721, + 64383=>721, 64384=>721, 64385=>721, 64394=>576, 64395=>622, 64396=>576, 64397=>622, 64398=>1024, 64399=>1024, 64400=>582, 64401=>582, 64402=>1024, 64403=>1024, 64404=>582, 64405=>582, 64414=>854, + 64415=>900, 64473=>622, 64474=>627, 64488=>375, 64489=>408, 64508=>917, 64509=>1012, 64510=>375, 64511=>408, 65024=>0, 65025=>0, 65026=>0, 65027=>0, 65028=>0, 65029=>0, 65030=>0, + 65031=>0, 65032=>0, 65033=>0, 65034=>0, 65035=>0, 65036=>0, 65037=>0, 65038=>0, 65039=>0, 65136=>342, 65137=>342, 65138=>342, 65139=>346, 65140=>342, 65142=>342, 65143=>342, + 65144=>342, 65145=>342, 65146=>342, 65147=>342, 65148=>342, 65149=>342, 65150=>342, 65151=>342, 65152=>511, 65153=>343, 65154=>375, 65155=>343, 65156=>375, 65157=>622, 65158=>627, 65159=>343, + 65160=>375, 65161=>917, 65162=>917, 65163=>375, 65164=>408, 65165=>343, 65166=>375, 65167=>1005, 65168=>1059, 65169=>375, 65170=>408, 65171=>590, 65172=>606, 65173=>1005, 65174=>1059, 65175=>375, + 65176=>408, 65177=>1005, 65178=>1059, 65179=>375, 65180=>408, 65181=>721, 65182=>721, 65183=>721, 65184=>721, 65185=>721, 65186=>721, 65187=>721, 65188=>721, 65189=>721, 65190=>721, 65191=>721, + 65192=>721, 65193=>513, 65194=>578, 65195=>513, 65196=>578, 65197=>576, 65198=>622, 65199=>576, 65200=>622, 65201=>1380, 65202=>1414, 65203=>983, 65204=>1018, 65205=>1380, 65206=>1414, 65207=>983, + 65208=>1018, 65209=>1345, 65210=>1364, 65211=>966, 65212=>985, 65213=>1345, 65214=>1364, 65215=>966, 65216=>985, 65217=>1039, 65218=>1071, 65219=>942, 65220=>974, 65221=>1039, 65222=>1071, 65223=>942, + 65224=>974, 65225=>683, 65226=>683, 65227=>683, 65228=>564, 65229=>683, 65230=>683, 65231=>683, 65232=>564, 65233=>1162, 65234=>1191, 65235=>655, 65236=>720, 65237=>894, 65238=>901, 65239=>655, + 65240=>720, 65241=>917, 65242=>931, 65243=>582, 65244=>582, 65245=>868, 65246=>893, 65247=>375, 65248=>408, 65249=>733, 65250=>784, 65251=>619, 65252=>670, 65253=>854, 65254=>900, 65255=>375, + 65256=>408, 65257=>590, 65258=>606, 65259=>693, 65260=>660, 65261=>622, 65262=>627, 65263=>917, 65264=>1012, 65265=>917, 65266=>1012, 65267=>375, 65268=>408, 65269=>745, 65270=>759, 65271=>745, + 65272=>759, 65273=>745, 65274=>759, 65275=>745, 65276=>759, 65279=>0, 65533=>1113); +$enc=''; +$diff=''; +$file='DejaVuSans-Bold.z'; +$ctg='DejaVuSans-Bold.ctg.z'; +$originalsize=494260; +?> diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansbi.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansbi.php new file mode 100644 index 00000000..619ee83e --- /dev/null +++ b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansbi.php @@ -0,0 +1,267 @@ +928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>96,'FontBBox'=>'[-1067 -388 2005 1121]','ItalicAngle'=>-11,'StemV'=>120,'MissingWidth'=>600); +$up=-42; +$ut=44; +$cw=array( + 0=>600, 32=>348, 33=>456, 34=>521, 35=>696, 36=>696, 37=>1002, 38=>872, 39=>306, 40=>457, 41=>457, 42=>523, 43=>838, 44=>380, 45=>415, 46=>380, + 47=>365, 48=>696, 49=>696, 50=>696, 51=>696, 52=>696, 53=>696, 54=>696, 55=>696, 56=>696, 57=>696, 58=>400, 59=>400, 60=>838, 61=>838, 62=>838, + 63=>580, 64=>1000, 65=>774, 66=>762, 67=>734, 68=>830, 69=>683, 70=>683, 71=>821, 72=>837, 73=>372, 74=>372, 75=>775, 76=>637, 77=>995, 78=>837, + 79=>850, 80=>733, 81=>850, 82=>770, 83=>720, 84=>682, 85=>812, 86=>774, 87=>1103, 88=>771, 89=>724, 90=>725, 91=>457, 92=>365, 93=>457, 94=>838, + 95=>500, 96=>500, 97=>675, 98=>716, 99=>593, 100=>716, 101=>678, 102=>435, 103=>716, 104=>712, 105=>343, 106=>343, 107=>665, 108=>343, 109=>1042, 110=>712, + 111=>687, 112=>716, 113=>716, 114=>493, 115=>595, 116=>478, 117=>712, 118=>652, 119=>924, 120=>645, 121=>652, 122=>582, 123=>712, 124=>365, 125=>712, 126=>838, + 8364=>696, 1027=>637, 8218=>380, 402=>435, 8222=>644, 8230=>1000, 8224=>500, 8225=>500, 710=>500, 8240=>1454, 352=>720, 8249=>412, 338=>1167, 1036=>817, 381=>725, 1039=>837, + 8216=>380, 8217=>380, 8220=>644, 8221=>644, 8226=>639, 8211=>500, 8212=>1000, 732=>500, 8482=>1000, 353=>595, 8250=>412, 339=>1094, 1116=>679, 382=>582, 376=>724, 160=>348, + 161=>456, 162=>696, 163=>696, 164=>636, 165=>696, 166=>365, 167=>500, 168=>500, 169=>1000, 170=>564, 171=>650, 172=>838, 173=>415, 174=>1000, 175=>500, 176=>500, + 177=>838, 178=>438, 179=>438, 180=>500, 181=>736, 182=>636, 183=>380, 184=>500, 185=>438, 186=>564, 187=>650, 188=>1035, 189=>1035, 190=>1035, 191=>580, 192=>774, + 193=>774, 194=>774, 195=>774, 196=>774, 197=>774, 198=>1085, 199=>734, 200=>683, 201=>683, 202=>683, 203=>683, 204=>372, 205=>372, 206=>372, 207=>372, 208=>845, + 209=>837, 210=>850, 211=>850, 212=>850, 213=>850, 214=>850, 215=>838, 216=>850, 217=>812, 218=>812, 219=>812, 220=>812, 221=>724, 222=>742, 223=>719, 224=>675, + 225=>675, 226=>675, 227=>675, 228=>675, 229=>675, 230=>1048, 231=>593, 232=>678, 233=>678, 234=>678, 235=>678, 236=>343, 237=>343, 238=>343, 239=>343, 240=>687, + 241=>712, 242=>687, 243=>687, 244=>687, 245=>687, 246=>687, 247=>838, 248=>687, 249=>712, 250=>712, 251=>712, 252=>712, 253=>652, 254=>716, 255=>652, 256=>774, + 257=>675, 258=>774, 259=>675, 260=>774, 261=>675, 262=>734, 263=>593, 264=>734, 265=>593, 266=>734, 267=>593, 268=>734, 269=>593, 270=>830, 271=>716, 272=>845, + 273=>716, 274=>683, 275=>678, 276=>683, 277=>678, 278=>683, 279=>678, 280=>683, 281=>678, 282=>683, 283=>678, 284=>821, 285=>716, 286=>821, 287=>716, 288=>821, + 289=>716, 290=>821, 291=>716, 292=>837, 293=>712, 294=>974, 295=>790, 296=>372, 297=>343, 298=>372, 299=>343, 300=>372, 301=>343, 302=>372, 303=>343, 304=>372, + 305=>343, 306=>744, 307=>686, 308=>372, 309=>343, 310=>775, 311=>665, 312=>665, 313=>637, 314=>343, 315=>637, 316=>343, 317=>637, 318=>459, 319=>637, 320=>486, + 321=>660, 322=>375, 323=>837, 324=>712, 325=>837, 326=>712, 327=>837, 328=>712, 329=>983, 330=>837, 331=>712, 332=>850, 333=>687, 334=>850, 335=>687, 336=>850, + 337=>687, 340=>770, 341=>493, 342=>770, 343=>493, 344=>770, 345=>493, 346=>720, 347=>595, 348=>720, 349=>595, 350=>720, 351=>595, 354=>682, 355=>478, 356=>682, + 357=>478, 358=>682, 359=>478, 360=>812, 361=>712, 362=>812, 363=>712, 364=>812, 365=>712, 366=>812, 367=>712, 368=>812, 369=>712, 370=>812, 371=>712, 372=>1103, + 373=>924, 374=>724, 375=>652, 377=>725, 378=>582, 379=>725, 380=>582, 383=>435, 384=>716, 385=>811, 386=>762, 387=>716, 388=>762, 389=>716, 390=>734, 391=>734, + 392=>593, 393=>845, 394=>879, 395=>762, 396=>716, 397=>687, 398=>683, 399=>850, 400=>696, 401=>683, 403=>821, 404=>793, 405=>1045, 406=>436, 407=>389, 408=>775, + 409=>665, 410=>360, 411=>592, 412=>1042, 413=>837, 414=>712, 415=>850, 416=>850, 417=>687, 418=>1114, 419=>962, 420=>782, 421=>716, 422=>770, 423=>720, 424=>595, + 425=>683, 426=>552, 427=>478, 428=>707, 429=>478, 430=>682, 431=>812, 432=>712, 433=>769, 434=>813, 435=>797, 436=>778, 437=>725, 438=>582, 439=>772, 440=>772, + 441=>641, 442=>582, 443=>696, 444=>772, 445=>641, 446=>573, 447=>716, 448=>372, 449=>659, 450=>544, 451=>372, 452=>1548, 453=>1450, 454=>1307, 455=>977, 456=>979, + 457=>670, 458=>1193, 459=>1213, 460=>1063, 461=>774, 462=>675, 463=>372, 464=>343, 465=>850, 466=>687, 467=>812, 468=>712, 469=>812, 470=>712, 471=>812, 472=>712, + 473=>812, 474=>712, 475=>812, 476=>712, 477=>678, 478=>774, 479=>675, 480=>774, 481=>675, 482=>1085, 483=>1048, 484=>821, 485=>716, 486=>821, 487=>716, 488=>775, + 489=>665, 490=>850, 491=>687, 492=>850, 493=>687, 494=>772, 495=>582, 496=>343, 497=>1548, 498=>1450, 499=>1307, 500=>821, 501=>716, 502=>1289, 503=>787, 504=>837, + 505=>712, 506=>774, 507=>675, 508=>1085, 509=>1048, 510=>850, 511=>687, 512=>774, 513=>675, 514=>774, 515=>675, 516=>683, 517=>678, 518=>683, 519=>678, 520=>372, + 521=>343, 522=>372, 523=>343, 524=>850, 525=>687, 526=>850, 527=>687, 528=>770, 529=>493, 530=>770, 531=>493, 532=>812, 533=>712, 534=>812, 535=>712, 536=>720, + 537=>595, 538=>682, 539=>478, 540=>690, 541=>607, 542=>837, 543=>712, 544=>837, 545=>865, 546=>809, 547=>659, 548=>725, 549=>582, 550=>774, 551=>675, 552=>683, + 553=>678, 554=>850, 555=>687, 556=>850, 557=>687, 558=>850, 559=>687, 560=>850, 561=>687, 562=>724, 563=>652, 564=>492, 565=>867, 566=>512, 567=>343, 568=>1088, + 569=>1088, 570=>774, 571=>734, 572=>593, 573=>637, 574=>682, 575=>595, 576=>582, 577=>782, 578=>614, 579=>762, 580=>812, 581=>774, 582=>683, 583=>678, 584=>372, + 585=>343, 586=>860, 587=>791, 588=>770, 589=>493, 590=>724, 591=>652, 592=>675, 593=>716, 594=>716, 595=>716, 596=>593, 597=>593, 598=>791, 599=>792, 600=>678, + 601=>678, 602=>876, 603=>557, 604=>545, 605=>774, 606=>731, 607=>343, 608=>792, 609=>716, 610=>627, 611=>735, 612=>635, 613=>712, 614=>712, 615=>712, 616=>545, + 617=>440, 618=>545, 619=>559, 620=>693, 621=>343, 622=>841, 623=>1042, 624=>1042, 625=>1042, 626=>712, 627=>793, 628=>642, 629=>687, 630=>909, 631=>682, 632=>796, + 633=>538, 634=>538, 635=>650, 636=>493, 637=>493, 638=>596, 639=>596, 640=>642, 641=>642, 642=>595, 643=>415, 644=>435, 645=>605, 646=>552, 647=>478, 648=>478, + 649=>920, 650=>769, 651=>670, 652=>652, 653=>924, 654=>652, 655=>724, 656=>694, 657=>684, 658=>641, 659=>641, 660=>573, 661=>573, 662=>573, 663=>573, 664=>850, + 665=>633, 666=>731, 667=>685, 668=>691, 669=>343, 670=>732, 671=>539, 672=>792, 673=>573, 674=>573, 675=>1156, 676=>1214, 677=>1155, 678=>974, 679=>769, 680=>929, + 681=>1026, 682=>792, 683=>780, 684=>591, 685=>415, 686=>677, 687=>789, 688=>456, 689=>456, 690=>219, 691=>315, 692=>315, 693=>315, 694=>411, 695=>591, 696=>417, + 697=>302, 698=>521, 699=>380, 700=>380, 701=>380, 702=>366, 703=>366, 704=>326, 705=>326, 706=>500, 707=>500, 708=>500, 709=>500, 711=>500, 712=>306, 713=>500, + 714=>500, 715=>500, 716=>306, 717=>500, 718=>500, 719=>500, 720=>337, 721=>337, 722=>366, 723=>366, 724=>500, 725=>500, 726=>500, 727=>500, 728=>500, 729=>500, + 730=>500, 731=>500, 733=>500, 734=>351, 735=>500, 736=>412, 737=>219, 738=>381, 739=>413, 740=>326, 741=>500, 742=>500, 743=>500, 744=>500, 745=>500, 748=>500, + 749=>500, 750=>500, 755=>500, 759=>500, 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 773=>0, 774=>0, 775=>0, 776=>0, 777=>0, 778=>0, 779=>0, + 780=>0, 781=>0, 782=>0, 783=>0, 784=>0, 785=>0, 786=>0, 787=>0, 788=>0, 789=>0, 790=>0, 791=>0, 792=>0, 793=>0, 794=>0, 795=>0, + 796=>0, 797=>0, 798=>0, 799=>0, 800=>0, 801=>0, 802=>0, 803=>0, 804=>0, 805=>0, 806=>0, 807=>0, 808=>0, 809=>0, 810=>0, 811=>0, + 812=>0, 813=>0, 814=>0, 815=>0, 816=>0, 817=>0, 818=>0, 819=>0, 820=>0, 821=>0, 822=>0, 823=>0, 824=>0, 825=>0, 826=>0, 827=>0, + 828=>0, 829=>0, 830=>0, 831=>0, 832=>0, 833=>0, 834=>0, 835=>0, 836=>0, 837=>0, 838=>0, 839=>0, 840=>0, 841=>0, 842=>0, 843=>0, + 844=>0, 845=>0, 846=>0, 847=>0, 849=>0, 850=>0, 855=>0, 856=>0, 860=>0, 861=>0, 862=>0, 863=>0, 864=>0, 865=>0, 866=>0, 884=>302, + 885=>302, 890=>500, 891=>593, 892=>550, 893=>549, 894=>337, 900=>441, 901=>500, 902=>797, 903=>380, 904=>846, 905=>1009, 906=>563, 908=>891, 910=>980, 911=>894, + 912=>390, 913=>774, 914=>762, 915=>637, 916=>774, 917=>683, 918=>725, 919=>837, 920=>850, 921=>372, 922=>775, 923=>774, 924=>995, 925=>837, 926=>632, 927=>850, + 928=>837, 929=>733, 931=>683, 932=>682, 933=>724, 934=>850, 935=>771, 936=>850, 937=>850, 938=>372, 939=>724, 940=>687, 941=>557, 942=>712, 943=>390, 944=>675, + 945=>687, 946=>716, 947=>681, 948=>687, 949=>557, 950=>591, 951=>712, 952=>687, 953=>390, 954=>710, 955=>633, 956=>736, 957=>681, 958=>591, 959=>687, 960=>791, + 961=>716, 962=>593, 963=>779, 964=>638, 965=>675, 966=>782, 967=>645, 968=>794, 969=>869, 970=>390, 971=>675, 972=>687, 973=>675, 974=>869, 976=>651, 977=>661, + 978=>746, 979=>981, 980=>746, 981=>796, 982=>869, 983=>744, 984=>850, 985=>687, 986=>734, 987=>593, 988=>683, 989=>494, 990=>702, 991=>660, 992=>919, 993=>627, + 994=>1093, 995=>837, 996=>832, 997=>716, 998=>928, 999=>744, 1000=>733, 1001=>650, 1002=>789, 1003=>671, 1004=>752, 1005=>716, 1006=>682, 1007=>590, 1008=>744, 1009=>716, + 1010=>593, 1011=>343, 1012=>850, 1013=>645, 1014=>645, 1015=>742, 1016=>716, 1017=>734, 1018=>995, 1019=>732, 1020=>716, 1021=>734, 1022=>734, 1023=>698, 1024=>683, 1025=>683, + 1026=>878, 1028=>734, 1029=>720, 1030=>372, 1031=>372, 1032=>372, 1033=>1154, 1034=>1130, 1035=>878, 1037=>837, 1038=>771, 1040=>774, 1041=>762, 1042=>762, 1043=>637, 1044=>891, + 1045=>683, 1046=>1224, 1047=>710, 1048=>837, 1049=>837, 1050=>817, 1051=>831, 1052=>995, 1053=>837, 1054=>850, 1055=>837, 1056=>733, 1057=>734, 1058=>682, 1059=>771, 1060=>992, + 1061=>771, 1062=>928, 1063=>808, 1064=>1235, 1065=>1326, 1066=>939, 1067=>1036, 1068=>762, 1069=>734, 1070=>1174, 1071=>770, 1072=>675, 1073=>698, 1074=>633, 1075=>522, 1076=>808, + 1077=>678, 1078=>995, 1079=>581, 1080=>701, 1081=>701, 1082=>679, 1083=>732, 1084=>817, 1085=>691, 1086=>687, 1087=>691, 1088=>716, 1089=>593, 1090=>580, 1091=>652, 1092=>992, + 1093=>645, 1094=>741, 1095=>687, 1096=>1062, 1097=>1105, 1098=>751, 1099=>904, 1100=>632, 1101=>593, 1102=>972, 1103=>642, 1104=>678, 1105=>678, 1106=>714, 1107=>522, 1108=>593, + 1109=>595, 1110=>343, 1111=>343, 1112=>343, 1113=>991, 1114=>956, 1115=>734, 1117=>701, 1118=>652, 1119=>691, 1120=>1093, 1121=>869, 1122=>840, 1123=>736, 1124=>1012, 1125=>839, + 1126=>992, 1127=>832, 1128=>1358, 1129=>1121, 1130=>850, 1131=>687, 1132=>1236, 1133=>1007, 1134=>696, 1135=>557, 1136=>1075, 1137=>1061, 1138=>850, 1139=>667, 1140=>850, 1141=>695, + 1142=>850, 1143=>695, 1144=>1148, 1145=>1043, 1146=>1074, 1147=>863, 1148=>1405, 1149=>1173, 1150=>1093, 1151=>869, 1152=>734, 1153=>593, 1154=>652, 1155=>0, 1156=>0, 1157=>0, + 1158=>0, 1160=>418, 1161=>418, 1162=>938, 1163=>806, 1164=>762, 1165=>611, 1166=>736, 1167=>718, 1168=>637, 1169=>522, 1170=>666, 1171=>543, 1172=>789, 1173=>522, 1174=>1224, + 1175=>995, 1176=>710, 1177=>581, 1178=>775, 1179=>679, 1180=>817, 1181=>679, 1182=>817, 1183=>679, 1184=>1015, 1185=>826, 1186=>837, 1187=>691, 1188=>1103, 1189=>871, 1190=>1254, + 1191=>979, 1192=>875, 1193=>710, 1194=>734, 1195=>593, 1196=>682, 1197=>580, 1198=>724, 1199=>652, 1200=>724, 1201=>652, 1202=>771, 1203=>645, 1204=>1104, 1205=>1001, 1206=>808, + 1207=>687, 1208=>808, 1209=>687, 1210=>808, 1211=>712, 1212=>1026, 1213=>810, 1214=>1026, 1215=>810, 1216=>372, 1217=>1224, 1218=>995, 1219=>778, 1220=>629, 1221=>933, 1222=>804, + 1223=>837, 1224=>691, 1225=>938, 1226=>806, 1227=>808, 1228=>687, 1229=>1096, 1230=>932, 1231=>343, 1232=>774, 1233=>675, 1234=>774, 1235=>675, 1236=>1085, 1237=>1048, 1238=>683, + 1239=>678, 1240=>850, 1241=>678, 1242=>850, 1243=>678, 1244=>1224, 1245=>995, 1246=>710, 1247=>581, 1248=>772, 1249=>641, 1250=>837, 1251=>701, 1252=>837, 1253=>701, 1254=>850, + 1255=>687, 1256=>850, 1257=>687, 1258=>850, 1259=>687, 1260=>734, 1261=>593, 1262=>771, 1263=>652, 1264=>771, 1265=>652, 1266=>771, 1267=>652, 1268=>808, 1269=>687, 1270=>637, + 1271=>522, 1272=>1036, 1273=>904, 1274=>666, 1275=>543, 1276=>771, 1277=>645, 1278=>771, 1279=>645, 1280=>762, 1281=>608, 1282=>1159, 1283=>893, 1284=>1119, 1285=>920, 1286=>828, + 1287=>693, 1288=>1242, 1289=>1017, 1290=>1248, 1291=>1013, 1292=>839, 1293=>638, 1294=>938, 1295=>803, 1296=>696, 1297=>557, 1298=>831, 1299=>732, 1329=>984, 1330=>812, 1331=>984, + 1332=>984, 1333=>812, 1334=>777, 1335=>812, 1336=>812, 1337=>975, 1338=>984, 1339=>812, 1340=>710, 1341=>1078, 1342=>1136, 1343=>812, 1344=>710, 1345=>757, 1346=>984, 1347=>876, + 1348=>984, 1349=>793, 1350=>984, 1351=>812, 1352=>812, 1353=>812, 1354=>958, 1355=>777, 1356=>984, 1357=>812, 1358=>984, 1359=>720, 1360=>812, 1361=>793, 1362=>895, 1363=>850, + 1364=>936, 1365=>850, 1366=>720, 1369=>366, 1370=>380, 1371=>550, 1372=>550, 1373=>380, 1374=>546, 1375=>521, 1377=>1042, 1378=>712, 1379=>866, 1380=>868, 1381=>712, 1382=>817, + 1383=>653, 1384=>712, 1385=>811, 1386=>817, 1387=>712, 1388=>498, 1389=>1018, 1390=>716, 1391=>712, 1392=>712, 1393=>716, 1394=>819, 1395=>712, 1396=>751, 1397=>343, 1398=>882, + 1399=>559, 1400=>712, 1401=>559, 1402=>1042, 1403=>559, 1404=>863, 1405=>712, 1406=>813, 1407=>1042, 1408=>712, 1409=>716, 1410=>571, 1411=>1042, 1412=>778, 1413=>687, 1414=>720, + 1415=>862, 1417=>400, 1418=>487, 1456=>0, 1457=>0, 1458=>0, 1459=>0, 1460=>0, 1461=>0, 1462=>0, 1463=>0, 1464=>0, 1465=>0, 1467=>0, 1468=>0, 1469=>0, + 1471=>0, 1472=>372, 1473=>0, 1474=>0, 1475=>372, 1478=>532, 1479=>0, 1488=>751, 1489=>731, 1490=>537, 1491=>684, 1492=>778, 1493=>372, 1494=>521, 1495=>778, 1496=>770, + 1497=>372, 1498=>778, 1499=>750, 1500=>718, 1501=>778, 1502=>856, 1503=>372, 1504=>532, 1505=>855, 1506=>720, 1507=>802, 1508=>777, 1509=>628, 1510=>751, 1511=>803, 1512=>778, + 1513=>963, 1514=>822, 1520=>692, 1521=>692, 1522=>692, 3647=>743, 3713=>815, 3714=>748, 3716=>749, 3719=>569, 3720=>742, 3722=>744, 3725=>761, 3732=>706, 3733=>704, 3734=>747, + 3735=>819, 3737=>730, 3738=>727, 3739=>727, 3740=>922, 3741=>827, 3742=>866, 3743=>866, 3745=>836, 3746=>761, 3747=>770, 3749=>769, 3751=>713, 3754=>827, 3755=>1031, 3757=>724, + 3758=>784, 3759=>934, 3760=>688, 3761=>0, 3762=>610, 3763=>610, 3764=>0, 3765=>0, 3766=>0, 3767=>0, 3768=>0, 3769=>0, 3771=>0, 3772=>0, 3773=>670, 3776=>516, + 3777=>860, 3778=>516, 3779=>650, 3780=>632, 3782=>759, 3784=>0, 3785=>0, 3786=>0, 3787=>0, 3788=>0, 3789=>0, 3804=>1363, 3805=>1363, 5121=>774, 5122=>774, 5123=>774, + 5124=>774, 5125=>905, 5126=>905, 5127=>905, 5129=>905, 5130=>905, 5131=>905, 5132=>1018, 5133=>1009, 5134=>1018, 5135=>1009, 5136=>1018, 5137=>1009, 5138=>1149, 5139=>1140, 5140=>1149, + 5141=>1140, 5142=>905, 5143=>1149, 5144=>1142, 5145=>1149, 5146=>1142, 5147=>905, 5149=>310, 5150=>529, 5151=>425, 5152=>425, 5153=>395, 5154=>395, 5155=>395, 5156=>395, 5157=>564, + 5158=>470, 5159=>310, 5160=>395, 5161=>395, 5162=>395, 5163=>1213, 5164=>986, 5165=>1216, 5166=>1297, 5167=>774, 5168=>774, 5169=>774, 5170=>774, 5171=>886, 5172=>886, 5173=>886, + 5175=>886, 5176=>886, 5177=>886, 5178=>1018, 5179=>1009, 5180=>1018, 5181=>1009, 5182=>1018, 5183=>1009, 5184=>1149, 5185=>1140, 5186=>1149, 5187=>1140, 5188=>1149, 5189=>1142, 5190=>1149, + 5191=>1142, 5192=>886, 5193=>576, 5194=>229, 5196=>812, 5197=>812, 5198=>812, 5199=>812, 5200=>815, 5201=>815, 5202=>815, 5204=>815, 5205=>815, 5206=>815, 5207=>1056, 5208=>1048, + 5209=>1056, 5210=>1048, 5211=>1056, 5212=>1048, 5213=>1060, 5214=>1054, 5215=>1060, 5216=>1054, 5217=>1060, 5218=>1052, 5219=>1060, 5220=>1052, 5221=>1060, 5222=>483, 5223=>1005, 5224=>1005, + 5225=>1023, 5226=>1017, 5227=>743, 5228=>743, 5229=>743, 5230=>743, 5231=>743, 5232=>743, 5233=>743, 5234=>743, 5235=>743, 5236=>1029, 5237=>975, 5238=>980, 5239=>975, 5240=>980, + 5241=>975, 5242=>1029, 5243=>975, 5244=>1029, 5245=>975, 5246=>980, 5247=>975, 5248=>980, 5249=>975, 5250=>980, 5251=>501, 5252=>501, 5253=>938, 5254=>938, 5255=>938, 5256=>938, + 5257=>743, 5258=>743, 5259=>743, 5260=>743, 5261=>743, 5262=>743, 5263=>743, 5264=>743, 5265=>743, 5266=>1029, 5267=>975, 5268=>1029, 5269=>975, 5270=>1029, 5271=>975, 5272=>1029, + 5273=>975, 5274=>1029, 5275=>975, 5276=>1029, 5277=>975, 5278=>1029, 5279=>975, 5280=>1029, 5281=>501, 5282=>501, 5283=>626, 5284=>626, 5285=>626, 5286=>626, 5287=>626, 5288=>626, + 5289=>626, 5290=>626, 5291=>626, 5292=>881, 5293=>854, 5294=>863, 5295=>874, 5296=>863, 5297=>874, 5298=>881, 5299=>874, 5300=>881, 5301=>874, 5302=>863, 5303=>874, 5304=>863, + 5305=>874, 5306=>863, 5307=>436, 5308=>548, 5309=>436, 5312=>988, 5313=>988, 5314=>988, 5315=>988, 5316=>931, 5317=>931, 5318=>931, 5319=>931, 5320=>931, 5321=>1238, 5322=>1247, + 5323=>1200, 5324=>1228, 5325=>1200, 5326=>1228, 5327=>931, 5328=>660, 5329=>497, 5330=>660, 5331=>988, 5332=>988, 5333=>988, 5334=>988, 5335=>931, 5336=>931, 5337=>931, 5338=>931, + 5339=>931, 5340=>1231, 5341=>1247, 5342=>1283, 5343=>1228, 5344=>1283, 5345=>1228, 5346=>1228, 5347=>1214, 5348=>1228, 5349=>1214, 5350=>1283, 5351=>1228, 5352=>1283, 5353=>1228, 5354=>660, + 5356=>886, 5357=>730, 5358=>730, 5359=>730, 5360=>730, 5361=>730, 5362=>730, 5363=>730, 5364=>730, 5365=>730, 5366=>998, 5367=>958, 5368=>967, 5369=>989, 5370=>967, 5371=>989, + 5372=>998, 5373=>958, 5374=>998, 5375=>958, 5376=>967, 5377=>989, 5378=>967, 5379=>989, 5380=>967, 5381=>493, 5382=>460, 5383=>493, 5392=>923, 5393=>923, 5394=>923, 5395=>1136, + 5396=>1136, 5397=>1136, 5398=>1136, 5399=>1209, 5400=>1202, 5401=>1209, 5402=>1202, 5403=>1209, 5404=>1202, 5405=>1431, 5406=>1420, 5407=>1431, 5408=>1420, 5409=>1431, 5410=>1420, 5411=>1431, + 5412=>1420, 5413=>746, 5414=>776, 5415=>776, 5416=>776, 5417=>776, 5418=>776, 5419=>776, 5420=>776, 5421=>776, 5422=>776, 5423=>1003, 5424=>1003, 5425=>1013, 5426=>996, 5427=>1013, + 5428=>996, 5429=>1003, 5430=>1003, 5431=>1003, 5432=>1003, 5433=>1013, 5434=>996, 5435=>1013, 5436=>996, 5437=>1013, 5438=>495, 5440=>395, 5441=>510, 5442=>1033, 5443=>1033, 5444=>976, + 5445=>976, 5446=>976, 5447=>976, 5448=>733, 5449=>733, 5450=>733, 5451=>733, 5452=>733, 5453=>733, 5454=>1003, 5455=>959, 5456=>495, 5458=>886, 5459=>774, 5460=>774, 5461=>774, + 5462=>774, 5463=>928, 5464=>928, 5465=>928, 5466=>928, 5467=>1172, 5468=>1142, 5469=>602, 5470=>812, 5471=>812, 5472=>812, 5473=>812, 5474=>812, 5475=>812, 5476=>815, 5477=>815, + 5478=>815, 5479=>815, 5480=>1060, 5481=>1052, 5482=>548, 5492=>977, 5493=>977, 5494=>977, 5495=>977, 5496=>977, 5497=>977, 5498=>977, 5499=>618, 5500=>837, 5501=>510, 5502=>1238, + 5503=>1238, 5504=>1238, 5505=>1238, 5506=>1238, 5507=>1238, 5508=>1238, 5509=>989, 5514=>977, 5515=>977, 5516=>977, 5517=>977, 5518=>1591, 5519=>1591, 5520=>1591, 5521=>1295, 5522=>1295, + 5523=>1591, 5524=>1591, 5525=>848, 5526=>1273, 5536=>988, 5537=>988, 5538=>931, 5539=>931, 5540=>931, 5541=>931, 5542=>660, 5543=>776, 5544=>776, 5545=>776, 5546=>776, 5547=>776, + 5548=>776, 5549=>776, 5550=>495, 5551=>743, 5598=>830, 5601=>830, 5702=>496, 5703=>496, 5742=>413, 5743=>1238, 5744=>1591, 5745=>2016, 5746=>2016, 5747=>1720, 5748=>1678, 5749=>2016, + 5750=>2016, 7424=>652, 7425=>833, 7426=>1048, 7427=>608, 7428=>593, 7429=>676, 7430=>676, 7431=>559, 7432=>557, 7433=>343, 7434=>494, 7435=>665, 7436=>539, 7437=>817, 7438=>701, + 7439=>687, 7440=>593, 7441=>660, 7442=>660, 7443=>660, 7444=>1094, 7446=>687, 7447=>687, 7448=>556, 7449=>642, 7450=>642, 7451=>580, 7452=>634, 7453=>737, 7454=>948, 7455=>695, + 7456=>652, 7457=>924, 7458=>582, 7459=>646, 7462=>539, 7463=>652, 7464=>691, 7465=>556, 7466=>781, 7467=>732, 7468=>487, 7469=>683, 7470=>480, 7472=>523, 7473=>430, 7474=>430, + 7475=>517, 7476=>527, 7477=>234, 7478=>234, 7479=>488, 7480=>401, 7481=>626, 7482=>527, 7483=>527, 7484=>535, 7485=>509, 7486=>461, 7487=>485, 7488=>430, 7489=>511, 7490=>695, + 7491=>458, 7492=>458, 7493=>479, 7494=>712, 7495=>479, 7496=>479, 7497=>479, 7498=>479, 7499=>386, 7500=>386, 7501=>479, 7502=>219, 7503=>487, 7504=>664, 7505=>456, 7506=>488, + 7507=>414, 7508=>488, 7509=>488, 7510=>479, 7511=>388, 7512=>456, 7513=>462, 7514=>664, 7515=>501, 7517=>451, 7518=>429, 7519=>433, 7520=>493, 7521=>406, 7522=>219, 7523=>315, + 7524=>456, 7525=>501, 7526=>451, 7527=>429, 7528=>433, 7529=>493, 7530=>406, 7543=>716, 7544=>527, 7547=>545, 7557=>514, 7579=>479, 7580=>414, 7581=>414, 7582=>488, 7583=>386, + 7584=>377, 7585=>348, 7586=>479, 7587=>456, 7588=>347, 7589=>281, 7590=>347, 7591=>347, 7592=>431, 7593=>326, 7594=>330, 7595=>370, 7596=>664, 7597=>664, 7598=>562, 7599=>562, + 7600=>448, 7601=>488, 7602=>542, 7603=>422, 7604=>396, 7605=>388, 7606=>583, 7607=>494, 7608=>399, 7609=>451, 7610=>501, 7611=>417, 7612=>523, 7613=>470, 7614=>455, 7615=>425, + 7620=>0, 7621=>0, 7622=>0, 7623=>0, 7624=>0, 7625=>0, 7680=>774, 7681=>675, 7682=>762, 7683=>716, 7684=>762, 7685=>716, 7686=>762, 7687=>716, 7688=>734, 7689=>593, + 7690=>830, 7691=>716, 7692=>830, 7693=>716, 7694=>830, 7695=>716, 7696=>830, 7697=>716, 7698=>830, 7699=>716, 7700=>683, 7701=>678, 7702=>683, 7703=>678, 7704=>683, 7705=>678, + 7706=>683, 7707=>678, 7708=>683, 7709=>678, 7710=>683, 7711=>435, 7712=>821, 7713=>716, 7714=>837, 7715=>712, 7716=>837, 7717=>712, 7718=>837, 7719=>712, 7720=>837, 7721=>712, + 7722=>837, 7723=>712, 7724=>372, 7725=>343, 7726=>372, 7727=>343, 7728=>775, 7729=>665, 7730=>775, 7731=>665, 7732=>775, 7733=>665, 7734=>637, 7735=>343, 7736=>637, 7737=>343, + 7738=>637, 7739=>343, 7740=>637, 7741=>343, 7742=>995, 7743=>1042, 7744=>995, 7745=>1042, 7746=>995, 7747=>1042, 7748=>837, 7749=>712, 7750=>837, 7751=>712, 7752=>837, 7753=>712, + 7754=>837, 7755=>712, 7756=>850, 7757=>687, 7758=>850, 7759=>687, 7760=>850, 7761=>687, 7762=>850, 7763=>687, 7764=>733, 7765=>716, 7766=>733, 7767=>716, 7768=>770, 7769=>493, + 7770=>770, 7771=>493, 7772=>770, 7773=>493, 7774=>770, 7775=>493, 7776=>720, 7777=>595, 7778=>720, 7779=>595, 7780=>720, 7781=>595, 7782=>720, 7783=>595, 7784=>720, 7785=>595, + 7786=>682, 7787=>478, 7788=>682, 7789=>478, 7790=>682, 7791=>478, 7792=>682, 7793=>478, 7794=>812, 7795=>712, 7796=>812, 7797=>712, 7798=>812, 7799=>712, 7800=>812, 7801=>712, + 7802=>812, 7803=>712, 7804=>774, 7805=>652, 7806=>774, 7807=>652, 7808=>1103, 7809=>924, 7810=>1103, 7811=>924, 7812=>1103, 7813=>924, 7814=>1103, 7815=>924, 7816=>1103, 7817=>924, + 7818=>771, 7819=>645, 7820=>771, 7821=>645, 7822=>724, 7823=>652, 7824=>725, 7825=>582, 7826=>725, 7827=>582, 7828=>725, 7829=>582, 7830=>712, 7831=>478, 7832=>924, 7833=>652, + 7834=>675, 7835=>435, 7840=>774, 7841=>675, 7842=>774, 7843=>675, 7844=>774, 7845=>675, 7846=>774, 7847=>675, 7848=>774, 7849=>675, 7850=>774, 7851=>675, 7852=>774, 7853=>675, + 7854=>774, 7855=>675, 7856=>774, 7857=>675, 7858=>774, 7859=>675, 7860=>774, 7861=>675, 7862=>774, 7863=>675, 7864=>683, 7865=>678, 7866=>683, 7867=>678, 7868=>683, 7869=>678, + 7870=>683, 7871=>678, 7872=>683, 7873=>678, 7874=>683, 7875=>678, 7876=>683, 7877=>678, 7878=>683, 7879=>678, 7880=>372, 7881=>343, 7882=>372, 7883=>343, 7884=>850, 7885=>687, + 7886=>850, 7887=>687, 7888=>850, 7889=>687, 7890=>850, 7891=>687, 7892=>850, 7893=>687, 7894=>850, 7895=>687, 7896=>850, 7897=>687, 7898=>850, 7899=>687, 7900=>850, 7901=>687, + 7902=>850, 7903=>687, 7904=>850, 7905=>687, 7906=>850, 7907=>687, 7908=>812, 7909=>712, 7910=>812, 7911=>712, 7912=>812, 7913=>712, 7914=>812, 7915=>712, 7916=>812, 7917=>712, + 7918=>812, 7919=>712, 7920=>812, 7921=>712, 7922=>724, 7923=>652, 7924=>724, 7925=>652, 7926=>724, 7927=>652, 7928=>724, 7929=>652, 7936=>687, 7937=>687, 7938=>687, 7939=>687, + 7940=>687, 7941=>687, 7942=>687, 7943=>687, 7944=>774, 7945=>774, 7946=>1041, 7947=>1043, 7948=>935, 7949=>963, 7950=>835, 7951=>859, 7952=>557, 7953=>557, 7954=>557, 7955=>557, + 7956=>557, 7957=>557, 7960=>792, 7961=>794, 7962=>1100, 7963=>1096, 7964=>1023, 7965=>1052, 7968=>712, 7969=>712, 7970=>712, 7971=>712, 7972=>712, 7973=>712, 7974=>712, 7975=>712, + 7976=>945, 7977=>951, 7978=>1250, 7979=>1250, 7980=>1180, 7981=>1206, 7982=>1054, 7983=>1063, 7984=>390, 7985=>390, 7986=>390, 7987=>390, 7988=>390, 7989=>390, 7990=>390, 7991=>390, + 7992=>483, 7993=>489, 7994=>777, 7995=>785, 7996=>712, 7997=>738, 7998=>604, 7999=>604, 8000=>687, 8001=>687, 8002=>687, 8003=>687, 8004=>687, 8005=>687, 8008=>892, 8009=>933, + 8010=>1221, 8011=>1224, 8012=>1053, 8013=>1082, 8016=>675, 8017=>675, 8018=>675, 8019=>675, 8020=>675, 8021=>675, 8022=>675, 8023=>675, 8025=>930, 8027=>1184, 8029=>1199, 8031=>1049, + 8032=>869, 8033=>869, 8034=>869, 8035=>869, 8036=>869, 8037=>869, 8038=>869, 8039=>869, 8040=>909, 8041=>958, 8042=>1246, 8043=>1251, 8044=>1076, 8045=>1105, 8046=>1028, 8047=>1076, + 8048=>687, 8049=>687, 8050=>557, 8051=>557, 8052=>712, 8053=>712, 8054=>390, 8055=>390, 8056=>687, 8057=>687, 8058=>675, 8059=>675, 8060=>869, 8061=>869, 8064=>687, 8065=>687, + 8066=>687, 8067=>687, 8068=>687, 8069=>687, 8070=>687, 8071=>687, 8072=>774, 8073=>774, 8074=>1041, 8075=>1043, 8076=>935, 8077=>963, 8078=>835, 8079=>859, 8080=>712, 8081=>712, + 8082=>712, 8083=>712, 8084=>712, 8085=>712, 8086=>712, 8087=>712, 8088=>945, 8089=>951, 8090=>1250, 8091=>1250, 8092=>1180, 8093=>1206, 8094=>1054, 8095=>1063, 8096=>869, 8097=>869, + 8098=>869, 8099=>869, 8100=>869, 8101=>869, 8102=>869, 8103=>869, 8104=>909, 8105=>958, 8106=>1246, 8107=>1251, 8108=>1076, 8109=>1105, 8110=>1028, 8111=>1076, 8112=>687, 8113=>687, + 8114=>687, 8115=>687, 8116=>687, 8118=>687, 8119=>687, 8120=>774, 8121=>774, 8122=>876, 8123=>797, 8124=>774, 8125=>500, 8126=>500, 8127=>500, 8128=>500, 8129=>500, 8130=>712, + 8131=>712, 8132=>712, 8134=>712, 8135=>712, 8136=>929, 8137=>846, 8138=>1080, 8139=>1009, 8140=>837, 8141=>500, 8142=>500, 8143=>500, 8144=>390, 8145=>390, 8146=>390, 8147=>390, + 8150=>390, 8151=>390, 8152=>372, 8153=>372, 8154=>621, 8155=>563, 8157=>500, 8158=>500, 8159=>500, 8160=>675, 8161=>675, 8162=>675, 8163=>675, 8164=>716, 8165=>716, 8166=>675, + 8167=>675, 8168=>724, 8169=>724, 8170=>1020, 8171=>980, 8172=>838, 8173=>500, 8174=>500, 8175=>500, 8178=>869, 8179=>869, 8180=>869, 8182=>869, 8183=>869, 8184=>1065, 8185=>891, + 8186=>1084, 8187=>894, 8188=>850, 8189=>500, 8190=>500, 8192=>500, 8193=>1000, 8194=>500, 8195=>1000, 8196=>330, 8197=>250, 8198=>167, 8199=>696, 8200=>380, 8201=>200, 8202=>100, + 8203=>0, 8204=>0, 8205=>0, 8206=>0, 8207=>0, 8208=>415, 8209=>415, 8210=>696, 8213=>1000, 8214=>500, 8215=>500, 8219=>380, 8223=>657, 8227=>639, 8228=>380, 8229=>685, + 8231=>348, 8234=>0, 8235=>0, 8236=>0, 8237=>0, 8238=>0, 8239=>200, 8241=>1908, 8242=>264, 8243=>447, 8244=>630, 8245=>264, 8246=>447, 8247=>630, 8248=>733, 8251=>972, + 8252=>627, 8253=>580, 8254=>500, 8255=>828, 8256=>828, 8257=>329, 8258=>1023, 8259=>500, 8260=>167, 8261=>457, 8262=>457, 8263=>1030, 8264=>829, 8265=>829, 8266=>513, 8267=>687, + 8268=>500, 8269=>500, 8270=>523, 8271=>400, 8272=>828, 8273=>523, 8274=>556, 8275=>838, 8276=>829, 8277=>838, 8278=>684, 8279=>813, 8280=>838, 8281=>838, 8282=>380, 8283=>872, + 8284=>838, 8285=>380, 8286=>380, 8287=>222, 8288=>0, 8289=>0, 8290=>0, 8291=>0, 8298=>0, 8299=>0, 8300=>0, 8301=>0, 8302=>0, 8303=>0, 8304=>438, 8305=>219, + 8308=>438, 8309=>438, 8310=>438, 8311=>438, 8312=>438, 8313=>438, 8314=>528, 8315=>528, 8316=>528, 8317=>288, 8318=>288, 8319=>456, 8320=>438, 8321=>438, 8322=>438, 8323=>438, + 8324=>438, 8325=>438, 8326=>438, 8327=>438, 8328=>438, 8329=>438, 8330=>528, 8331=>528, 8332=>528, 8333=>288, 8334=>288, 8336=>458, 8337=>479, 8338=>488, 8339=>413, 8340=>479, + 8352=>929, 8353=>696, 8354=>696, 8355=>696, 8356=>696, 8357=>1042, 8358=>837, 8359=>1488, 8360=>1205, 8361=>1103, 8362=>854, 8363=>714, 8365=>696, 8366=>682, 8367=>1392, 8368=>696, + 8369=>696, 8370=>696, 8371=>696, 8372=>859, 8373=>696, 8400=>0, 8401=>0, 8406=>0, 8407=>0, 8448=>1106, 8449=>1106, 8450=>734, 8451=>1211, 8452=>896, 8453=>1114, 8454=>1148, + 8455=>696, 8456=>698, 8457=>952, 8459=>1073, 8460=>913, 8461=>850, 8462=>712, 8463=>712, 8464=>604, 8465=>697, 8466=>868, 8467=>472, 8468=>974, 8469=>837, 8470=>1203, 8471=>1000, + 8472=>697, 8473=>702, 8474=>850, 8475=>876, 8476=>814, 8477=>792, 8478=>896, 8479=>710, 8480=>1020, 8481=>1239, 8483=>834, 8484=>725, 8485=>622, 8486=>850, 8487=>769, 8488=>763, + 8489=>303, 8490=>775, 8491=>774, 8492=>928, 8493=>776, 8494=>854, 8495=>636, 8496=>738, 8497=>811, 8498=>683, 8499=>1193, 8500=>465, 8501=>794, 8502=>736, 8503=>503, 8504=>695, + 8505=>380, 8506=>945, 8507=>1370, 8508=>790, 8509=>737, 8510=>652, 8511=>845, 8512=>840, 8513=>786, 8514=>576, 8515=>637, 8516=>760, 8517=>830, 8518=>716, 8519=>678, 8520=>343, + 8521=>343, 8523=>872, 8526=>547, 8531=>1035, 8532=>1035, 8533=>1035, 8534=>1035, 8535=>1035, 8536=>1035, 8537=>1035, 8538=>1035, 8539=>1035, 8540=>1035, 8541=>1035, 8542=>1035, 8543=>615, + 8544=>372, 8545=>659, 8546=>945, 8547=>1099, 8548=>774, 8549=>1099, 8550=>1386, 8551=>1672, 8552=>1121, 8553=>771, 8554=>1120, 8555=>1407, 8556=>637, 8557=>734, 8558=>830, 8559=>995, + 8560=>343, 8561=>607, 8562=>872, 8563=>984, 8564=>652, 8565=>962, 8566=>1227, 8567=>1491, 8568=>969, 8569=>645, 8570=>969, 8571=>1233, 8572=>343, 8573=>593, 8574=>716, 8575=>1042, + 8576=>1289, 8577=>830, 8578=>1289, 8579=>734, 8580=>593, 8592=>838, 8593=>838, 8594=>838, 8595=>838, 8596=>838, 8597=>838, 8598=>838, 8599=>838, 8600=>838, 8601=>838, 8602=>838, + 8603=>838, 8604=>838, 8605=>838, 8606=>838, 8607=>838, 8608=>838, 8609=>838, 8610=>838, 8611=>838, 8612=>838, 8613=>838, 8614=>838, 8615=>838, 8616=>838, 8617=>838, 8618=>838, + 8619=>838, 8620=>838, 8621=>838, 8622=>838, 8623=>838, 8624=>838, 8625=>838, 8626=>838, 8627=>838, 8628=>838, 8629=>838, 8630=>838, 8631=>838, 8632=>838, 8633=>838, 8634=>838, + 8635=>838, 8636=>838, 8637=>838, 8638=>838, 8639=>838, 8640=>838, 8641=>838, 8642=>838, 8643=>838, 8644=>838, 8645=>838, 8646=>838, 8647=>838, 8648=>838, 8649=>838, 8650=>838, + 8651=>838, 8652=>838, 8653=>838, 8654=>838, 8655=>838, 8656=>838, 8657=>838, 8658=>838, 8659=>838, 8660=>838, 8661=>838, 8662=>838, 8663=>838, 8664=>838, 8665=>838, 8666=>838, + 8667=>838, 8668=>838, 8669=>838, 8670=>838, 8671=>838, 8672=>838, 8673=>838, 8674=>838, 8675=>838, 8676=>838, 8677=>838, 8678=>838, 8679=>838, 8680=>838, 8681=>838, 8682=>838, + 8683=>838, 8684=>838, 8685=>838, 8686=>838, 8687=>838, 8688=>838, 8689=>838, 8690=>838, 8691=>838, 8692=>838, 8693=>838, 8694=>838, 8695=>838, 8696=>838, 8697=>838, 8698=>838, + 8699=>838, 8700=>838, 8701=>838, 8702=>838, 8703=>838, 8704=>774, 8705=>696, 8706=>544, 8707=>683, 8708=>683, 8709=>856, 8710=>697, 8711=>697, 8712=>896, 8713=>896, 8714=>750, + 8715=>896, 8716=>896, 8717=>750, 8718=>636, 8719=>787, 8720=>787, 8721=>718, 8722=>838, 8723=>838, 8724=>696, 8725=>167, 8726=>696, 8727=>838, 8728=>626, 8729=>380, 8730=>667, + 8731=>667, 8732=>667, 8733=>669, 8734=>833, 8735=>838, 8736=>896, 8737=>896, 8738=>838, 8739=>500, 8740=>500, 8741=>500, 8742=>500, 8743=>812, 8744=>812, 8745=>812, 8746=>812, + 8747=>610, 8748=>929, 8749=>1295, 8750=>563, 8751=>977, 8752=>1313, 8753=>563, 8754=>563, 8755=>563, 8756=>696, 8757=>696, 8758=>294, 8759=>696, 8760=>838, 8761=>838, 8762=>838, + 8763=>838, 8764=>838, 8765=>838, 8766=>838, 8767=>838, 8768=>375, 8769=>838, 8770=>838, 8771=>838, 8772=>838, 8773=>838, 8774=>838, 8775=>838, 8776=>838, 8777=>838, 8778=>838, + 8779=>838, 8780=>838, 8781=>838, 8782=>838, 8783=>838, 8784=>838, 8785=>838, 8786=>838, 8787=>838, 8788=>1063, 8789=>1063, 8790=>838, 8791=>838, 8792=>838, 8793=>838, 8794=>838, + 8795=>838, 8796=>838, 8797=>838, 8798=>838, 8799=>838, 8800=>838, 8801=>838, 8802=>838, 8803=>838, 8804=>838, 8805=>838, 8806=>838, 8807=>838, 8808=>841, 8809=>841, 8810=>1047, + 8811=>1047, 8812=>500, 8813=>838, 8814=>838, 8815=>838, 8816=>838, 8817=>838, 8818=>838, 8819=>838, 8820=>838, 8821=>838, 8822=>838, 8823=>838, 8824=>838, 8825=>838, 8826=>838, + 8827=>838, 8828=>838, 8829=>838, 8830=>838, 8831=>838, 8832=>838, 8833=>838, 8834=>838, 8835=>838, 8836=>838, 8837=>838, 8838=>838, 8839=>838, 8840=>838, 8841=>838, 8842=>838, + 8843=>838, 8844=>812, 8845=>812, 8846=>812, 8847=>838, 8848=>838, 8849=>838, 8850=>838, 8851=>754, 8852=>754, 8853=>838, 8854=>838, 8855=>838, 8856=>838, 8857=>838, 8858=>838, + 8859=>838, 8860=>838, 8861=>838, 8862=>838, 8863=>838, 8864=>838, 8865=>838, 8866=>914, 8867=>914, 8868=>914, 8869=>914, 8870=>542, 8871=>542, 8872=>914, 8873=>914, 8874=>914, + 8875=>914, 8876=>914, 8877=>914, 8878=>914, 8879=>914, 8882=>838, 8883=>838, 8884=>838, 8885=>838, 8886=>1000, 8887=>1000, 8888=>838, 8889=>838, 8890=>542, 8891=>812, 8892=>812, + 8893=>812, 8896=>843, 8897=>843, 8898=>843, 8899=>843, 8900=>494, 8901=>380, 8902=>626, 8904=>1000, 8905=>1000, 8906=>1000, 8907=>1000, 8908=>1000, 8909=>838, 8918=>838, 8919=>838, + 8920=>1422, 8921=>1422, 8922=>838, 8923=>838, 8924=>838, 8925=>838, 8926=>838, 8927=>838, 8928=>838, 8929=>838, 8930=>838, 8931=>838, 8932=>838, 8933=>838, 8934=>838, 8935=>838, + 8936=>838, 8937=>838, 8938=>838, 8939=>838, 8940=>838, 8941=>838, 8946=>1158, 8947=>896, 8948=>750, 8949=>896, 8950=>896, 8951=>750, 8952=>896, 8953=>896, 8954=>1158, 8955=>896, + 8956=>750, 8957=>896, 8958=>750, 8959=>896, 8962=>716, 8966=>917, 8968=>457, 8969=>457, 8970=>457, 8971=>457, 8976=>838, 8977=>539, 8984=>928, 8985=>838, 8992=>610, 8993=>610, + 8997=>1000, 9000=>1443, 9085=>863, 9115=>500, 9116=>500, 9117=>500, 9118=>500, 9119=>500, 9120=>500, 9121=>500, 9122=>500, 9123=>500, 9124=>500, 9125=>500, 9126=>500, 9127=>750, + 9128=>750, 9129=>750, 9130=>750, 9131=>750, 9132=>750, 9133=>750, 9134=>610, 9166=>838, 9167=>945, 9250=>716, 9251=>716, 9312=>847, 9313=>847, 9314=>847, 9315=>847, 9316=>847, + 9317=>847, 9318=>847, 9319=>847, 9320=>847, 9321=>847, 9600=>769, 9601=>769, 9602=>769, 9603=>769, 9604=>769, 9605=>769, 9606=>769, 9607=>769, 9608=>769, 9609=>769, 9610=>769, + 9611=>769, 9612=>769, 9613=>769, 9614=>769, 9615=>769, 9616=>769, 9617=>769, 9618=>769, 9619=>769, 9620=>769, 9621=>769, 9622=>769, 9623=>769, 9624=>769, 9625=>769, 9626=>769, + 9627=>769, 9628=>769, 9629=>769, 9630=>769, 9631=>769, 9632=>945, 9633=>945, 9634=>945, 9635=>945, 9636=>945, 9637=>945, 9638=>945, 9639=>945, 9640=>945, 9641=>945, 9642=>678, + 9643=>678, 9644=>945, 9645=>945, 9646=>550, 9647=>550, 9648=>769, 9649=>769, 9650=>769, 9651=>769, 9652=>502, 9653=>502, 9654=>769, 9655=>769, 9656=>502, 9657=>502, 9658=>769, + 9659=>769, 9660=>769, 9661=>769, 9662=>502, 9663=>502, 9664=>769, 9665=>769, 9666=>502, 9667=>502, 9668=>769, 9669=>769, 9670=>769, 9671=>769, 9672=>769, 9673=>873, 9674=>494, + 9675=>873, 9676=>873, 9677=>873, 9678=>873, 9679=>873, 9680=>873, 9681=>873, 9682=>873, 9683=>873, 9684=>873, 9685=>873, 9686=>527, 9687=>527, 9688=>840, 9689=>970, 9690=>970, + 9691=>970, 9692=>387, 9693=>387, 9694=>387, 9695=>387, 9696=>769, 9697=>769, 9698=>769, 9699=>769, 9700=>769, 9701=>769, 9702=>639, 9703=>945, 9704=>945, 9705=>945, 9706=>945, + 9707=>945, 9708=>769, 9709=>769, 9710=>769, 9711=>1119, 9712=>945, 9713=>945, 9714=>945, 9715=>945, 9716=>873, 9717=>873, 9718=>873, 9719=>873, 9720=>769, 9721=>769, 9722=>769, + 9723=>830, 9724=>830, 9725=>732, 9726=>732, 9727=>769, 9728=>896, 9729=>1000, 9730=>896, 9731=>896, 9732=>896, 9733=>896, 9734=>896, 9735=>573, 9736=>896, 9737=>896, 9738=>888, + 9739=>888, 9740=>671, 9741=>1013, 9742=>1246, 9743=>1250, 9744=>896, 9745=>896, 9746=>896, 9747=>532, 9748=>896, 9749=>896, 9750=>896, 9751=>896, 9752=>896, 9753=>896, 9754=>896, + 9755=>896, 9756=>896, 9757=>609, 9758=>896, 9759=>609, 9760=>896, 9761=>896, 9762=>896, 9763=>896, 9764=>669, 9765=>746, 9766=>649, 9767=>784, 9768=>545, 9769=>896, 9770=>896, + 9771=>896, 9772=>710, 9773=>896, 9774=>896, 9775=>896, 9776=>896, 9777=>896, 9778=>896, 9779=>896, 9780=>896, 9781=>896, 9782=>896, 9783=>896, 9784=>896, 9785=>896, 9786=>896, + 9787=>896, 9788=>896, 9789=>896, 9790=>896, 9791=>614, 9792=>731, 9793=>731, 9794=>896, 9795=>896, 9796=>896, 9797=>896, 9798=>896, 9799=>896, 9800=>896, 9801=>896, 9802=>896, + 9803=>896, 9804=>896, 9805=>896, 9806=>896, 9807=>896, 9808=>896, 9809=>896, 9810=>896, 9811=>896, 9812=>896, 9813=>896, 9814=>896, 9815=>896, 9816=>896, 9817=>896, 9818=>896, + 9819=>896, 9820=>896, 9821=>896, 9822=>896, 9823=>896, 9824=>896, 9825=>896, 9826=>896, 9827=>896, 9828=>896, 9829=>896, 9830=>896, 9831=>896, 9832=>896, 9833=>472, 9834=>638, + 9835=>896, 9836=>896, 9837=>472, 9838=>357, 9839=>484, 9840=>748, 9841=>766, 9842=>896, 9843=>896, 9844=>896, 9845=>896, 9846=>896, 9847=>896, 9848=>896, 9849=>896, 9850=>896, + 9851=>896, 9852=>896, 9853=>896, 9854=>896, 9855=>896, 9856=>869, 9857=>869, 9858=>869, 9859=>869, 9860=>869, 9861=>869, 9862=>896, 9863=>896, 9864=>896, 9865=>896, 9866=>896, + 9867=>896, 9868=>896, 9869=>896, 9870=>896, 9871=>896, 9872=>896, 9873=>896, 9874=>896, 9875=>896, 9876=>896, 9877=>541, 9878=>896, 9879=>896, 9880=>896, 9881=>896, 9882=>896, + 9883=>896, 9884=>896, 9888=>896, 9889=>702, 9890=>838, 9891=>838, 9892=>838, 9893=>838, 9894=>838, 9895=>838, 9896=>838, 9897=>838, 9898=>838, 9899=>838, 9900=>838, 9901=>838, + 9902=>838, 9903=>838, 9904=>844, 9905=>838, 9906=>731, 9985=>838, 9986=>838, 9987=>838, 9988=>838, 9990=>838, 9991=>838, 9992=>838, 9993=>838, 9996=>838, 9997=>838, 9998=>838, + 9999=>838, 10000=>838, 10001=>838, 10002=>838, 10003=>838, 10004=>838, 10005=>838, 10006=>838, 10007=>838, 10008=>838, 10009=>838, 10010=>838, 10011=>838, 10012=>838, 10013=>838, 10014=>838, + 10015=>838, 10016=>838, 10017=>838, 10018=>838, 10019=>838, 10020=>838, 10021=>838, 10022=>838, 10023=>838, 10025=>838, 10026=>838, 10027=>838, 10028=>838, 10029=>838, 10030=>838, 10031=>838, + 10032=>838, 10033=>838, 10034=>838, 10035=>838, 10036=>838, 10037=>838, 10038=>838, 10039=>838, 10040=>838, 10041=>838, 10042=>838, 10043=>838, 10044=>838, 10045=>838, 10046=>838, 10047=>838, + 10048=>838, 10049=>838, 10050=>838, 10051=>838, 10052=>838, 10053=>838, 10054=>838, 10055=>838, 10056=>838, 10057=>838, 10058=>838, 10059=>838, 10061=>896, 10063=>896, 10064=>896, 10065=>896, + 10066=>896, 10070=>896, 10072=>838, 10073=>838, 10074=>838, 10075=>322, 10076=>322, 10077=>538, 10078=>538, 10081=>838, 10082=>838, 10083=>838, 10084=>838, 10085=>838, 10086=>838, 10087=>838, + 10088=>838, 10089=>838, 10090=>838, 10091=>838, 10092=>838, 10093=>838, 10094=>838, 10095=>838, 10096=>838, 10097=>838, 10098=>838, 10099=>838, 10100=>838, 10101=>838, 10102=>847, 10103=>847, + 10104=>847, 10105=>847, 10106=>847, 10107=>847, 10108=>847, 10109=>847, 10110=>847, 10111=>847, 10112=>838, 10113=>838, 10114=>838, 10115=>838, 10116=>838, 10117=>838, 10118=>838, 10119=>838, + 10120=>838, 10121=>838, 10122=>838, 10123=>838, 10124=>838, 10125=>838, 10126=>838, 10127=>838, 10128=>838, 10129=>838, 10130=>838, 10131=>838, 10132=>838, 10136=>838, 10137=>838, 10138=>838, + 10139=>838, 10140=>838, 10141=>838, 10142=>838, 10143=>838, 10144=>838, 10145=>838, 10146=>838, 10147=>838, 10148=>838, 10149=>838, 10150=>838, 10151=>838, 10152=>838, 10153=>838, 10154=>838, + 10155=>838, 10156=>838, 10157=>838, 10158=>838, 10159=>838, 10161=>838, 10162=>838, 10163=>838, 10164=>838, 10165=>838, 10166=>838, 10167=>838, 10168=>838, 10169=>838, 10170=>838, 10171=>838, + 10172=>838, 10173=>838, 10174=>838, 10208=>494, 10214=>487, 10215=>487, 10216=>457, 10217=>457, 10218=>721, 10219=>721, 10224=>838, 10225=>838, 10226=>838, 10227=>838, 10228=>1157, 10229=>1434, + 10230=>1434, 10231=>1434, 10232=>1434, 10233=>1434, 10234=>1434, 10235=>1434, 10236=>1434, 10237=>1434, 10238=>1434, 10239=>1434, 10240=>781, 10241=>781, 10242=>781, 10243=>781, 10244=>781, 10245=>781, + 10246=>781, 10247=>781, 10248=>781, 10249=>781, 10250=>781, 10251=>781, 10252=>781, 10253=>781, 10254=>781, 10255=>781, 10256=>781, 10257=>781, 10258=>781, 10259=>781, 10260=>781, 10261=>781, + 10262=>781, 10263=>781, 10264=>781, 10265=>781, 10266=>781, 10267=>781, 10268=>781, 10269=>781, 10270=>781, 10271=>781, 10272=>781, 10273=>781, 10274=>781, 10275=>781, 10276=>781, 10277=>781, + 10278=>781, 10279=>781, 10280=>781, 10281=>781, 10282=>781, 10283=>781, 10284=>781, 10285=>781, 10286=>781, 10287=>781, 10288=>781, 10289=>781, 10290=>781, 10291=>781, 10292=>781, 10293=>781, + 10294=>781, 10295=>781, 10296=>781, 10297=>781, 10298=>781, 10299=>781, 10300=>781, 10301=>781, 10302=>781, 10303=>781, 10304=>781, 10305=>781, 10306=>781, 10307=>781, 10308=>781, 10309=>781, + 10310=>781, 10311=>781, 10312=>781, 10313=>781, 10314=>781, 10315=>781, 10316=>781, 10317=>781, 10318=>781, 10319=>781, 10320=>781, 10321=>781, 10322=>781, 10323=>781, 10324=>781, 10325=>781, + 10326=>781, 10327=>781, 10328=>781, 10329=>781, 10330=>781, 10331=>781, 10332=>781, 10333=>781, 10334=>781, 10335=>781, 10336=>781, 10337=>781, 10338=>781, 10339=>781, 10340=>781, 10341=>781, + 10342=>781, 10343=>781, 10344=>781, 10345=>781, 10346=>781, 10347=>781, 10348=>781, 10349=>781, 10350=>781, 10351=>781, 10352=>781, 10353=>781, 10354=>781, 10355=>781, 10356=>781, 10357=>781, + 10358=>781, 10359=>781, 10360=>781, 10361=>781, 10362=>781, 10363=>781, 10364=>781, 10365=>781, 10366=>781, 10367=>781, 10368=>781, 10369=>781, 10370=>781, 10371=>781, 10372=>781, 10373=>781, + 10374=>781, 10375=>781, 10376=>781, 10377=>781, 10378=>781, 10379=>781, 10380=>781, 10381=>781, 10382=>781, 10383=>781, 10384=>781, 10385=>781, 10386=>781, 10387=>781, 10388=>781, 10389=>781, + 10390=>781, 10391=>781, 10392=>781, 10393=>781, 10394=>781, 10395=>781, 10396=>781, 10397=>781, 10398=>781, 10399=>781, 10400=>781, 10401=>781, 10402=>781, 10403=>781, 10404=>781, 10405=>781, + 10406=>781, 10407=>781, 10408=>781, 10409=>781, 10410=>781, 10411=>781, 10412=>781, 10413=>781, 10414=>781, 10415=>781, 10416=>781, 10417=>781, 10418=>781, 10419=>781, 10420=>781, 10421=>781, + 10422=>781, 10423=>781, 10424=>781, 10425=>781, 10426=>781, 10427=>781, 10428=>781, 10429=>781, 10430=>781, 10431=>781, 10432=>781, 10433=>781, 10434=>781, 10435=>781, 10436=>781, 10437=>781, + 10438=>781, 10439=>781, 10440=>781, 10441=>781, 10442=>781, 10443=>781, 10444=>781, 10445=>781, 10446=>781, 10447=>781, 10448=>781, 10449=>781, 10450=>781, 10451=>781, 10452=>781, 10453=>781, + 10454=>781, 10455=>781, 10456=>781, 10457=>781, 10458=>781, 10459=>781, 10460=>781, 10461=>781, 10462=>781, 10463=>781, 10464=>781, 10465=>781, 10466=>781, 10467=>781, 10468=>781, 10469=>781, + 10470=>781, 10471=>781, 10472=>781, 10473=>781, 10474=>781, 10475=>781, 10476=>781, 10477=>781, 10478=>781, 10479=>781, 10480=>781, 10481=>781, 10482=>781, 10483=>781, 10484=>781, 10485=>781, + 10486=>781, 10487=>781, 10488=>781, 10489=>781, 10490=>781, 10491=>781, 10492=>781, 10493=>781, 10494=>781, 10495=>781, 10502=>838, 10503=>838, 10506=>838, 10507=>838, 10560=>838, 10561=>838, + 10702=>838, 10703=>1046, 10704=>1046, 10705=>1000, 10706=>1000, 10707=>1000, 10708=>1000, 10709=>1000, 10731=>494, 10752=>1000, 10753=>1000, 10754=>1000, 10764=>1661, 10765=>563, 10766=>563, 10767=>563, + 10768=>563, 10769=>563, 10770=>563, 10771=>563, 10772=>563, 10773=>563, 10774=>563, 10775=>563, 10776=>563, 10777=>563, 10778=>563, 10779=>563, 10780=>563, 10877=>838, 10878=>838, 10879=>838, + 10880=>838, 10881=>838, 10882=>838, 10883=>838, 10884=>838, 10885=>838, 10886=>838, 10887=>838, 10888=>838, 10889=>838, 10890=>838, 10891=>838, 10892=>838, 10893=>838, 10894=>838, 10895=>838, + 10896=>838, 10897=>838, 10898=>838, 10899=>838, 10900=>838, 10901=>838, 10902=>838, 10903=>838, 10904=>838, 10905=>838, 10906=>838, 10907=>838, 10908=>838, 10909=>838, 10910=>838, 10911=>838, + 10912=>838, 10926=>838, 10927=>838, 10928=>838, 10929=>838, 10930=>838, 10931=>838, 10932=>838, 10933=>838, 10934=>838, 10935=>838, 10936=>838, 10937=>838, 10938=>838, 11001=>838, 11002=>838, + 11008=>838, 11009=>838, 11010=>838, 11011=>838, 11012=>838, 11013=>838, 11014=>838, 11015=>838, 11016=>838, 11017=>838, 11018=>838, 11019=>838, 11020=>838, 11021=>838, 11022=>838, 11023=>838, + 11024=>838, 11025=>838, 11026=>945, 11027=>945, 11028=>945, 11029=>945, 11030=>769, 11031=>769, 11032=>769, 11033=>769, 11034=>945, 11040=>869, 11041=>873, 11042=>873, 11043=>873, 11360=>637, + 11361=>360, 11362=>637, 11363=>733, 11364=>770, 11365=>675, 11366=>478, 11367=>956, 11368=>712, 11369=>775, 11370=>665, 11371=>725, 11372=>582, 11380=>652, 11381=>649, 11382=>516, 11383=>782, + 61960=>860, 62047=>720, 62917=>687, 64256=>833, 64257=>787, 64258=>787, 64259=>1138, 64260=>1139, 64261=>808, 64262=>1020, 64275=>1388, 64276=>1384, 64277=>1378, 64278=>1384, 64279=>1713, 64285=>372, + 64287=>692, 64288=>720, 64297=>838, 64298=>975, 64299=>975, 64300=>975, 64301=>975, 64302=>751, 64303=>751, 64304=>751, 64305=>731, 64306=>502, 64307=>684, 64308=>778, 64309=>467, 64310=>521, + 64312=>830, 64313=>467, 64314=>778, 64315=>754, 64316=>723, 64318=>868, 64320=>532, 64321=>830, 64323=>827, 64324=>866, 64326=>727, 64327=>814, 64328=>778, 64329=>975, 64330=>822, 64331=>372, + 64332=>731, 64333=>754, 64334=>866, 65024=>0, 65025=>0, 65026=>0, 65027=>0, 65028=>0, 65029=>0, 65030=>0, 65031=>0, 65032=>0, 65033=>0, 65034=>0, 65035=>0, 65036=>0, + 65037=>0, 65038=>0, 65039=>0, 65533=>1113); +$enc=''; +$diff=''; +$file='DejaVuSans-BoldOblique.z'; +$ctg='DejaVuSans-BoldOblique.ctg.z'; +$originalsize=468340; +?> diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-bold.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-bold.ctg.z new file mode 100644 index 00000000..e95b4f3c Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-bold.ctg.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-bold.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-bold.z new file mode 100644 index 00000000..703b210c Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-bold.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-boldoblique.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-boldoblique.ctg.z new file mode 100644 index 00000000..ec0f2595 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-boldoblique.ctg.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-boldoblique.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-boldoblique.z new file mode 100644 index 00000000..2e4262d7 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-boldoblique.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-oblique.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-oblique.ctg.z new file mode 100644 index 00000000..65a3e3d1 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-oblique.ctg.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-oblique.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-oblique.z new file mode 100644 index 00000000..2a48a4a8 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed-oblique.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.ctg.z new file mode 100644 index 00000000..fa197554 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.ctg.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.php new file mode 100644 index 00000000..be388e99 --- /dev/null +++ b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.php @@ -0,0 +1,287 @@ +928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>32,'FontBBox'=>'[-918 -356 1513 1068]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>540); +$up=-42; +$ut=44; +$cw=array( + 0=>540, 32=>286, 33=>360, 34=>414, 35=>754, 36=>572, 37=>855, 38=>702, 39=>247, 40=>351, 41=>351, 42=>450, 43=>754, 44=>286, 45=>325, 46=>286, + 47=>303, 48=>572, 49=>572, 50=>572, 51=>572, 52=>572, 53=>572, 54=>572, 55=>572, 56=>572, 57=>572, 58=>303, 59=>303, 60=>754, 61=>754, 62=>754, + 63=>478, 64=>900, 65=>615, 66=>617, 67=>628, 68=>693, 69=>568, 70=>518, 71=>697, 72=>677, 73=>265, 74=>265, 75=>590, 76=>501, 77=>776, 78=>673, + 79=>708, 80=>542, 81=>708, 82=>625, 83=>571, 84=>549, 85=>659, 86=>615, 87=>890, 88=>616, 89=>549, 90=>616, 91=>351, 92=>303, 93=>351, 94=>754, + 95=>450, 96=>450, 97=>551, 98=>571, 99=>495, 100=>571, 101=>554, 102=>316, 103=>571, 104=>570, 105=>250, 106=>250, 107=>521, 108=>250, 109=>876, 110=>570, + 111=>550, 112=>571, 113=>571, 114=>370, 115=>469, 116=>353, 117=>570, 118=>532, 119=>736, 120=>532, 121=>532, 122=>472, 123=>572, 124=>303, 125=>572, 126=>754, + 8364=>572, 1027=>549, 8218=>286, 402=>316, 8222=>466, 8230=>900, 8224=>450, 8225=>450, 710=>450, 8240=>1208, 352=>571, 8249=>360, 338=>962, 1036=>639, 381=>616, 1039=>677, + 8216=>286, 8217=>286, 8220=>466, 8221=>466, 8226=>531, 8211=>450, 8212=>900, 732=>450, 8482=>900, 353=>469, 8250=>360, 339=>920, 1116=>543, 382=>472, 376=>549, 160=>286, + 161=>360, 162=>572, 163=>572, 164=>572, 165=>572, 166=>303, 167=>450, 168=>450, 169=>900, 170=>424, 171=>550, 172=>754, 173=>325, 174=>900, 175=>450, 176=>450, + 177=>754, 178=>360, 179=>360, 180=>450, 181=>572, 182=>572, 183=>286, 184=>450, 185=>360, 186=>424, 187=>550, 188=>872, 189=>872, 190=>872, 191=>478, 192=>615, + 193=>615, 194=>615, 195=>615, 196=>615, 197=>615, 198=>876, 199=>628, 200=>568, 201=>568, 202=>568, 203=>568, 204=>265, 205=>265, 206=>265, 207=>265, 208=>697, + 209=>673, 210=>708, 211=>708, 212=>708, 213=>708, 214=>708, 215=>754, 216=>708, 217=>659, 218=>659, 219=>659, 220=>659, 221=>549, 222=>544, 223=>567, 224=>551, + 225=>551, 226=>551, 227=>551, 228=>551, 229=>551, 230=>883, 231=>495, 232=>554, 233=>554, 234=>554, 235=>554, 236=>250, 237=>250, 238=>250, 239=>250, 240=>550, + 241=>570, 242=>550, 243=>550, 244=>550, 245=>550, 246=>550, 247=>754, 248=>550, 249=>570, 250=>570, 251=>570, 252=>570, 253=>532, 254=>571, 255=>532, 256=>615, + 257=>551, 258=>615, 259=>551, 260=>615, 261=>551, 262=>628, 263=>495, 264=>628, 265=>495, 266=>628, 267=>495, 268=>628, 269=>495, 270=>693, 271=>571, 272=>697, + 273=>571, 274=>568, 275=>554, 276=>568, 277=>554, 278=>568, 279=>554, 280=>568, 281=>554, 282=>568, 283=>554, 284=>697, 285=>571, 286=>697, 287=>571, 288=>697, + 289=>571, 290=>697, 291=>571, 292=>677, 293=>570, 294=>824, 295=>625, 296=>265, 297=>250, 298=>265, 299=>250, 300=>265, 301=>250, 302=>265, 303=>250, 304=>265, + 305=>250, 306=>531, 307=>500, 308=>265, 309=>250, 310=>590, 311=>521, 312=>521, 313=>501, 314=>264, 315=>501, 316=>250, 317=>501, 318=>337, 319=>501, 320=>308, + 321=>505, 322=>255, 323=>673, 324=>570, 325=>673, 326=>570, 327=>673, 328=>570, 329=>732, 330=>673, 331=>570, 332=>708, 333=>550, 334=>708, 335=>550, 336=>708, + 337=>550, 340=>625, 341=>370, 342=>625, 343=>370, 344=>625, 345=>370, 346=>571, 347=>469, 348=>571, 349=>469, 350=>571, 351=>469, 354=>549, 355=>353, 356=>549, + 357=>353, 358=>549, 359=>353, 360=>659, 361=>570, 362=>659, 363=>570, 364=>659, 365=>570, 366=>659, 367=>570, 368=>659, 369=>570, 370=>659, 371=>570, 372=>890, + 373=>736, 374=>549, 375=>532, 377=>616, 378=>472, 379=>616, 380=>472, 383=>316, 384=>571, 385=>661, 386=>617, 387=>571, 388=>617, 389=>571, 390=>633, 391=>628, + 392=>495, 393=>697, 394=>737, 395=>617, 396=>571, 397=>550, 398=>568, 399=>708, 400=>553, 401=>518, 403=>697, 404=>618, 405=>885, 406=>318, 407=>265, 408=>671, + 409=>521, 410=>250, 411=>532, 412=>876, 413=>673, 414=>570, 415=>708, 416=>822, 417=>550, 418=>854, 419=>683, 420=>586, 421=>571, 422=>625, 423=>571, 424=>469, + 425=>568, 426=>302, 427=>353, 428=>549, 429=>353, 430=>549, 431=>772, 432=>570, 433=>688, 434=>648, 435=>669, 436=>656, 437=>616, 438=>472, 439=>599, 440=>599, + 441=>520, 442=>472, 443=>572, 444=>599, 445=>520, 446=>459, 447=>571, 448=>265, 449=>443, 450=>413, 451=>266, 452=>1279, 453=>1169, 454=>1039, 455=>751, 456=>708, + 457=>411, 458=>838, 459=>831, 460=>717, 461=>615, 462=>551, 463=>265, 464=>250, 465=>708, 466=>550, 467=>659, 468=>570, 469=>659, 470=>570, 471=>659, 472=>570, + 473=>659, 474=>570, 475=>659, 476=>570, 477=>554, 478=>615, 479=>551, 480=>615, 481=>551, 482=>876, 483=>883, 484=>697, 485=>571, 486=>697, 487=>571, 488=>590, + 489=>521, 490=>708, 491=>550, 492=>708, 493=>550, 494=>599, 495=>520, 496=>250, 497=>1279, 498=>1169, 499=>1039, 500=>697, 501=>571, 502=>1001, 503=>614, 504=>673, + 505=>570, 506=>615, 507=>551, 508=>876, 509=>883, 510=>708, 511=>550, 512=>615, 513=>551, 514=>615, 515=>551, 516=>568, 517=>554, 518=>568, 519=>554, 520=>265, + 521=>250, 522=>265, 523=>250, 524=>708, 525=>550, 526=>708, 527=>550, 528=>625, 529=>370, 530=>625, 531=>370, 532=>659, 533=>570, 534=>659, 535=>570, 536=>571, + 537=>469, 538=>549, 539=>353, 540=>564, 541=>469, 542=>677, 543=>570, 544=>662, 545=>754, 546=>628, 547=>549, 548=>616, 549=>472, 550=>615, 551=>551, 552=>568, + 553=>554, 554=>708, 555=>550, 556=>708, 557=>550, 558=>708, 559=>550, 560=>708, 561=>550, 562=>549, 563=>532, 564=>427, 565=>758, 566=>429, 567=>250, 568=>898, + 569=>898, 570=>615, 571=>628, 572=>495, 573=>501, 574=>549, 575=>469, 576=>472, 577=>542, 578=>431, 579=>617, 580=>659, 581=>615, 582=>568, 583=>554, 584=>265, + 585=>250, 586=>703, 587=>571, 588=>625, 589=>370, 590=>549, 591=>532, 592=>540, 593=>571, 594=>571, 595=>571, 596=>494, 597=>495, 598=>571, 599=>626, 600=>554, + 601=>554, 602=>737, 603=>486, 604=>479, 605=>698, 606=>598, 607=>250, 608=>626, 609=>571, 610=>566, 611=>536, 612=>536, 613=>570, 614=>570, 615=>570, 616=>250, + 617=>304, 618=>334, 619=>356, 620=>438, 621=>250, 622=>635, 623=>876, 624=>876, 625=>876, 626=>581, 627=>578, 628=>570, 629=>550, 630=>772, 631=>655, 632=>593, + 633=>373, 634=>373, 635=>372, 636=>370, 637=>369, 638=>393, 639=>477, 640=>543, 641=>543, 642=>469, 643=>302, 644=>302, 645=>415, 646=>302, 647=>353, 648=>353, + 649=>570, 650=>556, 651=>538, 652=>532, 653=>736, 654=>532, 655=>549, 656=>472, 657=>472, 658=>520, 659=>520, 660=>459, 661=>459, 662=>459, 663=>459, 664=>708, + 665=>521, 666=>598, 667=>637, 668=>588, 669=>263, 670=>600, 671=>456, 672=>654, 673=>459, 674=>459, 675=>913, 676=>952, 677=>911, 678=>742, 679=>549, 680=>700, + 681=>763, 682=>576, 683=>589, 684=>463, 685=>463, 686=>513, 687=>597, 688=>364, 689=>359, 690=>157, 691=>233, 692=>266, 693=>266, 694=>341, 695=>463, 696=>335, + 697=>250, 698=>414, 699=>286, 700=>286, 701=>286, 702=>276, 703=>276, 704=>333, 705=>333, 706=>450, 707=>450, 708=>450, 709=>450, 711=>450, 712=>247, 713=>450, + 714=>450, 715=>450, 716=>247, 717=>450, 718=>450, 719=>450, 720=>303, 721=>303, 722=>276, 723=>276, 724=>450, 725=>450, 726=>371, 727=>450, 728=>450, 729=>450, + 730=>450, 731=>450, 733=>450, 734=>284, 735=>450, 736=>383, 737=>149, 738=>335, 739=>399, 740=>333, 741=>444, 742=>444, 743=>444, 744=>444, 745=>444, 748=>450, + 749=>450, 750=>450, 755=>450, 759=>450, 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 773=>0, 774=>0, 775=>0, 776=>0, 777=>0, 778=>0, 779=>0, + 780=>0, 781=>0, 782=>0, 783=>0, 784=>0, 785=>0, 786=>0, 787=>0, 788=>0, 789=>0, 790=>0, 791=>0, 792=>0, 793=>0, 794=>0, 795=>0, + 796=>0, 797=>0, 798=>0, 799=>0, 800=>0, 801=>0, 802=>0, 803=>0, 804=>0, 805=>0, 806=>0, 807=>0, 808=>0, 809=>0, 810=>0, 811=>0, + 812=>0, 813=>0, 814=>0, 815=>0, 816=>0, 817=>0, 818=>0, 819=>0, 820=>0, 821=>0, 822=>0, 823=>0, 824=>0, 825=>0, 826=>0, 827=>0, + 828=>0, 829=>0, 830=>0, 831=>0, 832=>0, 833=>0, 834=>0, 835=>0, 836=>0, 837=>0, 838=>0, 839=>0, 840=>0, 841=>0, 842=>0, 843=>0, + 844=>0, 845=>0, 846=>0, 847=>0, 849=>0, 850=>0, 851=>0, 855=>0, 856=>0, 860=>0, 861=>0, 862=>0, 863=>0, 864=>0, 865=>0, 866=>0, + 884=>250, 885=>250, 890=>450, 891=>494, 892=>495, 893=>494, 894=>303, 900=>450, 901=>450, 902=>623, 903=>286, 904=>671, 905=>784, 906=>367, 908=>731, 910=>742, + 911=>743, 912=>304, 913=>615, 914=>617, 915=>501, 916=>615, 917=>568, 918=>616, 919=>677, 920=>708, 921=>265, 922=>590, 923=>615, 924=>776, 925=>673, 926=>568, + 927=>708, 928=>677, 929=>542, 931=>568, 932=>549, 933=>549, 934=>708, 935=>616, 936=>708, 937=>688, 938=>265, 939=>549, 940=>593, 941=>493, 942=>589, 943=>304, + 944=>521, 945=>593, 946=>574, 947=>532, 948=>550, 949=>486, 950=>489, 951=>570, 952=>550, 953=>304, 954=>530, 955=>532, 956=>572, 957=>502, 958=>501, 959=>550, + 960=>542, 961=>571, 962=>528, 963=>570, 964=>542, 965=>521, 966=>593, 967=>520, 968=>593, 969=>753, 970=>304, 971=>521, 972=>550, 973=>521, 974=>753, 976=>553, + 977=>557, 978=>628, 979=>758, 980=>628, 981=>593, 982=>753, 983=>597, 984=>708, 985=>550, 986=>583, 987=>528, 988=>518, 989=>413, 990=>593, 991=>593, 992=>778, + 993=>564, 994=>840, 995=>753, 996=>682, 997=>593, 998=>712, 999=>553, 1000=>618, 1001=>546, 1002=>690, 1003=>563, 1004=>629, 1005=>550, 1006=>549, 1007=>482, 1008=>597, + 1009=>571, 1010=>495, 1011=>250, 1012=>708, 1013=>554, 1014=>554, 1015=>544, 1016=>571, 1017=>628, 1018=>776, 1019=>585, 1020=>571, 1021=>633, 1022=>628, 1023=>633, 1024=>568, + 1025=>568, 1026=>708, 1028=>628, 1029=>571, 1030=>265, 1031=>265, 1032=>265, 1033=>984, 1034=>940, 1035=>708, 1037=>673, 1038=>548, 1040=>615, 1041=>617, 1042=>617, 1043=>549, + 1044=>703, 1045=>568, 1046=>969, 1047=>577, 1048=>673, 1049=>673, 1050=>639, 1051=>677, 1052=>776, 1053=>677, 1054=>708, 1055=>677, 1056=>542, 1057=>628, 1058=>549, 1059=>548, + 1060=>774, 1061=>616, 1062=>699, 1063=>617, 1064=>962, 1065=>984, 1066=>749, 1067=>794, 1068=>617, 1069=>628, 1070=>971, 1071=>625, 1072=>551, 1073=>555, 1074=>530, 1075=>473, + 1076=>622, 1077=>554, 1078=>811, 1079=>479, 1080=>584, 1081=>584, 1082=>543, 1083=>575, 1084=>679, 1085=>588, 1086=>550, 1087=>588, 1088=>571, 1089=>495, 1090=>524, 1091=>532, + 1092=>769, 1093=>532, 1094=>612, 1095=>532, 1096=>823, 1097=>848, 1098=>636, 1099=>710, 1100=>530, 1101=>494, 1102=>757, 1103=>541, 1104=>554, 1105=>554, 1106=>563, 1107=>473, + 1108=>494, 1109=>469, 1110=>250, 1111=>250, 1112=>250, 1113=>812, 1114=>809, 1115=>586, 1117=>584, 1118=>532, 1119=>588, 1120=>840, 1121=>753, 1122=>693, 1123=>604, 1124=>848, + 1125=>674, 1126=>791, 1127=>705, 1128=>1043, 1129=>901, 1130=>708, 1131=>550, 1132=>924, 1133=>742, 1134=>572, 1135=>486, 1136=>771, 1137=>789, 1138=>708, 1139=>533, 1140=>703, + 1141=>598, 1142=>703, 1143=>598, 1144=>893, 1145=>813, 1146=>857, 1147=>682, 1148=>1062, 1149=>925, 1150=>840, 1151=>753, 1152=>628, 1153=>495, 1154=>452, 1155=>0, 1156=>0, + 1157=>0, 1158=>0, 1160=>376, 1161=>376, 1162=>695, 1163=>609, 1164=>617, 1165=>530, 1166=>542, 1167=>571, 1168=>549, 1169=>473, 1170=>607, 1171=>500, 1172=>562, 1173=>477, + 1174=>969, 1175=>811, 1176=>577, 1177=>479, 1178=>639, 1179=>543, 1180=>639, 1181=>543, 1182=>639, 1183=>543, 1184=>771, 1185=>748, 1186=>677, 1187=>594, 1188=>913, 1189=>789, + 1190=>973, 1191=>824, 1192=>716, 1193=>586, 1194=>628, 1195=>495, 1196=>549, 1197=>476, 1198=>549, 1199=>532, 1200=>549, 1201=>532, 1202=>616, 1203=>532, 1204=>840, 1205=>726, + 1206=>617, 1207=>532, 1208=>617, 1209=>532, 1210=>617, 1211=>570, 1212=>847, 1213=>655, 1214=>847, 1215=>655, 1216=>265, 1217=>969, 1218=>811, 1219=>590, 1220=>543, 1221=>698, + 1222=>603, 1223=>677, 1224=>594, 1225=>699, 1226=>612, 1227=>617, 1228=>532, 1229=>799, 1230=>697, 1231=>250, 1232=>615, 1233=>551, 1234=>615, 1235=>551, 1236=>876, 1237=>883, + 1238=>568, 1239=>554, 1240=>708, 1241=>554, 1242=>708, 1243=>554, 1244=>969, 1245=>811, 1246=>577, 1247=>479, 1248=>599, 1249=>520, 1250=>673, 1251=>584, 1252=>673, 1253=>584, + 1254=>708, 1255=>550, 1256=>708, 1257=>550, 1258=>708, 1259=>550, 1260=>628, 1261=>494, 1262=>548, 1263=>532, 1264=>548, 1265=>532, 1266=>548, 1267=>532, 1268=>617, 1269=>532, + 1270=>501, 1271=>442, 1272=>794, 1273=>710, 1274=>607, 1275=>500, 1276=>616, 1277=>532, 1278=>616, 1279=>532, 1280=>617, 1281=>530, 1282=>905, 1283=>807, 1284=>877, 1285=>782, + 1286=>611, 1287=>529, 1288=>964, 1289=>861, 1290=>965, 1291=>870, 1292=>697, 1293=>593, 1294=>695, 1295=>640, 1296=>553, 1297=>486, 1298=>677, 1299=>575, 1329=>780, 1330=>659, + 1331=>794, 1332=>794, 1333=>659, 1334=>579, 1335=>613, 1336=>659, 1337=>765, 1338=>794, 1339=>659, 1340=>501, 1341=>741, 1342=>888, 1343=>659, 1344=>636, 1345=>579, 1346=>794, + 1347=>699, 1348=>794, 1349=>659, 1350=>756, 1351=>659, 1352=>659, 1353=>659, 1354=>711, 1355=>579, 1356=>794, 1357=>659, 1358=>794, 1359=>571, 1360=>659, 1361=>659, 1362=>719, + 1363=>774, 1364=>711, 1365=>708, 1366=>571, 1369=>276, 1370=>286, 1371=>450, 1372=>450, 1373=>352, 1374=>474, 1375=>450, 1377=>876, 1378=>570, 1379=>686, 1380=>690, 1381=>570, + 1382=>627, 1383=>479, 1384=>570, 1385=>630, 1386=>627, 1387=>570, 1388=>363, 1389=>804, 1390=>576, 1391=>570, 1392=>570, 1393=>571, 1394=>631, 1395=>570, 1396=>593, 1397=>250, + 1398=>684, 1399=>464, 1400=>570, 1401=>407, 1402=>876, 1403=>464, 1404=>691, 1405=>570, 1406=>626, 1407=>876, 1408=>570, 1409=>571, 1410=>451, 1411=>876, 1412=>583, 1413=>550, + 1414=>566, 1415=>686, 1417=>303, 1418=>390, 1456=>0, 1457=>0, 1458=>0, 1459=>0, 1460=>0, 1461=>0, 1462=>0, 1463=>0, 1464=>0, 1465=>0, 1467=>0, 1468=>0, + 1469=>0, 1471=>0, 1472=>265, 1473=>0, 1474=>0, 1475=>265, 1478=>410, 1479=>0, 1488=>566, 1489=>547, 1490=>403, 1491=>534, 1492=>576, 1493=>245, 1494=>380, 1495=>576, + 1496=>583, 1497=>245, 1498=>532, 1499=>500, 1500=>539, 1501=>576, 1502=>593, 1503=>245, 1504=>397, 1505=>629, 1506=>572, 1507=>576, 1508=>543, 1509=>468, 1510=>523, 1511=>596, + 1512=>532, 1513=>727, 1514=>591, 1520=>423, 1521=>409, 1522=>423, 1548=>290, 1557=>0, 1563=>286, 1567=>478, 1569=>423, 1570=>250, 1571=>250, 1572=>435, 1573=>250, 1574=>704, + 1575=>250, 1576=>847, 1577=>471, 1578=>847, 1579=>847, 1580=>581, 1581=>581, 1582=>581, 1583=>400, 1584=>400, 1585=>435, 1586=>435, 1587=>1099, 1588=>1099, 1589=>1088, 1590=>1088, + 1591=>832, 1592=>832, 1593=>537, 1594=>537, 1600=>264, 1601=>933, 1602=>698, 1603=>742, 1604=>654, 1605=>557, 1606=>661, 1607=>471, 1608=>435, 1609=>704, 1610=>704, 1611=>0, + 1612=>0, 1613=>0, 1614=>0, 1615=>0, 1616=>0, 1617=>0, 1618=>0, 1619=>0, 1620=>0, 1621=>0, 1626=>450, 1632=>483, 1633=>483, 1634=>483, 1635=>483, 1636=>483, + 1637=>483, 1638=>483, 1639=>483, 1640=>483, 1641=>483, 1642=>483, 1643=>292, 1644=>286, 1645=>490, 1646=>847, 1647=>698, 1652=>263, 1657=>847, 1658=>847, 1659=>847, 1660=>847, + 1661=>847, 1662=>847, 1663=>847, 1664=>847, 1665=>581, 1666=>581, 1667=>581, 1668=>581, 1669=>581, 1670=>581, 1671=>581, 1681=>435, 1682=>435, 1685=>549, 1688=>435, 1697=>933, + 1700=>933, 1702=>933, 1705=>805, 1711=>805, 1717=>654, 1722=>661, 1727=>581, 1734=>435, 1740=>704, 1742=>704, 1749=>471, 1776=>483, 1777=>483, 1778=>483, 1779=>483, 1780=>483, + 1781=>483, 1782=>483, 1783=>483, 1784=>483, 1785=>483, 3647=>586, 3713=>603, 3714=>615, 3716=>619, 3719=>434, 3720=>565, 3722=>615, 3725=>619, 3732=>602, 3733=>577, 3734=>580, + 3735=>589, 3737=>593, 3738=>563, 3739=>563, 3740=>670, 3741=>690, 3742=>618, 3743=>618, 3745=>631, 3746=>619, 3747=>615, 3749=>584, 3751=>569, 3754=>633, 3755=>737, 3757=>569, + 3758=>615, 3759=>708, 3760=>569, 3761=>0, 3762=>485, 3763=>485, 3764=>0, 3765=>0, 3766=>0, 3767=>0, 3768=>0, 3769=>0, 3771=>0, 3772=>0, 3773=>597, 3776=>337, + 3777=>591, 3778=>414, 3779=>492, 3780=>442, 3782=>606, 3784=>0, 3785=>0, 3786=>0, 3787=>0, 3788=>0, 3789=>0, 3804=>925, 3805=>925, 5121=>615, 5122=>615, 5123=>615, + 5124=>615, 5125=>692, 5126=>692, 5127=>692, 5129=>692, 5130=>692, 5131=>692, 5132=>751, 5133=>751, 5134=>751, 5135=>751, 5136=>751, 5137=>751, 5138=>870, 5139=>906, 5140=>870, + 5141=>906, 5142=>692, 5143=>870, 5144=>906, 5145=>870, 5146=>906, 5147=>692, 5149=>230, 5150=>488, 5151=>381, 5152=>381, 5153=>350, 5154=>350, 5155=>354, 5156=>350, 5157=>419, + 5158=>347, 5159=>230, 5160=>350, 5161=>350, 5162=>350, 5163=>980, 5164=>817, 5165=>857, 5166=>1005, 5167=>615, 5168=>615, 5169=>615, 5170=>615, 5171=>656, 5172=>656, 5173=>656, + 5175=>656, 5176=>656, 5177=>656, 5178=>751, 5179=>751, 5180=>751, 5181=>751, 5182=>751, 5183=>751, 5184=>870, 5185=>906, 5186=>870, 5187=>906, 5188=>870, 5189=>906, 5190=>870, + 5191=>906, 5192=>656, 5193=>457, 5194=>172, 5196=>659, 5197=>659, 5198=>659, 5199=>659, 5200=>657, 5201=>657, 5202=>657, 5204=>657, 5205=>657, 5206=>657, 5207=>829, 5208=>800, + 5209=>829, 5210=>800, 5211=>829, 5212=>800, 5213=>835, 5214=>810, 5215=>835, 5216=>810, 5217=>853, 5218=>810, 5219=>853, 5220=>810, 5221=>853, 5222=>457, 5223=>790, 5224=>790, + 5225=>779, 5226=>801, 5227=>565, 5228=>565, 5229=>565, 5230=>565, 5231=>565, 5232=>625, 5233=>565, 5234=>565, 5235=>565, 5236=>773, 5237=>693, 5238=>733, 5239=>734, 5240=>733, + 5241=>734, 5242=>773, 5243=>693, 5244=>773, 5245=>693, 5246=>733, 5247=>734, 5248=>733, 5249=>734, 5250=>733, 5251=>366, 5252=>366, 5253=>675, 5254=>697, 5255=>675, 5256=>697, + 5257=>565, 5258=>565, 5259=>565, 5260=>565, 5261=>565, 5262=>565, 5263=>565, 5264=>565, 5265=>565, 5266=>773, 5267=>693, 5268=>733, 5269=>734, 5270=>733, 5271=>734, 5272=>773, + 5273=>693, 5274=>773, 5275=>693, 5276=>733, 5277=>734, 5278=>733, 5279=>734, 5280=>733, 5281=>391, 5282=>391, 5283=>549, 5284=>501, 5285=>501, 5286=>501, 5287=>549, 5288=>470, + 5289=>549, 5290=>501, 5291=>501, 5292=>674, 5293=>691, 5294=>671, 5295=>687, 5296=>671, 5297=>687, 5298=>674, 5299=>691, 5300=>674, 5301=>691, 5302=>671, 5303=>687, 5304=>671, + 5305=>687, 5306=>671, 5307=>347, 5308=>457, 5309=>347, 5312=>766, 5313=>766, 5314=>766, 5315=>740, 5316=>766, 5317=>766, 5318=>766, 5319=>766, 5320=>766, 5321=>962, 5322=>931, + 5323=>953, 5324=>766, 5325=>953, 5326=>766, 5327=>766, 5328=>540, 5329=>407, 5330=>540, 5331=>766, 5332=>766, 5333=>766, 5334=>766, 5335=>766, 5336=>766, 5337=>766, 5338=>766, + 5339=>766, 5340=>962, 5341=>931, 5342=>953, 5343=>927, 5344=>953, 5345=>927, 5346=>962, 5347=>931, 5348=>962, 5349=>931, 5350=>975, 5351=>927, 5352=>975, 5353=>927, 5354=>540, + 5356=>656, 5357=>542, 5358=>542, 5359=>542, 5360=>542, 5361=>542, 5362=>595, 5363=>542, 5364=>542, 5365=>542, 5366=>751, 5367=>678, 5368=>712, 5369=>694, 5370=>712, 5371=>694, + 5372=>751, 5373=>678, 5374=>751, 5375=>678, 5376=>712, 5377=>694, 5378=>712, 5379=>694, 5380=>712, 5381=>376, 5382=>378, 5383=>376, 5392=>641, 5393=>641, 5394=>641, 5395=>802, + 5396=>802, 5397=>802, 5398=>802, 5399=>818, 5400=>785, 5401=>818, 5402=>785, 5403=>818, 5404=>785, 5405=>1026, 5406=>989, 5407=>1026, 5408=>989, 5409=>1026, 5410=>989, 5411=>1026, + 5412=>989, 5413=>576, 5414=>564, 5415=>564, 5416=>564, 5417=>564, 5418=>564, 5419=>601, 5420=>564, 5421=>564, 5422=>564, 5423=>760, 5424=>703, 5425=>734, 5426=>736, 5427=>734, + 5428=>736, 5429=>760, 5430=>703, 5431=>760, 5432=>703, 5433=>734, 5434=>736, 5435=>734, 5436=>736, 5437=>734, 5438=>376, 5440=>350, 5441=>436, 5442=>824, 5443=>824, 5444=>824, + 5445=>824, 5446=>824, 5447=>824, 5448=>542, 5449=>542, 5450=>542, 5451=>542, 5452=>542, 5453=>542, 5454=>751, 5455=>678, 5456=>376, 5458=>656, 5459=>615, 5460=>615, 5461=>615, + 5462=>615, 5463=>653, 5464=>653, 5465=>653, 5466=>653, 5467=>831, 5468=>906, 5469=>457, 5470=>659, 5471=>659, 5472=>659, 5473=>659, 5474=>659, 5475=>659, 5476=>657, 5477=>657, + 5478=>657, 5479=>657, 5480=>853, 5481=>810, 5482=>457, 5492=>747, 5493=>747, 5494=>747, 5495=>747, 5496=>747, 5497=>747, 5498=>747, 5499=>507, 5500=>677, 5501=>436, 5502=>942, + 5503=>942, 5504=>942, 5505=>942, 5506=>942, 5507=>942, 5508=>942, 5509=>743, 5514=>747, 5515=>747, 5516=>747, 5517=>747, 5518=>1133, 5519=>1133, 5520=>1133, 5521=>901, 5522=>901, + 5523=>1133, 5524=>1133, 5525=>629, 5526=>965, 5536=>766, 5537=>766, 5538=>766, 5539=>766, 5540=>766, 5541=>766, 5542=>540, 5543=>579, 5544=>579, 5545=>579, 5546=>579, 5547=>579, + 5548=>579, 5549=>579, 5550=>376, 5551=>565, 5598=>693, 5601=>690, 5702=>421, 5703=>421, 5742=>399, 5743=>942, 5744=>1178, 5745=>1469, 5746=>1469, 5747=>1237, 5748=>1237, 5749=>1469, + 5750=>1469, 7424=>532, 7425=>646, 7426=>883, 7427=>527, 7428=>495, 7429=>544, 7430=>544, 7431=>441, 7432=>486, 7433=>250, 7434=>355, 7435=>521, 7436=>524, 7437=>679, 7438=>584, + 7439=>550, 7440=>495, 7441=>615, 7442=>615, 7443=>615, 7444=>920, 7446=>550, 7447=>550, 7448=>472, 7449=>541, 7450=>541, 7451=>524, 7452=>517, 7453=>663, 7454=>853, 7455=>574, + 7456=>532, 7457=>736, 7458=>472, 7459=>473, 7462=>524, 7463=>532, 7464=>507, 7465=>472, 7466=>531, 7467=>575, 7468=>387, 7469=>552, 7470=>389, 7472=>436, 7473=>358, 7474=>358, + 7475=>439, 7476=>426, 7477=>167, 7478=>167, 7479=>372, 7480=>315, 7481=>489, 7482=>424, 7483=>424, 7484=>446, 7485=>396, 7486=>342, 7487=>394, 7488=>346, 7489=>415, 7490=>560, + 7491=>352, 7492=>352, 7493=>365, 7494=>583, 7495=>385, 7496=>365, 7497=>375, 7498=>375, 7499=>324, 7500=>323, 7501=>365, 7502=>161, 7503=>383, 7504=>561, 7505=>368, 7506=>372, + 7507=>333, 7508=>372, 7509=>372, 7510=>385, 7511=>265, 7512=>364, 7513=>422, 7514=>561, 7515=>375, 7517=>361, 7518=>335, 7519=>347, 7520=>374, 7521=>327, 7522=>161, 7523=>233, + 7524=>364, 7525=>375, 7526=>361, 7527=>335, 7528=>347, 7529=>374, 7530=>327, 7543=>571, 7544=>426, 7547=>334, 7557=>250, 7579=>365, 7580=>333, 7581=>333, 7582=>372, 7583=>324, + 7584=>267, 7585=>209, 7586=>365, 7587=>364, 7588=>235, 7589=>224, 7590=>234, 7591=>235, 7592=>211, 7593=>224, 7594=>211, 7595=>338, 7596=>561, 7597=>561, 7598=>369, 7599=>431, + 7600=>368, 7601=>372, 7602=>372, 7603=>324, 7604=>258, 7605=>265, 7606=>457, 7607=>376, 7608=>325, 7609=>365, 7610=>375, 7611=>330, 7612=>393, 7613=>330, 7614=>353, 7615=>372, + 7620=>0, 7621=>0, 7622=>0, 7623=>0, 7624=>0, 7625=>0, 7680=>615, 7681=>551, 7682=>617, 7683=>571, 7684=>617, 7685=>571, 7686=>617, 7687=>571, 7688=>628, 7689=>495, + 7690=>693, 7691=>571, 7692=>693, 7693=>571, 7694=>693, 7695=>571, 7696=>693, 7697=>571, 7698=>693, 7699=>571, 7700=>568, 7701=>554, 7702=>568, 7703=>554, 7704=>568, 7705=>554, + 7706=>568, 7707=>554, 7708=>568, 7709=>554, 7710=>518, 7711=>316, 7712=>697, 7713=>571, 7714=>677, 7715=>570, 7716=>677, 7717=>570, 7718=>677, 7719=>570, 7720=>677, 7721=>570, + 7722=>677, 7723=>570, 7724=>265, 7725=>250, 7726=>265, 7727=>250, 7728=>590, 7729=>521, 7730=>590, 7731=>521, 7732=>590, 7733=>521, 7734=>501, 7735=>250, 7736=>501, 7737=>250, + 7738=>501, 7739=>250, 7740=>501, 7741=>250, 7742=>776, 7743=>876, 7744=>776, 7745=>876, 7746=>776, 7747=>876, 7748=>673, 7749=>570, 7750=>673, 7751=>570, 7752=>673, 7753=>570, + 7754=>673, 7755=>570, 7756=>708, 7757=>550, 7758=>708, 7759=>550, 7760=>708, 7761=>550, 7762=>708, 7763=>550, 7764=>542, 7765=>571, 7766=>542, 7767=>571, 7768=>625, 7769=>370, + 7770=>625, 7771=>370, 7772=>625, 7773=>370, 7774=>625, 7775=>370, 7776=>571, 7777=>469, 7778=>571, 7779=>469, 7780=>571, 7781=>469, 7782=>571, 7783=>469, 7784=>571, 7785=>469, + 7786=>549, 7787=>353, 7788=>549, 7789=>353, 7790=>549, 7791=>353, 7792=>549, 7793=>353, 7794=>659, 7795=>570, 7796=>659, 7797=>570, 7798=>659, 7799=>570, 7800=>659, 7801=>570, + 7802=>659, 7803=>570, 7804=>615, 7805=>532, 7806=>615, 7807=>532, 7808=>890, 7809=>736, 7810=>890, 7811=>736, 7812=>890, 7813=>736, 7814=>890, 7815=>736, 7816=>890, 7817=>736, + 7818=>616, 7819=>532, 7820=>616, 7821=>532, 7822=>549, 7823=>532, 7824=>616, 7825=>472, 7826=>616, 7827=>472, 7828=>616, 7829=>472, 7830=>570, 7831=>353, 7832=>736, 7833=>532, + 7834=>551, 7835=>316, 7840=>615, 7841=>551, 7842=>615, 7843=>551, 7844=>615, 7845=>551, 7846=>615, 7847=>551, 7848=>615, 7849=>551, 7850=>615, 7851=>551, 7852=>615, 7853=>551, + 7854=>615, 7855=>551, 7856=>615, 7857=>551, 7858=>615, 7859=>551, 7860=>615, 7861=>551, 7862=>615, 7863=>551, 7864=>568, 7865=>554, 7866=>568, 7867=>554, 7868=>568, 7869=>554, + 7870=>568, 7871=>554, 7872=>568, 7873=>554, 7874=>568, 7875=>554, 7876=>568, 7877=>554, 7878=>568, 7879=>554, 7880=>265, 7881=>250, 7882=>265, 7883=>250, 7884=>708, 7885=>550, + 7886=>708, 7887=>550, 7888=>708, 7889=>550, 7890=>708, 7891=>550, 7892=>708, 7893=>550, 7894=>708, 7895=>550, 7896=>708, 7897=>550, 7898=>822, 7899=>550, 7900=>822, 7901=>550, + 7902=>822, 7903=>550, 7904=>822, 7905=>550, 7906=>822, 7907=>550, 7908=>659, 7909=>570, 7910=>659, 7911=>570, 7912=>772, 7913=>570, 7914=>772, 7915=>570, 7916=>772, 7917=>570, + 7918=>772, 7919=>570, 7920=>772, 7921=>570, 7922=>549, 7923=>532, 7924=>549, 7925=>532, 7926=>549, 7927=>532, 7928=>549, 7929=>532, 7936=>593, 7937=>593, 7938=>593, 7939=>593, + 7940=>593, 7941=>593, 7942=>593, 7943=>593, 7944=>615, 7945=>615, 7946=>790, 7947=>790, 7948=>692, 7949=>721, 7950=>637, 7951=>668, 7952=>486, 7953=>486, 7954=>486, 7955=>486, + 7956=>486, 7957=>486, 7960=>640, 7961=>640, 7962=>869, 7963=>877, 7964=>809, 7965=>835, 7968=>570, 7969=>570, 7970=>570, 7971=>570, 7972=>570, 7973=>570, 7974=>570, 7975=>570, + 7976=>753, 7977=>751, 7978=>977, 7979=>980, 7980=>924, 7981=>945, 7982=>840, 7983=>852, 7984=>304, 7985=>304, 7986=>304, 7987=>304, 7988=>304, 7989=>304, 7990=>304, 7991=>304, + 7992=>342, 7993=>336, 7994=>571, 7995=>571, 7996=>513, 7997=>540, 7998=>440, 7999=>443, 8000=>550, 8001=>550, 8002=>550, 8003=>550, 8004=>550, 8005=>550, 8008=>724, 8009=>763, + 8010=>985, 8011=>989, 8012=>844, 8013=>873, 8016=>521, 8017=>521, 8018=>521, 8019=>521, 8020=>521, 8021=>521, 8022=>521, 8023=>521, 8025=>705, 8027=>897, 8029=>911, 8031=>808, + 8032=>753, 8033=>753, 8034=>753, 8035=>753, 8036=>753, 8037=>753, 8038=>753, 8039=>753, 8040=>722, 8041=>759, 8042=>980, 8043=>985, 8044=>851, 8045=>875, 8046=>829, 8047=>857, + 8048=>593, 8049=>593, 8050=>486, 8051=>493, 8052=>570, 8053=>589, 8054=>304, 8055=>304, 8056=>550, 8057=>550, 8058=>521, 8059=>521, 8060=>753, 8061=>753, 8064=>593, 8065=>593, + 8066=>593, 8067=>593, 8068=>593, 8069=>593, 8070=>593, 8071=>593, 8072=>615, 8073=>615, 8074=>790, 8075=>790, 8076=>692, 8077=>721, 8078=>637, 8079=>668, 8080=>570, 8081=>570, + 8082=>570, 8083=>570, 8084=>570, 8085=>570, 8086=>570, 8087=>570, 8088=>753, 8089=>751, 8090=>977, 8091=>980, 8092=>924, 8093=>945, 8094=>840, 8095=>852, 8096=>753, 8097=>753, + 8098=>753, 8099=>753, 8100=>753, 8101=>753, 8102=>753, 8103=>753, 8104=>722, 8105=>759, 8106=>980, 8107=>985, 8108=>851, 8109=>875, 8110=>829, 8111=>857, 8112=>593, 8113=>593, + 8114=>593, 8115=>593, 8116=>593, 8118=>593, 8119=>593, 8120=>615, 8121=>615, 8122=>645, 8123=>623, 8124=>615, 8125=>450, 8126=>450, 8127=>450, 8128=>450, 8129=>450, 8130=>570, + 8131=>570, 8132=>589, 8134=>570, 8135=>570, 8136=>724, 8137=>671, 8138=>837, 8139=>784, 8140=>677, 8141=>450, 8142=>450, 8143=>450, 8144=>304, 8145=>304, 8146=>304, 8147=>304, + 8150=>304, 8151=>304, 8152=>265, 8153=>265, 8154=>427, 8155=>367, 8157=>450, 8158=>450, 8159=>450, 8160=>521, 8161=>521, 8162=>521, 8163=>521, 8164=>571, 8165=>571, 8166=>521, + 8167=>521, 8168=>549, 8169=>549, 8170=>760, 8171=>742, 8172=>616, 8173=>450, 8174=>450, 8175=>450, 8178=>753, 8179=>753, 8180=>753, 8182=>753, 8183=>753, 8184=>847, 8185=>731, + 8186=>830, 8187=>743, 8188=>688, 8189=>450, 8190=>450, 8192=>450, 8193=>900, 8194=>450, 8195=>900, 8196=>296, 8197=>225, 8198=>150, 8199=>572, 8200=>286, 8201=>180, 8202=>89, + 8203=>0, 8204=>0, 8205=>0, 8206=>0, 8207=>0, 8208=>325, 8209=>325, 8210=>572, 8213=>900, 8214=>450, 8215=>450, 8219=>286, 8223=>466, 8227=>531, 8228=>301, 8229=>601, + 8231=>286, 8234=>0, 8235=>0, 8236=>0, 8237=>0, 8238=>0, 8239=>180, 8241=>1562, 8242=>204, 8243=>336, 8244=>468, 8245=>204, 8246=>336, 8247=>468, 8248=>305, 8251=>754, + 8252=>437, 8253=>478, 8254=>450, 8255=>723, 8256=>723, 8257=>225, 8258=>900, 8259=>450, 8260=>150, 8261=>351, 8262=>351, 8263=>830, 8264=>659, 8265=>659, 8266=>447, 8267=>572, + 8268=>450, 8269=>450, 8270=>450, 8271=>303, 8272=>723, 8273=>450, 8274=>404, 8275=>754, 8276=>723, 8277=>754, 8278=>527, 8279=>597, 8280=>754, 8281=>754, 8282=>286, 8283=>717, + 8284=>754, 8285=>286, 8286=>286, 8287=>200, 8288=>0, 8289=>0, 8290=>0, 8291=>0, 8298=>0, 8299=>0, 8300=>0, 8301=>0, 8302=>0, 8303=>0, 8304=>360, 8305=>161, + 8308=>360, 8309=>360, 8310=>360, 8311=>360, 8312=>360, 8313=>360, 8314=>475, 8315=>475, 8316=>475, 8317=>221, 8318=>221, 8319=>359, 8320=>360, 8321=>360, 8322=>360, 8323=>360, + 8324=>360, 8325=>360, 8326=>360, 8327=>360, 8328=>360, 8329=>360, 8330=>475, 8331=>475, 8332=>475, 8333=>221, 8334=>221, 8336=>352, 8337=>375, 8338=>372, 8339=>399, 8340=>375, + 8352=>789, 8353=>572, 8354=>572, 8355=>572, 8356=>572, 8357=>876, 8358=>673, 8359=>1145, 8360=>966, 8361=>890, 8362=>706, 8363=>572, 8365=>572, 8366=>572, 8367=>1145, 8368=>572, + 8369=>572, 8370=>572, 8371=>572, 8372=>696, 8373=>577, 8400=>0, 8401=>0, 8406=>0, 8407=>0, 8448=>917, 8449=>917, 8450=>628, 8451=>1011, 8452=>578, 8453=>917, 8454=>960, + 8455=>553, 8456=>628, 8457=>856, 8459=>889, 8460=>679, 8461=>765, 8462=>570, 8463=>570, 8464=>422, 8465=>627, 8466=>648, 8467=>372, 8468=>736, 8469=>721, 8470=>936, 8471=>900, + 8472=>627, 8473=>631, 8474=>708, 8475=>718, 8476=>732, 8477=>713, 8478=>807, 8479=>615, 8480=>917, 8481=>967, 8483=>615, 8484=>670, 8485=>520, 8486=>688, 8487=>688, 8488=>554, + 8489=>304, 8490=>590, 8491=>615, 8492=>708, 8493=>633, 8494=>769, 8495=>532, 8496=>545, 8497=>708, 8498=>518, 8499=>962, 8500=>416, 8501=>670, 8502=>606, 8503=>422, 8504=>583, + 8505=>342, 8506=>833, 8507=>1074, 8508=>632, 8509=>655, 8510=>589, 8511=>764, 8512=>729, 8513=>697, 8514=>501, 8515=>501, 8516=>549, 8517=>737, 8518=>637, 8519=>554, 8520=>316, + 8521=>316, 8523=>702, 8526=>474, 8531=>872, 8532=>872, 8533=>872, 8534=>872, 8535=>872, 8536=>872, 8537=>872, 8538=>872, 8539=>872, 8540=>872, 8541=>872, 8542=>872, 8543=>511, + 8544=>265, 8545=>443, 8546=>620, 8547=>831, 8548=>615, 8549=>830, 8550=>1007, 8551=>1185, 8552=>826, 8553=>616, 8554=>839, 8555=>1018, 8556=>501, 8557=>628, 8558=>693, 8559=>776, + 8560=>250, 8561=>412, 8562=>573, 8563=>730, 8564=>532, 8565=>729, 8566=>892, 8567=>1053, 8568=>737, 8569=>532, 8570=>740, 8571=>901, 8572=>250, 8573=>495, 8574=>571, 8575=>876, + 8576=>1121, 8577=>693, 8578=>1121, 8579=>633, 8580=>494, 8592=>754, 8593=>754, 8594=>754, 8595=>754, 8596=>754, 8597=>754, 8598=>754, 8599=>754, 8600=>754, 8601=>754, 8602=>754, + 8603=>754, 8604=>754, 8605=>754, 8606=>754, 8607=>754, 8608=>754, 8609=>754, 8610=>754, 8611=>754, 8612=>754, 8613=>754, 8614=>754, 8615=>754, 8616=>754, 8617=>754, 8618=>754, + 8619=>754, 8620=>754, 8621=>754, 8622=>754, 8623=>754, 8624=>754, 8625=>754, 8626=>754, 8627=>754, 8628=>754, 8629=>754, 8630=>754, 8631=>754, 8632=>754, 8633=>754, 8634=>754, + 8635=>754, 8636=>754, 8637=>754, 8638=>754, 8639=>754, 8640=>754, 8641=>754, 8642=>754, 8643=>754, 8644=>754, 8645=>754, 8646=>754, 8647=>754, 8648=>754, 8649=>754, 8650=>754, + 8651=>754, 8652=>754, 8653=>754, 8654=>754, 8655=>754, 8656=>754, 8657=>754, 8658=>754, 8659=>754, 8660=>754, 8661=>754, 8662=>754, 8663=>754, 8664=>754, 8665=>754, 8666=>754, + 8667=>754, 8668=>754, 8669=>754, 8670=>754, 8671=>754, 8672=>754, 8673=>754, 8674=>754, 8675=>754, 8676=>754, 8677=>754, 8678=>754, 8679=>754, 8680=>754, 8681=>754, 8682=>754, + 8683=>754, 8684=>754, 8685=>754, 8686=>754, 8687=>754, 8688=>754, 8689=>754, 8690=>754, 8691=>754, 8692=>754, 8693=>754, 8694=>754, 8695=>754, 8696=>754, 8697=>754, 8698=>754, + 8699=>754, 8700=>754, 8701=>754, 8702=>754, 8703=>754, 8704=>615, 8705=>572, 8706=>465, 8707=>568, 8708=>568, 8709=>784, 8710=>602, 8711=>602, 8712=>784, 8713=>784, 8714=>646, + 8715=>784, 8716=>784, 8717=>646, 8718=>572, 8719=>681, 8720=>681, 8721=>606, 8722=>754, 8723=>754, 8724=>754, 8725=>150, 8726=>573, 8727=>754, 8728=>563, 8729=>286, 8730=>573, + 8731=>573, 8732=>573, 8733=>609, 8734=>750, 8735=>754, 8736=>807, 8737=>807, 8738=>754, 8739=>450, 8740=>450, 8741=>450, 8742=>450, 8743=>659, 8744=>659, 8745=>659, 8746=>659, + 8747=>469, 8748=>710, 8749=>951, 8750=>469, 8751=>710, 8752=>951, 8753=>469, 8754=>469, 8755=>469, 8756=>572, 8757=>572, 8758=>234, 8759=>572, 8760=>754, 8761=>754, 8762=>754, + 8763=>754, 8764=>754, 8765=>754, 8766=>754, 8767=>754, 8768=>337, 8769=>754, 8770=>754, 8771=>754, 8772=>754, 8773=>754, 8774=>754, 8775=>754, 8776=>754, 8777=>754, 8778=>754, + 8779=>754, 8780=>754, 8781=>754, 8782=>754, 8783=>754, 8784=>754, 8785=>754, 8786=>754, 8787=>754, 8788=>900, 8789=>900, 8790=>754, 8791=>754, 8792=>754, 8793=>754, 8794=>754, + 8795=>754, 8796=>754, 8797=>754, 8798=>754, 8799=>754, 8800=>754, 8801=>754, 8802=>754, 8803=>754, 8804=>754, 8805=>754, 8806=>754, 8807=>754, 8808=>754, 8809=>754, 8810=>942, + 8811=>942, 8812=>417, 8813=>754, 8814=>754, 8815=>754, 8816=>754, 8817=>754, 8818=>754, 8819=>754, 8820=>754, 8821=>754, 8822=>754, 8823=>754, 8824=>754, 8825=>754, 8826=>754, + 8827=>754, 8828=>754, 8829=>754, 8830=>754, 8831=>754, 8832=>754, 8833=>754, 8834=>754, 8835=>754, 8836=>754, 8837=>754, 8838=>754, 8839=>754, 8840=>754, 8841=>754, 8842=>754, + 8843=>754, 8844=>659, 8845=>659, 8846=>659, 8847=>754, 8848=>754, 8849=>754, 8850=>754, 8851=>649, 8852=>649, 8853=>754, 8854=>754, 8855=>754, 8856=>754, 8857=>754, 8858=>754, + 8859=>754, 8860=>754, 8861=>754, 8862=>754, 8863=>754, 8864=>754, 8865=>754, 8866=>784, 8867=>784, 8868=>784, 8869=>784, 8870=>468, 8871=>468, 8872=>784, 8873=>784, 8874=>784, + 8875=>784, 8876=>784, 8877=>784, 8878=>784, 8879=>784, 8882=>754, 8883=>754, 8884=>754, 8885=>754, 8886=>900, 8887=>900, 8888=>754, 8889=>754, 8890=>468, 8891=>659, 8892=>659, + 8893=>659, 8896=>738, 8897=>738, 8898=>738, 8899=>738, 8900=>444, 8901=>286, 8902=>563, 8904=>900, 8905=>900, 8906=>900, 8907=>900, 8908=>900, 8909=>754, 8918=>754, 8919=>754, + 8920=>1280, 8921=>1280, 8922=>754, 8923=>754, 8924=>754, 8925=>754, 8926=>754, 8927=>754, 8928=>754, 8929=>754, 8930=>754, 8931=>754, 8932=>754, 8933=>754, 8934=>754, 8935=>754, + 8936=>754, 8937=>754, 8938=>754, 8939=>754, 8940=>754, 8941=>754, 8946=>900, 8947=>784, 8948=>646, 8949=>784, 8950=>784, 8951=>646, 8952=>784, 8953=>784, 8954=>900, 8955=>784, + 8956=>646, 8957=>784, 8958=>646, 8959=>784, 8962=>571, 8966=>784, 8968=>351, 8969=>351, 8970=>351, 8971=>351, 8976=>754, 8977=>461, 8984=>900, 8985=>754, 8992=>469, 8993=>469, + 8997=>900, 9000=>1299, 9085=>681, 9115=>450, 9116=>450, 9117=>450, 9118=>450, 9119=>450, 9120=>450, 9121=>450, 9122=>450, 9123=>450, 9124=>450, 9125=>450, 9126=>450, 9127=>675, + 9128=>675, 9129=>675, 9130=>675, 9131=>675, 9132=>675, 9133=>675, 9134=>469, 9166=>754, 9167=>850, 9250=>571, 9251=>571, 9312=>807, 9313=>807, 9314=>807, 9315=>807, 9316=>807, + 9317=>807, 9318=>807, 9319=>807, 9320=>807, 9321=>807, 9600=>692, 9601=>692, 9602=>692, 9603=>692, 9604=>692, 9605=>692, 9606=>692, 9607=>692, 9608=>692, 9609=>692, 9610=>692, + 9611=>692, 9612=>692, 9613=>692, 9614=>692, 9615=>692, 9616=>692, 9617=>692, 9618=>692, 9619=>692, 9620=>692, 9621=>692, 9622=>692, 9623=>692, 9624=>692, 9625=>692, 9626=>692, + 9627=>692, 9628=>692, 9629=>692, 9630=>692, 9631=>692, 9632=>850, 9633=>850, 9634=>850, 9635=>850, 9636=>850, 9637=>850, 9638=>850, 9639=>850, 9640=>850, 9641=>850, 9642=>610, + 9643=>610, 9644=>850, 9645=>850, 9646=>495, 9647=>495, 9648=>692, 9649=>692, 9650=>692, 9651=>692, 9652=>452, 9653=>452, 9654=>692, 9655=>692, 9656=>452, 9657=>452, 9658=>692, + 9659=>692, 9660=>692, 9661=>692, 9662=>452, 9663=>452, 9664=>692, 9665=>692, 9666=>452, 9667=>452, 9668=>692, 9669=>692, 9670=>692, 9671=>692, 9672=>692, 9673=>785, 9674=>444, + 9675=>785, 9676=>785, 9677=>785, 9678=>785, 9679=>785, 9680=>785, 9681=>785, 9682=>785, 9683=>785, 9684=>785, 9685=>785, 9686=>474, 9687=>474, 9688=>712, 9689=>873, 9690=>873, + 9691=>873, 9692=>348, 9693=>348, 9694=>348, 9695=>348, 9696=>785, 9697=>785, 9698=>692, 9699=>692, 9700=>692, 9701=>692, 9702=>531, 9703=>850, 9704=>850, 9705=>850, 9706=>850, + 9707=>850, 9708=>692, 9709=>692, 9710=>692, 9711=>1007, 9712=>850, 9713=>850, 9714=>850, 9715=>850, 9716=>785, 9717=>785, 9718=>785, 9719=>785, 9720=>692, 9721=>692, 9722=>692, + 9723=>747, 9724=>747, 9725=>659, 9726=>659, 9727=>692, 9728=>807, 9729=>900, 9730=>807, 9731=>807, 9732=>807, 9733=>807, 9734=>807, 9735=>515, 9736=>806, 9737=>807, 9738=>799, + 9739=>799, 9740=>604, 9741=>911, 9742=>1121, 9743=>1125, 9744=>807, 9745=>807, 9746=>807, 9747=>479, 9748=>807, 9749=>807, 9750=>807, 9751=>807, 9752=>807, 9753=>807, 9754=>807, + 9755=>807, 9756=>807, 9757=>548, 9758=>807, 9759=>548, 9760=>807, 9761=>807, 9762=>807, 9763=>807, 9764=>602, 9765=>671, 9766=>584, 9767=>705, 9768=>490, 9769=>807, 9770=>807, + 9771=>807, 9772=>639, 9773=>807, 9774=>807, 9775=>807, 9776=>807, 9777=>807, 9778=>807, 9779=>807, 9780=>807, 9781=>807, 9782=>807, 9783=>807, 9784=>807, 9785=>807, 9786=>807, + 9787=>807, 9788=>807, 9789=>807, 9790=>807, 9791=>552, 9792=>658, 9793=>658, 9794=>807, 9795=>807, 9796=>807, 9797=>807, 9798=>807, 9799=>807, 9800=>807, 9801=>807, 9802=>807, + 9803=>807, 9804=>807, 9805=>807, 9806=>807, 9807=>807, 9808=>807, 9809=>807, 9810=>807, 9811=>807, 9812=>807, 9813=>807, 9814=>807, 9815=>807, 9816=>807, 9817=>807, 9818=>807, + 9819=>807, 9820=>807, 9821=>807, 9822=>807, 9823=>807, 9824=>807, 9825=>807, 9826=>807, 9827=>807, 9828=>807, 9829=>807, 9830=>807, 9831=>807, 9832=>807, 9833=>424, 9834=>574, + 9835=>807, 9836=>807, 9837=>424, 9838=>321, 9839=>435, 9840=>673, 9841=>689, 9842=>807, 9843=>807, 9844=>807, 9845=>807, 9846=>807, 9847=>807, 9848=>807, 9849=>807, 9850=>807, + 9851=>807, 9852=>807, 9853=>807, 9854=>807, 9855=>807, 9856=>782, 9857=>782, 9858=>782, 9859=>782, 9860=>782, 9861=>782, 9862=>807, 9863=>807, 9864=>807, 9865=>807, 9866=>807, + 9867=>807, 9868=>807, 9869=>807, 9870=>807, 9871=>807, 9872=>807, 9873=>807, 9874=>807, 9875=>807, 9876=>807, 9877=>487, 9878=>807, 9879=>807, 9880=>807, 9881=>807, 9882=>807, + 9883=>807, 9884=>807, 9888=>807, 9889=>632, 9890=>754, 9891=>754, 9892=>754, 9893=>754, 9894=>754, 9895=>754, 9896=>754, 9897=>754, 9898=>754, 9899=>754, 9900=>754, 9901=>754, + 9902=>754, 9903=>754, 9904=>759, 9905=>754, 9906=>658, 9985=>754, 9986=>754, 9987=>754, 9988=>754, 9990=>754, 9991=>754, 9992=>754, 9993=>754, 9996=>754, 9997=>754, 9998=>754, + 9999=>754, 10000=>754, 10001=>754, 10002=>754, 10003=>754, 10004=>754, 10005=>754, 10006=>754, 10007=>754, 10008=>754, 10009=>754, 10010=>754, 10011=>754, 10012=>754, 10013=>754, 10014=>754, + 10015=>754, 10016=>754, 10017=>754, 10018=>754, 10019=>754, 10020=>754, 10021=>754, 10022=>754, 10023=>754, 10025=>754, 10026=>754, 10027=>754, 10028=>754, 10029=>754, 10030=>754, 10031=>754, + 10032=>754, 10033=>754, 10034=>754, 10035=>754, 10036=>754, 10037=>754, 10038=>754, 10039=>754, 10040=>754, 10041=>754, 10042=>754, 10043=>754, 10044=>754, 10045=>754, 10046=>754, 10047=>754, + 10048=>754, 10049=>754, 10050=>754, 10051=>754, 10052=>754, 10053=>754, 10054=>754, 10055=>754, 10056=>754, 10057=>754, 10058=>754, 10059=>754, 10061=>807, 10063=>807, 10064=>807, 10065=>807, + 10066=>807, 10070=>807, 10072=>754, 10073=>754, 10074=>754, 10075=>290, 10076=>290, 10077=>484, 10078=>484, 10081=>754, 10082=>754, 10083=>754, 10084=>754, 10085=>754, 10086=>754, 10087=>754, + 10088=>754, 10089=>754, 10090=>754, 10091=>754, 10092=>754, 10093=>754, 10094=>754, 10095=>754, 10096=>754, 10097=>754, 10098=>754, 10099=>754, 10100=>754, 10101=>754, 10102=>807, 10103=>807, + 10104=>807, 10105=>807, 10106=>807, 10107=>807, 10108=>807, 10109=>807, 10110=>807, 10111=>807, 10112=>754, 10113=>754, 10114=>754, 10115=>754, 10116=>754, 10117=>754, 10118=>754, 10119=>754, + 10120=>754, 10121=>754, 10122=>754, 10123=>754, 10124=>754, 10125=>754, 10126=>754, 10127=>754, 10128=>754, 10129=>754, 10130=>754, 10131=>754, 10132=>754, 10136=>754, 10137=>754, 10138=>754, + 10139=>754, 10140=>754, 10141=>754, 10142=>754, 10143=>754, 10144=>754, 10145=>754, 10146=>754, 10147=>754, 10148=>754, 10149=>754, 10150=>754, 10151=>754, 10152=>754, 10153=>754, 10154=>754, + 10155=>754, 10156=>754, 10157=>754, 10158=>754, 10159=>754, 10161=>754, 10162=>754, 10163=>754, 10164=>754, 10165=>754, 10166=>754, 10167=>754, 10168=>754, 10169=>754, 10170=>754, 10171=>754, + 10172=>754, 10173=>754, 10174=>754, 10208=>444, 10214=>445, 10215=>445, 10216=>351, 10217=>351, 10218=>500, 10219=>500, 10224=>754, 10225=>754, 10226=>754, 10227=>754, 10228=>1042, 10229=>1290, + 10230=>1290, 10231=>1290, 10232=>1290, 10233=>1290, 10234=>1290, 10235=>1290, 10236=>1290, 10237=>1290, 10238=>1290, 10239=>1290, 10240=>659, 10241=>659, 10242=>659, 10243=>659, 10244=>659, 10245=>659, + 10246=>659, 10247=>659, 10248=>659, 10249=>659, 10250=>659, 10251=>659, 10252=>659, 10253=>659, 10254=>659, 10255=>659, 10256=>659, 10257=>659, 10258=>659, 10259=>659, 10260=>659, 10261=>659, + 10262=>659, 10263=>659, 10264=>659, 10265=>659, 10266=>659, 10267=>659, 10268=>659, 10269=>659, 10270=>659, 10271=>659, 10272=>659, 10273=>659, 10274=>659, 10275=>659, 10276=>659, 10277=>659, + 10278=>659, 10279=>659, 10280=>659, 10281=>659, 10282=>659, 10283=>659, 10284=>659, 10285=>659, 10286=>659, 10287=>659, 10288=>659, 10289=>659, 10290=>659, 10291=>659, 10292=>659, 10293=>659, + 10294=>659, 10295=>659, 10296=>659, 10297=>659, 10298=>659, 10299=>659, 10300=>659, 10301=>659, 10302=>659, 10303=>659, 10304=>659, 10305=>659, 10306=>659, 10307=>659, 10308=>659, 10309=>659, + 10310=>659, 10311=>659, 10312=>659, 10313=>659, 10314=>659, 10315=>659, 10316=>659, 10317=>659, 10318=>659, 10319=>659, 10320=>659, 10321=>659, 10322=>659, 10323=>659, 10324=>659, 10325=>659, + 10326=>659, 10327=>659, 10328=>659, 10329=>659, 10330=>659, 10331=>659, 10332=>659, 10333=>659, 10334=>659, 10335=>659, 10336=>659, 10337=>659, 10338=>659, 10339=>659, 10340=>659, 10341=>659, + 10342=>659, 10343=>659, 10344=>659, 10345=>659, 10346=>659, 10347=>659, 10348=>659, 10349=>659, 10350=>659, 10351=>659, 10352=>659, 10353=>659, 10354=>659, 10355=>659, 10356=>659, 10357=>659, + 10358=>659, 10359=>659, 10360=>659, 10361=>659, 10362=>659, 10363=>659, 10364=>659, 10365=>659, 10366=>659, 10367=>659, 10368=>659, 10369=>659, 10370=>659, 10371=>659, 10372=>659, 10373=>659, + 10374=>659, 10375=>659, 10376=>659, 10377=>659, 10378=>659, 10379=>659, 10380=>659, 10381=>659, 10382=>659, 10383=>659, 10384=>659, 10385=>659, 10386=>659, 10387=>659, 10388=>659, 10389=>659, + 10390=>659, 10391=>659, 10392=>659, 10393=>659, 10394=>659, 10395=>659, 10396=>659, 10397=>659, 10398=>659, 10399=>659, 10400=>659, 10401=>659, 10402=>659, 10403=>659, 10404=>659, 10405=>659, + 10406=>659, 10407=>659, 10408=>659, 10409=>659, 10410=>659, 10411=>659, 10412=>659, 10413=>659, 10414=>659, 10415=>659, 10416=>659, 10417=>659, 10418=>659, 10419=>659, 10420=>659, 10421=>659, + 10422=>659, 10423=>659, 10424=>659, 10425=>659, 10426=>659, 10427=>659, 10428=>659, 10429=>659, 10430=>659, 10431=>659, 10432=>659, 10433=>659, 10434=>659, 10435=>659, 10436=>659, 10437=>659, + 10438=>659, 10439=>659, 10440=>659, 10441=>659, 10442=>659, 10443=>659, 10444=>659, 10445=>659, 10446=>659, 10447=>659, 10448=>659, 10449=>659, 10450=>659, 10451=>659, 10452=>659, 10453=>659, + 10454=>659, 10455=>659, 10456=>659, 10457=>659, 10458=>659, 10459=>659, 10460=>659, 10461=>659, 10462=>659, 10463=>659, 10464=>659, 10465=>659, 10466=>659, 10467=>659, 10468=>659, 10469=>659, + 10470=>659, 10471=>659, 10472=>659, 10473=>659, 10474=>659, 10475=>659, 10476=>659, 10477=>659, 10478=>659, 10479=>659, 10480=>659, 10481=>659, 10482=>659, 10483=>659, 10484=>659, 10485=>659, + 10486=>659, 10487=>659, 10488=>659, 10489=>659, 10490=>659, 10491=>659, 10492=>659, 10493=>659, 10494=>659, 10495=>659, 10502=>754, 10503=>754, 10506=>754, 10507=>754, 10560=>615, 10561=>615, + 10702=>754, 10703=>900, 10704=>900, 10705=>900, 10706=>900, 10707=>900, 10708=>900, 10709=>900, 10731=>444, 10752=>900, 10753=>900, 10754=>900, 10764=>1192, 10765=>469, 10766=>469, 10767=>469, + 10768=>469, 10769=>469, 10770=>469, 10771=>469, 10772=>469, 10773=>469, 10774=>469, 10775=>469, 10776=>469, 10777=>469, 10778=>469, 10779=>469, 10780=>469, 10877=>754, 10878=>754, 10879=>754, + 10880=>754, 10881=>754, 10882=>754, 10883=>754, 10884=>754, 10885=>754, 10886=>754, 10887=>754, 10888=>754, 10889=>754, 10890=>754, 10891=>754, 10892=>754, 10893=>754, 10894=>754, 10895=>754, + 10896=>754, 10897=>754, 10898=>754, 10899=>754, 10900=>754, 10901=>754, 10902=>754, 10903=>754, 10904=>754, 10905=>754, 10906=>754, 10907=>754, 10908=>754, 10909=>754, 10910=>754, 10911=>754, + 10912=>754, 10926=>754, 10927=>754, 10928=>754, 10929=>754, 10930=>754, 10931=>754, 10932=>754, 10933=>754, 10934=>754, 10935=>754, 10936=>754, 10937=>754, 10938=>754, 11001=>754, 11002=>754, + 11008=>754, 11009=>754, 11010=>754, 11011=>754, 11012=>754, 11013=>754, 11014=>754, 11015=>754, 11016=>754, 11017=>754, 11018=>754, 11019=>754, 11020=>754, 11021=>754, 11022=>752, 11023=>752, + 11024=>752, 11025=>752, 11026=>850, 11027=>850, 11028=>850, 11029=>850, 11030=>692, 11031=>692, 11032=>692, 11033=>692, 11034=>850, 11040=>782, 11041=>786, 11042=>786, 11043=>786, 11360=>501, + 11361=>250, 11362=>501, 11363=>542, 11364=>625, 11365=>551, 11366=>353, 11367=>677, 11368=>570, 11369=>590, 11370=>521, 11371=>616, 11372=>472, 11380=>532, 11381=>589, 11382=>511, 11383=>593, + 61440=>879, 61441=>879, 61960=>703, 62047=>532, 63173=>550, 64256=>620, 64257=>567, 64258=>567, 64259=>870, 64260=>870, 64261=>617, 64262=>774, 64275=>1081, 64276=>1081, 64277=>1076, 64278=>1067, + 64279=>1376, 64285=>266, 64287=>444, 64288=>572, 64297=>754, 64298=>719, 64299=>719, 64300=>719, 64301=>719, 64302=>597, 64303=>597, 64304=>597, 64305=>589, 64306=>408, 64307=>546, 64308=>621, + 64309=>302, 64310=>393, 64312=>615, 64313=>302, 64314=>577, 64315=>599, 64316=>571, 64318=>663, 64320=>410, 64321=>694, 64323=>586, 64324=>599, 64326=>575, 64327=>619, 64328=>577, 64329=>719, + 64330=>653, 64331=>245, 64332=>589, 64333=>599, 64334=>599, 64338=>847, 64339=>883, 64340=>250, 64341=>271, 64342=>847, 64343=>883, 64344=>250, 64345=>271, 64346=>847, 64347=>883, 64348=>250, + 64349=>271, 64350=>847, 64351=>883, 64352=>250, 64353=>271, 64354=>847, 64355=>883, 64356=>250, 64357=>271, 64358=>847, 64359=>883, 64360=>250, 64361=>271, 64362=>933, 64363=>932, 64364=>430, + 64365=>455, 64366=>933, 64367=>932, 64368=>430, 64369=>455, 64370=>581, 64371=>581, 64372=>556, 64373=>581, 64374=>581, 64375=>581, 64376=>556, 64377=>581, 64378=>581, 64379=>581, 64380=>556, + 64381=>581, 64382=>581, 64383=>581, 64384=>556, 64385=>581, 64394=>435, 64395=>497, 64396=>435, 64397=>497, 64398=>805, 64399=>805, 64400=>428, 64401=>497, 64402=>805, 64403=>805, 64404=>428, + 64405=>497, 64414=>661, 64415=>685, 64473=>435, 64474=>465, 64488=>250, 64489=>271, 64508=>704, 64509=>750, 64510=>250, 64511=>271, 65024=>0, 65025=>0, 65026=>0, 65027=>0, 65028=>0, + 65029=>0, 65030=>0, 65031=>0, 65032=>0, 65033=>0, 65034=>0, 65035=>0, 65036=>0, 65037=>0, 65038=>0, 65039=>0, 65136=>264, 65137=>264, 65138=>264, 65139=>235, 65140=>264, + 65142=>264, 65143=>264, 65144=>264, 65145=>264, 65146=>264, 65147=>264, 65148=>264, 65149=>264, 65150=>264, 65151=>264, 65152=>423, 65153=>250, 65154=>274, 65155=>250, 65156=>274, 65157=>435, + 65158=>465, 65159=>250, 65160=>274, 65161=>704, 65162=>750, 65163=>250, 65164=>271, 65165=>250, 65166=>274, 65167=>847, 65168=>883, 65169=>250, 65170=>271, 65171=>471, 65172=>482, 65173=>847, + 65174=>883, 65175=>250, 65176=>271, 65177=>847, 65178=>883, 65179=>250, 65180=>271, 65181=>581, 65182=>581, 65183=>556, 65184=>581, 65185=>581, 65186=>581, 65187=>556, 65188=>581, 65189=>581, + 65190=>581, 65191=>556, 65192=>581, 65193=>400, 65194=>472, 65195=>400, 65196=>472, 65197=>435, 65198=>497, 65199=>435, 65200=>497, 65201=>1099, 65202=>1147, 65203=>754, 65204=>803, 65205=>1099, + 65206=>1147, 65207=>754, 65208=>803, 65209=>1088, 65210=>1103, 65211=>764, 65212=>780, 65213=>1088, 65214=>1103, 65215=>764, 65216=>780, 65217=>832, 65218=>854, 65219=>716, 65220=>738, 65221=>832, + 65222=>854, 65223=>716, 65224=>738, 65225=>537, 65226=>479, 65227=>537, 65228=>434, 65229=>537, 65230=>479, 65231=>470, 65232=>434, 65233=>933, 65234=>932, 65235=>430, 65236=>455, 65237=>698, + 65238=>750, 65239=>430, 65240=>455, 65241=>742, 65242=>758, 65243=>428, 65244=>497, 65245=>654, 65246=>681, 65247=>274, 65248=>298, 65249=>557, 65250=>599, 65251=>482, 65252=>520, 65253=>661, + 65254=>685, 65255=>250, 65256=>271, 65257=>471, 65258=>482, 65259=>475, 65260=>415, 65261=>435, 65262=>465, 65263=>704, 65264=>750, 65265=>704, 65266=>750, 65267=>250, 65268=>271, 65269=>513, + 65270=>537, 65271=>513, 65272=>537, 65273=>513, 65274=>537, 65275=>513, 65276=>537, 65279=>0, 65533=>923); +$enc=''; +$diff=''; +$file='DejaVuSansCondensed.z'; +$ctg='DejaVuSansCondensed.ctg.z'; +$originalsize=463772; +?> diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.z new file mode 100644 index 00000000..397e7c03 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedb.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedb.php new file mode 100644 index 00000000..be8d040f --- /dev/null +++ b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedb.php @@ -0,0 +1,287 @@ +928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>32,'FontBBox'=>'[-962 -388 1777 1123]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>540); +$up=-42; +$ut=44; +$cw=array( + 0=>540, 32=>313, 33=>410, 34=>469, 35=>754, 36=>626, 37=>901, 38=>785, 39=>275, 40=>411, 41=>411, 42=>470, 43=>754, 44=>342, 45=>374, 46=>342, + 47=>329, 48=>626, 49=>626, 50=>626, 51=>626, 52=>626, 53=>626, 54=>626, 55=>626, 56=>626, 57=>626, 58=>360, 59=>360, 60=>754, 61=>754, 62=>754, + 63=>522, 64=>900, 65=>696, 66=>686, 67=>660, 68=>747, 69=>615, 70=>615, 71=>738, 72=>753, 73=>334, 74=>334, 75=>697, 76=>573, 77=>896, 78=>753, + 79=>765, 80=>659, 81=>765, 82=>693, 83=>648, 84=>614, 85=>730, 86=>696, 87=>993, 88=>694, 89=>651, 90=>652, 91=>411, 92=>329, 93=>411, 94=>754, + 95=>450, 96=>450, 97=>607, 98=>644, 99=>533, 100=>644, 101=>610, 102=>391, 103=>644, 104=>641, 105=>308, 106=>308, 107=>598, 108=>308, 109=>938, 110=>641, + 111=>618, 112=>644, 113=>644, 114=>444, 115=>536, 116=>430, 117=>641, 118=>586, 119=>831, 120=>580, 121=>586, 122=>523, 123=>641, 124=>329, 125=>641, 126=>754, + 8364=>626, 1027=>573, 8218=>342, 402=>391, 8222=>591, 8230=>900, 8224=>450, 8225=>450, 710=>450, 8240=>1296, 352=>648, 8249=>371, 338=>1050, 1036=>735, 381=>652, 1039=>753, + 8216=>342, 8217=>342, 8220=>591, 8221=>591, 8226=>575, 8211=>450, 8212=>900, 732=>450, 8482=>900, 353=>536, 8250=>371, 339=>984, 1116=>611, 382=>523, 376=>651, 160=>313, + 161=>410, 162=>626, 163=>626, 164=>572, 165=>626, 166=>329, 167=>450, 168=>450, 169=>900, 170=>507, 171=>581, 172=>754, 173=>374, 174=>900, 175=>450, 176=>450, + 177=>754, 178=>394, 179=>394, 180=>450, 181=>662, 182=>572, 183=>342, 184=>450, 185=>394, 186=>507, 187=>581, 188=>932, 189=>932, 190=>932, 191=>522, 192=>696, + 193=>696, 194=>696, 195=>696, 196=>696, 197=>696, 198=>976, 199=>660, 200=>615, 201=>615, 202=>615, 203=>615, 204=>334, 205=>334, 206=>334, 207=>334, 208=>754, + 209=>753, 210=>765, 211=>765, 212=>765, 213=>765, 214=>765, 215=>754, 216=>765, 217=>730, 218=>730, 219=>730, 220=>730, 221=>651, 222=>664, 223=>647, 224=>607, + 225=>607, 226=>607, 227=>607, 228=>607, 229=>607, 230=>943, 231=>533, 232=>610, 233=>610, 234=>610, 235=>610, 236=>308, 237=>308, 238=>308, 239=>308, 240=>618, + 241=>641, 242=>618, 243=>618, 244=>618, 245=>618, 246=>618, 247=>754, 248=>618, 249=>641, 250=>641, 251=>641, 252=>641, 253=>586, 254=>644, 255=>586, 256=>696, + 257=>607, 258=>696, 259=>607, 260=>696, 261=>607, 262=>660, 263=>533, 264=>660, 265=>533, 266=>660, 267=>533, 268=>660, 269=>533, 270=>747, 271=>644, 272=>754, + 273=>644, 274=>615, 275=>610, 276=>615, 277=>610, 278=>615, 279=>610, 280=>615, 281=>610, 282=>615, 283=>610, 284=>738, 285=>644, 286=>738, 287=>644, 288=>738, + 289=>644, 290=>738, 291=>644, 292=>753, 293=>641, 294=>876, 295=>711, 296=>334, 297=>308, 298=>334, 299=>308, 300=>334, 301=>308, 302=>334, 303=>308, 304=>334, + 305=>308, 306=>669, 307=>617, 308=>334, 309=>308, 310=>697, 311=>598, 312=>598, 313=>573, 314=>308, 315=>573, 316=>308, 317=>573, 318=>431, 319=>573, 320=>501, + 321=>578, 322=>334, 323=>753, 324=>641, 325=>753, 326=>641, 327=>753, 328=>641, 329=>884, 330=>753, 331=>641, 332=>765, 333=>618, 334=>765, 335=>618, 336=>765, + 337=>618, 340=>693, 341=>444, 342=>693, 343=>444, 344=>693, 345=>444, 346=>648, 347=>536, 348=>648, 349=>536, 350=>648, 351=>536, 354=>614, 355=>430, 356=>614, + 357=>430, 358=>614, 359=>430, 360=>730, 361=>641, 362=>730, 363=>641, 364=>730, 365=>641, 366=>730, 367=>641, 368=>730, 369=>641, 370=>730, 371=>641, 372=>993, + 373=>831, 374=>651, 375=>586, 377=>652, 378=>523, 379=>652, 380=>523, 383=>391, 384=>644, 385=>729, 386=>686, 387=>644, 388=>686, 389=>644, 390=>660, 391=>660, + 392=>533, 393=>754, 394=>791, 395=>681, 396=>644, 397=>619, 398=>615, 399=>764, 400=>626, 401=>615, 403=>738, 404=>713, 405=>940, 406=>392, 407=>350, 408=>697, + 409=>598, 410=>324, 411=>532, 412=>938, 413=>753, 414=>641, 415=>765, 416=>786, 417=>618, 418=>1002, 419=>866, 420=>703, 421=>644, 422=>693, 423=>648, 424=>536, + 425=>615, 426=>497, 427=>430, 428=>636, 429=>430, 430=>614, 431=>751, 432=>641, 433=>692, 434=>732, 435=>717, 436=>700, 437=>652, 438=>523, 439=>695, 440=>695, + 441=>576, 442=>523, 443=>626, 444=>695, 445=>576, 446=>515, 447=>644, 448=>334, 449=>593, 450=>489, 451=>334, 452=>1399, 453=>1271, 454=>1168, 455=>908, 456=>882, + 457=>617, 458=>1088, 459=>1062, 460=>949, 461=>696, 462=>607, 463=>334, 464=>308, 465=>765, 466=>618, 467=>730, 468=>641, 469=>730, 470=>641, 471=>730, 472=>641, + 473=>730, 474=>641, 475=>730, 476=>641, 477=>610, 478=>696, 479=>607, 480=>696, 481=>607, 482=>976, 483=>943, 484=>738, 485=>644, 486=>738, 487=>644, 488=>697, + 489=>598, 490=>765, 491=>618, 492=>765, 493=>618, 494=>695, 495=>523, 496=>308, 497=>1399, 498=>1271, 499=>1168, 500=>738, 501=>644, 502=>1160, 503=>708, 504=>753, + 505=>641, 506=>696, 507=>607, 508=>976, 509=>943, 510=>765, 511=>618, 512=>696, 513=>607, 514=>696, 515=>607, 516=>615, 517=>610, 518=>615, 519=>610, 520=>334, + 521=>308, 522=>334, 523=>308, 524=>765, 525=>618, 526=>765, 527=>618, 528=>693, 529=>444, 530=>693, 531=>444, 532=>730, 533=>641, 534=>730, 535=>641, 536=>648, + 537=>536, 538=>614, 539=>430, 540=>621, 541=>546, 542=>753, 543=>641, 544=>753, 545=>778, 546=>728, 547=>593, 548=>652, 549=>523, 550=>696, 551=>607, 552=>615, + 553=>610, 554=>765, 555=>618, 556=>765, 557=>618, 558=>765, 559=>618, 560=>765, 561=>618, 562=>651, 563=>586, 564=>442, 565=>780, 566=>460, 567=>308, 568=>979, + 569=>979, 570=>696, 571=>660, 572=>533, 573=>573, 574=>614, 575=>536, 576=>523, 577=>703, 578=>553, 579=>686, 580=>730, 581=>696, 582=>615, 583=>610, 584=>334, + 585=>308, 586=>774, 587=>712, 588=>693, 589=>444, 590=>651, 591=>586, 592=>607, 593=>644, 594=>644, 595=>644, 596=>533, 597=>533, 598=>645, 599=>712, 600=>610, + 601=>610, 602=>788, 603=>501, 604=>490, 605=>733, 606=>658, 607=>308, 608=>712, 609=>644, 610=>564, 611=>661, 612=>571, 613=>641, 614=>641, 615=>641, 616=>491, + 617=>396, 618=>491, 619=>502, 620=>624, 621=>308, 622=>757, 623=>938, 624=>938, 625=>938, 626=>641, 627=>713, 628=>578, 629=>618, 630=>817, 631=>613, 632=>716, + 633=>484, 634=>484, 635=>584, 636=>444, 637=>444, 638=>536, 639=>536, 640=>578, 641=>578, 642=>536, 643=>374, 644=>391, 645=>544, 646=>497, 647=>430, 648=>430, + 649=>828, 650=>692, 651=>603, 652=>586, 653=>831, 654=>586, 655=>651, 656=>624, 657=>615, 658=>576, 659=>576, 660=>515, 661=>515, 662=>515, 663=>515, 664=>765, + 665=>569, 666=>658, 667=>616, 668=>622, 669=>308, 670=>659, 671=>485, 672=>712, 673=>515, 674=>515, 675=>1040, 676=>1093, 677=>1039, 678=>876, 679=>691, 680=>836, + 681=>923, 682=>712, 683=>702, 684=>532, 685=>374, 686=>609, 687=>710, 688=>410, 689=>410, 690=>197, 691=>284, 692=>284, 693=>284, 694=>369, 695=>532, 696=>375, + 697=>271, 698=>469, 699=>342, 700=>342, 701=>342, 702=>330, 703=>330, 704=>293, 705=>293, 706=>450, 707=>450, 708=>450, 709=>450, 711=>450, 712=>275, 713=>450, + 714=>450, 715=>450, 716=>275, 717=>450, 718=>450, 719=>450, 720=>303, 721=>303, 722=>330, 723=>330, 724=>450, 725=>450, 726=>450, 727=>450, 728=>450, 729=>450, + 730=>450, 731=>450, 733=>450, 734=>315, 735=>450, 736=>370, 737=>197, 738=>343, 739=>371, 740=>293, 741=>450, 742=>450, 743=>450, 744=>450, 745=>450, 748=>450, + 749=>450, 750=>450, 755=>450, 759=>450, 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 773=>0, 774=>0, 775=>0, 776=>0, 777=>0, 778=>0, 779=>0, + 780=>0, 781=>0, 782=>0, 783=>0, 784=>0, 785=>0, 786=>0, 787=>0, 788=>0, 789=>0, 790=>0, 791=>0, 792=>0, 793=>0, 794=>0, 795=>0, + 796=>0, 797=>0, 798=>0, 799=>0, 800=>0, 801=>0, 802=>0, 803=>0, 804=>0, 805=>0, 806=>0, 807=>0, 808=>0, 809=>0, 810=>0, 811=>0, + 812=>0, 813=>0, 814=>0, 815=>0, 816=>0, 817=>0, 818=>0, 819=>0, 820=>0, 821=>0, 822=>0, 823=>0, 824=>0, 825=>0, 826=>0, 827=>0, + 828=>0, 829=>0, 830=>0, 831=>0, 832=>0, 833=>0, 834=>0, 835=>0, 836=>0, 837=>0, 838=>0, 839=>0, 840=>0, 841=>0, 842=>0, 843=>0, + 844=>0, 845=>0, 846=>0, 847=>0, 849=>0, 850=>0, 851=>0, 855=>0, 856=>0, 860=>0, 861=>0, 862=>0, 863=>0, 864=>0, 865=>0, 866=>0, + 884=>271, 885=>271, 890=>450, 891=>533, 892=>495, 893=>494, 894=>303, 900=>397, 901=>450, 902=>717, 903=>342, 904=>761, 905=>908, 906=>507, 908=>801, 910=>882, + 911=>804, 912=>351, 913=>696, 914=>686, 915=>573, 916=>696, 917=>615, 918=>652, 919=>753, 920=>765, 921=>334, 922=>697, 923=>696, 924=>896, 925=>753, 926=>568, + 927=>765, 928=>753, 929=>659, 931=>615, 932=>614, 933=>651, 934=>765, 935=>694, 936=>765, 937=>765, 938=>334, 939=>651, 940=>618, 941=>501, 942=>641, 943=>351, + 944=>607, 945=>618, 946=>644, 947=>613, 948=>618, 949=>501, 950=>532, 951=>641, 952=>618, 953=>351, 954=>639, 955=>569, 956=>662, 957=>613, 958=>532, 959=>618, + 960=>712, 961=>644, 962=>533, 963=>701, 964=>574, 965=>607, 966=>704, 967=>580, 968=>714, 969=>782, 970=>351, 971=>607, 972=>618, 973=>607, 974=>782, 976=>585, + 977=>594, 978=>671, 979=>883, 980=>671, 981=>716, 982=>782, 983=>669, 984=>765, 985=>618, 986=>660, 987=>533, 988=>615, 989=>444, 990=>632, 991=>593, 992=>827, + 993=>564, 994=>983, 995=>753, 996=>749, 997=>644, 998=>835, 999=>669, 1000=>660, 1001=>585, 1002=>709, 1003=>604, 1004=>677, 1005=>644, 1006=>614, 1007=>531, 1008=>669, + 1009=>644, 1010=>533, 1011=>308, 1012=>765, 1013=>580, 1014=>580, 1015=>664, 1016=>644, 1017=>660, 1018=>896, 1019=>659, 1020=>644, 1021=>628, 1022=>660, 1023=>628, 1024=>615, + 1025=>615, 1026=>791, 1028=>660, 1029=>648, 1030=>334, 1031=>334, 1032=>334, 1033=>1039, 1034=>1017, 1035=>791, 1037=>753, 1038=>694, 1040=>696, 1041=>686, 1042=>686, 1043=>573, + 1044=>801, 1045=>615, 1046=>1102, 1047=>639, 1048=>753, 1049=>753, 1050=>735, 1051=>747, 1052=>896, 1053=>753, 1054=>765, 1055=>753, 1056=>659, 1057=>660, 1058=>614, 1059=>694, + 1060=>892, 1061=>694, 1062=>835, 1063=>727, 1064=>1112, 1065=>1193, 1066=>845, 1067=>932, 1068=>686, 1069=>660, 1070=>1056, 1071=>693, 1072=>607, 1073=>628, 1074=>569, 1075=>470, + 1076=>727, 1077=>610, 1078=>896, 1079=>523, 1080=>630, 1081=>630, 1082=>611, 1083=>659, 1084=>735, 1085=>622, 1086=>618, 1087=>622, 1088=>644, 1089=>533, 1090=>521, 1091=>586, + 1092=>893, 1093=>580, 1094=>667, 1095=>618, 1096=>956, 1097=>995, 1098=>676, 1099=>813, 1100=>569, 1101=>533, 1102=>875, 1103=>578, 1104=>610, 1105=>610, 1106=>642, 1107=>470, + 1108=>533, 1109=>536, 1110=>308, 1111=>308, 1112=>308, 1113=>892, 1114=>860, 1115=>661, 1117=>630, 1118=>586, 1119=>622, 1120=>983, 1121=>782, 1122=>756, 1123=>662, 1124=>911, + 1125=>755, 1126=>893, 1127=>749, 1128=>1222, 1129=>1009, 1130=>765, 1131=>618, 1132=>1112, 1133=>906, 1134=>626, 1135=>501, 1136=>967, 1137=>955, 1138=>765, 1139=>601, 1140=>765, + 1141=>625, 1142=>765, 1143=>625, 1144=>1033, 1145=>939, 1146=>967, 1147=>776, 1148=>1265, 1149=>1055, 1150=>983, 1151=>782, 1152=>660, 1153=>533, 1154=>587, 1155=>0, 1156=>0, + 1157=>0, 1158=>0, 1160=>376, 1161=>376, 1162=>861, 1163=>726, 1164=>686, 1165=>550, 1166=>659, 1167=>644, 1168=>573, 1169=>470, 1170=>599, 1171=>488, 1172=>727, 1173=>602, + 1174=>1102, 1175=>896, 1176=>639, 1177=>523, 1178=>697, 1179=>611, 1180=>735, 1181=>611, 1182=>735, 1183=>611, 1184=>914, 1185=>743, 1186=>860, 1187=>727, 1188=>992, 1189=>787, + 1190=>1146, 1191=>915, 1192=>787, 1193=>639, 1194=>660, 1195=>533, 1196=>614, 1197=>521, 1198=>651, 1199=>586, 1200=>651, 1201=>586, 1202=>694, 1203=>580, 1204=>1001, 1205=>900, + 1206=>727, 1207=>618, 1208=>727, 1209=>618, 1210=>727, 1211=>641, 1212=>923, 1213=>729, 1214=>923, 1215=>729, 1216=>334, 1217=>1102, 1218=>896, 1219=>697, 1220=>567, 1221=>855, + 1222=>725, 1223=>753, 1224=>622, 1225=>861, 1226=>726, 1227=>727, 1228=>618, 1229=>1003, 1230=>839, 1231=>308, 1232=>696, 1233=>607, 1234=>696, 1235=>607, 1236=>976, 1237=>943, + 1238=>615, 1239=>610, 1240=>764, 1241=>610, 1242=>764, 1243=>610, 1244=>1102, 1245=>896, 1246=>639, 1247=>523, 1248=>695, 1249=>576, 1250=>753, 1251=>630, 1252=>753, 1253=>630, + 1254=>765, 1255=>618, 1256=>765, 1257=>618, 1258=>765, 1259=>618, 1260=>660, 1261=>533, 1262=>694, 1263=>586, 1264=>694, 1265=>586, 1266=>694, 1267=>586, 1268=>727, 1269=>618, + 1270=>573, 1271=>470, 1272=>932, 1273=>813, 1274=>599, 1275=>488, 1276=>694, 1277=>580, 1278=>694, 1279=>580, 1280=>686, 1281=>547, 1282=>1043, 1283=>804, 1284=>1007, 1285=>828, + 1286=>745, 1287=>624, 1288=>1117, 1289=>915, 1290=>1123, 1291=>912, 1292=>755, 1293=>574, 1294=>844, 1295=>722, 1296=>626, 1297=>501, 1298=>747, 1299=>659, 1329=>886, 1330=>730, + 1331=>886, 1332=>886, 1333=>730, 1334=>699, 1335=>730, 1336=>730, 1337=>877, 1338=>886, 1339=>730, 1340=>639, 1341=>970, 1342=>1022, 1343=>730, 1344=>639, 1345=>681, 1346=>886, + 1347=>789, 1348=>886, 1349=>714, 1350=>886, 1351=>730, 1352=>730, 1353=>730, 1354=>862, 1355=>699, 1356=>886, 1357=>730, 1358=>886, 1359=>648, 1360=>730, 1361=>714, 1362=>805, + 1363=>765, 1364=>842, 1365=>765, 1366=>648, 1369=>330, 1370=>342, 1371=>495, 1372=>495, 1373=>342, 1374=>491, 1375=>468, 1377=>938, 1378=>641, 1379=>779, 1380=>781, 1381=>641, + 1382=>735, 1383=>588, 1384=>641, 1385=>729, 1386=>735, 1387=>641, 1388=>448, 1389=>916, 1390=>644, 1391=>641, 1392=>641, 1393=>644, 1394=>737, 1395=>641, 1396=>676, 1397=>308, + 1398=>794, 1399=>502, 1400=>641, 1401=>502, 1402=>938, 1403=>502, 1404=>777, 1405=>641, 1406=>732, 1407=>938, 1408=>641, 1409=>644, 1410=>514, 1411=>938, 1412=>700, 1413=>618, + 1414=>648, 1415=>776, 1417=>360, 1418=>438, 1456=>0, 1457=>0, 1458=>0, 1459=>0, 1460=>0, 1461=>0, 1462=>0, 1463=>0, 1464=>0, 1465=>0, 1467=>0, 1468=>0, + 1469=>0, 1471=>0, 1472=>334, 1473=>0, 1474=>0, 1475=>334, 1478=>479, 1479=>0, 1488=>676, 1489=>658, 1490=>483, 1491=>615, 1492=>700, 1493=>334, 1494=>468, 1495=>700, + 1496=>692, 1497=>334, 1498=>700, 1499=>675, 1500=>646, 1501=>700, 1502=>771, 1503=>334, 1504=>479, 1505=>770, 1506=>647, 1507=>721, 1508=>699, 1509=>565, 1510=>676, 1511=>723, + 1512=>700, 1513=>867, 1514=>740, 1520=>623, 1521=>623, 1522=>623, 1548=>342, 1557=>0, 1563=>360, 1567=>522, 1569=>460, 1570=>308, 1571=>308, 1572=>559, 1573=>308, 1574=>825, + 1575=>308, 1576=>904, 1577=>531, 1578=>904, 1579=>904, 1580=>648, 1581=>648, 1582=>648, 1583=>461, 1584=>461, 1585=>518, 1586=>518, 1587=>1242, 1588=>1242, 1589=>1210, 1590=>1210, + 1591=>935, 1592=>935, 1593=>615, 1594=>615, 1600=>308, 1601=>1045, 1602=>804, 1603=>825, 1604=>781, 1605=>659, 1606=>768, 1607=>531, 1608=>559, 1609=>825, 1610=>825, 1611=>0, + 1612=>0, 1613=>0, 1614=>0, 1615=>0, 1616=>0, 1617=>0, 1618=>0, 1619=>0, 1620=>0, 1621=>0, 1626=>450, 1632=>549, 1633=>549, 1634=>549, 1635=>549, 1636=>549, + 1637=>549, 1638=>549, 1639=>549, 1640=>549, 1641=>549, 1642=>549, 1643=>336, 1644=>342, 1645=>490, 1646=>904, 1647=>804, 1652=>263, 1657=>904, 1658=>904, 1659=>904, 1660=>904, + 1661=>904, 1662=>904, 1663=>904, 1664=>904, 1665=>648, 1666=>648, 1667=>648, 1668=>648, 1669=>648, 1670=>648, 1671=>648, 1681=>518, 1682=>518, 1685=>613, 1688=>518, 1697=>1045, + 1700=>1045, 1702=>1045, 1705=>921, 1711=>921, 1717=>781, 1722=>768, 1727=>648, 1734=>559, 1740=>825, 1742=>825, 1749=>531, 1776=>549, 1777=>549, 1778=>549, 1779=>549, 1780=>549, + 1781=>549, 1782=>549, 1783=>549, 1784=>549, 1785=>549, 3647=>668, 3713=>710, 3714=>673, 3716=>674, 3719=>512, 3720=>668, 3722=>669, 3725=>685, 3732=>635, 3733=>633, 3734=>672, + 3735=>737, 3737=>657, 3738=>654, 3739=>654, 3740=>830, 3741=>744, 3742=>779, 3743=>779, 3745=>752, 3746=>685, 3747=>692, 3749=>691, 3751=>642, 3754=>744, 3755=>928, 3757=>651, + 3758=>705, 3759=>840, 3760=>620, 3761=>0, 3762=>549, 3763=>549, 3764=>0, 3765=>0, 3766=>0, 3767=>0, 3768=>0, 3769=>0, 3771=>0, 3772=>0, 3773=>603, 3776=>464, + 3777=>774, 3778=>464, 3779=>584, 3780=>569, 3782=>683, 3784=>0, 3785=>0, 3786=>0, 3787=>0, 3788=>0, 3789=>0, 3804=>1227, 3805=>1227, 5121=>696, 5122=>696, 5123=>696, + 5124=>696, 5125=>814, 5126=>814, 5127=>814, 5129=>814, 5130=>814, 5131=>814, 5132=>916, 5133=>908, 5134=>916, 5135=>908, 5136=>916, 5137=>908, 5138=>1034, 5139=>1025, 5140=>1034, + 5141=>1025, 5142=>814, 5143=>1034, 5144=>1028, 5145=>1034, 5146=>1028, 5147=>814, 5149=>278, 5150=>476, 5151=>382, 5152=>382, 5153=>355, 5154=>355, 5155=>355, 5156=>355, 5157=>507, + 5158=>423, 5159=>278, 5160=>355, 5161=>355, 5162=>355, 5163=>1092, 5164=>888, 5165=>1094, 5166=>1167, 5167=>696, 5168=>696, 5169=>696, 5170=>696, 5171=>797, 5172=>797, 5173=>797, + 5175=>797, 5176=>797, 5177=>797, 5178=>916, 5179=>908, 5180=>916, 5181=>908, 5182=>916, 5183=>908, 5184=>1034, 5185=>1025, 5186=>1034, 5187=>1025, 5188=>1034, 5189=>1028, 5190=>1034, + 5191=>1028, 5192=>797, 5193=>518, 5194=>206, 5196=>730, 5197=>730, 5198=>730, 5199=>730, 5200=>734, 5201=>734, 5202=>734, 5204=>734, 5205=>734, 5206=>734, 5207=>950, 5208=>943, + 5209=>950, 5210=>943, 5211=>950, 5212=>943, 5213=>954, 5214=>949, 5215=>954, 5216=>949, 5217=>954, 5218=>946, 5219=>954, 5220=>946, 5221=>954, 5222=>493, 5223=>904, 5224=>904, + 5225=>921, 5226=>915, 5227=>668, 5228=>668, 5229=>668, 5230=>668, 5231=>668, 5232=>680, 5233=>668, 5234=>668, 5235=>668, 5236=>926, 5237=>877, 5238=>882, 5239=>877, 5240=>882, + 5241=>877, 5242=>926, 5243=>877, 5244=>926, 5245=>877, 5246=>882, 5247=>877, 5248=>882, 5249=>877, 5250=>882, 5251=>451, 5252=>451, 5253=>844, 5254=>844, 5255=>844, 5256=>844, + 5257=>668, 5258=>668, 5259=>668, 5260=>668, 5261=>668, 5262=>680, 5263=>668, 5264=>668, 5265=>668, 5266=>926, 5267=>877, 5268=>926, 5269=>877, 5270=>926, 5271=>877, 5272=>926, + 5273=>877, 5274=>926, 5275=>877, 5276=>926, 5277=>877, 5278=>926, 5279=>877, 5280=>926, 5281=>451, 5282=>451, 5283=>563, 5284=>563, 5285=>563, 5286=>563, 5287=>563, 5288=>601, + 5289=>563, 5290=>563, 5291=>563, 5292=>793, 5293=>769, 5294=>777, 5295=>786, 5296=>777, 5297=>786, 5298=>793, 5299=>786, 5300=>793, 5301=>786, 5302=>777, 5303=>786, 5304=>777, + 5305=>786, 5306=>777, 5307=>392, 5308=>493, 5309=>392, 5312=>889, 5313=>889, 5314=>889, 5315=>889, 5316=>838, 5317=>838, 5318=>838, 5319=>838, 5320=>838, 5321=>1114, 5322=>1122, + 5323=>1080, 5324=>1105, 5325=>1080, 5326=>1105, 5327=>838, 5328=>593, 5329=>447, 5330=>593, 5331=>889, 5332=>889, 5333=>889, 5334=>889, 5335=>838, 5336=>838, 5337=>838, 5338=>838, + 5339=>838, 5340=>1107, 5341=>1122, 5342=>1155, 5343=>1105, 5344=>1155, 5345=>1105, 5346=>1105, 5347=>1093, 5348=>1105, 5349=>1093, 5350=>1155, 5351=>1105, 5352=>1155, 5353=>1105, 5354=>593, + 5356=>797, 5357=>657, 5358=>657, 5359=>657, 5360=>657, 5361=>657, 5362=>680, 5363=>657, 5364=>657, 5365=>657, 5366=>897, 5367=>862, 5368=>870, 5369=>890, 5370=>870, 5371=>890, + 5372=>897, 5373=>862, 5374=>897, 5375=>862, 5376=>870, 5377=>890, 5378=>870, 5379=>890, 5380=>870, 5381=>443, 5382=>414, 5383=>443, 5392=>831, 5393=>831, 5394=>831, 5395=>1022, + 5396=>1022, 5397=>1022, 5398=>1022, 5399=>1088, 5400=>1081, 5401=>1088, 5402=>1081, 5403=>1088, 5404=>1081, 5405=>1288, 5406=>1278, 5407=>1288, 5408=>1278, 5409=>1288, 5410=>1278, 5411=>1288, + 5412=>1278, 5413=>671, 5414=>698, 5415=>698, 5416=>698, 5417=>698, 5418=>698, 5419=>698, 5420=>698, 5421=>698, 5422=>698, 5423=>902, 5424=>903, 5425=>911, 5426=>896, 5427=>911, + 5428=>896, 5429=>902, 5430=>903, 5431=>902, 5432=>903, 5433=>911, 5434=>896, 5435=>911, 5436=>896, 5437=>911, 5438=>445, 5440=>355, 5441=>458, 5442=>929, 5443=>929, 5444=>878, + 5445=>878, 5446=>878, 5447=>878, 5448=>659, 5449=>659, 5450=>659, 5451=>659, 5452=>659, 5453=>659, 5454=>902, 5455=>863, 5456=>445, 5458=>797, 5459=>696, 5460=>696, 5461=>696, + 5462=>696, 5463=>835, 5464=>835, 5465=>835, 5466=>835, 5467=>1055, 5468=>1028, 5469=>542, 5470=>730, 5471=>730, 5472=>730, 5473=>730, 5474=>730, 5475=>730, 5476=>734, 5477=>734, + 5478=>734, 5479=>734, 5480=>954, 5481=>946, 5482=>493, 5492=>879, 5493=>879, 5494=>879, 5495=>879, 5496=>879, 5497=>879, 5498=>879, 5499=>556, 5500=>753, 5501=>458, 5502=>1114, + 5503=>1114, 5504=>1114, 5505=>1114, 5506=>1114, 5507=>1114, 5508=>1114, 5509=>890, 5514=>879, 5515=>879, 5516=>879, 5517=>879, 5518=>1432, 5519=>1432, 5520=>1432, 5521=>1165, 5522=>1165, + 5523=>1432, 5524=>1432, 5525=>763, 5526=>1146, 5536=>889, 5537=>889, 5538=>838, 5539=>838, 5540=>838, 5541=>838, 5542=>593, 5543=>698, 5544=>698, 5545=>698, 5546=>698, 5547=>698, + 5548=>698, 5549=>698, 5550=>445, 5551=>668, 5598=>747, 5601=>747, 5702=>446, 5703=>446, 5742=>371, 5743=>1114, 5744=>1432, 5745=>1814, 5746=>1814, 5747=>1548, 5748=>1510, 5749=>1814, + 5750=>1814, 7424=>586, 7425=>750, 7426=>943, 7427=>547, 7428=>533, 7429=>608, 7430=>608, 7431=>502, 7432=>501, 7433=>308, 7434=>444, 7435=>598, 7436=>485, 7437=>735, 7438=>630, + 7439=>618, 7440=>533, 7441=>594, 7442=>594, 7443=>594, 7444=>984, 7446=>618, 7447=>618, 7448=>500, 7449=>578, 7450=>578, 7451=>521, 7452=>571, 7453=>663, 7454=>853, 7455=>625, + 7456=>586, 7457=>831, 7458=>523, 7459=>581, 7462=>485, 7463=>586, 7464=>622, 7465=>500, 7466=>703, 7467=>659, 7468=>438, 7469=>615, 7470=>432, 7472=>470, 7473=>387, 7474=>387, + 7475=>465, 7476=>474, 7477=>211, 7478=>211, 7479=>439, 7480=>361, 7481=>563, 7482=>474, 7483=>474, 7484=>481, 7485=>458, 7486=>415, 7487=>436, 7488=>387, 7489=>460, 7490=>625, + 7491=>412, 7492=>412, 7493=>431, 7494=>641, 7495=>431, 7496=>431, 7497=>431, 7498=>431, 7499=>347, 7500=>347, 7501=>431, 7502=>197, 7503=>438, 7504=>597, 7505=>410, 7506=>439, + 7507=>372, 7508=>439, 7509=>439, 7510=>431, 7511=>349, 7512=>410, 7513=>416, 7514=>597, 7515=>451, 7517=>405, 7518=>386, 7519=>389, 7520=>443, 7521=>365, 7522=>197, 7523=>284, + 7524=>410, 7525=>451, 7526=>405, 7527=>386, 7528=>389, 7529=>443, 7530=>365, 7543=>644, 7544=>474, 7547=>491, 7557=>462, 7579=>431, 7580=>372, 7581=>372, 7582=>439, 7583=>347, + 7584=>339, 7585=>313, 7586=>431, 7587=>410, 7588=>312, 7589=>253, 7590=>312, 7591=>312, 7592=>388, 7593=>293, 7594=>296, 7595=>333, 7596=>598, 7597=>597, 7598=>505, 7599=>505, + 7600=>403, 7601=>439, 7602=>488, 7603=>379, 7604=>356, 7605=>349, 7606=>524, 7607=>444, 7608=>359, 7609=>405, 7610=>451, 7611=>375, 7612=>471, 7613=>422, 7614=>409, 7615=>382, + 7620=>0, 7621=>0, 7622=>0, 7623=>0, 7624=>0, 7625=>0, 7680=>696, 7681=>607, 7682=>686, 7683=>644, 7684=>686, 7685=>644, 7686=>686, 7687=>644, 7688=>660, 7689=>533, + 7690=>747, 7691=>644, 7692=>747, 7693=>644, 7694=>747, 7695=>644, 7696=>747, 7697=>644, 7698=>747, 7699=>644, 7700=>615, 7701=>610, 7702=>615, 7703=>610, 7704=>615, 7705=>610, + 7706=>615, 7707=>610, 7708=>615, 7709=>610, 7710=>615, 7711=>391, 7712=>738, 7713=>644, 7714=>753, 7715=>641, 7716=>753, 7717=>641, 7718=>753, 7719=>641, 7720=>753, 7721=>641, + 7722=>753, 7723=>641, 7724=>334, 7725=>308, 7726=>334, 7727=>308, 7728=>697, 7729=>598, 7730=>697, 7731=>598, 7732=>697, 7733=>598, 7734=>573, 7735=>308, 7736=>573, 7737=>308, + 7738=>573, 7739=>308, 7740=>573, 7741=>308, 7742=>896, 7743=>938, 7744=>896, 7745=>938, 7746=>896, 7747=>938, 7748=>753, 7749=>641, 7750=>753, 7751=>641, 7752=>753, 7753=>641, + 7754=>753, 7755=>641, 7756=>765, 7757=>618, 7758=>765, 7759=>618, 7760=>765, 7761=>618, 7762=>765, 7763=>618, 7764=>659, 7765=>644, 7766=>659, 7767=>644, 7768=>693, 7769=>444, + 7770=>693, 7771=>444, 7772=>693, 7773=>444, 7774=>693, 7775=>444, 7776=>648, 7777=>536, 7778=>648, 7779=>536, 7780=>648, 7781=>536, 7782=>648, 7783=>536, 7784=>648, 7785=>536, + 7786=>614, 7787=>430, 7788=>614, 7789=>430, 7790=>614, 7791=>430, 7792=>614, 7793=>430, 7794=>730, 7795=>641, 7796=>730, 7797=>641, 7798=>730, 7799=>641, 7800=>730, 7801=>641, + 7802=>730, 7803=>641, 7804=>696, 7805=>586, 7806=>696, 7807=>586, 7808=>993, 7809=>831, 7810=>993, 7811=>831, 7812=>993, 7813=>831, 7814=>993, 7815=>831, 7816=>993, 7817=>831, + 7818=>694, 7819=>580, 7820=>694, 7821=>580, 7822=>651, 7823=>586, 7824=>652, 7825=>523, 7826=>652, 7827=>523, 7828=>652, 7829=>523, 7830=>641, 7831=>430, 7832=>831, 7833=>586, + 7834=>607, 7835=>391, 7840=>696, 7841=>607, 7842=>696, 7843=>607, 7844=>696, 7845=>607, 7846=>696, 7847=>607, 7848=>696, 7849=>607, 7850=>696, 7851=>607, 7852=>696, 7853=>607, + 7854=>696, 7855=>607, 7856=>696, 7857=>607, 7858=>696, 7859=>607, 7860=>696, 7861=>607, 7862=>696, 7863=>607, 7864=>615, 7865=>610, 7866=>615, 7867=>610, 7868=>615, 7869=>610, + 7870=>615, 7871=>610, 7872=>615, 7873=>610, 7874=>615, 7875=>610, 7876=>615, 7877=>610, 7878=>615, 7879=>610, 7880=>334, 7881=>308, 7882=>334, 7883=>308, 7884=>765, 7885=>618, + 7886=>765, 7887=>618, 7888=>765, 7889=>618, 7890=>765, 7891=>618, 7892=>765, 7893=>618, 7894=>765, 7895=>618, 7896=>765, 7897=>618, 7898=>786, 7899=>618, 7900=>786, 7901=>618, + 7902=>786, 7903=>618, 7904=>786, 7905=>618, 7906=>786, 7907=>618, 7908=>730, 7909=>641, 7910=>730, 7911=>641, 7912=>751, 7913=>641, 7914=>751, 7915=>641, 7916=>751, 7917=>641, + 7918=>751, 7919=>641, 7920=>751, 7921=>641, 7922=>651, 7923=>586, 7924=>651, 7925=>586, 7926=>651, 7927=>586, 7928=>651, 7929=>586, 7936=>618, 7937=>618, 7938=>618, 7939=>618, + 7940=>618, 7941=>618, 7942=>618, 7943=>618, 7944=>696, 7945=>696, 7946=>937, 7947=>939, 7948=>841, 7949=>866, 7950=>751, 7951=>773, 7952=>501, 7953=>501, 7954=>501, 7955=>501, + 7956=>501, 7957=>501, 7960=>712, 7961=>715, 7962=>989, 7963=>986, 7964=>920, 7965=>947, 7968=>641, 7969=>641, 7970=>641, 7971=>641, 7972=>641, 7973=>641, 7974=>641, 7975=>641, + 7976=>851, 7977=>856, 7978=>1125, 7979=>1125, 7980=>1062, 7981=>1085, 7982=>948, 7983=>956, 7984=>351, 7985=>351, 7986=>351, 7987=>351, 7988=>351, 7989=>351, 7990=>351, 7991=>351, + 7992=>435, 7993=>440, 7994=>699, 7995=>707, 7996=>641, 7997=>664, 7998=>544, 7999=>544, 8000=>618, 8001=>618, 8002=>618, 8003=>618, 8004=>618, 8005=>618, 8008=>802, 8009=>839, + 8010=>1099, 8011=>1101, 8012=>947, 8013=>974, 8016=>607, 8017=>607, 8018=>607, 8019=>607, 8020=>607, 8021=>607, 8022=>607, 8023=>607, 8025=>837, 8027=>1065, 8029=>1079, 8031=>944, + 8032=>782, 8033=>782, 8034=>782, 8035=>782, 8036=>782, 8037=>782, 8038=>782, 8039=>782, 8040=>817, 8041=>862, 8042=>1121, 8043=>1126, 8044=>968, 8045=>994, 8046=>925, 8047=>968, + 8048=>618, 8049=>618, 8050=>501, 8051=>501, 8052=>641, 8053=>641, 8054=>351, 8055=>351, 8056=>618, 8057=>618, 8058=>607, 8059=>607, 8060=>782, 8061=>782, 8064=>618, 8065=>618, + 8066=>618, 8067=>618, 8068=>618, 8069=>618, 8070=>618, 8071=>618, 8072=>696, 8073=>696, 8074=>937, 8075=>939, 8076=>841, 8077=>866, 8078=>751, 8079=>773, 8080=>641, 8081=>641, + 8082=>641, 8083=>641, 8084=>641, 8085=>641, 8086=>641, 8087=>641, 8088=>851, 8089=>856, 8090=>1125, 8091=>1125, 8092=>1062, 8093=>1085, 8094=>948, 8095=>956, 8096=>782, 8097=>782, + 8098=>782, 8099=>782, 8100=>782, 8101=>782, 8102=>782, 8103=>782, 8104=>817, 8105=>862, 8106=>1121, 8107=>1126, 8108=>968, 8109=>994, 8110=>925, 8111=>968, 8112=>618, 8113=>618, + 8114=>618, 8115=>618, 8116=>618, 8118=>618, 8119=>618, 8120=>696, 8121=>696, 8122=>789, 8123=>717, 8124=>696, 8125=>450, 8126=>450, 8127=>450, 8128=>450, 8129=>450, 8130=>641, + 8131=>641, 8132=>641, 8134=>641, 8135=>641, 8136=>836, 8137=>761, 8138=>972, 8139=>908, 8140=>753, 8141=>450, 8142=>450, 8143=>450, 8144=>351, 8145=>351, 8146=>351, 8147=>351, + 8150=>351, 8151=>351, 8152=>334, 8153=>334, 8154=>559, 8155=>507, 8157=>450, 8158=>450, 8159=>450, 8160=>607, 8161=>607, 8162=>607, 8163=>607, 8164=>644, 8165=>644, 8166=>607, + 8167=>607, 8168=>651, 8169=>651, 8170=>918, 8171=>882, 8172=>754, 8173=>450, 8174=>450, 8175=>450, 8178=>782, 8179=>782, 8180=>782, 8182=>782, 8183=>782, 8184=>958, 8185=>801, + 8186=>976, 8187=>804, 8188=>765, 8189=>450, 8190=>450, 8192=>450, 8193=>900, 8194=>450, 8195=>900, 8196=>296, 8197=>225, 8198=>150, 8199=>626, 8200=>342, 8201=>180, 8202=>89, + 8203=>0, 8204=>0, 8205=>0, 8206=>0, 8207=>0, 8208=>374, 8209=>374, 8210=>626, 8213=>900, 8214=>450, 8215=>450, 8219=>342, 8223=>591, 8227=>575, 8228=>299, 8229=>600, + 8231=>313, 8234=>0, 8235=>0, 8236=>0, 8237=>0, 8238=>0, 8239=>180, 8241=>1698, 8242=>237, 8243=>402, 8244=>567, 8245=>237, 8246=>402, 8247=>567, 8248=>659, 8251=>875, + 8252=>564, 8253=>522, 8254=>450, 8255=>745, 8256=>745, 8257=>296, 8258=>920, 8259=>450, 8260=>410, 8261=>411, 8262=>411, 8263=>927, 8264=>746, 8265=>746, 8266=>461, 8267=>572, + 8268=>450, 8269=>450, 8270=>470, 8271=>360, 8272=>745, 8273=>470, 8274=>500, 8275=>754, 8276=>745, 8277=>754, 8278=>615, 8279=>731, 8280=>754, 8281=>754, 8282=>342, 8283=>784, + 8284=>754, 8285=>342, 8286=>342, 8287=>200, 8288=>0, 8289=>0, 8290=>0, 8291=>0, 8298=>0, 8299=>0, 8300=>0, 8301=>0, 8302=>0, 8303=>0, 8304=>394, 8305=>197, + 8308=>394, 8309=>394, 8310=>394, 8311=>394, 8312=>394, 8313=>394, 8314=>475, 8315=>475, 8316=>475, 8317=>259, 8318=>259, 8319=>410, 8320=>394, 8321=>394, 8322=>394, 8323=>394, + 8324=>394, 8325=>394, 8326=>394, 8327=>394, 8328=>394, 8329=>394, 8330=>475, 8331=>475, 8332=>475, 8333=>259, 8334=>259, 8336=>412, 8337=>431, 8338=>439, 8339=>371, 8340=>431, + 8352=>836, 8353=>626, 8354=>626, 8355=>626, 8356=>626, 8357=>938, 8358=>753, 8359=>1366, 8360=>1084, 8361=>993, 8362=>813, 8363=>626, 8365=>626, 8366=>614, 8367=>1252, 8368=>626, + 8369=>626, 8370=>626, 8371=>626, 8372=>773, 8373=>626, 8400=>0, 8401=>0, 8406=>0, 8407=>0, 8448=>1007, 8449=>1053, 8450=>660, 8451=>1090, 8452=>806, 8453=>982, 8454=>1029, + 8455=>553, 8456=>628, 8457=>978, 8459=>965, 8460=>822, 8461=>765, 8462=>641, 8463=>641, 8464=>544, 8465=>624, 8466=>781, 8467=>424, 8468=>876, 8469=>753, 8470=>1083, 8471=>900, + 8472=>627, 8473=>631, 8474=>765, 8475=>789, 8476=>732, 8477=>713, 8478=>807, 8479=>639, 8480=>917, 8481=>1152, 8483=>679, 8484=>652, 8485=>520, 8486=>765, 8487=>692, 8488=>686, + 8489=>304, 8490=>697, 8491=>696, 8492=>835, 8493=>699, 8494=>769, 8495=>572, 8496=>664, 8497=>729, 8498=>615, 8499=>1074, 8500=>418, 8501=>714, 8502=>662, 8503=>453, 8504=>625, + 8505=>342, 8506=>851, 8507=>1213, 8508=>710, 8509=>663, 8510=>586, 8511=>760, 8512=>756, 8513=>697, 8514=>501, 8515=>573, 8516=>684, 8517=>747, 8518=>644, 8519=>610, 8520=>308, + 8521=>308, 8523=>785, 8526=>492, 8531=>932, 8532=>932, 8533=>932, 8534=>932, 8535=>932, 8536=>932, 8537=>932, 8538=>932, 8539=>932, 8540=>932, 8541=>932, 8542=>932, 8543=>554, + 8544=>334, 8545=>593, 8546=>851, 8547=>989, 8548=>696, 8549=>989, 8550=>1247, 8551=>1505, 8552=>1008, 8553=>694, 8554=>1008, 8555=>1266, 8556=>573, 8557=>660, 8558=>747, 8559=>896, + 8560=>308, 8561=>546, 8562=>785, 8563=>885, 8564=>586, 8565=>866, 8566=>1104, 8567=>1342, 8568=>872, 8569=>580, 8570=>872, 8571=>1110, 8572=>308, 8573=>533, 8574=>644, 8575=>938, + 8576=>1160, 8577=>747, 8578=>1160, 8579=>660, 8580=>533, 8592=>754, 8593=>754, 8594=>754, 8595=>754, 8596=>754, 8597=>754, 8598=>754, 8599=>754, 8600=>754, 8601=>754, 8602=>754, + 8603=>754, 8604=>754, 8605=>754, 8606=>754, 8607=>754, 8608=>754, 8609=>754, 8610=>754, 8611=>754, 8612=>754, 8613=>754, 8614=>754, 8615=>754, 8616=>754, 8617=>754, 8618=>754, + 8619=>754, 8620=>754, 8621=>754, 8622=>754, 8623=>754, 8624=>754, 8625=>754, 8626=>754, 8627=>754, 8628=>754, 8629=>754, 8630=>754, 8631=>754, 8632=>754, 8633=>754, 8634=>754, + 8635=>754, 8636=>754, 8637=>754, 8638=>754, 8639=>754, 8640=>754, 8641=>754, 8642=>754, 8643=>754, 8644=>754, 8645=>754, 8646=>754, 8647=>754, 8648=>754, 8649=>754, 8650=>754, + 8651=>754, 8652=>754, 8653=>754, 8654=>754, 8655=>754, 8656=>754, 8657=>754, 8658=>754, 8659=>754, 8660=>754, 8661=>754, 8662=>754, 8663=>754, 8664=>754, 8665=>754, 8666=>754, + 8667=>754, 8668=>754, 8669=>754, 8670=>754, 8671=>754, 8672=>754, 8673=>754, 8674=>754, 8675=>754, 8676=>754, 8677=>754, 8678=>754, 8679=>754, 8680=>754, 8681=>754, 8682=>754, + 8683=>754, 8684=>754, 8685=>754, 8686=>754, 8687=>754, 8688=>754, 8689=>754, 8690=>754, 8691=>754, 8692=>754, 8693=>754, 8694=>754, 8695=>754, 8696=>754, 8697=>754, 8698=>754, + 8699=>754, 8700=>754, 8701=>754, 8702=>754, 8703=>754, 8704=>696, 8705=>626, 8706=>489, 8707=>615, 8708=>615, 8709=>771, 8710=>627, 8711=>627, 8712=>807, 8713=>807, 8714=>675, + 8715=>807, 8716=>807, 8717=>675, 8718=>572, 8719=>708, 8720=>708, 8721=>646, 8722=>754, 8723=>754, 8724=>626, 8725=>150, 8726=>626, 8727=>754, 8728=>563, 8729=>342, 8730=>600, + 8731=>600, 8732=>600, 8733=>602, 8734=>750, 8735=>754, 8736=>807, 8737=>807, 8738=>754, 8739=>450, 8740=>450, 8741=>450, 8742=>450, 8743=>730, 8744=>730, 8745=>730, 8746=>730, + 8747=>549, 8748=>835, 8749=>1165, 8750=>506, 8751=>879, 8752=>1181, 8753=>506, 8754=>506, 8755=>506, 8756=>626, 8757=>626, 8758=>264, 8759=>626, 8760=>754, 8761=>754, 8762=>754, + 8763=>754, 8764=>754, 8765=>754, 8766=>754, 8767=>754, 8768=>337, 8769=>754, 8770=>754, 8771=>754, 8772=>754, 8773=>754, 8774=>754, 8775=>754, 8776=>754, 8777=>754, 8778=>754, + 8779=>754, 8780=>754, 8781=>754, 8782=>754, 8783=>754, 8784=>754, 8785=>754, 8786=>754, 8787=>754, 8788=>956, 8789=>956, 8790=>754, 8791=>754, 8792=>754, 8793=>754, 8794=>754, + 8795=>754, 8796=>754, 8797=>754, 8798=>754, 8799=>754, 8800=>754, 8801=>754, 8802=>754, 8803=>754, 8804=>754, 8805=>754, 8806=>754, 8807=>754, 8808=>756, 8809=>756, 8810=>942, + 8811=>942, 8812=>450, 8813=>754, 8814=>754, 8815=>754, 8816=>754, 8817=>754, 8818=>754, 8819=>754, 8820=>754, 8821=>754, 8822=>754, 8823=>754, 8824=>754, 8825=>754, 8826=>754, + 8827=>754, 8828=>754, 8829=>754, 8830=>754, 8831=>754, 8832=>754, 8833=>754, 8834=>754, 8835=>754, 8836=>754, 8837=>754, 8838=>754, 8839=>754, 8840=>754, 8841=>754, 8842=>754, + 8843=>754, 8844=>730, 8845=>730, 8846=>730, 8847=>754, 8848=>754, 8849=>754, 8850=>754, 8851=>678, 8852=>678, 8853=>754, 8854=>754, 8855=>754, 8856=>754, 8857=>754, 8858=>754, + 8859=>754, 8860=>754, 8861=>754, 8862=>754, 8863=>754, 8864=>754, 8865=>754, 8866=>822, 8867=>822, 8868=>822, 8869=>822, 8870=>488, 8871=>488, 8872=>822, 8873=>822, 8874=>822, + 8875=>822, 8876=>822, 8877=>822, 8878=>822, 8879=>822, 8882=>754, 8883=>754, 8884=>754, 8885=>754, 8886=>900, 8887=>900, 8888=>754, 8889=>754, 8890=>488, 8891=>730, 8892=>730, + 8893=>730, 8896=>758, 8897=>758, 8898=>758, 8899=>758, 8900=>444, 8901=>342, 8902=>563, 8904=>900, 8905=>900, 8906=>900, 8907=>900, 8908=>900, 8909=>754, 8918=>754, 8919=>754, + 8920=>1280, 8921=>1280, 8922=>754, 8923=>754, 8924=>754, 8925=>754, 8926=>754, 8927=>754, 8928=>754, 8929=>754, 8930=>754, 8931=>754, 8932=>754, 8933=>754, 8934=>754, 8935=>754, + 8936=>754, 8937=>754, 8938=>754, 8939=>754, 8940=>754, 8941=>754, 8946=>1042, 8947=>807, 8948=>675, 8949=>807, 8950=>807, 8951=>675, 8952=>807, 8953=>807, 8954=>1042, 8955=>807, + 8956=>675, 8957=>807, 8958=>675, 8959=>807, 8962=>644, 8966=>826, 8968=>411, 8969=>411, 8970=>411, 8971=>411, 8976=>754, 8977=>484, 8984=>835, 8985=>754, 8992=>549, 8993=>549, + 8997=>900, 9000=>1299, 9085=>776, 9115=>450, 9116=>450, 9117=>450, 9118=>450, 9119=>450, 9120=>450, 9121=>450, 9122=>450, 9123=>450, 9124=>450, 9125=>450, 9126=>450, 9127=>675, + 9128=>675, 9129=>675, 9130=>675, 9131=>675, 9132=>675, 9133=>675, 9134=>549, 9166=>754, 9167=>850, 9250=>644, 9251=>644, 9312=>762, 9313=>762, 9314=>762, 9315=>762, 9316=>762, + 9317=>762, 9318=>762, 9319=>762, 9320=>762, 9321=>762, 9600=>692, 9601=>692, 9602=>692, 9603=>692, 9604=>692, 9605=>692, 9606=>692, 9607=>692, 9608=>692, 9609=>692, 9610=>692, + 9611=>692, 9612=>692, 9613=>692, 9614=>692, 9615=>692, 9616=>692, 9617=>692, 9618=>692, 9619=>692, 9620=>692, 9621=>692, 9622=>692, 9623=>692, 9624=>692, 9625=>692, 9626=>692, + 9627=>692, 9628=>692, 9629=>692, 9630=>692, 9631=>692, 9632=>850, 9633=>850, 9634=>850, 9635=>850, 9636=>850, 9637=>850, 9638=>850, 9639=>850, 9640=>850, 9641=>850, 9642=>610, + 9643=>610, 9644=>850, 9645=>850, 9646=>495, 9647=>495, 9648=>692, 9649=>692, 9650=>692, 9651=>692, 9652=>452, 9653=>452, 9654=>692, 9655=>692, 9656=>452, 9657=>452, 9658=>692, + 9659=>692, 9660=>692, 9661=>692, 9662=>452, 9663=>452, 9664=>692, 9665=>692, 9666=>452, 9667=>452, 9668=>692, 9669=>692, 9670=>692, 9671=>692, 9672=>692, 9673=>785, 9674=>444, + 9675=>785, 9676=>785, 9677=>785, 9678=>785, 9679=>785, 9680=>785, 9681=>785, 9682=>785, 9683=>785, 9684=>785, 9685=>785, 9686=>474, 9687=>474, 9688=>756, 9689=>873, 9690=>873, + 9691=>873, 9692=>348, 9693=>348, 9694=>348, 9695=>348, 9696=>692, 9697=>692, 9698=>692, 9699=>692, 9700=>692, 9701=>692, 9702=>575, 9703=>850, 9704=>850, 9705=>850, 9706=>850, + 9707=>850, 9708=>692, 9709=>692, 9710=>692, 9711=>1007, 9712=>850, 9713=>850, 9714=>850, 9715=>850, 9716=>785, 9717=>785, 9718=>785, 9719=>785, 9720=>692, 9721=>692, 9722=>692, + 9723=>747, 9724=>747, 9725=>659, 9726=>659, 9727=>692, 9728=>807, 9729=>900, 9730=>807, 9731=>807, 9732=>807, 9733=>807, 9734=>807, 9735=>515, 9736=>806, 9737=>807, 9738=>799, + 9739=>799, 9740=>604, 9741=>911, 9742=>1121, 9743=>1125, 9744=>807, 9745=>807, 9746=>807, 9747=>479, 9748=>807, 9749=>807, 9750=>807, 9751=>807, 9752=>807, 9753=>807, 9754=>807, + 9755=>807, 9756=>807, 9757=>548, 9758=>807, 9759=>548, 9760=>807, 9761=>807, 9762=>807, 9763=>807, 9764=>602, 9765=>671, 9766=>584, 9767=>705, 9768=>490, 9769=>807, 9770=>807, + 9771=>807, 9772=>639, 9773=>807, 9774=>807, 9775=>807, 9776=>807, 9777=>807, 9778=>807, 9779=>807, 9780=>807, 9781=>807, 9782=>807, 9783=>807, 9784=>807, 9785=>807, 9786=>807, + 9787=>807, 9788=>807, 9789=>807, 9790=>807, 9791=>552, 9792=>658, 9793=>658, 9794=>807, 9795=>807, 9796=>807, 9797=>807, 9798=>807, 9799=>807, 9800=>807, 9801=>807, 9802=>807, + 9803=>807, 9804=>807, 9805=>807, 9806=>807, 9807=>807, 9808=>807, 9809=>807, 9810=>807, 9811=>807, 9812=>807, 9813=>807, 9814=>807, 9815=>807, 9816=>807, 9817=>807, 9818=>807, + 9819=>807, 9820=>807, 9821=>807, 9822=>807, 9823=>807, 9824=>807, 9825=>807, 9826=>807, 9827=>807, 9828=>807, 9829=>807, 9830=>807, 9831=>807, 9832=>807, 9833=>424, 9834=>574, + 9835=>807, 9836=>807, 9837=>424, 9838=>321, 9839=>435, 9840=>673, 9841=>689, 9842=>807, 9843=>807, 9844=>807, 9845=>807, 9846=>807, 9847=>807, 9848=>807, 9849=>807, 9850=>807, + 9851=>807, 9852=>807, 9853=>807, 9854=>807, 9855=>807, 9856=>782, 9857=>782, 9858=>782, 9859=>782, 9860=>782, 9861=>782, 9862=>807, 9863=>807, 9864=>807, 9865=>807, 9866=>807, + 9867=>807, 9868=>807, 9869=>807, 9870=>807, 9871=>807, 9872=>807, 9873=>807, 9874=>807, 9875=>807, 9876=>807, 9877=>487, 9878=>807, 9879=>807, 9880=>807, 9881=>807, 9882=>807, + 9883=>807, 9884=>807, 9888=>807, 9889=>632, 9890=>754, 9891=>754, 9892=>754, 9893=>754, 9894=>754, 9895=>754, 9896=>754, 9897=>754, 9898=>754, 9899=>754, 9900=>754, 9901=>754, + 9902=>754, 9903=>754, 9904=>759, 9905=>754, 9906=>658, 9985=>754, 9986=>754, 9987=>754, 9988=>754, 9990=>754, 9991=>754, 9992=>754, 9993=>754, 9996=>754, 9997=>754, 9998=>754, + 9999=>754, 10000=>754, 10001=>754, 10002=>754, 10003=>754, 10004=>754, 10005=>754, 10006=>754, 10007=>754, 10008=>754, 10009=>754, 10010=>754, 10011=>754, 10012=>754, 10013=>754, 10014=>754, + 10015=>754, 10016=>754, 10017=>754, 10018=>754, 10019=>754, 10020=>754, 10021=>754, 10022=>754, 10023=>754, 10025=>754, 10026=>754, 10027=>754, 10028=>754, 10029=>754, 10030=>754, 10031=>754, + 10032=>754, 10033=>754, 10034=>754, 10035=>754, 10036=>754, 10037=>754, 10038=>754, 10039=>754, 10040=>754, 10041=>754, 10042=>754, 10043=>754, 10044=>754, 10045=>754, 10046=>754, 10047=>754, + 10048=>754, 10049=>754, 10050=>754, 10051=>754, 10052=>754, 10053=>754, 10054=>754, 10055=>754, 10056=>754, 10057=>754, 10058=>754, 10059=>754, 10061=>807, 10063=>807, 10064=>807, 10065=>807, + 10066=>807, 10070=>807, 10072=>754, 10073=>754, 10074=>754, 10075=>312, 10076=>312, 10077=>528, 10078=>528, 10081=>754, 10082=>754, 10083=>754, 10084=>754, 10085=>754, 10086=>754, 10087=>754, + 10088=>754, 10089=>754, 10090=>754, 10091=>754, 10092=>754, 10093=>754, 10094=>754, 10095=>754, 10096=>754, 10097=>754, 10098=>754, 10099=>754, 10100=>754, 10101=>754, 10102=>762, 10103=>762, + 10104=>762, 10105=>762, 10106=>762, 10107=>762, 10108=>762, 10109=>762, 10110=>762, 10111=>762, 10112=>754, 10113=>754, 10114=>754, 10115=>754, 10116=>754, 10117=>754, 10118=>754, 10119=>754, + 10120=>754, 10121=>754, 10122=>754, 10123=>754, 10124=>754, 10125=>754, 10126=>754, 10127=>754, 10128=>754, 10129=>754, 10130=>754, 10131=>754, 10132=>754, 10136=>754, 10137=>754, 10138=>754, + 10139=>754, 10140=>754, 10141=>754, 10142=>754, 10143=>754, 10144=>754, 10145=>754, 10146=>754, 10147=>754, 10148=>754, 10149=>754, 10150=>754, 10151=>754, 10152=>754, 10153=>754, 10154=>754, + 10155=>754, 10156=>754, 10157=>754, 10158=>754, 10159=>754, 10161=>754, 10162=>754, 10163=>754, 10164=>754, 10165=>754, 10166=>754, 10167=>754, 10168=>754, 10169=>754, 10170=>754, 10171=>754, + 10172=>754, 10173=>754, 10174=>754, 10208=>444, 10214=>438, 10215=>438, 10216=>411, 10217=>411, 10218=>648, 10219=>648, 10224=>754, 10225=>754, 10226=>754, 10227=>754, 10228=>1042, 10229=>1290, + 10230=>1290, 10231=>1290, 10232=>1290, 10233=>1290, 10234=>1290, 10235=>1290, 10236=>1290, 10237=>1290, 10238=>1290, 10239=>1290, 10240=>703, 10241=>703, 10242=>703, 10243=>703, 10244=>703, 10245=>703, + 10246=>703, 10247=>703, 10248=>703, 10249=>703, 10250=>703, 10251=>703, 10252=>703, 10253=>703, 10254=>703, 10255=>703, 10256=>703, 10257=>703, 10258=>703, 10259=>703, 10260=>703, 10261=>703, + 10262=>703, 10263=>703, 10264=>703, 10265=>703, 10266=>703, 10267=>703, 10268=>703, 10269=>703, 10270=>703, 10271=>703, 10272=>703, 10273=>703, 10274=>703, 10275=>703, 10276=>703, 10277=>703, + 10278=>703, 10279=>703, 10280=>703, 10281=>703, 10282=>703, 10283=>703, 10284=>703, 10285=>703, 10286=>703, 10287=>703, 10288=>703, 10289=>703, 10290=>703, 10291=>703, 10292=>703, 10293=>703, + 10294=>703, 10295=>703, 10296=>703, 10297=>703, 10298=>703, 10299=>703, 10300=>703, 10301=>703, 10302=>703, 10303=>703, 10304=>703, 10305=>703, 10306=>703, 10307=>703, 10308=>703, 10309=>703, + 10310=>703, 10311=>703, 10312=>703, 10313=>703, 10314=>703, 10315=>703, 10316=>703, 10317=>703, 10318=>703, 10319=>703, 10320=>703, 10321=>703, 10322=>703, 10323=>703, 10324=>703, 10325=>703, + 10326=>703, 10327=>703, 10328=>703, 10329=>703, 10330=>703, 10331=>703, 10332=>703, 10333=>703, 10334=>703, 10335=>703, 10336=>703, 10337=>703, 10338=>703, 10339=>703, 10340=>703, 10341=>703, + 10342=>703, 10343=>703, 10344=>703, 10345=>703, 10346=>703, 10347=>703, 10348=>703, 10349=>703, 10350=>703, 10351=>703, 10352=>703, 10353=>703, 10354=>703, 10355=>703, 10356=>703, 10357=>703, + 10358=>703, 10359=>703, 10360=>703, 10361=>703, 10362=>703, 10363=>703, 10364=>703, 10365=>703, 10366=>703, 10367=>703, 10368=>703, 10369=>703, 10370=>703, 10371=>703, 10372=>703, 10373=>703, + 10374=>703, 10375=>703, 10376=>703, 10377=>703, 10378=>703, 10379=>703, 10380=>703, 10381=>703, 10382=>703, 10383=>703, 10384=>703, 10385=>703, 10386=>703, 10387=>703, 10388=>703, 10389=>703, + 10390=>703, 10391=>703, 10392=>703, 10393=>703, 10394=>703, 10395=>703, 10396=>703, 10397=>703, 10398=>703, 10399=>703, 10400=>703, 10401=>703, 10402=>703, 10403=>703, 10404=>703, 10405=>703, + 10406=>703, 10407=>703, 10408=>703, 10409=>703, 10410=>703, 10411=>703, 10412=>703, 10413=>703, 10414=>703, 10415=>703, 10416=>703, 10417=>703, 10418=>703, 10419=>703, 10420=>703, 10421=>703, + 10422=>703, 10423=>703, 10424=>703, 10425=>703, 10426=>703, 10427=>703, 10428=>703, 10429=>703, 10430=>703, 10431=>703, 10432=>703, 10433=>703, 10434=>703, 10435=>703, 10436=>703, 10437=>703, + 10438=>703, 10439=>703, 10440=>703, 10441=>703, 10442=>703, 10443=>703, 10444=>703, 10445=>703, 10446=>703, 10447=>703, 10448=>703, 10449=>703, 10450=>703, 10451=>703, 10452=>703, 10453=>703, + 10454=>703, 10455=>703, 10456=>703, 10457=>703, 10458=>703, 10459=>703, 10460=>703, 10461=>703, 10462=>703, 10463=>703, 10464=>703, 10465=>703, 10466=>703, 10467=>703, 10468=>703, 10469=>703, + 10470=>703, 10471=>703, 10472=>703, 10473=>703, 10474=>703, 10475=>703, 10476=>703, 10477=>703, 10478=>703, 10479=>703, 10480=>703, 10481=>703, 10482=>703, 10483=>703, 10484=>703, 10485=>703, + 10486=>703, 10487=>703, 10488=>703, 10489=>703, 10490=>703, 10491=>703, 10492=>703, 10493=>703, 10494=>703, 10495=>703, 10502=>754, 10503=>754, 10506=>754, 10507=>754, 10560=>754, 10561=>754, + 10702=>754, 10703=>941, 10704=>941, 10705=>900, 10706=>900, 10707=>900, 10708=>900, 10709=>900, 10731=>444, 10752=>900, 10753=>900, 10754=>900, 10764=>1495, 10765=>506, 10766=>506, 10767=>506, + 10768=>506, 10769=>506, 10770=>506, 10771=>506, 10772=>506, 10773=>506, 10774=>506, 10775=>506, 10776=>506, 10777=>506, 10778=>506, 10779=>506, 10780=>506, 10877=>754, 10878=>754, 10879=>754, + 10880=>754, 10881=>754, 10882=>754, 10883=>754, 10884=>754, 10885=>754, 10886=>754, 10887=>754, 10888=>754, 10889=>754, 10890=>754, 10891=>754, 10892=>754, 10893=>754, 10894=>754, 10895=>754, + 10896=>754, 10897=>754, 10898=>754, 10899=>754, 10900=>754, 10901=>754, 10902=>754, 10903=>754, 10904=>754, 10905=>754, 10906=>754, 10907=>754, 10908=>754, 10909=>754, 10910=>754, 10911=>754, + 10912=>754, 10926=>754, 10927=>754, 10928=>754, 10929=>754, 10930=>754, 10931=>754, 10932=>754, 10933=>754, 10934=>754, 10935=>754, 10936=>754, 10937=>754, 10938=>754, 11001=>754, 11002=>754, + 11008=>754, 11009=>754, 11010=>754, 11011=>754, 11012=>754, 11013=>754, 11014=>754, 11015=>754, 11016=>754, 11017=>754, 11018=>754, 11019=>754, 11020=>754, 11021=>754, 11022=>754, 11023=>754, + 11024=>754, 11025=>754, 11026=>850, 11027=>850, 11028=>850, 11029=>850, 11030=>692, 11031=>692, 11032=>692, 11033=>692, 11034=>850, 11040=>782, 11041=>786, 11042=>786, 11043=>786, 11360=>573, + 11361=>324, 11362=>573, 11363=>659, 11364=>693, 11365=>607, 11366=>430, 11367=>860, 11368=>641, 11369=>697, 11370=>598, 11371=>652, 11372=>523, 11380=>586, 11381=>584, 11382=>464, 11383=>704, + 61960=>774, 62047=>647, 63173=>618, 64256=>729, 64257=>667, 64258=>667, 64259=>1003, 64260=>1004, 64261=>727, 64262=>917, 64275=>1249, 64276=>1245, 64277=>1240, 64278=>1245, 64279=>1542, 64285=>334, + 64287=>623, 64288=>647, 64297=>754, 64298=>867, 64299=>867, 64300=>867, 64301=>867, 64302=>676, 64303=>676, 64304=>676, 64305=>658, 64306=>483, 64307=>615, 64308=>700, 64309=>420, 64310=>468, + 64312=>692, 64313=>420, 64314=>700, 64315=>675, 64316=>646, 64318=>771, 64320=>479, 64321=>770, 64323=>721, 64324=>699, 64326=>676, 64327=>723, 64328=>700, 64329=>867, 64330=>740, 64331=>334, + 64332=>658, 64333=>678, 64334=>699, 64338=>904, 64339=>953, 64340=>338, 64341=>367, 64342=>904, 64343=>953, 64344=>338, 64345=>367, 64346=>904, 64347=>953, 64348=>338, 64349=>367, 64350=>904, + 64351=>953, 64352=>338, 64353=>367, 64354=>904, 64355=>953, 64356=>338, 64357=>367, 64358=>904, 64359=>953, 64360=>338, 64361=>367, 64362=>1045, 64363=>1072, 64364=>589, 64365=>647, 64366=>1045, + 64367=>1072, 64368=>589, 64369=>647, 64370=>648, 64371=>648, 64372=>648, 64373=>648, 64374=>648, 64375=>648, 64376=>648, 64377=>648, 64378=>648, 64379=>648, 64380=>648, 64381=>648, 64382=>648, + 64383=>648, 64384=>648, 64385=>648, 64394=>518, 64395=>560, 64396=>518, 64397=>560, 64398=>921, 64399=>921, 64400=>523, 64401=>523, 64402=>921, 64403=>921, 64404=>523, 64405=>523, 64414=>768, + 64415=>810, 64473=>559, 64474=>564, 64488=>338, 64489=>367, 64508=>825, 64509=>910, 64510=>338, 64511=>367, 65024=>0, 65025=>0, 65026=>0, 65027=>0, 65028=>0, 65029=>0, 65030=>0, + 65031=>0, 65032=>0, 65033=>0, 65034=>0, 65035=>0, 65036=>0, 65037=>0, 65038=>0, 65039=>0, 65136=>308, 65137=>308, 65138=>308, 65139=>311, 65140=>308, 65142=>308, 65143=>308, + 65144=>308, 65145=>308, 65146=>308, 65147=>308, 65148=>308, 65149=>308, 65150=>308, 65151=>308, 65152=>460, 65153=>308, 65154=>338, 65155=>308, 65156=>338, 65157=>559, 65158=>564, 65159=>308, + 65160=>338, 65161=>825, 65162=>825, 65163=>338, 65164=>367, 65165=>308, 65166=>338, 65167=>904, 65168=>953, 65169=>338, 65170=>367, 65171=>531, 65172=>545, 65173=>904, 65174=>953, 65175=>338, + 65176=>367, 65177=>904, 65178=>953, 65179=>338, 65180=>367, 65181=>648, 65182=>648, 65183=>648, 65184=>648, 65185=>648, 65186=>648, 65187=>648, 65188=>648, 65189=>648, 65190=>648, 65191=>648, + 65192=>648, 65193=>461, 65194=>520, 65195=>461, 65196=>520, 65197=>518, 65198=>560, 65199=>518, 65200=>560, 65201=>1242, 65202=>1272, 65203=>885, 65204=>916, 65205=>1242, 65206=>1272, 65207=>885, + 65208=>916, 65209=>1210, 65210=>1228, 65211=>870, 65212=>887, 65213=>1210, 65214=>1228, 65215=>870, 65216=>887, 65217=>935, 65218=>963, 65219=>848, 65220=>876, 65221=>935, 65222=>963, 65223=>848, + 65224=>876, 65225=>615, 65226=>615, 65227=>615, 65228=>508, 65229=>615, 65230=>615, 65231=>615, 65232=>508, 65233=>1045, 65234=>1072, 65235=>589, 65236=>647, 65237=>804, 65238=>811, 65239=>589, + 65240=>647, 65241=>825, 65242=>838, 65243=>523, 65244=>523, 65245=>781, 65246=>803, 65247=>338, 65248=>367, 65249=>659, 65250=>706, 65251=>557, 65252=>603, 65253=>768, 65254=>810, 65255=>338, + 65256=>367, 65257=>531, 65258=>545, 65259=>624, 65260=>594, 65261=>559, 65262=>564, 65263=>825, 65264=>910, 65265=>825, 65266=>910, 65267=>338, 65268=>367, 65269=>670, 65270=>683, 65271=>670, + 65272=>683, 65273=>670, 65274=>683, 65275=>670, 65276=>683, 65279=>0, 65533=>1002); +$enc=''; +$diff=''; +$file='DejaVuSansCondensed-Bold.z'; +$ctg='DejaVuSansCondensed-Bold.ctg.z'; +$originalsize=456120; +?> diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedbi.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedbi.php new file mode 100644 index 00000000..dc1f2d40 --- /dev/null +++ b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedbi.php @@ -0,0 +1,267 @@ +928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>96,'FontBBox'=>'[-960 -388 1804 1121]','ItalicAngle'=>-11,'StemV'=>120,'MissingWidth'=>540); +$up=-42; +$ut=44; +$cw=array( + 0=>540, 32=>313, 33=>410, 34=>469, 35=>626, 36=>626, 37=>901, 38=>785, 39=>275, 40=>411, 41=>411, 42=>470, 43=>754, 44=>342, 45=>374, 46=>342, + 47=>329, 48=>626, 49=>626, 50=>626, 51=>626, 52=>626, 53=>626, 54=>626, 55=>626, 56=>626, 57=>626, 58=>360, 59=>360, 60=>754, 61=>754, 62=>754, + 63=>522, 64=>900, 65=>696, 66=>686, 67=>660, 68=>747, 69=>615, 70=>615, 71=>738, 72=>753, 73=>334, 74=>334, 75=>697, 76=>573, 77=>896, 78=>753, + 79=>765, 80=>659, 81=>765, 82=>693, 83=>648, 84=>614, 85=>730, 86=>696, 87=>993, 88=>694, 89=>651, 90=>652, 91=>411, 92=>329, 93=>411, 94=>754, + 95=>450, 96=>450, 97=>607, 98=>644, 99=>533, 100=>644, 101=>610, 102=>391, 103=>644, 104=>641, 105=>308, 106=>308, 107=>598, 108=>308, 109=>938, 110=>641, + 111=>618, 112=>644, 113=>644, 114=>444, 115=>536, 116=>430, 117=>641, 118=>586, 119=>831, 120=>580, 121=>586, 122=>523, 123=>641, 124=>329, 125=>641, 126=>754, + 8364=>626, 1027=>573, 8218=>342, 402=>391, 8222=>580, 8230=>900, 8224=>450, 8225=>450, 710=>450, 8240=>1309, 352=>648, 8249=>371, 338=>1050, 1036=>735, 381=>652, 1039=>753, + 8216=>342, 8217=>342, 8220=>580, 8221=>580, 8226=>575, 8211=>450, 8212=>900, 732=>450, 8482=>900, 353=>536, 8250=>371, 339=>984, 1116=>611, 382=>523, 376=>651, 160=>313, + 161=>410, 162=>626, 163=>626, 164=>572, 165=>626, 166=>329, 167=>450, 168=>450, 169=>900, 170=>507, 171=>584, 172=>754, 173=>374, 174=>900, 175=>450, 176=>450, + 177=>754, 178=>394, 179=>394, 180=>450, 181=>662, 182=>572, 183=>342, 184=>450, 185=>394, 186=>507, 187=>584, 188=>932, 189=>932, 190=>932, 191=>522, 192=>696, + 193=>696, 194=>696, 195=>696, 196=>696, 197=>696, 198=>976, 199=>660, 200=>615, 201=>615, 202=>615, 203=>615, 204=>334, 205=>334, 206=>334, 207=>334, 208=>760, + 209=>753, 210=>765, 211=>765, 212=>765, 213=>765, 214=>765, 215=>754, 216=>765, 217=>730, 218=>730, 219=>730, 220=>730, 221=>651, 222=>668, 223=>647, 224=>607, + 225=>607, 226=>607, 227=>607, 228=>607, 229=>607, 230=>943, 231=>533, 232=>610, 233=>610, 234=>610, 235=>610, 236=>308, 237=>308, 238=>308, 239=>308, 240=>618, + 241=>641, 242=>618, 243=>618, 244=>618, 245=>618, 246=>618, 247=>754, 248=>618, 249=>641, 250=>641, 251=>641, 252=>641, 253=>586, 254=>644, 255=>586, 256=>696, + 257=>607, 258=>696, 259=>607, 260=>696, 261=>607, 262=>660, 263=>533, 264=>660, 265=>533, 266=>660, 267=>533, 268=>660, 269=>533, 270=>747, 271=>644, 272=>760, + 273=>644, 274=>615, 275=>610, 276=>615, 277=>610, 278=>615, 279=>610, 280=>615, 281=>610, 282=>615, 283=>610, 284=>738, 285=>644, 286=>738, 287=>644, 288=>738, + 289=>644, 290=>738, 291=>644, 292=>753, 293=>641, 294=>876, 295=>711, 296=>334, 297=>308, 298=>334, 299=>308, 300=>334, 301=>308, 302=>334, 303=>308, 304=>334, + 305=>308, 306=>669, 307=>617, 308=>334, 309=>308, 310=>697, 311=>598, 312=>598, 313=>573, 314=>308, 315=>573, 316=>308, 317=>573, 318=>413, 319=>573, 320=>438, + 321=>594, 322=>337, 323=>753, 324=>641, 325=>753, 326=>641, 327=>753, 328=>641, 329=>884, 330=>753, 331=>641, 332=>765, 333=>618, 334=>765, 335=>618, 336=>765, + 337=>618, 340=>693, 341=>444, 342=>693, 343=>444, 344=>693, 345=>444, 346=>648, 347=>536, 348=>648, 349=>536, 350=>648, 351=>536, 354=>614, 355=>430, 356=>614, + 357=>430, 358=>614, 359=>430, 360=>730, 361=>641, 362=>730, 363=>641, 364=>730, 365=>641, 366=>730, 367=>641, 368=>730, 369=>641, 370=>730, 371=>641, 372=>993, + 373=>831, 374=>651, 375=>586, 377=>652, 378=>523, 379=>652, 380=>523, 383=>391, 384=>644, 385=>729, 386=>686, 387=>644, 388=>686, 389=>644, 390=>660, 391=>660, + 392=>533, 393=>760, 394=>791, 395=>686, 396=>644, 397=>618, 398=>615, 399=>765, 400=>626, 401=>615, 403=>738, 404=>713, 405=>940, 406=>392, 407=>350, 408=>697, + 409=>598, 410=>324, 411=>532, 412=>938, 413=>753, 414=>641, 415=>765, 416=>765, 417=>618, 418=>1002, 419=>866, 420=>703, 421=>644, 422=>693, 423=>648, 424=>536, + 425=>615, 426=>497, 427=>430, 428=>636, 429=>430, 430=>614, 431=>730, 432=>641, 433=>692, 434=>732, 435=>717, 436=>700, 437=>652, 438=>523, 439=>695, 440=>695, + 441=>576, 442=>523, 443=>626, 444=>695, 445=>576, 446=>515, 447=>644, 448=>334, 449=>593, 450=>489, 451=>334, 452=>1393, 453=>1305, 454=>1176, 455=>879, 456=>881, + 457=>603, 458=>1074, 459=>1091, 460=>957, 461=>696, 462=>607, 463=>334, 464=>308, 465=>765, 466=>618, 467=>730, 468=>641, 469=>730, 470=>641, 471=>730, 472=>641, + 473=>730, 474=>641, 475=>730, 476=>641, 477=>610, 478=>696, 479=>607, 480=>696, 481=>607, 482=>976, 483=>943, 484=>738, 485=>644, 486=>738, 487=>644, 488=>697, + 489=>598, 490=>765, 491=>618, 492=>765, 493=>618, 494=>695, 495=>523, 496=>308, 497=>1393, 498=>1305, 499=>1176, 500=>738, 501=>644, 502=>1160, 503=>708, 504=>753, + 505=>641, 506=>696, 507=>607, 508=>976, 509=>943, 510=>765, 511=>618, 512=>696, 513=>607, 514=>696, 515=>607, 516=>615, 517=>610, 518=>615, 519=>610, 520=>334, + 521=>308, 522=>334, 523=>308, 524=>765, 525=>618, 526=>765, 527=>618, 528=>693, 529=>444, 530=>693, 531=>444, 532=>730, 533=>641, 534=>730, 535=>641, 536=>648, + 537=>536, 538=>614, 539=>430, 540=>621, 541=>546, 542=>753, 543=>641, 544=>753, 545=>778, 546=>728, 547=>593, 548=>652, 549=>523, 550=>696, 551=>607, 552=>615, + 553=>610, 554=>765, 555=>618, 556=>765, 557=>618, 558=>765, 559=>618, 560=>765, 561=>618, 562=>651, 563=>586, 564=>442, 565=>780, 566=>460, 567=>308, 568=>979, + 569=>979, 570=>696, 571=>660, 572=>533, 573=>573, 574=>614, 575=>536, 576=>523, 577=>703, 578=>553, 579=>686, 580=>730, 581=>696, 582=>615, 583=>610, 584=>334, + 585=>308, 586=>774, 587=>712, 588=>693, 589=>444, 590=>651, 591=>586, 592=>607, 593=>644, 594=>644, 595=>644, 596=>533, 597=>533, 598=>712, 599=>712, 600=>610, + 601=>610, 602=>788, 603=>501, 604=>490, 605=>696, 606=>658, 607=>308, 608=>712, 609=>644, 610=>564, 611=>661, 612=>571, 613=>641, 614=>641, 615=>641, 616=>491, + 617=>396, 618=>491, 619=>502, 620=>624, 621=>308, 622=>757, 623=>938, 624=>938, 625=>938, 626=>641, 627=>713, 628=>578, 629=>618, 630=>817, 631=>613, 632=>716, + 633=>484, 634=>484, 635=>584, 636=>444, 637=>444, 638=>536, 639=>536, 640=>578, 641=>578, 642=>536, 643=>374, 644=>391, 645=>544, 646=>497, 647=>430, 648=>430, + 649=>828, 650=>692, 651=>603, 652=>586, 653=>831, 654=>586, 655=>651, 656=>624, 657=>615, 658=>576, 659=>576, 660=>515, 661=>515, 662=>515, 663=>515, 664=>765, + 665=>569, 666=>658, 667=>616, 668=>622, 669=>308, 670=>659, 671=>485, 672=>712, 673=>515, 674=>515, 675=>1040, 676=>1093, 677=>1039, 678=>876, 679=>691, 680=>836, + 681=>923, 682=>712, 683=>702, 684=>532, 685=>374, 686=>609, 687=>710, 688=>410, 689=>410, 690=>197, 691=>284, 692=>284, 693=>284, 694=>369, 695=>532, 696=>375, + 697=>271, 698=>469, 699=>342, 700=>342, 701=>342, 702=>330, 703=>330, 704=>293, 705=>293, 706=>450, 707=>450, 708=>450, 709=>450, 711=>450, 712=>275, 713=>450, + 714=>450, 715=>450, 716=>275, 717=>450, 718=>450, 719=>450, 720=>303, 721=>303, 722=>330, 723=>330, 724=>450, 725=>450, 726=>450, 727=>450, 728=>450, 729=>450, + 730=>450, 731=>450, 733=>450, 734=>315, 735=>450, 736=>370, 737=>197, 738=>343, 739=>371, 740=>293, 741=>450, 742=>450, 743=>450, 744=>450, 745=>450, 748=>450, + 749=>450, 750=>450, 755=>450, 759=>450, 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 773=>0, 774=>0, 775=>0, 776=>0, 777=>0, 778=>0, 779=>0, + 780=>0, 781=>0, 782=>0, 783=>0, 784=>0, 785=>0, 786=>0, 787=>0, 788=>0, 789=>0, 790=>0, 791=>0, 792=>0, 793=>0, 794=>0, 795=>0, + 796=>0, 797=>0, 798=>0, 799=>0, 800=>0, 801=>0, 802=>0, 803=>0, 804=>0, 805=>0, 806=>0, 807=>0, 808=>0, 809=>0, 810=>0, 811=>0, + 812=>0, 813=>0, 814=>0, 815=>0, 816=>0, 817=>0, 818=>0, 819=>0, 820=>0, 821=>0, 822=>0, 823=>0, 824=>0, 825=>0, 826=>0, 827=>0, + 828=>0, 829=>0, 830=>0, 831=>0, 832=>0, 833=>0, 834=>0, 835=>0, 836=>0, 837=>0, 838=>0, 839=>0, 840=>0, 841=>0, 842=>0, 843=>0, + 844=>0, 845=>0, 846=>0, 847=>0, 849=>0, 850=>0, 855=>0, 856=>0, 860=>0, 861=>0, 862=>0, 863=>0, 864=>0, 865=>0, 866=>0, 884=>271, + 885=>271, 890=>450, 891=>533, 892=>495, 893=>494, 894=>303, 900=>397, 901=>450, 902=>717, 903=>342, 904=>761, 905=>908, 906=>507, 908=>801, 910=>882, 911=>804, + 912=>351, 913=>696, 914=>686, 915=>573, 916=>696, 917=>615, 918=>652, 919=>753, 920=>765, 921=>334, 922=>697, 923=>696, 924=>896, 925=>753, 926=>568, 927=>765, + 928=>753, 929=>659, 931=>615, 932=>614, 933=>651, 934=>765, 935=>694, 936=>765, 937=>765, 938=>334, 939=>651, 940=>618, 941=>501, 942=>641, 943=>351, 944=>607, + 945=>618, 946=>644, 947=>613, 948=>618, 949=>501, 950=>532, 951=>641, 952=>618, 953=>351, 954=>639, 955=>569, 956=>662, 957=>613, 958=>532, 959=>618, 960=>712, + 961=>644, 962=>533, 963=>701, 964=>574, 965=>607, 966=>704, 967=>580, 968=>714, 969=>782, 970=>351, 971=>607, 972=>618, 973=>607, 974=>782, 976=>585, 977=>594, + 978=>671, 979=>883, 980=>671, 981=>716, 982=>782, 983=>669, 984=>765, 985=>618, 986=>660, 987=>533, 988=>615, 989=>444, 990=>632, 991=>593, 992=>827, 993=>564, + 994=>983, 995=>753, 996=>749, 997=>644, 998=>835, 999=>669, 1000=>660, 1001=>585, 1002=>709, 1003=>604, 1004=>677, 1005=>644, 1006=>614, 1007=>531, 1008=>669, 1009=>644, + 1010=>533, 1011=>308, 1012=>765, 1013=>580, 1014=>580, 1015=>668, 1016=>644, 1017=>660, 1018=>896, 1019=>659, 1020=>644, 1021=>660, 1022=>660, 1023=>628, 1024=>615, 1025=>615, + 1026=>791, 1028=>660, 1029=>648, 1030=>334, 1031=>334, 1032=>334, 1033=>1039, 1034=>1017, 1035=>791, 1037=>753, 1038=>694, 1040=>696, 1041=>686, 1042=>686, 1043=>573, 1044=>801, + 1045=>615, 1046=>1102, 1047=>639, 1048=>753, 1049=>753, 1050=>735, 1051=>747, 1052=>896, 1053=>753, 1054=>765, 1055=>753, 1056=>659, 1057=>660, 1058=>614, 1059=>694, 1060=>892, + 1061=>694, 1062=>835, 1063=>727, 1064=>1112, 1065=>1193, 1066=>845, 1067=>932, 1068=>686, 1069=>660, 1070=>1056, 1071=>693, 1072=>607, 1073=>628, 1074=>569, 1075=>470, 1076=>727, + 1077=>610, 1078=>896, 1079=>523, 1080=>630, 1081=>630, 1082=>611, 1083=>659, 1084=>735, 1085=>622, 1086=>618, 1087=>622, 1088=>644, 1089=>533, 1090=>521, 1091=>586, 1092=>893, + 1093=>580, 1094=>667, 1095=>618, 1096=>956, 1097=>995, 1098=>676, 1099=>813, 1100=>569, 1101=>533, 1102=>875, 1103=>578, 1104=>610, 1105=>610, 1106=>642, 1107=>470, 1108=>533, + 1109=>536, 1110=>308, 1111=>308, 1112=>308, 1113=>892, 1114=>860, 1115=>661, 1117=>630, 1118=>586, 1119=>622, 1120=>983, 1121=>782, 1122=>756, 1123=>662, 1124=>911, 1125=>755, + 1126=>893, 1127=>749, 1128=>1222, 1129=>1009, 1130=>765, 1131=>618, 1132=>1112, 1133=>906, 1134=>626, 1135=>501, 1136=>967, 1137=>955, 1138=>765, 1139=>601, 1140=>765, 1141=>625, + 1142=>765, 1143=>625, 1144=>1033, 1145=>939, 1146=>967, 1147=>776, 1148=>1265, 1149=>1055, 1150=>983, 1151=>782, 1152=>660, 1153=>533, 1154=>587, 1155=>0, 1156=>0, 1157=>0, + 1158=>0, 1160=>376, 1161=>376, 1162=>844, 1163=>725, 1164=>686, 1165=>550, 1166=>662, 1167=>646, 1168=>573, 1169=>470, 1170=>599, 1171=>488, 1172=>709, 1173=>470, 1174=>1102, + 1175=>896, 1176=>639, 1177=>523, 1178=>697, 1179=>611, 1180=>735, 1181=>611, 1182=>735, 1183=>611, 1184=>914, 1185=>743, 1186=>753, 1187=>622, 1188=>992, 1189=>783, 1190=>1129, + 1191=>880, 1192=>787, 1193=>639, 1194=>660, 1195=>533, 1196=>614, 1197=>521, 1198=>651, 1199=>586, 1200=>651, 1201=>586, 1202=>694, 1203=>580, 1204=>993, 1205=>901, 1206=>727, + 1207=>618, 1208=>727, 1209=>618, 1210=>727, 1211=>641, 1212=>923, 1213=>729, 1214=>923, 1215=>729, 1216=>334, 1217=>1102, 1218=>896, 1219=>700, 1220=>566, 1221=>839, 1222=>724, + 1223=>753, 1224=>622, 1225=>844, 1226=>725, 1227=>727, 1228=>618, 1229=>986, 1230=>838, 1231=>308, 1232=>696, 1233=>607, 1234=>696, 1235=>607, 1236=>976, 1237=>943, 1238=>615, + 1239=>610, 1240=>765, 1241=>610, 1242=>765, 1243=>610, 1244=>1102, 1245=>896, 1246=>639, 1247=>523, 1248=>695, 1249=>576, 1250=>753, 1251=>630, 1252=>753, 1253=>630, 1254=>765, + 1255=>618, 1256=>765, 1257=>618, 1258=>765, 1259=>618, 1260=>660, 1261=>533, 1262=>694, 1263=>586, 1264=>694, 1265=>586, 1266=>694, 1267=>586, 1268=>727, 1269=>618, 1270=>573, + 1271=>470, 1272=>932, 1273=>813, 1274=>599, 1275=>488, 1276=>694, 1277=>580, 1278=>694, 1279=>580, 1280=>686, 1281=>547, 1282=>1043, 1283=>804, 1284=>1007, 1285=>828, 1286=>745, + 1287=>624, 1288=>1117, 1289=>915, 1290=>1123, 1291=>912, 1292=>755, 1293=>574, 1294=>844, 1295=>722, 1296=>626, 1297=>501, 1298=>747, 1299=>659, 1329=>886, 1330=>730, 1331=>886, + 1332=>886, 1333=>730, 1334=>699, 1335=>730, 1336=>730, 1337=>877, 1338=>886, 1339=>730, 1340=>639, 1341=>970, 1342=>1022, 1343=>730, 1344=>639, 1345=>681, 1346=>886, 1347=>789, + 1348=>886, 1349=>714, 1350=>886, 1351=>730, 1352=>730, 1353=>730, 1354=>862, 1355=>699, 1356=>886, 1357=>730, 1358=>886, 1359=>648, 1360=>730, 1361=>714, 1362=>805, 1363=>765, + 1364=>842, 1365=>765, 1366=>648, 1369=>330, 1370=>342, 1371=>495, 1372=>495, 1373=>342, 1374=>491, 1375=>468, 1377=>938, 1378=>641, 1379=>779, 1380=>781, 1381=>641, 1382=>735, + 1383=>588, 1384=>641, 1385=>729, 1386=>735, 1387=>641, 1388=>448, 1389=>916, 1390=>644, 1391=>641, 1392=>641, 1393=>644, 1394=>737, 1395=>641, 1396=>676, 1397=>308, 1398=>794, + 1399=>502, 1400=>641, 1401=>502, 1402=>938, 1403=>502, 1404=>777, 1405=>641, 1406=>732, 1407=>938, 1408=>641, 1409=>644, 1410=>514, 1411=>938, 1412=>700, 1413=>618, 1414=>648, + 1415=>776, 1417=>360, 1418=>438, 1456=>0, 1457=>0, 1458=>0, 1459=>0, 1460=>0, 1461=>0, 1462=>0, 1463=>0, 1464=>0, 1465=>0, 1467=>0, 1468=>0, 1469=>0, + 1471=>0, 1472=>334, 1473=>0, 1474=>0, 1475=>334, 1478=>479, 1479=>0, 1488=>676, 1489=>658, 1490=>483, 1491=>615, 1492=>700, 1493=>334, 1494=>468, 1495=>700, 1496=>692, + 1497=>334, 1498=>700, 1499=>675, 1500=>646, 1501=>700, 1502=>771, 1503=>334, 1504=>479, 1505=>770, 1506=>647, 1507=>721, 1508=>699, 1509=>565, 1510=>676, 1511=>723, 1512=>700, + 1513=>867, 1514=>740, 1520=>623, 1521=>623, 1522=>623, 3647=>668, 3713=>734, 3714=>673, 3716=>674, 3719=>512, 3720=>668, 3722=>669, 3725=>685, 3732=>635, 3733=>633, 3734=>672, + 3735=>737, 3737=>657, 3738=>654, 3739=>654, 3740=>830, 3741=>744, 3742=>779, 3743=>779, 3745=>752, 3746=>685, 3747=>692, 3749=>691, 3751=>642, 3754=>744, 3755=>928, 3757=>651, + 3758=>705, 3759=>840, 3760=>620, 3761=>0, 3762=>549, 3763=>549, 3764=>0, 3765=>0, 3766=>0, 3767=>0, 3768=>0, 3769=>0, 3771=>0, 3772=>0, 3773=>603, 3776=>464, + 3777=>774, 3778=>464, 3779=>584, 3780=>569, 3782=>683, 3784=>0, 3785=>0, 3786=>0, 3787=>0, 3788=>0, 3789=>0, 3804=>1227, 3805=>1227, 5121=>696, 5122=>696, 5123=>696, + 5124=>696, 5125=>814, 5126=>814, 5127=>814, 5129=>814, 5130=>814, 5131=>814, 5132=>916, 5133=>908, 5134=>916, 5135=>908, 5136=>916, 5137=>908, 5138=>1034, 5139=>1025, 5140=>1034, + 5141=>1025, 5142=>814, 5143=>1034, 5144=>1028, 5145=>1034, 5146=>1028, 5147=>814, 5149=>278, 5150=>476, 5151=>382, 5152=>382, 5153=>355, 5154=>355, 5155=>355, 5156=>355, 5157=>507, + 5158=>423, 5159=>278, 5160=>355, 5161=>355, 5162=>355, 5163=>1092, 5164=>888, 5165=>1094, 5166=>1167, 5167=>696, 5168=>696, 5169=>696, 5170=>696, 5171=>797, 5172=>797, 5173=>797, + 5175=>797, 5176=>797, 5177=>797, 5178=>916, 5179=>908, 5180=>916, 5181=>908, 5182=>916, 5183=>908, 5184=>1034, 5185=>1025, 5186=>1034, 5187=>1025, 5188=>1034, 5189=>1028, 5190=>1034, + 5191=>1028, 5192=>797, 5193=>518, 5194=>206, 5196=>730, 5197=>730, 5198=>730, 5199=>730, 5200=>734, 5201=>734, 5202=>734, 5204=>734, 5205=>734, 5206=>734, 5207=>950, 5208=>943, + 5209=>950, 5210=>943, 5211=>950, 5212=>943, 5213=>954, 5214=>949, 5215=>954, 5216=>949, 5217=>954, 5218=>946, 5219=>954, 5220=>946, 5221=>954, 5222=>493, 5223=>904, 5224=>904, + 5225=>921, 5226=>915, 5227=>668, 5228=>668, 5229=>668, 5230=>668, 5231=>668, 5232=>668, 5233=>668, 5234=>668, 5235=>668, 5236=>926, 5237=>877, 5238=>882, 5239=>877, 5240=>882, + 5241=>877, 5242=>926, 5243=>877, 5244=>926, 5245=>877, 5246=>882, 5247=>877, 5248=>882, 5249=>877, 5250=>882, 5251=>451, 5252=>451, 5253=>844, 5254=>844, 5255=>844, 5256=>844, + 5257=>668, 5258=>668, 5259=>668, 5260=>668, 5261=>668, 5262=>668, 5263=>668, 5264=>668, 5265=>668, 5266=>926, 5267=>877, 5268=>926, 5269=>877, 5270=>926, 5271=>877, 5272=>926, + 5273=>877, 5274=>926, 5275=>877, 5276=>926, 5277=>877, 5278=>926, 5279=>877, 5280=>926, 5281=>451, 5282=>451, 5283=>563, 5284=>563, 5285=>563, 5286=>563, 5287=>563, 5288=>563, + 5289=>563, 5290=>563, 5291=>563, 5292=>793, 5293=>769, 5294=>777, 5295=>786, 5296=>777, 5297=>786, 5298=>793, 5299=>786, 5300=>793, 5301=>786, 5302=>777, 5303=>786, 5304=>777, + 5305=>786, 5306=>777, 5307=>392, 5308=>493, 5309=>392, 5312=>889, 5313=>889, 5314=>889, 5315=>889, 5316=>838, 5317=>838, 5318=>838, 5319=>838, 5320=>838, 5321=>1114, 5322=>1122, + 5323=>1080, 5324=>1105, 5325=>1080, 5326=>1105, 5327=>838, 5328=>593, 5329=>447, 5330=>593, 5331=>889, 5332=>889, 5333=>889, 5334=>889, 5335=>838, 5336=>838, 5337=>838, 5338=>838, + 5339=>838, 5340=>1107, 5341=>1122, 5342=>1155, 5343=>1105, 5344=>1155, 5345=>1105, 5346=>1105, 5347=>1093, 5348=>1105, 5349=>1093, 5350=>1155, 5351=>1105, 5352=>1155, 5353=>1105, 5354=>593, + 5356=>797, 5357=>657, 5358=>657, 5359=>657, 5360=>657, 5361=>657, 5362=>657, 5363=>657, 5364=>657, 5365=>657, 5366=>897, 5367=>862, 5368=>870, 5369=>890, 5370=>870, 5371=>890, + 5372=>897, 5373=>862, 5374=>897, 5375=>862, 5376=>870, 5377=>890, 5378=>870, 5379=>890, 5380=>870, 5381=>443, 5382=>414, 5383=>443, 5392=>831, 5393=>831, 5394=>831, 5395=>1022, + 5396=>1022, 5397=>1022, 5398=>1022, 5399=>1088, 5400=>1081, 5401=>1088, 5402=>1081, 5403=>1088, 5404=>1081, 5405=>1288, 5406=>1278, 5407=>1288, 5408=>1278, 5409=>1288, 5410=>1278, 5411=>1288, + 5412=>1278, 5413=>671, 5414=>698, 5415=>698, 5416=>698, 5417=>698, 5418=>698, 5419=>698, 5420=>698, 5421=>698, 5422=>698, 5423=>902, 5424=>903, 5425=>911, 5426=>896, 5427=>911, + 5428=>896, 5429=>902, 5430=>903, 5431=>902, 5432=>903, 5433=>911, 5434=>896, 5435=>911, 5436=>896, 5437=>911, 5438=>445, 5440=>355, 5441=>458, 5442=>929, 5443=>929, 5444=>878, + 5445=>878, 5446=>878, 5447=>878, 5448=>659, 5449=>659, 5450=>659, 5451=>659, 5452=>659, 5453=>659, 5454=>902, 5455=>863, 5456=>445, 5458=>797, 5459=>696, 5460=>696, 5461=>696, + 5462=>696, 5463=>835, 5464=>835, 5465=>835, 5466=>835, 5467=>1055, 5468=>1028, 5469=>542, 5470=>730, 5471=>730, 5472=>730, 5473=>730, 5474=>730, 5475=>730, 5476=>734, 5477=>734, + 5478=>734, 5479=>734, 5480=>954, 5481=>946, 5482=>493, 5492=>879, 5493=>879, 5494=>879, 5495=>879, 5496=>879, 5497=>879, 5498=>879, 5499=>556, 5500=>753, 5501=>458, 5502=>1114, + 5503=>1114, 5504=>1114, 5505=>1114, 5506=>1114, 5507=>1114, 5508=>1114, 5509=>890, 5514=>879, 5515=>879, 5516=>879, 5517=>879, 5518=>1432, 5519=>1432, 5520=>1432, 5521=>1165, 5522=>1165, + 5523=>1432, 5524=>1432, 5525=>763, 5526=>1146, 5536=>889, 5537=>889, 5538=>838, 5539=>838, 5540=>838, 5541=>838, 5542=>593, 5543=>698, 5544=>698, 5545=>698, 5546=>698, 5547=>698, + 5548=>698, 5549=>698, 5550=>445, 5551=>668, 5598=>747, 5601=>747, 5702=>446, 5703=>446, 5742=>371, 5743=>1114, 5744=>1432, 5745=>1814, 5746=>1814, 5747=>1548, 5748=>1510, 5749=>1814, + 5750=>1814, 7424=>586, 7425=>750, 7426=>943, 7427=>547, 7428=>533, 7429=>608, 7430=>608, 7431=>502, 7432=>501, 7433=>308, 7434=>444, 7435=>598, 7436=>485, 7437=>735, 7438=>630, + 7439=>618, 7440=>533, 7441=>594, 7442=>594, 7443=>594, 7444=>984, 7446=>618, 7447=>618, 7448=>500, 7449=>578, 7450=>578, 7451=>521, 7452=>571, 7453=>663, 7454=>853, 7455=>625, + 7456=>586, 7457=>831, 7458=>523, 7459=>581, 7462=>485, 7463=>586, 7464=>622, 7465=>500, 7466=>703, 7467=>659, 7468=>438, 7469=>615, 7470=>432, 7472=>470, 7473=>387, 7474=>387, + 7475=>465, 7476=>474, 7477=>211, 7478=>211, 7479=>439, 7480=>361, 7481=>563, 7482=>474, 7483=>474, 7484=>481, 7485=>458, 7486=>415, 7487=>436, 7488=>387, 7489=>460, 7490=>625, + 7491=>412, 7492=>412, 7493=>431, 7494=>641, 7495=>431, 7496=>431, 7497=>431, 7498=>431, 7499=>347, 7500=>347, 7501=>431, 7502=>197, 7503=>438, 7504=>597, 7505=>410, 7506=>439, + 7507=>372, 7508=>439, 7509=>439, 7510=>431, 7511=>349, 7512=>410, 7513=>416, 7514=>597, 7515=>451, 7517=>405, 7518=>386, 7519=>389, 7520=>443, 7521=>365, 7522=>197, 7523=>284, + 7524=>410, 7525=>451, 7526=>405, 7527=>386, 7528=>389, 7529=>443, 7530=>365, 7543=>644, 7544=>474, 7547=>491, 7557=>462, 7579=>431, 7580=>372, 7581=>372, 7582=>439, 7583=>347, + 7584=>339, 7585=>313, 7586=>431, 7587=>410, 7588=>312, 7589=>253, 7590=>312, 7591=>312, 7592=>388, 7593=>293, 7594=>296, 7595=>333, 7596=>598, 7597=>597, 7598=>505, 7599=>505, + 7600=>403, 7601=>439, 7602=>488, 7603=>379, 7604=>356, 7605=>349, 7606=>524, 7607=>444, 7608=>359, 7609=>405, 7610=>451, 7611=>375, 7612=>471, 7613=>422, 7614=>409, 7615=>382, + 7620=>0, 7621=>0, 7622=>0, 7623=>0, 7624=>0, 7625=>0, 7680=>696, 7681=>607, 7682=>686, 7683=>644, 7684=>686, 7685=>644, 7686=>686, 7687=>644, 7688=>660, 7689=>533, + 7690=>747, 7691=>644, 7692=>747, 7693=>644, 7694=>747, 7695=>644, 7696=>747, 7697=>644, 7698=>747, 7699=>644, 7700=>615, 7701=>610, 7702=>615, 7703=>610, 7704=>615, 7705=>610, + 7706=>615, 7707=>610, 7708=>615, 7709=>610, 7710=>615, 7711=>391, 7712=>738, 7713=>644, 7714=>753, 7715=>641, 7716=>753, 7717=>641, 7718=>753, 7719=>641, 7720=>753, 7721=>641, + 7722=>753, 7723=>641, 7724=>334, 7725=>308, 7726=>334, 7727=>308, 7728=>697, 7729=>598, 7730=>697, 7731=>598, 7732=>697, 7733=>598, 7734=>573, 7735=>308, 7736=>573, 7737=>308, + 7738=>573, 7739=>308, 7740=>573, 7741=>308, 7742=>896, 7743=>938, 7744=>896, 7745=>938, 7746=>896, 7747=>938, 7748=>753, 7749=>641, 7750=>753, 7751=>641, 7752=>753, 7753=>641, + 7754=>753, 7755=>641, 7756=>765, 7757=>618, 7758=>765, 7759=>618, 7760=>765, 7761=>618, 7762=>765, 7763=>618, 7764=>659, 7765=>644, 7766=>659, 7767=>644, 7768=>693, 7769=>444, + 7770=>693, 7771=>444, 7772=>693, 7773=>444, 7774=>693, 7775=>444, 7776=>648, 7777=>536, 7778=>648, 7779=>536, 7780=>648, 7781=>536, 7782=>648, 7783=>536, 7784=>648, 7785=>536, + 7786=>614, 7787=>430, 7788=>614, 7789=>430, 7790=>614, 7791=>430, 7792=>614, 7793=>430, 7794=>730, 7795=>641, 7796=>730, 7797=>641, 7798=>730, 7799=>641, 7800=>730, 7801=>641, + 7802=>730, 7803=>641, 7804=>696, 7805=>586, 7806=>696, 7807=>586, 7808=>993, 7809=>831, 7810=>993, 7811=>831, 7812=>993, 7813=>831, 7814=>993, 7815=>831, 7816=>993, 7817=>831, + 7818=>694, 7819=>580, 7820=>694, 7821=>580, 7822=>651, 7823=>586, 7824=>652, 7825=>523, 7826=>652, 7827=>523, 7828=>652, 7829=>523, 7830=>641, 7831=>430, 7832=>831, 7833=>586, + 7834=>607, 7835=>391, 7840=>696, 7841=>607, 7842=>696, 7843=>607, 7844=>696, 7845=>607, 7846=>696, 7847=>607, 7848=>696, 7849=>607, 7850=>696, 7851=>607, 7852=>696, 7853=>607, + 7854=>696, 7855=>607, 7856=>696, 7857=>607, 7858=>696, 7859=>607, 7860=>696, 7861=>607, 7862=>696, 7863=>607, 7864=>615, 7865=>610, 7866=>615, 7867=>610, 7868=>615, 7869=>610, + 7870=>615, 7871=>610, 7872=>615, 7873=>610, 7874=>615, 7875=>610, 7876=>615, 7877=>610, 7878=>615, 7879=>610, 7880=>334, 7881=>308, 7882=>334, 7883=>308, 7884=>765, 7885=>618, + 7886=>765, 7887=>618, 7888=>765, 7889=>618, 7890=>765, 7891=>618, 7892=>765, 7893=>618, 7894=>765, 7895=>618, 7896=>765, 7897=>618, 7898=>765, 7899=>618, 7900=>765, 7901=>618, + 7902=>765, 7903=>618, 7904=>765, 7905=>618, 7906=>765, 7907=>618, 7908=>730, 7909=>641, 7910=>730, 7911=>641, 7912=>730, 7913=>641, 7914=>730, 7915=>641, 7916=>730, 7917=>641, + 7918=>730, 7919=>641, 7920=>730, 7921=>641, 7922=>651, 7923=>586, 7924=>651, 7925=>586, 7926=>651, 7927=>586, 7928=>651, 7929=>586, 7936=>618, 7937=>618, 7938=>618, 7939=>618, + 7940=>618, 7941=>618, 7942=>618, 7943=>618, 7944=>696, 7945=>696, 7946=>937, 7947=>939, 7948=>841, 7949=>866, 7950=>751, 7951=>773, 7952=>501, 7953=>501, 7954=>501, 7955=>501, + 7956=>501, 7957=>501, 7960=>712, 7961=>715, 7962=>989, 7963=>986, 7964=>920, 7965=>947, 7968=>641, 7969=>641, 7970=>641, 7971=>641, 7972=>641, 7973=>641, 7974=>641, 7975=>641, + 7976=>851, 7977=>856, 7978=>1125, 7979=>1125, 7980=>1062, 7981=>1085, 7982=>948, 7983=>956, 7984=>351, 7985=>351, 7986=>351, 7987=>351, 7988=>351, 7989=>351, 7990=>351, 7991=>351, + 7992=>435, 7993=>440, 7994=>699, 7995=>707, 7996=>641, 7997=>664, 7998=>544, 7999=>544, 8000=>618, 8001=>618, 8002=>618, 8003=>618, 8004=>618, 8005=>618, 8008=>802, 8009=>839, + 8010=>1099, 8011=>1101, 8012=>947, 8013=>974, 8016=>607, 8017=>607, 8018=>607, 8019=>607, 8020=>607, 8021=>607, 8022=>607, 8023=>607, 8025=>837, 8027=>1065, 8029=>1079, 8031=>944, + 8032=>782, 8033=>782, 8034=>782, 8035=>782, 8036=>782, 8037=>782, 8038=>782, 8039=>782, 8040=>817, 8041=>862, 8042=>1121, 8043=>1126, 8044=>968, 8045=>994, 8046=>925, 8047=>968, + 8048=>618, 8049=>618, 8050=>501, 8051=>501, 8052=>641, 8053=>641, 8054=>351, 8055=>351, 8056=>618, 8057=>618, 8058=>607, 8059=>607, 8060=>782, 8061=>782, 8064=>618, 8065=>618, + 8066=>618, 8067=>618, 8068=>618, 8069=>618, 8070=>618, 8071=>618, 8072=>696, 8073=>696, 8074=>937, 8075=>939, 8076=>841, 8077=>866, 8078=>751, 8079=>773, 8080=>641, 8081=>641, + 8082=>641, 8083=>641, 8084=>641, 8085=>641, 8086=>641, 8087=>641, 8088=>851, 8089=>856, 8090=>1125, 8091=>1125, 8092=>1062, 8093=>1085, 8094=>948, 8095=>956, 8096=>782, 8097=>782, + 8098=>782, 8099=>782, 8100=>782, 8101=>782, 8102=>782, 8103=>782, 8104=>817, 8105=>862, 8106=>1121, 8107=>1126, 8108=>968, 8109=>994, 8110=>925, 8111=>968, 8112=>618, 8113=>618, + 8114=>618, 8115=>618, 8116=>618, 8118=>618, 8119=>618, 8120=>696, 8121=>696, 8122=>789, 8123=>717, 8124=>696, 8125=>450, 8126=>450, 8127=>450, 8128=>450, 8129=>450, 8130=>641, + 8131=>641, 8132=>641, 8134=>641, 8135=>641, 8136=>836, 8137=>761, 8138=>972, 8139=>908, 8140=>753, 8141=>450, 8142=>450, 8143=>450, 8144=>351, 8145=>351, 8146=>351, 8147=>351, + 8150=>351, 8151=>351, 8152=>334, 8153=>334, 8154=>559, 8155=>507, 8157=>450, 8158=>450, 8159=>450, 8160=>607, 8161=>607, 8162=>607, 8163=>607, 8164=>644, 8165=>644, 8166=>607, + 8167=>607, 8168=>651, 8169=>651, 8170=>918, 8171=>882, 8172=>754, 8173=>450, 8174=>450, 8175=>450, 8178=>782, 8179=>782, 8180=>782, 8182=>782, 8183=>782, 8184=>958, 8185=>801, + 8186=>976, 8187=>804, 8188=>765, 8189=>450, 8190=>450, 8192=>450, 8193=>900, 8194=>450, 8195=>900, 8196=>296, 8197=>225, 8198=>150, 8199=>626, 8200=>342, 8201=>180, 8202=>89, + 8203=>0, 8204=>0, 8205=>0, 8206=>0, 8207=>0, 8208=>374, 8209=>374, 8210=>626, 8213=>900, 8214=>450, 8215=>450, 8219=>342, 8223=>591, 8227=>575, 8228=>342, 8229=>616, + 8231=>313, 8234=>0, 8235=>0, 8236=>0, 8237=>0, 8238=>0, 8239=>180, 8241=>1717, 8242=>237, 8243=>402, 8244=>567, 8245=>237, 8246=>402, 8247=>567, 8248=>659, 8251=>875, + 8252=>564, 8253=>522, 8254=>450, 8255=>745, 8256=>745, 8257=>296, 8258=>920, 8259=>450, 8260=>150, 8261=>411, 8262=>411, 8263=>927, 8264=>746, 8265=>746, 8266=>461, 8267=>618, + 8268=>450, 8269=>450, 8270=>470, 8271=>360, 8272=>745, 8273=>470, 8274=>500, 8275=>754, 8276=>746, 8277=>754, 8278=>615, 8279=>731, 8280=>754, 8281=>754, 8282=>342, 8283=>784, + 8284=>754, 8285=>342, 8286=>342, 8287=>200, 8288=>0, 8289=>0, 8290=>0, 8291=>0, 8298=>0, 8299=>0, 8300=>0, 8301=>0, 8302=>0, 8303=>0, 8304=>394, 8305=>197, + 8308=>394, 8309=>394, 8310=>394, 8311=>394, 8312=>394, 8313=>394, 8314=>475, 8315=>475, 8316=>475, 8317=>259, 8318=>259, 8319=>410, 8320=>394, 8321=>394, 8322=>394, 8323=>394, + 8324=>394, 8325=>394, 8326=>394, 8327=>394, 8328=>394, 8329=>394, 8330=>475, 8331=>475, 8332=>475, 8333=>259, 8334=>259, 8336=>412, 8337=>431, 8338=>439, 8339=>371, 8340=>431, + 8352=>836, 8353=>626, 8354=>626, 8355=>626, 8356=>626, 8357=>938, 8358=>753, 8359=>1339, 8360=>1084, 8361=>993, 8362=>768, 8363=>642, 8365=>626, 8366=>614, 8367=>1252, 8368=>626, + 8369=>626, 8370=>626, 8371=>626, 8372=>773, 8373=>626, 8400=>0, 8401=>0, 8406=>0, 8407=>0, 8448=>995, 8449=>995, 8450=>660, 8451=>1090, 8452=>807, 8453=>1002, 8454=>1033, + 8455=>626, 8456=>628, 8457=>856, 8459=>965, 8460=>822, 8461=>765, 8462=>641, 8463=>641, 8464=>544, 8465=>627, 8466=>781, 8467=>424, 8468=>876, 8469=>753, 8470=>1083, 8471=>900, + 8472=>627, 8473=>631, 8474=>765, 8475=>789, 8476=>732, 8477=>713, 8478=>807, 8479=>639, 8480=>917, 8481=>1115, 8483=>751, 8484=>652, 8485=>560, 8486=>765, 8487=>692, 8488=>686, + 8489=>272, 8490=>697, 8491=>696, 8492=>835, 8493=>699, 8494=>769, 8495=>572, 8496=>664, 8497=>729, 8498=>615, 8499=>1074, 8500=>418, 8501=>714, 8502=>662, 8503=>453, 8504=>625, + 8505=>342, 8506=>851, 8507=>1232, 8508=>710, 8509=>663, 8510=>586, 8511=>760, 8512=>756, 8513=>707, 8514=>518, 8515=>573, 8516=>684, 8517=>747, 8518=>644, 8519=>610, 8520=>308, + 8521=>308, 8523=>785, 8526=>492, 8531=>932, 8532=>932, 8533=>932, 8534=>932, 8535=>932, 8536=>932, 8537=>932, 8538=>932, 8539=>932, 8540=>932, 8541=>932, 8542=>932, 8543=>554, + 8544=>334, 8545=>593, 8546=>851, 8547=>989, 8548=>696, 8549=>989, 8550=>1247, 8551=>1505, 8552=>1008, 8553=>694, 8554=>1008, 8555=>1266, 8556=>573, 8557=>660, 8558=>747, 8559=>896, + 8560=>308, 8561=>546, 8562=>785, 8563=>885, 8564=>586, 8565=>866, 8566=>1104, 8567=>1342, 8568=>872, 8569=>580, 8570=>872, 8571=>1110, 8572=>308, 8573=>533, 8574=>644, 8575=>938, + 8576=>1160, 8577=>747, 8578=>1160, 8579=>660, 8580=>533, 8592=>754, 8593=>754, 8594=>754, 8595=>754, 8596=>754, 8597=>754, 8598=>754, 8599=>754, 8600=>754, 8601=>754, 8602=>754, + 8603=>754, 8604=>754, 8605=>754, 8606=>754, 8607=>754, 8608=>754, 8609=>754, 8610=>754, 8611=>754, 8612=>754, 8613=>754, 8614=>754, 8615=>754, 8616=>754, 8617=>754, 8618=>754, + 8619=>754, 8620=>754, 8621=>754, 8622=>754, 8623=>754, 8624=>754, 8625=>754, 8626=>754, 8627=>754, 8628=>754, 8629=>754, 8630=>754, 8631=>754, 8632=>754, 8633=>754, 8634=>754, + 8635=>754, 8636=>754, 8637=>754, 8638=>754, 8639=>754, 8640=>754, 8641=>754, 8642=>754, 8643=>754, 8644=>754, 8645=>754, 8646=>754, 8647=>754, 8648=>754, 8649=>754, 8650=>754, + 8651=>754, 8652=>754, 8653=>754, 8654=>754, 8655=>754, 8656=>754, 8657=>754, 8658=>754, 8659=>754, 8660=>754, 8661=>754, 8662=>754, 8663=>754, 8664=>754, 8665=>754, 8666=>754, + 8667=>754, 8668=>754, 8669=>754, 8670=>754, 8671=>754, 8672=>754, 8673=>754, 8674=>754, 8675=>754, 8676=>754, 8677=>754, 8678=>754, 8679=>754, 8680=>754, 8681=>754, 8682=>754, + 8683=>754, 8684=>754, 8685=>754, 8686=>754, 8687=>754, 8688=>754, 8689=>754, 8690=>754, 8691=>754, 8692=>754, 8693=>754, 8694=>754, 8695=>754, 8696=>754, 8697=>754, 8698=>754, + 8699=>754, 8700=>754, 8701=>754, 8702=>754, 8703=>754, 8704=>696, 8705=>626, 8706=>489, 8707=>615, 8708=>615, 8709=>771, 8710=>627, 8711=>627, 8712=>807, 8713=>807, 8714=>675, + 8715=>807, 8716=>807, 8717=>675, 8718=>572, 8719=>708, 8720=>708, 8721=>646, 8722=>754, 8723=>754, 8724=>626, 8725=>150, 8726=>626, 8727=>754, 8728=>563, 8729=>342, 8730=>600, + 8731=>600, 8732=>600, 8733=>602, 8734=>750, 8735=>754, 8736=>807, 8737=>807, 8738=>754, 8739=>450, 8740=>450, 8741=>450, 8742=>450, 8743=>730, 8744=>730, 8745=>730, 8746=>730, + 8747=>549, 8748=>835, 8749=>1165, 8750=>506, 8751=>879, 8752=>1181, 8753=>506, 8754=>506, 8755=>506, 8756=>626, 8757=>626, 8758=>264, 8759=>626, 8760=>754, 8761=>754, 8762=>754, + 8763=>754, 8764=>754, 8765=>754, 8766=>754, 8767=>754, 8768=>337, 8769=>754, 8770=>754, 8771=>754, 8772=>754, 8773=>754, 8774=>754, 8775=>754, 8776=>754, 8777=>754, 8778=>754, + 8779=>754, 8780=>754, 8781=>754, 8782=>754, 8783=>754, 8784=>754, 8785=>754, 8786=>754, 8787=>754, 8788=>956, 8789=>956, 8790=>754, 8791=>754, 8792=>754, 8793=>754, 8794=>754, + 8795=>754, 8796=>754, 8797=>754, 8798=>754, 8799=>754, 8800=>754, 8801=>754, 8802=>754, 8803=>754, 8804=>754, 8805=>754, 8806=>754, 8807=>754, 8808=>756, 8809=>756, 8810=>942, + 8811=>942, 8812=>450, 8813=>754, 8814=>754, 8815=>754, 8816=>754, 8817=>754, 8818=>754, 8819=>754, 8820=>754, 8821=>754, 8822=>754, 8823=>754, 8824=>754, 8825=>754, 8826=>754, + 8827=>754, 8828=>754, 8829=>754, 8830=>754, 8831=>754, 8832=>754, 8833=>754, 8834=>754, 8835=>754, 8836=>754, 8837=>754, 8838=>754, 8839=>754, 8840=>754, 8841=>754, 8842=>754, + 8843=>754, 8844=>730, 8845=>730, 8846=>730, 8847=>754, 8848=>754, 8849=>754, 8850=>754, 8851=>678, 8852=>678, 8853=>754, 8854=>754, 8855=>754, 8856=>754, 8857=>754, 8858=>754, + 8859=>754, 8860=>754, 8861=>754, 8862=>754, 8863=>754, 8864=>754, 8865=>754, 8866=>822, 8867=>822, 8868=>822, 8869=>822, 8870=>488, 8871=>488, 8872=>822, 8873=>822, 8874=>822, + 8875=>822, 8876=>822, 8877=>822, 8878=>822, 8879=>822, 8882=>754, 8883=>754, 8884=>754, 8885=>754, 8886=>900, 8887=>900, 8888=>754, 8889=>754, 8890=>488, 8891=>730, 8892=>730, + 8893=>730, 8896=>758, 8897=>758, 8898=>758, 8899=>758, 8900=>444, 8901=>342, 8902=>563, 8904=>900, 8905=>900, 8906=>900, 8907=>900, 8908=>900, 8909=>754, 8918=>754, 8919=>754, + 8920=>1280, 8921=>1280, 8922=>754, 8923=>754, 8924=>754, 8925=>754, 8926=>754, 8927=>754, 8928=>754, 8929=>754, 8930=>754, 8931=>754, 8932=>754, 8933=>754, 8934=>754, 8935=>754, + 8936=>754, 8937=>754, 8938=>754, 8939=>754, 8940=>754, 8941=>754, 8946=>1042, 8947=>807, 8948=>675, 8949=>807, 8950=>807, 8951=>675, 8952=>807, 8953=>807, 8954=>1042, 8955=>807, + 8956=>675, 8957=>807, 8958=>675, 8959=>807, 8962=>644, 8966=>826, 8968=>411, 8969=>411, 8970=>411, 8971=>411, 8976=>754, 8977=>484, 8984=>835, 8985=>754, 8992=>549, 8993=>549, + 8997=>900, 9000=>1299, 9085=>776, 9115=>450, 9116=>450, 9117=>450, 9118=>450, 9119=>450, 9120=>450, 9121=>450, 9122=>450, 9123=>450, 9124=>450, 9125=>450, 9126=>450, 9127=>675, + 9128=>675, 9129=>675, 9130=>675, 9131=>675, 9132=>675, 9133=>675, 9134=>549, 9166=>754, 9167=>850, 9250=>644, 9251=>644, 9312=>762, 9313=>762, 9314=>762, 9315=>762, 9316=>762, + 9317=>762, 9318=>762, 9319=>762, 9320=>762, 9321=>762, 9600=>692, 9601=>692, 9602=>692, 9603=>692, 9604=>692, 9605=>692, 9606=>692, 9607=>692, 9608=>692, 9609=>692, 9610=>692, + 9611=>692, 9612=>692, 9613=>692, 9614=>692, 9615=>692, 9616=>692, 9617=>692, 9618=>692, 9619=>692, 9620=>692, 9621=>692, 9622=>692, 9623=>692, 9624=>692, 9625=>692, 9626=>692, + 9627=>692, 9628=>692, 9629=>692, 9630=>692, 9631=>692, 9632=>850, 9633=>850, 9634=>850, 9635=>850, 9636=>850, 9637=>850, 9638=>850, 9639=>850, 9640=>850, 9641=>850, 9642=>610, + 9643=>610, 9644=>850, 9645=>850, 9646=>495, 9647=>495, 9648=>692, 9649=>692, 9650=>692, 9651=>692, 9652=>452, 9653=>452, 9654=>692, 9655=>692, 9656=>452, 9657=>452, 9658=>692, + 9659=>692, 9660=>692, 9661=>692, 9662=>452, 9663=>452, 9664=>692, 9665=>692, 9666=>452, 9667=>452, 9668=>692, 9669=>692, 9670=>692, 9671=>692, 9672=>692, 9673=>785, 9674=>444, + 9675=>785, 9676=>785, 9677=>785, 9678=>785, 9679=>785, 9680=>785, 9681=>785, 9682=>785, 9683=>785, 9684=>785, 9685=>785, 9686=>474, 9687=>474, 9688=>756, 9689=>873, 9690=>873, + 9691=>873, 9692=>348, 9693=>348, 9694=>348, 9695=>348, 9696=>692, 9697=>692, 9698=>692, 9699=>692, 9700=>692, 9701=>692, 9702=>575, 9703=>850, 9704=>850, 9705=>850, 9706=>850, + 9707=>850, 9708=>692, 9709=>692, 9710=>692, 9711=>1007, 9712=>850, 9713=>850, 9714=>850, 9715=>850, 9716=>785, 9717=>785, 9718=>785, 9719=>785, 9720=>692, 9721=>692, 9722=>692, + 9723=>747, 9724=>747, 9725=>659, 9726=>659, 9727=>692, 9728=>807, 9729=>900, 9730=>807, 9731=>807, 9732=>807, 9733=>807, 9734=>807, 9735=>515, 9736=>806, 9737=>807, 9738=>799, + 9739=>799, 9740=>604, 9741=>911, 9742=>1121, 9743=>1125, 9744=>807, 9745=>807, 9746=>807, 9747=>479, 9748=>807, 9749=>807, 9750=>807, 9751=>807, 9752=>807, 9753=>807, 9754=>807, + 9755=>807, 9756=>807, 9757=>548, 9758=>807, 9759=>548, 9760=>807, 9761=>807, 9762=>807, 9763=>807, 9764=>602, 9765=>671, 9766=>584, 9767=>705, 9768=>490, 9769=>807, 9770=>807, + 9771=>807, 9772=>639, 9773=>807, 9774=>807, 9775=>807, 9776=>807, 9777=>807, 9778=>807, 9779=>807, 9780=>807, 9781=>807, 9782=>807, 9783=>807, 9784=>807, 9785=>807, 9786=>807, + 9787=>807, 9788=>807, 9789=>807, 9790=>807, 9791=>552, 9792=>658, 9793=>658, 9794=>807, 9795=>807, 9796=>807, 9797=>807, 9798=>807, 9799=>807, 9800=>807, 9801=>807, 9802=>807, + 9803=>807, 9804=>807, 9805=>807, 9806=>807, 9807=>807, 9808=>807, 9809=>807, 9810=>807, 9811=>807, 9812=>807, 9813=>807, 9814=>807, 9815=>807, 9816=>807, 9817=>807, 9818=>807, + 9819=>807, 9820=>807, 9821=>807, 9822=>807, 9823=>807, 9824=>807, 9825=>807, 9826=>807, 9827=>807, 9828=>807, 9829=>807, 9830=>807, 9831=>807, 9832=>807, 9833=>424, 9834=>574, + 9835=>807, 9836=>807, 9837=>424, 9838=>321, 9839=>435, 9840=>673, 9841=>689, 9842=>807, 9843=>807, 9844=>807, 9845=>807, 9846=>807, 9847=>807, 9848=>807, 9849=>807, 9850=>807, + 9851=>807, 9852=>807, 9853=>807, 9854=>807, 9855=>807, 9856=>782, 9857=>782, 9858=>782, 9859=>782, 9860=>782, 9861=>782, 9862=>807, 9863=>807, 9864=>807, 9865=>807, 9866=>807, + 9867=>807, 9868=>807, 9869=>807, 9870=>807, 9871=>807, 9872=>807, 9873=>807, 9874=>807, 9875=>807, 9876=>807, 9877=>487, 9878=>807, 9879=>807, 9880=>807, 9881=>807, 9882=>807, + 9883=>807, 9884=>807, 9888=>807, 9889=>632, 9890=>754, 9891=>754, 9892=>754, 9893=>754, 9894=>754, 9895=>754, 9896=>754, 9897=>754, 9898=>754, 9899=>754, 9900=>754, 9901=>754, + 9902=>754, 9903=>754, 9904=>759, 9905=>754, 9906=>658, 9985=>754, 9986=>754, 9987=>754, 9988=>754, 9990=>754, 9991=>754, 9992=>754, 9993=>754, 9996=>754, 9997=>754, 9998=>754, + 9999=>754, 10000=>754, 10001=>754, 10002=>754, 10003=>754, 10004=>754, 10005=>754, 10006=>754, 10007=>754, 10008=>754, 10009=>754, 10010=>754, 10011=>754, 10012=>754, 10013=>754, 10014=>754, + 10015=>754, 10016=>754, 10017=>754, 10018=>754, 10019=>754, 10020=>754, 10021=>754, 10022=>754, 10023=>754, 10025=>754, 10026=>754, 10027=>754, 10028=>754, 10029=>754, 10030=>754, 10031=>754, + 10032=>754, 10033=>754, 10034=>754, 10035=>754, 10036=>754, 10037=>754, 10038=>754, 10039=>754, 10040=>754, 10041=>754, 10042=>754, 10043=>754, 10044=>754, 10045=>754, 10046=>754, 10047=>754, + 10048=>754, 10049=>754, 10050=>754, 10051=>754, 10052=>754, 10053=>754, 10054=>754, 10055=>754, 10056=>754, 10057=>754, 10058=>754, 10059=>754, 10061=>807, 10063=>807, 10064=>807, 10065=>807, + 10066=>807, 10070=>807, 10072=>754, 10073=>754, 10074=>754, 10075=>290, 10076=>290, 10077=>484, 10078=>484, 10081=>754, 10082=>754, 10083=>754, 10084=>754, 10085=>754, 10086=>754, 10087=>754, + 10088=>754, 10089=>754, 10090=>754, 10091=>754, 10092=>754, 10093=>754, 10094=>754, 10095=>754, 10096=>754, 10097=>754, 10098=>754, 10099=>754, 10100=>754, 10101=>754, 10102=>762, 10103=>762, + 10104=>762, 10105=>762, 10106=>762, 10107=>762, 10108=>762, 10109=>762, 10110=>762, 10111=>762, 10112=>754, 10113=>754, 10114=>754, 10115=>754, 10116=>754, 10117=>754, 10118=>754, 10119=>754, + 10120=>754, 10121=>754, 10122=>754, 10123=>754, 10124=>754, 10125=>754, 10126=>754, 10127=>754, 10128=>754, 10129=>754, 10130=>754, 10131=>754, 10132=>754, 10136=>754, 10137=>754, 10138=>754, + 10139=>754, 10140=>754, 10141=>754, 10142=>754, 10143=>754, 10144=>754, 10145=>754, 10146=>754, 10147=>754, 10148=>754, 10149=>754, 10150=>754, 10151=>754, 10152=>754, 10153=>754, 10154=>754, + 10155=>754, 10156=>754, 10157=>754, 10158=>754, 10159=>754, 10161=>754, 10162=>754, 10163=>754, 10164=>754, 10165=>754, 10166=>754, 10167=>754, 10168=>754, 10169=>754, 10170=>754, 10171=>754, + 10172=>754, 10173=>754, 10174=>754, 10208=>444, 10214=>438, 10215=>438, 10216=>411, 10217=>411, 10218=>648, 10219=>648, 10224=>754, 10225=>754, 10226=>754, 10227=>754, 10228=>1042, 10229=>1290, + 10230=>1290, 10231=>1290, 10232=>1290, 10233=>1290, 10234=>1290, 10235=>1290, 10236=>1290, 10237=>1290, 10238=>1290, 10239=>1290, 10240=>703, 10241=>703, 10242=>703, 10243=>703, 10244=>703, 10245=>703, + 10246=>703, 10247=>703, 10248=>703, 10249=>703, 10250=>703, 10251=>703, 10252=>703, 10253=>703, 10254=>703, 10255=>703, 10256=>703, 10257=>703, 10258=>703, 10259=>703, 10260=>703, 10261=>703, + 10262=>703, 10263=>703, 10264=>703, 10265=>703, 10266=>703, 10267=>703, 10268=>703, 10269=>703, 10270=>703, 10271=>703, 10272=>703, 10273=>703, 10274=>703, 10275=>703, 10276=>703, 10277=>703, + 10278=>703, 10279=>703, 10280=>703, 10281=>703, 10282=>703, 10283=>703, 10284=>703, 10285=>703, 10286=>703, 10287=>703, 10288=>703, 10289=>703, 10290=>703, 10291=>703, 10292=>703, 10293=>703, + 10294=>703, 10295=>703, 10296=>703, 10297=>703, 10298=>703, 10299=>703, 10300=>703, 10301=>703, 10302=>703, 10303=>703, 10304=>703, 10305=>703, 10306=>703, 10307=>703, 10308=>703, 10309=>703, + 10310=>703, 10311=>703, 10312=>703, 10313=>703, 10314=>703, 10315=>703, 10316=>703, 10317=>703, 10318=>703, 10319=>703, 10320=>703, 10321=>703, 10322=>703, 10323=>703, 10324=>703, 10325=>703, + 10326=>703, 10327=>703, 10328=>703, 10329=>703, 10330=>703, 10331=>703, 10332=>703, 10333=>703, 10334=>703, 10335=>703, 10336=>703, 10337=>703, 10338=>703, 10339=>703, 10340=>703, 10341=>703, + 10342=>703, 10343=>703, 10344=>703, 10345=>703, 10346=>703, 10347=>703, 10348=>703, 10349=>703, 10350=>703, 10351=>703, 10352=>703, 10353=>703, 10354=>703, 10355=>703, 10356=>703, 10357=>703, + 10358=>703, 10359=>703, 10360=>703, 10361=>703, 10362=>703, 10363=>703, 10364=>703, 10365=>703, 10366=>703, 10367=>703, 10368=>703, 10369=>703, 10370=>703, 10371=>703, 10372=>703, 10373=>703, + 10374=>703, 10375=>703, 10376=>703, 10377=>703, 10378=>703, 10379=>703, 10380=>703, 10381=>703, 10382=>703, 10383=>703, 10384=>703, 10385=>703, 10386=>703, 10387=>703, 10388=>703, 10389=>703, + 10390=>703, 10391=>703, 10392=>703, 10393=>703, 10394=>703, 10395=>703, 10396=>703, 10397=>703, 10398=>703, 10399=>703, 10400=>703, 10401=>703, 10402=>703, 10403=>703, 10404=>703, 10405=>703, + 10406=>703, 10407=>703, 10408=>703, 10409=>703, 10410=>703, 10411=>703, 10412=>703, 10413=>703, 10414=>703, 10415=>703, 10416=>703, 10417=>703, 10418=>703, 10419=>703, 10420=>703, 10421=>703, + 10422=>703, 10423=>703, 10424=>703, 10425=>703, 10426=>703, 10427=>703, 10428=>703, 10429=>703, 10430=>703, 10431=>703, 10432=>703, 10433=>703, 10434=>703, 10435=>703, 10436=>703, 10437=>703, + 10438=>703, 10439=>703, 10440=>703, 10441=>703, 10442=>703, 10443=>703, 10444=>703, 10445=>703, 10446=>703, 10447=>703, 10448=>703, 10449=>703, 10450=>703, 10451=>703, 10452=>703, 10453=>703, + 10454=>703, 10455=>703, 10456=>703, 10457=>703, 10458=>703, 10459=>703, 10460=>703, 10461=>703, 10462=>703, 10463=>703, 10464=>703, 10465=>703, 10466=>703, 10467=>703, 10468=>703, 10469=>703, + 10470=>703, 10471=>703, 10472=>703, 10473=>703, 10474=>703, 10475=>703, 10476=>703, 10477=>703, 10478=>703, 10479=>703, 10480=>703, 10481=>703, 10482=>703, 10483=>703, 10484=>703, 10485=>703, + 10486=>703, 10487=>703, 10488=>703, 10489=>703, 10490=>703, 10491=>703, 10492=>703, 10493=>703, 10494=>703, 10495=>703, 10502=>754, 10503=>754, 10506=>754, 10507=>754, 10560=>754, 10561=>754, + 10702=>754, 10703=>941, 10704=>941, 10705=>900, 10706=>900, 10707=>900, 10708=>900, 10709=>900, 10731=>444, 10752=>900, 10753=>900, 10754=>900, 10764=>1495, 10765=>506, 10766=>506, 10767=>506, + 10768=>506, 10769=>506, 10770=>506, 10771=>506, 10772=>506, 10773=>506, 10774=>506, 10775=>506, 10776=>506, 10777=>506, 10778=>506, 10779=>506, 10780=>506, 10877=>754, 10878=>754, 10879=>754, + 10880=>754, 10881=>754, 10882=>754, 10883=>754, 10884=>754, 10885=>754, 10886=>754, 10887=>754, 10888=>754, 10889=>754, 10890=>754, 10891=>754, 10892=>754, 10893=>754, 10894=>754, 10895=>754, + 10896=>754, 10897=>754, 10898=>754, 10899=>754, 10900=>754, 10901=>754, 10902=>754, 10903=>754, 10904=>754, 10905=>754, 10906=>754, 10907=>754, 10908=>754, 10909=>754, 10910=>754, 10911=>754, + 10912=>754, 10926=>754, 10927=>754, 10928=>754, 10929=>754, 10930=>754, 10931=>754, 10932=>754, 10933=>754, 10934=>754, 10935=>754, 10936=>754, 10937=>754, 10938=>754, 11001=>754, 11002=>754, + 11008=>754, 11009=>754, 11010=>754, 11011=>754, 11012=>754, 11013=>754, 11014=>754, 11015=>754, 11016=>754, 11017=>754, 11018=>754, 11019=>754, 11020=>754, 11021=>754, 11022=>754, 11023=>754, + 11024=>754, 11025=>754, 11026=>850, 11027=>850, 11028=>850, 11029=>850, 11030=>692, 11031=>692, 11032=>692, 11033=>692, 11034=>850, 11040=>782, 11041=>786, 11042=>786, 11043=>786, 11360=>573, + 11361=>324, 11362=>573, 11363=>659, 11364=>693, 11365=>607, 11366=>430, 11367=>860, 11368=>641, 11369=>697, 11370=>598, 11371=>652, 11372=>523, 11380=>586, 11381=>584, 11382=>464, 11383=>704, + 61960=>774, 62047=>647, 62917=>618, 64256=>749, 64257=>708, 64258=>708, 64259=>1024, 64260=>1024, 64261=>727, 64262=>917, 64275=>1249, 64276=>1245, 64277=>1240, 64278=>1245, 64279=>1542, 64285=>334, + 64287=>623, 64288=>647, 64297=>754, 64298=>877, 64299=>877, 64300=>877, 64301=>877, 64302=>676, 64303=>676, 64304=>676, 64305=>658, 64306=>452, 64307=>615, 64308=>700, 64309=>420, 64310=>468, + 64312=>747, 64313=>420, 64314=>700, 64315=>678, 64316=>650, 64318=>781, 64320=>479, 64321=>747, 64323=>744, 64324=>779, 64326=>654, 64327=>733, 64328=>700, 64329=>877, 64330=>740, 64331=>334, + 64332=>658, 64333=>678, 64334=>779, 65024=>0, 65025=>0, 65026=>0, 65027=>0, 65028=>0, 65029=>0, 65030=>0, 65031=>0, 65032=>0, 65033=>0, 65034=>0, 65035=>0, 65036=>0, + 65037=>0, 65038=>0, 65039=>0, 65533=>1002); +$enc=''; +$diff=''; +$file='DejaVuSansCondensed-BoldOblique.z'; +$ctg='DejaVuSansCondensed-BoldOblique.ctg.z'; +$originalsize=436624; +?> diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedi.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedi.php new file mode 100644 index 00000000..5faa4c56 --- /dev/null +++ b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedi.php @@ -0,0 +1,267 @@ +928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>96,'FontBBox'=>'[-914 -385 1493 1068]','ItalicAngle'=>-11,'StemV'=>70,'MissingWidth'=>540); +$up=-42; +$ut=44; +$cw=array( + 0=>540, 32=>286, 33=>360, 34=>414, 35=>754, 36=>572, 37=>855, 38=>702, 39=>247, 40=>351, 41=>351, 42=>450, 43=>754, 44=>286, 45=>325, 46=>286, + 47=>303, 48=>572, 49=>572, 50=>572, 51=>572, 52=>572, 53=>572, 54=>572, 55=>572, 56=>572, 57=>572, 58=>303, 59=>303, 60=>754, 61=>754, 62=>754, + 63=>478, 64=>900, 65=>615, 66=>617, 67=>628, 68=>693, 69=>568, 70=>518, 71=>697, 72=>677, 73=>265, 74=>265, 75=>590, 76=>501, 77=>776, 78=>673, + 79=>708, 80=>542, 81=>708, 82=>625, 83=>571, 84=>549, 85=>659, 86=>615, 87=>890, 88=>616, 89=>549, 90=>616, 91=>351, 92=>303, 93=>351, 94=>754, + 95=>450, 96=>450, 97=>551, 98=>571, 99=>495, 100=>571, 101=>554, 102=>316, 103=>571, 104=>570, 105=>250, 106=>250, 107=>521, 108=>250, 109=>876, 110=>570, + 111=>550, 112=>571, 113=>571, 114=>370, 115=>469, 116=>353, 117=>570, 118=>532, 119=>736, 120=>532, 121=>532, 122=>472, 123=>572, 124=>303, 125=>572, 126=>754, + 8364=>572, 1027=>501, 8218=>286, 402=>316, 8222=>466, 8230=>900, 8224=>450, 8225=>450, 710=>450, 8240=>1215, 352=>571, 8249=>360, 338=>962, 1036=>639, 381=>616, 1039=>677, + 8216=>286, 8217=>286, 8220=>466, 8221=>466, 8226=>531, 8211=>450, 8212=>900, 732=>450, 8482=>900, 353=>469, 8250=>360, 339=>925, 1116=>543, 382=>472, 376=>549, 160=>286, + 161=>360, 162=>572, 163=>572, 164=>572, 165=>572, 166=>303, 167=>450, 168=>450, 169=>900, 170=>424, 171=>555, 172=>754, 173=>325, 174=>900, 175=>450, 176=>450, + 177=>754, 178=>360, 179=>360, 180=>450, 181=>572, 182=>572, 183=>286, 184=>450, 185=>360, 186=>424, 187=>555, 188=>872, 189=>872, 190=>872, 191=>478, 192=>615, + 193=>615, 194=>615, 195=>615, 196=>615, 197=>615, 198=>876, 199=>628, 200=>568, 201=>568, 202=>568, 203=>568, 204=>265, 205=>265, 206=>265, 207=>265, 208=>697, + 209=>673, 210=>708, 211=>708, 212=>708, 213=>708, 214=>708, 215=>754, 216=>708, 217=>659, 218=>659, 219=>659, 220=>659, 221=>549, 222=>547, 223=>567, 224=>551, + 225=>551, 226=>551, 227=>551, 228=>551, 229=>551, 230=>896, 231=>495, 232=>554, 233=>554, 234=>554, 235=>554, 236=>250, 237=>250, 238=>250, 239=>250, 240=>550, + 241=>570, 242=>550, 243=>550, 244=>550, 245=>550, 246=>550, 247=>754, 248=>550, 249=>570, 250=>570, 251=>570, 252=>570, 253=>532, 254=>571, 255=>532, 256=>615, + 257=>551, 258=>615, 259=>551, 260=>615, 261=>551, 262=>628, 263=>495, 264=>628, 265=>495, 266=>628, 267=>495, 268=>628, 269=>495, 270=>693, 271=>571, 272=>697, + 273=>571, 274=>568, 275=>554, 276=>568, 277=>554, 278=>568, 279=>554, 280=>568, 281=>554, 282=>568, 283=>554, 284=>697, 285=>571, 286=>697, 287=>571, 288=>697, + 289=>571, 290=>697, 291=>571, 292=>677, 293=>570, 294=>824, 295=>625, 296=>265, 297=>250, 298=>265, 299=>250, 300=>265, 301=>250, 302=>265, 303=>250, 304=>265, + 305=>250, 306=>531, 307=>500, 308=>265, 309=>250, 310=>590, 311=>521, 312=>521, 313=>501, 314=>250, 315=>501, 316=>250, 317=>501, 318=>296, 319=>501, 320=>536, + 321=>505, 322=>258, 323=>673, 324=>570, 325=>673, 326=>570, 327=>673, 328=>570, 329=>732, 330=>673, 331=>570, 332=>708, 333=>550, 334=>708, 335=>550, 336=>708, + 337=>550, 340=>625, 341=>370, 342=>625, 343=>370, 344=>625, 345=>370, 346=>571, 347=>469, 348=>571, 349=>469, 350=>571, 351=>469, 354=>549, 355=>353, 356=>549, + 357=>353, 358=>549, 359=>353, 360=>659, 361=>570, 362=>659, 363=>570, 364=>659, 365=>570, 366=>659, 367=>570, 368=>659, 369=>570, 370=>659, 371=>570, 372=>890, + 373=>736, 374=>549, 375=>532, 377=>616, 378=>472, 379=>616, 380=>472, 383=>316, 384=>571, 385=>661, 386=>617, 387=>571, 388=>617, 389=>571, 390=>633, 391=>628, + 392=>495, 393=>697, 394=>737, 395=>617, 396=>571, 397=>550, 398=>568, 399=>708, 400=>553, 401=>518, 403=>697, 404=>618, 405=>885, 406=>318, 407=>265, 408=>671, + 409=>521, 410=>250, 411=>532, 412=>876, 413=>673, 414=>570, 415=>708, 416=>822, 417=>550, 418=>844, 419=>663, 420=>586, 421=>571, 422=>625, 423=>571, 424=>469, + 425=>568, 426=>302, 427=>353, 428=>549, 429=>353, 430=>549, 431=>754, 432=>570, 433=>688, 434=>648, 435=>669, 436=>656, 437=>616, 438=>472, 439=>599, 440=>599, + 441=>520, 442=>472, 443=>572, 444=>599, 445=>520, 446=>459, 447=>571, 448=>265, 449=>443, 450=>413, 451=>266, 452=>1310, 453=>1165, 454=>1043, 455=>767, 456=>751, + 457=>500, 458=>938, 459=>923, 460=>820, 461=>615, 462=>551, 463=>265, 464=>250, 465=>708, 466=>550, 467=>659, 468=>570, 469=>659, 470=>570, 471=>659, 472=>570, + 473=>659, 474=>570, 475=>659, 476=>570, 477=>554, 478=>615, 479=>551, 480=>615, 481=>551, 482=>876, 483=>896, 484=>697, 485=>571, 486=>697, 487=>571, 488=>590, + 489=>521, 490=>708, 491=>550, 492=>708, 493=>550, 494=>599, 495=>472, 496=>250, 497=>1310, 498=>1165, 499=>1043, 500=>697, 501=>571, 502=>1001, 503=>614, 504=>673, + 505=>570, 506=>615, 507=>551, 508=>876, 509=>896, 510=>708, 511=>550, 512=>615, 513=>551, 514=>615, 515=>551, 516=>568, 517=>554, 518=>568, 519=>554, 520=>265, + 521=>250, 522=>265, 523=>250, 524=>708, 525=>550, 526=>708, 527=>550, 528=>625, 529=>370, 530=>625, 531=>370, 532=>659, 533=>570, 534=>659, 535=>570, 536=>571, + 537=>469, 538=>549, 539=>353, 540=>564, 541=>469, 542=>677, 543=>570, 544=>662, 545=>754, 546=>628, 547=>549, 548=>616, 549=>472, 550=>615, 551=>551, 552=>568, + 553=>554, 554=>708, 555=>550, 556=>708, 557=>550, 558=>708, 559=>550, 560=>708, 561=>550, 562=>549, 563=>532, 564=>427, 565=>758, 566=>429, 567=>250, 568=>898, + 569=>898, 570=>615, 571=>628, 572=>495, 573=>501, 574=>549, 575=>469, 576=>472, 577=>542, 578=>431, 579=>617, 580=>659, 581=>615, 582=>568, 583=>554, 584=>265, + 585=>250, 586=>703, 587=>571, 588=>625, 589=>370, 590=>549, 591=>532, 592=>551, 593=>571, 594=>571, 595=>571, 596=>495, 597=>495, 598=>571, 599=>654, 600=>554, + 601=>554, 602=>759, 603=>490, 604=>490, 605=>698, 606=>598, 607=>293, 608=>626, 609=>571, 610=>566, 611=>536, 612=>536, 613=>570, 614=>570, 615=>570, 616=>334, + 617=>348, 618=>334, 619=>356, 620=>438, 621=>250, 622=>635, 623=>876, 624=>876, 625=>876, 626=>581, 627=>578, 628=>570, 629=>550, 630=>772, 631=>655, 632=>593, + 633=>422, 634=>422, 635=>422, 636=>422, 637=>422, 638=>477, 639=>477, 640=>541, 641=>541, 642=>469, 643=>302, 644=>302, 645=>415, 646=>302, 647=>353, 648=>353, + 649=>570, 650=>556, 651=>538, 652=>532, 653=>736, 654=>532, 655=>549, 656=>472, 657=>472, 658=>520, 659=>520, 660=>459, 661=>459, 662=>459, 663=>459, 664=>708, + 665=>521, 666=>598, 667=>637, 668=>588, 669=>263, 670=>600, 671=>456, 672=>654, 673=>459, 674=>459, 675=>913, 676=>952, 677=>911, 678=>742, 679=>549, 680=>700, + 681=>763, 682=>576, 683=>589, 684=>463, 685=>463, 686=>513, 687=>597, 688=>359, 689=>359, 690=>157, 691=>233, 692=>266, 693=>266, 694=>341, 695=>463, 696=>335, + 697=>250, 698=>414, 699=>286, 700=>286, 701=>286, 702=>276, 703=>276, 704=>333, 705=>333, 706=>450, 707=>450, 708=>450, 709=>450, 711=>450, 712=>247, 713=>450, + 714=>450, 715=>450, 716=>247, 717=>450, 718=>450, 719=>450, 720=>303, 721=>303, 722=>276, 723=>276, 724=>450, 725=>450, 726=>371, 727=>450, 728=>450, 729=>450, + 730=>450, 731=>450, 733=>450, 734=>284, 735=>450, 736=>383, 737=>149, 738=>335, 739=>399, 740=>333, 741=>444, 742=>444, 743=>444, 744=>444, 745=>444, 748=>450, + 749=>450, 750=>450, 755=>450, 759=>450, 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 773=>0, 774=>0, 775=>0, 776=>0, 777=>0, 778=>0, 779=>0, + 780=>0, 781=>0, 782=>0, 783=>0, 784=>0, 785=>0, 786=>0, 787=>0, 788=>0, 789=>0, 790=>0, 791=>0, 792=>0, 793=>0, 794=>0, 795=>0, + 796=>0, 797=>0, 798=>0, 799=>0, 800=>0, 801=>0, 802=>0, 803=>0, 804=>0, 805=>0, 806=>0, 807=>0, 808=>0, 809=>0, 810=>0, 811=>0, + 812=>0, 813=>0, 814=>0, 815=>0, 816=>0, 817=>0, 818=>0, 819=>0, 820=>0, 821=>0, 822=>0, 823=>0, 824=>0, 825=>0, 826=>0, 827=>0, + 828=>0, 829=>0, 830=>0, 831=>0, 832=>0, 833=>0, 834=>0, 835=>0, 836=>0, 837=>0, 838=>0, 839=>0, 840=>0, 841=>0, 842=>0, 843=>0, + 844=>0, 845=>0, 846=>0, 847=>0, 849=>0, 855=>0, 856=>0, 860=>0, 861=>0, 862=>0, 863=>0, 864=>0, 865=>0, 866=>0, 884=>250, 885=>250, + 890=>450, 891=>494, 892=>495, 893=>494, 894=>303, 900=>450, 901=>450, 902=>625, 903=>286, 904=>690, 905=>813, 906=>391, 908=>755, 910=>773, 911=>814, 912=>304, + 913=>615, 914=>617, 915=>501, 916=>615, 917=>568, 918=>616, 919=>677, 920=>708, 921=>265, 922=>590, 923=>615, 924=>776, 925=>673, 926=>568, 927=>708, 928=>677, + 929=>542, 931=>568, 932=>549, 933=>549, 934=>708, 935=>616, 936=>708, 937=>688, 938=>265, 939=>549, 940=>593, 941=>488, 942=>567, 943=>304, 944=>521, 945=>593, + 946=>574, 947=>532, 948=>550, 949=>486, 950=>489, 951=>570, 952=>550, 953=>304, 954=>530, 955=>532, 956=>572, 957=>502, 958=>501, 959=>550, 960=>542, 961=>571, + 962=>528, 963=>570, 964=>542, 965=>521, 966=>593, 967=>532, 968=>593, 969=>753, 970=>304, 971=>521, 972=>550, 973=>521, 974=>753, 976=>553, 977=>557, 978=>628, + 979=>758, 980=>628, 981=>593, 982=>753, 983=>597, 984=>708, 985=>550, 986=>583, 987=>528, 988=>518, 989=>413, 990=>593, 991=>593, 992=>778, 993=>564, 994=>840, + 995=>753, 996=>682, 997=>593, 998=>712, 999=>553, 1000=>618, 1001=>546, 1002=>690, 1003=>563, 1004=>629, 1005=>550, 1006=>549, 1007=>482, 1008=>597, 1009=>571, 1010=>495, + 1011=>250, 1012=>708, 1013=>554, 1014=>554, 1015=>547, 1016=>571, 1017=>628, 1018=>776, 1019=>585, 1020=>571, 1021=>633, 1022=>628, 1023=>633, 1024=>568, 1025=>568, 1026=>708, + 1028=>628, 1029=>571, 1030=>265, 1031=>265, 1032=>265, 1033=>984, 1034=>940, 1035=>708, 1037=>673, 1038=>548, 1040=>615, 1041=>617, 1042=>617, 1043=>501, 1044=>703, 1045=>568, + 1046=>969, 1047=>577, 1048=>673, 1049=>673, 1050=>639, 1051=>677, 1052=>776, 1053=>677, 1054=>708, 1055=>677, 1056=>542, 1057=>628, 1058=>549, 1059=>548, 1060=>774, 1061=>616, + 1062=>699, 1063=>617, 1064=>962, 1065=>984, 1066=>749, 1067=>736, 1068=>617, 1069=>628, 1070=>971, 1071=>625, 1072=>551, 1073=>555, 1074=>530, 1075=>473, 1076=>622, 1077=>554, + 1078=>811, 1079=>479, 1080=>584, 1081=>584, 1082=>543, 1083=>575, 1084=>679, 1085=>588, 1086=>550, 1087=>588, 1088=>571, 1089=>495, 1090=>524, 1091=>532, 1092=>769, 1093=>532, + 1094=>612, 1095=>532, 1096=>823, 1097=>848, 1098=>636, 1099=>710, 1100=>530, 1101=>494, 1102=>757, 1103=>541, 1104=>554, 1105=>554, 1106=>563, 1107=>473, 1108=>494, 1109=>469, + 1110=>250, 1111=>250, 1112=>250, 1113=>812, 1114=>809, 1115=>586, 1117=>584, 1118=>532, 1119=>588, 1120=>840, 1121=>753, 1122=>693, 1123=>604, 1124=>848, 1125=>674, 1126=>791, + 1127=>705, 1128=>1043, 1129=>901, 1130=>708, 1131=>550, 1132=>924, 1133=>742, 1134=>572, 1135=>486, 1136=>771, 1137=>789, 1138=>708, 1139=>533, 1140=>703, 1141=>598, 1142=>703, + 1143=>598, 1144=>893, 1145=>813, 1146=>857, 1147=>682, 1148=>1062, 1149=>925, 1150=>840, 1151=>753, 1152=>628, 1153=>495, 1154=>452, 1155=>0, 1156=>0, 1157=>0, 1158=>0, + 1160=>376, 1161=>376, 1162=>673, 1163=>591, 1164=>617, 1165=>530, 1166=>542, 1167=>571, 1168=>549, 1169=>473, 1170=>607, 1171=>500, 1172=>501, 1173=>441, 1174=>969, 1175=>811, + 1176=>577, 1177=>479, 1178=>639, 1179=>543, 1180=>639, 1181=>543, 1182=>639, 1183=>543, 1184=>771, 1185=>748, 1186=>677, 1187=>594, 1188=>913, 1189=>789, 1190=>1002, 1191=>855, + 1192=>716, 1193=>586, 1194=>628, 1195=>495, 1196=>549, 1197=>476, 1198=>549, 1199=>532, 1200=>549, 1201=>532, 1202=>616, 1203=>532, 1204=>840, 1205=>726, 1206=>617, 1207=>532, + 1208=>617, 1209=>532, 1210=>617, 1211=>570, 1212=>836, 1213=>658, 1214=>836, 1215=>658, 1216=>265, 1217=>969, 1218=>811, 1219=>589, 1220=>543, 1221=>677, 1222=>575, 1223=>677, + 1224=>594, 1225=>677, 1226=>594, 1227=>617, 1228=>532, 1229=>776, 1230=>679, 1231=>250, 1232=>615, 1233=>551, 1234=>615, 1235=>551, 1236=>876, 1237=>896, 1238=>568, 1239=>554, + 1240=>708, 1241=>554, 1242=>708, 1243=>554, 1244=>969, 1245=>811, 1246=>577, 1247=>479, 1248=>599, 1249=>520, 1250=>673, 1251=>584, 1252=>673, 1253=>584, 1254=>708, 1255=>550, + 1256=>708, 1257=>550, 1258=>708, 1259=>550, 1260=>628, 1261=>494, 1262=>548, 1263=>532, 1264=>548, 1265=>532, 1266=>548, 1267=>532, 1268=>617, 1269=>532, 1270=>501, 1271=>442, + 1272=>736, 1273=>710, 1274=>607, 1275=>500, 1276=>616, 1277=>532, 1278=>616, 1279=>532, 1280=>617, 1281=>530, 1282=>905, 1283=>807, 1284=>877, 1285=>782, 1286=>611, 1287=>529, + 1288=>964, 1289=>861, 1290=>965, 1291=>870, 1292=>697, 1293=>593, 1294=>695, 1295=>640, 1296=>553, 1297=>486, 1298=>677, 1299=>575, 1329=>780, 1330=>659, 1331=>794, 1332=>794, + 1333=>659, 1334=>579, 1335=>613, 1336=>659, 1337=>765, 1338=>794, 1339=>659, 1340=>501, 1341=>741, 1342=>888, 1343=>659, 1344=>636, 1345=>579, 1346=>794, 1347=>699, 1348=>794, + 1349=>659, 1350=>756, 1351=>659, 1352=>659, 1353=>659, 1354=>711, 1355=>579, 1356=>794, 1357=>659, 1358=>794, 1359=>571, 1360=>659, 1361=>659, 1362=>719, 1363=>774, 1364=>711, + 1365=>708, 1366=>571, 1369=>276, 1370=>286, 1371=>450, 1372=>450, 1373=>352, 1374=>474, 1375=>450, 1377=>876, 1378=>570, 1379=>686, 1380=>690, 1381=>570, 1382=>627, 1383=>479, + 1384=>570, 1385=>630, 1386=>627, 1387=>570, 1388=>363, 1389=>804, 1390=>576, 1391=>570, 1392=>570, 1393=>571, 1394=>631, 1395=>570, 1396=>593, 1397=>250, 1398=>684, 1399=>464, + 1400=>570, 1401=>407, 1402=>876, 1403=>464, 1404=>691, 1405=>570, 1406=>626, 1407=>876, 1408=>570, 1409=>621, 1410=>451, 1411=>876, 1412=>583, 1413=>550, 1414=>566, 1415=>686, + 1417=>303, 1418=>390, 1456=>0, 1457=>0, 1458=>0, 1459=>0, 1460=>0, 1461=>0, 1462=>0, 1463=>0, 1464=>0, 1465=>0, 1467=>0, 1468=>0, 1469=>0, 1471=>0, + 1472=>265, 1473=>0, 1474=>0, 1475=>265, 1478=>410, 1479=>0, 1488=>566, 1489=>547, 1490=>403, 1491=>534, 1492=>576, 1493=>245, 1494=>380, 1495=>576, 1496=>583, 1497=>245, + 1498=>532, 1499=>500, 1500=>539, 1501=>576, 1502=>593, 1503=>245, 1504=>397, 1505=>629, 1506=>572, 1507=>576, 1508=>543, 1509=>468, 1510=>523, 1511=>596, 1512=>532, 1513=>727, + 1514=>591, 1520=>423, 1521=>409, 1522=>423, 3647=>586, 3713=>603, 3714=>615, 3716=>619, 3719=>434, 3720=>565, 3722=>615, 3725=>619, 3732=>577, 3733=>577, 3734=>605, 3735=>589, + 3737=>576, 3738=>533, 3739=>533, 3740=>670, 3741=>690, 3742=>618, 3743=>618, 3745=>631, 3746=>619, 3747=>615, 3749=>584, 3751=>569, 3754=>633, 3755=>737, 3757=>569, 3758=>615, + 3759=>708, 3760=>569, 3761=>0, 3762=>485, 3763=>485, 3764=>0, 3765=>0, 3766=>0, 3767=>0, 3768=>0, 3769=>0, 3771=>0, 3772=>0, 3773=>597, 3776=>324, 3777=>611, + 3778=>414, 3779=>492, 3780=>442, 3782=>606, 3784=>0, 3785=>0, 3786=>0, 3787=>0, 3788=>0, 3789=>0, 3804=>925, 3805=>925, 5121=>615, 5122=>615, 5123=>615, 5124=>615, + 5125=>728, 5126=>728, 5127=>728, 5129=>728, 5130=>647, 5131=>647, 5132=>751, 5133=>751, 5134=>751, 5135=>751, 5136=>751, 5137=>751, 5138=>870, 5139=>906, 5140=>870, 5141=>906, + 5142=>728, 5143=>870, 5144=>906, 5145=>870, 5146=>906, 5147=>647, 5149=>230, 5150=>488, 5151=>381, 5152=>381, 5153=>350, 5154=>350, 5155=>354, 5156=>350, 5157=>419, 5158=>347, + 5159=>230, 5160=>350, 5161=>350, 5162=>350, 5163=>980, 5164=>817, 5165=>857, 5166=>1005, 5167=>615, 5168=>615, 5169=>615, 5170=>615, 5171=>566, 5172=>566, 5173=>566, 5175=>566, + 5176=>566, 5177=>566, 5178=>751, 5179=>615, 5180=>751, 5181=>751, 5182=>751, 5183=>751, 5184=>870, 5185=>906, 5186=>870, 5187=>906, 5188=>870, 5189=>906, 5190=>870, 5191=>906, + 5192=>656, 5193=>457, 5194=>172, 5196=>659, 5197=>659, 5198=>659, 5199=>659, 5200=>657, 5201=>657, 5202=>657, 5204=>657, 5205=>657, 5206=>657, 5207=>829, 5208=>800, 5209=>829, + 5210=>800, 5211=>829, 5212=>800, 5213=>835, 5214=>810, 5215=>835, 5216=>810, 5217=>853, 5218=>810, 5219=>853, 5220=>810, 5221=>853, 5222=>457, 5223=>790, 5224=>790, 5225=>779, + 5226=>801, 5227=>565, 5228=>565, 5229=>565, 5230=>565, 5231=>565, 5232=>565, 5233=>565, 5234=>565, 5235=>565, 5236=>773, 5237=>693, 5238=>733, 5239=>734, 5240=>733, 5241=>734, + 5242=>773, 5243=>693, 5244=>773, 5245=>693, 5246=>733, 5247=>734, 5248=>733, 5249=>734, 5250=>733, 5251=>366, 5252=>366, 5253=>675, 5254=>697, 5255=>675, 5256=>697, 5257=>565, + 5258=>565, 5259=>565, 5260=>565, 5261=>565, 5262=>565, 5263=>565, 5264=>565, 5265=>565, 5266=>773, 5267=>693, 5268=>733, 5269=>734, 5270=>733, 5271=>734, 5272=>773, 5273=>693, + 5274=>773, 5275=>693, 5276=>733, 5277=>734, 5278=>733, 5279=>734, 5280=>733, 5281=>391, 5282=>391, 5283=>470, 5284=>470, 5285=>470, 5286=>470, 5287=>470, 5288=>470, 5289=>470, + 5290=>470, 5291=>470, 5292=>674, 5293=>691, 5294=>671, 5295=>687, 5296=>671, 5297=>687, 5298=>674, 5299=>691, 5300=>674, 5301=>691, 5302=>671, 5303=>687, 5304=>671, 5305=>687, + 5306=>671, 5307=>347, 5308=>457, 5309=>347, 5312=>766, 5313=>766, 5314=>766, 5315=>766, 5316=>719, 5317=>719, 5318=>719, 5319=>719, 5320=>719, 5321=>962, 5322=>931, 5323=>953, + 5324=>766, 5325=>953, 5326=>719, 5327=>766, 5328=>540, 5329=>407, 5330=>540, 5331=>766, 5332=>766, 5333=>766, 5334=>766, 5335=>719, 5336=>719, 5337=>719, 5338=>719, 5339=>719, + 5340=>962, 5341=>931, 5342=>953, 5343=>927, 5344=>953, 5345=>927, 5346=>962, 5347=>931, 5348=>962, 5349=>931, 5350=>975, 5351=>927, 5352=>975, 5353=>927, 5354=>540, 5356=>656, + 5357=>542, 5358=>542, 5359=>542, 5360=>542, 5361=>542, 5362=>542, 5363=>542, 5364=>542, 5365=>542, 5366=>751, 5367=>678, 5368=>712, 5369=>694, 5370=>712, 5371=>694, 5372=>751, + 5373=>678, 5374=>751, 5375=>678, 5376=>712, 5377=>694, 5378=>712, 5379=>694, 5380=>712, 5381=>376, 5382=>378, 5383=>376, 5392=>641, 5393=>641, 5394=>641, 5395=>802, 5396=>802, + 5397=>802, 5398=>802, 5399=>818, 5400=>785, 5401=>818, 5402=>785, 5403=>818, 5404=>785, 5405=>1026, 5406=>989, 5407=>1026, 5408=>989, 5409=>1026, 5410=>989, 5411=>1026, 5412=>989, + 5413=>576, 5414=>564, 5415=>564, 5416=>564, 5417=>564, 5418=>564, 5419=>564, 5420=>564, 5421=>564, 5422=>564, 5423=>760, 5424=>703, 5425=>734, 5426=>736, 5427=>734, 5428=>736, + 5429=>760, 5430=>703, 5431=>760, 5432=>703, 5433=>734, 5434=>736, 5435=>734, 5436=>736, 5437=>734, 5438=>376, 5440=>350, 5441=>436, 5442=>824, 5443=>824, 5444=>776, 5445=>824, + 5446=>776, 5447=>776, 5448=>542, 5449=>542, 5450=>542, 5451=>542, 5452=>542, 5453=>542, 5454=>751, 5455=>678, 5456=>376, 5458=>656, 5459=>615, 5460=>615, 5461=>615, 5462=>615, + 5463=>605, 5464=>605, 5465=>605, 5466=>605, 5467=>831, 5468=>906, 5469=>457, 5470=>659, 5471=>659, 5472=>659, 5473=>659, 5474=>659, 5475=>659, 5476=>657, 5477=>657, 5478=>657, + 5479=>657, 5480=>853, 5481=>810, 5482=>457, 5492=>747, 5493=>747, 5494=>747, 5495=>747, 5496=>747, 5497=>747, 5498=>747, 5499=>507, 5500=>677, 5501=>436, 5502=>942, 5503=>942, + 5504=>942, 5505=>942, 5506=>942, 5507=>942, 5508=>942, 5509=>743, 5514=>747, 5515=>747, 5516=>747, 5517=>747, 5518=>1133, 5519=>1133, 5520=>1133, 5521=>901, 5522=>901, 5523=>1133, + 5524=>1133, 5525=>629, 5526=>965, 5536=>766, 5537=>766, 5538=>719, 5539=>719, 5540=>719, 5541=>719, 5542=>540, 5543=>579, 5544=>579, 5545=>579, 5546=>579, 5547=>579, 5548=>579, + 5549=>579, 5550=>376, 5551=>565, 5598=>693, 5601=>693, 5702=>421, 5703=>421, 5742=>399, 5743=>942, 5744=>1178, 5745=>1469, 5746=>1469, 5747=>1237, 5748=>1237, 5749=>1469, 5750=>1469, + 7424=>532, 7425=>646, 7426=>883, 7427=>527, 7428=>495, 7429=>544, 7430=>544, 7431=>441, 7432=>486, 7433=>250, 7434=>355, 7435=>521, 7436=>524, 7437=>679, 7438=>584, 7439=>550, + 7440=>495, 7441=>615, 7442=>615, 7443=>615, 7444=>920, 7446=>550, 7447=>550, 7448=>472, 7449=>541, 7450=>541, 7451=>524, 7452=>517, 7453=>663, 7454=>853, 7455=>574, 7456=>532, + 7457=>736, 7458=>472, 7459=>473, 7462=>524, 7463=>532, 7464=>507, 7465=>472, 7466=>531, 7467=>575, 7468=>387, 7469=>552, 7470=>389, 7472=>436, 7473=>358, 7474=>358, 7475=>439, + 7476=>426, 7477=>167, 7478=>167, 7479=>372, 7480=>315, 7481=>489, 7482=>424, 7483=>424, 7484=>446, 7485=>396, 7486=>342, 7487=>394, 7488=>346, 7489=>415, 7490=>560, 7491=>352, + 7492=>352, 7493=>365, 7494=>583, 7495=>385, 7496=>365, 7497=>375, 7498=>375, 7499=>324, 7500=>323, 7501=>365, 7502=>161, 7503=>383, 7504=>561, 7505=>368, 7506=>372, 7507=>333, + 7508=>372, 7509=>372, 7510=>385, 7511=>265, 7512=>364, 7513=>422, 7514=>561, 7515=>375, 7516=>900, 7517=>361, 7518=>335, 7519=>347, 7520=>374, 7521=>327, 7522=>161, 7523=>233, + 7524=>364, 7525=>375, 7526=>361, 7527=>335, 7528=>347, 7529=>374, 7530=>327, 7543=>571, 7544=>426, 7547=>334, 7557=>250, 7579=>365, 7580=>333, 7581=>333, 7582=>372, 7583=>324, + 7584=>267, 7585=>209, 7586=>365, 7587=>364, 7588=>235, 7589=>224, 7590=>234, 7591=>235, 7592=>211, 7593=>224, 7594=>211, 7595=>338, 7596=>561, 7597=>561, 7598=>369, 7599=>431, + 7600=>368, 7601=>372, 7602=>372, 7603=>324, 7604=>258, 7605=>265, 7606=>457, 7607=>376, 7608=>325, 7609=>365, 7610=>375, 7611=>330, 7612=>393, 7613=>330, 7614=>353, 7615=>372, + 7620=>0, 7621=>0, 7622=>0, 7623=>0, 7624=>0, 7625=>0, 7680=>615, 7681=>551, 7682=>617, 7683=>571, 7684=>617, 7685=>571, 7686=>617, 7687=>571, 7688=>628, 7689=>495, + 7690=>693, 7691=>571, 7692=>693, 7693=>571, 7694=>693, 7695=>571, 7696=>693, 7697=>571, 7698=>693, 7699=>571, 7700=>568, 7701=>554, 7702=>568, 7703=>554, 7704=>568, 7705=>554, + 7706=>568, 7707=>554, 7708=>568, 7709=>554, 7710=>518, 7711=>316, 7712=>697, 7713=>571, 7714=>677, 7715=>570, 7716=>677, 7717=>570, 7718=>677, 7719=>570, 7720=>677, 7721=>570, + 7722=>677, 7723=>570, 7724=>265, 7725=>250, 7726=>265, 7727=>250, 7728=>590, 7729=>521, 7730=>590, 7731=>521, 7732=>590, 7733=>521, 7734=>501, 7735=>250, 7736=>501, 7737=>250, + 7738=>501, 7739=>250, 7740=>501, 7741=>250, 7742=>776, 7743=>876, 7744=>776, 7745=>876, 7746=>776, 7747=>876, 7748=>673, 7749=>570, 7750=>673, 7751=>570, 7752=>673, 7753=>570, + 7754=>673, 7755=>570, 7756=>708, 7757=>550, 7758=>708, 7759=>550, 7760=>708, 7761=>550, 7762=>708, 7763=>550, 7764=>542, 7765=>571, 7766=>542, 7767=>571, 7768=>625, 7769=>370, + 7770=>625, 7771=>370, 7772=>625, 7773=>370, 7774=>625, 7775=>370, 7776=>571, 7777=>469, 7778=>571, 7779=>469, 7780=>571, 7781=>469, 7782=>571, 7783=>469, 7784=>571, 7785=>469, + 7786=>549, 7787=>353, 7788=>549, 7789=>353, 7790=>549, 7791=>353, 7792=>549, 7793=>353, 7794=>659, 7795=>570, 7796=>659, 7797=>570, 7798=>659, 7799=>570, 7800=>659, 7801=>570, + 7802=>659, 7803=>570, 7804=>615, 7805=>532, 7806=>615, 7807=>532, 7808=>890, 7809=>736, 7810=>890, 7811=>736, 7812=>890, 7813=>736, 7814=>890, 7815=>736, 7816=>890, 7817=>736, + 7818=>616, 7819=>532, 7820=>616, 7821=>532, 7822=>549, 7823=>532, 7824=>616, 7825=>472, 7826=>616, 7827=>472, 7828=>616, 7829=>472, 7830=>570, 7831=>353, 7832=>736, 7833=>532, + 7834=>551, 7835=>316, 7840=>615, 7841=>551, 7842=>615, 7843=>551, 7844=>615, 7845=>551, 7846=>615, 7847=>551, 7848=>615, 7849=>551, 7850=>615, 7851=>551, 7852=>615, 7853=>551, + 7854=>615, 7855=>551, 7856=>615, 7857=>551, 7858=>615, 7859=>551, 7860=>615, 7861=>551, 7862=>615, 7863=>551, 7864=>568, 7865=>554, 7866=>568, 7867=>554, 7868=>568, 7869=>554, + 7870=>568, 7871=>554, 7872=>568, 7873=>554, 7874=>568, 7875=>554, 7876=>568, 7877=>554, 7878=>568, 7879=>554, 7880=>265, 7881=>250, 7882=>265, 7883=>250, 7884=>708, 7885=>550, + 7886=>708, 7887=>550, 7888=>708, 7889=>550, 7890=>708, 7891=>550, 7892=>708, 7893=>550, 7894=>708, 7895=>550, 7896=>708, 7897=>550, 7898=>822, 7899=>550, 7900=>822, 7901=>550, + 7902=>822, 7903=>550, 7904=>822, 7905=>550, 7906=>822, 7907=>550, 7908=>659, 7909=>570, 7910=>659, 7911=>570, 7912=>754, 7913=>570, 7914=>754, 7915=>570, 7916=>754, 7917=>570, + 7918=>754, 7919=>570, 7920=>754, 7921=>570, 7922=>549, 7923=>532, 7924=>549, 7925=>532, 7926=>549, 7927=>532, 7928=>549, 7929=>532, 7936=>593, 7937=>593, 7938=>593, 7939=>593, + 7940=>593, 7941=>593, 7942=>593, 7943=>593, 7944=>615, 7945=>615, 7946=>790, 7947=>790, 7948=>692, 7949=>721, 7950=>637, 7951=>668, 7952=>486, 7953=>486, 7954=>486, 7955=>486, + 7956=>486, 7957=>486, 7960=>640, 7961=>640, 7962=>869, 7963=>877, 7964=>809, 7965=>835, 7968=>570, 7969=>570, 7970=>570, 7971=>570, 7972=>570, 7973=>570, 7974=>570, 7975=>570, + 7976=>753, 7977=>751, 7978=>977, 7979=>980, 7980=>924, 7981=>945, 7982=>840, 7983=>852, 7984=>304, 7985=>304, 7986=>304, 7987=>304, 7988=>304, 7989=>304, 7990=>304, 7991=>304, + 7992=>342, 7993=>336, 7994=>571, 7995=>571, 7996=>513, 7997=>540, 7998=>440, 7999=>443, 8000=>550, 8001=>550, 8002=>550, 8003=>550, 8004=>550, 8005=>550, 8008=>724, 8009=>763, + 8010=>985, 8011=>989, 8012=>844, 8013=>873, 8016=>521, 8017=>521, 8018=>521, 8019=>521, 8020=>521, 8021=>521, 8022=>521, 8023=>521, 8025=>705, 8027=>897, 8029=>911, 8031=>808, + 8032=>753, 8033=>753, 8034=>753, 8035=>753, 8036=>753, 8037=>753, 8038=>753, 8039=>753, 8040=>722, 8041=>759, 8042=>980, 8043=>985, 8044=>851, 8045=>875, 8046=>829, 8047=>857, + 8048=>593, 8049=>593, 8050=>486, 8051=>493, 8052=>570, 8053=>589, 8054=>304, 8055=>304, 8056=>550, 8057=>550, 8058=>521, 8059=>521, 8060=>753, 8061=>753, 8064=>593, 8065=>593, + 8066=>593, 8067=>593, 8068=>593, 8069=>593, 8070=>593, 8071=>593, 8072=>615, 8073=>615, 8074=>790, 8075=>790, 8076=>692, 8077=>721, 8078=>637, 8079=>668, 8080=>570, 8081=>570, + 8082=>570, 8083=>570, 8084=>570, 8085=>570, 8086=>570, 8087=>570, 8088=>753, 8089=>751, 8090=>977, 8091=>980, 8092=>924, 8093=>945, 8094=>840, 8095=>852, 8096=>753, 8097=>753, + 8098=>753, 8099=>753, 8100=>753, 8101=>753, 8102=>753, 8103=>753, 8104=>722, 8105=>759, 8106=>980, 8107=>985, 8108=>851, 8109=>875, 8110=>829, 8111=>857, 8112=>593, 8113=>593, + 8114=>593, 8115=>593, 8116=>593, 8118=>593, 8119=>593, 8120=>615, 8121=>615, 8122=>645, 8123=>623, 8124=>615, 8125=>450, 8126=>450, 8127=>450, 8128=>450, 8129=>450, 8130=>570, + 8131=>570, 8132=>589, 8134=>570, 8135=>570, 8136=>724, 8137=>671, 8138=>837, 8139=>784, 8140=>677, 8141=>450, 8142=>450, 8143=>450, 8144=>304, 8145=>304, 8146=>304, 8147=>304, + 8150=>304, 8151=>304, 8152=>265, 8153=>265, 8154=>427, 8155=>367, 8157=>450, 8158=>450, 8159=>450, 8160=>521, 8161=>521, 8162=>521, 8163=>521, 8164=>571, 8165=>571, 8166=>521, + 8167=>521, 8168=>549, 8169=>549, 8170=>760, 8171=>742, 8172=>616, 8173=>450, 8174=>450, 8175=>450, 8178=>753, 8179=>753, 8180=>753, 8182=>753, 8183=>753, 8184=>847, 8185=>731, + 8186=>830, 8187=>743, 8188=>688, 8189=>450, 8190=>450, 8192=>450, 8193=>900, 8194=>450, 8195=>900, 8196=>296, 8197=>225, 8198=>150, 8199=>572, 8200=>286, 8201=>180, 8202=>89, + 8203=>0, 8204=>0, 8205=>0, 8206=>0, 8207=>0, 8208=>325, 8209=>325, 8210=>572, 8213=>900, 8214=>0, 8215=>450, 8219=>286, 8223=>466, 8227=>531, 8228=>299, 8229=>600, + 8231=>286, 8234=>0, 8235=>0, 8236=>0, 8237=>0, 8238=>0, 8239=>180, 8241=>1521, 8242=>204, 8243=>336, 8244=>468, 8245=>204, 8246=>336, 8247=>468, 8248=>305, 8251=>754, + 8252=>437, 8253=>478, 8254=>450, 8255=>723, 8256=>723, 8257=>225, 8258=>900, 8259=>450, 8260=>150, 8261=>351, 8262=>351, 8263=>830, 8264=>659, 8265=>659, 8266=>447, 8267=>572, + 8268=>450, 8269=>450, 8270=>450, 8271=>303, 8272=>723, 8273=>450, 8274=>404, 8275=>754, 8276=>723, 8277=>754, 8278=>527, 8279=>597, 8280=>754, 8281=>754, 8282=>286, 8283=>717, + 8284=>754, 8285=>286, 8286=>286, 8287=>200, 8288=>0, 8289=>0, 8290=>0, 8291=>0, 8298=>0, 8299=>0, 8300=>0, 8301=>0, 8302=>0, 8303=>0, 8304=>360, 8305=>161, + 8308=>360, 8309=>360, 8310=>360, 8311=>360, 8312=>360, 8313=>360, 8314=>475, 8315=>475, 8316=>475, 8317=>221, 8318=>221, 8319=>359, 8320=>360, 8321=>360, 8322=>360, 8323=>360, + 8324=>360, 8325=>360, 8326=>360, 8327=>360, 8328=>360, 8329=>360, 8330=>475, 8331=>475, 8332=>475, 8333=>221, 8334=>221, 8336=>352, 8337=>375, 8338=>372, 8339=>399, 8340=>375, + 8352=>789, 8353=>572, 8354=>572, 8355=>572, 8356=>572, 8357=>876, 8358=>673, 8359=>1143, 8360=>966, 8361=>890, 8362=>754, 8363=>572, 8365=>590, 8366=>549, 8367=>1145, 8368=>572, + 8369=>572, 8370=>572, 8371=>572, 8372=>696, 8373=>577, 8400=>0, 8401=>0, 8406=>0, 8407=>0, 8448=>873, 8449=>873, 8450=>628, 8451=>1011, 8452=>807, 8453=>872, 8454=>929, + 8455=>553, 8456=>628, 8457=>856, 8459=>889, 8460=>648, 8461=>765, 8462=>570, 8463=>570, 8464=>422, 8465=>627, 8466=>648, 8467=>372, 8468=>736, 8469=>721, 8470=>936, 8471=>900, + 8472=>627, 8473=>631, 8474=>708, 8475=>718, 8476=>732, 8477=>713, 8478=>807, 8479=>615, 8480=>917, 8481=>912, 8483=>615, 8484=>670, 8485=>520, 8486=>688, 8487=>688, 8488=>554, + 8489=>304, 8490=>590, 8491=>615, 8492=>708, 8493=>633, 8494=>769, 8495=>532, 8496=>545, 8497=>708, 8498=>518, 8499=>962, 8500=>416, 8501=>670, 8502=>606, 8503=>404, 8504=>625, + 8505=>342, 8506=>833, 8507=>1041, 8508=>632, 8509=>655, 8510=>589, 8511=>764, 8512=>729, 8513=>697, 8514=>501, 8515=>501, 8516=>549, 8517=>737, 8518=>637, 8519=>554, 8520=>316, + 8521=>316, 8523=>702, 8526=>474, 8531=>872, 8532=>872, 8533=>872, 8534=>872, 8535=>872, 8536=>872, 8537=>872, 8538=>872, 8539=>872, 8540=>872, 8541=>872, 8542=>872, 8543=>511, + 8544=>265, 8545=>443, 8546=>620, 8547=>831, 8548=>615, 8549=>830, 8550=>1007, 8551=>1185, 8552=>826, 8553=>616, 8554=>839, 8555=>1018, 8556=>501, 8557=>628, 8558=>693, 8559=>776, + 8560=>250, 8561=>412, 8562=>573, 8563=>730, 8564=>532, 8565=>729, 8566=>892, 8567=>1053, 8568=>737, 8569=>532, 8570=>740, 8571=>901, 8572=>250, 8573=>495, 8574=>571, 8575=>876, + 8576=>1121, 8577=>693, 8578=>1121, 8579=>633, 8580=>494, 8592=>754, 8593=>754, 8594=>754, 8595=>754, 8596=>754, 8597=>754, 8598=>754, 8599=>754, 8600=>754, 8601=>754, 8602=>754, + 8603=>754, 8604=>754, 8605=>754, 8606=>754, 8607=>754, 8608=>754, 8609=>754, 8610=>754, 8611=>754, 8612=>754, 8613=>754, 8614=>754, 8615=>754, 8616=>754, 8617=>754, 8618=>754, + 8619=>754, 8620=>754, 8621=>754, 8622=>754, 8623=>754, 8624=>754, 8625=>754, 8626=>754, 8627=>754, 8628=>754, 8629=>754, 8630=>754, 8631=>754, 8632=>754, 8633=>754, 8634=>754, + 8635=>754, 8636=>754, 8637=>754, 8638=>754, 8639=>754, 8640=>754, 8641=>754, 8642=>754, 8643=>754, 8644=>754, 8645=>754, 8646=>754, 8647=>754, 8648=>754, 8649=>754, 8650=>754, + 8651=>754, 8652=>754, 8653=>754, 8654=>754, 8655=>754, 8656=>754, 8657=>754, 8658=>754, 8659=>754, 8660=>754, 8661=>754, 8662=>754, 8663=>754, 8664=>754, 8665=>754, 8666=>754, + 8667=>754, 8668=>754, 8669=>754, 8670=>754, 8671=>754, 8672=>754, 8673=>754, 8674=>754, 8675=>754, 8676=>754, 8677=>754, 8678=>754, 8679=>754, 8680=>754, 8681=>754, 8682=>754, + 8683=>754, 8684=>754, 8685=>754, 8686=>754, 8687=>754, 8688=>754, 8689=>754, 8690=>754, 8691=>754, 8692=>754, 8693=>754, 8694=>754, 8695=>754, 8696=>754, 8697=>754, 8698=>754, + 8699=>754, 8700=>754, 8701=>754, 8702=>754, 8703=>754, 8704=>615, 8705=>572, 8706=>465, 8707=>568, 8708=>568, 8709=>784, 8710=>602, 8711=>602, 8712=>784, 8713=>784, 8714=>646, + 8715=>784, 8716=>784, 8717=>646, 8718=>572, 8719=>681, 8720=>681, 8721=>606, 8722=>754, 8723=>754, 8724=>754, 8725=>150, 8726=>573, 8727=>754, 8728=>563, 8729=>286, 8730=>573, + 8731=>573, 8732=>573, 8733=>609, 8734=>750, 8735=>754, 8736=>807, 8737=>807, 8738=>754, 8739=>450, 8740=>450, 8741=>450, 8742=>450, 8743=>659, 8744=>659, 8745=>659, 8746=>659, + 8747=>469, 8748=>710, 8749=>951, 8750=>469, 8751=>710, 8752=>951, 8753=>469, 8754=>469, 8755=>469, 8756=>572, 8757=>572, 8758=>234, 8759=>572, 8760=>754, 8761=>754, 8762=>754, + 8763=>754, 8764=>754, 8765=>754, 8766=>754, 8767=>754, 8768=>337, 8769=>754, 8770=>754, 8771=>754, 8772=>754, 8773=>754, 8774=>754, 8775=>754, 8776=>754, 8777=>754, 8778=>754, + 8779=>754, 8780=>754, 8781=>754, 8782=>754, 8783=>754, 8784=>754, 8785=>754, 8786=>754, 8787=>754, 8788=>900, 8789=>900, 8790=>754, 8791=>754, 8792=>754, 8793=>754, 8794=>754, + 8795=>754, 8796=>754, 8797=>754, 8798=>754, 8799=>754, 8800=>754, 8801=>754, 8802=>754, 8803=>754, 8804=>754, 8805=>754, 8806=>754, 8807=>754, 8808=>754, 8809=>754, 8810=>942, + 8811=>942, 8812=>417, 8813=>754, 8814=>754, 8815=>754, 8816=>754, 8817=>754, 8818=>754, 8819=>754, 8820=>754, 8821=>754, 8822=>754, 8823=>754, 8824=>754, 8825=>754, 8826=>754, + 8827=>754, 8828=>754, 8829=>754, 8830=>754, 8831=>754, 8832=>754, 8833=>754, 8834=>754, 8835=>754, 8836=>754, 8837=>754, 8838=>754, 8839=>754, 8840=>754, 8841=>754, 8842=>754, + 8843=>754, 8844=>659, 8845=>659, 8846=>659, 8847=>754, 8848=>754, 8849=>754, 8850=>754, 8851=>649, 8852=>649, 8853=>754, 8854=>754, 8855=>754, 8856=>754, 8857=>754, 8858=>754, + 8859=>754, 8860=>754, 8861=>754, 8862=>754, 8863=>754, 8864=>754, 8865=>754, 8866=>784, 8867=>784, 8868=>784, 8869=>784, 8870=>468, 8871=>468, 8872=>784, 8873=>784, 8874=>784, + 8875=>784, 8876=>784, 8877=>784, 8878=>784, 8879=>784, 8882=>754, 8883=>754, 8884=>754, 8885=>754, 8886=>900, 8887=>900, 8888=>754, 8889=>754, 8890=>468, 8891=>659, 8892=>659, + 8893=>659, 8896=>738, 8897=>738, 8898=>738, 8899=>738, 8900=>444, 8901=>286, 8902=>563, 8904=>900, 8905=>900, 8906=>900, 8907=>900, 8908=>900, 8909=>754, 8918=>754, 8919=>754, + 8920=>1280, 8921=>1280, 8922=>754, 8923=>754, 8924=>754, 8925=>754, 8926=>754, 8927=>754, 8928=>754, 8929=>754, 8930=>754, 8931=>754, 8932=>754, 8933=>754, 8934=>754, 8935=>754, + 8936=>754, 8937=>754, 8938=>754, 8939=>754, 8940=>754, 8941=>754, 8946=>900, 8947=>784, 8948=>646, 8949=>784, 8950=>784, 8951=>646, 8952=>784, 8953=>784, 8954=>900, 8955=>784, + 8956=>646, 8957=>784, 8958=>646, 8959=>784, 8962=>571, 8966=>784, 8968=>351, 8969=>351, 8970=>351, 8971=>351, 8976=>754, 8977=>461, 8984=>900, 8985=>754, 8992=>469, 8993=>469, + 8997=>900, 9000=>1299, 9085=>681, 9115=>450, 9116=>450, 9117=>450, 9118=>450, 9119=>450, 9120=>450, 9121=>450, 9122=>450, 9123=>450, 9124=>450, 9125=>450, 9126=>450, 9127=>675, + 9128=>675, 9129=>675, 9130=>675, 9131=>675, 9132=>675, 9133=>675, 9134=>469, 9166=>754, 9167=>850, 9250=>571, 9251=>571, 9312=>807, 9313=>807, 9314=>807, 9315=>807, 9316=>807, + 9317=>807, 9318=>807, 9319=>807, 9320=>807, 9321=>807, 9600=>692, 9601=>692, 9602=>692, 9603=>692, 9604=>692, 9605=>692, 9606=>692, 9607=>692, 9608=>692, 9609=>692, 9610=>692, + 9611=>692, 9612=>692, 9613=>692, 9614=>692, 9615=>692, 9616=>692, 9617=>692, 9618=>692, 9619=>692, 9620=>692, 9621=>692, 9622=>692, 9623=>692, 9624=>692, 9625=>692, 9626=>692, + 9627=>692, 9628=>692, 9629=>692, 9630=>692, 9631=>692, 9632=>850, 9633=>850, 9634=>850, 9635=>850, 9636=>850, 9637=>850, 9638=>850, 9639=>850, 9640=>850, 9641=>850, 9642=>610, + 9643=>610, 9644=>850, 9645=>850, 9646=>495, 9647=>495, 9648=>692, 9649=>692, 9650=>692, 9651=>692, 9652=>452, 9653=>452, 9654=>692, 9655=>692, 9656=>452, 9657=>452, 9658=>692, + 9659=>692, 9660=>692, 9661=>692, 9662=>452, 9663=>452, 9664=>692, 9665=>692, 9666=>452, 9667=>452, 9668=>692, 9669=>692, 9670=>692, 9671=>692, 9672=>692, 9673=>785, 9674=>444, + 9675=>785, 9676=>785, 9677=>785, 9678=>785, 9679=>785, 9680=>785, 9681=>785, 9682=>785, 9683=>785, 9684=>785, 9685=>785, 9686=>474, 9687=>474, 9688=>712, 9689=>873, 9690=>873, + 9691=>873, 9692=>348, 9693=>348, 9694=>348, 9695=>348, 9696=>692, 9697=>692, 9698=>692, 9699=>692, 9700=>692, 9701=>692, 9702=>531, 9703=>850, 9704=>850, 9705=>850, 9706=>850, + 9707=>850, 9708=>692, 9709=>692, 9710=>692, 9711=>1007, 9712=>850, 9713=>850, 9714=>850, 9715=>850, 9716=>785, 9717=>785, 9718=>785, 9719=>785, 9720=>692, 9721=>692, 9722=>692, + 9723=>747, 9724=>747, 9725=>659, 9726=>659, 9727=>692, 9728=>807, 9729=>900, 9730=>807, 9731=>807, 9732=>807, 9733=>807, 9734=>807, 9735=>515, 9736=>806, 9737=>807, 9738=>799, + 9739=>799, 9740=>604, 9741=>911, 9742=>1121, 9743=>1125, 9744=>807, 9745=>807, 9746=>807, 9747=>479, 9748=>807, 9749=>807, 9750=>807, 9751=>807, 9752=>807, 9753=>807, 9754=>807, + 9755=>807, 9756=>807, 9757=>548, 9758=>807, 9759=>548, 9760=>807, 9761=>807, 9762=>807, 9763=>807, 9764=>602, 9765=>671, 9766=>584, 9767=>705, 9768=>490, 9769=>807, 9770=>807, + 9771=>807, 9772=>639, 9773=>807, 9774=>807, 9775=>807, 9776=>807, 9777=>807, 9778=>807, 9779=>807, 9780=>807, 9781=>807, 9782=>807, 9783=>807, 9784=>807, 9785=>807, 9786=>807, + 9787=>807, 9788=>807, 9789=>807, 9790=>807, 9791=>552, 9792=>658, 9793=>658, 9794=>807, 9795=>807, 9796=>807, 9797=>807, 9798=>807, 9799=>807, 9800=>807, 9801=>807, 9802=>807, + 9803=>807, 9804=>807, 9805=>807, 9806=>807, 9807=>807, 9808=>807, 9809=>807, 9810=>807, 9811=>807, 9812=>807, 9813=>807, 9814=>807, 9815=>807, 9816=>807, 9817=>807, 9818=>807, + 9819=>807, 9820=>807, 9821=>807, 9822=>807, 9823=>807, 9824=>807, 9825=>807, 9826=>807, 9827=>807, 9828=>807, 9829=>807, 9830=>807, 9831=>807, 9832=>807, 9833=>424, 9834=>574, + 9835=>807, 9836=>807, 9837=>424, 9838=>321, 9839=>435, 9840=>673, 9841=>689, 9842=>807, 9843=>807, 9844=>807, 9845=>807, 9846=>807, 9847=>807, 9848=>807, 9849=>807, 9850=>807, + 9851=>807, 9852=>807, 9853=>807, 9854=>807, 9855=>807, 9856=>782, 9857=>782, 9858=>782, 9859=>782, 9860=>782, 9861=>782, 9862=>800, 9863=>800, 9864=>800, 9865=>800, 9866=>800, + 9867=>800, 9868=>800, 9869=>800, 9870=>800, 9871=>800, 9872=>675, 9873=>675, 9874=>800, 9875=>734, 9876=>644, 9877=>483, 9878=>766, 9879=>800, 9880=>615, 9881=>800, 9882=>637, + 9883=>800, 9884=>800, 9888=>800, 9889=>800, 9890=>754, 9891=>754, 9892=>754, 9893=>754, 9894=>754, 9895=>754, 9896=>754, 9897=>754, 9898=>754, 9899=>754, 9900=>754, 9901=>754, + 9902=>754, 9903=>754, 9904=>759, 9905=>754, 9906=>658, 9985=>754, 9986=>754, 9987=>754, 9988=>754, 9990=>754, 9991=>754, 9992=>754, 9993=>754, 9996=>754, 9997=>754, 9998=>754, + 9999=>754, 10000=>754, 10001=>754, 10002=>754, 10003=>754, 10004=>754, 10005=>754, 10006=>754, 10007=>754, 10008=>754, 10009=>754, 10010=>754, 10011=>754, 10012=>754, 10013=>754, 10014=>754, + 10015=>754, 10016=>754, 10017=>754, 10018=>754, 10019=>754, 10020=>754, 10021=>754, 10022=>754, 10023=>754, 10025=>754, 10026=>754, 10027=>754, 10028=>754, 10029=>754, 10030=>754, 10031=>754, + 10032=>754, 10033=>754, 10034=>754, 10035=>754, 10036=>754, 10037=>754, 10038=>754, 10039=>754, 10040=>754, 10041=>754, 10042=>754, 10043=>754, 10044=>754, 10045=>754, 10046=>754, 10047=>754, + 10048=>754, 10049=>754, 10050=>754, 10051=>754, 10052=>754, 10053=>754, 10054=>754, 10055=>754, 10056=>754, 10057=>754, 10058=>754, 10059=>754, 10061=>807, 10063=>807, 10064=>807, 10065=>807, + 10066=>807, 10070=>807, 10072=>754, 10073=>754, 10074=>754, 10075=>290, 10076=>290, 10077=>484, 10078=>484, 10081=>754, 10082=>754, 10083=>754, 10084=>754, 10085=>754, 10086=>754, 10087=>754, + 10088=>754, 10089=>754, 10090=>754, 10091=>754, 10092=>754, 10093=>754, 10094=>754, 10095=>754, 10096=>754, 10097=>754, 10098=>754, 10099=>754, 10100=>754, 10101=>754, 10102=>807, 10103=>807, + 10104=>807, 10105=>807, 10106=>807, 10107=>807, 10108=>807, 10109=>807, 10110=>807, 10111=>807, 10112=>754, 10113=>754, 10114=>754, 10115=>754, 10116=>754, 10117=>754, 10118=>754, 10119=>754, + 10120=>754, 10121=>754, 10122=>754, 10123=>754, 10124=>754, 10125=>754, 10126=>754, 10127=>754, 10128=>754, 10129=>754, 10130=>754, 10131=>754, 10132=>754, 10136=>754, 10137=>754, 10138=>754, + 10139=>754, 10140=>754, 10141=>754, 10142=>754, 10143=>754, 10144=>754, 10145=>754, 10146=>754, 10147=>754, 10148=>754, 10149=>754, 10150=>754, 10151=>754, 10152=>754, 10153=>754, 10154=>754, + 10155=>754, 10156=>754, 10157=>754, 10158=>754, 10159=>754, 10161=>754, 10162=>754, 10163=>754, 10164=>754, 10165=>754, 10166=>754, 10167=>754, 10168=>754, 10169=>754, 10170=>754, 10171=>754, + 10172=>754, 10173=>754, 10174=>754, 10208=>444, 10214=>445, 10215=>445, 10216=>351, 10217=>351, 10218=>500, 10219=>500, 10224=>754, 10225=>754, 10226=>754, 10227=>754, 10228=>1042, 10229=>1290, + 10230=>1290, 10231=>1290, 10232=>1290, 10233=>1290, 10234=>1290, 10235=>1290, 10236=>1290, 10237=>1290, 10238=>1290, 10239=>1290, 10240=>659, 10241=>659, 10242=>659, 10243=>659, 10244=>659, 10245=>659, + 10246=>659, 10247=>659, 10248=>659, 10249=>659, 10250=>659, 10251=>659, 10252=>659, 10253=>659, 10254=>659, 10255=>659, 10256=>659, 10257=>659, 10258=>659, 10259=>659, 10260=>659, 10261=>659, + 10262=>659, 10263=>659, 10264=>659, 10265=>659, 10266=>659, 10267=>659, 10268=>659, 10269=>659, 10270=>659, 10271=>659, 10272=>659, 10273=>659, 10274=>659, 10275=>659, 10276=>659, 10277=>659, + 10278=>659, 10279=>659, 10280=>659, 10281=>659, 10282=>659, 10283=>659, 10284=>659, 10285=>659, 10286=>659, 10287=>659, 10288=>659, 10289=>659, 10290=>659, 10291=>659, 10292=>659, 10293=>659, + 10294=>659, 10295=>659, 10296=>659, 10297=>659, 10298=>659, 10299=>659, 10300=>659, 10301=>659, 10302=>659, 10303=>659, 10304=>659, 10305=>659, 10306=>659, 10307=>659, 10308=>659, 10309=>659, + 10310=>659, 10311=>659, 10312=>659, 10313=>659, 10314=>659, 10315=>659, 10316=>659, 10317=>659, 10318=>659, 10319=>659, 10320=>659, 10321=>659, 10322=>659, 10323=>659, 10324=>659, 10325=>659, + 10326=>659, 10327=>659, 10328=>659, 10329=>659, 10330=>659, 10331=>659, 10332=>659, 10333=>659, 10334=>659, 10335=>659, 10336=>659, 10337=>659, 10338=>659, 10339=>659, 10340=>659, 10341=>659, + 10342=>659, 10343=>659, 10344=>659, 10345=>659, 10346=>659, 10347=>659, 10348=>659, 10349=>659, 10350=>659, 10351=>659, 10352=>659, 10353=>659, 10354=>659, 10355=>659, 10356=>659, 10357=>659, + 10358=>659, 10359=>659, 10360=>659, 10361=>659, 10362=>659, 10363=>659, 10364=>659, 10365=>659, 10366=>659, 10367=>659, 10368=>659, 10369=>659, 10370=>659, 10371=>659, 10372=>659, 10373=>659, + 10374=>659, 10375=>659, 10376=>659, 10377=>659, 10378=>659, 10379=>659, 10380=>659, 10381=>659, 10382=>659, 10383=>659, 10384=>659, 10385=>659, 10386=>659, 10387=>659, 10388=>659, 10389=>659, + 10390=>659, 10391=>659, 10392=>659, 10393=>659, 10394=>659, 10395=>659, 10396=>659, 10397=>659, 10398=>659, 10399=>659, 10400=>659, 10401=>659, 10402=>659, 10403=>659, 10404=>659, 10405=>659, + 10406=>659, 10407=>659, 10408=>659, 10409=>659, 10410=>659, 10411=>659, 10412=>659, 10413=>659, 10414=>659, 10415=>659, 10416=>659, 10417=>659, 10418=>659, 10419=>659, 10420=>659, 10421=>659, + 10422=>659, 10423=>659, 10424=>659, 10425=>659, 10426=>659, 10427=>659, 10428=>659, 10429=>659, 10430=>659, 10431=>659, 10432=>659, 10433=>659, 10434=>659, 10435=>659, 10436=>659, 10437=>659, + 10438=>659, 10439=>659, 10440=>659, 10441=>659, 10442=>659, 10443=>659, 10444=>659, 10445=>659, 10446=>659, 10447=>659, 10448=>659, 10449=>659, 10450=>659, 10451=>659, 10452=>659, 10453=>659, + 10454=>659, 10455=>659, 10456=>659, 10457=>659, 10458=>659, 10459=>659, 10460=>659, 10461=>659, 10462=>659, 10463=>659, 10464=>659, 10465=>659, 10466=>659, 10467=>659, 10468=>659, 10469=>659, + 10470=>659, 10471=>659, 10472=>659, 10473=>659, 10474=>659, 10475=>659, 10476=>659, 10477=>659, 10478=>659, 10479=>659, 10480=>659, 10481=>659, 10482=>659, 10483=>659, 10484=>659, 10485=>659, + 10486=>659, 10487=>659, 10488=>659, 10489=>659, 10490=>659, 10491=>659, 10492=>659, 10493=>659, 10494=>659, 10495=>659, 10502=>754, 10503=>754, 10506=>754, 10507=>754, 10560=>615, 10561=>615, + 10702=>754, 10703=>900, 10704=>900, 10705=>900, 10706=>900, 10707=>900, 10708=>900, 10709=>900, 10731=>444, 10752=>900, 10753=>900, 10754=>900, 10764=>1192, 10765=>469, 10766=>469, 10767=>469, + 10768=>469, 10769=>469, 10770=>469, 10771=>469, 10772=>469, 10773=>469, 10774=>469, 10775=>469, 10776=>469, 10777=>469, 10778=>469, 10779=>469, 10780=>469, 10877=>754, 10878=>754, 10879=>754, + 10880=>754, 10881=>754, 10882=>754, 10883=>754, 10884=>754, 10885=>754, 10886=>754, 10887=>754, 10888=>754, 10889=>754, 10890=>754, 10891=>754, 10892=>754, 10893=>754, 10894=>754, 10895=>754, + 10896=>754, 10897=>754, 10898=>754, 10899=>754, 10900=>754, 10901=>754, 10902=>754, 10903=>754, 10904=>754, 10905=>754, 10906=>754, 10907=>754, 10908=>754, 10909=>754, 10910=>754, 10911=>754, + 10912=>754, 10926=>754, 10927=>754, 10928=>754, 10929=>754, 10930=>754, 10931=>754, 10932=>754, 10933=>754, 10934=>754, 10935=>754, 10936=>754, 10937=>754, 10938=>754, 11001=>754, 11002=>754, + 11008=>754, 11009=>754, 11010=>754, 11011=>754, 11012=>754, 11013=>754, 11014=>754, 11015=>754, 11016=>754, 11017=>754, 11018=>754, 11019=>754, 11020=>754, 11021=>754, 11022=>752, 11023=>752, + 11024=>752, 11025=>752, 11026=>850, 11027=>850, 11028=>850, 11029=>850, 11030=>692, 11031=>692, 11032=>692, 11033=>692, 11034=>850, 11040=>782, 11041=>786, 11042=>786, 11043=>786, 11360=>501, + 11361=>250, 11362=>501, 11363=>542, 11364=>625, 11365=>551, 11366=>353, 11367=>677, 11368=>570, 11369=>590, 11370=>521, 11371=>616, 11372=>472, 11380=>532, 11381=>589, 11382=>511, 11383=>593, + 61960=>703, 62047=>532, 63173=>550, 64256=>649, 64257=>581, 64258=>581, 64259=>899, 64260=>899, 64261=>617, 64262=>774, 64275=>1081, 64276=>1081, 64277=>1076, 64278=>1067, 64279=>1376, 64285=>266, + 64287=>444, 64288=>572, 64297=>754, 64298=>719, 64299=>719, 64300=>719, 64301=>719, 64302=>597, 64303=>597, 64304=>597, 64305=>589, 64306=>408, 64307=>546, 64308=>621, 64309=>302, 64310=>393, + 64311=>900, 64312=>615, 64313=>302, 64314=>577, 64315=>599, 64316=>571, 64318=>663, 64320=>410, 64321=>694, 64323=>586, 64324=>599, 64326=>575, 64327=>619, 64328=>577, 64329=>719, 64330=>653, + 64331=>245, 64332=>589, 64333=>599, 64334=>599, 65024=>0, 65025=>0, 65026=>0, 65027=>0, 65028=>0, 65029=>0, 65030=>0, 65031=>0, 65032=>0, 65033=>0, 65034=>0, 65035=>0, + 65036=>0, 65037=>0, 65038=>0, 65039=>0, 65533=>923); +$enc=''; +$diff=''; +$file='DejaVuSansCondensed-Oblique.z'; +$ctg='DejaVuSansCondensed-Oblique.ctg.z'; +$originalsize=425256; +?> diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansi.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansi.php new file mode 100644 index 00000000..66b78736 --- /dev/null +++ b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansi.php @@ -0,0 +1,267 @@ +928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>96,'FontBBox'=>'[-1016 -385 1659 1068]','ItalicAngle'=>-11,'StemV'=>70,'MissingWidth'=>600); +$up=-42; +$ut=44; +$cw=array( + 0=>600, 32=>318, 33=>401, 34=>460, 35=>838, 36=>636, 37=>950, 38=>780, 39=>275, 40=>390, 41=>390, 42=>500, 43=>838, 44=>318, 45=>361, 46=>318, + 47=>337, 48=>636, 49=>636, 50=>636, 51=>636, 52=>636, 53=>636, 54=>636, 55=>636, 56=>636, 57=>636, 58=>337, 59=>337, 60=>838, 61=>838, 62=>838, + 63=>531, 64=>1000, 65=>684, 66=>686, 67=>698, 68=>770, 69=>632, 70=>575, 71=>775, 72=>752, 73=>295, 74=>295, 75=>656, 76=>557, 77=>863, 78=>748, + 79=>787, 80=>603, 81=>787, 82=>695, 83=>635, 84=>611, 85=>732, 86=>684, 87=>989, 88=>685, 89=>611, 90=>685, 91=>390, 92=>337, 93=>390, 94=>838, + 95=>500, 96=>500, 97=>613, 98=>635, 99=>550, 100=>635, 101=>615, 102=>352, 103=>635, 104=>634, 105=>278, 106=>278, 107=>579, 108=>278, 109=>974, 110=>634, + 111=>612, 112=>635, 113=>635, 114=>411, 115=>521, 116=>392, 117=>634, 118=>592, 119=>818, 120=>592, 121=>592, 122=>525, 123=>636, 124=>337, 125=>636, 126=>838, + 8364=>636, 1027=>557, 8218=>318, 402=>352, 8222=>518, 8230=>1000, 8224=>500, 8225=>500, 710=>500, 8240=>1350, 352=>635, 8249=>400, 338=>1070, 1036=>710, 381=>685, 1039=>752, + 8216=>318, 8217=>318, 8220=>518, 8221=>518, 8226=>590, 8211=>500, 8212=>1000, 732=>500, 8482=>1000, 353=>521, 8250=>400, 339=>1028, 1116=>604, 382=>525, 376=>611, 160=>318, + 161=>401, 162=>636, 163=>636, 164=>636, 165=>636, 166=>337, 167=>500, 168=>500, 169=>1000, 170=>471, 171=>617, 172=>838, 173=>361, 174=>1000, 175=>500, 176=>500, + 177=>838, 178=>401, 179=>401, 180=>500, 181=>636, 182=>636, 183=>318, 184=>500, 185=>401, 186=>471, 187=>617, 188=>969, 189=>969, 190=>969, 191=>531, 192=>684, + 193=>684, 194=>684, 195=>684, 196=>684, 197=>684, 198=>974, 199=>698, 200=>632, 201=>632, 202=>632, 203=>632, 204=>295, 205=>295, 206=>295, 207=>295, 208=>775, + 209=>748, 210=>787, 211=>787, 212=>787, 213=>787, 214=>787, 215=>838, 216=>787, 217=>732, 218=>732, 219=>732, 220=>732, 221=>611, 222=>608, 223=>630, 224=>613, + 225=>613, 226=>613, 227=>613, 228=>613, 229=>613, 230=>995, 231=>550, 232=>615, 233=>615, 234=>615, 235=>615, 236=>278, 237=>278, 238=>278, 239=>278, 240=>612, + 241=>634, 242=>612, 243=>612, 244=>612, 245=>612, 246=>612, 247=>838, 248=>612, 249=>634, 250=>634, 251=>634, 252=>634, 253=>592, 254=>635, 255=>592, 256=>684, + 257=>613, 258=>684, 259=>613, 260=>684, 261=>613, 262=>698, 263=>550, 264=>698, 265=>550, 266=>698, 267=>550, 268=>698, 269=>550, 270=>770, 271=>635, 272=>775, + 273=>635, 274=>632, 275=>615, 276=>632, 277=>615, 278=>632, 279=>615, 280=>632, 281=>615, 282=>632, 283=>615, 284=>775, 285=>635, 286=>775, 287=>635, 288=>775, + 289=>635, 290=>775, 291=>635, 292=>752, 293=>634, 294=>916, 295=>695, 296=>295, 297=>278, 298=>295, 299=>278, 300=>295, 301=>278, 302=>295, 303=>278, 304=>295, + 305=>278, 306=>590, 307=>556, 308=>295, 309=>278, 310=>656, 311=>579, 312=>579, 313=>557, 314=>278, 315=>557, 316=>278, 317=>557, 318=>329, 319=>557, 320=>596, + 321=>562, 322=>287, 323=>748, 324=>634, 325=>748, 326=>634, 327=>748, 328=>634, 329=>813, 330=>748, 331=>634, 332=>787, 333=>612, 334=>787, 335=>612, 336=>787, + 337=>612, 340=>695, 341=>411, 342=>695, 343=>411, 344=>695, 345=>411, 346=>635, 347=>521, 348=>635, 349=>521, 350=>635, 351=>521, 354=>611, 355=>392, 356=>611, + 357=>392, 358=>611, 359=>392, 360=>732, 361=>634, 362=>732, 363=>634, 364=>732, 365=>634, 366=>732, 367=>634, 368=>732, 369=>634, 370=>732, 371=>634, 372=>989, + 373=>818, 374=>611, 375=>592, 377=>685, 378=>525, 379=>685, 380=>525, 383=>352, 384=>635, 385=>735, 386=>686, 387=>635, 388=>686, 389=>635, 390=>703, 391=>698, + 392=>550, 393=>775, 394=>819, 395=>686, 396=>635, 397=>612, 398=>632, 399=>787, 400=>614, 401=>575, 403=>775, 404=>687, 405=>984, 406=>354, 407=>295, 408=>746, + 409=>579, 410=>278, 411=>592, 412=>974, 413=>748, 414=>634, 415=>787, 416=>913, 417=>612, 418=>938, 419=>737, 420=>652, 421=>635, 422=>695, 423=>635, 424=>521, + 425=>632, 426=>336, 427=>392, 428=>611, 429=>392, 430=>611, 431=>838, 432=>634, 433=>764, 434=>721, 435=>744, 436=>729, 437=>685, 438=>525, 439=>666, 440=>666, + 441=>578, 442=>525, 443=>636, 444=>666, 445=>578, 446=>510, 447=>635, 448=>295, 449=>492, 450=>459, 451=>295, 452=>1455, 453=>1295, 454=>1160, 455=>852, 456=>835, + 457=>556, 458=>1043, 459=>1026, 460=>912, 461=>684, 462=>613, 463=>295, 464=>278, 465=>787, 466=>612, 467=>732, 468=>634, 469=>732, 470=>634, 471=>732, 472=>634, + 473=>732, 474=>634, 475=>732, 476=>634, 477=>615, 478=>684, 479=>613, 480=>684, 481=>613, 482=>974, 483=>995, 484=>775, 485=>635, 486=>775, 487=>635, 488=>656, + 489=>579, 490=>787, 491=>612, 492=>787, 493=>612, 494=>666, 495=>525, 496=>278, 497=>1455, 498=>1295, 499=>1160, 500=>775, 501=>635, 502=>1113, 503=>682, 504=>748, + 505=>634, 506=>684, 507=>613, 508=>974, 509=>995, 510=>787, 511=>612, 512=>684, 513=>613, 514=>684, 515=>613, 516=>632, 517=>615, 518=>632, 519=>615, 520=>295, + 521=>278, 522=>295, 523=>278, 524=>787, 525=>612, 526=>787, 527=>612, 528=>695, 529=>411, 530=>695, 531=>411, 532=>732, 533=>634, 534=>732, 535=>634, 536=>635, + 537=>521, 538=>611, 539=>392, 540=>627, 541=>521, 542=>752, 543=>634, 544=>735, 545=>838, 546=>698, 547=>610, 548=>685, 549=>525, 550=>684, 551=>613, 552=>632, + 553=>615, 554=>787, 555=>612, 556=>787, 557=>612, 558=>787, 559=>612, 560=>787, 561=>612, 562=>611, 563=>592, 564=>475, 565=>843, 566=>477, 567=>278, 568=>998, + 569=>998, 570=>684, 571=>698, 572=>550, 573=>557, 574=>611, 575=>521, 576=>525, 577=>603, 578=>479, 579=>686, 580=>732, 581=>684, 582=>632, 583=>615, 584=>295, + 585=>278, 586=>781, 587=>635, 588=>695, 589=>411, 590=>611, 591=>592, 592=>613, 593=>635, 594=>635, 595=>635, 596=>550, 597=>550, 598=>635, 599=>727, 600=>615, + 601=>615, 602=>844, 603=>545, 604=>545, 605=>775, 606=>664, 607=>326, 608=>696, 609=>635, 610=>629, 611=>596, 612=>596, 613=>634, 614=>634, 615=>634, 616=>372, + 617=>387, 618=>372, 619=>396, 620=>487, 621=>278, 622=>706, 623=>974, 624=>974, 625=>974, 626=>646, 627=>642, 628=>634, 629=>612, 630=>858, 631=>728, 632=>660, + 633=>469, 634=>469, 635=>469, 636=>469, 637=>469, 638=>530, 639=>530, 640=>602, 641=>602, 642=>521, 643=>336, 644=>336, 645=>461, 646=>336, 647=>392, 648=>392, + 649=>634, 650=>618, 651=>598, 652=>592, 653=>818, 654=>592, 655=>611, 656=>525, 657=>525, 658=>578, 659=>578, 660=>510, 661=>510, 662=>510, 663=>510, 664=>787, + 665=>580, 666=>664, 667=>708, 668=>654, 669=>292, 670=>667, 671=>507, 672=>727, 673=>510, 674=>510, 675=>1014, 676=>1058, 677=>1013, 678=>824, 679=>610, 680=>778, + 681=>848, 682=>641, 683=>654, 684=>515, 685=>515, 686=>570, 687=>664, 688=>399, 689=>399, 690=>175, 691=>259, 692=>295, 693=>296, 694=>379, 695=>515, 696=>373, + 697=>278, 698=>460, 699=>318, 700=>318, 701=>318, 702=>307, 703=>307, 704=>370, 705=>370, 706=>500, 707=>500, 708=>500, 709=>500, 711=>500, 712=>275, 713=>500, + 714=>500, 715=>500, 716=>275, 717=>500, 718=>500, 719=>500, 720=>337, 721=>337, 722=>307, 723=>307, 724=>500, 725=>500, 726=>413, 727=>500, 728=>500, 729=>500, + 730=>500, 731=>500, 733=>500, 734=>315, 735=>500, 736=>426, 737=>166, 738=>373, 739=>444, 740=>370, 741=>493, 742=>493, 743=>493, 744=>493, 745=>493, 748=>500, + 749=>500, 750=>500, 755=>500, 759=>500, 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 773=>0, 774=>0, 775=>0, 776=>0, 777=>0, 778=>0, 779=>0, + 780=>0, 781=>0, 782=>0, 783=>0, 784=>0, 785=>0, 786=>0, 787=>0, 788=>0, 789=>0, 790=>0, 791=>0, 792=>0, 793=>0, 794=>0, 795=>0, + 796=>0, 797=>0, 798=>0, 799=>0, 800=>0, 801=>0, 802=>0, 803=>0, 804=>0, 805=>0, 806=>0, 807=>0, 808=>0, 809=>0, 810=>0, 811=>0, + 812=>0, 813=>0, 814=>0, 815=>0, 816=>0, 817=>0, 818=>0, 819=>0, 820=>0, 821=>0, 822=>0, 823=>0, 824=>0, 825=>0, 826=>0, 827=>0, + 828=>0, 829=>0, 830=>0, 831=>0, 832=>0, 833=>0, 834=>0, 835=>0, 836=>0, 837=>0, 838=>0, 839=>0, 840=>0, 841=>0, 842=>0, 843=>0, + 844=>0, 845=>0, 846=>0, 847=>0, 849=>0, 855=>0, 856=>0, 860=>0, 861=>0, 862=>0, 863=>0, 864=>0, 865=>0, 866=>0, 884=>278, 885=>278, + 890=>500, 891=>549, 892=>550, 893=>549, 894=>337, 900=>500, 901=>500, 902=>695, 903=>318, 904=>767, 905=>903, 906=>435, 908=>839, 910=>860, 911=>905, 912=>338, + 913=>684, 914=>686, 915=>557, 916=>684, 917=>632, 918=>685, 919=>752, 920=>787, 921=>295, 922=>656, 923=>684, 924=>863, 925=>748, 926=>632, 927=>787, 928=>752, + 929=>603, 931=>632, 932=>611, 933=>611, 934=>787, 935=>685, 936=>787, 937=>764, 938=>295, 939=>611, 940=>659, 941=>543, 942=>631, 943=>338, 944=>579, 945=>659, + 946=>638, 947=>592, 948=>612, 949=>541, 950=>544, 951=>634, 952=>612, 953=>338, 954=>589, 955=>592, 956=>636, 957=>559, 958=>558, 959=>612, 960=>602, 961=>635, + 962=>587, 963=>634, 964=>602, 965=>579, 966=>660, 967=>592, 968=>660, 969=>837, 970=>338, 971=>579, 972=>612, 973=>579, 974=>837, 976=>614, 977=>619, 978=>699, + 979=>842, 980=>699, 981=>660, 982=>837, 983=>664, 984=>787, 985=>612, 986=>648, 987=>587, 988=>575, 989=>458, 990=>660, 991=>660, 992=>865, 993=>627, 994=>934, + 995=>837, 996=>758, 997=>659, 998=>792, 999=>615, 1000=>687, 1001=>607, 1002=>768, 1003=>625, 1004=>699, 1005=>612, 1006=>611, 1007=>536, 1008=>664, 1009=>635, 1010=>550, + 1011=>278, 1012=>787, 1013=>615, 1014=>615, 1015=>608, 1016=>635, 1017=>698, 1018=>863, 1019=>651, 1020=>635, 1021=>703, 1022=>698, 1023=>703, 1024=>632, 1025=>632, 1026=>786, + 1028=>698, 1029=>635, 1030=>295, 1031=>295, 1032=>295, 1033=>1094, 1034=>1045, 1035=>786, 1037=>748, 1038=>609, 1040=>684, 1041=>686, 1042=>686, 1043=>557, 1044=>781, 1045=>632, + 1046=>1077, 1047=>641, 1048=>748, 1049=>748, 1050=>710, 1051=>752, 1052=>863, 1053=>752, 1054=>787, 1055=>752, 1056=>603, 1057=>698, 1058=>611, 1059=>609, 1060=>861, 1061=>685, + 1062=>776, 1063=>686, 1064=>1069, 1065=>1094, 1066=>833, 1067=>818, 1068=>686, 1069=>698, 1070=>1080, 1071=>695, 1072=>613, 1073=>617, 1074=>589, 1075=>525, 1076=>691, 1077=>615, + 1078=>901, 1079=>532, 1080=>650, 1081=>650, 1082=>604, 1083=>639, 1084=>754, 1085=>654, 1086=>612, 1087=>654, 1088=>635, 1089=>550, 1090=>583, 1091=>592, 1092=>855, 1093=>592, + 1094=>681, 1095=>591, 1096=>915, 1097=>942, 1098=>707, 1099=>790, 1100=>589, 1101=>549, 1102=>842, 1103=>602, 1104=>615, 1105=>615, 1106=>625, 1107=>525, 1108=>549, 1109=>521, + 1110=>278, 1111=>278, 1112=>278, 1113=>902, 1114=>898, 1115=>652, 1117=>650, 1118=>592, 1119=>654, 1120=>934, 1121=>837, 1122=>771, 1123=>672, 1124=>942, 1125=>749, 1126=>879, + 1127=>783, 1128=>1160, 1129=>1001, 1130=>787, 1131=>612, 1132=>1027, 1133=>824, 1134=>636, 1135=>541, 1136=>856, 1137=>876, 1138=>787, 1139=>592, 1140=>781, 1141=>665, 1142=>781, + 1143=>665, 1144=>992, 1145=>904, 1146=>953, 1147=>758, 1148=>1180, 1149=>1028, 1150=>934, 1151=>837, 1152=>698, 1153=>550, 1154=>502, 1155=>0, 1156=>0, 1157=>0, 1158=>0, + 1160=>418, 1161=>418, 1162=>748, 1163=>657, 1164=>686, 1165=>589, 1166=>603, 1167=>635, 1168=>610, 1169=>525, 1170=>675, 1171=>556, 1172=>557, 1173=>491, 1174=>1077, 1175=>901, + 1176=>641, 1177=>532, 1178=>710, 1179=>604, 1180=>710, 1181=>604, 1182=>710, 1183=>604, 1184=>856, 1185=>832, 1186=>752, 1187=>661, 1188=>1014, 1189=>877, 1190=>1113, 1191=>950, + 1192=>796, 1193=>651, 1194=>698, 1195=>550, 1196=>611, 1197=>529, 1198=>611, 1199=>592, 1200=>611, 1201=>592, 1202=>685, 1203=>592, 1204=>934, 1205=>807, 1206=>686, 1207=>591, + 1208=>686, 1209=>591, 1210=>686, 1211=>634, 1212=>929, 1213=>731, 1214=>929, 1215=>731, 1216=>295, 1217=>1077, 1218=>901, 1219=>655, 1220=>604, 1221=>752, 1222=>639, 1223=>752, + 1224=>661, 1225=>752, 1226=>661, 1227=>686, 1228=>591, 1229=>863, 1230=>754, 1231=>278, 1232=>684, 1233=>613, 1234=>684, 1235=>613, 1236=>974, 1237=>995, 1238=>632, 1239=>615, + 1240=>787, 1241=>615, 1242=>787, 1243=>615, 1244=>1077, 1245=>901, 1246=>641, 1247=>532, 1248=>666, 1249=>578, 1250=>748, 1251=>650, 1252=>748, 1253=>650, 1254=>787, 1255=>612, + 1256=>787, 1257=>612, 1258=>787, 1259=>612, 1260=>698, 1261=>549, 1262=>609, 1263=>592, 1264=>609, 1265=>592, 1266=>609, 1267=>592, 1268=>686, 1269=>591, 1270=>557, 1271=>491, + 1272=>818, 1273=>790, 1274=>675, 1275=>556, 1276=>685, 1277=>592, 1278=>685, 1279=>592, 1280=>686, 1281=>589, 1282=>1006, 1283=>897, 1284=>975, 1285=>869, 1286=>679, 1287=>588, + 1288=>1072, 1289=>957, 1290=>1072, 1291=>967, 1292=>775, 1293=>660, 1294=>773, 1295=>711, 1296=>614, 1297=>541, 1298=>752, 1299=>639, 1329=>867, 1330=>732, 1331=>882, 1332=>882, + 1333=>732, 1334=>644, 1335=>682, 1336=>732, 1337=>851, 1338=>882, 1339=>732, 1340=>557, 1341=>824, 1342=>986, 1343=>732, 1344=>707, 1345=>644, 1346=>882, 1347=>777, 1348=>882, + 1349=>732, 1350=>840, 1351=>732, 1352=>732, 1353=>732, 1354=>791, 1355=>644, 1356=>882, 1357=>732, 1358=>882, 1359=>635, 1360=>732, 1361=>732, 1362=>799, 1363=>861, 1364=>790, + 1365=>787, 1366=>635, 1369=>307, 1370=>318, 1371=>500, 1372=>500, 1373=>392, 1374=>526, 1375=>500, 1377=>974, 1378=>634, 1379=>762, 1380=>767, 1381=>634, 1382=>697, 1383=>533, + 1384=>634, 1385=>700, 1386=>697, 1387=>634, 1388=>404, 1389=>894, 1390=>641, 1391=>634, 1392=>634, 1393=>635, 1394=>702, 1395=>634, 1396=>659, 1397=>278, 1398=>760, 1399=>516, + 1400=>634, 1401=>453, 1402=>974, 1403=>516, 1404=>769, 1405=>634, 1406=>696, 1407=>974, 1408=>634, 1409=>690, 1410=>501, 1411=>974, 1412=>648, 1413=>612, 1414=>629, 1415=>763, + 1417=>337, 1418=>433, 1456=>0, 1457=>0, 1458=>0, 1459=>0, 1460=>0, 1461=>0, 1462=>0, 1463=>0, 1464=>0, 1465=>0, 1467=>0, 1468=>0, 1469=>0, 1471=>0, + 1472=>295, 1473=>0, 1474=>0, 1475=>295, 1478=>456, 1479=>0, 1488=>629, 1489=>608, 1490=>448, 1491=>594, 1492=>640, 1493=>272, 1494=>423, 1495=>640, 1496=>648, 1497=>272, + 1498=>592, 1499=>556, 1500=>599, 1501=>640, 1502=>659, 1503=>272, 1504=>441, 1505=>700, 1506=>636, 1507=>640, 1508=>604, 1509=>521, 1510=>581, 1511=>663, 1512=>592, 1513=>808, + 1514=>657, 1520=>471, 1521=>454, 1522=>471, 3647=>652, 3713=>670, 3714=>684, 3716=>688, 3719=>482, 3720=>628, 3722=>684, 3725=>688, 3732=>642, 3733=>642, 3734=>672, 3735=>655, + 3737=>641, 3738=>592, 3739=>592, 3740=>745, 3741=>767, 3742=>687, 3743=>687, 3745=>702, 3746=>688, 3747=>684, 3749=>649, 3751=>632, 3754=>703, 3755=>819, 3757=>633, 3758=>684, + 3759=>788, 3760=>632, 3761=>0, 3762=>539, 3763=>539, 3764=>0, 3765=>0, 3766=>0, 3767=>0, 3768=>0, 3769=>0, 3771=>0, 3772=>0, 3773=>663, 3776=>360, 3777=>679, + 3778=>460, 3779=>547, 3780=>491, 3782=>674, 3784=>0, 3785=>0, 3786=>0, 3787=>0, 3788=>0, 3789=>0, 3804=>1028, 3805=>1028, 5121=>684, 5122=>684, 5123=>684, 5124=>684, + 5125=>769, 5126=>809, 5127=>809, 5129=>809, 5130=>769, 5131=>719, 5132=>835, 5133=>834, 5134=>835, 5135=>834, 5136=>835, 5137=>834, 5138=>967, 5139=>1007, 5140=>967, 5141=>1007, + 5142=>809, 5143=>967, 5144=>1007, 5145=>967, 5146=>1007, 5147=>719, 5149=>256, 5150=>543, 5151=>423, 5152=>423, 5153=>389, 5154=>389, 5155=>393, 5156=>389, 5157=>466, 5158=>385, + 5159=>256, 5160=>389, 5161=>389, 5162=>389, 5163=>1090, 5164=>909, 5165=>953, 5166=>1117, 5167=>684, 5168=>684, 5169=>684, 5170=>684, 5171=>729, 5172=>629, 5173=>629, 5175=>629, + 5176=>729, 5177=>629, 5178=>835, 5179=>684, 5180=>835, 5181=>834, 5182=>835, 5183=>834, 5184=>967, 5185=>1007, 5186=>967, 5187=>1007, 5188=>967, 5189=>1007, 5190=>967, 5191=>1007, + 5192=>729, 5193=>508, 5194=>192, 5196=>732, 5197=>732, 5198=>732, 5199=>732, 5200=>730, 5201=>730, 5202=>730, 5204=>730, 5205=>730, 5206=>730, 5207=>921, 5208=>889, 5209=>921, + 5210=>889, 5211=>921, 5212=>889, 5213=>928, 5214=>900, 5215=>928, 5216=>900, 5217=>947, 5218=>900, 5219=>947, 5220=>900, 5221=>947, 5222=>434, 5223=>877, 5224=>877, 5225=>866, + 5226=>890, 5227=>628, 5228=>628, 5229=>628, 5230=>628, 5231=>628, 5232=>628, 5233=>628, 5234=>628, 5235=>628, 5236=>860, 5237=>771, 5238=>815, 5239=>816, 5240=>815, 5241=>816, + 5242=>860, 5243=>771, 5244=>860, 5245=>771, 5246=>815, 5247=>816, 5248=>815, 5249=>816, 5250=>815, 5251=>407, 5252=>407, 5253=>750, 5254=>775, 5255=>750, 5256=>775, 5257=>628, + 5258=>628, 5259=>628, 5260=>628, 5261=>628, 5262=>628, 5263=>628, 5264=>628, 5265=>628, 5266=>860, 5267=>771, 5268=>815, 5269=>816, 5270=>815, 5271=>816, 5272=>860, 5273=>771, + 5274=>860, 5275=>771, 5276=>815, 5277=>816, 5278=>815, 5279=>816, 5280=>815, 5281=>435, 5282=>435, 5283=>610, 5284=>522, 5285=>557, 5286=>522, 5287=>610, 5288=>610, 5289=>522, + 5290=>557, 5291=>557, 5292=>749, 5293=>769, 5294=>746, 5295=>764, 5296=>746, 5297=>764, 5298=>749, 5299=>769, 5300=>749, 5301=>769, 5302=>746, 5303=>764, 5304=>746, 5305=>764, + 5306=>746, 5307=>386, 5308=>508, 5309=>386, 5312=>852, 5313=>852, 5314=>852, 5315=>852, 5316=>852, 5317=>799, 5318=>799, 5319=>852, 5320=>799, 5321=>1069, 5322=>1035, 5323=>1059, + 5324=>852, 5325=>1059, 5326=>799, 5327=>852, 5328=>600, 5329=>453, 5330=>600, 5331=>852, 5332=>852, 5333=>852, 5334=>852, 5335=>852, 5336=>799, 5337=>799, 5338=>852, 5339=>799, + 5340=>1069, 5341=>1035, 5342=>1059, 5343=>1030, 5344=>1059, 5345=>1030, 5346=>1069, 5347=>1035, 5348=>1069, 5349=>1035, 5350=>1083, 5351=>1030, 5352=>1083, 5353=>1030, 5354=>600, 5356=>729, + 5357=>603, 5358=>603, 5359=>603, 5360=>603, 5361=>603, 5362=>603, 5363=>603, 5364=>603, 5365=>603, 5366=>834, 5367=>754, 5368=>792, 5369=>771, 5370=>792, 5371=>771, 5372=>834, + 5373=>754, 5374=>834, 5375=>754, 5376=>792, 5377=>771, 5378=>792, 5379=>771, 5380=>792, 5381=>418, 5382=>420, 5383=>418, 5392=>712, 5393=>712, 5394=>712, 5395=>892, 5396=>892, + 5397=>892, 5398=>892, 5399=>910, 5400=>872, 5401=>910, 5402=>872, 5403=>910, 5404=>872, 5405=>1140, 5406=>1100, 5407=>1140, 5408=>1100, 5409=>1140, 5410=>1100, 5411=>1140, 5412=>1100, + 5413=>641, 5414=>627, 5415=>627, 5416=>627, 5417=>627, 5418=>627, 5419=>627, 5420=>627, 5421=>627, 5422=>627, 5423=>844, 5424=>781, 5425=>816, 5426=>818, 5427=>816, 5428=>818, + 5429=>844, 5430=>781, 5431=>844, 5432=>781, 5433=>816, 5434=>818, 5435=>816, 5436=>818, 5437=>816, 5438=>418, 5440=>389, 5441=>484, 5442=>916, 5443=>916, 5444=>863, 5445=>916, + 5446=>863, 5447=>863, 5448=>603, 5449=>603, 5450=>603, 5451=>603, 5452=>603, 5453=>603, 5454=>834, 5455=>754, 5456=>418, 5458=>729, 5459=>684, 5460=>684, 5461=>684, 5462=>684, + 5463=>726, 5464=>672, 5465=>726, 5466=>726, 5467=>924, 5468=>1007, 5469=>508, 5470=>732, 5471=>732, 5472=>732, 5473=>732, 5474=>732, 5475=>732, 5476=>730, 5477=>730, 5478=>730, + 5479=>730, 5480=>947, 5481=>900, 5482=>508, 5492=>831, 5493=>831, 5494=>831, 5495=>831, 5496=>831, 5497=>831, 5498=>831, 5499=>563, 5500=>752, 5501=>484, 5502=>1047, 5503=>1047, + 5504=>1047, 5505=>1047, 5506=>1047, 5507=>1047, 5508=>1047, 5509=>825, 5514=>831, 5515=>831, 5516=>831, 5517=>831, 5518=>1259, 5519=>1259, 5520=>1259, 5521=>1002, 5522=>1002, 5523=>1259, + 5524=>1259, 5525=>700, 5526=>1073, 5536=>852, 5537=>852, 5538=>799, 5539=>799, 5540=>799, 5541=>799, 5542=>600, 5543=>643, 5544=>643, 5545=>643, 5546=>643, 5547=>643, 5548=>643, + 5549=>643, 5550=>418, 5551=>628, 5598=>770, 5601=>770, 5702=>468, 5703=>468, 5742=>444, 5743=>1047, 5744=>1310, 5745=>1632, 5746=>1632, 5747=>1375, 5748=>1375, 5749=>1632, 5750=>1632, + 7424=>592, 7425=>717, 7426=>982, 7427=>586, 7428=>550, 7429=>605, 7430=>605, 7431=>491, 7432=>541, 7433=>278, 7434=>395, 7435=>579, 7436=>583, 7437=>754, 7438=>650, 7439=>612, + 7440=>550, 7441=>684, 7442=>684, 7443=>684, 7444=>1023, 7446=>612, 7447=>612, 7448=>524, 7449=>602, 7450=>602, 7451=>583, 7452=>574, 7453=>737, 7454=>948, 7455=>638, 7456=>592, + 7457=>818, 7458=>525, 7459=>526, 7462=>583, 7463=>592, 7464=>564, 7465=>524, 7466=>590, 7467=>639, 7468=>431, 7469=>613, 7470=>432, 7472=>485, 7473=>398, 7474=>398, 7475=>488, + 7476=>474, 7477=>186, 7478=>186, 7479=>413, 7480=>351, 7481=>543, 7482=>471, 7483=>471, 7484=>496, 7485=>439, 7486=>380, 7487=>438, 7488=>385, 7489=>461, 7490=>623, 7491=>392, + 7492=>392, 7493=>405, 7494=>648, 7495=>428, 7496=>405, 7497=>417, 7498=>417, 7499=>360, 7500=>359, 7501=>405, 7502=>179, 7503=>426, 7504=>623, 7505=>409, 7506=>414, 7507=>370, + 7508=>414, 7509=>414, 7510=>428, 7511=>295, 7512=>405, 7513=>470, 7514=>623, 7515=>417, 7516=>1000, 7517=>402, 7518=>373, 7519=>385, 7520=>416, 7521=>364, 7522=>179, 7523=>259, + 7524=>405, 7525=>417, 7526=>402, 7527=>373, 7528=>385, 7529=>416, 7530=>364, 7543=>635, 7544=>474, 7547=>372, 7557=>278, 7579=>405, 7580=>370, 7581=>370, 7582=>414, 7583=>360, + 7584=>296, 7585=>233, 7586=>405, 7587=>405, 7588=>261, 7589=>250, 7590=>261, 7591=>261, 7592=>234, 7593=>250, 7594=>235, 7595=>376, 7596=>623, 7597=>623, 7598=>411, 7599=>479, + 7600=>409, 7601=>414, 7602=>414, 7603=>360, 7604=>287, 7605=>295, 7606=>508, 7607=>418, 7608=>361, 7609=>406, 7610=>417, 7611=>366, 7612=>437, 7613=>366, 7614=>392, 7615=>414, + 7620=>0, 7621=>0, 7622=>0, 7623=>0, 7624=>0, 7625=>0, 7680=>684, 7681=>613, 7682=>686, 7683=>635, 7684=>686, 7685=>635, 7686=>686, 7687=>635, 7688=>698, 7689=>550, + 7690=>770, 7691=>635, 7692=>770, 7693=>635, 7694=>770, 7695=>635, 7696=>770, 7697=>635, 7698=>770, 7699=>635, 7700=>632, 7701=>615, 7702=>632, 7703=>615, 7704=>632, 7705=>615, + 7706=>632, 7707=>615, 7708=>632, 7709=>615, 7710=>575, 7711=>352, 7712=>775, 7713=>635, 7714=>752, 7715=>634, 7716=>752, 7717=>634, 7718=>752, 7719=>634, 7720=>752, 7721=>634, + 7722=>752, 7723=>634, 7724=>295, 7725=>278, 7726=>295, 7727=>278, 7728=>656, 7729=>579, 7730=>656, 7731=>579, 7732=>656, 7733=>579, 7734=>557, 7735=>278, 7736=>557, 7737=>278, + 7738=>557, 7739=>278, 7740=>557, 7741=>278, 7742=>863, 7743=>974, 7744=>863, 7745=>974, 7746=>863, 7747=>974, 7748=>748, 7749=>634, 7750=>748, 7751=>634, 7752=>748, 7753=>634, + 7754=>748, 7755=>634, 7756=>787, 7757=>612, 7758=>787, 7759=>612, 7760=>787, 7761=>612, 7762=>787, 7763=>612, 7764=>603, 7765=>635, 7766=>603, 7767=>635, 7768=>695, 7769=>411, + 7770=>695, 7771=>411, 7772=>695, 7773=>411, 7774=>695, 7775=>411, 7776=>635, 7777=>521, 7778=>635, 7779=>521, 7780=>635, 7781=>521, 7782=>635, 7783=>521, 7784=>635, 7785=>521, + 7786=>611, 7787=>392, 7788=>611, 7789=>392, 7790=>611, 7791=>392, 7792=>611, 7793=>392, 7794=>732, 7795=>634, 7796=>732, 7797=>634, 7798=>732, 7799=>634, 7800=>732, 7801=>634, + 7802=>732, 7803=>634, 7804=>684, 7805=>592, 7806=>684, 7807=>592, 7808=>989, 7809=>818, 7810=>989, 7811=>818, 7812=>989, 7813=>818, 7814=>989, 7815=>818, 7816=>989, 7817=>818, + 7818=>685, 7819=>592, 7820=>685, 7821=>592, 7822=>611, 7823=>592, 7824=>685, 7825=>525, 7826=>685, 7827=>525, 7828=>685, 7829=>525, 7830=>634, 7831=>392, 7832=>818, 7833=>592, + 7834=>613, 7835=>352, 7840=>684, 7841=>613, 7842=>684, 7843=>613, 7844=>684, 7845=>613, 7846=>684, 7847=>613, 7848=>684, 7849=>613, 7850=>684, 7851=>613, 7852=>684, 7853=>613, + 7854=>684, 7855=>613, 7856=>684, 7857=>613, 7858=>684, 7859=>613, 7860=>684, 7861=>613, 7862=>684, 7863=>613, 7864=>632, 7865=>615, 7866=>632, 7867=>615, 7868=>632, 7869=>615, + 7870=>632, 7871=>615, 7872=>632, 7873=>615, 7874=>632, 7875=>615, 7876=>632, 7877=>615, 7878=>632, 7879=>615, 7880=>295, 7881=>278, 7882=>295, 7883=>278, 7884=>787, 7885=>612, + 7886=>787, 7887=>612, 7888=>787, 7889=>612, 7890=>787, 7891=>612, 7892=>787, 7893=>612, 7894=>787, 7895=>612, 7896=>787, 7897=>612, 7898=>913, 7899=>612, 7900=>913, 7901=>612, + 7902=>913, 7903=>612, 7904=>913, 7905=>612, 7906=>913, 7907=>612, 7908=>732, 7909=>634, 7910=>732, 7911=>634, 7912=>838, 7913=>634, 7914=>838, 7915=>634, 7916=>838, 7917=>634, + 7918=>838, 7919=>634, 7920=>838, 7921=>634, 7922=>611, 7923=>592, 7924=>611, 7925=>592, 7926=>611, 7927=>592, 7928=>611, 7929=>592, 7936=>659, 7937=>659, 7938=>659, 7939=>659, + 7940=>659, 7941=>659, 7942=>659, 7943=>659, 7944=>684, 7945=>684, 7946=>877, 7947=>877, 7948=>769, 7949=>801, 7950=>708, 7951=>743, 7952=>541, 7953=>541, 7954=>541, 7955=>541, + 7956=>541, 7957=>541, 7960=>711, 7961=>711, 7962=>966, 7963=>975, 7964=>898, 7965=>928, 7968=>634, 7969=>634, 7970=>634, 7971=>634, 7972=>634, 7973=>634, 7974=>634, 7975=>634, + 7976=>837, 7977=>835, 7978=>1086, 7979=>1089, 7980=>1027, 7981=>1051, 7982=>934, 7983=>947, 7984=>338, 7985=>338, 7986=>338, 7987=>338, 7988=>338, 7989=>338, 7990=>338, 7991=>338, + 7992=>380, 7993=>374, 7994=>635, 7995=>635, 7996=>570, 7997=>600, 7998=>489, 7999=>493, 8000=>612, 8001=>612, 8002=>612, 8003=>612, 8004=>612, 8005=>612, 8008=>804, 8009=>848, + 8010=>1095, 8011=>1100, 8012=>938, 8013=>970, 8016=>579, 8017=>579, 8018=>579, 8019=>579, 8020=>579, 8021=>579, 8022=>579, 8023=>579, 8025=>784, 8027=>998, 8029=>1012, 8031=>897, + 8032=>837, 8033=>837, 8034=>837, 8035=>837, 8036=>837, 8037=>837, 8038=>837, 8039=>837, 8040=>802, 8041=>843, 8042=>1089, 8043=>1095, 8044=>946, 8045=>972, 8046=>921, 8047=>952, + 8048=>659, 8049=>659, 8050=>541, 8051=>548, 8052=>634, 8053=>654, 8054=>338, 8055=>338, 8056=>612, 8057=>612, 8058=>579, 8059=>579, 8060=>837, 8061=>837, 8064=>659, 8065=>659, + 8066=>659, 8067=>659, 8068=>659, 8069=>659, 8070=>659, 8071=>659, 8072=>684, 8073=>684, 8074=>877, 8075=>877, 8076=>769, 8077=>801, 8078=>708, 8079=>743, 8080=>634, 8081=>634, + 8082=>634, 8083=>634, 8084=>634, 8085=>634, 8086=>634, 8087=>634, 8088=>837, 8089=>835, 8090=>1086, 8091=>1089, 8092=>1027, 8093=>1051, 8094=>934, 8095=>947, 8096=>837, 8097=>837, + 8098=>837, 8099=>837, 8100=>837, 8101=>837, 8102=>837, 8103=>837, 8104=>802, 8105=>843, 8106=>1089, 8107=>1095, 8108=>946, 8109=>972, 8110=>921, 8111=>952, 8112=>659, 8113=>659, + 8114=>659, 8115=>659, 8116=>659, 8118=>659, 8119=>659, 8120=>684, 8121=>684, 8122=>716, 8123=>692, 8124=>684, 8125=>500, 8126=>500, 8127=>500, 8128=>500, 8129=>500, 8130=>634, + 8131=>634, 8132=>654, 8134=>634, 8135=>634, 8136=>805, 8137=>746, 8138=>931, 8139=>871, 8140=>752, 8141=>500, 8142=>500, 8143=>500, 8144=>338, 8145=>338, 8146=>338, 8147=>338, + 8150=>338, 8151=>338, 8152=>295, 8153=>295, 8154=>475, 8155=>408, 8157=>500, 8158=>500, 8159=>500, 8160=>579, 8161=>579, 8162=>579, 8163=>579, 8164=>635, 8165=>635, 8166=>579, + 8167=>579, 8168=>611, 8169=>611, 8170=>845, 8171=>825, 8172=>685, 8173=>500, 8174=>500, 8175=>500, 8178=>837, 8179=>837, 8180=>837, 8182=>837, 8183=>837, 8184=>941, 8185=>813, + 8186=>922, 8187=>826, 8188=>764, 8189=>500, 8190=>500, 8192=>500, 8193=>1000, 8194=>500, 8195=>1000, 8196=>330, 8197=>250, 8198=>167, 8199=>636, 8200=>318, 8201=>200, 8202=>100, + 8203=>0, 8204=>0, 8205=>0, 8206=>0, 8207=>0, 8208=>361, 8209=>361, 8210=>636, 8213=>1000, 8214=>0, 8215=>500, 8219=>318, 8223=>518, 8227=>590, 8228=>333, 8229=>667, + 8231=>318, 8234=>0, 8235=>0, 8236=>0, 8237=>0, 8238=>0, 8239=>200, 8241=>1690, 8242=>227, 8243=>374, 8244=>520, 8245=>227, 8246=>374, 8247=>520, 8248=>339, 8251=>838, + 8252=>485, 8253=>531, 8254=>500, 8255=>804, 8256=>804, 8257=>250, 8258=>1000, 8259=>500, 8260=>167, 8261=>390, 8262=>390, 8263=>922, 8264=>733, 8265=>733, 8266=>497, 8267=>636, + 8268=>500, 8269=>500, 8270=>500, 8271=>337, 8272=>804, 8273=>500, 8274=>450, 8275=>838, 8276=>804, 8277=>838, 8278=>586, 8279=>663, 8280=>838, 8281=>838, 8282=>318, 8283=>797, + 8284=>838, 8285=>318, 8286=>318, 8287=>222, 8288=>0, 8289=>0, 8290=>0, 8291=>0, 8298=>0, 8299=>0, 8300=>0, 8301=>0, 8302=>0, 8303=>0, 8304=>401, 8305=>179, + 8308=>401, 8309=>401, 8310=>401, 8311=>401, 8312=>401, 8313=>401, 8314=>528, 8315=>528, 8316=>528, 8317=>246, 8318=>246, 8319=>399, 8320=>401, 8321=>401, 8322=>401, 8323=>401, + 8324=>401, 8325=>401, 8326=>401, 8327=>401, 8328=>401, 8329=>401, 8330=>528, 8331=>528, 8332=>528, 8333=>246, 8334=>246, 8336=>392, 8337=>417, 8338=>414, 8339=>444, 8340=>417, + 8352=>877, 8353=>636, 8354=>636, 8355=>636, 8356=>636, 8357=>974, 8358=>748, 8359=>1271, 8360=>1074, 8361=>989, 8362=>838, 8363=>636, 8365=>656, 8366=>611, 8367=>1272, 8368=>636, + 8369=>636, 8370=>636, 8371=>636, 8372=>774, 8373=>641, 8400=>0, 8401=>0, 8406=>0, 8407=>0, 8448=>970, 8449=>970, 8450=>698, 8451=>1123, 8452=>896, 8453=>969, 8454=>1032, + 8455=>614, 8456=>698, 8457=>952, 8459=>988, 8460=>720, 8461=>850, 8462=>634, 8463=>634, 8464=>470, 8465=>697, 8466=>720, 8467=>413, 8468=>818, 8469=>801, 8470=>1040, 8471=>1000, + 8472=>697, 8473=>702, 8474=>787, 8475=>798, 8476=>814, 8477=>792, 8478=>896, 8479=>684, 8480=>1020, 8481=>1014, 8483=>684, 8484=>745, 8485=>578, 8486=>764, 8487=>764, 8488=>616, + 8489=>338, 8490=>656, 8491=>684, 8492=>786, 8493=>703, 8494=>854, 8495=>592, 8496=>605, 8497=>786, 8498=>575, 8499=>1069, 8500=>462, 8501=>745, 8502=>674, 8503=>450, 8504=>695, + 8505=>380, 8506=>926, 8507=>1157, 8508=>702, 8509=>728, 8510=>655, 8511=>849, 8512=>811, 8513=>775, 8514=>557, 8515=>557, 8516=>611, 8517=>819, 8518=>708, 8519=>615, 8520=>351, + 8521=>351, 8523=>780, 8526=>526, 8531=>969, 8532=>969, 8533=>969, 8534=>969, 8535=>969, 8536=>969, 8537=>969, 8538=>969, 8539=>969, 8540=>969, 8541=>969, 8542=>969, 8543=>568, + 8544=>295, 8545=>492, 8546=>689, 8547=>923, 8548=>684, 8549=>922, 8550=>1120, 8551=>1317, 8552=>917, 8553=>685, 8554=>933, 8555=>1131, 8556=>557, 8557=>698, 8558=>770, 8559=>863, + 8560=>278, 8561=>458, 8562=>637, 8563=>812, 8564=>592, 8565=>811, 8566=>991, 8567=>1170, 8568=>819, 8569=>592, 8570=>822, 8571=>1002, 8572=>278, 8573=>550, 8574=>635, 8575=>974, + 8576=>1245, 8577=>770, 8578=>1245, 8579=>703, 8580=>549, 8592=>838, 8593=>838, 8594=>838, 8595=>838, 8596=>838, 8597=>838, 8598=>838, 8599=>838, 8600=>838, 8601=>838, 8602=>838, + 8603=>838, 8604=>838, 8605=>838, 8606=>838, 8607=>838, 8608=>838, 8609=>838, 8610=>838, 8611=>838, 8612=>838, 8613=>838, 8614=>838, 8615=>838, 8616=>838, 8617=>838, 8618=>838, + 8619=>838, 8620=>838, 8621=>838, 8622=>838, 8623=>838, 8624=>838, 8625=>838, 8626=>838, 8627=>838, 8628=>838, 8629=>838, 8630=>838, 8631=>838, 8632=>838, 8633=>838, 8634=>838, + 8635=>838, 8636=>838, 8637=>838, 8638=>838, 8639=>838, 8640=>838, 8641=>838, 8642=>838, 8643=>838, 8644=>838, 8645=>838, 8646=>838, 8647=>838, 8648=>838, 8649=>838, 8650=>838, + 8651=>838, 8652=>838, 8653=>838, 8654=>838, 8655=>838, 8656=>838, 8657=>838, 8658=>838, 8659=>838, 8660=>838, 8661=>838, 8662=>838, 8663=>838, 8664=>838, 8665=>838, 8666=>838, + 8667=>838, 8668=>838, 8669=>838, 8670=>838, 8671=>838, 8672=>838, 8673=>838, 8674=>838, 8675=>838, 8676=>838, 8677=>838, 8678=>838, 8679=>838, 8680=>838, 8681=>838, 8682=>838, + 8683=>838, 8684=>838, 8685=>838, 8686=>838, 8687=>838, 8688=>838, 8689=>838, 8690=>838, 8691=>838, 8692=>838, 8693=>838, 8694=>838, 8695=>838, 8696=>838, 8697=>838, 8698=>838, + 8699=>838, 8700=>838, 8701=>838, 8702=>838, 8703=>838, 8704=>684, 8705=>636, 8706=>517, 8707=>632, 8708=>632, 8709=>871, 8710=>669, 8711=>669, 8712=>871, 8713=>871, 8714=>718, + 8715=>871, 8716=>871, 8717=>718, 8718=>636, 8719=>757, 8720=>757, 8721=>674, 8722=>838, 8723=>838, 8724=>838, 8725=>167, 8726=>637, 8727=>838, 8728=>626, 8729=>318, 8730=>637, + 8731=>637, 8732=>637, 8733=>677, 8734=>833, 8735=>838, 8736=>896, 8737=>896, 8738=>838, 8739=>500, 8740=>500, 8741=>500, 8742=>500, 8743=>732, 8744=>732, 8745=>732, 8746=>732, + 8747=>521, 8748=>789, 8749=>1057, 8750=>521, 8751=>789, 8752=>1057, 8753=>521, 8754=>521, 8755=>521, 8756=>636, 8757=>636, 8758=>260, 8759=>636, 8760=>838, 8761=>838, 8762=>838, + 8763=>838, 8764=>838, 8765=>838, 8766=>838, 8767=>838, 8768=>375, 8769=>838, 8770=>838, 8771=>838, 8772=>838, 8773=>838, 8774=>838, 8775=>838, 8776=>838, 8777=>838, 8778=>838, + 8779=>838, 8780=>838, 8781=>838, 8782=>838, 8783=>838, 8784=>838, 8785=>838, 8786=>838, 8787=>838, 8788=>1000, 8789=>1000, 8790=>838, 8791=>838, 8792=>838, 8793=>838, 8794=>838, + 8795=>838, 8796=>838, 8797=>838, 8798=>838, 8799=>838, 8800=>838, 8801=>838, 8802=>838, 8803=>838, 8804=>838, 8805=>838, 8806=>838, 8807=>838, 8808=>838, 8809=>838, 8810=>1047, + 8811=>1047, 8812=>464, 8813=>838, 8814=>838, 8815=>838, 8816=>838, 8817=>838, 8818=>838, 8819=>838, 8820=>838, 8821=>838, 8822=>838, 8823=>838, 8824=>838, 8825=>838, 8826=>838, + 8827=>838, 8828=>838, 8829=>838, 8830=>838, 8831=>838, 8832=>838, 8833=>838, 8834=>838, 8835=>838, 8836=>838, 8837=>838, 8838=>838, 8839=>838, 8840=>838, 8841=>838, 8842=>838, + 8843=>838, 8844=>732, 8845=>732, 8846=>732, 8847=>838, 8848=>838, 8849=>838, 8850=>838, 8851=>722, 8852=>722, 8853=>838, 8854=>838, 8855=>838, 8856=>838, 8857=>838, 8858=>838, + 8859=>838, 8860=>838, 8861=>838, 8862=>838, 8863=>838, 8864=>838, 8865=>838, 8866=>871, 8867=>871, 8868=>871, 8869=>871, 8870=>521, 8871=>521, 8872=>871, 8873=>871, 8874=>871, + 8875=>871, 8876=>871, 8877=>871, 8878=>871, 8879=>871, 8882=>838, 8883=>838, 8884=>838, 8885=>838, 8886=>1000, 8887=>1000, 8888=>838, 8889=>838, 8890=>521, 8891=>732, 8892=>732, + 8893=>732, 8896=>820, 8897=>820, 8898=>820, 8899=>820, 8900=>494, 8901=>318, 8902=>626, 8904=>1000, 8905=>1000, 8906=>1000, 8907=>1000, 8908=>1000, 8909=>838, 8918=>838, 8919=>838, + 8920=>1422, 8921=>1422, 8922=>838, 8923=>838, 8924=>838, 8925=>838, 8926=>838, 8927=>838, 8928=>838, 8929=>838, 8930=>838, 8931=>838, 8932=>838, 8933=>838, 8934=>838, 8935=>838, + 8936=>838, 8937=>838, 8938=>838, 8939=>838, 8940=>838, 8941=>838, 8946=>1000, 8947=>871, 8948=>718, 8949=>871, 8950=>871, 8951=>718, 8952=>871, 8953=>871, 8954=>1000, 8955=>871, + 8956=>718, 8957=>871, 8958=>718, 8959=>871, 8962=>635, 8966=>871, 8968=>390, 8969=>390, 8970=>390, 8971=>390, 8976=>838, 8977=>513, 8984=>1000, 8985=>838, 8992=>521, 8993=>521, + 8997=>1000, 9000=>1443, 9085=>757, 9115=>500, 9116=>500, 9117=>500, 9118=>500, 9119=>500, 9120=>500, 9121=>500, 9122=>500, 9123=>500, 9124=>500, 9125=>500, 9126=>500, 9127=>750, + 9128=>750, 9129=>750, 9130=>750, 9131=>750, 9132=>750, 9133=>750, 9134=>521, 9166=>838, 9167=>945, 9250=>635, 9251=>635, 9312=>896, 9313=>896, 9314=>896, 9315=>896, 9316=>896, + 9317=>896, 9318=>896, 9319=>896, 9320=>896, 9321=>896, 9600=>769, 9601=>769, 9602=>769, 9603=>769, 9604=>769, 9605=>769, 9606=>769, 9607=>769, 9608=>769, 9609=>769, 9610=>769, + 9611=>769, 9612=>769, 9613=>769, 9614=>769, 9615=>769, 9616=>769, 9617=>769, 9618=>769, 9619=>769, 9620=>769, 9621=>769, 9622=>769, 9623=>769, 9624=>769, 9625=>769, 9626=>769, + 9627=>769, 9628=>769, 9629=>769, 9630=>769, 9631=>769, 9632=>945, 9633=>945, 9634=>945, 9635=>945, 9636=>945, 9637=>945, 9638=>945, 9639=>945, 9640=>945, 9641=>945, 9642=>678, + 9643=>678, 9644=>945, 9645=>945, 9646=>550, 9647=>550, 9648=>769, 9649=>769, 9650=>769, 9651=>769, 9652=>502, 9653=>502, 9654=>769, 9655=>769, 9656=>502, 9657=>502, 9658=>769, + 9659=>769, 9660=>769, 9661=>769, 9662=>502, 9663=>502, 9664=>769, 9665=>769, 9666=>502, 9667=>502, 9668=>769, 9669=>769, 9670=>769, 9671=>769, 9672=>769, 9673=>873, 9674=>494, + 9675=>873, 9676=>873, 9677=>873, 9678=>873, 9679=>873, 9680=>873, 9681=>873, 9682=>873, 9683=>873, 9684=>873, 9685=>873, 9686=>527, 9687=>527, 9688=>791, 9689=>970, 9690=>970, + 9691=>970, 9692=>387, 9693=>387, 9694=>387, 9695=>387, 9696=>769, 9697=>769, 9698=>769, 9699=>769, 9700=>769, 9701=>769, 9702=>590, 9703=>945, 9704=>945, 9705=>945, 9706=>945, + 9707=>945, 9708=>769, 9709=>769, 9710=>769, 9711=>1119, 9712=>945, 9713=>945, 9714=>945, 9715=>945, 9716=>873, 9717=>873, 9718=>873, 9719=>873, 9720=>769, 9721=>769, 9722=>769, + 9723=>830, 9724=>830, 9725=>732, 9726=>732, 9727=>769, 9728=>896, 9729=>1000, 9730=>896, 9731=>896, 9732=>896, 9733=>896, 9734=>896, 9735=>573, 9736=>896, 9737=>896, 9738=>888, + 9739=>888, 9740=>671, 9741=>1013, 9742=>1246, 9743=>1250, 9744=>896, 9745=>896, 9746=>896, 9747=>532, 9748=>896, 9749=>896, 9750=>896, 9751=>896, 9752=>896, 9753=>896, 9754=>896, + 9755=>896, 9756=>896, 9757=>609, 9758=>896, 9759=>609, 9760=>896, 9761=>896, 9762=>896, 9763=>896, 9764=>669, 9765=>746, 9766=>649, 9767=>784, 9768=>545, 9769=>896, 9770=>896, + 9771=>896, 9772=>710, 9773=>896, 9774=>896, 9775=>896, 9776=>896, 9777=>896, 9778=>896, 9779=>896, 9780=>896, 9781=>896, 9782=>896, 9783=>896, 9784=>896, 9785=>896, 9786=>896, + 9787=>896, 9788=>896, 9789=>896, 9790=>896, 9791=>614, 9792=>731, 9793=>731, 9794=>896, 9795=>896, 9796=>896, 9797=>896, 9798=>896, 9799=>896, 9800=>896, 9801=>896, 9802=>896, + 9803=>896, 9804=>896, 9805=>896, 9806=>896, 9807=>896, 9808=>896, 9809=>896, 9810=>896, 9811=>896, 9812=>896, 9813=>896, 9814=>896, 9815=>896, 9816=>896, 9817=>896, 9818=>896, + 9819=>896, 9820=>896, 9821=>896, 9822=>896, 9823=>896, 9824=>896, 9825=>896, 9826=>896, 9827=>896, 9828=>896, 9829=>896, 9830=>896, 9831=>896, 9832=>896, 9833=>472, 9834=>638, + 9835=>896, 9836=>896, 9837=>472, 9838=>357, 9839=>484, 9840=>748, 9841=>766, 9842=>896, 9843=>896, 9844=>896, 9845=>896, 9846=>896, 9847=>896, 9848=>896, 9849=>896, 9850=>896, + 9851=>896, 9852=>896, 9853=>896, 9854=>896, 9855=>896, 9856=>869, 9857=>869, 9858=>869, 9859=>869, 9860=>869, 9861=>869, 9862=>890, 9863=>890, 9864=>890, 9865=>890, 9866=>890, + 9867=>890, 9868=>890, 9869=>890, 9870=>890, 9871=>890, 9872=>750, 9873=>750, 9874=>890, 9875=>816, 9876=>716, 9877=>537, 9878=>852, 9879=>890, 9880=>684, 9881=>890, 9882=>708, + 9883=>890, 9884=>890, 9888=>890, 9889=>890, 9890=>838, 9891=>838, 9892=>838, 9893=>838, 9894=>838, 9895=>838, 9896=>838, 9897=>838, 9898=>838, 9899=>838, 9900=>838, 9901=>838, + 9902=>838, 9903=>838, 9904=>844, 9905=>838, 9906=>731, 9985=>838, 9986=>838, 9987=>838, 9988=>838, 9990=>838, 9991=>838, 9992=>838, 9993=>838, 9996=>838, 9997=>838, 9998=>838, + 9999=>838, 10000=>838, 10001=>838, 10002=>838, 10003=>838, 10004=>838, 10005=>838, 10006=>838, 10007=>838, 10008=>838, 10009=>838, 10010=>838, 10011=>838, 10012=>838, 10013=>838, 10014=>838, + 10015=>838, 10016=>838, 10017=>838, 10018=>838, 10019=>838, 10020=>838, 10021=>838, 10022=>838, 10023=>838, 10025=>838, 10026=>838, 10027=>838, 10028=>838, 10029=>838, 10030=>838, 10031=>838, + 10032=>838, 10033=>838, 10034=>838, 10035=>838, 10036=>838, 10037=>838, 10038=>838, 10039=>838, 10040=>838, 10041=>838, 10042=>838, 10043=>838, 10044=>838, 10045=>838, 10046=>838, 10047=>838, + 10048=>838, 10049=>838, 10050=>838, 10051=>838, 10052=>838, 10053=>838, 10054=>838, 10055=>838, 10056=>838, 10057=>838, 10058=>838, 10059=>838, 10061=>896, 10063=>896, 10064=>896, 10065=>896, + 10066=>896, 10070=>896, 10072=>838, 10073=>838, 10074=>838, 10075=>322, 10076=>322, 10077=>538, 10078=>538, 10081=>838, 10082=>838, 10083=>838, 10084=>838, 10085=>838, 10086=>838, 10087=>838, + 10088=>838, 10089=>838, 10090=>838, 10091=>838, 10092=>838, 10093=>838, 10094=>838, 10095=>838, 10096=>838, 10097=>838, 10098=>838, 10099=>838, 10100=>838, 10101=>838, 10102=>896, 10103=>896, + 10104=>896, 10105=>896, 10106=>896, 10107=>896, 10108=>896, 10109=>896, 10110=>896, 10111=>896, 10112=>838, 10113=>838, 10114=>838, 10115=>838, 10116=>838, 10117=>838, 10118=>838, 10119=>838, + 10120=>838, 10121=>838, 10122=>838, 10123=>838, 10124=>838, 10125=>838, 10126=>838, 10127=>838, 10128=>838, 10129=>838, 10130=>838, 10131=>838, 10132=>838, 10136=>838, 10137=>838, 10138=>838, + 10139=>838, 10140=>838, 10141=>838, 10142=>838, 10143=>838, 10144=>838, 10145=>838, 10146=>838, 10147=>838, 10148=>838, 10149=>838, 10150=>838, 10151=>838, 10152=>838, 10153=>838, 10154=>838, + 10155=>838, 10156=>838, 10157=>838, 10158=>838, 10159=>838, 10161=>838, 10162=>838, 10163=>838, 10164=>838, 10165=>838, 10166=>838, 10167=>838, 10168=>838, 10169=>838, 10170=>838, 10171=>838, + 10172=>838, 10173=>838, 10174=>838, 10208=>494, 10214=>495, 10215=>495, 10216=>390, 10217=>390, 10218=>556, 10219=>556, 10224=>838, 10225=>838, 10226=>838, 10227=>838, 10228=>1157, 10229=>1434, + 10230=>1434, 10231=>1434, 10232=>1434, 10233=>1434, 10234=>1434, 10235=>1434, 10236=>1434, 10237=>1434, 10238=>1434, 10239=>1434, 10240=>732, 10241=>732, 10242=>732, 10243=>732, 10244=>732, 10245=>732, + 10246=>732, 10247=>732, 10248=>732, 10249=>732, 10250=>732, 10251=>732, 10252=>732, 10253=>732, 10254=>732, 10255=>732, 10256=>732, 10257=>732, 10258=>732, 10259=>732, 10260=>732, 10261=>732, + 10262=>732, 10263=>732, 10264=>732, 10265=>732, 10266=>732, 10267=>732, 10268=>732, 10269=>732, 10270=>732, 10271=>732, 10272=>732, 10273=>732, 10274=>732, 10275=>732, 10276=>732, 10277=>732, + 10278=>732, 10279=>732, 10280=>732, 10281=>732, 10282=>732, 10283=>732, 10284=>732, 10285=>732, 10286=>732, 10287=>732, 10288=>732, 10289=>732, 10290=>732, 10291=>732, 10292=>732, 10293=>732, + 10294=>732, 10295=>732, 10296=>732, 10297=>732, 10298=>732, 10299=>732, 10300=>732, 10301=>732, 10302=>732, 10303=>732, 10304=>732, 10305=>732, 10306=>732, 10307=>732, 10308=>732, 10309=>732, + 10310=>732, 10311=>732, 10312=>732, 10313=>732, 10314=>732, 10315=>732, 10316=>732, 10317=>732, 10318=>732, 10319=>732, 10320=>732, 10321=>732, 10322=>732, 10323=>732, 10324=>732, 10325=>732, + 10326=>732, 10327=>732, 10328=>732, 10329=>732, 10330=>732, 10331=>732, 10332=>732, 10333=>732, 10334=>732, 10335=>732, 10336=>732, 10337=>732, 10338=>732, 10339=>732, 10340=>732, 10341=>732, + 10342=>732, 10343=>732, 10344=>732, 10345=>732, 10346=>732, 10347=>732, 10348=>732, 10349=>732, 10350=>732, 10351=>732, 10352=>732, 10353=>732, 10354=>732, 10355=>732, 10356=>732, 10357=>732, + 10358=>732, 10359=>732, 10360=>732, 10361=>732, 10362=>732, 10363=>732, 10364=>732, 10365=>732, 10366=>732, 10367=>732, 10368=>732, 10369=>732, 10370=>732, 10371=>732, 10372=>732, 10373=>732, + 10374=>732, 10375=>732, 10376=>732, 10377=>732, 10378=>732, 10379=>732, 10380=>732, 10381=>732, 10382=>732, 10383=>732, 10384=>732, 10385=>732, 10386=>732, 10387=>732, 10388=>732, 10389=>732, + 10390=>732, 10391=>732, 10392=>732, 10393=>732, 10394=>732, 10395=>732, 10396=>732, 10397=>732, 10398=>732, 10399=>732, 10400=>732, 10401=>732, 10402=>732, 10403=>732, 10404=>732, 10405=>732, + 10406=>732, 10407=>732, 10408=>732, 10409=>732, 10410=>732, 10411=>732, 10412=>732, 10413=>732, 10414=>732, 10415=>732, 10416=>732, 10417=>732, 10418=>732, 10419=>732, 10420=>732, 10421=>732, + 10422=>732, 10423=>732, 10424=>732, 10425=>732, 10426=>732, 10427=>732, 10428=>732, 10429=>732, 10430=>732, 10431=>732, 10432=>732, 10433=>732, 10434=>732, 10435=>732, 10436=>732, 10437=>732, + 10438=>732, 10439=>732, 10440=>732, 10441=>732, 10442=>732, 10443=>732, 10444=>732, 10445=>732, 10446=>732, 10447=>732, 10448=>732, 10449=>732, 10450=>732, 10451=>732, 10452=>732, 10453=>732, + 10454=>732, 10455=>732, 10456=>732, 10457=>732, 10458=>732, 10459=>732, 10460=>732, 10461=>732, 10462=>732, 10463=>732, 10464=>732, 10465=>732, 10466=>732, 10467=>732, 10468=>732, 10469=>732, + 10470=>732, 10471=>732, 10472=>732, 10473=>732, 10474=>732, 10475=>732, 10476=>732, 10477=>732, 10478=>732, 10479=>732, 10480=>732, 10481=>732, 10482=>732, 10483=>732, 10484=>732, 10485=>732, + 10486=>732, 10487=>732, 10488=>732, 10489=>732, 10490=>732, 10491=>732, 10492=>732, 10493=>732, 10494=>732, 10495=>732, 10502=>838, 10503=>838, 10506=>838, 10507=>838, 10560=>683, 10561=>683, + 10702=>838, 10703=>1000, 10704=>1000, 10705=>1000, 10706=>1000, 10707=>1000, 10708=>1000, 10709=>1000, 10731=>494, 10752=>1000, 10753=>1000, 10754=>1000, 10764=>1325, 10765=>521, 10766=>521, 10767=>521, + 10768=>521, 10769=>521, 10770=>521, 10771=>521, 10772=>521, 10773=>521, 10774=>521, 10775=>521, 10776=>521, 10777=>521, 10778=>521, 10779=>521, 10780=>521, 10877=>838, 10878=>838, 10879=>838, + 10880=>838, 10881=>838, 10882=>838, 10883=>838, 10884=>838, 10885=>838, 10886=>838, 10887=>838, 10888=>838, 10889=>838, 10890=>838, 10891=>838, 10892=>838, 10893=>838, 10894=>838, 10895=>838, + 10896=>838, 10897=>838, 10898=>838, 10899=>838, 10900=>838, 10901=>838, 10902=>838, 10903=>838, 10904=>838, 10905=>838, 10906=>838, 10907=>838, 10908=>838, 10909=>838, 10910=>838, 10911=>838, + 10912=>838, 10926=>838, 10927=>838, 10928=>838, 10929=>838, 10930=>838, 10931=>838, 10932=>838, 10933=>838, 10934=>838, 10935=>838, 10936=>838, 10937=>838, 10938=>838, 11001=>838, 11002=>838, + 11008=>838, 11009=>838, 11010=>838, 11011=>838, 11012=>838, 11013=>838, 11014=>838, 11015=>838, 11016=>838, 11017=>838, 11018=>838, 11019=>838, 11020=>838, 11021=>838, 11022=>836, 11023=>836, + 11024=>836, 11025=>836, 11026=>945, 11027=>945, 11028=>945, 11029=>945, 11030=>769, 11031=>769, 11032=>769, 11033=>769, 11034=>945, 11040=>869, 11041=>873, 11042=>873, 11043=>873, 11360=>557, + 11361=>278, 11362=>557, 11363=>603, 11364=>695, 11365=>613, 11366=>392, 11367=>752, 11368=>634, 11369=>656, 11370=>579, 11371=>685, 11372=>525, 11380=>592, 11381=>654, 11382=>568, 11383=>660, + 61960=>781, 62047=>592, 63173=>612, 64256=>722, 64257=>646, 64258=>646, 64259=>1000, 64260=>1000, 64261=>686, 64262=>861, 64275=>1202, 64276=>1202, 64277=>1196, 64278=>1186, 64279=>1529, 64285=>296, + 64287=>494, 64288=>636, 64297=>838, 64298=>799, 64299=>799, 64300=>799, 64301=>799, 64302=>663, 64303=>663, 64304=>663, 64305=>655, 64306=>454, 64307=>607, 64308=>690, 64309=>336, 64310=>437, + 64311=>1000, 64312=>683, 64313=>336, 64314=>642, 64315=>666, 64316=>635, 64318=>736, 64320=>456, 64321=>771, 64323=>651, 64324=>666, 64326=>639, 64327=>688, 64328=>642, 64329=>799, 64330=>726, + 64331=>272, 64332=>655, 64333=>666, 64334=>666, 65024=>0, 65025=>0, 65026=>0, 65027=>0, 65028=>0, 65029=>0, 65030=>0, 65031=>0, 65032=>0, 65033=>0, 65034=>0, 65035=>0, + 65036=>0, 65037=>0, 65038=>0, 65039=>0, 65533=>1025); +$enc=''; +$diff=''; +$file='DejaVuSans-Oblique.z'; +$ctg='DejaVuSans-Oblique.ctg.z'; +$originalsize=461680; +?> diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono-bold.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono-bold.ctg.z new file mode 100644 index 00000000..92edd865 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono-bold.ctg.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono-bold.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono-bold.z new file mode 100644 index 00000000..00335639 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono-bold.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono-boldoblique.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono-boldoblique.ctg.z new file mode 100644 index 00000000..36a4e987 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono-boldoblique.ctg.z differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono-boldoblique.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono-boldoblique.z new file mode 100644 index 00000000..b8592092 Binary files /dev/null and b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono-boldoblique.z differ