| ############################################################################### |
| ############################################################################### |
| # Captcha.pl # |
| # Captcha.pm # |
| |
| # $Date: 01.05.16 $ # |
| ############################################################################### |
| ############################################################################### |
| # YaBB: Yet another Bulletin Board # |
| # YaBB: Yet another Bulletin Board # |
| # Open-Source Community Software for Webmasters # |
| # Open-Source Community Software for Webmasters # |
| # Version: YaBB 2.5.2 # |
| # Version: YaBB 2.6.12 # |
| # Packaged: October 21, 2012 # |
| # Packaged: January 5, 2016 # |
| # Distributed by: http://www.yabbforum.com # |
| # Distributed by: http://www.yabbforum.com # |
| # =========================================================================== # |
| # =========================================================================== # |
| # Copyright (c) 2000-2012 YaBB (www.yabbforum.com) - All Rights Reserved. # |
| # Copyright (c) 2000-2016 YaBB (www.yabbforum.com) - All Rights Reserved. # |
| # Software by: The YaBB Development Team # |
| # Software by: The YaBB Development Team # |
| # with assistance from the YaBB community. # |
| # with assistance from the YaBB community. # |
| ############################################################################### |
| ############################################################################### |
| |
| |
| $captchaplver = 'YaBB 2.5.2 $Revision: 1.0 $'; |
| |
| if ($action eq 'detailedversion') { return 1; } |
| |
| |
| |
| $| = 1; |
| |
| |
| |
| # Generate GIF image of a message |
| # Generate GIF image of a message |
| # Version 1.5 |
| # Version 1.5 |
| # by Andrew Gregory |
| # by Andrew Gregory |
| # 17 February 2007 |
| # 17 February 2007 |
| # |
| # |
| # http://www.scss.com.au/family/andrew/webdesign/msgimg/ |
| # http://www.scss.com.au/family/andrew/webdesign/msgimg/ |
| # |
| # |
| # This work is licensed under the Creative Commons |
| # This work is licensed under the Creative Commons |
| # Attribution-NonCommercial-ShareAlike License. To view a copy of this license, |
| # Attribution-NonCommercial-ShareAlike License. To view a copy of this license, |
| # visit http://creativecommons.org/licenses/by-nc-sa/1.0/ or send a letter to |
| # visit http://creativecommons.org/licenses/by-nc-sa/1.0/ or send a letter to |
| # Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. |
| # Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. |
| |
| |
| if(!$rgb_foreground){ |
| # use strict; |
| $rgb_foreground = "0000EE"; |
| # use warnings; |
| |
| no warnings qw(uninitialized once redefine); |
| |
| use CGI::Carp qw(fatalsToBrowser); |
| |
| use English '-no_match_vars'; |
| |
| our $VERSION = '2.6.12'; |
| |
| |
| |
| $captchapmver = 'YaBB 2.6.12 $Revision: 1651 $'; |
| |
| if ( $action eq 'detailedversion' ) { return 1; } |
| |
| |
| |
| $OUTPUT_AUTOFLUSH = 1; |
| |
| |
| |
| if ( !$rgb_foreground ) { |
| |
| $rgb_foreground = '0000EE'; |
| } |
| } |
| |
| |
| if(!$rgb_shade){ |
| if ( !$rgb_shade ) { |
| $rgb_shade = "999999"; |
| $rgb_shade = '999999'; |
| } |
| } |
| |
| |
| if(!$rgb_background){ |
| if ( !$rgb_background ) { |
| $rgb_background = "FFFFFF"; |
| $rgb_background = 'FFFFFF'; |
| } |
| } |
| |
| |
| sub captcha { |
| sub captcha { |
| my $msg = $_[0]; |
| my ($msg) = @_; |
| ## make colors for validation image into hex again ## |
| ## make colors for validation image into hex again ## |
| $rgb_foreground =~ s/\#//g; |
| $rgb_foreground =~ s/\#//gxsm; |
| $rgb_shade =~ s/\#//g; |
| $rgb_shade =~ s/\#//gxsm; |
| $rgb_background =~ s/\#//g; |
| $rgb_background =~ s/\#//gxsm; |
| $r_f = substr($rgb_foreground,0,2); |
| $r_f = substr $rgb_foreground, 0, 2; |
| $g_f = substr($rgb_foreground,2,2); |
| $g_f = substr $rgb_foreground, 2, 2; |
| $b_f = substr($rgb_foreground,4,2); |
| $b_f = substr $rgb_foreground, 4, 2; |
| $r_s = substr($rgb_shade,0,2); |
| $r_s = substr $rgb_shade, 0, 2; |
| $g_s = substr($rgb_shade,2,2); |
| $g_s = substr $rgb_shade, 2, 2; |
| $b_s = substr($rgb_shade,4,2); |
| $b_s = substr $rgb_shade, 4, 2; |
| $r_b = substr($rgb_background,0,2); |
| $r_b = substr $rgb_background, 0, 2; |
| $g_b = substr($rgb_background,2,2); |
| $g_b = substr $rgb_background, 2, 2; |
| $b_b = substr($rgb_background,4,2); |
| $b_b = substr $rgb_background, 4, 2; |
| |
| |
| # color for center cross of the dots (RGB) |
| # color for center cross of the dots (RGB) |
| $highcolor = pack("H2",$r_f); |
| $highcolor = pack 'H2', $r_f; |
| $highcolor .= pack("H2",$g_f); |
| $highcolor .= pack 'H2', $g_f; |
| $highcolor .= pack("H2",$b_f); |
| $highcolor .= pack 'H2', $b_f; |
| |
| |
| # color for shade in the dots (RGB) |
| # color for shade in the dots (RGB) |
| $shadecolor = pack("H2",$r_s); |
| $shadecolor = pack 'H2', $r_s; |
| $shadecolor .= pack("H2",$g_s); |
| $shadecolor .= pack 'H2', $g_s; |
| $shadecolor .= pack("H2",$b_s); |
| $shadecolor .= pack 'H2', $b_s; |
| |
| |
| |
| # color for background of the dots (RGB) |
| # color for background of the dots (RGB) |
| $backcolor = pack 'H2', $r_b; |
| $backcolor = pack("H2",$r_b); |
| $backcolor .= pack 'H2', $g_b; |
| $backcolor .= pack("H2",$g_b); |
| $backcolor .= pack 'H2', $b_b; |
| $backcolor .= pack("H2",$b_b); |
| |
| |
| if ( !$translayer || $translayer eq '0' ) { $TRANSPARENT_INDEX = "\3"; } |
| if (!$translayer || $translayer == "0") { $TRANSPARENT_INDEX = "\3"; } |
| else { $TRANSPARENT_INDEX = "\0"; } |
| else { $TRANSPARENT_INDEX = "\0"; } |
| |
| |
| # Palette |
| # Palette |
| |
| |
| $BITS_PER_PIXEL = 7; # DON'T CHANGE THIS!!! |
| $BITS_PER_PIXEL = 7; # DON'T CHANGE THIS!!! |
| |
| |
| # A note about BITS_PER_PIXEL: GIF data is bit packed. For example, if the code |
| # A note about BITS_PER_PIXEL: GIF data is bit packed. For example, if the code |
| # size is 6 bits, then 4 codes can be packed into 3 bytes. This script does not |
| # size is 6 bits, then 4 codes can be packed into 3 bytes. This script does not |
| # implement bit packing. 7 bits per pixel translates into 8 bits per code which |
| # implement bit packing. 7 bits per pixel translates into 8 bits per code which |
| # exactly matches a byte and therefore bit packing is not needed. |
| # exactly matches a byte and therefore bit packing is not needed. |
| |
| |
| $palette .= "$backcolor"; # 0 = white |
| $palette .= "$backcolor"; # 0 = white |
| $palette .= "$shadecolor"; # 1 = grey |
| $palette .= "$shadecolor"; # 1 = grey |
| $palette .= "$highcolor"; # 2 = almost black |
| $palette .= "$highcolor"; # 2 = almost black |
| |
| |
| |
| |
| # Dot definition |
| |
| # Defines a dot in terms of palette colours. |
| |
| |
| # Dot definition |
| $DOT_WIDTH = 3; |
| # Defines a dot in terms of palette colours. |
| $DOT_HEIGHT = 3; |
| |
| |
| $DOT_WIDTH = 3; |
| $dot = qq~ |
| $DOT_HEIGHT = 3; |
| |
| |
| |
| $dot = qq~ |
| |
| \1\2\1 |
| \1\2\1 |
| \2\2\2 |
| \2\2\2 |
| \1\2\1 |
| \1\2\1 |
| ~; |
| ~; |
| $nodot = qq~ |
| $nodot = qq~ |
| \0\0\0 |
| \0\0\0 |
| \0\0\0 |
| \0\0\0 |
| \0\0\0 |
| \0\0\0 |
| ~; |
| ~; |
| |
| |
| $invdot = qq~ |
| $invdot = qq~ |
| \1\0\1 |
| \1\0\1 |
| \0\0\0 |
| \0\0\0 |
| \1\0\1 |
| \1\0\1 |
| ~; |
| ~; |
| $invnodot = qq~ |
| $invnodot = qq~ |
| \1\1\1 |
| \1\1\1 |
| \1\1\1 |
| \1\1\1 |
| \1\1\1 |
| \1\1\1 |
| ~; |
| ~; |
| |
| |
| ############################################### |
| ############################################### |
| ############################################### |
| ############################################### |
| |
| |
| # Character definitions |
| # Character definitions |
| my($CHAR_WIDTH, $CHAR_HEIGHT, %ci); |
| my ( $CHAR_WIDTH, $CHAR_HEIGHT, %ci ); |
| |
| |
| $CHAR_WIDTH = 7; |
| $CHAR_WIDTH = 7; |
| $CHAR_HEIGHT = 10; |
| $CHAR_HEIGHT = 10; |
| |
| |
| $ci{' '} = qq~ |
| $ci{' '} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'!'} = qq~ |
| $ci{'!'} = qq~ |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'"'} = qq~ |
| $ci{'"'} = qq~ |
| ....... |
| ....... |
| ..X.X.. |
| ..X.X.. |
| ..X.X.. |
| ..X.X.. |
| ..X.X.. |
| ..X.X.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'#'} = qq~ |
| $ci{'#'} = qq~ |
| ....... |
| ....... |
| ..X.X.. |
| ..X.X.. |
| ..X.X.. |
| ..X.X.. |
| .XXXXX. |
| .XXXXX. |
| ..X.X.. |
| ..X.X.. |
| .XXXXX. |
| .XXXXX. |
| ..X.X.. |
| ..X.X.. |
| ..X.X.. |
| ..X.X.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'$'} = qq~ |
| $ci{'$'} = qq~ |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ..XXXX. |
| ..XXXX. |
| .X.X... |
| .X.X... |
| ..XXX.. |
| ..XXX.. |
| ...X.X. |
| ...X.X. |
| .XXXX.. |
| .XXXX.. |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'%'} = qq~ |
| $ci{'%'} = qq~ |
| ....... |
| ....... |
| .XX.... |
| .XX.... |
| .XX..X. |
| .XX..X. |
| ....X.. |
| ....X.. |
| ...X... |
| ...X... |
| ..X.... |
| ..X.... |
| .X..XX. |
| .X..XX. |
| ....XX. |
| ....XX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'&'} = qq~ |
| $ci{'&'} = qq~ |
| ....... |
| ....... |
| ..X.... |
| ..X.... |
| .X.X... |
| .X.X... |
| .X.X... |
| .X.X... |
| ..X.... |
| ..X.... |
| .X.X.X. |
| .X.X.X. |
| .X..X.. |
| .X..X.. |
| ..XX.X. |
| ..XX.X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'\''} = qq~ |
| $ci{'\x27'} = qq~ |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'('} = qq~ |
| $ci{'('} = qq~ |
| ....... |
| ....... |
| ....X.. |
| ....X.. |
| ...X... |
| ...X... |
| ..X.... |
| ..X.... |
| ..X.... |
| ..X.... |
| ..X.... |
| ..X.... |
| ...X... |
| ...X... |
| ....X.. |
| ....X.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{')'} = qq~ |
| $ci{')'} = qq~ |
| ....... |
| ....... |
| ..X.... |
| ..X.... |
| ...X... |
| ...X... |
| ....X.. |
| ....X.. |
| ....X.. |
| ....X.. |
| ....X.. |
| ....X.. |
| ...X... |
| ...X... |
| ..X.... |
| ..X.... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'*'} = qq~ |
| $ci{'*'} = qq~ |
| ....... |
| ....... |
| ...X... |
| ...X... |
| .X.X.X. |
| .X.X.X. |
| ..XXX.. |
| ..XXX.. |
| ...X... |
| ...X... |
| ..XXX.. |
| ..XXX.. |
| .X.X.X. |
| .X.X.X. |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'+'} = qq~ |
| $ci{'+'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| .XXXXX. |
| .XXXXX. |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{','} = qq~ |
| $ci{','} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ..X.... |
| ..X.... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'-'} = qq~ |
| $ci{'-'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| .XXXXX. |
| .XXXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'.'} = qq~ |
| $ci{'.'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'/'} = qq~ |
| $ci{'/'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| .....X. |
| .....X. |
| ....X.. |
| ....X.. |
| ...X... |
| ...X... |
| ..X.... |
| ..X.... |
| .X..... |
| .X..... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{':'} = qq~ |
| $ci{':'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{';'} = qq~ |
| $ci{';'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ..X.... |
| ..X.... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'<'} = qq~ |
| $ci{'<'} = qq~ |
| ....... |
| ....... |
| ....X.. |
| ....X.. |
| ...X... |
| ...X... |
| ..X.... |
| ..X.... |
| .X..... |
| .X..... |
| ..X.... |
| ..X.... |
| ...X... |
| ...X... |
| ....X.. |
| ....X.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'='} = qq~ |
| $ci{'='} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| .XXXXX. |
| .XXXXX. |
| ....... |
| ....... |
| .XXXXX. |
| .XXXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'>'} = qq~ |
| $ci{'>'} = qq~ |
| ....... |
| ....... |
| ..X.... |
| ..X.... |
| ...X... |
| ...X... |
| ....X.. |
| ....X.. |
| .....X. |
| .....X. |
| ....X.. |
| ....X.. |
| ...X... |
| ...X... |
| ..X.... |
| ..X.... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'?'} = qq~ |
| $ci{'?'} = qq~ |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| .X...X. |
| .X...X. |
| ....X.. |
| ....X.. |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'@'} = qq~ |
| $ci{'@'} = qq~ |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| .X...X. |
| .X...X. |
| .X.X.X. |
| .X.X.X. |
| .X.XXX. |
| .X.XXX. |
| .X.XX.. |
| .X.XX.. |
| .X..... |
| .X..... |
| ..XXXX. |
| ..XXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'['} = qq~ |
| $ci{'['} = qq~ |
| ....... |
| ....... |
| .XXXXX. |
| .XXXXX. |
| .XX.... |
| .XX.... |
| .XX.... |
| .XX.... |
| .XX.... |
| .XX.... |
| .XX.... |
| .XX.... |
| .XX.... |
| .XX.... |
| .XXXXX. |
| .XXXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'\\'} = qq~ |
| $ci{'\\'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| .X..... |
| .X..... |
| ..X.... |
| ..X.... |
| ...X... |
| ...X... |
| ....X.. |
| ....X.. |
| .....X. |
| .....X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{']'} = qq~ |
| $ci{']'} = qq~ |
| ....... |
| ....... |
| .XXXXX. |
| .XXXXX. |
| ....XX. |
| ....XX. |
| ....XX. |
| ....XX. |
| ....XX. |
| ....XX. |
| ....XX. |
| ....XX. |
| ....XX. |
| ....XX. |
| .XXXXX. |
| .XXXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'^'} = qq~ |
| $ci{'^'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ..X.X.. |
| ..X.X.. |
| .X...X. |
| .X...X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'_'} = qq~ |
| $ci{'_'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| .XXXXX. |
| .XXXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'`'} = qq~ |
| $ci{'`'} = qq~ |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ....X.. |
| ....X.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'{'} = qq~ |
| $ci{'{'} = qq~ |
| ....... |
| ....... |
| ....XX. |
| ....XX. |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ..X.... |
| ..X.... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ....XX. |
| ....XX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'|'} = qq~ |
| $ci{'|'} = qq~ |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'}'} = qq~ |
| $ci{'}'} = qq~ |
| ....... |
| ....... |
| ..XX... |
| ..XX... |
| ....X.. |
| ....X.. |
| ....X.. |
| ....X.. |
| .....X. |
| .....X. |
| ....X.. |
| ....X.. |
| ....X.. |
| ....X.. |
| ..XX... |
| ..XX... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'~'} = qq~ |
| $ci{'~'} = qq~ |
| ....... |
| ....... |
| ..X.... |
| ..X.... |
| .X.X.X. |
| .X.X.X. |
| ....X.. |
| ....X.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'0'} = qq~ |
| $ci{'0'} = qq~ |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| .X...X. |
| .X...X. |
| .X..XX. |
| .X..XX. |
| .X.X.X. |
| .X.X.X. |
| .XX..X. |
| .XX..X. |
| .X...X. |
| .X...X. |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'1'} = qq~ |
| $ci{'1'} = qq~ |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ..XX... |
| ..XX... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'2'} = qq~ |
| $ci{'2'} = qq~ |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| .X...X. |
| .X...X. |
| .....X. |
| .....X. |
| ...XX.. |
| ...XX.. |
| ..X.... |
| ..X.... |
| .X..... |
| .X..... |
| .XXXXX. |
| .XXXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'3'} = qq~ |
| $ci{'3'} = qq~ |
| ....... |
| ....... |
| .XXXXX. |
| .XXXXX. |
| .....X. |
| .....X. |
| ....X.. |
| ....X.. |
| ...XX.. |
| ...XX.. |
| .....X. |
| .....X. |
| .X...X. |
| .X...X. |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'4'} = qq~ |
| $ci{'4'} = qq~ |
| ....... |
| ....... |
| ....X.. |
| ....X.. |
| ...XX.. |
| ...XX.. |
| ..X.X.. |
| ..X.X.. |
| .X..X.. |
| .X..X.. |
| .XXXXX. |
| .XXXXX. |
| ....X.. |
| ....X.. |
| ....X.. |
| ....X.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'5'} = qq~ |
| $ci{'5'} = qq~ |
| ....... |
| ....... |
| .XXXXX. |
| .XXXXX. |
| .X..... |
| .X..... |
| .XXXX.. |
| .XXXX.. |
| .....X. |
| .....X. |
| .....X. |
| .....X. |
| .X...X. |
| .X...X. |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'6'} = qq~ |
| $ci{'6'} = qq~ |
| ....... |
| ....... |
| ...XXX. |
| ...XXX. |
| ..X.... |
| ..X.... |
| .X..... |
| .X..... |
| .XXXX.. |
| .XXXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'7'} = qq~ |
| $ci{'7'} = qq~ |
| ....... |
| ....... |
| .XXXXX. |
| .XXXXX. |
| .....X. |
| .....X. |
| ....X.. |
| ....X.. |
| ...X... |
| ...X... |
| ..X.... |
| ..X.... |
| ..X.... |
| ..X.... |
| ..X.... |
| ..X.... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'8'} = qq~ |
| $ci{'8'} = qq~ |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..XXX.. |
| ..XXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'9'} = qq~ |
| $ci{'9'} = qq~ |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..XXXX. |
| ..XXXX. |
| .....X. |
| .....X. |
| ....X.. |
| ....X.. |
| .XXX... |
| .XXX... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'A'} = qq~ |
| $ci{'A'} = qq~ |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ..X.X.. |
| ..X.X.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .XXXXX. |
| .XXXXX. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'a'} = qq~ |
| $ci{'a'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| .....X. |
| .....X. |
| ..XXXX. |
| ..XXXX. |
| .X...X. |
| .X...X. |
| ..XXXX. |
| ..XXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'B'} = qq~ |
| $ci{'B'} = qq~ |
| ....... |
| ....... |
| .XXXX.. |
| .XXXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .XXXX.. |
| .XXXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .XXXX.. |
| .XXXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'b'} = qq~ |
| $ci{'b'} = qq~ |
| ....... |
| ....... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .XXXX.. |
| .XXXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .XXXX.. |
| .XXXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'C'} = qq~ |
| $ci{'C'} = qq~ |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| .X...X. |
| .X...X. |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X...X. |
| .X...X. |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'c'} = qq~ |
| $ci{'c'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ..XXXX. |
| ..XXXX. |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| ..XXXX. |
| ..XXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'D'} = qq~ |
| $ci{'D'} = qq~ |
| ....... |
| ....... |
| .XXXX.. |
| .XXXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .XXXX.. |
| .XXXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'d'} = qq~ |
| $ci{'d'} = qq~ |
| ....... |
| ....... |
| .....X. |
| .....X. |
| .....X. |
| .....X. |
| ..XXXX. |
| ..XXXX. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..XXXX. |
| ..XXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'E'} = qq~ |
| $ci{'E'} = qq~ |
| ....... |
| ....... |
| .XXXXX. |
| .XXXXX. |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .XXXX.. |
| .XXXX.. |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .XXXXX. |
| .XXXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'e'} = qq~ |
| $ci{'e'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| .X...X. |
| .X...X. |
| .XXXXX. |
| .XXXXX. |
| .X..... |
| .X..... |
| ..XXXX. |
| ..XXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'F'} = qq~ |
| $ci{'F'} = qq~ |
| ....... |
| ....... |
| .XXXXX. |
| .XXXXX. |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .XXXX.. |
| .XXXX.. |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'f'} = qq~ |
| $ci{'f'} = qq~ |
| ....... |
| ....... |
| ...XX.. |
| ...XX.. |
| ..X..X. |
| ..X..X. |
| ..X.... |
| ..X.... |
| .XXXX.. |
| .XXXX.. |
| ..X.... |
| ..X.... |
| ..X.... |
| ..X.... |
| ..X.... |
| ..X.... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'G'} = qq~ |
| $ci{'G'} = qq~ |
| ....... |
| ....... |
| ..XXXX. |
| ..XXXX. |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..XX. |
| .X..XX. |
| .X...X. |
| .X...X. |
| ..XXXX. |
| ..XXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'g'} = qq~ |
| $ci{'g'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..XXXX. |
| ..XXXX. |
| .....X. |
| .....X. |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'H'} = qq~ |
| $ci{'H'} = qq~ |
| ....... |
| ....... |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .XXXXX. |
| .XXXXX. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'h'} = qq~ |
| $ci{'h'} = qq~ |
| ....... |
| ....... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .XXXX.. |
| .XXXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'I'} = qq~ |
| $ci{'I'} = qq~ |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'i'} = qq~ |
| $ci{'i'} = qq~ |
| ....... |
| ....... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ..XX... |
| ..XX... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'J'} = qq~ |
| $ci{'J'} = qq~ |
| ....... |
| ....... |
| .....X. |
| .....X. |
| .....X. |
| .....X. |
| .....X. |
| .....X. |
| .....X. |
| .....X. |
| .....X. |
| .....X. |
| .X...X. |
| .X...X. |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'j'} = qq~ |
| $ci{'j'} = qq~ |
| ....... |
| ....... |
| ....X.. |
| ....X.. |
| ....... |
| ....... |
| ...XX.. |
| ...XX.. |
| ....X.. |
| ....X.. |
| ....X.. |
| ....X.. |
| ....X.. |
| ....X.. |
| .X..X.. |
| .X..X.. |
| ..XX... |
| ..XX... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'K'} = qq~ |
| $ci{'K'} = qq~ |
| ....... |
| ....... |
| .X...X. |
| .X...X. |
| .X..X.. |
| .X..X.. |
| .X.X... |
| .X.X... |
| .XX.... |
| .XX.... |
| .X.X... |
| .X.X... |
| .X..X.. |
| .X..X.. |
| .X...X. |
| .X...X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'k'} = qq~ |
| $ci{'k'} = qq~ |
| ....... |
| ....... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X...X. |
| .X...X. |
| .X..X.. |
| .X..X.. |
| .XXX... |
| .XXX... |
| .X..X.. |
| .X..X.. |
| .X...X. |
| .X...X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'L'} = qq~ |
| $ci{'L'} = qq~ |
| ....... |
| ....... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .XXXXX. |
| .XXXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'l'} = qq~ |
| $ci{'l'} = qq~ |
| ....... |
| ....... |
| ..XX... |
| ..XX... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'M'} = qq~ |
| $ci{'M'} = qq~ |
| ....... |
| ....... |
| .X...X. |
| .X...X. |
| .XX.XX. |
| .XX.XX. |
| .X.X.X. |
| .X.X.X. |
| .X.X.X. |
| .X.X.X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'m'} = qq~ |
| $ci{'m'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| .XX.XX. |
| .XX.XX. |
| .X.X.X. |
| .X.X.X. |
| .X.X.X. |
| .X.X.X. |
| .X.X.X. |
| .X.X.X. |
| .X...X. |
| .X...X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'N'} = qq~ |
| $ci{'N'} = qq~ |
| ....... |
| ....... |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .XX..X. |
| .XX..X. |
| .X.X.X. |
| .X.X.X. |
| .X..XX. |
| .X..XX. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'n'} = qq~ |
| $ci{'n'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| .XXXX.. |
| .XXXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'O'} = qq~ |
| $ci{'O'} = qq~ |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'o'} = qq~ |
| $ci{'o'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'P'} = qq~ |
| $ci{'P'} = qq~ |
| ....... |
| ....... |
| .XXXX.. |
| .XXXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .XXXX.. |
| .XXXX.. |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'p'} = qq~ |
| $ci{'p'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| .XXXX.. |
| .XXXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .XXXX.. |
| .XXXX.. |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'Q'} = qq~ |
| $ci{'Q'} = qq~ |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X.X.X. |
| .X.X.X. |
| .X..X.. |
| .X..X.. |
| ..XX.X. |
| ..XX.X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'q'} = qq~ |
| $ci{'q'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ..XXXX. |
| ..XXXX. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..XXXX. |
| ..XXXX. |
| .....X. |
| .....X. |
| .....X. |
| .....X. |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'R'} = qq~ |
| $ci{'R'} = qq~ |
| ....... |
| ....... |
| .XXXX.. |
| .XXXX.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .XXXX.. |
| .XXXX.. |
| .X.X... |
| .X.X... |
| .X..X.. |
| .X..X.. |
| .X...X. |
| .X...X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'r'} = qq~ |
| $ci{'r'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| .X.XXX. |
| .X.XXX. |
| .XX.... |
| .XX.... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| .X..... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'S'} = qq~ |
| $ci{'S'} = qq~ |
| ....... |
| ....... |
| ..XXX.. |
| ..XXX.. |
| .X...X. |
| .X...X. |
| .X..... |
| .X..... |
| ..XXX.. |
| ..XXX.. |
| .....X. |
| .....X. |
| .X...X. |
| .X...X. |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'s'} = qq~ |
| $ci{'s'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ..XXXX. |
| ..XXXX. |
| .X..... |
| .X..... |
| ..XXX.. |
| ..XXX.. |
| .....X. |
| .....X. |
| .XXXX.. |
| .XXXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'T'} = qq~ |
| $ci{'T'} = qq~ |
| ....... |
| ....... |
| .XXXXX. |
| .XXXXX. |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'t'} = qq~ |
| $ci{'t'} = qq~ |
| ....... |
| ....... |
| ..X.... |
| ..X.... |
| .XXXX.. |
| .XXXX.. |
| ..X.... |
| ..X.... |
| ..X.... |
| ..X.... |
| ..X.... |
| ..X.... |
| ..X..X. |
| ..X..X. |
| ...XX.. |
| ...XX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'U'} = qq~ |
| $ci{'U'} = qq~ |
| ....... |
| ....... |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'u'} = qq~ |
| $ci{'u'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X..XX. |
| .X..XX. |
| ..XX.X. |
| ..XX.X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'V'} = qq~ |
| $ci{'V'} = qq~ |
| ....... |
| ....... |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..X.X.. |
| ..X.X.. |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'v'} = qq~ |
| $ci{'v'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..X.X.. |
| ..X.X.. |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'W'} = qq~ |
| $ci{'W'} = qq~ |
| ....... |
| ....... |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X.X.X. |
| .X.X.X. |
| .X.X.X. |
| .X.X.X. |
| .XX.XX. |
| .XX.XX. |
| ..X.X.. |
| ..X.X.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'w'} = qq~ |
| $ci{'w'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X.X.X. |
| .X.X.X. |
| .X.X.X. |
| .X.X.X. |
| ..X.X.. |
| ..X.X.. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'X'} = qq~ |
| $ci{'X'} = qq~ |
| ....... |
| ....... |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..X.X.. |
| ..X.X.. |
| ...X... |
| ...X... |
| ..X.X.. |
| ..X.X.. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'x'} = qq~ |
| $ci{'x'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| .X...X. |
| .X...X. |
| ..X.X.. |
| ..X.X.. |
| ...X... |
| ...X... |
| ..X.X.. |
| ..X.X.. |
| .X...X. |
| .X...X. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'Y'} = qq~ |
| $ci{'Y'} = qq~ |
| ....... |
| ....... |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..X.X.. |
| ..X.X.. |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ...X... |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'y'} = qq~ |
| $ci{'y'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| .X...X. |
| ..XXXX. |
| ..XXXX. |
| .....X. |
| .....X. |
| ..XXX.. |
| ..XXX.. |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'Z'} = qq~ |
| $ci{'Z'} = qq~ |
| ....... |
| ....... |
| .XXXXX. |
| .XXXXX. |
| .....X. |
| .....X. |
| ....X.. |
| ....X.. |
| ...X... |
| ...X... |
| ..X.... |
| ..X.... |
| .X..... |
| .X..... |
| .XXXXX. |
| .XXXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| $ci{'z'} = qq~ |
| $ci{'z'} = qq~ |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| ....... |
| .XXXXX. |
| .XXXXX. |
| ....X.. |
| ....X.. |
| ...X... |
| ...X... |
| ..X.... |
| ..X.... |
| .XXXXX. |
| .XXXXX. |
| ....... |
| ....... |
| ....... |
| ....... |
| ~; |
| ~; |
| |
| |
| ############################################### |
| ############################################### |
| |
| |
| my ($nl, @lines, $len, $w, $h, $LINE_HEIGHT, $BLOCK_LIMIT); |
| my ( $nl, @lines, $len, $w, $h, $LINE_HEIGHT, $BLOCK_LIMIT ); |
| |
| |
| # to measure length of the 'newline' character (cross platform LF vs CR+LF ???) |
| # to measure length of the 'newline' character (cross platform LF vs CR+LF ???) |
| $nl = length qq~ |
| $nl = length qq~ |
| ~; |
| ~; |
| |
| |
| $LINE_HEIGHT = $CHAR_HEIGHT * $DOT_HEIGHT; |
| $LINE_HEIGHT = $CHAR_HEIGHT * $DOT_HEIGHT; |
| @lines = split("\n", $msg); |
| @lines = split /\n/xsm, $msg; |
| $len = 0; |
| $len = 0; |
| foreach (@lines) { $len = length $_ if (length $_ > $len); } |
| foreach (@lines) { |
| $w = $len * $CHAR_WIDTH * $DOT_WIDTH; |
| if ( length $_ > $len ) { $len = length $_; } |
| $h = @lines * $LINE_HEIGHT; |
| } |
| # LZW block limit - cannot allow the LZW code size to change from the initial |
| $w = $len * $CHAR_WIDTH * $DOT_WIDTH; |
| # code size (we can't know when the code size will change because we aren't |
| $h = @lines * $LINE_HEIGHT; |
| # implementing compression). The 3 is a fudge factor. |
| |
| $BLOCK_LIMIT = 2**$BITS_PER_PIXEL - 3; |
| # LZW block limit - cannot allow the LZW code size to change from the initial |
| |
| # code size (we can't know when the code size will change because we aren't |
| # Implementation notes: |
| # implementing compression). The 3 is a fudge factor. |
| # * Image is NOT compressed! - Does not use LZW compression! |
| $BLOCK_LIMIT = 2**$BITS_PER_PIXEL - 3; |
| # * For ease of output things are arranged so that the expected LZW code size is |
| |
| # always 8 bits. The initial LZW code size is determined by the number of bits |
| # Implementation notes: |
| # required to represent all possible colour indices, plus two additional codes |
| # * Image is NOT compressed! - Does not use LZW compression! |
| # used to (1) reset the LZW decode table and (2) mark the end of LZW data. By |
| # * For ease of output things are arranged so that the expected LZW code size is |
| # selecting a 128 entry colour table, the total of 130 initial LZW codes |
| # always 8 bits. The initial LZW code size is determined by the number of bits |
| # require 8 bits. During output, the decoding table is reset at regular |
| # required to represent all possible colour indices, plus two additional codes |
| # intervals to prevent it from adding so many entries that the decoder would |
| # used to (1) reset the LZW decode table and (2) mark the end of LZW data. By |
| # increase the expected code size to 9 bits. |
| # selecting a 128 entry colour table, the total of 130 initial LZW codes |
| |
| # require 8 bits. During output, the decoding table is reset at regular |
| # GIF Signature |
| # intervals to prevent it from adding so many entries that the decoder would |
| print 'Content-type: image/gif', "\x0A\x0A"; |
| # increase the expected code size to 9 bits. |
| |
| |
| # Screen Descriptor |
| # GIF Signature |
| print $TRANSPARENT_INDEX ? 'GIF89a' : 'GIF87a'; |
| print 'Content-type: image/gif', "\n\n" or croak "$croak{'print'}"; |
| |
| |
| # width, height |
| # Screen Descriptor |
| print pack 'v2', $w, $h; |
| print $TRANSPARENT_INDEX ? 'GIF89a' : 'GIF87a' or croak "$croak{'print'}"; |
| |
| |
| # global colour map, 8 bits colour resolution, 7 bits per pixel |
| # width, height |
| print pack 'C1', 0xF0 + $BITS_PER_PIXEL - 1; |
| print pack 'v2', $w, $h or croak "$croak{'print'}"; |
| |
| |
| # background colour = 0 |
| # global colour map, 8 bits colour resolution, 7 bits per pixel |
| print "\0"; |
| print pack 'C1', 0xF0 + $BITS_PER_PIXEL - 1 or croak "$croak{'print'}"; |
| |
| |
| # reserved |
| # background colour = 0 |
| print "\0"; |
| print "\0" or croak "$croak{'print'}"; |
| |
| |
| # Global Colour Map |
| # reserved |
| print $palette; |
| print "\0" or croak "$croak{'print'}"; |
| print "\0" x ((2**$BITS_PER_PIXEL * 3) - length $palette); |
| |
| |
| # Global Colour Map |
| if ($TRANSPARENT_INDEX) { |
| print $palette or croak "$croak{'print'}"; |
| # Graphic Control Extension |
| print "\0" x ( ( 2**$BITS_PER_PIXEL * 3 ) - length $palette ) or croak "$croak{'print'}"; |
| # extension introducer |
| |
| print "\x21"; |
| if ($TRANSPARENT_INDEX) { |
| # graphic control label |
| |
| print "\xF9"; |
| # Graphic Control Extension |
| # block size |
| # extension introducer |
| print "\x04"; |
| print "\x21" or croak "$croak{'print'}"; |
| # no disposal method, no user input, transparent colour present |
| |
| print "\x01"; |
| # graphic control label |
| # delay time |
| print "\xF9" or croak "$croak{'print'}"; |
| print "\0\0"; |
| |
| # transparent colour index |
| # block size |
| print $TRANSPARENT_INDEX; |
| print "\x04" or croak "$croak{'print'}"; |
| # block terminator |
| |
| print "\0"; |
| # no disposal method, no user input, transparent colour present |
| } |
| print "\x01" or croak "$croak{'print'}"; |
| |
| |
| # Image Descriptor |
| # delay time |
| |
| print "\0\0" or croak "$croak{'print'}"; |
| # image separator |
| |
| print ','; |
| # transparent colour index |
| |
| print $TRANSPARENT_INDEX or croak "$croak{'print'}"; |
| # left, top |
| |
| print "\0\0\0\0"; |
| # block terminator |
| |
| print "\0" or croak "$croak{'print'}"; |
| # width, height |
| } |
| print pack 'v2', $w, $h; |
| |
| |
| # Image Descriptor |
| # use global colour map (not local), sequential (not interlaced) |
| |
| print "\0"; |
| # image separator |
| |
| print q{,} or croak "$croak{'print'}"; |
| # Raster Data |
| |
| |
| # left, top |
| # code size |
| print "\0\0\0\0" or croak "$croak{'print'}"; |
| print pack 'C', $BITS_PER_PIXEL; |
| |
| |
| # width, height |
| # the data is output in blocks with a leading byte count |
| print pack 'v2', $w, $h or croak "$croak{'print'}"; |
| my ($img, $line, $random_number); |
| |
| my ($y, $cy, $dy); |
| # use global colour map (not local), sequential (not interlaced) |
| my ($x, $cx, $i, $c, $d, $di, $r); |
| print "\0" or croak "$croak{'print'}"; |
| $range = 10; |
| |
| for ($y = 0; $y < $h; $y++) { |
| # Raster Data |
| $cy = int($y / $DOT_HEIGHT) % $CHAR_HEIGHT; # y coord in character dots |
| |
| $dy = $y % $DOT_HEIGHT; |
| # code size |
| for ($x = 0; $x < $w; $x += $DOT_WIDTH) { |
| print pack 'C', $BITS_PER_PIXEL or croak "$croak{'print'}"; |
| $random_number = int(rand($range)); |
| |
| $cx = int($x / $DOT_WIDTH) % $CHAR_WIDTH; # x coord in character dots |
| # the data is output in blocks with a leading byte count |
| $i = int($x / $DOT_WIDTH / $CHAR_WIDTH); # index into message string |
| my ( $img, $line, $random_number ); |
| $line = $lines[$y / $LINE_HEIGHT]; |
| my ( $y, $cy, $dy ); |
| $c = ($i < length $line) ? substr $line, $i, 1 : ' '; |
| my ( $x, $cx, $i, $c, $d, $di, $r ); |
| $d = substr $ci{$c}, $cy * ($CHAR_WIDTH + $nl) + $cx + $nl, 1; # dot in character definition |
| $range = 10; |
| if ($distortion > 0) { |
| for my $y ( 0 .. ( $h - 1 ) ) { |
| $dis_level = 9 - $distortion; |
| $cy = |
| if ($random_number <= $dis_level) { $di = ($d eq 'X') ? $dot : $nodot;} elsif ($random_number > $dis_level){ $di = ($d eq 'X') ? $dot : $invnodot;} |
| int( $y / $DOT_HEIGHT ) % $CHAR_HEIGHT; # y coord in character dots |
| } else { |
| $dy = $y % $DOT_HEIGHT; |
| $di = ($d eq 'X') ? $dot : $nodot; |
| for ( $x = 0 ; $x < $w ; $x += $DOT_WIDTH ) { |
| } |
| $random_number = int rand $range; |
| $di = substr $di, $dy * ($DOT_WIDTH + $nl) + $nl, $DOT_WIDTH; |
| $cx = |
| for ($i = 0; $i < length $di; $i++) { |
| int( $x / $DOT_WIDTH ) % $CHAR_WIDTH; # x coord in character dots |
| $c = ord substr $di, $i, 1; |
| $i = |
| if ($randomizer > 0) { |
| int( $x / $DOT_WIDTH / $CHAR_WIDTH ); # index into message string |
| # Start of randomizer - comment this block out if you don't like it! |
| $line = $lines[ $y / $LINE_HEIGHT ]; |
| if($randomizer == 1){$rc1 = 1; $rc2 = 1;} |
| $c = ( $i < length $line ) ? substr $line, $i, 1 : q{ }; |
| if($randomizer == 2){$rc1 = 2; $rc2 = 2;} |
| $d = substr $ci{$c}, $cy * ( $CHAR_WIDTH + $nl ) + $cx + $nl, 1; |
| if($randomizer == 3){$rc1 = 1; $rc2 = 2;} |
| # dot in character definition |
| $r = rand; |
| if ( $distortion > 0 ) { |
| if ($r < .1) { |
| $dis_level = 9 - $distortion; |
| $c += $rc1; |
| if ( $random_number <= $dis_level ) { |
| } elsif ($r > .9) { |
| $di = ( $d eq 'X' ) ? $dot : $nodot; |
| $c += $rc2; |
| } |
| } |
| elsif ( $random_number > $dis_level ) { |
| # End of randomizer |
| $di = ( $d eq 'X' ) ? $dot : $invnodot; |
| } |
| } |
| $c = chr $c; |
| } |
| $img .= $c; |
| else { |
| } |
| $di = ( $d eq 'X' ) ? $dot : $nodot; |
| } |
| } |
| } |
| $di = substr $di, $dy * ( $DOT_WIDTH + $nl ) + $nl, $DOT_WIDTH; |
| |
| for my $i ( 0 .. ( length $di - 1 ) ) { |
| # Re-arrange the image data so it's bit-packed |
| $c = ord substr $di, $i, 1; |
| my ($cnt, $pkdimg, $buf, $bufbits); |
| if ( $randomizer > 0 ) { |
| $i = 0; |
| |
| $buf = 0; |
| # Start of randomizer - comment this block out if you don't like it! |
| $bufbits = 0; |
| if ( $randomizer == 1 ) { $rc1 = 1; $rc2 = 1; } |
| while ($i <= length $img) { |
| if ( $randomizer == 2 ) { $rc1 = 2; $rc2 = 2; } |
| if ($i < length $img) { |
| if ( $randomizer == 3 ) { $rc1 = 1; $rc2 = 2; } |
| # Output each pixel |
| $r = rand; |
| $c = ord substr $img, $i, 1; |
| if ( $r < .1 ) { |
| $c &= 2**$BITS_PER_PIXEL-1; |
| $c += $rc1; |
| $buf |= $c << $bufbits; |
| } |
| $bufbits += $BITS_PER_PIXEL + 1; |
| elsif ( $r > .9 ) { |
| $i++; |
| $c += $rc2; |
| # Insert LZW table clear code before the decoder will grow the bit size |
| } |
| # The minus 2 is a fudge factor |
| |
| if ($i % (2**$BITS_PER_PIXEL-2) == 0) { |
| # End of randomizer |
| $c = 2**$BITS_PER_PIXEL; |
| } |
| $buf |= $c << $bufbits; |
| $c = chr $c; |
| $bufbits += $BITS_PER_PIXEL + 1; |
| $img .= $c; |
| } |
| } |
| } else { |
| } |
| #Output LZW end code |
| } |
| $c = 2**$BITS_PER_PIXEL+1; |
| |
| $buf |= $c << $bufbits; |
| # Re-arrange the image data so it's bit-packed |
| $bufbits += $BITS_PER_PIXEL + 1; |
| my ( $cnt, $pkdimg, $buf, $bufbits ); |
| $i++; |
| $i = 0; |
| } |
| $buf = 0; |
| while ($bufbits >= 8) { |
| $bufbits = 0; |
| $c = chr ($buf & 255); |
| while ( $i <= length $img ) { |
| $pkdimg .= $c; |
| if ( $i < length $img ) { |
| $buf >>= 8; |
| |
| $bufbits -= 8; |
| # Output each pixel |
| } |
| $c = ord substr $img, $i, 1; |
| } |
| $c &= 2**$BITS_PER_PIXEL - 1; |
| $pkdimg .= chr $buf; |
| $buf |= $c << $bufbits; |
| |
| $bufbits += $BITS_PER_PIXEL + 1; |
| # Output image data |
| $i++; |
| $i = 0; |
| |
| while ($i < length $pkdimg) { |
| # Insert LZW table clear code before the decoder will grow the bit size |
| $cnt = (length $pkdimg) - $i; |
| # The minus 2 is a fudge factor |
| $cnt = 255 if ($cnt > 255); |
| if ( $i % ( 2**$BITS_PER_PIXEL - 2 ) == 0 ) { |
| print pack 'C', $cnt; |
| $c = 2**$BITS_PER_PIXEL; |
| print substr $pkdimg, $i, $cnt; |
| $buf |= $c << $bufbits; |
| $i += $cnt; |
| $bufbits += $BITS_PER_PIXEL + 1; |
| } |
| } |
| |
| } |
| |
| else { |
| |
| |
| |
| #Output LZW end code |
| |
| $c = 2**$BITS_PER_PIXEL + 1; |
| |
| $buf |= $c << $bufbits; |
| |
| $bufbits += $BITS_PER_PIXEL + 1; |
| |
| $i++; |
| |
| } |
| |
| while ( $bufbits >= 8 ) { |
| |
| $c = chr( $buf & 255 ); |
| |
| $pkdimg .= $c; |
| |
| $buf >>= 8; |
| |
| $bufbits -= 8; |
| |
| } |
| |
| } |
| |
| $pkdimg .= chr $buf; |
| |
| |
| |
| # Output image data |
| |
| $i = 0; |
| |
| while ( $i < length $pkdimg ) { |
| |
| $cnt = ( length $pkdimg ) - $i; |
| |
| if ( $cnt > 255 ) { $cnt = 255; } |
| |
| print pack 'C', $cnt or croak "$croak{'print'}"; |
| |
| print substr $pkdimg, $i, $cnt or croak "$croak{'print'}"; |
| |
| $i += $cnt; |
| |
| } |
| |
| |
| # Finish up |
| # Finish up |
| print "\0"; # zero byte count (end of raster data) |
| print "\0" or croak "$croak{'print'}"; # zero byte count (end of raster data) |
| |
| |
| # GIF Terminator |
| # GIF Terminator |
| print ';'; |
| print ';' or croak "$croak{'print'}"; |
| |
| |
| exit; |
| exit; |
| } |
| } |
| |
| |
| 1; |
| 1; |
| |
| |