Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 721
gd_wave
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 4
380.00
0.00% covered (danger)
0.00%
0 / 721
 execute
0.00% covered (danger)
0.00%
0 / 1
210.00
0.00% covered (danger)
0.00%
0 / 144
 wave_height
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 5
 grid_height
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 3
 captcha_bitmaps
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 569
<?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)
    {
        // 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);
        $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;
            $red = ($coeff2 * $maxr) + ($coeff1 * $minr);
            $green = ($coeff2 * $maxg) + ($coeff1 * $ming);
            $blue = ($coeff2 * $maxb) + ($coeff1 * $minb);
            $colors[$i] = imagecolorallocate($img, min([255, (int) $red]), min([255, (int) $green]), min([255, (int) $blue]));
        }
        // $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']);
        $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),
                ),
            )
        );
    }
}