diff options
Diffstat (limited to 'phpBB/phpbb/captcha/gd_wave.php')
| -rw-r--r-- | phpBB/phpbb/captcha/gd_wave.php | 845 | 
1 files changed, 845 insertions, 0 deletions
diff --git a/phpBB/phpbb/captcha/gd_wave.php b/phpBB/phpbb/captcha/gd_wave.php new file mode 100644 index 0000000000..d48fc753a5 --- /dev/null +++ b/phpBB/phpbb/captcha/gd_wave.php @@ -0,0 +1,845 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\captcha; + +/** +* Wave3D CAPTCHA +*/ +class gd_wave +{ +	var $width		= 360; +	var $height		= 96; + +	function execute($code, $seed) +	{ +		global $starttime; + +		// seed the random generator +		mt_srand($seed); + +		// set height and width +		$img_x = $this->width; +		$img_y = $this->height; + +		// Generate image +		$img	= imagecreatetruecolor($img_x, $img_y); +		$x_grid = mt_rand(6, 10); +		$y_grid = mt_rand(6, 10); + +		// Ok, so lets cut to the chase. We could accurately represent this in 3d and +		// do all the appropriate linear transforms. my questions is... why bother? +		// The computational overhead is unnecessary when you consider the simple fact: +		// we're not here to accurately represent a model, but to just show off some random-ish +		// polygons + +		// Conceive of 3 spaces. +		// 1) planar-space (discrete "pixel" grid) +		// 2) 3-space. (planar-space with z/height aspect) +		// 3) image space (pixels on the screen) +		// resolution of the planar-space we're embedding the text code in +		$plane_x	= 100; +		$plane_y	= 30; + +		$subdivision_factor = 3; + +		// $box is the 4 points in img_space that correspond to the corners of the plane in 3-space +		$box = array( +			'upper_left'	=> array( +				'x' => mt_rand(5, 15), +				'y' => mt_rand(10, 15) +			), +			'upper_right'	=> array( +				'x' => mt_rand($img_x - 35, $img_x - 19), +				'y' => mt_rand(10, 17) +			), +			'lower_left'	=> array( +				'x' => mt_rand($img_x - 45, $img_x - 5), +				'y' => mt_rand($img_y - 15, $img_y - 0), +			), +		); + +		$box['lower_right'] = array( +			'x' => $box['lower_left']['x'] + $box['upper_left']['x'] - $box['upper_right']['x'], +			'y' => $box['lower_left']['y'] + $box['upper_left']['y'] - $box['upper_right']['y'], +		); + +		// TODO +		$background = imagecolorallocate($img, mt_rand(155, 255), mt_rand(155, 255), mt_rand(155, 255)); +		imagefill($img, 0, 0, $background); +		$black = imagecolorallocate($img, 0, 0, 0); + +		$random = array(); +		$fontcolors = array(); + +		for ($i = 0; $i < 15; ++$i) +		{ +			$random[$i] = imagecolorallocate($img, mt_rand(120, 255), mt_rand(120, 255), mt_rand(120, 255)); +		} + +		$fontcolors[0] = imagecolorallocate($img, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120)); + +		$colors = array(); + +		$minr = mt_rand(20, 30); +		$ming = mt_rand(20, 30); +		$minb = mt_rand(20, 30); + +		$maxr = mt_rand(150, 230); +		$maxg = mt_rand(150, 230); +		$maxb = mt_rand(150, 230); + +		for ($i = -30; $i <= 30; ++$i) +		{ +			$coeff1 = ($i + 12) / 45; +			$coeff2 = 1 - $coeff1; +			$colors[$i] = imagecolorallocate($img, ($coeff2 * $maxr) + ($coeff1 * $minr), ($coeff2 * $maxg) + ($coeff1 * $ming), ($coeff2 * $maxb) + ($coeff1 * $minb)); +		} + +		// $img_buffer is the last row of 3-space positions (converted to img-space), cached +		// (using this means we don't need to recalculate all 4 positions for each new polygon, +		// merely the newest point that we're adding, which is then cached. +		$img_buffer = array(array(), array()); + +		// In image-space, the x- and y-offset necessary to move one unit in the x-direction in planar-space +		$dxx = ($box['upper_right']['x'] - $box['upper_left']['x']) / ($subdivision_factor * $plane_x); +		$dxy = ($box['upper_right']['y'] - $box['upper_left']['y']) / ($subdivision_factor * $plane_x); + +		// In image-space, the x- and y-offset necessary to move one unit in the y-direction in planar-space +		$dyx = ($box['lower_right']['x'] - $box['upper_left']['x']) / ($subdivision_factor * $plane_y); +		$dyy = ($box['lower_right']['y'] - $box['upper_left']['y']) / ($subdivision_factor * $plane_y); + +		// Initial captcha-letter offset in planar-space +		$plane_offset_x = mt_rand(3, 8); +		$plane_offset_y = mt_rand( 12, 15); + +		// character map +		$map = $this->captcha_bitmaps(); + +		// matrix +		$plane = array(); + +		// for each character, we'll silkscreen it into our boolean pixel plane +		for ($c = 0, $code_num = strlen($code); $c < $code_num; ++$c) +		{ +			$letter = $code[$c]; + +			for ($x = $map['width'] - 1; $x >= 0; --$x) +			{ +				for ($y = $map['height'] - 1; $y >= 0; --$y) +				{ +					if ($map['data'][$letter][$y][$x]) +					{ +						$plane[$y + $plane_offset_y + (($c & 1) ? 1 : -1)][$x + $plane_offset_x] = true; +					} +				} +			} +			$plane_offset_x += 11; +		} + +		// calculate our first buffer, we can't actually draw polys with these yet +		// img_pos_prev == screen x,y location to our immediate left. +		// img_pos_cur == current screen x,y location +		// we calculate screen position of our +		// current cell based on the difference from the previous cell +		// rather than recalculating from absolute coordinates +		// What we cache into the $img_buffer contains the raised text coordinates. +		$img_pos_prev	= $img_buffer[0][0] = array($box['upper_left']['x'], $box['upper_left']['y']); +		$cur_height		= $prev_height = $this->wave_height(0, 0, $subdivision_factor); +		$full_x			= $plane_x * $subdivision_factor; +		$full_y			= $plane_y * $subdivision_factor; + +		for ($x = 1; $x <= $full_x; ++$x) +		{ +			$cur_height		= $this->wave_height($x, 0, $subdivision_factor); +			$offset			= $cur_height - $prev_height; +			$img_pos_cur	= array($img_pos_prev[0] + $dxx, $img_pos_prev[1] + $dxy + $offset); + +			$img_buffer[0][$x]	= $img_pos_cur; +			$img_pos_prev		= $img_pos_cur; +			$prev_height		= $cur_height; +		} + +		for ($y = 1; $y <= $full_y; ++$y) +		{ +			// swap buffers +			$buffer_cur		= $y & 1; +			$buffer_prev	= 1 - $buffer_cur; + +			$prev_height	= $this->wave_height(0, $y, $subdivision_factor); +			$offset			= $prev_height - $this->wave_height(0, $y - 1, $subdivision_factor); +			$img_pos_cur	= array($img_buffer[$buffer_prev][0][0] + $dyx, min($img_buffer[$buffer_prev][0][1] + $dyy + $offset, $img_y - 1)); + +			// make sure we don't try to write off the page +			$img_pos_prev	= $img_pos_cur; + +			$img_buffer[$buffer_cur][0]	= $img_pos_cur; + +			for ($x = 1; $x <= $full_x; ++$x) +			{ +				$cur_height		= $this->wave_height($x, $y, $subdivision_factor) + $this->grid_height($x, $y, $x_grid, $y_grid, 1); + +				// height is a z-factor, not a y-factor +				$offset			= $cur_height - $prev_height; +				$img_pos_cur	= array($img_pos_prev[0] + $dxx, $img_pos_prev[1] + $dxy + $offset); + +				// height is float, index it to an int, get closest color +				$color			= $colors[intval($cur_height)]; +				$img_pos_prev	= $img_pos_cur; +				$prev_height	= $cur_height; + +				$y_index_old = intval(($y - 1) / $subdivision_factor); +				$y_index_new = intval($y / $subdivision_factor); +				$x_index_old = intval(($x - 1) / $subdivision_factor); +				$x_index_new = intval($x / $subdivision_factor); + +				if (!empty($plane[$y_index_new][$x_index_new])) +				{ +					$img_pos_cur[1]	+= $this->wave_height($x, $y, $subdivision_factor, 1) - 30 - $cur_height; +					$color			= $colors[20]; +				} +				$img_pos_cur[1] = min($img_pos_cur[1], $img_y - 1); +				$img_buffer[$buffer_cur][$x] = $img_pos_cur; + +				// Smooth the edges as much as possible by having not more than one low<->high traingle per square +				// Otherwise, just +				$diag_down	= (empty($plane[$y_index_old][$x_index_old]) == empty($plane[$y_index_new][$x_index_new])); +				$diag_up	= (empty($plane[$y_index_old][$x_index_new]) == empty($plane[$y_index_new][$x_index_old])); + +				// natural switching +				$mode = ($x + $y) & 1; + +				// override if it requires it +				if ($diag_down != $diag_up) +				{ +					$mode = $diag_up; +				} + +				if ($mode) +				{ +					//		+-/			  / +					// 1	|/		2	 /| +					//		/			/-+ +					$poly1 = array_merge($img_buffer[$buffer_cur][$x - 1], $img_buffer[$buffer_prev][$x - 1], $img_buffer[$buffer_prev][$x]); +					$poly2 = array_merge($img_buffer[$buffer_cur][$x - 1], $img_buffer[$buffer_cur][$x], $img_buffer[$buffer_prev][$x]); +				} +				else +				{ +					//		\			\-+ +					// 1	|\		2	 \| +					//		+-\			  \ +					$poly1 = array_merge($img_buffer[$buffer_cur][$x - 1], $img_buffer[$buffer_prev][$x - 1], $img_buffer[$buffer_cur][$x]); +					$poly2 = array_merge($img_buffer[$buffer_prev][$x - 1], $img_buffer[$buffer_prev][$x], $img_buffer[$buffer_cur][$x]); +				} + +				imagefilledpolygon($img, $poly1, 3, $color); +				imagefilledpolygon($img, $poly2, 3, $color); +			} +		} + +		// Output image +		header('Content-Type: image/png'); +		header('Cache-control: no-cache, no-store'); +		//$mtime = explode(' ', microtime()); +		//$totaltime = $mtime[0] + $mtime[1] - $starttime; + +		//echo $totaltime . "<br />\n"; +		//echo memory_get_usage() - $tmp; +		imagepng($img); +		imagedestroy($img); +	} + +	function wave_height($x, $y, $factor = 1, $tweak = 0.7) +	{ +		// stretch the wave. TODO: pretty it up +		$x = $x/5 + 180; +		$y = $y/4; +		return ((sin($x / (3 * $factor)) + sin($y / (3 * $factor))) * 10 * $tweak); +	} + +	function grid_height($x, $y, $x_grid, $y_grid, $factor = 1) +	{ +		return ((!($x % ($x_grid * $factor)) || !($y % ($y_grid * $factor))) ? 3 : 0); +	} + +	function captcha_bitmaps() +	{ +		return array( +			'width'		=> 9, +			'height'	=> 13, +			'data'		=> array( +				'A' => array( +					array(0,0,1,1,1,1,0,0,0), +					array(0,1,0,0,0,0,1,0,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,1,1,1,1,1,1,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'B' => array( +					array(1,1,1,1,1,1,0,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,1,1,1,1,1,0,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,1,1,1,1,1,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'C' => array( +					array(0,0,1,1,1,1,1,0,0), +					array(0,1,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,1,0), +					array(0,0,1,1,1,1,1,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'D' => array( +					array(1,1,1,1,1,1,1,0,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,1,0), +					array(1,1,1,1,1,1,1,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'E' => array( +					array(0,0,1,1,1,1,1,1,1), +					array(0,1,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,1,1,1,1,1,1,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(0,1,0,0,0,0,0,0,0), +					array(0,0,1,1,1,1,1,1,1), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'F' => array( +					array(0,0,1,1,1,1,1,1,0), +					array(0,1,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,1,1,1,1,1,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'G' => array( +					array(0,0,1,1,1,1,1,0,0), +					array(0,1,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,1,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,1,0), +					array(0,0,1,1,1,1,1,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'H' => array( +					array(1,0,0,0,0,0,1,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,1,1,1,1,1,1,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'I' => array( +					array(0,1,1,1,1,1,1,1,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,1,1,1,1,1,1,1,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'J' => array( +					array(0,0,0,0,0,0,1,1,1), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,0,1), +					array(0,0,1,0,0,0,0,1,0), +					array(0,0,0,1,1,1,1,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'K' => array( +					array(1,0,0,0,0,0,1,0,0), +					array(1,0,0,0,0,1,0,0,0), +					array(1,0,0,0,1,0,0,0,0), +					array(1,0,0,1,0,0,0,0,0), +					array(1,0,1,0,0,0,0,0,0), +					array(1,1,0,0,0,0,0,0,0), +					array(1,0,1,0,0,0,0,0,0), +					array(1,0,0,1,0,0,0,0,0), +					array(1,0,0,0,1,0,0,0,0), +					array(1,0,0,0,0,1,0,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'L' => array( +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(0,1,0,0,0,0,0,0,0), +					array(0,0,1,1,1,1,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'M' => array( +					array(0,1,0,0,0,0,0,1,0), +					array(0,1,1,0,0,0,1,1,0), +					array(0,1,0,1,0,1,0,1,0), +					array(0,1,0,0,1,0,0,1,0), +					array(0,1,0,0,0,0,0,1,0), +					array(0,1,0,0,0,0,0,1,0), +					array(0,1,0,0,0,0,0,1,0), +					array(0,1,0,0,0,0,0,1,0), +					array(0,1,0,0,0,0,0,1,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'N' => array( +					array(1,0,0,0,0,0,0,0,1), +					array(1,1,0,0,0,0,0,0,1), +					array(1,0,1,0,0,0,0,0,1), +					array(1,0,0,1,0,0,0,0,1), +					array(1,0,0,0,1,0,0,0,1), +					array(1,0,0,0,0,1,0,0,1), +					array(1,0,0,0,0,0,1,0,1), +					array(1,0,0,0,0,0,0,1,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'O' => array( +					array(0,0,0,1,1,1,0,0,0), +					array(0,0,1,0,0,0,1,0,0), +					array(0,1,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,1,0), +					array(0,0,1,0,0,0,1,0,0), +					array(0,0,0,1,1,1,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'P' => array( +					array(1,1,1,1,1,1,0,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,1,1,1,1,1,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'Q' => array( +					array(0,0,1,1,1,1,0,0,0), +					array(0,1,0,0,0,0,1,0,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,1,0,0,1,0), +					array(1,0,0,0,0,1,0,1,0), +					array(0,1,0,0,0,0,1,0,0), +					array(0,0,1,1,1,1,0,1,0), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'R' => array( +					array(1,1,1,1,1,1,0,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,1,0,0), +					array(1,1,1,1,1,1,0,0,0), +					array(1,0,1,0,0,0,0,0,0), +					array(1,0,0,1,0,0,0,0,0), +					array(1,0,0,0,1,0,0,0,0), +					array(1,0,0,0,0,1,0,0,0), +					array(1,0,0,0,0,0,1,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'S' => array( +					array(0,0,1,1,1,1,1,1,1), +					array(0,1,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(0,1,0,0,0,0,0,0,0), +					array(0,0,1,1,1,1,1,0,0), +					array(0,0,0,0,0,0,0,1,0), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,1,0), +					array(1,1,1,1,1,1,1,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'T' => array( +					array(1,1,1,1,1,1,1,1,1), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'U' => array( +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,1,0), +					array(0,0,1,1,1,1,1,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'V' => array( +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,1,0), +					array(0,0,1,0,0,0,1,0,0), +					array(0,0,0,1,0,1,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'W' => array( +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,1,0,0,0,1), +					array(1,0,0,1,0,1,0,0,1), +					array(1,0,1,0,0,0,1,0,1), +					array(1,1,0,0,0,0,0,1,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'X' => array( +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,1,0), +					array(0,0,1,0,0,0,1,0,0), +					array(0,0,0,1,0,1,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,1,0,1,0,0,0), +					array(0,0,1,0,0,0,1,0,0), +					array(0,1,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'Y' => array( +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,1,0), +					array(0,0,1,0,0,0,1,0,0), +					array(0,0,0,1,0,1,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'Z' => array( +					array(1,1,1,1,1,1,1,1,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,1,0), +					array(0,0,0,0,0,0,1,0,0), +					array(0,0,0,0,0,1,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,1,0,0,0,0,0), +					array(0,0,1,0,0,0,0,0,0), +					array(0,1,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,1), +					array(1,1,1,1,1,1,1,1,1), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'1' => array( +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,1,1,0,0,0,0), +					array(0,0,1,0,1,0,0,0,0), +					array(0,1,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,1,1,1,1,1,1,1,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'2' => array( +					array(0,0,0,1,1,1,0,0,0), +					array(0,0,1,0,0,0,1,0,0), +					array(0,1,0,0,0,0,0,1,0), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,1,0), +					array(0,0,0,0,0,0,1,0,0), +					array(0,0,0,0,0,1,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,1,0,0,0,0,0), +					array(0,0,1,0,0,0,0,0,0), +					array(0,1,1,1,1,1,1,1,1), +					array(0,0,0,0,0,0,0,0,0), +				), +				'3' => array( +					array(0,0,0,1,1,1,1,0,0), +					array(0,0,1,0,0,0,0,1,0), +					array(0,1,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,1,0), +					array(0,0,0,0,0,1,1,0,0), +					array(0,0,0,0,0,0,0,1,0), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,0,1), +					array(0,0,1,0,0,0,0,1,0), +					array(0,0,0,1,1,1,1,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'4' => array( +					array(0,0,0,0,0,0,0,1,0), +					array(0,0,0,0,0,0,1,1,0), +					array(0,0,0,0,0,1,0,1,0), +					array(0,0,0,0,1,0,0,1,0), +					array(0,0,0,1,0,0,0,1,0), +					array(0,0,1,0,0,0,0,1,0), +					array(0,1,1,1,1,1,1,1,1), +					array(0,0,0,0,0,0,0,1,0), +					array(0,0,0,0,0,0,0,1,0), +					array(0,0,0,0,0,0,0,1,0), +					array(0,0,0,0,0,0,0,1,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'5' => array( +					array(1,1,1,1,1,1,1,1,1), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(0,1,0,0,0,0,0,0,0), +					array(0,0,1,1,1,1,1,0,0), +					array(0,0,0,0,0,0,0,1,0), +					array(0,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,1,0), +					array(0,0,1,1,1,1,1,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'6' => array( +					array(0,0,1,1,1,1,1,0,0), +					array(0,1,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,0,0,0,0,0,0), +					array(1,0,0,1,1,1,1,0,0), +					array(1,0,1,0,0,0,0,1,0), +					array(1,1,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,1,0), +					array(0,0,1,1,1,1,1,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'7' => array( +					array(1,1,1,1,1,1,1,1,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,1,0), +					array(0,0,0,0,0,0,1,0,0), +					array(0,0,0,0,0,1,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,1,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'8' => array( +					array(0,0,1,1,1,1,1,0,0), +					array(0,1,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,1,0), +					array(0,0,1,1,1,1,1,0,0), +					array(0,1,0,0,0,0,0,1,0), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(1,0,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,1,0), +					array(0,0,1,1,1,1,1,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +				'9' => array( +					array(0,0,0,1,1,1,1,0,0), +					array(0,0,1,0,0,0,0,1,0), +					array(0,1,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,1,1), +					array(0,0,1,1,1,1,1,0,1), +					array(0,0,0,0,0,0,0,0,1), +					array(0,0,0,0,0,0,0,0,1), +					array(0,1,0,0,0,0,0,0,1), +					array(0,0,1,0,0,0,0,1,0), +					array(0,0,0,1,1,1,1,0,0), +					array(0,0,0,0,0,0,0,0,0), +					array(0,0,0,0,0,0,0,0,0), +				), +			) +		); +	} +}  | 
