Podgląd pliku: / jacekk.info / pdf417.phps
<?php
/***************************************************
* Kody kreskowe - PDF 417 *
***************************************************
* Wersja: 1.0 *
* Autor: Jacek Kowalski (http://jacekk.info) *
* *
* Strona WWW: http://jacekk.info/scripts/barcodes *
* *
* Utwór rozprowadzany na licencji *
* http://creativecommons.org/licenses/by-nc/2.5/ *
***************************************************/
/* Kodowanie znaków UTF-8 */
$code = $_GET['kod'];
if(empty($code)) die();
define('MODULE_WIDTH', 2);
define('MODULE_HEIGHT', 8);
// Find the best code size
function square($len) {
$len += 1;
$padding = 999;
$padding_for = array();
$padding_factor = '';
$rows=30;
for($cols=1; $cols<=30; $cols++) {
for(; $rows>=3; $rows--) {
$pad = $rows*$cols - $len;
if($pad<0) break;
if($pad<$padding) {
$padding = $pad;
$padding_for = array($rows, $cols);
$padding_factor = abs($rows*MODULE_HEIGHT - (2+$cols)*17*MODULE_WIDTH);
}
elseif($pad==$padding && abs($rows*MODULE_HEIGHT - (2+$cols)*17*MODULE_WIDTH)<$padding_factor) {
$padding_for = array($rows, $cols);
$padding_factor = abs($rows*MODULE_HEIGHT - (2+$cols)*17*MODULE_WIDTH);
}
}
}
return array($padding, $padding_for);
}
// Compute Reed-Solomon error correction codewords
function reed_solomon($data, $s) {
$factors = array(
array( 27, 917),
array( 522, 568, 723, 809),
array( 237, 308, 436, 284, 646, 653, 428, 379),
array( 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428,
295, 42, 176, 65),
array( 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742,
687, 284, 193, 517, 273, 494, 263, 147, 593, 800, 571, 320,
803, 133, 231, 390, 685, 330, 63, 410),
array( 539, 422 , 6, 93, 862, 771, 453, 106, 610, 287, 107, 505,
733, 877, 381, 612, 723, 476, 462, 172, 430, 609, 858, 822,
543, 376, 511, 400, 672, 762, 283, 184, 440, 35, 519, 31,
460, 594, 225, 535, 517, 352, 605, 158, 651, 201, 488, 502,
648, 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381,
843, 623, 264, 543),
array( 521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444,
400, 925, 749, 415, 822, 93, 217, 208, 928, 244, 583, 620,
246, 148, 447, 631, 292, 908, 490, 704, 516, 258, 457, 907,
594, 723, 674, 292, 272, 96, 684, 432, 686, 606, 860, 569,
193, 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379,
712, 463, 646, 776, 171, 491, 297, 763, 156, 732, 95, 270,
447, 90, 507, 48, 228, 821, 808, 898, 784, 663, 627, 378,
382, 262, 380, 602, 754, 336, 89, 614, 87, 432, 670, 616,
157, 374, 242, 726, 600, 269, 375, 898, 845, 454, 354, 130,
814, 587, 804, 34, 211, 330, 539, 297, 827, 865, 37, 517,
834, 315, 550, 86, 801, 4, 108, 539),
array( 524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250,
905, 786, 138, 720, 858, 194, 311, 913, 275, 190, 375, 850,
438, 733, 194, 280, 201, 280, 828, 757, 710, 814, 919, 89,
68, 569, 11, 204, 796, 605, 540, 913, 801, 700, 799, 137,
439, 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257,
284, 549, 209, 884, 315, 70, 329, 793, 490, 274, 877, 162,
749, 812, 684, 461, 334, 376, 849, 521, 307, 291, 803, 712,
19, 358, 399, 908, 103, 511, 51, 8, 517, 225, 289, 470,
637, 731, 66, 255, 917, 269, 463, 830, 730, 433, 848, 585,
136, 538, 906, 90, 2, 290, 743, 199, 655, 903, 329, 49,
802, 580, 355, 588, 188, 462, 10, 134, 628, 320, 479, 130,
739, 71, 263, 318, 374, 601, 192, 605, 142, 673, 687, 234,
722, 384, 177, 752, 607, 640, 455, 193, 689, 707, 805, 641,
48, 60, 732, 621, 895, 544, 261, 852, 655, 309, 697, 755,
756, 60, 231, 773, 434, 421, 726, 528, 503, 118, 49, 795,
32, 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550,
73, 914, 342, 126, 32, 681, 331, 792, 620, 60, 609, 441,
180, 791, 893, 754, 605, 383, 228, 749, 760, 213, 54, 297,
134, 54, 834, 299, 922, 191, 910, 532, 609, 829, 189, 20,
167, 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173,
404, 251, 688, 95, 497, 555, 642, 543, 307, 159, 924, 558,
648, 55, 497, 10),
array( 352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498,
285, 380, 350, 492, 197, 265, 920, 155, 914, 299, 229, 643,
294, 871, 306, 88, 87, 193, 352, 781, 846, 75, 327, 520,
435, 543, 203, 666, 249, 346, 781, 621, 640, 268, 794, 534,
539, 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37,
858, 916, 552, 41, 542, 289, 122, 272, 383, 800, 485, 98,
752, 472, 761, 107, 784, 860, 658, 741, 290, 204, 681, 407,
855, 85, 99, 62, 482, 180, 20, 297, 451, 593, 913, 142,
808, 684, 287, 536, 561, 76, 653, 899, 729, 567, 744, 390,
513, 192, 516, 258, 240, 518, 794, 395, 768, 848, 51, 610,
384, 168, 190, 826, 328, 596, 786, 303, 570, 381, 415, 641,
156, 237, 151, 429, 531, 207, 676, 710, 89, 168, 304, 402,
40, 708, 575, 162, 864, 229, 65, 861, 841, 512, 164, 477,
221, 92, 358, 785, 288, 357, 850, 836, 827, 736, 707, 94,
8, 494, 114, 521, 2, 499, 851, 543, 152, 729, 771, 95,
248, 361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820,
669, 45, 902, 452, 167, 342, 244, 173, 35, 463, 651, 51,
699, 591, 452, 578, 37, 124, 298, 332, 552, 43, 427, 119,
662, 777, 475, 850, 764, 364, 578, 911, 283, 711, 472, 420,
245, 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408,
842, 383, 721, 521, 560, 644, 714, 559, 62, 145, 873, 663,
713, 159, 672, 729, 624, 59, 193, 417, 158, 209, 563, 564,
343, 693, 109, 608, 563, 365, 181, 772, 677, 310, 248, 353,
708, 410, 579, 870, 617, 841, 632, 860, 289, 536, 35, 777,
618, 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751,
331, 247, 184, 45, 787, 680, 18, 66, 407, 369, 54, 492,
228, 613, 830, 922, 437, 519, 644, 905, 789, 420, 305, 441,
207, 300, 892, 827, 141, 537, 381, 662, 513, 56, 252, 341,
242, 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310,
756, 665, 397, 808, 851, 309, 473, 795, 378, 31, 647, 915,
459, 806, 590, 731, 425, 216, 548, 249, 321, 881, 699, 535,
673, 782, 210, 815, 905, 303, 843, 922, 281, 73, 469, 791,
660, 162, 498, 308, 155, 422, 907, 817, 187, 62, 16, 425,
535, 336, 286, 437, 375, 273, 610, 296, 183, 923, 116, 667,
751, 353, 62, 366, 691, 379, 687, 842, 37, 357, 720, 742,
330, 5, 39, 923, 311, 424, 242, 749, 321, 54, 669, 316,
342, 299, 534, 105, 667, 488, 640, 672, 576, 540, 316, 486,
721, 610, 46, 656, 447, 171, 616, 464, 190, 531, 297, 321,
762, 752, 533, 175, 134, 14, 381, 433, 717, 45, 111, 20,
596, 284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780,
407, 164, 332, 899, 165, 726, 600, 325, 498, 655, 357, 752,
768, 223, 849, 647, 63, 310, 863, 251, 366, 304, 282, 738,
675, 410, 389, 244, 31, 121, 303, 263),
);
$m = count($data);
$k = bcpow(2, $s+1, 0);
$c = array_fill(0, $k, 0);
$t = 0;
for($i=0; $i<$m; $i++) {
$t = ($data[$i] + $c[0]) % 929;
for($j=$k-1; $j>=0; $j--) {
if($j==0) {
$c[$k-$j-1] = ( 929 - (($t * $factors[$s][$j]) % 929) ) % 929;
}
else
{
$c[$k-$j-1] = ( $c[$k-$j] + 929 - (($t * $factors[$s][$j]) % 929) ) % 929;
}
}
}
for($j=0; $j<$k; $j++) {
if($c[$j] != 0) {
$c[$j] = 929 - $c[$j];
}
}
return $c;
}
$special_bars = array(
'start' => '11111111010101000',
'stop' => '111111101000101001',
);
$text_mode = array(
'A' => array('upper', 0),
'B' => array('upper', 1),
'C' => array('upper', 2),
'D' => array('upper', 3),
'E' => array('upper', 4),
'F' => array('upper', 5),
'G' => array('upper', 6),
'H' => array('upper', 7),
'I' => array('upper', 8),
'J' => array('upper', 9),
'K' => array('upper', 10),
'L' => array('upper', 11),
'M' => array('upper', 12),
'N' => array('upper', 13),
'O' => array('upper', 14),
'P' => array('upper', 15),
'Q' => array('upper', 16),
'R' => array('upper', 17),
'S' => array('upper', 18),
'T' => array('upper', 19),
'U' => array('upper', 20),
'V' => array('upper', 21),
'W' => array('upper', 22),
'X' => array('upper', 23),
'Y' => array('upper', 24),
'Z' => array('upper', 25),
' ' => array(array('upper', 'lower', 'mixed'), 26),
'a' => array('lower', 0),
'b' => array('lower', 1),
'c' => array('lower', 2),
'd' => array('lower', 3),
'e' => array('lower', 4),
'f' => array('lower', 5),
'g' => array('lower', 6),
'h' => array('lower', 7),
'i' => array('lower', 8),
'j' => array('lower', 9),
'k' => array('lower', 10),
'l' => array('lower', 11),
'm' => array('lower', 12),
'n' => array('lower', 13),
'o' => array('lower', 14),
'p' => array('lower', 15),
'q' => array('lower', 16),
'r' => array('lower', 17),
's' => array('lower', 18),
't' => array('lower', 19),
'u' => array('lower', 20),
'v' => array('lower', 21),
'w' => array('lower', 22),
'x' => array('lower', 23),
'y' => array('lower', 24),
'z' => array('lower', 25),
';' => array('punct', 0),
'<' => array('punct', 1),
'>' => array('punct', 2),
'@' => array('punct', 3),
'[' => array('punct', 4),
'\\' => array('punct', 5),
']' => array('punct', 6),
'_' => array('punct', 7),
'`' => array('punct', 8),
'~' => array('punct', 9),
'!' => array('punct', 10),
"\r" => array(array('punct', 'mixed'), 11),
"\t" => array(array('punct', 'mixed'), 12),
',' => array(array('punct', 'mixed'), 13),
':' => array(array('punct', 'mixed'), 14),
"\n" => array('punct', 15),
'-' => array(array('punct', 'mixed'), 16),
'.' => array(array('punct', 'mixed'), 17),
'$' => array(array('punct', 'mixed'), 18),
'/' => array(array('punct', 'mixed'), 19),
'\'' => array('punct', 20),
'|' => array('punct', 21),
'*' => array('punct', 22),
'(' => array('punct', 23),
')' => array('punct', 24),
'?' => array('punct', 25),
'{' => array('punct', 26),
'}' => array('punct', 27),
'\'' => array('punct', 28),
'0' => array('mixed', 0),
'1' => array('mixed', 1),
'2' => array('mixed', 2),
'3' => array('mixed', 3),
'4' => array('mixed', 4),
'5' => array('mixed', 5),
'6' => array('mixed', 6),
'7' => array('mixed', 7),
'8' => array('mixed', 8),
'9' => array('mixed', 9),
'&' => array('mixed', 10),
'#' => array('mixed', 15),
'+' => array('mixed', 20),
'%' => array('mixed', 21),
'*' => array('mixed', 22),
'=' => array('mixed', 23),
'^' => array('mixed', 24),
'upper' => array('lower' => 27, 'punct' => 25, 'mixed' => 28),
'lower' => array('upper' => 27, 'mixed' => 27),
'mixed' => array('upper' => 28, 'lower' => 28),
'punct' => array('mixed' => 25),
'punct_next' => array('upper' => 29, 'lower' => 29, 'mixed' => 29),
);
// Encodes text
function t_cws($text) {
global $text_mode;
$text = str_split($text);
foreach($text as &$char) {
$char = $text_mode[$char];
$char[0] = (array)$char[0];
}
unset($char);
$return = array(900);
$tmp = array(); $tmp_type = 'upper';
while(isset($text[0])) {
$char = array_shift($text);
if(!in_array($tmp_type, $char[0])) {
if($char[0]=='punct') {
$tmp[] = 29;
}
elseif(isset($text[0]) && $mode=array_intersect($char[0], $text[0][0])) {
$mode = array_shift($mode);
if(isset($text_mode[$mode][$tmp_type])) {
$tmp[] = $text_mode[$mode][$tmp_type];
$tmp_type = $mode;
}
elseif(isset($text_mode[$mode.'_next']) && isset($text_mode[$mode.'_next'][$tmp_type])) {
$tmp[] = $text_mode[$mode.'_next'][$tmp_type];
}
else
{
die('Unable to change mode from '.$tmp_type.' to '.$mode.'\n');
}
}
else
{
$mode = array_shift($char[0]);
if(isset($text_mode[$mode.'_next']) && isset($text_mode[$mode.'_next'][$tmp_type])) {
$tmp[] = $text_mode[$mode.'_next'][$tmp_type];
}
elseif(isset($text_mode[$tmp_type]) && isset($text_mode[$tmp_type][$mode])) {
$tmp[] = $text_mode[$mode][$tmp_type];
$tmp_type = $mode;
}
else
{
die('Unable to change mode from '.$tmp_type.' to '.$mode.'\n');
}
}
}
$tmp[] = $char[1];
}
if(count($tmp)%2==1) {
$tmp[] = 29;
}
while($tmp) {
$return[] = array_shift($tmp)*30 + array_shift($tmp);
}
return $return;
}
// Encodes binary string
function b_cws($bytecode) {
$len = strlen($bytecode);
$bytecode = str_split($bytecode);
$return = array();
foreach($bytecode as &$byte) $byte = (string)ord($byte);
while(count($bytecode)>=6) {
$intval = '0';
$subreturn = array();
for($i=5; $i>=0; $i--) {
$intval = bcadd($intval, bcmul(array_shift($bytecode), bcpow(256, $i, 0), 0), 0);
}
for($i=0; $i<5; $i++) {
$subreturn[] = (int)bcmod($intval, '900');
$intval = bcdiv($intval, '900', 0);
}
$return = array_merge($return, array_reverse($subreturn));
}
if(count($bytecode)) {
// Type: byte
// number od encoded bytes is NOT a multiple of 6
array_unshift($return, 901);
}
else
{
// Type: byte, number of encoded bytes is a multiple of 6
array_unshift($return, 924);
}
$return = array_merge($return, $bytecode);
return $return;
}
// Encodes number
function n_cws($number) {
$number = str_split($number, 44);
$return = array(902);
while($number) {
$subreturn = array();
$intval = '1'.array_shift($number);
for($i=0; $i<15; $i++) {
$subreturn[] = (int)bcmod($intval, '900');
$intval = bcdiv($intval, '900', 0);
if($intval==0) break;
}
$return = array_merge($return, array_reverse($subreturn));
}
return $return;
}
function array_unchunk($array) {
return call_user_func_array('array_merge', $array);
}
// Divide data into blocks of the same type
$code = str_split($code);
$blocks = array();
$types = array();
$tmp = ''; $tmp_type = '';
while(count($code)) {
$char = array_shift($code);
if(ctype_digit($char)){
if($tmp_type != 'n' && $tmp) {
$blocks[] = $tmp;
$types[] = $tmp_type;
$tmp = '';
}
$tmp_type = 'n';
$tmp .= $char;
}
elseif((ord($char)>=32 && ord($char)<127) || $char=="\r" || $char=="\n" || $char=="\t") {
if($tmp_type != 't' && $tmp) {
$blocks[] = $tmp;
$types[] = $tmp_type;
$tmp = '';
}
$tmp_type = 't';
$tmp .= $char;
}
else
{
if($tmp_type != 'b' && $tmp) {
$blocks[] = $tmp;
$types[] = $tmp_type;
$tmp = '';
}
$tmp_type = 'b';
$tmp .= $char;
}
}
if($tmp) {
$blocks[] = $tmp;
$types[] = $tmp_type;
$tmp = '';
}
unset($code, $char, $tmp, $tmp_type);
// Compact it
$i = -1;
$tmp_type = '';
foreach($blocks as $num => $data) {
if($tmp_type == 'b' && (($types[$num]=='t' && strlen($data)<4) || ($types[$num]=='n' && strlen($data)<4))) {
$blocks[$i] .= $data;
}
elseif($tmp_type == 't' && ($types[$num]=='n' && strlen($data)<4)) {
$blocks[$i] .= $data;
}
elseif($types[$num] != $tmp_type) {
$blocks[++$i] = $data;
$tmp_type = $types[$i] = $types[$num];
}
else
{
$blocks[$i] .= $data;
}
}
$blocks = array_slice($blocks, 0, $i+1);
$types = array_slice($types, 0, $i+1);
unset($i, $tmp_type, $num, $data);
// Encode data into corewords
foreach($blocks as $num => &$data) {
$data = call_user_func($types[$num].'_cws', $data);
}
unset($num, $data, $types);
$blocks = array_unchunk($blocks);
$m = count($blocks);
if($m<=40) $s = 2;
elseif($m<=160) $s = 3;
elseif($m<=320) $s = 4;
elseif($m<=863) $s = 5;
elseif($m<=925) $s = 0;
else die('Too many data blocks: '.$m);
// Compute size of the barcode
$size = square(count($blocks)+bcpow(2, $s+1, 0));
$padding = $size[0];
$size = $size[1];
array_unshift($blocks, 1+count($blocks)+$padding);
if($padding) {
$blocks = array_merge($blocks, array_fill(0, $padding, 900));
}
$blocks = array_merge($blocks, reed_solomon($blocks, $s));
unset($m, $padding);
// Corewords representation tables
// To get a binary form use: decbin(intval($var, 36))
$table1=array('2ksg','2oz4','2r24','2km8','2ovs','2r0e','2bwg','2kj4','2bts','1uf4','2bsg','1ue8','2cw0','2l0w','2p30','2cps',
'2kxk','2p1a','1w3k','2cmo','1w0w','1x34','2d4g','2l4s','1www','2d14','2l32','1wts','2czg','1xbk','2d8c','1x88','2d6m','1xfg',
'2r5m','2k80','2ooo','2qwu','2b40','2k4w','2on0','2b1c','2k3c','1su8','2b00','2k2k','1stc','2azc','1ssw','2bj4','2kc8','2oqm',
'1tq8','2bg0','2kak','1tnk','2beg','2k9q','1tm8','2bdo','1u5c','2bnc','2ke6','1u28','2blo','1u0o','2bku','1u9k','2bpa','1u7w',
'1u72','2aps','2jxs','2ojg','2an4','2jw8','2oim','1s1s','2als','2jvg','1s0w','2al4','1s0g','1s08','1sjk','2auo','2jzw','1sgw',
'2at4','2jz2','1sfk','2asc','1sew','1sek','1sog','2aws','1smw','2avy','1sm4','1sqk','2ag0','2jso','2ogu','1rnk','2aeo','2jrw',
'1rmo','2ae0','2jri','1rm8','2ado','1rm0','2adi','1rvk','2aig','2jtq','1ru8','2aho','1rtk','2aha','1rt8','1rt2','2aji','1rwu',
'1rgg','2ab4','2jq4','1rfk','2aag','2jpq','1rf4','2aa4','1rew','2a9y','1res','1rjk','1riw','1rik','1rc0','2jou','2a8c','2a86',
'1rb6','2in4','2nw8','2qim','27y8','2ik0','2nuk','27vk','2iig','2ntq','1mio','27u8','1mhs','28dc','2irc','2ny6','1neo','28a8',
'2ipo','1nc0','288o','1nao','1na0','1nts','28hk','2ita','1nqo','28fw','1np4','1noc','1ny0','28ji','1nwc','1nzy','2ls0','2pgw',
'2rb0','2lpc','2pfc','2ra6','2e68','2lo0','2pek','2e5c','2lnc','2pe6','2e4w','2ln0','27k0','2icw','2nr0','2eo0','27hc','2ibc',
'2nq6','2elc','2lvc','2pi6','1zy8','1lpc','27fc','2ia6','1zxc','2ejc','1zww','1m80','27ow','2if0','20g0','1m5c','27nc','2ie6',
'20dc','2erc','2ly6','20c0','1m3c','20bc','1mcw','27r0','20kw','1mbc','27q6','20jc','2eu6','20ik','1mf0','20n0','1me6','20m6',
'2li8','2pbs','2r8e','2ds0','2lgw','2pb0','2dr4','2lg8','2pam','2dqo','2lfw','2dqg','2dqc','27a8','2i7s','2noe','2e00','278w',
'2i70','1yrk','1lb4','2ljw','2i6m','1yqo','1lao','277w','1yq8','2dxo','277q','1lac','1lk0','27co','2i8u','1yzk','1lio','27bw',
'1yy8','2e1o','27bi','1yxk','1lho','1lhi','1lmg','27dq','1z20','1llo','1z18','1lla','1z0u','1z32','2dkw','2ldc','2p98','2dk0',
'2lco','2p8u','2djk','2lcc','2djc','2lc6','2dj8','2dj6','1l4w','275c','2i58','1y68','1l40','274o','2i4u','1y5c','2dnc','2le6',
'1y4w','1l3c','2746','1y4o','2dmu','1y4k','1l80','276k','1y9c','1l7c','2766','1y8o','2dou','1y8c','1l6u','1y86','1yak','1ya6',
'2dgg','2law','2p7y','2dg0','2lak','2dfs','2lae','2dfo','2dfm','1l0g','272w','2i3y','1xuo','1l00','272k','1xu8','2dho','272e',
'1xu0','1kzo','1xtw','1kzm','1l20','1xw8','1xvw','1xvq','2l9o','2l9i','2ddu','271o','1ky0','1xoo','1xok','1xoi','25z4','2hkg',
'2ncs','25wg','2hiw','1ikg','25v4','2hi4','1ijk','25ug','1ij4','1iiw','1j28','2640','2hmk','1izk','262g','2hlq','1iy8','261o',
'1ixk','1ix8','1j74','2664','1j5k','265a','1j4s','1j98','1j8e','2j4w','2o54','2qn2','291c','2j3k','2o4c','290g','2j2w','2o3y',
'2900','2j2k','28zs','2j2e','25pc','2hfc','2na6','299c','25o0','2hek','1pa8','1i5c','2j6k','2he6','1p9c','297c','25n0','1p8w',
'1i4o','1p8o','1ie8','25rs','2hge','1pi8','1icw','2j8e','1pgw','29b0','25qm','1pg8','1ibw','1pfw','1igo','25su','1pko','1ifw',
'1pjw','1ifi','1ihq','1plq','2m9s','2pps','2rfg','2m8w','2pp4','2rf2','2m8g','2pos','2m88','2pom','2m84','28u8','2j00','2o2k',
'2fk0','28tc','2pr0','2o26','2fj4','2mc8','2pqm','2fio','28so','2iyu','2fig','2mbq','28si','1hz4','25kg','2hcs','1oow','1hy8',
'25js','2hce','224g','1oo0','28wo','2j0u','223k','2fmg','2mdq','25ja','2234','1onc','28w6','222w','1hxe','1i28','25lo','1os0',
'1i1k','25la','227k','1orc','28y6','226w','2fny','1i12','1oqu','1i3g','1ot8','1i32','228s','1osu','2m5c','2pnc','2re6','2m4w',
'2pn0','2m4o','2pmu','2m4k','2m4i','28ps','2ixk','2o1a','2f8g','28pc','2pny','2f80','2m6k','2ix2','2f7s','28p0','2f7o','28oy',
'2f7m','1huo','25i0','2hbi','1odc','1hu8','25ho','21eo','1ocw','28r0','25hi','21e8','2f9o','1htw','21e0','1ock','1htu','1oci',
'1hw8','25im','1oew','1hvw','21g8','1oek','1hvq','21fw','1oee','1hwu','21gu','2m34','2pm4','2m2w','2ply','2m2s','2m2q','28nk',
'2iwc','2f2o','28nc','2iw6','2f2g','2m3q','2f2c','28n6','2f2a','1hsg','25gs','1o7k','1hs8','25gm','211s','1o7c','28o6','211k',
'2f3a','1hs2','211g','1o76','211e','1o8c','212k','212e','2pli','2m1u','2ivq','28mc','28ma','1hrc','1o4o','20vc','1hr6','1o4i',
'24ww','1glc','24vk','1gkg','24uw','2gzy','1gk0','24uk','1gjs','24ue','1gtc','24zc','2h26','1gs0','24yk','1grc','24y6','1gr0',
'1gqu','1gvs','250e','1gv0','1gum','1gwu','26gw','2htc','2nh8','26g0','2hso','26fk','2hsc','26fc','2hs6','26f8','1ge8','24s0',
'2gyk','1jy8','1gdc','2huk','2gy6','1jxc','26jc','2hu6','1jww','1gco','24qu','1jwo','26iu','1gci','1ghc','24t8','1k1c','1ggo',
'24su','1k0o','26ku','1k0c','1gg6','1gik','1k2k','1gi6','1k26','2jds','2o9k','2qpa','2jdc','2o98','2jd4','2o92','2jd0','2jcy',
'26cg','2hqw','29pc','26c0','2hqk','29ow','2jf0','2hqe','29oo','26bo','29ok','26bm','29oi','1g9s','24pk','1jmo','1g9c','2hri',
'1qcg','1jm8','26do','24p2','1qc0','29qk','1g90','1qbs','1jlw','1g8y','1jlu','1gbc','24q6','1jo8','1gb0','1qe0','1jnw','1gau',
'1qdo','1jnq','1gby','1jou','1qem','2pu8','2rho','2pu0','2rhi','2ptw','2ptu','2jbk','2o8c','2mkw','2pv0','2o86','2mko','2puu',
'2mkk','2jb6','2mki','26a8','2hpo','29jk','26a0','2hpi','2g28','29jc','2jc6','2g20','2mli','269u','2g1w','29j6','2g1u','1g7k',
'24oc','1jgw','1g7c','24o6','1pzk','1jgo','26au','230w','1pzc','29k6','1g76','230o','2g2u','1jgi','230k','1g8c','1jho','1g86',
'1q0c','1jhi','231o','1q06','231i','2pt4','2rh2','2pt0','2psy','2jag','2o7q','2mi0','2pti','2mhw','2jaa','2mhu','2694','2hp2',
'29go','2690','2fvs','29gk','268y','2fvo','29gi','2fvm','1g6g','24nq','1je0','269i','1pt4','1jdw','1g6a','22nc','1pt0','1jdu',
'22n8','1psy','22n6','1jee','22nq','2psi','2mgk','2mgi','29f8','2fsk','2fsi','1jck','1ppw','22gk','22gi','1fls','1fkw','24d4',
'1fkg','1fk8','1fk4','1fow','1fo8','1fnw','1fnq','1fq4','1fpq','255s','255c','2h58','2554','2h52','2550','254y','1fhc','24bc',
'1h9c','257c','24b0','1h8w','2570','1h8o','256u','1h8k','1fgi','1h8i','1fiw','24by','1haw','257y','1hak','1fie','1hae','1fji',
'1hbi','2hxs','2hxk','2hxg','2hxe','253k','26s0','2hyk','2h46','26rs','2hye','26ro','2536','26rm','1ff4','1h3k','1few','249y',
'1kgg','1h3c','1fes','1kg8','1h38','1feq','1kg4','1h36','1ffw','1h4c','1ffq','1kh8','1h46','1kh2','2obs','2obo','2obm','2hwo',
'2jjc','2oc6','2jj8','2hwi','2jj6','252g','2h3q','26p4','2hx2','29yg','26p0','252a','29yc','26oy','29ya','1fe0','249i','1h0o',
'252u','1ka0','1h0k','1fdu','1qso','1k9w','1h0i','1qsk','1k9u','1fee','1h12','1kae','1qt2','2ris','2riq','2ob8','2px0','2ob6',
'2pwy','2hw4','2jhw','2hw2','2mpg','2jhu','2mpe','251w','26no','251u','29v8','26nm','2gac');
$table2=array('2r1c','2s3c','2ou8','2r00','2s2k','2otc','2qzc','2s26','2osw','2qz0','2oso','2qyu','2osk','2p28','2r3s','2s4e',
'2kw0','2p0w','2r30','2kv4','2p08','2r2m','2kuo','2ozw','2kug','2ozq','2kuc','2l40','2p4o','2r4u','2czk','2l2o','2p3w','2cyo',
'2l20','2p3i','2cy8','2l1o','2cy0','2l1i','2cxw','2d7k','2l6g','2p5q','1x6o','2d68','2l5o','1x5s','2d5k','2l5a','1x5c','2d58',
'1x54','2d52','1xeo','2da0','2l7i','1xdc','2d98','1xco','2d8u','1xcc','1xh4','2db2','1xgc','1xfy','2on4','2qwg','2s0s','2om8',
'2qvs','2s0e','2ols','2qvg','2olk','2qva','2olg','2ole','2kao','2oq8','2qxo','2k9s','2opk','2qxa','2k9c','2op8','2k94','2op2',
'2k90','2k8y','2bls','2kds','2org','2bkw','2kd4','2or2','2bkg','2kcs','2bk8','2kcm','2bk4','2bk2','1u80','2bow','2kf0','1u74',
'2bo8','2kem','1u6o','2bnw','1u6g','2bnq','1u6c','1ub4','2bq4','1uag','2bpq','1ua4','1u9y','1ucc','1uby','2oio','2qu0','2rzi',
'2oi8','2qto','2oi0','2qti','2ohw','2ohu','2jz4','2ok8','2qum','2jyo','2ojw','2jyg','2ojq','2jyc','2jya','2aw0','2k0o','2oku',
'2avk','2k0c','2avc','2k06','2av8','2av6','1sps','2axk','2k1a','1spc','2ax8','1sp4','2ax2','1sp0','1soy','1src','2ay6','1sr0',
'1squ','1sry','2ogg','2qss','2og8','2qsm','2og4','2og2','2jtc','2oh8','2jt4','2oh2','2jt0','2jsy','2aj4','2ju4','2aiw','2jty',
'2ais','2aiq','1ryo','2ajw','1ryg','2ajq','1ryc','1rya','1rzg','1rza','2ofc','2qs6','2of8','2of6','2jqg','2ofq','2jqc','2jqa',
'2aco','2jqu','2ack','2aci','1rl4','2ad2','1rl0','1rky','2oes','2oeq','2jp0','2joy','2a9g','2a9e','2nuo','2qi8','2rto','2nts',
'2qhk','2rta','2ntc','2qh8','2nt4','2qh2','2nt0','2nsy','2ips','2nxs','2qjg','2iow','2nx4','2qj2','2iog','2nws','2io8','2nwm',
'2io4','2io2','28g0','2isw','2nz0','28f4','2is8','2nym','28eo','2irw','28eg','2irq','28ec','28ea','1nwg','28j4','2iu4','1nvk',
'28ig','2itq','1nv4','28i4','1nuw','28hy','1nus','1nzk','28kc','1nyw','28jy','1nyk','1nye','1o0s','1o0e','2ra8','2s7s','1zw0',
'2r9s','2s7g','1zi0','2r9k','2s7a','1zb0','2r9g','2r9e','2nq8','2qfs','2rse','2pi8','2nps','2s8e','2phs','2rbg','2qfa','2phk',
'2npg','2phg','2npe','2phe','2ie8','2nrs','2qge','2ly8','2ids','2nrg','2lxs','2pjg','2nra','2lxk','2idg','2lxg','2ide','2lxe',
'27q8','2ifs','2nse','2eu8','27ps','2ifg','2ets','2lzg','2ifa','2etk','27pg','2etg','27pe','2ete','1me8','27rs','2ige','20m8',
'1mds','27rg','20ls','2evg','27ra','20lk','1mdg','20lg','1mde','1mfs','27se','20ns','1mfg','20ng','1mfa','20na','1mge','2r80',
'2s6k','1ypk','2r7s','2s6e','1yik','2r7o','1yf2','2r7m','2no0','2qek','2pcg','2nns','2qee','2pc8','2r8m','2pc4','2nnm','2pc2',
'2i8g','2nos','2llc','2i88','2nom','2ll4','2pd2','2ll0','2i82','2lky','27dc','2i98','2e34','27d4','2i92','2e2w','2lly','2e2s',
'27cy','2e2q','1ln4','27e4','1z2o','1lmw','27dy','1z2g','2e3q','1z2c','1lmq','1z2a','1lnw','1z3g','1lnq','1z3a','2r6w','2s5y',
'1y4c','2r6s','1y0u','2r6q','2nmw','2qdy','2p9k','2r7a','2p9g','2nmq','2p9e','2i5k','2nna','2lew','2i5g','2les','2i5e','2leq',
'276w','2i5y','2dpk','2lfa','2dpg','276q','2dpe','1l9k','277a','1yaw','1l9g','1yas','1l9e','1yaq','1l9y','1yba','2r6c','1xtq',
'2r6a','2nmc','2p84','2nma','2p82','2i44','2lbo','2i42','2lbm','273o','2dis','273m','2diq','1l2s','1xx0','1l2q','1xwy','2r62',
'2nm2','2p7e','2i3e','2la2','2722','2dfe','2nc0','2q8o','2rou','2nbk','2q8c','2nbc','2q86','2nb8','2nb6','2hls','2ndk','2q9a',
'2hlc','2nd8','2hl4','2nd2','2hl0','2hky','265c','2hnc','2ne6','264w','2hn0','264o','2hmu','264k','264i','1j8g','266w','2hny',
'1j80','266k','1j7s','266e','1j7o','1j7m','1ja0','267i','1j9o','1j9i','1jam','2qmo','2rvw','1p88','2qmg','2rvq','1p18','2qmc',
'1oxq','2qma','2n9s','2q7g','2o5s','2n9k','2q7a','2o5k','2qna','2o5g','2n9e','2o5e','2hg0','2nak','2j80','2hfs','2nae','2j7s',
'2o6e','2j7o','2hfm','2j7m','25sg','2hgs','29cg','25s8','2hgm','29c8','2j8m','29c4','25s2','29c2','1ihc','25t8','1plc','1ih4',
'25t2','1pl4','29d2','1pl0','1igy','1pky','1ii4','1pm4','1ihy','1ply','2sa0','21v4','2fi4','2s9w','21o8','2fem','2s9u','21ks',
'21j2','2qlk','2rva','1on0','2rfs','2sae','222k','1oji','2rfo','2qle','21z2','2rfm','2n8o','2q6u','2o2w','2n8k','2prc','2rg6',
'2n8i','2pr8','2o2q','2pr6','2hd4','2n92','2j1k','2hd0','2meg','2j1g','2hcy','2mec','2j1e','2mea','25m0','2hdi','28yw','25lw',
'2foo','28ys','25lu','2fok','28yq','2foi','1i3s','25me','1otk','1i3o','2294','1otg','1i3m','2290','1ote','228y','1i46','1oty',
'2s9g','21a0','2f7i','2s9e','216k','214u','2ql0','1oce','2rec','2qky','21dq','2rea','2n84','2o1g','2n82','2po4','2o1e','2po2',
'2hbo','2iyc','2hbm','2m7o','2iya','2m7m','25is','28s4','25iq','2fas','28s2','2faq','1hx0','1ofo','1hwy','21h0','1ofm','21gy',
'2s96','20zg','20xq','2qkq','2rdm','2n7u','2o0q','2pmi','2hay','2iwq','2m4a','25h6','28oq','2f3u','1htm','1o8q','212y','20u6',
'2n2o','2q3w','2n2g','2q3q','2n2c','2n2a','2h1s','2n3g','2h1k','2n3a','2h1g','2h1e','2500','2h2k','24zs','2h2e','24zo','24zm',
'1gwg','250s','1gw8','250m','1gw4','1gw2','1gx8','1gx2','2qaw','2rpy','1jwc','2qas','1jsu','2qaq','2n1k','2q3a','2nhk','2n1g',
'2nhg','2n1e','2nhe','2gyw','2n1y','2huw','2gys','2hus','2gyq','2huq','24tk','2gza','26lk','24tg','26lg','24te','26le','1giw',
'24ty','1k2w','1gis','1k2s','1giq','1k2q','1gja','1k3a','2rx0','1q7s','29oe','2rwy','1q4c','1q2m','2qac','1jlq','2qpg','2qaa',
'1qbi','2qpe','2n10','2ng4','2n0y','2oac','2ng2','2oaa','2gxg','2hro','2gxe','2jg4','2hrm','2jg2','24qc','26es','24qa','29ro',
'26eq','29rm','1gc4','1jp0','1gc2','1qes','1joy','1qeq','22uo','2fzw','22rc','2fy6','22po','22ou','2rwq','1px8','2sbe','22yk',
'1pvi','22wu','2qa2','2qoq','2ri2','2n0q','2nfe','2o8q','2pve','2gwq','2hq2','2jcq','2mm2','24oq','26be','29kq','2g3e','1g8q',
'1ji2','1q0q','22k8','2fum','22ik','22hq','1pry','22m6','22f0','22e6','22ce','2my0','2mxw','2mxu','2grs','2mye','2gro','2grm',
'24fc','2gs6','24f8','24f6','1fqg','24fq','1fqc','1fqa','1fqu','2q50','1h8e','2q4y','2mxg','2n5g','2mxe','2n5e','2gqc','2h6c',
'2gqa','2h6a','24c4','2584','24c2','2582','1fjo','1hbo','1fjm','1hbm','2rqi','1ke4','1kce','2q4q','2qca','2mx6','2n4q','2nju',
'2gpm','2h4q','2hyy','24ai','254q','26t6','1fga','1h4q','1khm','1qpk','29xa','1qnw','1qn2','1k8u','1qri','23cg','2g8s','23aw',
'2g7y','23a4','239q','1qkc','23ek','1qji','23dq','237c','2g66','236k','2366','1qhq','238e','234s','234e','233i','2gms','2gmq',
'2450','244y','1f5g','1f5e','2mze','2gm2','2gu2','243e','24je','1f22','1fy2','1hha','1kn0','1km6','1qyg','2a1q','1qxo','1qxa',
'1kke','1qzi','23lc','2gd8','23ko','2gcu','23kc','23k6','1qvw','23mk','1qvi','23m6','23iw','2gby','23ik','23ie','1qum','23ji',
'23ho','23hi','1hlq','1krg','1kr2','1r2w','2a3y','1r2k','1r2e','1kq6','1r3i','1r1o','1r1i');
$table3=array('2cio','2ku0','1v40','2c4w','2kn0','1uqo','2by0','2kji','1uk0','2buk','1ugo','2s40','1wps','2cxk','2s3s','1wc0',
'2cqk','2s3o','1w54','2cn2','2s3m','1w1o','2r4g','2s4s','1x4o','2r48','2s4m','1wxo','2r44','1wu6','2r42','2p5c','2r58','2p54',
'2r52','2p50','2p4y','2l74','2p64','2l6w','2p5y','2l6s','2l6q','2dao','2l7w','2dag','2l7q','2dac','1tj4','2bcg','2k8s','1t5s',
'2b5k','2k5a','1sz4','2b24','1svs','2b0e','1su4','2s14','1tyo','2bjw','2s10','1trs','2bge','2s0y','1toc','1tmm','2qy0','2s1i',
'1u64','2qxw','1u2m','2qxu','2ors','2qye','2oro','2orm','2kfc','2os6','2kf8','2kf6','2bqg','2kfq','2bqc','2bqa','1sdc','2arc',
'2jy6','1s6o','2anw','1s3c','2am6','1s1o','1s0u','2rzo','1sl4','2av2','2rzm','1sho','1sfy','2qus','1sou','2quq','2ol0','2oky',
'2k1g','2k1e','2ayc','2aya','1rsg','2ags','1rp4','2af2','1rng','1rmm','2ryy','1rwc','1rum','2qt6','2ohm','2jui','1ri0','2abi',
'1rgc','1rfi','1rjy','1rcs','1rby','1n7k','286o','2inw','1mu8','27zs','2ike','1mnk','27wc','1mk8','27um','1mik','2ru0','1nn4',
'28e4','2rtw','1ng8','28am','2rtu','1ncs','1nb2','2qjs','2rue','1nuk','2qjo','1nr2','2qjm','2nzc','2qk6','2nz8','2nz6','2iug',
'2nzq','2iuc','2iua','28ko','2iuu','28kk','28ki','2ehs','2ltk','2pha','1zgg','2eb4','2lq4','1za8','2e7s','2loe','1z74','2e64',
'1z5k','2e5a','1z4s','1m1s','27lk','2ida','209s','1lv4','27i4','2034','2em4','27ge','1zzs','1lq4','1zy4','1lpa','1zxa','2rsk',
'1m9k','27pa','2s8k','2rsi','20hk','1m64','2s8i','20e4','1m4e','20ce','2qgk','1mda','2rck','2qgi','20la','2rci','2nsk','2pkk',
'2nsi','2pki','2igk','2m0k','2igi','2m0i','27sk','27si','1yo0','2dww','2lj0','1yhs','2dtk','2lha','1yeo','2drw','1yd4','2dr2',
'1ycc','1yby','1lgw','27b0','1ywg','1ldk','279a','1yt4','2dz2','1yrg','1lb2','1yqm','2rru','1lks','2s6y','1z0c','1lj2','1yym',
'2qey','2r96','2np6','2pdm','2i9m','2lmi','27ei','1y3k','2dmg','2ldq','1y0g','2dks','1xyw','2djy','1xy4','1xxq','1l6g','275q',
'1y7s','1l4s','1y64','1l3y','1y5a','1l8e','1y9q','1xtc','2dh8','1xrs','2dge','1xr0','1xqm','1l18','1xvg','1l0e','1xum','1xo8',
'2dem','1xng','1xn2','1kym','1xpa','1xlo','1xla','1iw0','260o','2hku','1ipc','25x8','1im0','25vi','1ikc','1iji','2rp0','1j3s',
'264e','2roy','1j0c','1iym','2q9g','1j7i','2q9e','2nec','2nea','2ho4','2ho2','267o','267m','1p6o','2968','2j5o','1p0g','292w',
'2j3y','1oxc','2918','1ovs','290e','1ov0','1oum','1ib4','25q4','1pf4','1i7s','25oe','1pbs','298e','1pa4','1i5a','1p9a','2roa',
'1if0','2rwa','1pj0','1ida','1pha','2q7u','2qnu','2nay','2o6y','2hh6','2j96','25tm','2fhc','2mbc','2pq6','21mo','2fe8','2m9o',
'21k0','2fco','2m8u','21io','2fbw','21i0','2fbi','21ho','1om8','28vs','2j0e','221s','1oj4','28u4','21yo','2fjw','28ta','21x4',
'1ogs','21wc','1oge','21vy','1i0o','25ku','1oqg','1hz0','2260','1oos','1hy6','224c','1ony','223i','1i2m','1ose','227y','218g',
'2f74','2m64','215s','2f5k','2m5a','214g','2f4s','213s','2f4e','213g','213a','1oc0','28qk','21dc','1oag','28pq','21bs','2f8e',
'21b0','1o9a','21am','1hvg','1oe4','1hum','21fg','1oda','21em','20yo','2f20','2m3i','20xc','2f18','20wo','2f0u','20wc','20w6',
'1o6w','28ny','2114','1o64','210c','1o5q','20zy','1hsu','1o7y','2126','20ts','2ezg','20t4','2ez2','20ss','20sm','1o4c','20v0',
'1o3y','20um','20rc','2ey6','20r0','20qu','1o32','20ry','20q4','20py','1gq8','24xo','1gmw','24vy','1gl8','1gke','1gu4','1gse',
'2q4a','2n3u','2h2y','2516','1jvk','26ig','2htq','1jsg','26gs','1jqw','26fy','1jq4','1jpq','1gfs','24se','1jzs','1ge4','1jy4',
'1gda','1jxa','1ghq','1k1q','1q68','29o0','2jek','1q3k','29mg','2jdq','1q28','29lo','1q1k','29la','1q18','1q12','1jlc','26d8',
'1qb4','1jjs','26ce','1q9k','1jj0','1q8s','1jim','1q8e','1gak','1jng','1g9q','1qd8','1jmm','1qce','2fz4','2mk8','2pum','22ps',
'2fxs','2mjg','22ow','2fx4','2mj2','22og','2fws','22o8','2fwm','22o4','1pwg','29iw','2jby','22xs','1pv4','29i4','22wg','2g0s',
'29hq','22vs','1pu4','22vg','1pty','22va','1jg8','26am','1pyw','1jfg','2308','1py4','1jf2','22zg','1pxq','22z2','1g7y','1jha',
'1pzy','231a','22io','2fu8','2mho','22hs','2ftk','2mha','22hc','2ft8','22h4','2ft2','22h0','22gy','1prk','29gc','22ls','1pqw',
'29fy','22l4','2fv2','22ks','1pqe','22km','1jdo','1pss','1jda','22n0','1pse','22mm','22e8','2frs','2mge','22ds','2frg','22dk',
'2fra','22dg','22de','1pp4','29f2','22fs','1pos','22fg','1pom','22fa','1jce','1ppq','22ge','22c0','2fqk','22bs','2fqe','22bo',
'22bm','1pnw','22cs','1pnq','22cm','22aw','2fpy','22as','22aq','1pna','22ba','1fnc','24e6','1flo','1fku','1fpa','1h80','256k',
'1h6g','255q','1h5o','1h5a','1fi4','1ha4','1fha','1h9a','1kdc','26rc','2hy6','1kc0','26qk','1kbc','26q6','1kb0','1kau','1h2w',
'253y','1kfs','1h24','1kf0','1h1q','1kem','1ffi','1h3y','1kgu','1qo0','29ww','2jj0','1qn4','29w8','2jim','1qmo','29vw','1qmg',
'29vq','1qmc','1qma','1k8g','26os','1qr4','1k7s','26oe','1qqg','29xq','1qq4','1k7a','1qpy','1h0c','1k9o','1gzy','1qsc','1k9a',
'1qry','2g80','2moo','2pwu','2g7k','2moc','2g7c','2mo6','2g78','2g76','1qjk','29ug','2jhq','23ds','1qj4','29u4','23dc','2g98',
'29ty','23d4','1qis','23d0','1qiq','23cy','1k60','26ni','1ql4','1k5o','23fc','1qks','1k5i','23f0','1qkm','23eu','1gz2','1k6m',
'1qlq','23fy','2g5s','2mng','2g5k','2mna','2g5g','2g5e','1qhc','29t8','2380','1qh4','29t2','237s','2g6e','237o','1qgy','237m',
'1k4s','1qi4','1k4m','238s','1qhy','238m','2g4o','2mmu','2g4k','2g4i','1qg8','29sm','2354','1qg4','2350','1qg2','234y','1k46',
'1qgm','235i','2g44','2g42','1qfo','233o','1qfm','233m','1f3w','1f32','1fw8','24im','1fvg','1fv2','1f1a','1fxa','1hgw','25b0',
'1hg8','25am','1hfw','1hfq','1fto','1hi4','1fta','1hhq','1km8','26vs','2i0e','1kls','26vg','1klk','26va','1klg','1kle','1heg',
'259q','1kns','26we','1kng','1hdy','1kna','1fse','1hf2','1koe','2a1c','2jl8','2a14','2jl2','2a10','2a0y','1kk0','26uk','1qz4',
'2a24','26ue','1qyw','1kjo','1qys','1kjm','1qyq','1hd8','1kks','1hd2','1qzw','1kkm','1qzq','2mqw','2pxy','2mqs','2mqq','2a08',
'2jkm','2gdk','2a04','2gdg','2a02','2gde','1kiw','26ty','1qw8','1kis','23mw','1qw4','1kiq','23ms','1qw2','23mq','1hcm','1kja',
'1qwm','23na','2mqc','2mqa','29zo','2gc4','29zm','2gc2','1kic','1qus','1kia','23jo','1quq','23jm','2mq2','29ze','2gbe','1ki2',
'1qu2','23i2','1f8c','1f7y','1g0o','24ku','1g0c','1g06','1f72','1g1a','1hlc','25d8','1hl4','25d2','1hl0','1hky','1fzg','1hm4',
'1fza','1hly','26y0','2i1i','26xw','26xu','1hk8','25cm','1krs','26ye','1kro','1hk2','1krm','1fyu','1hkm','1ks6','2jmc','2jma',
'26xg','2a44','26xe','2a42','1hjo','1kqc','1hjm','1r3o','1kqa','1r3m','2jm2','26x6','2a3e','1hje','1kpm','1r22','1fak','1fae',
'1g2w','24ly','1g2s','1g2q','1f9y','1g3a','25ec','25ea','1g2c','1ho4','1g2a','1ho2','2i22');
// Decoding tables
foreach($table1 as &$char) { $char = decbin(intval($char, 36)); }
foreach($table2 as &$char) { $char = decbin(intval($char, 36)); }
foreach($table3 as &$char) { $char = decbin(intval($char, 36)); }
$bars = array();
$block = 0;
for($row=0; $row<$size[0]; $row++) {
$bars[$row] = $special_bars['start'];
if($row%3==0) { $bars[$row] .= $table1[floor($row/3)*30 + floor(($size[0]-1)/3)]; }
elseif($row%3==1) { $bars[$row] .= $table2[floor($row/3)*30 + $s*3 + (($size[0]-1)%3)]; }
elseif($row%3==2) { $bars[$row] .= $table3[floor($row/3)*30 + ($size[1]-1)]; }
for($col=0; $col<$size[1]; $col++) {
$cw = $blocks[$block++];
if($row%3==0) { $bars[$row] .= $table1[$cw]; }
elseif($row%3==1) { $bars[$row] .= $table2[$cw]; }
elseif($row%3==2) { $bars[$row] .= $table3[$cw]; }
}
if($row%3==0) { $bars[$row] .= $table1[floor($row/3)*30 + ($size[1]-1)]; }
elseif($row%3==1) { $bars[$row] .= $table2[floor($row/3)*30 + floor(($size[0]-1)/3)]; }
elseif($row%3==2) { $bars[$row] .= $table3[floor($row/3)*30 + $s*3 + (($size[0]-1)%3)]; }
$bars[$row] .= $special_bars['stop'];
}
unset($cw, $blocks, $table1, $table2, $table3);
$img = imagecreate(strlen($bars[0])*MODULE_WIDTH, count($bars)*MODULE_HEIGHT);
$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);
$top = 0;
foreach($bars as $bar) {
foreach(str_split($bar) as $i => $j) {
if($j == '1') {
imagefilledrectangle($img, $i*MODULE_WIDTH, $top, $i*MODULE_WIDTH+MODULE_WIDTH-1, $top+MODULE_HEIGHT-1, $black);
}
}
$top += MODULE_HEIGHT;
}
header('Content-Type: image/gif');
imagegif($img);
?>
Browse Code © 2010 by Jacek Kowalski