diff --git a/.gitignore b/.gitignore index cf25723..71f0bcc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.swp cmake-build-debug .idea +._* diff --git a/Makefile b/Makefile index d7e4c0a..53bae0e 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: gtertysh +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2016/12/14 16:54:48 by gtertysh #+# #+# # -# Updated: 2016/12/23 19:59:53 by gtertysh ### ########.fr # +# Updated: 2017/03/20 15:31:33 by gtertysh ### ########.fr # # # # **************************************************************************** # @@ -33,7 +33,7 @@ MLX = libmlx.a SRC_DIR = ./src/ OBJ_DIR = ./obj/ LIBFT_DIR = ./libft/ -MLX_DIR = ./minilibx/ +MLX_DIR = ./minilibx_macos/ # src and obj files @@ -59,8 +59,7 @@ INC = -I $(LIBFT_DIR)includes/ \ # valgrind --tool=callgrind --dump-instr=yes --simulate-cache=yes --collect-jumps=yes program arguments LIBFT_FLAGS = -lft -L $(LIBFT_DIR) -MLX_FLAGS = -lmlx -lXext -lX11 -L $(MLX_DIR) -OTHER_FLAGS = -lm +MLX_FLAGS = -lmlx -framework OpenGL -framework AppKit -L $(MLX_DIR) CC_FLAGS = -Werror -Wextra -Wall -O3 DEBUG = -g OPT = -O3 @@ -83,7 +82,7 @@ $(NAME): $(LIBFT_DIR)$(LIBFT) $(MLX_DIR)$(MLX) $(OBJ) $(OBJ_DIR)%.o: $(SRC_DIR)%.c $(FRACTOL_INC)$(FRACTOL_HEADER) @echo "$(CYAN)Compiling object files: $(BLUE)$@$(NORMAL)" - @$(CC) $(FLAGS) $(INC) -c $< -o $@ + @$(CC) $(CC_FLAGS) $(INC) -c $< -o $@ $(LIBFT_DIR)$(LIBFT): @echo "$(CYAN)Compiling libft library...$(NORMAL)" diff --git a/inc/fractol.h b/inc/fractol.h index 13ae89d..4c0b6e1 100644 --- a/inc/fractol.h +++ b/inc/fractol.h @@ -6,7 +6,7 @@ /* By: gtertysh +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/16 20:59:04 by gtertysh #+# #+# */ -/* Updated: 2017/03/16 21:09:30 by gtertysh ### ########.fr */ +/* Updated: 2017/03/20 15:32:52 by gtertysh ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,8 +18,8 @@ # include # include -# define HEIGHT 700 -# define WIDTH 1300 +# define HEIGHT 1200 +# define WIDTH 2500 # define COLOR1 0 # define COLOR2 16777215 # define INIT_X 30 diff --git a/minilibx/=README= b/minilibx/=README= deleted file mode 100644 index 65d5429..0000000 --- a/minilibx/=README= +++ /dev/null @@ -1,41 +0,0 @@ - -This is the MinilibX, a simple X-Window (X11R6) programming API -in C, designed for students, suitable for X-beginners. - - -Contents - - - source code in C to create the mlx library - - man pages (in man/ directory) - - a test program (in test/ directory) is built - with the library - - a public include file mlx.h - - a tiny configure script to generate an appropriate Makefile.gen - - -Requirements - - - MinilibX only support TrueColor visual type (8,15,16,24 or 32 bits depth) - - gcc - - X11 include files - - XShm extension must be present - - -Compile MinilibX - - - run ./configure or make - both will make a few tests, create Makefile.gen - and then automatically run make on this generated Makefile.gen . - libmlx.a and libmlx_$(HOSTTYPE).a are created. - test/mlx-test binary is also created. - - -Install MinilibX - - - no installation script is provided. You may want to install - - libmlx.a and/or libmlx_$(HOSTTYPE).a in /usr/X11/lib or /usr/local/lib - - mlx.h in /usr/X11/include or /usr/local/include - - man/man3/mlx*.1 in /usr/X11/man/man3 or /usr/local/man/man3 - - - Olivier CROUZET - 2014-01-06 - diff --git a/minilibx/Makefile b/minilibx/Makefile deleted file mode 100644 index d334105..0000000 --- a/minilibx/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -## -## Makefile for MiniLibX in /home/boulon/work/c/raytraceur/minilibx -## -## Made by Olivier Crouzet -## Login -## -## Started on Tue Oct 5 15:56:43 2004 Olivier Crouzet -## Last update Tue May 15 15:44:41 2007 Olivier Crouzet -## - -## Please use configure script - - -all : do_configure - -do_configure : - ./configure > /dev/null 2>&1 - -clean : - ./configure clean > /dev/null 2>&1 - -re : clean all diff --git a/minilibx/Makefile.gen b/minilibx/Makefile.gen deleted file mode 100644 index 58ce77e..0000000 --- a/minilibx/Makefile.gen +++ /dev/null @@ -1,47 +0,0 @@ -INC=/usr/include -HT=Linux -DOCP=do_cp -## -## Makefile for MiniLibX in /home/boulon/work/c/raytraceur/minilibx -## -## Made by Olivier Crouzet -## Login -## -## Started on Tue Oct 5 15:56:43 2004 Olivier Crouzet -## Last update Tue May 15 15:41:20 2007 Olivier Crouzet -## - -## Please use configure script - - - -CC = gcc - -NAME = libmlx.a - -SRC = mlx_init.c mlx_new_window.c mlx_pixel_put.c mlx_loop.c \ - mlx_mouse_hook.c mlx_key_hook.c mlx_expose_hook.c mlx_loop_hook.c \ - mlx_int_anti_resize_win.c mlx_int_do_nothing.c \ - mlx_int_wait_first_expose.c mlx_int_get_visual.c \ - mlx_flush_event.c mlx_string_put.c \ - mlx_new_image.c mlx_get_data_addr.c \ - mlx_put_image_to_window.c mlx_get_color_value.c mlx_clear_window.c \ - mlx_xpm.c mlx_int_str_to_wordtab.c mlx_destroy_window.c \ - mlx_int_param_event.c mlx_int_set_win_event_mask.c mlx_hook.c \ - mlx_rgb.c mlx_destroy_image.c - -OBJ =$(SRC:.c=.o) -CFLAGS = -O3 -I$(INC) - -all : $(NAME) $(DOCP) - -$(NAME) : $(OBJ) - ar -r $(NAME) $(OBJ) - ranlib $(NAME) - -do_cp : - cp $(NAME) libmlx_$(HT).a - - -clean : - rm -f $(OBJ) $(NAME) *~ core *.core diff --git a/minilibx/Makefile.mk b/minilibx/Makefile.mk deleted file mode 100644 index f05fd6c..0000000 --- a/minilibx/Makefile.mk +++ /dev/null @@ -1,47 +0,0 @@ -## -## Makefile for MiniLibX in /home/boulon/work/c/raytraceur/minilibx -## -## Made by Olivier Crouzet -## Login -## -## Started on Tue Oct 5 15:56:43 2004 Olivier Crouzet -## Last update Tue May 15 15:41:20 2007 Olivier Crouzet -## - -## Please use configure script - - -INC =%%%% -HT =%%%% -DOCP =%%%% - -CC = gcc - -NAME = libmlx.a - -SRC = mlx_init.c mlx_new_window.c mlx_pixel_put.c mlx_loop.c \ - mlx_mouse_hook.c mlx_key_hook.c mlx_expose_hook.c mlx_loop_hook.c \ - mlx_int_anti_resize_win.c mlx_int_do_nothing.c \ - mlx_int_wait_first_expose.c mlx_int_get_visual.c \ - mlx_flush_event.c mlx_string_put.c \ - mlx_new_image.c mlx_get_data_addr.c \ - mlx_put_image_to_window.c mlx_get_color_value.c mlx_clear_window.c \ - mlx_xpm.c mlx_int_str_to_wordtab.c mlx_destroy_window.c \ - mlx_int_param_event.c mlx_int_set_win_event_mask.c mlx_hook.c \ - mlx_rgb.c mlx_destroy_image.c - -OBJ =$(SRC:.c=.o) -CFLAGS = -O3 -I$(INC) - -all : $(NAME) $(DOCP) - -$(NAME) : $(OBJ) - ar -r $(NAME) $(OBJ) - ranlib $(NAME) - -do_cp : - cp $(NAME) libmlx_$(HT).a - - -clean : - rm -f $(OBJ) $(NAME) *~ core *.core diff --git a/minilibx/configure b/minilibx/configure deleted file mode 100755 index 2f9b0be..0000000 --- a/minilibx/configure +++ /dev/null @@ -1,94 +0,0 @@ -#!/bin/sh - - -if [ -n "$1" -a "$1" = "--help" ] ; then - echo "Usage : $0\n Auto-configure and make MinilibX" - exit -fi - - -conf_inc=NO - -for inc in \ - /usr/X11/include \ - /usr/X11R6/include \ - /usr/X11R5/include \ - /usr/X11R4/include \ - \ - /usr/include/X11 \ - /usr/include/X11R6 \ - /usr/include/X11R5 \ - /usr/include/X11R4 \ - \ - /usr/local/X11/include \ - /usr/local/X11R6/include \ - /usr/local/X11R5/include \ - /usr/local/X11R4/include \ - \ - /usr/local/include/X11 \ - /usr/local/include/X11R6 \ - /usr/local/include/X11R5 \ - /usr/local/include/X11R4 \ - \ - /usr/X386/include \ - /usr/x386/include \ - /usr/XFree86/include/X11 \ - \ - /usr/include \ - /usr/local/include \ - /usr/athena/include \ - /usr/local/x11r5/include \ - /usr/lpp/Xamples/include \ - \ - /usr/openwin/include \ - /usr/openwin/share/include - do - if [ -f "$inc/X11/Xlib.h" -a -f "$inc/X11/extensions/XShm.h" ]; then - conf_inc=$inc - break - fi - done - - -if [ "$conf_inc" = "NO" ]; then - echo "Can't find a suitable X11 include directory." - exit -else - echo "X11 include dir : $conf_inc" -fi - -if [ -z "$HOSTTYPE" ]; then - conf_ht=`uname -s` -else - conf_ht=$HOSTTYPE -fi - -if [ -z "$conf_ht" ]; then - conf_docp="" -else - conf_docp="do_cp" - echo "lib_$conf_ht generation" -fi - - -/bin/echo "INC=$conf_inc" > Makefile.gen -/bin/echo "HT=$conf_ht" >> Makefile.gen -/bin/echo "DOCP=$conf_docp" >> Makefile.gen -cat Makefile.mk | grep -v %%%% >> Makefile.gen - -/bin/echo "INC=$conf_inc" > test/Makefile.gen -/bin/echo "HT=$conf_ht" >> test/Makefile.gen -/bin/echo "DOCP=$conf_docp" >> test/Makefile.gen -cat test/Makefile.mk | grep -v %%%% >> test/Makefile.gen - - -if [ -n "$1" -a "$1" = "clean" ] ; then - echo "Now make it clean." - make -f Makefile.gen clean - (cd test ; make -f Makefile.gen clean) - exit -fi - -echo "Now make it." -make -f Makefile.gen all -(cd test ; make -f Makefile.gen all ) diff --git a/minilibx/libmlx_Linux.a b/minilibx/libmlx_Linux.a deleted file mode 100644 index dfe9c9e..0000000 Binary files a/minilibx/libmlx_Linux.a and /dev/null differ diff --git a/minilibx/mlx_clear_window.c b/minilibx/mlx_clear_window.c deleted file mode 100644 index f621090..0000000 --- a/minilibx/mlx_clear_window.c +++ /dev/null @@ -1,21 +0,0 @@ -/* -** mlx_clear_window.c for MiniLibX in -** -** Made by Charlie Root -** Login -** -** Started on Thu Sep 7 19:46:15 2000 Charlie Root -** Last update Tue Sep 25 17:11:19 2001 Charlie Root -*/ - - - -#include "mlx_int.h" - - -int mlx_clear_window(t_xvar *xvar,t_win_list *win) -{ - XClearWindow(xvar->display,win->window); - if (xvar->do_flush) - XFlush(xvar->display); -} diff --git a/minilibx/mlx_destroy_image.c b/minilibx/mlx_destroy_image.c deleted file mode 100644 index afd4d1a..0000000 --- a/minilibx/mlx_destroy_image.c +++ /dev/null @@ -1,31 +0,0 @@ -/* -** mlx_destroy_image.c for MinilibX in -** -** Made by Charlie Root -** Login -** -** Started on Tue Mar 12 10:25:15 2002 Charlie Root -** Last update Tue May 15 16:45:54 2007 Olivier Crouzet -*/ - - -#include "mlx_int.h" - - -int mlx_destroy_image(t_xvar *xvar, t_img *img) -{ - if (img->type == MLX_TYPE_SHM_PIXMAP || - img->type == MLX_TYPE_SHM) - { - XShmDetach(xvar->display, &(img->shm)); - shmdt(img->shm.shmaddr); - /* shmctl IPC_RMID already done */ - } - XDestroyImage(img->image); /* For image & shm-image. Also free img->data */ - XFreePixmap(xvar->display, img->pix); - if (img->gc) - XFreeGC(xvar->display, img->gc); - free(img); - if (xvar->do_flush) - XFlush(xvar->display); -} diff --git a/minilibx/mlx_destroy_window.c b/minilibx/mlx_destroy_window.c deleted file mode 100644 index 464790c..0000000 --- a/minilibx/mlx_destroy_window.c +++ /dev/null @@ -1,38 +0,0 @@ -/* -** mlx_destroy_window.c for MinilibX in -** -** Made by Charlie Root -** Login -** -** Started on Tue Mar 12 10:25:15 2002 Charlie Root -** Last update Tue May 15 16:46:08 2007 Olivier Crouzet -*/ - - -#include "mlx_int.h" - - -int mlx_destroy_window(t_xvar *xvar,t_win_list *win) -{ - t_win_list *w; - t_win_list *prev; - t_win_list first; - - first.next = xvar->win_list; - prev = &first; - w = prev->next; - while (w) - { - if (w==win) - prev->next = w->next; - else - prev = w; - w = w->next; - } - xvar->win_list = first.next; - XDestroyWindow(xvar->display,win->window); - XFreeGC(xvar->display,win->gc); - free(win); - if (xvar->do_flush) - XFlush(xvar->display); -} diff --git a/minilibx/mlx_expose_hook.c b/minilibx/mlx_expose_hook.c deleted file mode 100644 index b00b675..0000000 --- a/minilibx/mlx_expose_hook.c +++ /dev/null @@ -1,22 +0,0 @@ -/* -** mlx_expose_hook.c for MiniLibX in -** -** Made by Charlie Root -** Login -** -** Started on Thu Aug 3 11:49:06 2000 Charlie Root -** Last update Fri Feb 23 17:07:42 2001 Charlie Root -*/ - - -#include "mlx_int.h" - - - - -int mlx_expose_hook(t_win_list *win,int (*funct)(),void *param) -{ - win->hooks[Expose].hook = funct; - win->hooks[Expose].param = param; - win->hooks[Expose].mask = ExposureMask; -} diff --git a/minilibx/mlx_flush_event.c b/minilibx/mlx_flush_event.c deleted file mode 100644 index 1e586ad..0000000 --- a/minilibx/mlx_flush_event.c +++ /dev/null @@ -1,25 +0,0 @@ -/* -** mlx_flush_event.c for MiniLibX in -** -** Made by Charlie Root -** Login -** -** Started on Wed Aug 2 18:58:11 2000 Charlie Root -** Last update Fri Feb 23 17:08:48 2001 Charlie Root -*/ - - -#include "mlx_int.h" - - - - -int mlx_flush_event(t_xvar *xvar) -{ - XEvent ev; - - while (XPending(xvar->display)) - { - XNextEvent(xvar->display,&ev); - } -} diff --git a/minilibx/mlx_get_color_value.c b/minilibx/mlx_get_color_value.c deleted file mode 100644 index b620970..0000000 --- a/minilibx/mlx_get_color_value.c +++ /dev/null @@ -1,33 +0,0 @@ -/* -** mlx_get_color_value.c for MiniLibX in -** -** Made by Charlie Root -** Login -** -** Started on Mon Jul 31 19:01:33 2000 Charlie Root -** Last update Thu Oct 4 15:04:13 2001 Charlie Root -*/ - - -#include "mlx_int.h" - - -int mlx_get_color_value(t_xvar *xvar,int color) -{ - return(mlx_int_get_good_color(xvar,color)); -} - -int mlx_int_get_good_color(t_xvar *xvar,int color) -{ - XColor xc; - - if (xvar->depth>=24) - return (color); - xc.red = (color>>8)&0xFF00; - xc.green = color&0xFF00; - xc.blue = (color<<8)&0xFF00; - xc.pixel = ((xc.red>>(16-xvar->decrgb[1]))<decrgb[0])+ - ((xc.green>>(16-xvar->decrgb[3]))<decrgb[2])+ - ((xc.blue>>(16-xvar->decrgb[5]))<decrgb[4]); - return (xc.pixel); -} diff --git a/minilibx/mlx_get_data_addr.c b/minilibx/mlx_get_data_addr.c deleted file mode 100644 index 45e7a85..0000000 --- a/minilibx/mlx_get_data_addr.c +++ /dev/null @@ -1,23 +0,0 @@ -/* -** mlx_get_data_addr.c for MiniLibX in raytraceur -** -** Made by Charlie Root -** Login -** -** Started on Mon Aug 14 15:45:57 2000 Charlie Root -** Last update Thu Sep 27 19:05:25 2001 Charlie Root -*/ - - - -#include "mlx_int.h" - - -char *mlx_get_data_addr(t_img *img,int *bits_per_pixel, - int *size_line,int *endian) -{ - *bits_per_pixel = img->bpp; - *size_line = img->size_line; - *endian = img->image->byte_order; - return (img->data); -} diff --git a/minilibx/mlx_hook.c b/minilibx/mlx_hook.c deleted file mode 100644 index 98e509a..0000000 --- a/minilibx/mlx_hook.c +++ /dev/null @@ -1,40 +0,0 @@ -/* -** mlx_hook.c for MiniLibX in -** -** Made by Charlie Root -** Login -** -** Started on Thu Aug 3 11:49:06 2000 Charlie Root -** Last update Fri Jan 28 17:05:28 2005 Olivier Crouzet -*/ - - -#include "mlx_int.h" - - - - -int mlx_hook(t_win_list *win, int x_event, int x_mask, - int (*funct)(),void *param) -{ - win->hooks[x_event].hook = funct; - win->hooks[x_event].param = param; - win->hooks[x_event].mask = x_mask; -} - - -int mlx_do_key_autorepeatoff(t_xvar *xvar) -{ - XAutoRepeatOff(xvar->display); -} - -int mlx_do_key_autorepeaton(t_xvar *xvar) -{ - XAutoRepeatOn(xvar->display); -} - - -int mlx_do_sync(t_xvar *xvar) -{ - XSync(xvar->display, False); -} diff --git a/minilibx/mlx_init.c b/minilibx/mlx_init.c deleted file mode 100644 index 7a8db8f..0000000 --- a/minilibx/mlx_init.c +++ /dev/null @@ -1,91 +0,0 @@ -/* -** mlx_init.c for MiniLibX in -** -** Made by Charlie Root -** Login -** -** Started on Mon Jul 31 16:52:42 2000 Charlie Root -** Last update Fri Jan 28 17:05:09 2005 Olivier Crouzet -*/ - - -#include "mlx_int.h" - - - -void *mlx_init() -{ - t_xvar *xvar; - - if (!(xvar = malloc(sizeof(*xvar))) || (xvar->display = XOpenDisplay(""))==0) - return ((void *)0); - xvar->screen = DefaultScreen(xvar->display); - xvar->root = DefaultRootWindow(xvar->display); - xvar->cmap = DefaultColormap(xvar->display,xvar->screen); - xvar->depth = DefaultDepth(xvar->display,xvar->screen); - if (mlx_int_get_visual(xvar)==-1) - { - printf(ERR_NO_TRUECOLOR); - exit(1); - } - xvar->win_list = 0; - xvar->loop_hook = 0; - xvar->loop_param = (void *)0; - xvar->do_flush = 1; - mlx_int_deal_shm(xvar); - if (xvar->private_cmap) - xvar->cmap = XCreateColormap(xvar->display,xvar->root, - xvar->visual,AllocNone); - mlx_int_rgb_conversion(xvar); - return (xvar); -} - - -/* -** pshm_format of -1 : Not XYBitmap|XYPixmap|ZPixmap -** alpha libX need a check of the DISPLAY env var, or shm is allowed -** in remote Xserver connections. -*/ - -int mlx_int_deal_shm(t_xvar *xvar) -{ - int use_pshm; - int bidon; - char *dpy; - char buff[33]; - - xvar->use_xshm = XShmQueryVersion(xvar->display,&bidon,&bidon,&(use_pshm)); - if (xvar->use_xshm && use_pshm) - xvar->pshm_format = XShmPixmapFormat(xvar->display); - else - xvar->pshm_format = -1; - gethostname(buff,32); - dpy = getenv(ENV_DISPLAY); - if (dpy && strlen(dpy) && *dpy!=':' && strncmp(dpy,buff,strlen(buff)) && - strncmp(dpy,LOCALHOST,strlen(LOCALHOST)) ) - { - xvar->pshm_format = -1; - xvar->use_xshm = 0; - } -} - -/* -** TrueColor Visual is needed to have *_mask correctly set -*/ - -int mlx_int_rgb_conversion(t_xvar *xvar) -{ - bzero(xvar->decrgb,sizeof(int)*6); - while (!(xvar->visual->red_mask&1)) - { xvar->visual->red_mask >>= 1; xvar->decrgb[0] ++; } - while (xvar->visual->red_mask&1) - { xvar->visual->red_mask >>= 1; xvar->decrgb[1] ++; } - while (!(xvar->visual->green_mask&1)) - { xvar->visual->green_mask >>= 1; xvar->decrgb[2] ++; } - while (xvar->visual->green_mask&1) - { xvar->visual->green_mask >>= 1; xvar->decrgb[3] ++; } - while (!(xvar->visual->blue_mask&1)) - { xvar->visual->blue_mask >>= 1; xvar->decrgb[4] ++; } - while (xvar->visual->blue_mask&1) - { xvar->visual->blue_mask >>= 1; xvar->decrgb[5] ++; } -} diff --git a/minilibx/mlx_int.h b/minilibx/mlx_int.h deleted file mode 100644 index 5749664..0000000 --- a/minilibx/mlx_int.h +++ /dev/null @@ -1,124 +0,0 @@ -/* -** mlx_int.h for mlx in -** -** Made by Charlie Root -** Login -** -** Started on Mon Jul 31 16:45:48 2000 Charlie Root -** Last update Wed May 25 16:44:16 2011 Olivier Crouzet -*/ - - - -/* -** Internal settings for MiniLibX -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -/* #include */ - -#define MLX_TYPE_SHM_PIXMAP 3 -#define MLX_TYPE_SHM 2 -#define MLX_TYPE_XIMAGE 1 - -#define MLX_MAX_EVENT LASTEvent - - -#define ENV_DISPLAY "DISPLAY" -#define LOCALHOST "localhost" -#define ERR_NO_TRUECOLOR "MinilibX Error : No TrueColor Visual available.\n" -#define WARN_SHM_ATTACH "MinilibX Warning : X server can't attach shared memory.\n" - - -typedef struct s_xpm_col -{ - int name; - int col; -} t_xpm_col; - - -struct s_col_name -{ - char *name; - int color; -}; - -typedef struct s_event_list -{ - int mask; - int (*hook)(); - void *param; -} t_event_list; - - -typedef struct s_win_list -{ - Window window; - GC gc; - struct s_win_list *next; - int (*mouse_hook)(); - int (*key_hook)(); - int (*expose_hook)(); - void *mouse_param; - void *key_param; - void *expose_param; - t_event_list hooks[MLX_MAX_EVENT]; -} t_win_list; - - -typedef struct s_img -{ - XImage *image; - Pixmap pix; - GC gc; - int size_line; - int bpp; - int width; - int height; - int type; - int format; - char *data; - XShmSegmentInfo shm; -} t_img; - -typedef struct s_xvar -{ - Display *display; - Window root; - int screen; - int depth; - Visual *visual; - Colormap cmap; - int private_cmap; - t_win_list *win_list; - int (*loop_hook)(); - void *loop_param; - int use_xshm; - int pshm_format; - int do_flush; - int decrgb[6]; -} t_xvar; - - -int mlx_int_do_nothing(); -int mlx_int_get_good_color(); -int mlx_int_find_in_pcm(); -int mlx_int_anti_resize_win(); -int mlx_int_wait_first_expose(); -int mlx_int_rgb_conversion(); -int mlx_int_deal_shm(); -void *mlx_int_new_xshm_image(); -char **mlx_int_str_to_wordtab(); -void *mlx_new_image(); -int shm_att_pb(); diff --git a/minilibx/mlx_int_anti_resize_win.c b/minilibx/mlx_int_anti_resize_win.c deleted file mode 100644 index 2f20b44..0000000 --- a/minilibx/mlx_int_anti_resize_win.c +++ /dev/null @@ -1,28 +0,0 @@ -/* -** mlx_int_anti_resize_win.c for MiniLibX in -** -** Made by Charlie Root -** Login -** -** Started on Tue Aug 8 14:31:05 2000 Charlie Root -** Last update Tue Sep 25 15:56:58 2001 Charlie Root -*/ - -#include "mlx_int.h" - - -int mlx_int_anti_resize_win(t_xvar *xvar,Window win,int w,int h) -{ - XSizeHints hints; - long toto; - - XGetWMNormalHints(xvar->display,win,&hints,&toto); - hints.width = w; - hints.height = h; - hints.min_width = w; - hints.min_height = h; - hints.max_width = w; - hints.max_height = h; - hints.flags = PPosition | PSize | PMinSize | PMaxSize; - XSetWMNormalHints(xvar->display,win,&hints); -} diff --git a/minilibx/mlx_int_do_nothing.c b/minilibx/mlx_int_do_nothing.c deleted file mode 100644 index 49524e4..0000000 --- a/minilibx/mlx_int_do_nothing.c +++ /dev/null @@ -1,16 +0,0 @@ -/* -** mlx_int_do_nothing.c for MiniLibX in -** -** Made by Charlie Root -** Login -** -** Started on Tue Aug 8 12:58:24 2000 Charlie Root -** Last update Tue Sep 25 15:56:22 2001 Charlie Root -*/ - - - -int mlx_int_do_nothing(void *param) -{ - -} diff --git a/minilibx/mlx_int_get_visual.c b/minilibx/mlx_int_get_visual.c deleted file mode 100644 index 440a7ca..0000000 --- a/minilibx/mlx_int_get_visual.c +++ /dev/null @@ -1,39 +0,0 @@ -/* -** mlx_int_get_visual.c for MinilibX in -** -** Made by Charlie Root -** Login -** -** Started on Wed Oct 3 17:01:51 2001 Charlie Root -** Last update Thu Oct 4 15:00:45 2001 Charlie Root -*/ - - - -#include "mlx_int.h" - - -/* -** We need a private colormap for non-default Visual. -*/ - - -int mlx_int_get_visual(t_xvar *xvar) -{ - XVisualInfo *vi; - XVisualInfo template; - int nb_item; - - xvar->private_cmap = 0; - xvar->visual = DefaultVisual(xvar->display,xvar->screen); - if (xvar->visual->class == TrueColor) - return (0); - template.class = TrueColor; - template.depth = xvar->depth; - if (!(vi = XGetVisualInfo(xvar->display,VisualDepthMask|VisualClassMask, - &template,&nb_item)) ) - return (-1); - xvar->visual = vi->visual; - xvar->private_cmap = 1; - return (0); -} diff --git a/minilibx/mlx_int_param_event.c b/minilibx/mlx_int_param_event.c deleted file mode 100644 index 8756a22..0000000 --- a/minilibx/mlx_int_param_event.c +++ /dev/null @@ -1,100 +0,0 @@ -/* -** mlx_int_param_event.c for MinilibX in -** -** Made by Charlie Root -** Login -** -** Started on Mon Jul 31 16:37:50 2000 Charlie Root -** Last update Wed Oct 6 13:14:52 2004 Olivier Crouzet -*/ - -#include "mlx_int.h" - -int mlx_int_param_undef() -{ -} - -int mlx_int_param_KeyPress(t_xvar *xvar, XEvent *ev, t_win_list *win) -{ - win->hooks[KeyPress].hook(XkbKeycodeToKeysym(xvar->display, - ev->xkey.keycode, 0, 0), - win->hooks[KeyPress].param); -} - -int mlx_int_param_KeyRelease(t_xvar *xvar, XEvent *ev, t_win_list *win) -{ - win->hooks[KeyRelease].hook(XkbKeycodeToKeysym(xvar->display, - ev->xkey.keycode, 0, 0), - win->hooks[KeyRelease].param); -} - -int mlx_int_param_ButtonPress(t_xvar *xvar, XEvent *ev, t_win_list *win) -{ - win->hooks[ButtonPress].hook(ev->xbutton.button,ev->xbutton.x,ev->xbutton.y, - win->hooks[ButtonPress].param); -} - -int mlx_int_param_ButtonRelease(t_xvar *xvar, XEvent *ev, t_win_list *win) -{ - win->hooks[ButtonRelease].hook(ev->xbutton.button, - ev->xbutton.x, ev->xbutton.y, - win->hooks[ButtonRelease].param); -} - -int mlx_int_param_MotionNotify(t_xvar *xvar, XEvent *ev, t_win_list *win) -{ - win->hooks[MotionNotify].hook(ev->xbutton.x,ev->xbutton.y, - win->hooks[MotionNotify].param); -} - -int mlx_int_param_Expose(t_xvar *xvar, XEvent *ev, t_win_list *win) -{ - if (!ev->xexpose.count) - win->hooks[Expose].hook(win->hooks[Expose].param); -} - - -int mlx_int_param_generic(t_xvar *xvar, XEvent *ev, t_win_list *win) -{ - win->hooks[ev->type].hook(win->hooks[ev->type].param); -} - -int (*(mlx_int_param_event[]))() = -{ - mlx_int_param_undef, /* 0 */ - mlx_int_param_undef, - mlx_int_param_KeyPress, - mlx_int_param_KeyRelease, /* 3 */ - mlx_int_param_ButtonPress, - mlx_int_param_ButtonRelease, - mlx_int_param_MotionNotify, /* 6 */ - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_Expose, /* 12 */ - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic, - mlx_int_param_generic -}; diff --git a/minilibx/mlx_int_set_win_event_mask.c b/minilibx/mlx_int_set_win_event_mask.c deleted file mode 100644 index 55650cd..0000000 --- a/minilibx/mlx_int_set_win_event_mask.c +++ /dev/null @@ -1,34 +0,0 @@ -/* -** mlx_int_set_win_event_mask.c for MiniLibX in -** -** Made by Charlie Root -** Login -** -** Started on Thu Aug 3 11:49:06 2000 Charlie Root -** Last update Fri Feb 23 17:07:42 2001 Charlie Root -*/ - - -#include "mlx_int.h" - - - - -int mlx_int_set_win_event_mask(t_xvar *xvar) -{ - t_win_list *win; - int mask; - int i; - XSetWindowAttributes xwa; - - win = xvar->win_list; - while (win) - { - xwa.event_mask = 0; - i = MLX_MAX_EVENT; - while (i--) - xwa.event_mask |= win->hooks[i].mask; - XChangeWindowAttributes(xvar->display, win->window, CWEventMask, &xwa); - win = win->next; - } -} diff --git a/minilibx/mlx_int_wait_first_expose.c b/minilibx/mlx_int_wait_first_expose.c deleted file mode 100644 index 0d549ee..0000000 --- a/minilibx/mlx_int_wait_first_expose.c +++ /dev/null @@ -1,23 +0,0 @@ -/* -** mlx_int_wait_first_expose.c for minilibx in -** -** Made by olivier crouzet -** Login -** -** Started on Tue Oct 17 09:26:45 2000 olivier crouzet -** Last update Fri Feb 23 17:27:10 2001 Charlie Root -*/ - - - -#include "mlx_int.h" - - - -int mlx_int_wait_first_expose(t_xvar *xvar,Window win) -{ - XEvent ev; - - XWindowEvent(xvar->display,win,ExposureMask,&ev); - XPutBackEvent(xvar->display,&ev); -} diff --git a/minilibx/mlx_key_hook.c b/minilibx/mlx_key_hook.c deleted file mode 100644 index eea6484..0000000 --- a/minilibx/mlx_key_hook.c +++ /dev/null @@ -1,22 +0,0 @@ -/* -** mlx_key_hook.c for MiniLibX in -** -** Made by Charlie Root -** Login -** -** Started on Thu Aug 3 11:49:06 2000 Charlie Root -** Last update Fri Feb 23 17:10:09 2001 Charlie Root -*/ - - -#include "mlx_int.h" - - - - -int mlx_key_hook(t_win_list *win,int (*funct)(),void *param) -{ - win->hooks[KeyRelease].hook = funct; - win->hooks[KeyRelease].param = param; - win->hooks[KeyRelease].mask = KeyReleaseMask; -} diff --git a/minilibx/mlx_lib_xpm.c b/minilibx/mlx_lib_xpm.c deleted file mode 100644 index b8cf184..0000000 --- a/minilibx/mlx_lib_xpm.c +++ /dev/null @@ -1,96 +0,0 @@ -/* -** mlx_xpm.c for minilibX in -** -** Made by Charlie Root -** Login -** -** Started on Fri Dec 8 11:07:24 2000 Charlie Root -** Last update Thu Oct 4 16:00:22 2001 Charlie Root -*/ - - -#include "mlx_int.h" - - - - -void *mlx_int_xpm_f_image(t_xvar *xvar,int *width,int *height, - int (*xpm_func)(),void *param) -{ - XImage *img1; - XImage *img2; - t_img *im2; - XpmAttributes xpm_att; - - xpm_att.visual = xvar->visual; - xpm_att.colormap = xvar->cmap; - xpm_att.depth = xvar->depth; - xpm_att.bitmap_format = ZPixmap; - xpm_att.valuemask = XpmDepth|XpmBitmapFormat|XpmVisual|XpmColormap; - if (xpm_func(xvar->display,param,&img1,&img2,&xpm_att)) - return ((void *)0); - if (img2) - XDestroyImage(img2); - - if (!(im2 = (void *)mlx_new_image(xvar,img1->width,img1->height))) - { - XDestroyImage(img1); - return ((void *)0); - } - *width = img1->width; - *height = img1->height; - if (mlx_int_egal_img(im2->image,img1)) - { - bcopy(img1->data,im2->data,img1->height*img1->bytes_per_line); - XDestroyImage(img1); - return (im2); - } - if (im2->type==MLX_TYPE_SHM_PIXMAP) - { - XFreePixmap(xvar->display,im2->pix); - im2->pix = XCreatePixmap(xvar->display,xvar->root, - *width,*height,xvar->depth); - } - if (im2->type>MLX_TYPE_XIMAGE) - { - XShmDetach(xvar->display,&(im2->shm)); - shmdt(im2->data); - } - XDestroyImage(im2->image); - im2->image = img1; - im2->data = img1->data; - im2->type = MLX_TYPE_XIMAGE; - im2->size_line = img1->bytes_per_line; - im2->bpp = img1->bits_per_pixel; - return (im2); -} - - -int mlx_int_egal_img(XImage *img1,XImage *img2) -{ - if (img1->width!=img2->width || img1->height!=img2->height || - img1->xoffset!=img2->xoffset || img1->format!=img2->format || - img1->byte_order!=img2->byte_order || - img1->bitmap_unit!=img2->bitmap_unit || - img1->bitmap_bit_order!=img2->bitmap_bit_order || - img1->bitmap_pad!=img2->bitmap_pad || img1->depth!=img2->depth || - img1->bytes_per_line!=img2->bytes_per_line || - img1->bits_per_pixel!=img2->bits_per_pixel || - img1->red_mask!=img2->red_mask || img1->green_mask!=img2->green_mask || - img1->blue_mask!=img2->blue_mask ) - return (0); - return (1); -} - - -void *mlx_xpm_file_to_image(t_xvar *xvar,char *filename, - int *width,int *height) -{ - return (mlx_int_xpm_f_image(xvar,width,height,XpmReadFileToImage,filename)); -} - - -void *mlx_xpm_to_image(t_xvar *xvar,char **data,int *width,int *height) -{ - return (mlx_int_xpm_f_image(xvar,width,height,XpmCreateImageFromData,(void *)data)); -} diff --git a/minilibx/mlx_loop.c b/minilibx/mlx_loop.c deleted file mode 100644 index 74af0a5..0000000 --- a/minilibx/mlx_loop.c +++ /dev/null @@ -1,38 +0,0 @@ -/* -** mlx_loop.c for MiniLibX in -** -** Made by Charlie Root -** Login -** -** Started on Wed Aug 2 18:58:11 2000 Charlie Root -** Last update Fri Sep 30 14:47:41 2005 Olivier Crouzet -*/ - - -#include "mlx_int.h" - -extern int (*(mlx_int_param_event[]))(); - - -int mlx_loop(t_xvar *xvar) -{ - XEvent ev; - t_win_list *win; - - mlx_int_set_win_event_mask(xvar); - xvar->do_flush = 0; - while (42) - { - while (!xvar->loop_hook || XPending(xvar->display)) - { - XNextEvent(xvar->display,&ev); - win = xvar->win_list; - while (win && (win->window!=ev.xany.window)) - win = win->next; - if (win && ev.type < MLX_MAX_EVENT) - if (win->hooks[ev.type].hook) - mlx_int_param_event[ev.type](xvar, &ev, win); - } - xvar->loop_hook(xvar->loop_param); - } -} diff --git a/minilibx/mlx_loop_hook.c b/minilibx/mlx_loop_hook.c deleted file mode 100644 index 1f8b9ed..0000000 --- a/minilibx/mlx_loop_hook.c +++ /dev/null @@ -1,21 +0,0 @@ -/* -** mlx_loop_hook.c for MiniLibX in -** -** Made by Charlie Root -** Login -** -** Started on Thu Aug 3 11:49:06 2000 Charlie Root -** Last update Fri Feb 23 17:11:39 2001 Charlie Root -*/ - - -#include "mlx_int.h" - - - - -int mlx_loop_hook(t_xvar *xvar,int (*funct)(),void *param) -{ - xvar->loop_hook = funct; - xvar->loop_param = param; -} diff --git a/minilibx/mlx_mouse_hook.c b/minilibx/mlx_mouse_hook.c deleted file mode 100644 index cb567ab..0000000 --- a/minilibx/mlx_mouse_hook.c +++ /dev/null @@ -1,22 +0,0 @@ -/* -** mlx_mouse_hook.c for MiniLibX in -** -** Made by Charlie Root -** Login -** -** Started on Thu Aug 3 11:49:06 2000 Charlie Root -** Last update Fri Feb 23 17:11:05 2001 Charlie Root -*/ - - -#include "mlx_int.h" - - - - -int mlx_mouse_hook(t_win_list *win,int (*funct)(),void *param) -{ - win->hooks[ButtonPress].hook = funct; - win->hooks[ButtonPress].param = param; - win->hooks[ButtonPress].mask = ButtonPressMask; -} diff --git a/minilibx/mlx_new_image.c b/minilibx/mlx_new_image.c deleted file mode 100644 index 9967401..0000000 --- a/minilibx/mlx_new_image.c +++ /dev/null @@ -1,155 +0,0 @@ -/* -** mlx_new_image.c for MiniLibX in raytraceur -** -** Made by Charlie Root -** Login -** -** Started on Mon Aug 14 15:29:14 2000 Charlie Root -** Last update Wed May 25 16:46:31 2011 Olivier Crouzet -*/ - - - - -#include "mlx_int.h" - -/* -** To handle X errors -*/ - -#define X_ShmAttach 1 - -int mlx_X_error; - -int shm_att_pb(Display *d,XErrorEvent *ev) -{ - if (ev->request_code==146 && ev->minor_code==X_ShmAttach) - write(2,WARN_SHM_ATTACH,strlen(WARN_SHM_ATTACH)); - mlx_X_error = 1; -} - - -/* -** Data malloc : width+32 ( bitmap_pad=32 ), *4 = *32 / 8bit -*/ - - -void *mlx_int_new_xshm_image(t_xvar *xvar,int width,int height,int format) -{ - t_img *img; - int (*save_handler)(); - - if (!(img = malloc(sizeof(*img)))) - return ((void *)0); - bzero(img,sizeof(*img)); - img->data = 0; - img->image = XShmCreateImage(xvar->display,xvar->visual,xvar->depth, - format,img->data,&(img->shm),width,height); - if (!img->image) - { - free(img); - return ((void *)0); - } - img->width = width; - img->height = height; - img->size_line = img->image->bytes_per_line; - img->bpp = img->image->bits_per_pixel; - img->format = format; - img->shm.shmid = shmget(IPC_PRIVATE,(width+32)*height*4,IPC_CREAT|0777); - if (img->shm.shmid==-1) - { - XDestroyImage(img->image); - free(img); - return ((void *)0); - } - img->data = img->shm.shmaddr = img->image->data = shmat(img->shm.shmid,0,0); - if (img->data==(void *)-1) - { - shmctl(img->shm.shmid,IPC_RMID,0); - XDestroyImage(img->image); - free(img); - return ((void *)0); - } - img->shm.readOnly = False; - mlx_X_error = 0; - save_handler = XSetErrorHandler(shm_att_pb); - if (!XShmAttach(xvar->display,&(img->shm)) || - 0&XSync(xvar->display,False) || mlx_X_error) - { - XSetErrorHandler(save_handler); - shmdt(img->data); - shmctl(img->shm.shmid,IPC_RMID,0); - XDestroyImage(img->image); - free(img); - return ((void *)0); - } - XSetErrorHandler(save_handler); - shmctl(img->shm.shmid,IPC_RMID,0); - if (xvar->pshm_format==format) - { - img->pix = XShmCreatePixmap(xvar->display,xvar->root,img->shm.shmaddr, - &(img->shm),width,height,xvar->depth); - img->type = MLX_TYPE_SHM_PIXMAP; - } - else - { - img->pix = XCreatePixmap(xvar->display,xvar->root, - width,height,xvar->depth); - img->type = MLX_TYPE_SHM; - } - if (xvar->do_flush) - XFlush(xvar->display); - return (img); -} - - - -void *mlx_int_new_image(t_xvar *xvar,int width, int height,int format) -{ - t_img *img; - - if (!(img = malloc(sizeof(*img))) || - !(img->data = malloc((width+32)*height*4))) - return ((void *)0); - bzero(img->data,(width+32)*height*4); - img->image = XCreateImage(xvar->display,xvar->visual,xvar->depth,format,0, - img->data,width,height,32,0); - if (!img->image) - { - free(img->data); - free(img); - return ((void *)0); - } - img->gc = 0; - img->size_line = img->image->bytes_per_line; - img->bpp = img->image->bits_per_pixel; - img->width = width; - img->height = height; - img->pix = XCreatePixmap(xvar->display,xvar->root,width,height,xvar->depth); - img->format = format; - img->type = MLX_TYPE_XIMAGE; - if (xvar->do_flush) - XFlush(xvar->display); - return (img); -} - - -void *mlx_new_image(t_xvar *xvar,int width, int height) -{ - t_img *img; - - if (xvar->use_xshm) - if (img = mlx_int_new_xshm_image(xvar,width,height,ZPixmap)) - return (img); - return (mlx_int_new_image(xvar,width,height,ZPixmap)); -} - -void *mlx_new_image2(t_xvar *xvar,int width, int height) -{ - t_img *img; - - if (xvar->use_xshm) - if (img = mlx_int_new_xshm_image(xvar,width,height,XYPixmap)) - return (img); - return (mlx_int_new_image(xvar,width,height,XYPixmap)); -} diff --git a/minilibx/mlx_new_window.c b/minilibx/mlx_new_window.c deleted file mode 100644 index 2399cdc..0000000 --- a/minilibx/mlx_new_window.c +++ /dev/null @@ -1,61 +0,0 @@ -/* -** mlx_new_window.c for MiniLibX in -** -** Made by Charlie Root -** Login -** -** Started on Mon Jul 31 17:29:02 2000 Charlie Root -** Last update Thu Oct 4 15:44:43 2001 Charlie Root -*/ - - -/* -** We do not use White/BlackPixel macro, TrueColor Visual make sure -** 0 is black & -1 is white -** -** With mlx_int_wait_first_expose, no flush is needed. -*/ - -#include "mlx_int.h" - - -void *mlx_new_window(t_xvar *xvar,int size_x,int size_y,char *title) -{ - t_win_list *new_win; - XSetWindowAttributes xswa; - XGCValues xgcv; - - xswa.background_pixel = 0; - xswa.border_pixel = -1; - xswa.colormap = xvar->cmap; - /* - xswa.event_mask = ButtonPressMask | ButtonReleaseMask | ExposureMask | - KeyPressMask | KeyReleaseMask | StructureNotifyMask; - */ - /* xswa.event_mask = ExposureMask; */ - xswa.event_mask = 0xFFFFFF; /* all events */ - if (!(new_win = malloc(sizeof(*new_win)))) - return ((void *)0); - new_win->window = XCreateWindow(xvar->display,xvar->root,0,0,size_x,size_y, - 0,CopyFromParent,InputOutput,xvar->visual, - CWEventMask|CWBackPixel|CWBorderPixel| - CWColormap,&xswa); - mlx_int_anti_resize_win(xvar,new_win->window,size_x,size_y); - XStoreName(xvar->display,new_win->window,title); - xgcv.foreground = -1; - xgcv.function = GXcopy; - xgcv.plane_mask = AllPlanes; - new_win->gc = XCreateGC(xvar->display,new_win->window, - GCFunction|GCPlaneMask|GCForeground,&xgcv); - new_win->next = xvar->win_list; - xvar->win_list = new_win; - /* - new_win->mouse_hook = mlx_int_do_nothing; - new_win->key_hook = mlx_int_do_nothing; - new_win->expose_hook = mlx_int_do_nothing; - */ - bzero(&(new_win->hooks), sizeof(new_win->hooks)); - XMapRaised(xvar->display,new_win->window); - mlx_int_wait_first_expose(xvar,new_win->window); - return (new_win); -} diff --git a/minilibx/mlx_pixel_put.c b/minilibx/mlx_pixel_put.c deleted file mode 100644 index c411f36..0000000 --- a/minilibx/mlx_pixel_put.c +++ /dev/null @@ -1,26 +0,0 @@ -/* - ** mlx_pixel_put.c for MiniLibX in - ** - ** Made by Charlie Root - ** Login - ** - ** Started on Mon Jul 31 19:01:33 2000 Charlie Root -** Last update Tue Sep 25 17:09:49 2001 Charlie Root - */ - - -#include "mlx_int.h" - - - -int mlx_pixel_put(t_xvar *xvar,t_win_list *win, - int x,int y,int color) -{ - XGCValues xgcv; - - xgcv.foreground = mlx_int_get_good_color(xvar,color); - XChangeGC(xvar->display,win->gc,GCForeground,&xgcv); - XDrawPoint(xvar->display,win->window,win->gc,x,y); - if (xvar->do_flush) - XFlush(xvar->display); -} diff --git a/minilibx/mlx_put_image_to_window.c b/minilibx/mlx_put_image_to_window.c deleted file mode 100644 index 86ba3f4..0000000 --- a/minilibx/mlx_put_image_to_window.c +++ /dev/null @@ -1,37 +0,0 @@ -/* -** mlx_put_image_to_window.c for MiniLibX in raytraceur -** -** Made by Charlie Root -** Login -** -** Started on Mon Aug 14 15:55:49 2000 Charlie Root -** Last update Sun Oct 2 09:53:00 2005 Olivier Crouzet -*/ - - - -#include "mlx_int.h" - - -int mlx_put_image_to_window(t_xvar *xvar,t_win_list *win,t_img *img, - int x,int y) -{ - GC gc; - - gc = win->gc; - if (img->gc) - { - gc = img->gc; - XSetClipOrigin(xvar->display, gc, x, y); - } - if (img->type==MLX_TYPE_SHM) - XShmPutImage(xvar->display,img->pix, win->gc, img->image,0,0,0,0, - img->width,img->height,False); - if (img->type==MLX_TYPE_XIMAGE) - XPutImage(xvar->display,img->pix, win->gc, img->image,0,0,0,0, - img->width,img->height); - XCopyArea(xvar->display,img->pix,win->window, gc, - 0,0,img->width,img->height,x,y); - if (xvar->do_flush) - XFlush(xvar->display); -} diff --git a/minilibx/mlx_string_put.c b/minilibx/mlx_string_put.c deleted file mode 100644 index 8492a09..0000000 --- a/minilibx/mlx_string_put.c +++ /dev/null @@ -1,26 +0,0 @@ -/* - ** mlx_string_put.c for MiniLibX in - ** - ** Made by Charlie Root - ** Login - ** - ** Started on Mon Jul 31 19:01:33 2000 Charlie Root -** Last update Tue Sep 25 17:11:47 2001 Charlie Root - */ - - -#include "mlx_int.h" - - - -int mlx_string_put(t_xvar *xvar,t_win_list *win, - int x,int y,int color,char *string) -{ - XGCValues xgcv; - - xgcv.foreground = mlx_int_get_good_color(xvar,color); - XChangeGC(xvar->display,win->gc,GCForeground,&xgcv); - XDrawString(xvar->display,win->window,win->gc,x,y,string,strlen(string)); - if (xvar->do_flush) - XFlush(xvar->display); -} diff --git a/minilibx/mlx_xpm.c.ok b/minilibx/mlx_xpm.c.ok deleted file mode 100644 index 225ea3c..0000000 --- a/minilibx/mlx_xpm.c.ok +++ /dev/null @@ -1,310 +0,0 @@ -/* -** xpm-read.c for MinilibX in -** -** Made by Charlie Root -** Login -** -** Started on Tue Dec 11 15:25:27 2001 olivier crouzet -** Last update Sat Oct 1 14:40:55 2005 Olivier Crouzet -*/ - - -#include "mlx_int.h" - -extern struct s_col_name mlx_col_name[]; - - -#define RETURN { if (colors) free(colors); if (tab) free(tab); \ - if (colors_direct) free(colors_direct); \ - if (img) {XDestroyImage(img->image); \ - XFreePixmap(xvar->display,img->pix);free(img);} \ - return ((void *)0);} - - - - -char *mlx_int_get_line(char *ptr,int *pos,int size) -{ - int pos2; - int pos3; - int pos4; - - if ((pos2 = mlx_int_str_str(ptr+*pos,"\"",size-*pos))==-1) - return ((char *)0); - if ((pos3 = mlx_int_str_str(ptr+*pos+pos2+1,"\"",size-*pos-pos2-1))==-1) - return ((char *)0); - *(ptr+*pos+pos2) = 0; - *(ptr+*pos+pos2+1+pos3) = 0; - pos4 = *pos+pos2+1; - *pos += pos2+pos3+2; - return (ptr+pos4); -} - - - -char *mlx_int_static_line(char **xpm_data,int *pos,int size) -{ - static char *copy = 0; - static int len = 0; - int len2; - char *str; - - str = xpm_data[(*pos)++]; - if ((len2 = strlen(str))>len) - { - if (copy) - free(copy); - if (!(copy = malloc(len2+1))) - return ((char *)0); - len = len2; - } - /* strcpy(copy,str); */ - strlcpy(copy, str, len2+1); - return (copy); -} - - -int mlx_int_get_col_name(char *str,int size) -{ - int result; - - result = 0; - while (size--) - result = (result<<8)+*(str++); - return (result); -} - -int mlx_int_get_text_rgb(char *name) -{ - int i; - - if (*name == '#') - return (strtol(name+1,0,16)); - i = 0; - while (mlx_col_name[i].name) - { - if (!strcasecmp(mlx_col_name[i].name, name)) - return (mlx_col_name[i].color); - i ++; - } - return (0); -} - - -int mlx_int_xpm_set_pixel(t_img *img, char *data, int opp, int col, int x) -{ - int dec; - - dec = opp; - while (dec--) - { - if (img->image->byte_order) - *(data+x*opp+dec) = col&0xFF; - else - *(data+x*opp+opp-dec-1) = col&0xFF; - col >>= 8; - } -} - - -void *mlx_int_parse_xpm(t_xvar *xvar,void *info,int info_size,char *(*f)()) -{ - int pos; - char *line; - char **tab; - char *data; - char *clip_data; - int nc; - int opp; - int cpp; - int col; - int rgb_col; - int col_name; - int method; - int x; - int i; - int j; - t_img *img; - t_xpm_col *colors; - int *colors_direct; - int width; - int height; - XImage *clip_img; - XGCValues xgcv; - Pixmap clip_pix; - - colors = 0; - colors_direct = 0; - img = 0; - tab = 0; - pos = 0; - if (!(line = f(info,&pos,info_size)) || - !(tab = mlx_int_str_to_wordtab(line)) || !(width = atoi(tab[0])) || - !(height = atoi(tab[1])) || !(nc = atoi(tab[2])) || - !(cpp = atoi(tab[3])) ) - RETURN; - free(tab); - tab = 0; - - method = 0; - if (cpp<=2) - { - method = 1; - if (!(colors_direct = malloc((cpp==2?65536:256)*sizeof(int)))) - RETURN; - } - else - if (!(colors = malloc(nc*sizeof(*colors)))) - RETURN; - - clip_data = 0; - - i = nc; - while (i--) - { - if (!(line = f(info,&pos,info_size)) || - !(tab = mlx_int_str_to_wordtab(line+cpp)) ) - RETURN; - j = 0; - while (tab[j] && strcmp(tab[j++],"c")); - if (!tab[j]) - RETURN; - - if ((rgb_col = mlx_int_get_text_rgb(tab[j]))==-1) - { - if (!(clip_data = malloc(4*width*height)) || /* ok, nice size .. */ - !(clip_img = XCreateImage(xvar->display, xvar->visual, - 1, XYPixmap, 0, clip_data, - width, height, 8, (width+7)/8)) ) - RETURN; - memset(clip_data, 0xFF, 4*width*height); - } - - if (method) - colors_direct[mlx_int_get_col_name(line,cpp)] = - rgb_col>=0?mlx_get_color_value(xvar, rgb_col):rgb_col; - else - { - colors[i].name = mlx_int_get_col_name(line,cpp); - colors[i].col = rgb_col>=0?mlx_get_color_value(xvar,rgb_col):rgb_col; - } - free(tab); - } - - if (!(img = mlx_new_image(xvar,width,height))) - RETURN; - opp = img->bpp/8; - - - i = height; - data = img->data; - while (i--) - { - if (!(line = f(info,&pos,info_size))) - RETURN; - x = 0; - while (xsize_line; - } - if (clip_data) - { - if (!(clip_pix = XCreatePixmap(xvar->display, xvar->root, - width, height, 1)) ) - RETURN; - img->gc = XCreateGC(xvar->display, clip_pix, 0, &xgcv); - XPutImage(xvar->display, clip_pix, img->gc, clip_img, - 0, 0, 0, 0, width, height); - XFreeGC(xvar->display, img->gc); - xgcv.clip_mask = clip_pix; - xgcv.function = GXcopy; - xgcv.plane_mask = AllPlanes; - img->gc = XCreateGC(xvar->display, xvar->root, GCClipMask|GCFunction| - GCPlaneMask, &xgcv); - XSync(xvar->display, False); - XDestroyImage(clip_img); - } - if (colors) - free(colors); - if (colors_direct) - free(colors_direct); - return (img); -} - - -int mlx_int_file_get_rid_comment(char *ptr, int size) -{ - int com_begin; - int com_end; - - while ((com_begin = mlx_int_str_str_cote(ptr,"/*",size))!=-1) - { - com_end = mlx_int_str_str(ptr+com_begin+2,"*/",size-com_begin-2); - memset(ptr+com_begin,' ',com_end+4); - } - while ((com_begin = mlx_int_str_str_cote(ptr,"//",size))!=-1) - { - com_end = mlx_int_str_str(ptr+com_begin+2,"\n",size-com_begin-2); - memset(ptr+com_begin,' ',com_end+3); - } -} - - -void *mlx_xpm_file_to_image(t_xvar *xvar,char *file,int *width,int *height) -{ - int fd; - int size; - char *ptr; - t_img *img; - - fd = -1; - if ((fd = open(file,O_RDONLY))==-1 || (size = lseek(fd,0,SEEK_END))==-1 || - (ptr = mmap(0,size,PROT_WRITE|PROT_READ,MAP_PRIVATE,fd,0))== - (void *)MAP_FAILED) - { - if (fd>=0) - close(fd); - return ((void *)0); - } - mlx_int_file_get_rid_comment(ptr, size); - if (img = mlx_int_parse_xpm(xvar,ptr,size,mlx_int_get_line)) - { - *width = img->width; - *height = img->height; - } - munmap(ptr,size); - close(fd); - return (img); -} - -void *mlx_xpm_to_image(t_xvar *xvar,char **xpm_data,int *width,int *height) -{ - t_img *img; - - if (img = mlx_int_parse_xpm(xvar,xpm_data,0,mlx_int_static_line)) - { - *width = img->width; - *height = img->height; - } - return (img); -} diff --git a/minilibx/rgb2c.pl b/minilibx/rgb2c.pl deleted file mode 100755 index 9ef39a0..0000000 --- a/minilibx/rgb2c.pl +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/perl -# -## rgb2c.pl for MiniLibX in /home/boulon/work/c/raytraceur/minilibx -## -## Made by Olivier Crouzet -## Login -## -## Started on Tue Oct 5 16:33:46 2004 Olivier Crouzet -## Last update Tue Oct 5 16:36:11 2004 Olivier Crouzet -## - - -# -# Generate a .c file with encoded colors, from the XFree86 rgb.txt file. -# - -open(RGB, "/usr/X11/lib/X11/rgb.txt"); - - -printf("/*\n** This is a generated file with rgb2c.pl and rgb.txt from\n"); -printf("** the XFree86 distribution.\n*/\n\n"); -printf("struct s_col_name mlx_col_name[] =\n{\n"); - -while () -{ - @tab = split; - if ($tab[0] ne "!") - { - $color = $tab[3]; - if ("$tab[4]" ne "") - { - $color = "$tab[3] $tab[4]"; - } - printf(" { \"%s\" , 0x%x },\n", $color, $tab[0]*65536+$tab[1]*256+$tab[2]); - } -} - -printf(" { 0, 0 }\n};\n"); diff --git a/minilibx/test/Makefile.gen b/minilibx/test/Makefile.gen deleted file mode 100644 index f3d0e9b..0000000 --- a/minilibx/test/Makefile.gen +++ /dev/null @@ -1,26 +0,0 @@ -INC=/usr/include -HT=Linux -DOCP=do_cp - - - -INCLIB=$(INC)/../lib - -CC=gcc - -CFLAGS= -I$(INC) -O3 -I.. - -NAME= mlx-test -SRC = main.c -OBJ = $(SRC:.c=.o) - -all :$(NAME) - -$(NAME) :$(OBJ) - $(CC) -o $(NAME) $(OBJ) -L.. -lmlx -L$(INCLIB) -lXext -lX11 -lm - -clean : - rm -f $(NAME) $(OBJ) *~ core *.core - - -re : clean all diff --git a/minilibx/test/Makefile.mk b/minilibx/test/Makefile.mk deleted file mode 100644 index 53275cc..0000000 --- a/minilibx/test/Makefile.mk +++ /dev/null @@ -1,24 +0,0 @@ - - -INC=%%%% - -INCLIB=$(INC)/../lib - -CC=gcc - -CFLAGS= -I$(INC) -O3 -I.. - -NAME= mlx-test -SRC = main.c -OBJ = $(SRC:.c=.o) - -all :$(NAME) - -$(NAME) :$(OBJ) - $(CC) -o $(NAME) $(OBJ) -L.. -lmlx -L$(INCLIB) -lXext -lX11 -lm - -clean : - rm -f $(NAME) $(OBJ) *~ core *.core - - -re : clean all diff --git a/minilibx/test/main.c b/minilibx/test/main.c deleted file mode 100644 index ea132b4..0000000 --- a/minilibx/test/main.c +++ /dev/null @@ -1,284 +0,0 @@ - -#include "mlx.h" -#include "mlx_int.h" - -#define WIN1_SX 242 -#define WIN1_SY 242 -#define IM1_SX 42 -#define IM1_SY 42 -#define IM3_SX 242 -#define IM3_SY 242 - -void *mlx; -void *win1; -void *win2; -void *win3; -void *im1; -void *im2; -void *im3; -void *im4; -int bpp1; -int bpp2; -int bpp3; -int bpp4; -int sl1; -int sl2; -int sl3; -int sl4; -int endian1; -int endian2; -int endian3; -int endian4; -char *data1; -char *data2; -char *data3; -char *data4; -int xpm1_x; -int xpm1_y; - -int local_endian; - -int expose_win1(void *p) -{ - mlx_put_image_to_window(mlx,win1,im3,0,0); -} - -int expose_win2(void *p) -{ - mlx_put_image_to_window(mlx,win2,im4,0,0); - mlx_put_image_to_window(mlx,win2,im2,0,0); -} - -int key_win1(int key,void *p) -{ - printf("Key in Win1 : %d\n",key); - if (key==0xFF1B) - exit(0); -} - -int key_win2(int key,void *p) -{ - printf("Key in Win2 : %d\n",key); - if (key==0xFF1B) - exit(0); -} - -int key_win3(int key,void *p) -{ - printf("Key in Win3 : %d\n",key); - if (key==0xFF1B) - mlx_destroy_window(mlx,win3); -} - -int mouse_win1(int button,int x,int y, void *p) -{ - printf("Mouse in Win1, button %d at %dx%d.\n",button,x,y); -} - -int mouse_win2(int button,int x,int y, void *p) -{ - printf("Mouse in Win2, button %d at %dx%d.\n",button,x,y); -} - -int mouse_win3(int x,int y, void *p) -{ - printf("Mouse moving in Win3, at %dx%d.\n",x,y); -} - - -int main() -{ - int a; - - printf("MinilibX Test Program\n"); - a = 0x11223344; - if (((unsigned char *)&a)[0] == 0x11) - local_endian = 1; - else - local_endian = 0; - printf(" => Local Endian : %d\n",local_endian); - - printf(" => Connection ..."); - if (!(mlx = mlx_init())) - { - printf(" !! KO !!\n"); - exit(1); - } - printf("OK (use_xshm %d pshm_format %d)\n",((t_xvar *)mlx)->use_xshm,((t_xvar *)mlx)->pshm_format); - - printf(" => Window1 %dx%d \"Title 1\" ...",WIN1_SX,WIN1_SY); - if (!(win1 = mlx_new_window(mlx,WIN1_SX,WIN1_SY,"Title1"))) - { - printf(" !! KO !!\n"); - exit(1); - } - printf("OK\n"); - - printf(" => Colormap sans event ..."); - color_map_1(win1,WIN1_SX,WIN1_SY); - printf("OK\n"); - sleep(2); - - printf(" => Clear Window ..."); - mlx_clear_window(mlx,win1); - printf("OK\n"); - sleep(2); - - printf(" => Image1 ZPixmap %dx%d ...",IM1_SX,IM1_SY); - if (!(im1 = mlx_new_image(mlx,IM1_SX,IM1_SY))) - { - printf(" !! KO !!\n"); - exit(1); - } - data1 = mlx_get_data_addr(im1,&bpp1,&sl1,&endian1); - printf("OK (bpp1: %d, sizeline1: %d endian: %d type: %d)\n",bpp1,sl1,endian1, - ((t_img *)im1)->type); - - printf(" => Fill Image1 ..."); - color_map_2(data1,bpp1,sl1,IM1_SX,IM1_SY,endian1, 1); - printf("OK (pixmap : %d)\n",(int)((t_img *)im1)->pix); - - printf(" => Put Image1 ..."); - mlx_put_image_to_window(mlx,win1,im1,20,20); - printf("OK\n"); - sleep(2); - - printf(" => Destroy Image1 ... "); - mlx_destroy_image(mlx, im1); - printf("OK\n"); - sleep(2); - - printf(" => Image3 ZPixmap %dx%d ...",IM3_SX,IM3_SY); - if (!(im3 = mlx_new_image(mlx,IM3_SX,IM3_SY))) - { - printf(" !! KO !!\n"); - exit(1); - } - data3 = mlx_get_data_addr(im3,&bpp3,&sl3,&endian3); - printf("OK (bpp3 %d, sizeline3 %d endian3 %d type %d)\n",bpp3,sl3,endian3, - ((t_img *)im3)->type); - - printf(" => Fill Image3 ..."); - color_map_2(data3,bpp3,sl3,IM3_SX,IM3_SY,endian3, 1); - printf("OK (pixmap : %d)\n",(int)((t_img *)im3)->pix); - - printf(" => Put Image3 ..."); - mlx_put_image_to_window(mlx,win1,im3,20,20); - printf("OK\n"); - sleep(2); - - printf(" => String ..."); - mlx_string_put(mlx,win1,5,WIN1_SY/2,0xFF99FF,"String output"); - mlx_string_put(mlx,win1,15,WIN1_SY/2+20,0x00FFFF,"MinilibX test"); - printf("OK\n"); - sleep(2); - - printf(" => Xpm from file ..."); - if (!(im2 = mlx_xpm_file_to_image(mlx,"open.xpm",&xpm1_x,&xpm1_y))) - { - printf(" !! KO !!\n"); - exit(1); - } - data2 = mlx_get_data_addr(im2,&bpp2,&sl2,&endian2); - printf("OK (xpm %dx%d)(img bpp2: %d, sizeline2: %d endian: %d type: %d)\n", - xpm1_x,xpm1_y,bpp2,sl2,endian2,((t_img *)im2)->type); - sleep(2); - - printf(" => Put xpm ..."); - mlx_put_image_to_window(mlx,win1,im2,0,0); - mlx_put_image_to_window(mlx,win1,im2,100,100); - printf("OK\n"); - sleep(2); - - printf(" => 2nd window,"); - win2 = mlx_new_window(mlx,WIN1_SX,WIN1_SY,"Title2"); - if (!(im4 = mlx_new_image(mlx,IM3_SX, IM3_SY))) - { - printf(" !! KO !!\n"); - exit(1); - } - data4 = mlx_get_data_addr(im4,&bpp4,&sl4,&endian4); - color_map_2(data4,bpp4,sl4,IM3_SX,IM3_SY,endian4, 2); - - printf(" 3rd window, Installing hooks ..."); - win3 = mlx_new_window(mlx,WIN1_SX,WIN1_SY,"Title3"); - mlx_expose_hook(win1,expose_win1,0); - mlx_mouse_hook(win1,mouse_win1,0); - mlx_key_hook(win1,key_win1,0); - mlx_expose_hook(win2,expose_win2,0); - mlx_mouse_hook(win2,mouse_win2,0); - mlx_key_hook(win2,key_win2,0); - mlx_key_hook(win3,key_win3,0); - - mlx_hook(win3, MotionNotify, PointerMotionMask, mouse_win3, 0); - - printf("OK\nNow in Loop. Just play. Esc in 3 to destroy, 1&2 to quit.\n"); - - mlx_loop(mlx); -} - - -int color_map_1(void *win,int w,int h) -{ - int x; - int y; - int color; - - x = w; - while (x--) - { - y = h; - while (y--) - { - color = (x*255)/w+((((w-x)*255)/w)<<16)+(((y*255)/h)<<8); - mlx_pixel_put(mlx,win,x,y,color); - } - } -} - - -int color_map_2(unsigned char *data,int bpp,int sl,int w,int h,int endian, int type) -{ - int x; - int y; - int opp; - int dec; - int color; - int color2; - unsigned char *ptr; - - opp = bpp/8; - printf("(opp : %d) ",opp); - y = h; - while (y--) - { - ptr = data+y*sl; - x = w; - while (x--) - { - if (type==2) - color = (y*255)/w+((((w-x)*255)/w)<<16) - +(((y*255)/h)<<8); - else - color = (x*255)/w+((((w-x)*255)/w)<<16)+(((y*255)/h)<<8); - color2 = mlx_get_color_value(mlx,color); - dec = opp; - while (dec--) - if (endian==local_endian) - { - if (endian) - *(ptr+x*opp+dec) = ((unsigned char *)(&color2))[4-opp+dec]; - else - *(ptr+x*opp+dec) = ((unsigned char *)(&color2))[dec]; - } - else - { - if (endian) - *(ptr+x*opp+dec) = ((unsigned char *)(&color2))[opp-1-dec]; - else - *(ptr+x*opp+dec) = ((unsigned char *)(&color2))[3-dec]; - } - } - } - -} diff --git a/minilibx/test/new_win.c b/minilibx/test/new_win.c deleted file mode 100644 index 62bed4b..0000000 --- a/minilibx/test/new_win.c +++ /dev/null @@ -1,31 +0,0 @@ - - - -#include "mlx.h" - - -void *mlx; -void *win1; -void *win2; - - - -int gere_mouse(int x,int y,int button,void*toto) -{ - printf("Mouse event - new win\n"); - mlx_destroy_window(mlx,win1); - win1 = mlx_new_window(mlx,random()%500,random()%500,"new win"); - mlx_mouse_hook(win1,gere_mouse,0); -} - - -int main() -{ - srandom(time(0)); - mlx = mlx_init(); - win1 = mlx_new_window(mlx,300,300,"win1"); - win2 = mlx_new_window(mlx,600,600,"win2"); - mlx_mouse_hook(win1,gere_mouse,0); - mlx_mouse_hook(win2,gere_mouse,0); - mlx_loop(mlx); -} diff --git a/minilibx/test/open.xpm b/minilibx/test/open.xpm deleted file mode 100644 index 87be371..0000000 --- a/minilibx/test/open.xpm +++ /dev/null @@ -1,1439 +0,0 @@ -/* XPM */ -static char * open30_2_xpm[] = { -"64 64 1372 2", -" c None", -". c #08090D", -"+ c #1A1E23", -"@ c #1F2124", -"# c #060809", -"$ c #1A1E21", -"% c #4F606C", -"& c #3D4145", -"* c #868D93", -"= c #454E56", -"- c #627481", -"; c #667C8A", -"> c #2D3031", -", c #D7E1E7", -"' c #4D5157", -") c #8997A5", -"! c #282E31", -"~ c #333B41", -"{ c #A5C6DB", -"] c #718C9B", -"^ c #000000", -"/ c #181B1F", -"( c #262828", -"_ c #D2DEE7", -": c #B8C5D0", -"< c #151719", -"[ c #08090B", -"} c #272B30", -"| c #2D3037", -"1 c #26282C", -"2 c #1A1D1F", -"3 c #B1CADB", -"4 c #56646E", -"5 c #080809", -"6 c #080A0C", -"7 c #1E2126", -"8 c #98B7C9", -"9 c #A2CAE2", -"0 c #7FA1B5", -"a c #06080A", -"b c #252729", -"c c #A7ADB2", -"d c #272B2E", -"e c #1E2023", -"f c #C8D8E5", -"g c #C9DDED", -"h c #8996A3", -"i c #6B7782", -"j c #C7DFF0", -"k c #CCE0F0", -"l c #AFC1CF", -"m c #47535B", -"n c #B0D3E8", -"o c #7E99A9", -"p c #738493", -"q c #97B4C7", -"r c #53606A", -"s c #6E8996", -"t c #A1CBE3", -"u c #9CC6DE", -"v c #90B5CB", -"w c #171D22", -"x c #1E2629", -"y c #020202", -"z c #ABB3BA", -"A c #BBC4C8", -"B c #222323", -"C c #141617", -"D c #5D6164", -"E c #ACB5BC", -"F c #676D74", -"G c #BDD4E5", -"H c #B3D1E7", -"I c #B0D1E7", -"J c #728A99", -"K c #94AEBF", -"L c #B1D1E7", -"M c #505C64", -"N c #7B98A9", -"O c #A1CBE0", -"P c #99C3D9", -"Q c #475863", -"R c #A0C9DE", -"S c #9CC6DA", -"T c #9ECAE1", -"U c #9CC5DD", -"V c #9AC4DC", -"W c #263137", -"X c #3C4A55", -"Y c #658190", -"Z c #66686B", -"` c #7D8085", -" . c #363839", -".. c #797E81", -"+. c #D2DBE1", -"@. c #DDE9F4", -"#. c #CADEEF", -"$. c #778593", -"%. c #AED0E5", -"&. c #9EC9DE", -"*. c #9EC8DF", -"=. c #9BC1D8", -"-. c #9EC8DE", -";. c #6B8596", -">. c #9BC5DC", -",. c #9BC6DF", -"'. c #9CC5DC", -"). c #688595", -"!. c #6B8698", -"~. c #9CC4DC", -"{. c #9BC4DC", -"]. c #9DC5DD", -"^. c #647D8C", -"/. c #485864", -"(. c #161A1D", -"_. c #36444C", -":. c #95BDD5", -"<. c #566E7E", -"[. c #A4AAAD", -"}. c #E9F2F7", -"|. c #DEEAF6", -"1. c #B5D4E9", -"2. c #A9CFE3", -"3. c #90B3C9", -"4. c #9FCAE1", -"5. c #9BC4DD", -"6. c #7490A2", -"7. c #99C2DB", -"8. c #81A5BA", -"9. c #9CC5DE", -"0. c #98C1DA", -"a. c #5F7889", -"b. c #96BFD8", -"c. c #44545F", -"d. c #565A5E", -"e. c #DFE6EC", -"f. c #E6EEF7", -"g. c #D6E4F2", -"h. c #BFD6E9", -"i. c #A9CCE3", -"j. c #9FC8DD", -"k. c #9DC6DD", -"l. c #9CC4DD", -"m. c #7D9FB0", -"n. c #98C0D6", -"o. c #9AC5DD", -"p. c #97BFD8", -"q. c #9BC5DF", -"r. c #2D3840", -"s. c #626567", -"t. c #E7ECF5", -"u. c #E1EAF5", -"v. c #CEE3F3", -"w. c #B7D6EA", -"x. c #A4CBE0", -"y. c #8AAFC5", -"z. c #647F90", -"A. c #648092", -"B. c #89B0C7", -"C. c #9CC6DF", -"D. c #5D7486", -"E. c #7B9BAF", -"F. c #84A8BF", -"G. c #9BC5DD", -"H. c #96BED5", -"I. c #4B5D69", -"J. c #9BC5DE", -"K. c #536B77", -"L. c #2E3B41", -"M. c #1B2124", -"N. c #3F4F58", -"O. c #4D5152", -"P. c #E7EEF3", -"Q. c #E2EAF5", -"R. c #CEE2F2", -"S. c #BAD5E9", -"T. c #9DC2D7", -"U. c #5C7281", -"V. c #232A31", -"W. c #08090A", -"X. c #121418", -"Y. c #131619", -"Z. c #131719", -"`. c #87ACC3", -" + c #7B9BAE", -".+ c #87ADC3", -"++ c #8FB5CB", -"@+ c #678295", -"#+ c #96C0D8", -"$+ c #607787", -"%+ c #6B8595", -"&+ c #96C1DB", -"*+ c #6A8595", -"=+ c #35424A", -"-+ c #7090A1", -";+ c #15191C", -">+ c #2D3033", -",+ c #DDE5EB", -"'+ c #D2E3F1", -")+ c #BAD7EB", -"!+ c #A9CFE5", -"~+ c #272F35", -"{+ c #1C2227", -"]+ c #4F697B", -"^+ c #6B8FA9", -"/+ c #759CB6", -"(+ c #7BA0BB", -"_+ c #80A5BC", -":+ c #88B0C8", -"<+ c #96C3DB", -"[+ c #8FB6CD", -"}+ c #80A1B3", -"|+ c #556876", -"1+ c #96BFD7", -"2+ c #566B77", -"3+ c #93B8CD", -"4+ c #637A8D", -"5+ c #9DC6DE", -"6+ c #8FB4CA", -"7+ c #55697A", -"8+ c #6F8F9F", -"9+ c #91BDD5", -"0+ c #283239", -"a+ c #050406", -"b+ c #767B80", -"c+ c #BDC6CE", -"d+ c #D4E5F3", -"e+ c #C1D7EA", -"f+ c #A7CDE4", -"g+ c #9FC9DE", -"h+ c #668596", -"i+ c #6D90AA", -"j+ c #5C7994", -"k+ c #60849F", -"l+ c #6286A1", -"m+ c #688CA8", -"n+ c #7298B2", -"o+ c #82A8C2", -"p+ c #8FBAD5", -"q+ c #96C2DB", -"r+ c #89ADC4", -"s+ c #96BED6", -"t+ c #99C2DA", -"u+ c #6C899A", -"v+ c #92BBD2", -"w+ c #9AC4DD", -"x+ c #5B717D", -"y+ c #9EC6DE", -"z+ c #8BB1C9", -"A+ c #718EA0", -"B+ c #94C3DB", -"C+ c #536B78", -"D+ c #3E505F", -"E+ c #4E6373", -"F+ c #2C333C", -"G+ c #070708", -"H+ c #040404", -"I+ c #1A1C1E", -"J+ c #202326", -"K+ c #050606", -"L+ c #23292E", -"M+ c #A1C0D4", -"N+ c #9FC9DD", -"O+ c #97C2DB", -"P+ c #80A8C1", -"Q+ c #668AA6", -"R+ c #4B5D72", -"S+ c #4C647A", -"T+ c #5F80A0", -"U+ c #60859E", -"V+ c #678AA6", -"W+ c #739BB5", -"X+ c #85AEC7", -"Y+ c #92BDD7", -"Z+ c #96BFD5", -"`+ c #627B8A", -" @ c #89B1C9", -".@ c #2B353C", -"+@ c #7597B2", -"@@ c #779CB8", -"#@ c #52697C", -"$@ c #1D2328", -"%@ c #445663", -"&@ c #5E7A8D", -"*@ c #252F37", -"=@ c #090909", -"-@ c #859BB2", -";@ c #859DB8", -">@ c #6E8396", -",@ c #252C33", -"'@ c #9CC4D7", -")@ c #92C0D9", -"!@ c #79A0BA", -"~@ c #6487A3", -"{@ c #566979", -"]@ c #8CB0C2", -"^@ c #51697C", -"/@ c #60849D", -"(@ c #6D8EAC", -"_@ c #7BA0BC", -":@ c #8AB4CE", -"<@ c #95C2DB", -"[@ c #9AC5DC", -"}@ c #95C1DA", -"|@ c #607B8C", -"1@ c #597488", -"2@ c #7EA6BF", -"3@ c #597587", -"4@ c #455664", -"5@ c #668598", -"6@ c #82A9C4", -"7@ c #617F92", -"8@ c #1A2328", -"9@ c #2B3137", -"0@ c #728FAC", -"a@ c #51657B", -"b@ c #6B8AA8", -"c@ c #8EAEC7", -"d@ c #A8C8E2", -"e@ c #92BDD6", -"f@ c #769DBA", -"g@ c #526E87", -"h@ c #7490A0", -"i@ c #A6CDE4", -"j@ c #97BFD4", -"k@ c #55697D", -"l@ c #6286A0", -"m@ c #7399B3", -"n@ c #84ACC5", -"o@ c #92BFD9", -"p@ c #99C4DC", -"q@ c #94C0DA", -"r@ c #4F6575", -"s@ c #7DA5BF", -"t@ c #7FA2BC", -"u@ c #8FB6CE", -"v@ c #95C3DB", -"w@ c #8EB8D2", -"x@ c #6A879D", -"y@ c #111318", -"z@ c #252A30", -"A@ c #81868C", -"B@ c #A5ABAD", -"C@ c #70767C", -"D@ c #38434F", -"E@ c #637F9B", -"F@ c #516980", -"G@ c #799AB5", -"H@ c #A5C3D9", -"I@ c #93BDD6", -"J@ c #779EBA", -"K@ c #445A6B", -"L@ c #93B5C9", -"M@ c #B6D3E8", -"N@ c #AECFE4", -"O@ c #95BDD2", -"P@ c #52687A", -"Q@ c #6486A3", -"R@ c #7092B0", -"S@ c #90BCD6", -"T@ c #97C4DC", -"U@ c #A0C9E0", -"V@ c #99C5DD", -"W@ c #86AEC6", -"X@ c #8FBAD4", -"Y@ c #91BDD6", -"Z@ c #7094AC", -"`@ c #2A353E", -" # c #0B0E10", -".# c #888D90", -"+# c #787D82", -"@# c #465360", -"## c #56697F", -"$# c #A6CADD", -"%# c #5A7382", -"&# c #6C8CAA", -"*# c #A5BED3", -"=# c #A7CAE0", -"-# c #94C1DA", -";# c #7EA4BF", -"># c #415160", -",# c #9DC3D5", -"'# c #B3CFE1", -")# c #AAC3D4", -"!# c #A8CDE4", -"~# c #89ACBE", -"{# c #567088", -"]# c #6C91AC", -"^# c #81A7C2", -"/# c #96C4DC", -"(# c #85A9BD", -"_# c #708C9B", -":# c #5A6E7B", -"<# c #6C8695", -"[# c #97C3DB", -"}# c #8BB5CE", -"|# c #425461", -"1# c #63819E", -"2# c #415465", -"3# c #0B0D0E", -"4# c #607387", -"5# c #687D8C", -"6# c #B8D6E9", -"7# c #7893A2", -"8# c #576F85", -"9# c #A7BACF", -"0# c #B0CEE5", -"a# c #98C4DC", -"b# c #88B1CA", -"c# c #36444E", -"d# c #8FA0AD", -"e# c #73818D", -"f# c #596D81", -"g# c #B4D0E4", -"h# c #A3CDE2", -"i# c #658296", -"j# c #6A8DAB", -"k# c #7BA5C0", -"l# c #94BAD2", -"m# c #6D899B", -"n# c #99C3DC", -"o# c #8EB9D2", -"p# c #7AA0BA", -"q# c #6C8FAB", -"r# c #6484A1", -"s# c #1F252C", -"t# c #121619", -"u# c #7E96B0", -"v# c #7A8A96", -"w# c #BCD7EA", -"x# c #A0C5D9", -"y# c #3C4B57", -"z# c #A9BACD", -"A# c #BCD5E8", -"B# c #84A6BA", -"C# c #8EA1AE", -"D# c #CFD1D4", -"E# c #ECF6FA", -"F# c #ABB7C2", -"G# c #556F84", -"H# c #57626A", -"I# c #5C7078", -"J# c #6C8AA7", -"K# c #80A6C0", -"L# c #91B8D0", -"M# c #94BFD8", -"N# c #87B0CA", -"O# c #7CA2BB", -"P# c #7097AF", -"Q# c #495E6F", -"R# c #0C0E11", -"S# c #3A3F43", -"T# c #8AA3BB", -"U# c #778592", -"V# c #C0D8EB", -"W# c #B3D5E9", -"X# c #404A53", -"Y# c #B2C2D3", -"Z# c #96A1AC", -"`# c #9DB2C3", -" $ c #AEBECE", -".$ c #EDEFF3", -"+$ c #F7FAFC", -"@$ c #B6BFC7", -"#$ c #556E85", -"$$ c #121314", -"%$ c #2B2E2F", -"&$ c #555A5E", -"*$ c #3B4C5B", -"=$ c #6F8EA4", -"-$ c #92BED8", -";$ c #9DC7DF", -">$ c #87ACC1", -",$ c #546A78", -"'$ c #516874", -")$ c #4E6570", -"!$ c #4D6271", -"~$ c #4C6271", -"{$ c #4E677A", -"]$ c #38454E", -"^$ c #6C7278", -"/$ c #86A1B6", -"($ c #5C656C", -"_$ c #A4B0BA", -":$ c #555D64", -"<$ c #657178", -"[$ c #A6B0B5", -"}$ c #939CA1", -"|$ c #D4E4F1", -"1$ c #A0BACE", -"2$ c #B9C7D7", -"3$ c #F6F7F9", -"4$ c #C6CED1", -"5$ c #506A7C", -"6$ c #060607", -"7$ c #676A6B", -"8$ c #91999F", -"9$ c #7CA3BE", -"0$ c #96BCD4", -"a$ c #5B717E", -"b$ c #4B5F6C", -"c$ c #455864", -"d$ c #5B717F", -"e$ c #81A5B9", -"f$ c #98C4DD", -"g$ c #93BFD8", -"h$ c #87B1CA", -"i$ c #7BA1BC", -"j$ c #5A7489", -"k$ c #222A33", -"l$ c #838A92", -"m$ c #9DADBC", -"n$ c #ECF0F5", -"o$ c #F1F9FB", -"p$ c #818A8D", -"q$ c #4A5155", -"r$ c #6A6F72", -"s$ c #7E898F", -"t$ c #E6F1F7", -"u$ c #CADCED", -"v$ c #A0B7CC", -"w$ c #C6D1DF", -"x$ c #AFB3B4", -"y$ c #5F707D", -"z$ c #CBCFD1", -"A$ c #F4F5F6", -"B$ c #66737F", -"C$ c #87B2CB", -"D$ c #90B7CD", -"E$ c #596E7B", -"F$ c #586F7E", -"G$ c #8BB0C8", -"H$ c #91BED6", -"I$ c #83ADC7", -"J$ c #6D8EA7", -"K$ c #3F5161", -"L$ c #2D3A45", -"M$ c #1F2020", -"N$ c #BDC5CC", -"O$ c #E0EDF5", -"P$ c #BBCAD8", -"Q$ c #E1E4E7", -"R$ c #5E6368", -"S$ c #5B5F62", -"T$ c #D9E7F3", -"U$ c #A4C3D6", -"V$ c #89A3B3", -"W$ c #7B91A1", -"X$ c #627990", -"Y$ c #42505A", -"Z$ c #CACCCE", -"`$ c #F9F9F9", -" % c #FDFDFD", -".% c #BCBEC0", -"+% c #5C7689", -"@% c #8DB9D3", -"#% c #8FB5CC", -"$% c #536471", -"%% c #98C1D9", -"&% c #91BED7", -"*% c #81AAC5", -"=% c #597386", -"-% c #41535F", -";% c #6486A2", -">% c #4D667D", -",% c #070809", -"'% c #44484E", -")% c #BEC8D0", -"!% c #8096A6", -"~% c #516473", -"{% c #A9ACAF", -"]% c #8B8F91", -"^% c #A8B3BD", -"/% c #C5DAEB", -"(% c #9FC8E1", -"_% c #8FBCD6", -":% c #81A8C2", -"<% c #6C90AC", -"[% c #56728C", -"}% c #585B5F", -"|% c #CBCDCD", -"1% c #C1C3C6", -"2% c #4F565F", -"3% c #82ABC3", -"4% c #93BCD3", -"5% c #95BED7", -"6% c #8EB9D3", -"7% c #5B788B", -"8% c #627E91", -"9% c #7FA7C1", -"0% c #6C91AB", -"a% c #546F87", -"b% c #6F7376", -"c% c #D5E2EF", -"d% c #A9C4D8", -"e% c #81A1BA", -"f% c #333940", -"g% c #5F6B76", -"h% c #C0D5E8", -"i% c #AACCE2", -"j% c #8EB8D3", -"k% c #7FA5BF", -"l% c #7095B0", -"m% c #4E697E", -"n% c #07090A", -"o% c #0D0F10", -"p% c #7193A6", -"q% c #96C3DC", -"r% c #8EBCD7", -"s% c #91BDD7", -"t% c #8FBBD6", -"u% c #7699AD", -"v% c #4D626F", -"w% c #252D33", -"x% c #101215", -"y% c #0C0D0E", -"z% c #0A0C0E", -"A% c #06090A", -"B% c #7F8488", -"C% c #D7E3F1", -"D% c #B6D0E4", -"E% c #A3C2D7", -"F% c #596872", -"G% c #A9BED0", -"H% c #B4D0E5", -"I% c #9EC8DC", -"J% c #8FB9D4", -"K% c #85ADC7", -"L% c #7FA4BE", -"M% c #4B606F", -"N% c #4E6372", -"O% c #89B6D0", -"P% c #92C1DA", -"Q% c #9DC7DD", -"R% c #95C0DA", -"S% c #94BED8", -"T% c #8BB8D1", -"U% c #7AA0B9", -"V% c #4E667A", -"W% c #344151", -"X% c #0C0D0F", -"Y% c #8A8F92", -"Z% c #D4E6F5", -"`% c #BCD5E9", -" & c #8599A5", -".& c #939DA6", -"+& c #C4DAEB", -"@& c #89A6B9", -"#& c #7D9FB5", -"$& c #98C3DC", -"%& c #95C0D9", -"&& c #7CA2B9", -"*& c #7697AE", -"=& c #698498", -"-& c #7394A8", -";& c #9EC7DF", -">& c #8DB1C4", -",& c #6B8594", -"'& c #50636C", -")& c #50626C", -"!& c #7F9FB1", -"~& c #93B8D0", -"{& c #627A88", -"]& c #90B6CC", -"^& c #93BDD7", -"/& c #87AFC9", -"(& c #7291A7", -"_& c #384651", -":& c #121618", -"<& c #12171B", -"[& c #4F6986", -"}& c #597998", -"|& c #324052", -"1& c #969CA1", -"2& c #D6E6F5", -"3& c #C6DCEE", -"4& c #505A64", -"5& c #82929F", -"6& c #99ABBB", -"7& c #A1B9CA", -"8& c #87A0B0", -"9& c #718EA1", -"0& c #8DB2C9", -"a& c #8BAEC4", -"b& c #586D7D", -"c& c #97C0D9", -"d& c #8DB3C9", -"e& c #95B8CD", -"f& c #9DC0D6", -"g& c #6F8B9C", -"h& c #354249", -"i& c #464E54", -"j& c #8A98A5", -"k& c #AABAC7", -"l& c #86939E", -"m& c #41494F", -"n& c #4A5861", -"o& c #97C1DA", -"p& c #5E7888", -"q& c #5C7482", -"r& c #88ACC2", -"s& c #91BFD7", -"t& c #799CB5", -"u& c #47596A", -"v& c #0D0F12", -"w& c #1A2127", -"x& c #56778D", -"y& c #688BA9", -"z& c #5D7F9E", -"A& c #547391", -"B& c #0E1013", -"C& c #9DA6AB", -"D& c #C8DCED", -"E& c #7A8996", -"F& c #B5CEE0", -"G& c #BCDBEC", -"H& c #B9D5EA", -"I& c #8BA2B2", -"J& c #6C8A9D", -"K& c #97BFD7", -"L& c #3E4E59", -"M& c #92B5CB", -"N& c #535F68", -"O& c #454F56", -"P& c #6F7C87", -"Q& c #ABC0D1", -"R& c #C7DCEE", -"S& c #C5DBED", -"T& c #C2D7EA", -"U& c #BFD8EA", -"V& c #BCD7EB", -"W& c #62717B", -"X& c #5B6F7B", -"Y& c #95C3DC", -"Z& c #8BB2C9", -"`& c #485761", -" * c #42525F", -".* c #6686A1", -"+* c #587896", -"@* c #1B2129", -"#* c #5C7A94", -"$* c #7DA2BD", -"%* c #84AEC7", -"&* c #749BB5", -"** c #5C7E9C", -"=* c #27343F", -"-* c #A4A9B2", -";* c #D9E7F4", -">* c #C8DBEC", -",* c #B1C8DA", -"'* c #5D6C76", -")* c #A8C5D8", -"!* c #A6BDD0", -"~* c #B9D6EA", -"{* c #B9D4E9", -"]* c #8198A8", -"^* c #8AADC3", -"/* c #8CB1CA", -"(* c #96C2D8", -"_* c #A3C7DF", -":* c #ADCDE3", -"<* c #ABD0E4", -"[* c #ADCFE3", -"}* c #AACEE4", -"|* c #A4CDE3", -"1* c #A1CBE1", -"2* c #A3CCE3", -"3* c #A2C9DF", -"4* c #41515A", -"5* c #81A2B5", -"6* c #94C0D7", -"7* c #5E7789", -"8* c #526777", -"9* c #516777", -"0* c #6B8CA5", -"a* c #759CBA", -"b* c #658AA5", -"c* c #587798", -"d* c #1B242B", -"e* c #0E1110", -"f* c #101214", -"g* c #202931", -"h* c #59758E", -"i* c #799FBB", -"j* c #84B1CA", -"k* c #86ACC6", -"l* c #354758", -"m* c #A0A6AE", -"n* c #DAE6F2", -"o* c #C4DCEE", -"p* c #B4D2E8", -"q* c #3E4A53", -"r* c #698091", -"s* c #5D7581", -"t* c #A3CAE0", -"u* c #A6CFE5", -"v* c #A5CCE5", -"w* c #718A9C", -"x* c #98C3DB", -"y* c #83ABC7", -"z* c #2E3B46", -"A* c #33414A", -"B* c #678398", -"C* c #8AB3CE", -"D* c #93BED7", -"E* c #97C4DB", -"F* c #42525E", -"G* c #88ACC0", -"H* c #789EB9", -"I* c #7A9FBB", -"J* c #7EA2BD", -"K* c #779DB5", -"L* c #577081", -"M* c #5B7B9B", -"N* c #1D2229", -"O* c #547390", -"P* c #54728D", -"Q* c #6082A0", -"R* c #688EA9", -"S* c #6689A7", -"T* c #6086A0", -"U* c #6285A1", -"V* c #6B8DAA", -"W* c #718FAB", -"X* c #3E5568", -"Y* c #969DA1", -"Z* c #DBE8F4", -"`* c #95ACBD", -" = c #758B9A", -".= c #A4C9DE", -"+= c #698190", -"@= c #667E8A", -"#= c #7D99AA", -"$= c #7B9BAD", -"%= c #6F8C9A", -"&= c #536976", -"*= c #84ADC6", -"== c #6D92AD", -"-= c #62829E", -";= c #43576A", -">= c #2F3B46", -",= c #5C788A", -"'= c #86AFC8", -")= c #93BED8", -"!= c #93BAD5", -"~= c #93BAD2", -"{= c #92BCD4", -"]= c #7EA2B6", -"^= c #3D4D56", -"/= c #485B67", -"(= c #7596A9", -"_= c #8CBBD4", -":= c #90BCD5", -"<= c #91BFD9", -"[= c #789BAD", -"}= c #465B6A", -"|= c #59789A", -"1= c #5D7F9D", -"2= c #5E839C", -"3= c #59799A", -"4= c #415569", -"5= c #2D3A46", -"6= c #2E3B49", -"7= c #4A647C", -"8= c #587690", -"9= c #39485A", -"0= c #7F8589", -"a= c #D9E8F5", -"b= c #CCDEEE", -"c= c #8597A5", -"d= c #B3D2E3", -"e= c #9BB3C4", -"f= c #B2CEE1", -"g= c #B2D1E7", -"h= c #ABCFE6", -"i= c #94B7CB", -"j= c #495C6A", -"k= c #688498", -"l= c #617B8A", -"m= c #85ADC8", -"n= c #78A0B9", -"o= c #62819B", -"p= c #2E3843", -"q= c #485A6C", -"r= c #67889C", -"s= c #8AB5CF", -"t= c #8EB9D1", -"u= c #6C899B", -"v= c #6E91A7", -"w= c #678399", -"x= c #6888A1", -"y= c #323E48", -"z= c #5B7585", -"A= c #98C5DD", -"B= c #83ACC1", -"C= c #2D373F", -"D= c #4B637C", -"E= c #567694", -"F= c #26313C", -"G= c #15191F", -"H= c #4D647A", -"I= c #252F39", -"J= c #5D6163", -"K= c #DDE9F5", -"L= c #CEDFEE", -"M= c #8898A5", -"N= c #B0CBDC", -"O= c #BFDAEC", -"P= c #BFDBEC", -"Q= c #BBDAEC", -"R= c #BAD7EA", -"S= c #6B808F", -"T= c #7297B0", -"U= c #8CB8D1", -"V= c #95C1D9", -"W= c #91BCD6", -"X= c #86AEC8", -"Y= c #7496B3", -"Z= c #6587A2", -"`= c #384958", -" - c #323F4B", -".- c #546A7C", -"+- c #6C88A1", -"@- c #779AB1", -"#- c #658297", -"$- c #3B4A58", -"%- c #33404B", -"&- c #202830", -"*- c #577287", -"=- c #86B1CC", -"-- c #86ACC0", -";- c #6E8797", -">- c #9CC7DF", -",- c #92BCD5", -"'- c #91BCD5", -")- c #8EB6CE", -"!- c #344453", -"~- c #263039", -"{- c #364452", -"]- c #2B3643", -"^- c #2A2D2E", -"/- c #E1EBF4", -"(- c #D2E4F3", -"_- c #A0B2C3", -":- c #8094A1", -"<- c #BAD8EB", -"[- c #B8D6EA", -"}- c #485A6A", -"|- c #789FB9", -"1- c #90BBD3", -"2- c #94C4DC", -"3- c #88B3CD", -"4- c #7A9EB9", -"5- c #698BA8", -"6- c #4D677C", -"7- c #151A1E", -"8- c #1A2125", -"9- c #171C21", -"0- c #1D2329", -"a- c #1D262E", -"b- c #486073", -"c- c #6A8CAA", -"d- c #7CA2BE", -"e- c #90BDD7", -"f- c #9AC5DE", -"g- c #7493A2", -"h- c #708B99", -"i- c #8CB7D1", -"j- c #7494AB", -"k- c #68889F", -"l- c #6A8FA5", -"m- c #7BA2BC", -"n- c #171D21", -"o- c #1D262F", -"p- c #212B36", -"q- c #09090B", -"r- c #BBC2C9", -"s- c #D4E4F2", -"t- c #C1D9EB", -"u- c #44515A", -"v- c #92B5C9", -"w- c #6B8795", -"x- c #4E687E", -"y- c #7EA6C0", -"z- c #91BED8", -"A- c #93BFD9", -"B- c #8CB5D0", -"C- c #7DA4BE", -"D- c #6F92AE", -"E- c #6687A5", -"F- c #526C85", -"G- c #415669", -"H- c #384655", -"I- c #6589A4", -"J- c #6E92AE", -"K- c #80A8C2", -"L- c #92BCD6", -"M- c #91BFD8", -"N- c #799AAF", -"O- c #6A8796", -"P- c #81AAC3", -"Q- c #577187", -"R- c #1F2930", -"S- c #192027", -"T- c #1B2227", -"U- c #0D1010", -"V- c #0E1012", -"W- c #070709", -"X- c #5C6062", -"Y- c #DCE8F3", -"Z- c #C4DCEF", -"`- c #9BB3C6", -" ; c #3A424F", -".; c #313A44", -"+; c #35424C", -"@; c #374655", -"#; c #6E91AD", -"$; c #87B2CC", -"%; c #799EBA", -"&; c #618298", -"*; c #7095AF", -"=; c #435663", -"-; c #80A7C0", -";; c #95C4DC", -">; c #779CB3", -",; c #526D7E", -"'; c #516A7A", -"); c #526B7B", -"!; c #465764", -"~; c #34414E", -"{; c #5C7E9A", -"]; c #2B3741", -"^; c #4B657F", -"/; c #5C7D9C", -"(; c #557088", -"_; c #0F0F10", -":; c #B9C2CA", -"<; c #CCDFEF", -"[; c #B4CDE1", -"}; c #8DAEC8", -"|; c #6F93AE", -"1; c #678CA6", -"2; c #6E92AF", -"3; c #81A8C1", -"4; c #8FBBD5", -"5; c #8DB9D2", -"6; c #6D8FA2", -"7; c #586F82", -"8; c #394851", -"9; c #86B0C6", -"0; c #85AFC8", -"a; c #6F94AF", -"b; c #698DA8", -"c; c #6889A7", -"d; c #5E7E9F", -"e; c #475D75", -"f; c #2E3C4A", -"g; c #5D7E9D", -"h; c #405465", -"i; c #36393B", -"j; c #D7E5F1", -"k; c #A4C5DC", -"l; c #668496", -"m; c #7595AB", -"n; c #7798AE", -"o; c #97C2DA", -"p; c #789DB3", -"q; c #8BB1C8", -"r; c #93C0D9", -"s; c #8BB5CF", -"t; c #85AFC9", -"u; c #82AAC6", -"v; c #5F7C95", -"w; c #1E252C", -"x; c #54728E", -"y; c #587899", -"z; c #5A7B9B", -"A; c #2D3843", -"B; c #798086", -"C; c #D1E3F1", -"D; c #B7D3E8", -"E; c #7E98AB", -"F; c #181C1F", -"G; c #46525F", -"H; c #80A1B8", -"I; c #99C3DB", -"J; c #85ACC2", -"K; c #21272D", -"L; c #0A0B0D", -"M; c #53718C", -"N; c #577797", -"O; c #1B2229", -"P; c #0D0E0F", -"Q; c #B3BDC4", -"R; c #CADDED", -"S; c #B4D3E7", -"T; c #2B3339", -"U; c #2F3840", -"V; c #7899AC", -"W; c #93C1D9", -"X; c #8FBCD5", -"Y; c #8BB6D1", -"Z; c #8DB8D2", -"`; c #92BFD8", -" > c #678092", -".> c #547089", -"+> c #5C7F9B", -"@> c #1F262E", -"#> c #202223", -"$> c #B1BECB", -"%> c #C3D9EB", -"&> c #7B8D99", -"*> c #708B9A", -"=> c #85ABC1", -"-> c #7FA3BA", -";> c #92BBD3", -">> c #7CA0B4", -",> c #97BDD4", -"'> c #657E8F", -")> c #93BDD4", -"!> c #88ADC7", -"~> c #6F94AE", -"{> c #526A7E", -"]> c #65849B", -"^> c #799DBB", -"/> c #84AFC9", -"(> c #8FB9D2", -"_> c #323C45", -":> c #516C84", -"<> c #658AA4", -"[> c #5B7C9B", -"}> c #2E3A49", -"|> c #2A3038", -"1> c #252D3A", -"2> c #1B1E20", -"3> c #ADBFCF", -"4> c #C0D6E7", -"5> c #B0CDE2", -"6> c #8EB3C9", -"7> c #526975", -"8> c #6B899D", -"9> c #597183", -"0> c #90BAD5", -"a> c #94C2DA", -"b> c #82ABC5", -"c> c #495E6E", -"d> c #82A8C3", -"e> c #81A4BA", -"f> c #7594A5", -"g> c #87ABC3", -"h> c #4D6573", -"i> c #6689A6", -"j> c #526E85", -"k> c #243037", -"l> c #607B96", -"m> c #7699B6", -"n> c #789EB5", -"o> c #303D48", -"p> c #7498B4", -"q> c #7094AF", -"r> c #597792", -"s> c #242F39", -"t> c #1A1D25", -"u> c #374553", -"v> c #4D677D", -"w> c #14191E", -"x> c #040505", -"y> c #171A1D", -"z> c #8A9FAD", -"A> c #BCD9EC", -"B> c #B5D3E7", -"C> c #A2CAE1", -"D> c #9DC7DE", -"E> c #9EC7DD", -"F> c #3B4A57", -"G> c #455867", -"H> c #98C2DB", -"I> c #85B0CC", -"J> c #7496B2", -"K> c #4C606F", -"L> c #6E8EA3", -"M> c #7EA0B6", -"N> c #91BBD3", -"O> c #8DB7D1", -"P> c #90BAD4", -"Q> c #96C1DA", -"R> c #3B4853", -"S> c #688AA5", -"T> c #4C657A", -"U> c #1B2026", -"V> c #2B3C44", -"W> c #5F7A90", -"X> c #587284", -"Y> c #536978", -"Z> c #88B1CC", -"`> c #759AB8", -" , c #617E9A", -"., c #556F85", -"+, c #20272E", -"@, c #323D48", -"#, c #333E4A", -"$, c #060707", -"%, c #4A5159", -"&, c #ACC3D5", -"*, c #ACCFE5", -"=, c #5A6874", -"-, c #AACDE1", -";, c #9CC6DC", -">, c #35414C", -",, c #769AB2", -"', c #80AAC5", -"), c #6F92AB", -"!, c #38464F", -"~, c #7EA4B9", -"{, c #97C3DC", -"], c #7A9FB6", -"^, c #3F505C", -"/, c #6D8DA6", -"(, c #1E282E", -"_, c #080909", -":, c #090A0C", -"<, c #344452", -"[, c #3B4857", -"}, c #7799AE", -"|, c #8DB6D1", -"1, c #66869E", -"2, c #3D4957", -"3, c #536C84", -"4, c #353F4C", -"5, c #111215", -"6, c #65727E", -"7, c #A6BCCD", -"8, c #5D6972", -"9, c #AED0E6", -"0, c #99C5DC", -"a, c #8DB5D0", -"b, c #8DB5CE", -"c, c #90BBD5", -"d, c #84AAC5", -"e, c #8EBBD5", -"f, c #80A7C1", -"g, c #6C8DA2", -"h, c #85AFC6", -"i, c #61839B", -"j, c #374352", -"k, c #576D83", -"l, c #80A6C1", -"m, c #81A4BB", -"n, c #111315", -"o, c #111418", -"p, c #4C6378", -"q, c #33424C", -"r, c #37454D", -"s, c #8DB4CF", -"t, c #7397B3", -"u, c #3A495A", -"v, c #0D0F13", -"w, c #27303A", -"x, c #272E36", -"y, c #0F1012", -"z, c #90A4B2", -"A, c #A8CBE2", -"B, c #91BCD4", -"C, c #80ABC3", -"D, c #567083", -"E, c #67899D", -"F, c #94C2DB", -"G, c #95C1DB", -"H, c #779CB2", -"I, c #60849E", -"J, c #64849F", -"K, c #1A1F22", -"L, c #405061", -"M, c #79A1BD", -"N, c #324051", -"O, c #6183A1", -"P, c #6B8FAD", -"Q, c #6485A2", -"R, c #34444F", -"S, c #060606", -"T, c #2D3339", -"U, c #B2CBDF", -"V, c #94BCD5", -"W, c #7DA2BA", -"X, c #3F5264", -"Y, c #5A7991", -"Z, c #7195B3", -"`, c #7BA5BD", -" ' c #81AAC6", -".' c #88B2CC", -"+' c #8EBBD4", -"@' c #8AB2CC", -"#' c #82ADC7", -"$' c #7092A5", -"%' c #95C2DA", -"&' c #41525F", -"*' c #6387A3", -"=' c #475F72", -"-' c #21282F", -";' c #5B7288", -">' c #0D0F11", -",' c #0B0E11", -"'' c #212C36", -")' c #26323C", -"!' c #161B20", -"~' c #55616D", -"{' c #9BB9D0", -"]' c #799EB6", -"^' c #27313A", -"/' c #1A222B", -"(' c #5D7E99", -"_' c #6587A4", -":' c #6789A6", -"<' c #6B8EAB", -"[' c #628097", -"}' c #6D8B9D", -"|' c #769AAF", -"1' c #6E91A9", -"2' c #6C8EAD", -"3' c #6E91AF", -"4' c #3C4D59", -"5' c #8BB1CB", -"6' c #232D32", -"7' c #13171B", -"8' c #232B32", -"9' c #839AAF", -"0' c #789BB3", -"a' c #283138", -"b' c #0C0E0F", -"c' c #242B33", -"d' c #3D4D5B", -"e' c #435768", -"f' c #4B6176", -"g' c #283137", -"h' c #8DB4CC", -"i' c #41535E", -"j' c #405362", -"k' c #3C4F60", -"l' c #3C4E5B", -"m' c #2B353E", -"n' c #526876", -"o' c #92BAD3", -"p' c #1B1F23", -"q' c #31383F", -"r' c #7F9CB6", -"s' c #21292F", -"t' c #29333F", -"u' c #1F252E", -"v' c #090A0E", -"w' c #4D626E", -"x' c #96BDD3", -"y' c #191D20", -"z' c #13181B", -"A' c #80A4BC", -"B' c #1B2027", -"C' c #5D7182", -"D' c #2C383F", -"E' c #364857", -"F' c #1A2028", -"G' c #333F49", -"H' c #7FA2B5", -"I' c #4A5E6E", -"J' c #232E35", -"K' c #252D35", -"L' c #2F3A41", -"M' c #0A0B0E", -"N' c #14191D", -"O' c #5A717F", -"P' c #212931", -"Q' c #222B34", -"R' c #101216", -"S' c #21272B", -" ", -" ", -" ", -" . ", -" + ", -" @ # $ % ", -" & * = - ; ", -" > , ' ) ! ~ { ] ", -" ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a ", -" b c d e f g h i j k l m n o p q r s t u v w x ", -" y z A B C D E F G H I J K L M N O P Q R S T U U V W X Y ", -" Z ` ...+.@.#.$.%.O &.*.=.-.;.>.,.'.).!.~.~.~.{.].^./.(._.:.<. ", -" b [.}.|.#.1.2.3.4.{.~.~.~.~.5.6.5.~.7.8.{.~.~.~.~.9.0.a.b.].c. ", -" d.e.f.g.h.i.j.k.{.~.~.~.~.l.~.m.% n.~.o.{.{.~.~.~.~.p.V 9.~.q.r. ", -" s.t.u.v.w.x.u y.z.A.B.5.~.~.5.C.D.E.F.~.~.G.~.~.~.G.H.I.J.~.~.J.K.L. M.N. ", -" O.P.Q.R.S.T.U.V.W.X.Y.Z.`.~.~.5. +.+++@+U ~.~.~.~.~.#+$+%+,.~.~.G.&+*+=+-+;+ ", -" >+,+Q.'+)+!+~+{+]+^+/+(+_+:+<+~.[+}+U 9.|+5.~.~.~.~.1+2+3+4+5+~.].6+7+8+9+0+ ", -" a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+5.U ~.U r+s+~.~.~.t+u+v+w+x+y+~.z+A+t+B+C+D+E+ F+G+ ", -" H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+V ~.~.~.~.U ~.~.~.o.9.{.Z+`+9.~.~.~.V @.@+@@@#@ $@%@&@*@ ", -" =@-@;@>@,@'@'.)@!@~@{@]@^@/@l+(@_@:@<@~.~.~.U {.~.~.~.{.~.~.{.[@~.~.~.~.}@|@1@2@3@4@5@6@7@8@ ", -" 9@0@a@b@c@d@-.e@f@g@h@i@j@k@l@V+m@n@o@p@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.q@r@s@t@u@v@w@x@y@ ", -"z@A@B@C@D@E@X F@G@H@R I@J@K@L@M@N@O@P@Q@R@o+S@T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.9.U@V@W@X@<+V Y@Z@`@ # ", -" .#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#S@/#~.~.~.~.~.~.~.~.~.~.~.~.~.U (#_#:#<#p@{.[#}#|#1#2# ", -" 3#4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#k#S@/#~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.l#m#9.{.~.n#o#p#q#r#s# ", -" t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#% J#K#S@T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.L#0.l.~.~.{.M#N#O#P#Q#R# ", -" S#T#U#V#W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$-$a#~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.o.o.;$9.G.~.>$,$'$)$!$~${$]$ ", -" ^$/$($_$:$<$[$}$|$1$2$3$4$5$6$7$8$9$:+<+~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.G.0$a$b$c$d$e$f$g$h$i$j$k$ ", -" [ l$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$M#p@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.;$D$E$F$G$H$I$J$K$L$ ", -" M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$`$ %.%+%@%<+{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.#%$%%%p@&%*%=%-%;%>%,% ", -" '%)%!%~%{%]%^%/%(%_%:%<%[%}%|%1%2%3%-$T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.4%5%U p@6%7%8%9%0%a%y ", -" b%c%d%e%f%g%h%i%G.[#j%k%l%m%n%o%p%@%q%{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.~.~.~.~.~.~.V G.}@r%s%t%u%v%w%M.x%y%z%A% ", -" B%C%D%E%F%G%H%I%V o.<@J%K%L%M%N%O%P%p@~.~.~.~.~.~.~.~.~.U ~.~.U 9.Q%{.~.~.~.~.~.{.%%U {.~.~.{.v@R%S%T%U%V%W% X%$ ", -" Y%Z%`% &.&+&@&#&U ~.{.$&%&&&*&=&-&T@~.~.~.~.~.~.~.~.~.~.~.;&>&,&'&)&!&5+~.~.~.~.{.~&{&]&9.~.p@^&/&(&_&:& <&[&}&|& ", -" 1&2&3&4&5&6&7&8&9&l.~.{.V 0&a&b&c&~.~.~.~.~.~.~.5.d&e&f&g&h&i&j&k&l&m&n&~.~.G.~.~.~.o&p&q&r&s&t&u&v& w&x&y&z&A&B& ", -" C&2&D&E&F&G&G&H&I&J&U ~.~.U K&L&,.~.~.~.~.~.~.~.U M&N&O&P&Q&R&S&T&U&V&W&X&].{.~.~.{./#Y&Z&`& *.*+*@* (.#*$*%*&***=* ", -" -*;*>*,*'*)*!*~*{*]*^*~.5.{.5./*U ~.~.~.~.~.~.{.[#(*_*:*<*[*[*}*|*1*2*3*4*5*U ~.~.6*7*8*9*0*a*b*c*d*e*f*g*h*i*%*j*k*<%l* ", -" m*n*o*p*q*r*s*t*u*v*w*1+~.~.~.~.~.~.~.~.~.~.~.x*y*z*A*B*C*D*E*V U ~.G.~.:.F*G*l.{.R%X+H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X* ", -" Y*Z*D&`* =.=+=@=#=$=%=&={.~.~.~.~.~.~.~.~.~.~.<+*===-=;=>=,='=)=[#p@!=~={=]=^=/=(=a#&%_=:=<=-#[=}=k$|=1=2=3=4=5=6=7=8=9= ", -" 0=a=b=c=d=e=f=g=h=i=j=k=l=5.~.~.~.~.~.~.~.~.~.V -$m=n===o=p=q=r=s=t=:+u=v=w=x=y=z=A=J.V U ~.V [#B=C=D=1=E=F= G=H=I= ", -" J=K=L=M=N=O=P=Q=R=S=T=U=V=5.U ~.~.~.~.~.~.~.~.~.{.x*W=X=Y=Z=`= -.-+-@-#-$-%-&-*-=---;->-9.x*)=,-'-)-c.!-~- {-]- ", -" ^-/-(-_-:-<-<-[-%.}-|-1-T@~.{.~.~.~.~.~.~.~.~.~.~.V 2-^&3-4-5-6-7-8-9-0-a-b-c-d-e-f-g-h-V@i-j-k-l-T=m-7@n- o-p- ", -" q-r-s-t-u-v-!+2*w-x-y-z-V ~.~.~.~.~.~.~.~.~.~.~.~.~.~./#A-B-C-D-E-F-G-H-I-J-K-L-<@M-W=N-O-P-Q-R-<&S-T-U-V- W- ", -" X-Y-Z-`- ;.;+;@;#;$;q+~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~./#v@W=N#%;&;*;=;-;s=-#;;>;,;';);!;~;{;];^;/;(;H+ ", -" _;:;<;[;};|;1;2;3;4;{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.T@-#5;6;7;8;9;[#V <+0;a;b;c;E-d;e;f;|=g;h; ", -" i;j;V#k;F.l;m;n;o;~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.~.{.p@S@s=p;q;~.~.{.r;s;t;u;~$v;w;x;y;z;A; ", -" H+B;C;D;E;F;G;H;~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.U ~.~.V E*E*V ~.~.~.{.T@/#I;J;K;L;M;y;N;O; ", -" P;Q;R;S;T;U;~.{.~.~.~.~.~.~.~.~.l.U {.p@~.~.{.V ~.~.5+V;].~.~.~.~.{.{.p@W;X;Y;Z;`;/# >W..>+>N;@> ", -" #>$>%>&>*>G.~.~.~.~.~.~.~.~.{.`.=>V=->;>~.n##&>>T@,>'>].~.~.~.~.~.)>!>i$~>{>]>^>/>(>_>:><>[>}> |>1> ", -" 2>3>4>5>U@U ~.~.~.~.~.~.~.{.6>7>8>9>0>a#a>b>c>d>e>f>~.~.~.V ~.~.g>h>i>1=j>,%k>l>m>n>o>p>q>r>s>t>u>v>w> ", -" x>y>z>A>B>C>5+D>E>~.~.~.~.{.%&F>G>3;s%{.H>I>J>K>L>M>~.V N>O>P>x*Q>R>S>T>U> X%V>W>X>Y>Z>P-`> ,.,+, ", -" @,#,$,%,&,1.*,=,-,;,{.p@V {.X@>,,,Z;V ~.5.`;',),!,~,~.{,],^,/,/&-$F$(,_, :,<,[,},<@|,1,2, ", -" B&3,4, 5,6,7,8,9,0,`;a,b,B+c,d,s=<+~.~.~.a#e,f,g,h,V -#9$i,j,k,l,m,n, o,p,q,r,s,t,u,v, ", -" w,x, y,z,A,B,C,D,E,o@F,G,<+~.~.~.~.~.;;P>j%}@p@H,]#I,J,K,L,M,=+ N,O,P,Q,R,S, ", -" T,U,V,W,X,Y,Z,`, '.'+'x*~.{.O+@%@'#'$'%'a#&'*'='-' ~;;'>' ,''')'!' ", -" ~'{']'^'/'('_'_':'<'['}'{.V |'1'2'3'4'5'}@6'7' 8'K; ", -" v&9'0'a' b'c'd'e'f'1@g'h'G.i'j'k'l'm'n'o'p' y ", -" q'r's' t'u'H+ v'w'x'y' z'A'B' ", -" C'D' E'F' G'H' I'J' ", -" K'L' M' N'O' P'Q' ", -" R' S' ", -" ", -" ", -" ", -" "}; diff --git a/minilibx/test/open24.xpm b/minilibx/test/open24.xpm deleted file mode 100644 index f363254..0000000 --- a/minilibx/test/open24.xpm +++ /dev/null @@ -1,230 +0,0 @@ -/* XPM */ -static char *open[] = { -/* width height num_colors chars_per_pixel */ -" 45 55 168 2", -/* colors */ -".. s None c None", -".# c #450304", -".a c #ce7e7c", -".b c #b94344", -".c c #b65254", -".d c #780204", -".e c #b04c4c", -".f c #b00204", -".g c #8a8a64", -".h c #969a24", -".i c #b6b60c", -".j c #cac614", -".k c #cece34", -".l c #cace54", -".m c #caca94", -".n c #c24e4c", -".o c #aa0204", -".p c #9e4244", -".q c #bc0204", -".r c #a40204", -".s c #9e262c", -".t c #8c3a3c", -".u c #5c1414", -".v c #5b0204", -".w c #700204", -".x c #722214", -".y c #b52624", -".z c #8e3234", -".A c #b60204", -".B c #c20204", -".C c #860204", -".D c #560304", -".E c #800204", -".F c #9e0204", -".G c #920204", -".H c #620204", -".I c #a41314", -".J c #996a6c", -".K c #920d09", -".L c #c80204", -".M c #690204", -".N c #980204", -".O c #984c4c", -".P c #e2dedc", -".Q c #ae5e5c", -".R c #bc6a6c", -".S c #a21a1c", -".T c #8a0a04", -".U c #671e1c", -".V c #941b1c", -".W c #b8b4b4", -".X c #e8e6e4", -".Y c #ccb4b4", -".Z c #c07c7c", -".0 c #f3f2eb", -".1 c #b49696", -".2 c #521614", -".3 c #9e5a5c", -".4 c #d4d4d4", -".5 c #a7a5a1", -".6 c #dec4c4", -".7 c #e4d6d4", -".8 c #f4f2f4", -".9 c #cccac4", -"#. c #9a161c", -"## c #8c0204", -"#a c #862c2c", -"#b c #7e5e5c", -"#c c #a39694", -"#d c #6b6667", -"#e c #322624", -"#f c #b09e9c", -"#g c #b23234", -"#h c #500304", -"#i c #222224", -"#j c #2e322c", -"#k c #925c5c", -"#l c #721a1c", -"#m c #6e6e6c", -"#n c #0a0a0c", -"#o c #b2b2b4", -"#p c #8e6264", -"#q c #884444", -"#r c #8c5c5c", -"#s c #121214", -"#t c #b2aeac", -"#u c #c21e1c", -"#v c #6e0e0c", -"#w c #623e3c", -"#x c #b64e4c", -"#y c #bc3634", -"#z c #624e1c", -"#A c #6e727c", -"#B c #824e4c", -"#C c #8b8d87", -"#D c #a09674", -"#E c #766844", -"#F c #7a663c", -"#G c #828c90", -"#H c #beb6a4", -"#I c #3a0204", -"#J c #8e9298", -"#K c #562529", -"#L c #7c3838", -"#M c #bab294", -"#N c #7e4644", -"#O c #929a9c", -"#P c #762a2c", -"#Q c #a60e0c", -"#R c #ae1e1c", -"#S c #460a0c", -"#T c #a6aaa4", -"#U c #6a4a4c", -"#V c #784c50", -"#W c #761214", -"#X c #9e1e1c", -"#Y c #988c90", -"#Z c #821e1c", -"#0 c #7a1618", -"#1 c #7a6e74", -"#2 c #7e7a77", -"#3 c #808688", -"#4 c #828284", -"#5 c #828279", -"#6 c #827a64", -"#7 c #7e765c", -"#8 c #864a34", -"#9 c #825a44", -"a. c #766e54", -"a# c #7e7e74", -"aa c #806464", -"ab c #7e724c", -"ac c #766634", -"ad c #765a2c", -"ae c #8e7e54", -"af c #a69e8c", -"ag c #c7c2ac", -"ah c #9a2a1c", -"ai c #aa3a3c", -"aj c #979894", -"ak c #70684c", -"al c #62522c", -"am c #6e5e3c", -"an c #92866c", -"ao c #968e6c", -"ap c #826e54", -"aq c #84765c", -"ar c #86522c", -"as c #7e4624", -"at c #7e3614", -"au c #6e5254", -"av c #712e2c", -"aw c #7a5654", -"ax c #82727c", -"ay c #a63634", -"az c #8a6a6c", -"aA c #863534", -"aB c #5c1a18", -"aC c #6a2c2c", -"aD c #5e0e14", -"aE c #868684", -"aF c #922624", -"aG c #901614", -"aH c #c21614", -"aI c #520e0c", -"aJ c #805654", -"aK c #b00c0c", -"aL c #c2221c", -/* pixels */ -"..........................................................................................", -"..........................................................................................", -".....................................#.a.#................................................", -"...................................#.b.c.#.#.#.#...........#.d............................", -".................................#.e.f.f.#.g.h.i.j.k.l.m...f.n............................", -".................................d.f.o.f.#.#.#.d.d.#.#.#...f.f.d..........................", -".................................p.q.q.r.s.t.u.v.w.x.d.d.#.d.r.y.d........................", -".................................z.A.B.q.C.D.E.F.G.E.H.E.I.F.q.A.d........................", -".................................J.G.f.G.w.K.f.L.B.B.r.M.f.B.L.A.d........................", -".................................d.w.N.M.O.P.Q.B.B.o.R.S.E.q.q.T.d........................", -".................................d.U.M.V.W.X.Y.q.B.Z.0.1.E.r.N.d..........................", -".................................d.2.r.3.4.5.6.A.f.7.8.9#.###a.#..........................", -"................................#b.d.L#c#d#e#f.N.V.5#d.4#g.E.d............................", -"...............................d#h.r.L#f#i#j#k.M#l#m#n#o.b.r.d............................", -"...............................d#h##.q#g#p#q##.q.N#r#s#t#u.q#v.#..........................", -"..............#j................#w.w.C.r.q##.r.B.f.T#x#y.L.r.M.d..........................", -"............#j#z#j#A#A#j.........d.D.r.M.C.f.r.r.r.q.B.C.N.E#B............................", -"..........#j#C#D#E#z#F#G#j.......d.d.#.G##.w.M.M.C.C.d.G.r.u.d............................", -"....................#E#H#C#j.........d#I.w.F.f.o.o.o.N.M.#.d..............................", -"......................#E#j#J#j......#K.M.#.#.v.w.M.v.##h.H#L.d............................", -"..........................#M#j.......v.F.q.r.d.w.w.C.E.M.v.M#N.d..........................", -"..........................#E#O#j#j#K##.f.L.L.L.B.q.f##.M.v.w.w#P.d.#...d.d................", -"............................#C#E.#.v.o.B.L.L.q.q.q.q.N.M.D#h.M.N.r#Q#R#S.H.J.#............", -"............................#j#T#U.C.q.q.o.G.F.f.q.A.N.d.v.v##.o.q.L.r.C.A###k............", -"..............................#C#V.N.A.N.f.q.F.C.E.f.F.E.H#n#W.K.I#X#a.z.V.q.d#p.d........", -"................................#Y.r.K#Z.K.q.A.G.w#0#b#1#2#3#4#5#5#6#6#7#8.q.G#9..........", -"..................#j#oa..5#j..#J#Ja##4#4aa.o.A##.E.xabacadae#Daf#M#Magah.r.qai.#..........", -"................aja#akalamanaoapaqaaarasat.r.o.E.w.T.T.E.H.#...........#.d.d.#............", -"...........E....#j#j#C#M#j#n#naa#V.O.f.N.F.q.G.d.w.r.C.d.H.#...............#..............", -"...........#.F.F.J#n#n#n#n#n#nauav#p.q.N.d.d.w.M.F.F.E.d.U................................", -".........E.F.E.E.d.z#n.d#n#n#naw.Uax.r##.d.w.D.M.r.N.E.w.d................................", -".........E.F.......d.Fay.E.F#naz.2#A.D#h.r.f.w##.r##.d.H.M................................", -".........F.#...........E.E.F.baAaB#A.#.E.f.r.w.N.N.E.waC.#................................", -".........F.#...............d.F.E#K#d.H.G.F.G.w.N##.d.D.#..................................", -".........F.#....................#Aau.v.E##.w.E.E.w.H.d.......d..av.d......................", -".........E.#..................#j#GaC.M.H.M.d.d.w.H.#.d.d.#aC.w.C##.E.d....................", -"...........F.................5#O...#aD.w.d.w.H.D.M######.G.F.o.f.o.N.3....................", -"...........F.E...........5aEakak.....#.##h#h.v.N.o.f.q.L.L.L.L.L.q.faF....................", -"...........E.E......#E#C.5aq#j.....#.v.N.F.d.N.r.F.r.F#Q.I.o.q.L.L.L.y....................", -".............E.....................#.E.B.qaG.d.d.d.....#.#.....d#x.b......................", -".............E.F...................E.w.L.LaG.#............................................", -"...............E.E.................EaA.q.qaG.#............................................", -"...............E.F.E.................E.r.r#Z.#............................................", -".................E.F.E...............E.G.NaA..............................................", -".................E#uaH.................w.dav..............................................", -"...................E.E.............EaI.M.w.v.#............................................", -"...................................E.D.d.E.waJ............................................", -".....................................C.N.N##.M............................................", -"..................................#W.f.q.A.f.G#q..........................................", -".....................................q.L.L.L.q.V.#........................................", -"...................................#.daK.q.qaL.d..........................................", -".......................................#.#.#..............................................", -"..........................................................................................", -"..........................................................................................", -".........................................................................................." -}; diff --git a/minilibx/test/open30.xpm b/minilibx/test/open30.xpm deleted file mode 100644 index 87be371..0000000 --- a/minilibx/test/open30.xpm +++ /dev/null @@ -1,1439 +0,0 @@ -/* XPM */ -static char * open30_2_xpm[] = { -"64 64 1372 2", -" c None", -". c #08090D", -"+ c #1A1E23", -"@ c #1F2124", -"# c #060809", -"$ c #1A1E21", -"% c #4F606C", -"& c #3D4145", -"* c #868D93", -"= c #454E56", -"- c #627481", -"; c #667C8A", -"> c #2D3031", -", c #D7E1E7", -"' c #4D5157", -") c #8997A5", -"! c #282E31", -"~ c #333B41", -"{ c #A5C6DB", -"] c #718C9B", -"^ c #000000", -"/ c #181B1F", -"( c #262828", -"_ c #D2DEE7", -": c #B8C5D0", -"< c #151719", -"[ c #08090B", -"} c #272B30", -"| c #2D3037", -"1 c #26282C", -"2 c #1A1D1F", -"3 c #B1CADB", -"4 c #56646E", -"5 c #080809", -"6 c #080A0C", -"7 c #1E2126", -"8 c #98B7C9", -"9 c #A2CAE2", -"0 c #7FA1B5", -"a c #06080A", -"b c #252729", -"c c #A7ADB2", -"d c #272B2E", -"e c #1E2023", -"f c #C8D8E5", -"g c #C9DDED", -"h c #8996A3", -"i c #6B7782", -"j c #C7DFF0", -"k c #CCE0F0", -"l c #AFC1CF", -"m c #47535B", -"n c #B0D3E8", -"o c #7E99A9", -"p c #738493", -"q c #97B4C7", -"r c #53606A", -"s c #6E8996", -"t c #A1CBE3", -"u c #9CC6DE", -"v c #90B5CB", -"w c #171D22", -"x c #1E2629", -"y c #020202", -"z c #ABB3BA", -"A c #BBC4C8", -"B c #222323", -"C c #141617", -"D c #5D6164", -"E c #ACB5BC", -"F c #676D74", -"G c #BDD4E5", -"H c #B3D1E7", -"I c #B0D1E7", -"J c #728A99", -"K c #94AEBF", -"L c #B1D1E7", -"M c #505C64", -"N c #7B98A9", -"O c #A1CBE0", -"P c #99C3D9", -"Q c #475863", -"R c #A0C9DE", -"S c #9CC6DA", -"T c #9ECAE1", -"U c #9CC5DD", -"V c #9AC4DC", -"W c #263137", -"X c #3C4A55", -"Y c #658190", -"Z c #66686B", -"` c #7D8085", -" . c #363839", -".. c #797E81", -"+. c #D2DBE1", -"@. c #DDE9F4", -"#. c #CADEEF", -"$. c #778593", -"%. c #AED0E5", -"&. c #9EC9DE", -"*. c #9EC8DF", -"=. c #9BC1D8", -"-. c #9EC8DE", -";. c #6B8596", -">. c #9BC5DC", -",. c #9BC6DF", -"'. c #9CC5DC", -"). c #688595", -"!. c #6B8698", -"~. c #9CC4DC", -"{. c #9BC4DC", -"]. c #9DC5DD", -"^. c #647D8C", -"/. c #485864", -"(. c #161A1D", -"_. c #36444C", -":. c #95BDD5", -"<. c #566E7E", -"[. c #A4AAAD", -"}. c #E9F2F7", -"|. c #DEEAF6", -"1. c #B5D4E9", -"2. c #A9CFE3", -"3. c #90B3C9", -"4. c #9FCAE1", -"5. c #9BC4DD", -"6. c #7490A2", -"7. c #99C2DB", -"8. c #81A5BA", -"9. c #9CC5DE", -"0. c #98C1DA", -"a. c #5F7889", -"b. c #96BFD8", -"c. c #44545F", -"d. c #565A5E", -"e. c #DFE6EC", -"f. c #E6EEF7", -"g. c #D6E4F2", -"h. c #BFD6E9", -"i. c #A9CCE3", -"j. c #9FC8DD", -"k. c #9DC6DD", -"l. c #9CC4DD", -"m. c #7D9FB0", -"n. c #98C0D6", -"o. c #9AC5DD", -"p. c #97BFD8", -"q. c #9BC5DF", -"r. c #2D3840", -"s. c #626567", -"t. c #E7ECF5", -"u. c #E1EAF5", -"v. c #CEE3F3", -"w. c #B7D6EA", -"x. c #A4CBE0", -"y. c #8AAFC5", -"z. c #647F90", -"A. c #648092", -"B. c #89B0C7", -"C. c #9CC6DF", -"D. c #5D7486", -"E. c #7B9BAF", -"F. c #84A8BF", -"G. c #9BC5DD", -"H. c #96BED5", -"I. c #4B5D69", -"J. c #9BC5DE", -"K. c #536B77", -"L. c #2E3B41", -"M. c #1B2124", -"N. c #3F4F58", -"O. c #4D5152", -"P. c #E7EEF3", -"Q. c #E2EAF5", -"R. c #CEE2F2", -"S. c #BAD5E9", -"T. c #9DC2D7", -"U. c #5C7281", -"V. c #232A31", -"W. c #08090A", -"X. c #121418", -"Y. c #131619", -"Z. c #131719", -"`. c #87ACC3", -" + c #7B9BAE", -".+ c #87ADC3", -"++ c #8FB5CB", -"@+ c #678295", -"#+ c #96C0D8", -"$+ c #607787", -"%+ c #6B8595", -"&+ c #96C1DB", -"*+ c #6A8595", -"=+ c #35424A", -"-+ c #7090A1", -";+ c #15191C", -">+ c #2D3033", -",+ c #DDE5EB", -"'+ c #D2E3F1", -")+ c #BAD7EB", -"!+ c #A9CFE5", -"~+ c #272F35", -"{+ c #1C2227", -"]+ c #4F697B", -"^+ c #6B8FA9", -"/+ c #759CB6", -"(+ c #7BA0BB", -"_+ c #80A5BC", -":+ c #88B0C8", -"<+ c #96C3DB", -"[+ c #8FB6CD", -"}+ c #80A1B3", -"|+ c #556876", -"1+ c #96BFD7", -"2+ c #566B77", -"3+ c #93B8CD", -"4+ c #637A8D", -"5+ c #9DC6DE", -"6+ c #8FB4CA", -"7+ c #55697A", -"8+ c #6F8F9F", -"9+ c #91BDD5", -"0+ c #283239", -"a+ c #050406", -"b+ c #767B80", -"c+ c #BDC6CE", -"d+ c #D4E5F3", -"e+ c #C1D7EA", -"f+ c #A7CDE4", -"g+ c #9FC9DE", -"h+ c #668596", -"i+ c #6D90AA", -"j+ c #5C7994", -"k+ c #60849F", -"l+ c #6286A1", -"m+ c #688CA8", -"n+ c #7298B2", -"o+ c #82A8C2", -"p+ c #8FBAD5", -"q+ c #96C2DB", -"r+ c #89ADC4", -"s+ c #96BED6", -"t+ c #99C2DA", -"u+ c #6C899A", -"v+ c #92BBD2", -"w+ c #9AC4DD", -"x+ c #5B717D", -"y+ c #9EC6DE", -"z+ c #8BB1C9", -"A+ c #718EA0", -"B+ c #94C3DB", -"C+ c #536B78", -"D+ c #3E505F", -"E+ c #4E6373", -"F+ c #2C333C", -"G+ c #070708", -"H+ c #040404", -"I+ c #1A1C1E", -"J+ c #202326", -"K+ c #050606", -"L+ c #23292E", -"M+ c #A1C0D4", -"N+ c #9FC9DD", -"O+ c #97C2DB", -"P+ c #80A8C1", -"Q+ c #668AA6", -"R+ c #4B5D72", -"S+ c #4C647A", -"T+ c #5F80A0", -"U+ c #60859E", -"V+ c #678AA6", -"W+ c #739BB5", -"X+ c #85AEC7", -"Y+ c #92BDD7", -"Z+ c #96BFD5", -"`+ c #627B8A", -" @ c #89B1C9", -".@ c #2B353C", -"+@ c #7597B2", -"@@ c #779CB8", -"#@ c #52697C", -"$@ c #1D2328", -"%@ c #445663", -"&@ c #5E7A8D", -"*@ c #252F37", -"=@ c #090909", -"-@ c #859BB2", -";@ c #859DB8", -">@ c #6E8396", -",@ c #252C33", -"'@ c #9CC4D7", -")@ c #92C0D9", -"!@ c #79A0BA", -"~@ c #6487A3", -"{@ c #566979", -"]@ c #8CB0C2", -"^@ c #51697C", -"/@ c #60849D", -"(@ c #6D8EAC", -"_@ c #7BA0BC", -":@ c #8AB4CE", -"<@ c #95C2DB", -"[@ c #9AC5DC", -"}@ c #95C1DA", -"|@ c #607B8C", -"1@ c #597488", -"2@ c #7EA6BF", -"3@ c #597587", -"4@ c #455664", -"5@ c #668598", -"6@ c #82A9C4", -"7@ c #617F92", -"8@ c #1A2328", -"9@ c #2B3137", -"0@ c #728FAC", -"a@ c #51657B", -"b@ c #6B8AA8", -"c@ c #8EAEC7", -"d@ c #A8C8E2", -"e@ c #92BDD6", -"f@ c #769DBA", -"g@ c #526E87", -"h@ c #7490A0", -"i@ c #A6CDE4", -"j@ c #97BFD4", -"k@ c #55697D", -"l@ c #6286A0", -"m@ c #7399B3", -"n@ c #84ACC5", -"o@ c #92BFD9", -"p@ c #99C4DC", -"q@ c #94C0DA", -"r@ c #4F6575", -"s@ c #7DA5BF", -"t@ c #7FA2BC", -"u@ c #8FB6CE", -"v@ c #95C3DB", -"w@ c #8EB8D2", -"x@ c #6A879D", -"y@ c #111318", -"z@ c #252A30", -"A@ c #81868C", -"B@ c #A5ABAD", -"C@ c #70767C", -"D@ c #38434F", -"E@ c #637F9B", -"F@ c #516980", -"G@ c #799AB5", -"H@ c #A5C3D9", -"I@ c #93BDD6", -"J@ c #779EBA", -"K@ c #445A6B", -"L@ c #93B5C9", -"M@ c #B6D3E8", -"N@ c #AECFE4", -"O@ c #95BDD2", -"P@ c #52687A", -"Q@ c #6486A3", -"R@ c #7092B0", -"S@ c #90BCD6", -"T@ c #97C4DC", -"U@ c #A0C9E0", -"V@ c #99C5DD", -"W@ c #86AEC6", -"X@ c #8FBAD4", -"Y@ c #91BDD6", -"Z@ c #7094AC", -"`@ c #2A353E", -" # c #0B0E10", -".# c #888D90", -"+# c #787D82", -"@# c #465360", -"## c #56697F", -"$# c #A6CADD", -"%# c #5A7382", -"&# c #6C8CAA", -"*# c #A5BED3", -"=# c #A7CAE0", -"-# c #94C1DA", -";# c #7EA4BF", -"># c #415160", -",# c #9DC3D5", -"'# c #B3CFE1", -")# c #AAC3D4", -"!# c #A8CDE4", -"~# c #89ACBE", -"{# c #567088", -"]# c #6C91AC", -"^# c #81A7C2", -"/# c #96C4DC", -"(# c #85A9BD", -"_# c #708C9B", -":# c #5A6E7B", -"<# c #6C8695", -"[# c #97C3DB", -"}# c #8BB5CE", -"|# c #425461", -"1# c #63819E", -"2# c #415465", -"3# c #0B0D0E", -"4# c #607387", -"5# c #687D8C", -"6# c #B8D6E9", -"7# c #7893A2", -"8# c #576F85", -"9# c #A7BACF", -"0# c #B0CEE5", -"a# c #98C4DC", -"b# c #88B1CA", -"c# c #36444E", -"d# c #8FA0AD", -"e# c #73818D", -"f# c #596D81", -"g# c #B4D0E4", -"h# c #A3CDE2", -"i# c #658296", -"j# c #6A8DAB", -"k# c #7BA5C0", -"l# c #94BAD2", -"m# c #6D899B", -"n# c #99C3DC", -"o# c #8EB9D2", -"p# c #7AA0BA", -"q# c #6C8FAB", -"r# c #6484A1", -"s# c #1F252C", -"t# c #121619", -"u# c #7E96B0", -"v# c #7A8A96", -"w# c #BCD7EA", -"x# c #A0C5D9", -"y# c #3C4B57", -"z# c #A9BACD", -"A# c #BCD5E8", -"B# c #84A6BA", -"C# c #8EA1AE", -"D# c #CFD1D4", -"E# c #ECF6FA", -"F# c #ABB7C2", -"G# c #556F84", -"H# c #57626A", -"I# c #5C7078", -"J# c #6C8AA7", -"K# c #80A6C0", -"L# c #91B8D0", -"M# c #94BFD8", -"N# c #87B0CA", -"O# c #7CA2BB", -"P# c #7097AF", -"Q# c #495E6F", -"R# c #0C0E11", -"S# c #3A3F43", -"T# c #8AA3BB", -"U# c #778592", -"V# c #C0D8EB", -"W# c #B3D5E9", -"X# c #404A53", -"Y# c #B2C2D3", -"Z# c #96A1AC", -"`# c #9DB2C3", -" $ c #AEBECE", -".$ c #EDEFF3", -"+$ c #F7FAFC", -"@$ c #B6BFC7", -"#$ c #556E85", -"$$ c #121314", -"%$ c #2B2E2F", -"&$ c #555A5E", -"*$ c #3B4C5B", -"=$ c #6F8EA4", -"-$ c #92BED8", -";$ c #9DC7DF", -">$ c #87ACC1", -",$ c #546A78", -"'$ c #516874", -")$ c #4E6570", -"!$ c #4D6271", -"~$ c #4C6271", -"{$ c #4E677A", -"]$ c #38454E", -"^$ c #6C7278", -"/$ c #86A1B6", -"($ c #5C656C", -"_$ c #A4B0BA", -":$ c #555D64", -"<$ c #657178", -"[$ c #A6B0B5", -"}$ c #939CA1", -"|$ c #D4E4F1", -"1$ c #A0BACE", -"2$ c #B9C7D7", -"3$ c #F6F7F9", -"4$ c #C6CED1", -"5$ c #506A7C", -"6$ c #060607", -"7$ c #676A6B", -"8$ c #91999F", -"9$ c #7CA3BE", -"0$ c #96BCD4", -"a$ c #5B717E", -"b$ c #4B5F6C", -"c$ c #455864", -"d$ c #5B717F", -"e$ c #81A5B9", -"f$ c #98C4DD", -"g$ c #93BFD8", -"h$ c #87B1CA", -"i$ c #7BA1BC", -"j$ c #5A7489", -"k$ c #222A33", -"l$ c #838A92", -"m$ c #9DADBC", -"n$ c #ECF0F5", -"o$ c #F1F9FB", -"p$ c #818A8D", -"q$ c #4A5155", -"r$ c #6A6F72", -"s$ c #7E898F", -"t$ c #E6F1F7", -"u$ c #CADCED", -"v$ c #A0B7CC", -"w$ c #C6D1DF", -"x$ c #AFB3B4", -"y$ c #5F707D", -"z$ c #CBCFD1", -"A$ c #F4F5F6", -"B$ c #66737F", -"C$ c #87B2CB", -"D$ c #90B7CD", -"E$ c #596E7B", -"F$ c #586F7E", -"G$ c #8BB0C8", -"H$ c #91BED6", -"I$ c #83ADC7", -"J$ c #6D8EA7", -"K$ c #3F5161", -"L$ c #2D3A45", -"M$ c #1F2020", -"N$ c #BDC5CC", -"O$ c #E0EDF5", -"P$ c #BBCAD8", -"Q$ c #E1E4E7", -"R$ c #5E6368", -"S$ c #5B5F62", -"T$ c #D9E7F3", -"U$ c #A4C3D6", -"V$ c #89A3B3", -"W$ c #7B91A1", -"X$ c #627990", -"Y$ c #42505A", -"Z$ c #CACCCE", -"`$ c #F9F9F9", -" % c #FDFDFD", -".% c #BCBEC0", -"+% c #5C7689", -"@% c #8DB9D3", -"#% c #8FB5CC", -"$% c #536471", -"%% c #98C1D9", -"&% c #91BED7", -"*% c #81AAC5", -"=% c #597386", -"-% c #41535F", -";% c #6486A2", -">% c #4D667D", -",% c #070809", -"'% c #44484E", -")% c #BEC8D0", -"!% c #8096A6", -"~% c #516473", -"{% c #A9ACAF", -"]% c #8B8F91", -"^% c #A8B3BD", -"/% c #C5DAEB", -"(% c #9FC8E1", -"_% c #8FBCD6", -":% c #81A8C2", -"<% c #6C90AC", -"[% c #56728C", -"}% c #585B5F", -"|% c #CBCDCD", -"1% c #C1C3C6", -"2% c #4F565F", -"3% c #82ABC3", -"4% c #93BCD3", -"5% c #95BED7", -"6% c #8EB9D3", -"7% c #5B788B", -"8% c #627E91", -"9% c #7FA7C1", -"0% c #6C91AB", -"a% c #546F87", -"b% c #6F7376", -"c% c #D5E2EF", -"d% c #A9C4D8", -"e% c #81A1BA", -"f% c #333940", -"g% c #5F6B76", -"h% c #C0D5E8", -"i% c #AACCE2", -"j% c #8EB8D3", -"k% c #7FA5BF", -"l% c #7095B0", -"m% c #4E697E", -"n% c #07090A", -"o% c #0D0F10", -"p% c #7193A6", -"q% c #96C3DC", -"r% c #8EBCD7", -"s% c #91BDD7", -"t% c #8FBBD6", -"u% c #7699AD", -"v% c #4D626F", -"w% c #252D33", -"x% c #101215", -"y% c #0C0D0E", -"z% c #0A0C0E", -"A% c #06090A", -"B% c #7F8488", -"C% c #D7E3F1", -"D% c #B6D0E4", -"E% c #A3C2D7", -"F% c #596872", -"G% c #A9BED0", -"H% c #B4D0E5", -"I% c #9EC8DC", -"J% c #8FB9D4", -"K% c #85ADC7", -"L% c #7FA4BE", -"M% c #4B606F", -"N% c #4E6372", -"O% c #89B6D0", -"P% c #92C1DA", -"Q% c #9DC7DD", -"R% c #95C0DA", -"S% c #94BED8", -"T% c #8BB8D1", -"U% c #7AA0B9", -"V% c #4E667A", -"W% c #344151", -"X% c #0C0D0F", -"Y% c #8A8F92", -"Z% c #D4E6F5", -"`% c #BCD5E9", -" & c #8599A5", -".& c #939DA6", -"+& c #C4DAEB", -"@& c #89A6B9", -"#& c #7D9FB5", -"$& c #98C3DC", -"%& c #95C0D9", -"&& c #7CA2B9", -"*& c #7697AE", -"=& c #698498", -"-& c #7394A8", -";& c #9EC7DF", -">& c #8DB1C4", -",& c #6B8594", -"'& c #50636C", -")& c #50626C", -"!& c #7F9FB1", -"~& c #93B8D0", -"{& c #627A88", -"]& c #90B6CC", -"^& c #93BDD7", -"/& c #87AFC9", -"(& c #7291A7", -"_& c #384651", -":& c #121618", -"<& c #12171B", -"[& c #4F6986", -"}& c #597998", -"|& c #324052", -"1& c #969CA1", -"2& c #D6E6F5", -"3& c #C6DCEE", -"4& c #505A64", -"5& c #82929F", -"6& c #99ABBB", -"7& c #A1B9CA", -"8& c #87A0B0", -"9& c #718EA1", -"0& c #8DB2C9", -"a& c #8BAEC4", -"b& c #586D7D", -"c& c #97C0D9", -"d& c #8DB3C9", -"e& c #95B8CD", -"f& c #9DC0D6", -"g& c #6F8B9C", -"h& c #354249", -"i& c #464E54", -"j& c #8A98A5", -"k& c #AABAC7", -"l& c #86939E", -"m& c #41494F", -"n& c #4A5861", -"o& c #97C1DA", -"p& c #5E7888", -"q& c #5C7482", -"r& c #88ACC2", -"s& c #91BFD7", -"t& c #799CB5", -"u& c #47596A", -"v& c #0D0F12", -"w& c #1A2127", -"x& c #56778D", -"y& c #688BA9", -"z& c #5D7F9E", -"A& c #547391", -"B& c #0E1013", -"C& c #9DA6AB", -"D& c #C8DCED", -"E& c #7A8996", -"F& c #B5CEE0", -"G& c #BCDBEC", -"H& c #B9D5EA", -"I& c #8BA2B2", -"J& c #6C8A9D", -"K& c #97BFD7", -"L& c #3E4E59", -"M& c #92B5CB", -"N& c #535F68", -"O& c #454F56", -"P& c #6F7C87", -"Q& c #ABC0D1", -"R& c #C7DCEE", -"S& c #C5DBED", -"T& c #C2D7EA", -"U& c #BFD8EA", -"V& c #BCD7EB", -"W& c #62717B", -"X& c #5B6F7B", -"Y& c #95C3DC", -"Z& c #8BB2C9", -"`& c #485761", -" * c #42525F", -".* c #6686A1", -"+* c #587896", -"@* c #1B2129", -"#* c #5C7A94", -"$* c #7DA2BD", -"%* c #84AEC7", -"&* c #749BB5", -"** c #5C7E9C", -"=* c #27343F", -"-* c #A4A9B2", -";* c #D9E7F4", -">* c #C8DBEC", -",* c #B1C8DA", -"'* c #5D6C76", -")* c #A8C5D8", -"!* c #A6BDD0", -"~* c #B9D6EA", -"{* c #B9D4E9", -"]* c #8198A8", -"^* c #8AADC3", -"/* c #8CB1CA", -"(* c #96C2D8", -"_* c #A3C7DF", -":* c #ADCDE3", -"<* c #ABD0E4", -"[* c #ADCFE3", -"}* c #AACEE4", -"|* c #A4CDE3", -"1* c #A1CBE1", -"2* c #A3CCE3", -"3* c #A2C9DF", -"4* c #41515A", -"5* c #81A2B5", -"6* c #94C0D7", -"7* c #5E7789", -"8* c #526777", -"9* c #516777", -"0* c #6B8CA5", -"a* c #759CBA", -"b* c #658AA5", -"c* c #587798", -"d* c #1B242B", -"e* c #0E1110", -"f* c #101214", -"g* c #202931", -"h* c #59758E", -"i* c #799FBB", -"j* c #84B1CA", -"k* c #86ACC6", -"l* c #354758", -"m* c #A0A6AE", -"n* c #DAE6F2", -"o* c #C4DCEE", -"p* c #B4D2E8", -"q* c #3E4A53", -"r* c #698091", -"s* c #5D7581", -"t* c #A3CAE0", -"u* c #A6CFE5", -"v* c #A5CCE5", -"w* c #718A9C", -"x* c #98C3DB", -"y* c #83ABC7", -"z* c #2E3B46", -"A* c #33414A", -"B* c #678398", -"C* c #8AB3CE", -"D* c #93BED7", -"E* c #97C4DB", -"F* c #42525E", -"G* c #88ACC0", -"H* c #789EB9", -"I* c #7A9FBB", -"J* c #7EA2BD", -"K* c #779DB5", -"L* c #577081", -"M* c #5B7B9B", -"N* c #1D2229", -"O* c #547390", -"P* c #54728D", -"Q* c #6082A0", -"R* c #688EA9", -"S* c #6689A7", -"T* c #6086A0", -"U* c #6285A1", -"V* c #6B8DAA", -"W* c #718FAB", -"X* c #3E5568", -"Y* c #969DA1", -"Z* c #DBE8F4", -"`* c #95ACBD", -" = c #758B9A", -".= c #A4C9DE", -"+= c #698190", -"@= c #667E8A", -"#= c #7D99AA", -"$= c #7B9BAD", -"%= c #6F8C9A", -"&= c #536976", -"*= c #84ADC6", -"== c #6D92AD", -"-= c #62829E", -";= c #43576A", -">= c #2F3B46", -",= c #5C788A", -"'= c #86AFC8", -")= c #93BED8", -"!= c #93BAD5", -"~= c #93BAD2", -"{= c #92BCD4", -"]= c #7EA2B6", -"^= c #3D4D56", -"/= c #485B67", -"(= c #7596A9", -"_= c #8CBBD4", -":= c #90BCD5", -"<= c #91BFD9", -"[= c #789BAD", -"}= c #465B6A", -"|= c #59789A", -"1= c #5D7F9D", -"2= c #5E839C", -"3= c #59799A", -"4= c #415569", -"5= c #2D3A46", -"6= c #2E3B49", -"7= c #4A647C", -"8= c #587690", -"9= c #39485A", -"0= c #7F8589", -"a= c #D9E8F5", -"b= c #CCDEEE", -"c= c #8597A5", -"d= c #B3D2E3", -"e= c #9BB3C4", -"f= c #B2CEE1", -"g= c #B2D1E7", -"h= c #ABCFE6", -"i= c #94B7CB", -"j= c #495C6A", -"k= c #688498", -"l= c #617B8A", -"m= c #85ADC8", -"n= c #78A0B9", -"o= c #62819B", -"p= c #2E3843", -"q= c #485A6C", -"r= c #67889C", -"s= c #8AB5CF", -"t= c #8EB9D1", -"u= c #6C899B", -"v= c #6E91A7", -"w= c #678399", -"x= c #6888A1", -"y= c #323E48", -"z= c #5B7585", -"A= c #98C5DD", -"B= c #83ACC1", -"C= c #2D373F", -"D= c #4B637C", -"E= c #567694", -"F= c #26313C", -"G= c #15191F", -"H= c #4D647A", -"I= c #252F39", -"J= c #5D6163", -"K= c #DDE9F5", -"L= c #CEDFEE", -"M= c #8898A5", -"N= c #B0CBDC", -"O= c #BFDAEC", -"P= c #BFDBEC", -"Q= c #BBDAEC", -"R= c #BAD7EA", -"S= c #6B808F", -"T= c #7297B0", -"U= c #8CB8D1", -"V= c #95C1D9", -"W= c #91BCD6", -"X= c #86AEC8", -"Y= c #7496B3", -"Z= c #6587A2", -"`= c #384958", -" - c #323F4B", -".- c #546A7C", -"+- c #6C88A1", -"@- c #779AB1", -"#- c #658297", -"$- c #3B4A58", -"%- c #33404B", -"&- c #202830", -"*- c #577287", -"=- c #86B1CC", -"-- c #86ACC0", -";- c #6E8797", -">- c #9CC7DF", -",- c #92BCD5", -"'- c #91BCD5", -")- c #8EB6CE", -"!- c #344453", -"~- c #263039", -"{- c #364452", -"]- c #2B3643", -"^- c #2A2D2E", -"/- c #E1EBF4", -"(- c #D2E4F3", -"_- c #A0B2C3", -":- c #8094A1", -"<- c #BAD8EB", -"[- c #B8D6EA", -"}- c #485A6A", -"|- c #789FB9", -"1- c #90BBD3", -"2- c #94C4DC", -"3- c #88B3CD", -"4- c #7A9EB9", -"5- c #698BA8", -"6- c #4D677C", -"7- c #151A1E", -"8- c #1A2125", -"9- c #171C21", -"0- c #1D2329", -"a- c #1D262E", -"b- c #486073", -"c- c #6A8CAA", -"d- c #7CA2BE", -"e- c #90BDD7", -"f- c #9AC5DE", -"g- c #7493A2", -"h- c #708B99", -"i- c #8CB7D1", -"j- c #7494AB", -"k- c #68889F", -"l- c #6A8FA5", -"m- c #7BA2BC", -"n- c #171D21", -"o- c #1D262F", -"p- c #212B36", -"q- c #09090B", -"r- c #BBC2C9", -"s- c #D4E4F2", -"t- c #C1D9EB", -"u- c #44515A", -"v- c #92B5C9", -"w- c #6B8795", -"x- c #4E687E", -"y- c #7EA6C0", -"z- c #91BED8", -"A- c #93BFD9", -"B- c #8CB5D0", -"C- c #7DA4BE", -"D- c #6F92AE", -"E- c #6687A5", -"F- c #526C85", -"G- c #415669", -"H- c #384655", -"I- c #6589A4", -"J- c #6E92AE", -"K- c #80A8C2", -"L- c #92BCD6", -"M- c #91BFD8", -"N- c #799AAF", -"O- c #6A8796", -"P- c #81AAC3", -"Q- c #577187", -"R- c #1F2930", -"S- c #192027", -"T- c #1B2227", -"U- c #0D1010", -"V- c #0E1012", -"W- c #070709", -"X- c #5C6062", -"Y- c #DCE8F3", -"Z- c #C4DCEF", -"`- c #9BB3C6", -" ; c #3A424F", -".; c #313A44", -"+; c #35424C", -"@; c #374655", -"#; c #6E91AD", -"$; c #87B2CC", -"%; c #799EBA", -"&; c #618298", -"*; c #7095AF", -"=; c #435663", -"-; c #80A7C0", -";; c #95C4DC", -">; c #779CB3", -",; c #526D7E", -"'; c #516A7A", -"); c #526B7B", -"!; c #465764", -"~; c #34414E", -"{; c #5C7E9A", -"]; c #2B3741", -"^; c #4B657F", -"/; c #5C7D9C", -"(; c #557088", -"_; c #0F0F10", -":; c #B9C2CA", -"<; c #CCDFEF", -"[; c #B4CDE1", -"}; c #8DAEC8", -"|; c #6F93AE", -"1; c #678CA6", -"2; c #6E92AF", -"3; c #81A8C1", -"4; c #8FBBD5", -"5; c #8DB9D2", -"6; c #6D8FA2", -"7; c #586F82", -"8; c #394851", -"9; c #86B0C6", -"0; c #85AFC8", -"a; c #6F94AF", -"b; c #698DA8", -"c; c #6889A7", -"d; c #5E7E9F", -"e; c #475D75", -"f; c #2E3C4A", -"g; c #5D7E9D", -"h; c #405465", -"i; c #36393B", -"j; c #D7E5F1", -"k; c #A4C5DC", -"l; c #668496", -"m; c #7595AB", -"n; c #7798AE", -"o; c #97C2DA", -"p; c #789DB3", -"q; c #8BB1C8", -"r; c #93C0D9", -"s; c #8BB5CF", -"t; c #85AFC9", -"u; c #82AAC6", -"v; c #5F7C95", -"w; c #1E252C", -"x; c #54728E", -"y; c #587899", -"z; c #5A7B9B", -"A; c #2D3843", -"B; c #798086", -"C; c #D1E3F1", -"D; c #B7D3E8", -"E; c #7E98AB", -"F; c #181C1F", -"G; c #46525F", -"H; c #80A1B8", -"I; c #99C3DB", -"J; c #85ACC2", -"K; c #21272D", -"L; c #0A0B0D", -"M; c #53718C", -"N; c #577797", -"O; c #1B2229", -"P; c #0D0E0F", -"Q; c #B3BDC4", -"R; c #CADDED", -"S; c #B4D3E7", -"T; c #2B3339", -"U; c #2F3840", -"V; c #7899AC", -"W; c #93C1D9", -"X; c #8FBCD5", -"Y; c #8BB6D1", -"Z; c #8DB8D2", -"`; c #92BFD8", -" > c #678092", -".> c #547089", -"+> c #5C7F9B", -"@> c #1F262E", -"#> c #202223", -"$> c #B1BECB", -"%> c #C3D9EB", -"&> c #7B8D99", -"*> c #708B9A", -"=> c #85ABC1", -"-> c #7FA3BA", -";> c #92BBD3", -">> c #7CA0B4", -",> c #97BDD4", -"'> c #657E8F", -")> c #93BDD4", -"!> c #88ADC7", -"~> c #6F94AE", -"{> c #526A7E", -"]> c #65849B", -"^> c #799DBB", -"/> c #84AFC9", -"(> c #8FB9D2", -"_> c #323C45", -":> c #516C84", -"<> c #658AA4", -"[> c #5B7C9B", -"}> c #2E3A49", -"|> c #2A3038", -"1> c #252D3A", -"2> c #1B1E20", -"3> c #ADBFCF", -"4> c #C0D6E7", -"5> c #B0CDE2", -"6> c #8EB3C9", -"7> c #526975", -"8> c #6B899D", -"9> c #597183", -"0> c #90BAD5", -"a> c #94C2DA", -"b> c #82ABC5", -"c> c #495E6E", -"d> c #82A8C3", -"e> c #81A4BA", -"f> c #7594A5", -"g> c #87ABC3", -"h> c #4D6573", -"i> c #6689A6", -"j> c #526E85", -"k> c #243037", -"l> c #607B96", -"m> c #7699B6", -"n> c #789EB5", -"o> c #303D48", -"p> c #7498B4", -"q> c #7094AF", -"r> c #597792", -"s> c #242F39", -"t> c #1A1D25", -"u> c #374553", -"v> c #4D677D", -"w> c #14191E", -"x> c #040505", -"y> c #171A1D", -"z> c #8A9FAD", -"A> c #BCD9EC", -"B> c #B5D3E7", -"C> c #A2CAE1", -"D> c #9DC7DE", -"E> c #9EC7DD", -"F> c #3B4A57", -"G> c #455867", -"H> c #98C2DB", -"I> c #85B0CC", -"J> c #7496B2", -"K> c #4C606F", -"L> c #6E8EA3", -"M> c #7EA0B6", -"N> c #91BBD3", -"O> c #8DB7D1", -"P> c #90BAD4", -"Q> c #96C1DA", -"R> c #3B4853", -"S> c #688AA5", -"T> c #4C657A", -"U> c #1B2026", -"V> c #2B3C44", -"W> c #5F7A90", -"X> c #587284", -"Y> c #536978", -"Z> c #88B1CC", -"`> c #759AB8", -" , c #617E9A", -"., c #556F85", -"+, c #20272E", -"@, c #323D48", -"#, c #333E4A", -"$, c #060707", -"%, c #4A5159", -"&, c #ACC3D5", -"*, c #ACCFE5", -"=, c #5A6874", -"-, c #AACDE1", -";, c #9CC6DC", -">, c #35414C", -",, c #769AB2", -"', c #80AAC5", -"), c #6F92AB", -"!, c #38464F", -"~, c #7EA4B9", -"{, c #97C3DC", -"], c #7A9FB6", -"^, c #3F505C", -"/, c #6D8DA6", -"(, c #1E282E", -"_, c #080909", -":, c #090A0C", -"<, c #344452", -"[, c #3B4857", -"}, c #7799AE", -"|, c #8DB6D1", -"1, c #66869E", -"2, c #3D4957", -"3, c #536C84", -"4, c #353F4C", -"5, c #111215", -"6, c #65727E", -"7, c #A6BCCD", -"8, c #5D6972", -"9, c #AED0E6", -"0, c #99C5DC", -"a, c #8DB5D0", -"b, c #8DB5CE", -"c, c #90BBD5", -"d, c #84AAC5", -"e, c #8EBBD5", -"f, c #80A7C1", -"g, c #6C8DA2", -"h, c #85AFC6", -"i, c #61839B", -"j, c #374352", -"k, c #576D83", -"l, c #80A6C1", -"m, c #81A4BB", -"n, c #111315", -"o, c #111418", -"p, c #4C6378", -"q, c #33424C", -"r, c #37454D", -"s, c #8DB4CF", -"t, c #7397B3", -"u, c #3A495A", -"v, c #0D0F13", -"w, c #27303A", -"x, c #272E36", -"y, c #0F1012", -"z, c #90A4B2", -"A, c #A8CBE2", -"B, c #91BCD4", -"C, c #80ABC3", -"D, c #567083", -"E, c #67899D", -"F, c #94C2DB", -"G, c #95C1DB", -"H, c #779CB2", -"I, c #60849E", -"J, c #64849F", -"K, c #1A1F22", -"L, c #405061", -"M, c #79A1BD", -"N, c #324051", -"O, c #6183A1", -"P, c #6B8FAD", -"Q, c #6485A2", -"R, c #34444F", -"S, c #060606", -"T, c #2D3339", -"U, c #B2CBDF", -"V, c #94BCD5", -"W, c #7DA2BA", -"X, c #3F5264", -"Y, c #5A7991", -"Z, c #7195B3", -"`, c #7BA5BD", -" ' c #81AAC6", -".' c #88B2CC", -"+' c #8EBBD4", -"@' c #8AB2CC", -"#' c #82ADC7", -"$' c #7092A5", -"%' c #95C2DA", -"&' c #41525F", -"*' c #6387A3", -"=' c #475F72", -"-' c #21282F", -";' c #5B7288", -">' c #0D0F11", -",' c #0B0E11", -"'' c #212C36", -")' c #26323C", -"!' c #161B20", -"~' c #55616D", -"{' c #9BB9D0", -"]' c #799EB6", -"^' c #27313A", -"/' c #1A222B", -"(' c #5D7E99", -"_' c #6587A4", -":' c #6789A6", -"<' c #6B8EAB", -"[' c #628097", -"}' c #6D8B9D", -"|' c #769AAF", -"1' c #6E91A9", -"2' c #6C8EAD", -"3' c #6E91AF", -"4' c #3C4D59", -"5' c #8BB1CB", -"6' c #232D32", -"7' c #13171B", -"8' c #232B32", -"9' c #839AAF", -"0' c #789BB3", -"a' c #283138", -"b' c #0C0E0F", -"c' c #242B33", -"d' c #3D4D5B", -"e' c #435768", -"f' c #4B6176", -"g' c #283137", -"h' c #8DB4CC", -"i' c #41535E", -"j' c #405362", -"k' c #3C4F60", -"l' c #3C4E5B", -"m' c #2B353E", -"n' c #526876", -"o' c #92BAD3", -"p' c #1B1F23", -"q' c #31383F", -"r' c #7F9CB6", -"s' c #21292F", -"t' c #29333F", -"u' c #1F252E", -"v' c #090A0E", -"w' c #4D626E", -"x' c #96BDD3", -"y' c #191D20", -"z' c #13181B", -"A' c #80A4BC", -"B' c #1B2027", -"C' c #5D7182", -"D' c #2C383F", -"E' c #364857", -"F' c #1A2028", -"G' c #333F49", -"H' c #7FA2B5", -"I' c #4A5E6E", -"J' c #232E35", -"K' c #252D35", -"L' c #2F3A41", -"M' c #0A0B0E", -"N' c #14191D", -"O' c #5A717F", -"P' c #212931", -"Q' c #222B34", -"R' c #101216", -"S' c #21272B", -" ", -" ", -" ", -" . ", -" + ", -" @ # $ % ", -" & * = - ; ", -" > , ' ) ! ~ { ] ", -" ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a ", -" b c d e f g h i j k l m n o p q r s t u v w x ", -" y z A B C D E F G H I J K L M N O P Q R S T U U V W X Y ", -" Z ` ...+.@.#.$.%.O &.*.=.-.;.>.,.'.).!.~.~.~.{.].^./.(._.:.<. ", -" b [.}.|.#.1.2.3.4.{.~.~.~.~.5.6.5.~.7.8.{.~.~.~.~.9.0.a.b.].c. ", -" d.e.f.g.h.i.j.k.{.~.~.~.~.l.~.m.% n.~.o.{.{.~.~.~.~.p.V 9.~.q.r. ", -" s.t.u.v.w.x.u y.z.A.B.5.~.~.5.C.D.E.F.~.~.G.~.~.~.G.H.I.J.~.~.J.K.L. M.N. ", -" O.P.Q.R.S.T.U.V.W.X.Y.Z.`.~.~.5. +.+++@+U ~.~.~.~.~.#+$+%+,.~.~.G.&+*+=+-+;+ ", -" >+,+Q.'+)+!+~+{+]+^+/+(+_+:+<+~.[+}+U 9.|+5.~.~.~.~.1+2+3+4+5+~.].6+7+8+9+0+ ", -" a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+5.U ~.U r+s+~.~.~.t+u+v+w+x+y+~.z+A+t+B+C+D+E+ F+G+ ", -" H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+V ~.~.~.~.U ~.~.~.o.9.{.Z+`+9.~.~.~.V @.@+@@@#@ $@%@&@*@ ", -" =@-@;@>@,@'@'.)@!@~@{@]@^@/@l+(@_@:@<@~.~.~.U {.~.~.~.{.~.~.{.[@~.~.~.~.}@|@1@2@3@4@5@6@7@8@ ", -" 9@0@a@b@c@d@-.e@f@g@h@i@j@k@l@V+m@n@o@p@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.q@r@s@t@u@v@w@x@y@ ", -"z@A@B@C@D@E@X F@G@H@R I@J@K@L@M@N@O@P@Q@R@o+S@T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.9.U@V@W@X@<+V Y@Z@`@ # ", -" .#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#S@/#~.~.~.~.~.~.~.~.~.~.~.~.~.U (#_#:#<#p@{.[#}#|#1#2# ", -" 3#4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#k#S@/#~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.l#m#9.{.~.n#o#p#q#r#s# ", -" t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#% J#K#S@T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.L#0.l.~.~.{.M#N#O#P#Q#R# ", -" S#T#U#V#W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$-$a#~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.o.o.;$9.G.~.>$,$'$)$!$~${$]$ ", -" ^$/$($_$:$<$[$}$|$1$2$3$4$5$6$7$8$9$:+<+~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.G.0$a$b$c$d$e$f$g$h$i$j$k$ ", -" [ l$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$M#p@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.;$D$E$F$G$H$I$J$K$L$ ", -" M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$`$ %.%+%@%<+{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.#%$%%%p@&%*%=%-%;%>%,% ", -" '%)%!%~%{%]%^%/%(%_%:%<%[%}%|%1%2%3%-$T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.4%5%U p@6%7%8%9%0%a%y ", -" b%c%d%e%f%g%h%i%G.[#j%k%l%m%n%o%p%@%q%{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.~.~.~.~.~.~.V G.}@r%s%t%u%v%w%M.x%y%z%A% ", -" B%C%D%E%F%G%H%I%V o.<@J%K%L%M%N%O%P%p@~.~.~.~.~.~.~.~.~.U ~.~.U 9.Q%{.~.~.~.~.~.{.%%U {.~.~.{.v@R%S%T%U%V%W% X%$ ", -" Y%Z%`% &.&+&@&#&U ~.{.$&%&&&*&=&-&T@~.~.~.~.~.~.~.~.~.~.~.;&>&,&'&)&!&5+~.~.~.~.{.~&{&]&9.~.p@^&/&(&_&:& <&[&}&|& ", -" 1&2&3&4&5&6&7&8&9&l.~.{.V 0&a&b&c&~.~.~.~.~.~.~.5.d&e&f&g&h&i&j&k&l&m&n&~.~.G.~.~.~.o&p&q&r&s&t&u&v& w&x&y&z&A&B& ", -" C&2&D&E&F&G&G&H&I&J&U ~.~.U K&L&,.~.~.~.~.~.~.~.U M&N&O&P&Q&R&S&T&U&V&W&X&].{.~.~.{./#Y&Z&`& *.*+*@* (.#*$*%*&***=* ", -" -*;*>*,*'*)*!*~*{*]*^*~.5.{.5./*U ~.~.~.~.~.~.{.[#(*_*:*<*[*[*}*|*1*2*3*4*5*U ~.~.6*7*8*9*0*a*b*c*d*e*f*g*h*i*%*j*k*<%l* ", -" m*n*o*p*q*r*s*t*u*v*w*1+~.~.~.~.~.~.~.~.~.~.~.x*y*z*A*B*C*D*E*V U ~.G.~.:.F*G*l.{.R%X+H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X* ", -" Y*Z*D&`* =.=+=@=#=$=%=&={.~.~.~.~.~.~.~.~.~.~.<+*===-=;=>=,='=)=[#p@!=~={=]=^=/=(=a#&%_=:=<=-#[=}=k$|=1=2=3=4=5=6=7=8=9= ", -" 0=a=b=c=d=e=f=g=h=i=j=k=l=5.~.~.~.~.~.~.~.~.~.V -$m=n===o=p=q=r=s=t=:+u=v=w=x=y=z=A=J.V U ~.V [#B=C=D=1=E=F= G=H=I= ", -" J=K=L=M=N=O=P=Q=R=S=T=U=V=5.U ~.~.~.~.~.~.~.~.~.{.x*W=X=Y=Z=`= -.-+-@-#-$-%-&-*-=---;->-9.x*)=,-'-)-c.!-~- {-]- ", -" ^-/-(-_-:-<-<-[-%.}-|-1-T@~.{.~.~.~.~.~.~.~.~.~.~.V 2-^&3-4-5-6-7-8-9-0-a-b-c-d-e-f-g-h-V@i-j-k-l-T=m-7@n- o-p- ", -" q-r-s-t-u-v-!+2*w-x-y-z-V ~.~.~.~.~.~.~.~.~.~.~.~.~.~./#A-B-C-D-E-F-G-H-I-J-K-L-<@M-W=N-O-P-Q-R-<&S-T-U-V- W- ", -" X-Y-Z-`- ;.;+;@;#;$;q+~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~./#v@W=N#%;&;*;=;-;s=-#;;>;,;';);!;~;{;];^;/;(;H+ ", -" _;:;<;[;};|;1;2;3;4;{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.T@-#5;6;7;8;9;[#V <+0;a;b;c;E-d;e;f;|=g;h; ", -" i;j;V#k;F.l;m;n;o;~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.~.{.p@S@s=p;q;~.~.{.r;s;t;u;~$v;w;x;y;z;A; ", -" H+B;C;D;E;F;G;H;~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.U ~.~.V E*E*V ~.~.~.{.T@/#I;J;K;L;M;y;N;O; ", -" P;Q;R;S;T;U;~.{.~.~.~.~.~.~.~.~.l.U {.p@~.~.{.V ~.~.5+V;].~.~.~.~.{.{.p@W;X;Y;Z;`;/# >W..>+>N;@> ", -" #>$>%>&>*>G.~.~.~.~.~.~.~.~.{.`.=>V=->;>~.n##&>>T@,>'>].~.~.~.~.~.)>!>i$~>{>]>^>/>(>_>:><>[>}> |>1> ", -" 2>3>4>5>U@U ~.~.~.~.~.~.~.{.6>7>8>9>0>a#a>b>c>d>e>f>~.~.~.V ~.~.g>h>i>1=j>,%k>l>m>n>o>p>q>r>s>t>u>v>w> ", -" x>y>z>A>B>C>5+D>E>~.~.~.~.{.%&F>G>3;s%{.H>I>J>K>L>M>~.V N>O>P>x*Q>R>S>T>U> X%V>W>X>Y>Z>P-`> ,.,+, ", -" @,#,$,%,&,1.*,=,-,;,{.p@V {.X@>,,,Z;V ~.5.`;',),!,~,~.{,],^,/,/&-$F$(,_, :,<,[,},<@|,1,2, ", -" B&3,4, 5,6,7,8,9,0,`;a,b,B+c,d,s=<+~.~.~.a#e,f,g,h,V -#9$i,j,k,l,m,n, o,p,q,r,s,t,u,v, ", -" w,x, y,z,A,B,C,D,E,o@F,G,<+~.~.~.~.~.;;P>j%}@p@H,]#I,J,K,L,M,=+ N,O,P,Q,R,S, ", -" T,U,V,W,X,Y,Z,`, '.'+'x*~.{.O+@%@'#'$'%'a#&'*'='-' ~;;'>' ,''')'!' ", -" ~'{']'^'/'('_'_':'<'['}'{.V |'1'2'3'4'5'}@6'7' 8'K; ", -" v&9'0'a' b'c'd'e'f'1@g'h'G.i'j'k'l'm'n'o'p' y ", -" q'r's' t'u'H+ v'w'x'y' z'A'B' ", -" C'D' E'F' G'H' I'J' ", -" K'L' M' N'O' P'Q' ", -" R' S' ", -" ", -" ", -" ", -" "}; diff --git a/minilibx_macos/Makefile b/minilibx_macos/Makefile new file mode 100644 index 0000000..6081605 --- /dev/null +++ b/minilibx_macos/Makefile @@ -0,0 +1,20 @@ +# +# + +NOM=libmlx.a +SRC= mlx_shaders.c mlx_new_window.m mlx_init_loop.m mlx_new_image.m mlx_xpm.c mlx_int_str_to_wordtab.c +OBJ1=$(SRC:.c=.o) +OBJ=$(OBJ1:.m=.o) +CFLAGS+=-O2 + +all: $(NOM) + +$(NOM): $(OBJ) + ar -rc $(NOM) $(OBJ) + ranlib $(NOM) + +clean: + rm -f $(NOM) $(OBJ) *~ + rm -f mlx_app + +re: clean all diff --git a/minilibx_macos/_README_ b/minilibx_macos/_README_ new file mode 100644 index 0000000..d0a5548 --- /dev/null +++ b/minilibx_macos/_README_ @@ -0,0 +1,29 @@ +# +# +# 14/10/2015 +# ol@staff.42.fr +# + +MinilibX + +Interface simplifiee de programmation graphique pour debutant +# + +Cette minilibX est la version native pour MacOSX. +[ Elle n'utilise plus les librairies graphiques X11, ni XQuartz le serveur X pour MacOSX. ] +L'interface / l'API, reste identique a la version precedente. Les man presents dans la minilibX +d'origine sont toujours valides. + +Le fichier mlx.h a inclure dans vos programmes rapelle les petites differences de comportement +entre les 2 versions, dues a la gestion graphique differente selon les systemes d'exploitation. + +# + +Cette version utilise le systeme de fenetrage Cocoa de MacOSX ( AppKit ), et les primitives +graphiques OpenGL moderne. + +# + +License: la MinilibX macos est fournie sous license BSD: Copyright Olivier Crouzet - 2014-2015 + la MinilibX est fournie sous license BSD: Copyright Olivier Crouzet - 1999-2015 +# diff --git a/minilibx_macos/font.c b/minilibx_macos/font.c new file mode 100644 index 0000000..656d248 --- /dev/null +++ b/minilibx_macos/font.c @@ -0,0 +1,3525 @@ +/* GIMP RGBA C-Source image dump (font.c) */ + +static const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */ + unsigned char pixel_data[1140 * 20 * 4 + 1]; +} font_atlas = { + 1140, 20, 4, + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\214\377\377\377\224\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377I\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" + ")\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\216\377\377\377\263\377\377\377\13\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377b\377\377\377V\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\270\377\377" + "\377u\377\377\377\13\377\377\377\252\377\377\377\255\377\377\377\13\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\317\377\377\377\374\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377e\377\377\3775\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\234\377\377\377\267" + "\377\377\377B\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\343\377\377" + "\377\375\377\377\377M\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\13\377\377\377\355\377\377\377\367\377\377\3778\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377j\377\377\377\373\377\377\377\243\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377b\377\377\377\237\377\377\377\233\377\377\377Z\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "b\377\377\377c\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377)\377\377\377e\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377" + "c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377b\377\377\377c\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377S\377\377\377c\377\377\3775\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\213\377" + "\377\377\363\377\377\377\364\377\377\377\364\377\377\377\372\377\377\377" + "\225\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377u\377\377" + "\377\371\377\377\377\233\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\215\377\377\377\372" + "\377\377\377\364\377\377\377\364\377\377\377\363\377\377\377\224\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377U\377\377\377e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377\13\377\377\377\351\377\377\377\376\377\377\377s\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\214\377\377\377\372\377" + "\377\377\\\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\367\377\377\377" + "\315\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\340" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\304\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\214\377\377\377\372\377\377\377\\\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377s\377\377\377\366\377\377\377\342\377\377\377%" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377s\377\377\377\366\377\377\377\342\377\377\377%\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377" + "\372\377\377\377\225\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\306\377\377\377\374\377" + "\377\377\370\377\377\377\370\377\377\377\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377" + "\377\317\377\377\377\357\377\377\377\373\377\377\377\225\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320" + "\377\377\377\374\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\215\377\377\377\372\377\377\377\363\377" + "\377\377\333\377\377\377m\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\1\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\13\377\377\377\364\377\377\377\366\377\377\377%\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" + "\377\361\377\377\377\377\377\377\377\254\377\377\377=\377\377\377\375\377" + "\377\377\372\377\377\377)\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\363\377\377\377%\377\377\377" + "\224\377\377\377\363\377\377\377%\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\3772\377\377\377\336\377\377\377\375\377" + "\377\377x\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\262\377\377\377\372\377\377\377\370\377\377\377\246\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377=\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\377\377\377~\377\377\377\374\377\377\377\377\377\377" + "\377\376\377\377\377\224\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\375\377\377\377" + "\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\325\377\377\377\377" + "\377\377\377\271\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\355\377\377\377\33\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377v\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\315\377\377\377\367\377\377\377\373\377\377\377\334\377\377\377B\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377`\377\377\377\300\377\377\377\342\377\377\377Z\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\224\377\377" + "\377\347\377\377\377\373\377\377\377\364\377\377\377\312\377\377\377)\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" + "\226\377\377\377\346\377\377\377\370\377\377\377\360\377\377\377\327\377" + "\377\377b\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\214\377\377\377\343\377\377\377\273" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377" + "\377\377\315\377\377\377\337\377\377\377\333\377\377\377\333\377\377\377" + "\333\377\377\377\343\377\377\377\223\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\346\377\377\377" + "\370\377\377\377\364\377\377\377\320\377\377\377O\0\0\0\0\377\377\377\377" + "\377\377\377\377\377\377\377\13\377\377\377\315\377\377\377\337\377\377\377" + "\333\377\377\377\333\377\377\377\333\377\377\377\333\377\377\377\333\377" + "\377\377\323\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" + "\0\377\377\3772\377\377\377\316\377\377\377\366\377\377\377\373\377\377\377" + "\344\377\377\377\200\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\377\377\377u\377\377\377\342\377\377\377\370\377\377\377\364" + "\377\377\377\305\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377)\377\377\3775\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\371\371\377.\377\377\377V\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\13\377\377\377\321\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\271\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377Q\377\377\377" + "\273\377\377\377\332\377\377\377\322\377\377\377\206\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\3778\377\377" + "\377\367\377\377\377\376\377\377\377s\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\374\377\377\377\360\377\377\377\253\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" + "\13\377\377\377\304\377\377\377\375\377\377\377\377\377\377\377\377\377\377" + "\377\373\377\377\377\247\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\307\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\374\377\377\377\324\377\377\377B\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\346" + "\377\377\377\13\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377" + "\377\377\352\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\376\377\377\377l\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\333\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\361\377\377\377\202\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\307\377\377\377\376\377" + "\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\352\377\377\377\364" + "\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377\377" + "\377\377\377\377\377\377\377\377\303\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\225\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" + "\377\377\377\225\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\356\377\377\377" + "\376\377\377\377v\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13" + "\377\377\377\352\377\377\377\364\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\307\377" + "\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0\377\377\377u\377\377\377\375" + "\377\377\377\321\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\307\377\377\377\377\377\377\377\251\0\0\0\0\0\0\0\0\377\377\377\13\377" + "\377\377\355\377\377\377\330\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\377\377\377\206\377\377\377\366\377\377\377\377\377\377\377" + "\377\377\377\377\373\377\377\377\246\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\370\377\377\377\324\377\377\377" + "B\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\206" + "\377\377\377\370\377\377\377\377\377\377\377\377\377\377\377\373\377\377" + "\377\240\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\224\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\364\377\377\377\312\377\377\377\33\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\377\377\377\204\377\377\377\365\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\342\377\377\377V\0\0\0\0" + "\377\377\377\377\377\377\377\377\377\377\377\224\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\252\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\307\377\377\377\376\377\377\377i\0\0\0\0\0\0" + "\0\0\377\377\377\13\377\377\377\352\377\377\377\364\377\377\377%\377\377" + "\377\377\377\377\377\377\377\377\377}\377\377\377\376\377\377\377\332\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\262\377\377\377\377\377\377\377" + "\216\377\377\377\377\377\377\377\377\377\377\377\345\377\377\377\372\377" + "\377\377=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355" + "\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377" + "\345\377\377\377\376\377\377\377~\0\0\0\0\0\0\0\0\377\377\3778\377\377\377" + "\367\377\377\377\360\377\377\377\33\377\377\377\377\377\377\377\377\377\377" + "\377\206\377\377\377\377\377\377\377\332\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\266\377\377\377\377\377\377\377\234\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\361" + "\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\224\377\377\377\377\377\377\377\312\377\377\377\255\377\377\377" + "\266\377\377\377u\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377;\377\377\377\373\377\377\377\347\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377`\377\377" + "\377\266\377\377\377\263\377\377\377\256\377\377\377\373\377\377\377\254" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\33\377\377\377\371\377\377\377\376\377\377\377_\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\374" + "\377\377\377\355\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\224\377\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377" + "\377\377\374\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\334\377\377\377\377\377\377\377\346\377\377\377\272\377\377\377" + "\342\377\377\377\276\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377" + "l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\377" + "\377\377\377\377\377\377\377l\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\377\377" + "\377\377\377\377\377\377l\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377K\377\377\377\375\377\377\377\254\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\247\377\377\377\343\377\377\377\340\377\377\377\377\377\377\377" + "\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377`\377\377\377\262\377\377\377=\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\342\377\377\377\377\377\377\377" + "\325\377\377\377\266\377\377\377u\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377`\377\377\377\263\377\377\377\307\377\377\377\376\377\377\377\363" + "\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\0\377\377\377\0\377\377\377\0\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377\351\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\377" + "\377\377\377\243\377\377\377;\377\377\377\374\377\377\377\364\377\377\377" + "%\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\313\377\377\377\355\0\0\0\0\377\377\377\320\377\377\377\346\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\247" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\352\377\377\377S\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" + "}\377\377\377\377\377\377\377\326\377\377\377\334\377\377\377\376\377\377" + "\377l\0\0\0\0\377\377\377}\377\377\377\377\377\377\377\323\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\354\377\377\377\364\377" + "\377\377\226\377\377\377\373\377\377\377\337\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377\377" + "\377\362\377\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377" + "\377\377\377\377\377\377\336\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\302\377\377\377\377\377" + "\377\377\277\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377|\377\377\377\205\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377_\377\377\377\232\377\377\377\13\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "!\377\377\377\371\377\377\377\352\377\377\377\13\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\345\377\377\377\377\377" + "\377\377\365\377\377\377\353\377\377\377\377\377\377\377\367\377\377\377" + "2\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\313" + "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377l\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\314\377" + "\377\377\377\377\377\377\376\377\377\377\335\377\377\377\371\377\377\377" + "\377\377\377\377\352\377\377\377\33\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\302\377\377\377\377\377\377\377\377\377\377\377\342" + "\377\377\377\362\377\377\377\377\377\377\377\375\377\377\377\\\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "U\377\377\377\374\377\377\377\377\377\377\377\333\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377" + "\377\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\251\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" + "\377\377\247\377\377\377\377\377\377\377\377\377\377\377\360\377\377\377" + "\373\377\377\377\377\377\377\377\360\377\377\377\33\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\332\377\377\377\377\377\377\377\376\377\377" + "\377\374\377\377\377\374\377\377\377\376\377\377\377\377\377\377\377\367" + "\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\25\377" + "\377\377\356\377\377\377\377\377\377\377\351\377\377\377\350\377\377\377" + "\376\377\377\377\376\377\377\377s\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377|\377\377\377\376\377\377\377\377\377\377\377\345\377" + "\377\377\356\377\377\377\377\377\377\377\355\377\377\377%\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377}\377\377\377\374\377\377\377\254\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377V\377\377\377\375\377\377\377\241\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\3778\377" + "\377\377\372\377\377\377\343\377\377\377u\377\377\377\217\377\377\377\374" + "\377\377\377\375\377\377\377M\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\377\377\377\233\377\377\377\376\377\377\377\377\377\377\377" + "\354\377\377\377\375\377\377\377\377\377\377\377\257\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377" + "\377\377\377\377\377\377\377\377\277\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" + "\342\377\377\377\304\377\377\377\332\377\377\377\376\377\377\377\377\377" + "\377\377\227\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" + "\377\377\331\377\377\377\377\377\377\377\373\377\377\377\306\377\377\377" + "\307\377\377\377\375\377\377\377\376\377\377\377Q\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377\330\377\377" + "\377\310\377\377\377\370\377\377\377\377\377\377\377\375\377\377\377f\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374" + "\377\377\377\376\377\377\377\323\377\377\377\327\377\377\377\327\377\377" + "\377\327\377\377\377\316\377\377\377\33\377\377\377\377\377\377\377\377\0" + "\0\0\0\377\377\377\13\377\377\377\356\377\377\377\376\377\377\377\324\377" + "\377\377\327\377\377\377\327\377\377\377\327\377\377\377\312\377\377\377" + "%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\33\377\377\377\362" + "\377\377\377\377\377\377\377\365\377\377\377\277\377\377\377\321\377\377" + "\377\377\377\377\377\366\377\377\377\33\377\377\377\377\377\377\377\377\0" + "\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\356\377\377\377\366\377\377\377%\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377}\377\377\377\332\377\377\377\323\377\377" + "\377\371\377\377\377\377\377\377\377\331\377\377\377\327\377\377\377\266" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377" + "\302\377\377\377\323\377\377\377\322\377\377\377\322\377\377\377\342\377" + "\377\377\377\377\377\377\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\377" + "\377\377\335\377\377\377\377\377\377\377\315\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\366\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377\336\0\0\0\0\0\0" + "\0\0\377\377\377\275\377\377\377\377\377\377\377\330\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\312\377\377\377\377\377\377\377" + "\364\377\377\377%\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\333" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377j\377\377\377" + "\375\377\377\377\377\377\377\377\325\377\377\377\313\377\377\377\376\377" + "\377\377\377\377\377\377\225\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\377\377\377\377\342\377\377\377\310\377" + "\377\377\322\377\377\377\366\377\377\377\377\377\377\377\355\377\377\377" + "\33\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377j\377\377\377\375" + "\377\377\377\377\377\377\377\321\377\377\377\307\377\377\377\376\377\377" + "\377\377\377\377\377\216\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\224\377\377\377\377\377\377\377\342\377\377\377\310\377\377" + "\377\322\377\377\377\371\377\377\377\377\377\377\377\336\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" + "\377\377\377\377\330\377\377\377\271\377\377\377\351\377\377\377\377\377" + "\377\377\334\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377}\377\377" + "\377\332\377\377\377\327\377\377\377\323\377\377\377\371\377\377\377\377" + "\377\377\377\331\377\377\377\326\377\377\377\332\377\377\377p\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377" + "i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\366\377\377" + "\377%\377\377\377\377\377\377\377\377\377\377\377\33\377\377\377\365\377" + "\377\377\375\377\377\3778\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\345" + "\377\377\377\375\377\377\377Q\377\377\377\377\377\377\377\377\377\377\377" + "\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\361\377\377\377\347\377\377\377\377\377\377\377\377\0" + "\0\0\0\377\377\377\214\377\377\377\377\377\377\377\343\0\0\0\0\0\0\0\0\377" + "\377\377\261\377\377\377\377\377\377\377\272\0\0\0\0\377\377\377\377\377" + "\377\377\377\377\377\377\13\377\377\377\351\377\377\377\376\377\377\377i" + "\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\366\377\377\377\372\377\377\377" + "8\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377v\377\377\377\327\377" + "\377\377\322\377\377\377\322\377\377\377\316\377\377\377\351\377\377\377" + "\377\377\377\377\360\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377U\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" + "\377\377\320\377\377\377\376\377\377\377_\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377" + "\377\377\377\377\377\377\377\377\377\377\272\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\233\377\377\377\371\377\377\377" + "i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377" + "\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\373\377\377\377" + "\356\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377" + "\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "S\377\377\377\314\377\377\377\271\377\377\377\13\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377S\377" + "\377\377\314\377\377\377\271\377\377\377\13\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\375\377\377\377\252\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\360\377\377\377\334\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\247\377\377\377\377\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\337\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\313\377\377\377\372\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\3\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\331" + "\377\377\377\376\377\377\377i\377\377\377K\377\377\377\374\377\377\377\366" + "\377\377\377)\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\316\377\377\377\333\0\0\0\0\377\377\377\316\377\377\377" + "\333\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "8\377\377\377\372\377\377\377\377\377\377\377\307\377\377\377\237\377\377" + "\377\364\377\377\377\377\377\377\377\244\0\0\0\0\377\377\377\377\377\377" + "\377\377\377\377\377\232\377\377\377\375\377\377\3772\377\377\377=\377\377" + "\377\375\377\377\377\254\377\377\377!\377\377\377\371\377\377\377\367\377" + "\377\3778\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377;\377\377\377" + "\372\377\377\377\346\377\377\377\13\377\377\377\371\377\377\377\333\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\13\377\377\377\355\377\377\377\375\377\377\377\\\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377\355\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377!\377\377\377\372\377\377\377\375\377\377\3778\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\327\377\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320\377\377" + "\377\374\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\204\377" + "\377\377\377\377\377\377\353\377\377\377\13\0\0\0\0\377\377\377\320\377\377" + "\377\377\377\377\377\260\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377\205\377\377\377\322\377\377\377\353\377\377\377\376" + "\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\325\377\377\377\375\377\377\377M\0\0\0\0\377\377\377\33" + "\377\377\377\356\377\377\377\376\377\377\377l\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\215\377\377\377\375\377\377\377Z\0\0\0\0" + "\0\0\0\0\377\377\377\325\377\377\377\377\377\377\377\257\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377" + "\356\377\377\377\377\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377" + "\377\330\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377!\377\377\377\371\377\377\377\377\377" + "\377\377\216\0\0\0\0\0\0\0\0\377\377\377\302\377\377\377\224\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\302\377\377\377\377\377\377\377\252\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377V\377\377\377\375\377\377\377\333" + "\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\260\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\330\377\377\377\377" + "\377\377\377\251\0\0\0\0\377\377\377\13\377\377\377\336\377\377\377\377\377" + "\377\377\227\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\250\377\377\377\276\377\377\377\33\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\250\377\377\377\276\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\276\377\377\377\377\377\377\377\377\377\377\377\225\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377I\377\377\377\373\377\377\377\377\377\377\377\325\377" + "\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\306\377" + "\377\377\376\377\377\377l\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377K\377\377\377\374\377\377\377\375\377\377\377q\0\0\0\0\377\377" + "\377\33\377\377\377\362\377\377\377\366\377\377\377%\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\334\377\377\377\377\377" + "\377\377\376\377\377\377\360\377\377\377\33\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\243" + "\0\0\0\0\0\0\0\0\377\377\377\223\377\377\377\377\377\377\377\327\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377s\377\377\377\376\377" + "\377\377\375\377\377\377_\0\0\0\0\0\0\0\0\377\377\377z\377\377\377\257\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" + "\376\377\377\377U\0\0\0\0\377\377\377\33\377\377\377\353\377\377\377\377" + "\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377K\377\377\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" + "\377\355\377\377\377\366\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\247\377\377\377" + "\377\377\377\377\364\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\246\377\377" + "\377\213\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313" + "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\355\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\355\377\377\377\363\377\377\377\13\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\213\377\377\377\377\377\377\377" + "\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377" + "\377\377\377\377\377\377\252\0\0\0\0\377\377\377\270\377\377\377\377\377" + "\377\377\355\377\377\377\33\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0" + "\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\307\377\377\377\377\377\377\377\375\377\377\3778\377\377\377\13" + "\377\377\377\352\377\377\377\377\377\377\377\327\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\307\377\377\377\377\377\377\377\377" + "\377\377\377\251\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\333\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" + "\377\377\377\377\315\0\0\0\0\0\0\0\0\377\377\377\253\377\377\377\377\377" + "\377\377\346\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\224\377\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0\377\377\377\25\377\377" + "\377\356\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\313\377\377\377\377\377\377\377\310\0\0\0\0\0\0\0\0\377" + "\377\377\253\377\377\377\377\377\377\377\342\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\243\0\0" + "\0\0\0\0\0\0\377\377\377!\377\377\377\371\377\377\377\367\377\377\377)\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\232\377\377\377\377\377" + "\377\377\315\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\302\377\377\377z\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\355\377\377\377\363\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377" + "i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377" + "\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\312\377\377\377" + "\377\377\377\377\215\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377" + "\377\347\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\247\377\377" + "\377\377\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377" + "\377\377\374\377\377\377\333\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\377\377\377\342\377\377\377\376\377\377\377v\377\377\377\33\377\377" + "\377\366\377\377\377\367\377\377\377)\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\316\0\0\0\0\0\0" + "\0\0\377\377\377\232\377\377\377\377\377\377\377\264\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\25\377\377\377\356\377\377\377\376\377\377\377v\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376" + "\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\377\377\377\377\277\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377\377\377\254\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\335\377\377\377\370\377\377\377\353\377\377\377\363\377" + "\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377\377V\377\377\377\33\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" + "\377\377\377\376\377\377\377b\0\0\0\0\377\377\377S\377\377\3775\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377S\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377S\377" + "\377\3775\377\377\377;\377\377\377\374\377\377\377\333\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377" + "\377V\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\374\377\377\377\326" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377E\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377" + "\377\376\377\377\377b\0\0\0\0\377\377\377E\377\377\377S\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377" + "\377\375\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377" + "\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377\377X\0" + "\0\0\0\0\0\0\0\377\377\377V\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377S\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377E\377\377\377K\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377S\377\377\3775\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377S\377\377\3775\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377\377U\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377E\377\377\377U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\376\377\377" + "\377b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361" + "\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371" + "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377" + "%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377" + "\377\377\0\377\377\377\6\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371" + "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377l\377\377\377\33" + "\377\377\377\364\377\377\377\352\377\377\377\13\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\3772\377\377\377\274\377\377\377\361\377\377" + "\377\375\377\377\377\265\377\377\377\367\377\377\377\372\377\377\377\221" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377V\377\377\377" + "\374\377\377\377\336\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\261\377\377" + "\377\13\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\232\377\377\377" + "\371\377\377\377\33\377\377\377;\377\377\377\374\377\377\377\217\377\377" + "\377\335\377\377\377\375\377\377\377\\\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\33\377\377\377\371\377\377\377\333\377\377\377e" + "\377\377\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361\377" + "\377\377\364\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\375\377\377\377" + "\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\266\377\377\377\377\377\377\377" + "\227\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\316\377\377\377\334\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\335\377\377" + "\377\375\377\377\377=\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\306\377\377\377\377\377\377\377\225\0\0\0\0\0\0\0\0\377" + "\377\377`\377\377\377\375\377\377\377\346\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\213\377\377\377\376" + "\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\3772\377\377\377f\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\253\377" + "\377\377\376\377\377\377i\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\231\377\377\377\377" + "\377\377\377\257\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377\356\377\377\377\374" + "\377\377\377\332\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377K\377\377\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\224\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377b\377\377\377\375\377\377\377\347\377\377\377\13" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377U\377\377\377" + "\375\377\377\377\266\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\374\377\377" + "\377\236\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\25\377\377\377" + "\361\377\377\377\367\377\377\377)\0\0\0\0\0\0\0\0\377\377\377j\377\377\377" + "\376\377\377\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\377\377\377\377" + "\260\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\377\377\377\377" + "\260\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377G\377\377\377\350\377\377\377\377\377\377\377\367" + "\377\377\377y\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\207\377\377\377\307\377\377\377\304\377\377\377\304\377\377\377" + "\304\377\377\377\304\377\377\377\304\377\377\377\243\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377S\377\377\377\351\377\377" + "\377\377\377\377\377\365\377\377\377n\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\13\377\377\377\345\377\377\377\376\377\377\377_\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\273\377\377\377\377\377\377\377\234" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\376\377\377\377i\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\373" + "\377\377\377\344\377\377\377\317\377\377\377\376\377\377\377v\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" + "\377\377\377\377\252\0\0\0\0\0\0\0\0\377\377\377X\377\377\377\375\377\377" + "\377\327\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\300" + "\377\377\377\377\377\377\377\277\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377" + "\377\375\377\377\377Q\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "K\377\377\377\374\377\377\377\332\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377" + "\355\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\342\377\377\377\377" + "\377\377\377\225\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377" + "\377b\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377" + "\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\355\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377" + "\377\377\237\377\377\377\203\377\377\377\377\377\377\377\375\377\377\377" + "Q\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13" + "\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\312\377" + "\377\377\377\377\377\377\377\377\377\377\217\377\377\377X\377\377\377\375" + "\377\377\377\373\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\313\377\377\377\373\377\377\377\371\377\377\377\366" + "\377\377\377%\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\377" + "\377\377\377\377\377\377\377\377\377\377\33\377\377\377\362\377\377\377\375" + "\377\377\377\\\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\366\377\377\377" + "\375\377\377\377Q\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" + "\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\306" + "\377\377\377\375\377\377\377\\\377\377\377\377\377\377\377\377\377\377\377" + "\33\377\377\377\362\377\377\377\375\377\377\377Q\0\0\0\0\0\0\0\0\377\377" + "\377!\377\377\377\371\377\377\377\375\377\377\377M\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0\0\0" + "\0\0\0\0\377\377\377\25\377\377\377\370\377\377\377\364\377\377\377%\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\232\377\377\377\377\377" + "\377\377\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355" + "\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0" + "\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\204\377\377\377\377\377" + "\377\377\311\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" + "\260\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\222\377\377\377" + "\377\377\377\377\252\0\0\0\0\377\377\377\307\377\377\377\355\377\377\377" + "%\377\377\377K\377\377\377\374\377\377\377\260\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\377\377\377l\377\377\377\376\377\377\377\333\377\377" + "\377\243\377\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\345\377\377\377\375\377" + "\377\377M\377\377\377\13\377\377\377\351\377\377\377\372\377\377\377)\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\317\377\377\377\377\377\377\377\277\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377" + "\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\362\377\377\377" + "\363\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377" + "\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\377\377\377U\377\377\377\374\377\377\377\316\377\377\377\247" + "\377\377\377\377\377\377\377\206\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\216\377\377\377\345\377\377" + "\377\377\377\377\377\377\377\377\377\376\377\377\377\275\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376" + "\377\377\377\271\377\377\377\364\377\377\377\377\377\377\377\377\377\377" + "\377\313\377\377\377\13\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0" + "\0\0\0\377\377\377\13\377\377\377\272\377\377\377\371\377\377\377\377\377" + "\377\377\377\377\377\377\355\377\377\377\200\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\361\377\377\377\377" + "\377\377\377\377\377\377\377\325\377\377\377\377\377\377\377\332\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\3775\377\377\377" + "\327\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\267\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\205\377" + "\377\377\361\377\377\377\363\377\377\377\377\377\377\377\374\377\377\377" + "\364\377\377\377\367\377\377\377\354\377\377\377%\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\350\377\377\377\377\377" + "\377\377\377\377\377\377\360\377\377\377\360\377\377\377\375\377\377\377" + "\243\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" + "\376\377\377\377\215\377\377\377\350\377\377\377\377\377\377\377\377\377" + "\377\377\346\377\377\3772\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\301\377\377\377\370\377\377\377\364\377\377\377\364\377\377" + "\377\360\377\377\377\350\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\301\377\377\377\370\377\377\377\364\377" + "\377\377\364\377\377\377\360\377\377\377\350\377\377\377%\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\375\377" + "\377\377\252\0\0\0\0\0\0\0\0\377\377\377S\377\377\377\354\377\377\377\363" + "\377\377\377I\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\342\377\377" + "\377\332\377\377\377\374\377\377\377\377\377\377\377\276\377\377\377\353" + "\377\377\377\377\377\377\377\352\377\377\377)\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\214\377\377\377\371\377\377\377\212\377\377\377" + "\350\377\377\377\377\377\377\377\377\377\377\377\346\377\377\3772\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377u\377\377\377" + "\351\377\377\377\377\377\377\377\377\377\377\377\364\377\377\377\222\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\213\377" + "\377\377\371\377\377\377\262\377\377\377\365\377\377\377\377\377\377\377" + "\377\377\377\377\313\377\377\377\13\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\361\377\377\377\377\377\377\377" + "\377\377\377\377\310\377\377\377\347\377\377\377\315\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\301\377\377\377\351\377" + "\377\377)\377\377\377\326\377\377\377\377\377\377\377\377\377\377\377\372" + "\377\377\377M\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" + "\224\377\377\377\365\377\377\377\377\377\377\377\377\377\377\377\373\377" + "\377\377\300\377\377\377=\0\0\0\0\377\377\377\377\377\377\377\377\377\377" + "\377\13\377\377\377\332\377\377\377\360\377\377\377\373\377\377\377\377\377" + "\377\377\376\377\377\377\364\377\377\377\367\377\377\377\354\377\377\377" + "%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\301\377\377\377\354" + "\377\377\3772\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\364\377\377\377\275" + "\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377I\377\377\377\364\377" + "\377\377\330\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\267\377\377\377" + "\367\377\377\377\\\377\377\377\377\377\377\377\377\377\377\377\335\377\377" + "\377\360\377\377\3778\0\0\0\0\377\377\377~\377\377\377\224\0\0\0\0\377\377" + "\377\13\377\377\377\332\377\377\377\342\377\377\377\377\377\377\377\377\0" + "\0\0\0\377\377\377\275\377\377\377\373\377\377\377\255\0\0\0\0\0\0\0\0\377" + "\377\377r\377\377\377\370\377\377\377\315\0\0\0\0\377\377\377\377\377\377" + "\377\377\377\377\377I\377\377\377\364\377\377\377\330\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\254\377\377\377\367\377\377\377\\\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\365\377\377\377\364\377" + "\377\377\364\377\377\377\364\377\377\377\360\377\377\377\360\377\377\377" + "\354\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313" + "\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\7\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\313\377\377\377\372\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\306\377\377\377\375" + "\377\377\3778\377\377\377\13\377\377\377\364\377\377\377\334\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\364" + "\377\377\377\376\377\377\377\370\377\377\377\364\377\377\377\376\377\377" + "\377\374\377\377\377\320\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\3778\377\377\377\372\377\377\377\376\377\377\377\307\377\377\377" + "O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377" + "\377\223\377\377\377\377\377\377\377\234\377\377\377\243\377\377\377\376" + "\377\377\377\217\377\377\377\373\377\377\377v\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\331\377\377\377\377\377" + "\377\377\377\377\377\377\367\377\377\3778\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\323" + "\377\377\377\374\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\245\377\377\377\377\377" + "\377\377\215\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\375\377\377" + "\377\322\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\260\377\377\377\354\377\377\377\236\377\377\377\326\377\377" + "\377\361\377\377\377\224\377\377\377\341\377\377\377\314\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313" + "\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\325" + "\377\377\377\374\377\377\3772\377\377\377\215\377\377\377\241\377\377\377" + "\13\377\377\377\361\377\377\377\367\377\377\377)\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376" + "\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\307\377\377\377" + "\376\377\377\377l\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\200\377\377\377\363\377\377\377\376" + "\377\377\377s\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" + "\377\377\240\377\377\377\377\377\377\377\363\377\377\377V\377\377\377\374" + "\377\377\377\333\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377K\377\377\377\374\377\377\377\333\377\377\377\274\377\377\377" + "\310\377\377\377\251\377\377\377=\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\314\377\377\377\376\377\377\377l\377\377\377" + "j\377\377\377\237\377\377\377\223\377\377\377%\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\342\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\3778\377\377\377\372\377\377\377\376\377\377\377" + "\237\0\0\0\0\377\377\377\254\377\377\377\377\377\377\377\243\0\0\0\0\377" + "\377\377\377\377\377\377\377\377\377\377\25\377\377\377\361\377\377\377\366" + "\377\377\377\33\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\366\377\377\377" + "\355\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\323\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\323\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" + "\377\224\377\377\377\374\377\377\377\377\377\377\377\314\377\377\377\33\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\274\377\377\377\377\377\377\377\370\377\377\377\370\377\377\377\370\377" + "\377\377\370\377\377\377\373\377\377\377\321\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\264\377\377\377" + "\377\377\377\377\377\377\377\377\262\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\337" + "\377\377\377\377\377\377\377\271\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\377\377\377\25\377\377\377\361\377\377\377\352\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377U\377\377\377\237\377\377\377\376\377\377\377l\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\377" + "\377\377\377\266\377\377\377\213\377\377\377\377\377\377\377\304\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377" + "\377\377\377\377\377\265\377\377\377E\377\377\377y\377\377\377\337\377\377" + "\377\377\377\377\377\227\0\0\0\0\377\377\377\377\377\377\377\377\377\377" + "\377\13\377\377\377\352\377\377\377\375\377\377\377Q\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\324\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377K\377\377\377\374\377\377\377\337\377\377\377Z\377\377\377" + "p\377\377\377p\377\377\377f\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377)\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377" + "\377\3775\377\377\377\371\377\377\377\367\377\377\377)\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\313\377\377\377\376\377\377\377\224\377\377\377m\377\377\377v\377" + "\377\377h\377\377\377\362\377\377\377\366\377\377\377%\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377" + "\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377" + "\377\377\377\377\377\377\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\377\377\377\377\300\377\377\377\372\377" + "\377\377\377\377\377\377\236\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\313\377\377\377\370\377\377\377\366\377\377\377" + "\317\377\377\377\243\377\377\377\376\377\377\377\372\377\377\377\333\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" + "\367\377\377\377\304\377\377\377\377\377\377\377\251\377\377\377\13\377\377" + "\377\361\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\377\377" + "\377U\377\377\377\374\377\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\314\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\335\377\377\377\376\377\377\377l\377\377\377\377\377" + "\377\377\377\377\377\377U\377\377\377\374\377\377\377\336\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\317\377\377\377\376\377\377\377l\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" + "\243\0\0\0\0\0\0\0\0\377\377\377`\377\377\377\373\377\377\377\366\377\377" + "\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377`\377\377\377\374" + "\377\377\377\377\377\377\377\336\377\377\377\205\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" + "\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377" + "\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\33\377\377\377\371\377\377\377\360\377\377\377\33\0\0\0\0\377\377\377\320" + "\377\377\377\376\377\377\377_\0\0\0\0\377\377\377\377\377\377\377\377\377" + "\377\377U\377\377\377\375\377\377\377\277\377\377\377\33\377\377\377\366" + "\377\377\377\376\377\377\377m\377\377\377\213\377\377\377\377\377\377\377" + "\243\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\324\377\377\377\377\377\377\377\377\377\377\377\355\377\377\377\33\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\204" + "\377\377\377\377\377\377\377\304\377\377\377\204\377\377\377\377\377\377" + "\377\260\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\355\377\377" + "\377\33\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\266\377\377\377\377\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\266\377\377\377\377\377" + "\377\377\207\377\377\377K\377\377\377\374\377\377\377\327\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377}\377\377\377" + "\377\377\377\377\373\377\377\377\313\377\377\377\303\377\377\377\374\377" + "\377\377\377\377\377\377\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\351\377" + "\377\377\300\377\377\377\365\377\377\377\377\377\377\377\316\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\346\377\377" + "\377\377\377\377\377\365\377\377\377\305\377\377\377\315\377\377\377\376" + "\377\377\377\366\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377}\377\377\377\376\377\377\377\377\377\377\377\325\377\377\377\321" + "\377\377\377\376\377\377\377\377\377\377\377\332\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\3778\377\377\377\371\377\377\377\377\377" + "\377\377\335\377\377\377\263\377\377\377\351\377\377\377\377\377\377\377" + "\304\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377S\377\377" + "\377\330\377\377\377\343\377\377\377\377\377\377\377\364\377\377\377\327" + "\377\377\377\333\377\377\377\322\377\377\377\33\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\3778\377\377\377\372\377\377\377\376\377\377\377\275" + "\377\377\377\307\377\377\377\376\377\377\377\377\377\377\377\324\377\377" + "\377y\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" + "\377\377\377\377\377\377\377\377\370\377\377\377\306\377\377\377\356\377" + "\377\377\377\377\377\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\336\377\377\377\333\377\377\377\327\377" + "\377\377\377\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\336\377\377\377\333" + "\377\377\377\327\377\377\377\377\377\377\377\366\377\377\377)\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\375" + "\377\377\377\252\0\0\0\0\377\377\377`\377\377\377\373\377\377\377\377\377" + "\377\377\242\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\355" + "\377\377\377\377\377\377\377\346\377\377\377\362\377\377\377\377\377\377" + "\377\362\377\377\377\347\377\377\377\377\377\377\377\215\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377" + "\377\377\377\370\377\377\377\306\377\377\377\356\377\377\377\377\377\377" + "\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377u\377" + "\377\377\376\377\377\377\377\377\377\377\321\377\377\377\307\377\377\377" + "\375\377\377\377\377\377\377\377\243\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377" + "\352\377\377\377\300\377\377\377\365\377\377\377\377\377\377\377\316\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377}\377\377\377\376" + "\377\377\377\377\377\377\377\325\377\377\377\321\377\377\377\376\377\377" + "\377\377\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377\366\377\377\377\377" + "\377\377\377\335\377\377\377\322\377\377\377\343\377\377\377%\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377u\377\377\377\377\377\377\377\370" + "\377\377\377\277\377\377\377\262\377\377\377\346\377\377\377\377\377\377" + "\377\231\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377" + "\315\377\377\377\330\377\377\377\370\377\377\377\377\377\377\377\335\377" + "\377\377\327\377\377\377\333\377\377\377\322\377\377\377\33\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377l\0\0" + "\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\341\377\377\377\376\377\377" + "\377v\0\0\0\0\0\0\0\0\377\377\377!\377\377\377\371\377\377\377\366\377\377" + "\377)\377\377\377\377\377\377\377\377\377\377\377\313\377\377\377\377\377" + "\377\377\205\377\377\377\13\377\377\377\364\377\377\377\376\377\377\377Q" + "\377\377\377!\377\377\377\371\377\377\377\352\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377I\377\377\377\372\377\377\377\376\377\377\377v\377" + "\377\377\33\377\377\377\362\377\377\377\376\377\377\377}\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\335\377\377\377\376\377\377" + "\377v\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\364\377\377\377\372\377" + "\377\3772\377\377\377\377\377\377\377\377\0\0\0\0\377\377\3775\377\377\377" + "\323\377\377\377\333\377\377\377\333\377\377\377\327\377\377\377\377\377" + "\377\377\377\377\377\377\326\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320\377\377\377\355\377\377\377" + "\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\313\377\377\377\371\377\377\377\33\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377}\377\377" + "\377\313\377\377\377\257\377\377\377\13\0\0\0\0\377\377\377\223\377\377\377" + "\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\316" + "\377\377\377\352\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\377\377\377z\377\377\377\325\377\377\377\33\377" + "\377\377\13\377\377\377\314\377\377\377\267\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377!\377\377\377\373\377\377\377" + "\211\377\377\377!\377\377\377\374\377\377\377\200\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\205\377\377\377\370" + "\377\377\377\377\377\377\377\377\377\377\377\345\377\377\377\200\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\333\377" + "\377\377\377\377\377\377\377\377\377\377\321\0\0\0\0\377\377\377r\377\377" + "\377z\377\377\377%\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\25\377\377\377\337\377\377\377\377\377\377\377\375\377\377\3778\0\0" + "\0\0\377\377\377U\377\377\377\365\377\377\377\256\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\255\377\377\377\275" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\314\377\377\377\376\377\377\377b\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\33\377\377\377\371\377\377\377\333\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377~\377\377\377" + "\347\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\361\377\377\377\227\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\312\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\322\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\312\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\322\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\261\377\377\377\377\377\377\377" + "\215\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" + "\25\377\377\377\361\377\377\377\363\377\377\377E\377\377\377\375\377\377" + "\377\377\377\377\377V\377\377\377\324\377\377\377\366\377\377\377%\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" + "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377j\377\377" + "\377\375\377\377\377\361\377\377\377%\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\215\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377b\377\377\377\374\377\377\377\375\377\377" + "\377Q\377\377\377K\377\377\377\374\377\377\377\332\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\375\377\377\377" + "\377\377\377\377\374\377\377\377\376\377\377\377\377\377\377\377\375\377" + "\377\377s\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\312" + "\377\377\377\377\377\377\377\360\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\376\377\377\377\213\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\377\377" + "\377\377\315\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\333\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\321\377\377\377\377\377\377\377\315\377" + "\377\377q\377\377\377\221\377\377\377\363\377\377\377\377\377\377\377\364" + "\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377G\377\377\377\330\377\377\377\343\377\377\377c\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "G\377\377\377\330\377\377\377\343\377\377\377c\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377V\377\377\377\375\377\377" + "\377\376\377\377\377\214\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377\374\377\377\377" + "\377\377\377\377m\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\330\377\377\377\377\377\377\377\271\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377U\377\377\377" + "\375\377\377\377\252\0\0\0\0\377\377\377\233\377\377\377\366\377\377\377" + "\377\377\377\377\377\377\377\377\376\377\377\377i\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\377\377\377\334\377\377\377\376\377\377\377U\377" + "\377\377!\377\377\377\371\377\377\377\363\377\377\377%\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\371\377" + "\377\377)\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377" + "\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377" + "\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "K\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\375\377\377\377)\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377l\0\0\0\0\377" + "\377\377\377\377\377\377\377\377\377\377K\377\377\377\374\377\377\377\333" + "\0\0\0\0\0\0\0\0\377\377\377\247\377\377\377\327\377\377\377\322\377\377" + "\377\300\377\377\377\13\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\312\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\364\377\377\377%\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" + "\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" + "\377\377\377\377\377\377\377\252\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\332\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377" + "\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\313\377\377\377\363\377\377\377\301\377\377" + "\377\373\377\377\377\356\377\377\377\333\377\377\377\352\377\377\377\333" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377w\377\377\377\371\377\377\377\366\377\377\377!\377\377" + "\377\360\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\377\377" + "\377K\377\377\377\374\377\377\377\327\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\312\377\377\377\377\377\377\377\251\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\326\377\377\377" + "\247\377\377\377\262\377\377\377\351\377\377\377\377\377\377\377\355\377" + "\377\377\33\377\377\377\377\377\377\377\377\377\377\377K\377\377\377\374" + "\377\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\224\377\377\377\377\377\377\377\356\377\377\377\340\377\377\377\343\377" + "\377\377\376\377\377\377\377\377\377\377\304\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\365\377\377\377\377" + "\377\377\377\377\377\377\377\364\377\377\377\247\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0" + "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\321\377\377" + "\377\376\377\377\377i\377\377\377\33\377\377\377\365\377\377\377\355\377" + "\377\377\13\0\0\0\0\377\377\377\377\377\377\377\377\377\377\3778\377\377" + "\377\372\377\377\377\327\377\377\377c\377\377\377\377\377\377\377\377\377" + "\377\377\271\377\377\377\205\377\377\377\376\377\377\377i\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377l\377\377\377\377\377" + "\377\377\377\377\377\377\226\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\344\377\377\377\376\377" + "\377\377\372\377\377\377\367\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377!\377\377\377\371\377" + "\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376\377\377" + "\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\375\377\377\377\326\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\33\377" + "\377\377\364\377\377\377\363\377\377\377%\0\0\0\0\377\377\377\335\377\377" + "\377\375\377\377\377M\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\377\377\377\177\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\205\377" + "\377\377\376\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\377\377\377\377\257\0\0\0\0\0\0\0\0\377" + "\377\377;\377\377\377\373\377\377\377\372\377\377\3778\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\247\377\377\377\377\377\377\377\345\377" + "\377\377\33\0\0\0\0\0\0\0\0\377\377\377O\377\377\377X\0\0\0\0\377\377\377" + "\377\377\377\377\377\377\377\377\13\377\377\377\351\377\377\377\377\377\377" + "\377\252\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\375\377\377\377\332\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\306\377\377\377" + "\377\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\344\377\377\377" + "\372\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377%\377\377\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\232\377\377\377" + "\377\377\377\377\264\0\0\0\0\0\0\0\0\377\377\377\335\377\377\377\376\377" + "\377\377Q\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" + "\377\377\377\377\377\377\377\325\377\377\377\13\0\0\0\0\377\377\377;\377" + "\377\377\373\377\377\377\363\377\377\377%\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\354\377\377\377\366" + "\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\354\377\377\377\366\377\377\377" + "%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377" + "\377\377\375\377\377\377\237\377\377\377j\377\377\377\374\377\377\377\376" + "\377\377\377\214\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377" + "\377\377\361\377\377\377\352\0\0\0\0\377\377\377\306\377\377\377\375\377" + "\377\377=\377\377\377\211\377\377\377\377\377\377\377\252\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\325" + "\377\377\377\13\0\0\0\0\377\377\377;\377\377\377\373\377\377\377\363\377" + "\377\377%\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\351" + "\377\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0\377\377\377r\377\377\377" + "\375\377\377\377\363\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\224\377\377\377\377\377\377\377\257\0\0\0\0\0\0\0\0\377\377" + "\377;\377\377\377\373\377\377\377\372\377\377\3778\377\377\377\377\377\377" + "\377\377\377\377\377\13\377\377\377\351\377\377\377\377\377\377\377\252\0" + "\0\0\0\0\0\0\0\377\377\377b\377\377\377\375\377\377\377\332\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\312\377\377\377\377" + "\377\377\377\372\377\377\377f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" + "\333\377\377\377\13\0\0\0\0\0\0\0\0\377\377\377S\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\306\377\377" + "\377\376\377\377\377U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0" + "\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\204\377\377\377\377\377\377\377" + "\322\0\0\0\0\0\0\0\0\377\377\377\241\377\377\377\377\377\377\377\264\0\0" + "\0\0\377\377\377\377\377\377\377\377\377\377\377\224\377\377\377\377\377" + "\377\377\266\377\377\377;\377\377\377\374\377\377\377\377\377\377\377\226" + "\377\377\377l\377\377\377\377\377\377\377\300\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\377\377\377u\377\377\377\376\377\377\377\361\377\377" + "\377\325\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377s\377\377\377\377\377\377\377\333\0\0" + "\0\0\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\277\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\314\377\377\377\377\377\377\377\333\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377E\377\377\377\217\377\377" + "\377\373\377\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" + "\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\376\377" + "\377\377\247\377\377\377I\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\364\377\377\377\245\377\377\377\372\377\377\377\355\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377" + "\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\205\377\377\377" + "\271\377\377\377\376\377\377\377\303\377\377\377\262\377\377\377\377\377" + "\377\377\315\377\377\377l\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\220\377\377\377\341\377\377\377\377" + "\377\377\377\377\377\377\377\233\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\257\377\377\377)\377\377\377" + "\313\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\\\377\377" + "\377\377\377\377\377\377\377\377\377\13\377\377\377\342\377\377\377\377\377" + "\377\377\373\377\377\377\377\377\377\377\265\0\0\0\0\377\377\377\266\377" + "\377\377\377\377\377\377\215\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377" + "\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\360\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\261\377\377\377\377\377\377\377" + "\377\377\377\377\332\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377`\377\377\377\262\377\377\377\251\377\377\377\354" + "\377\377\377\373\377\377\377\261\377\377\377\262\377\377\377\224\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377v\377\377\377\263\377\377\377\255\377\377\377\255\377" + "\377\377\255\377\377\377\255\377\377\377\263\377\377\377\224\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\366\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" + "\13\377\377\377\356\377\377\377\363\371\371\377.\377\377\377\362\377\377" + "\377\375\377\377\377B\377\377\377\335\377\377\377\366\377\377\377%\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" + "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377\373" + "\377\377\377\376\377\377\377s\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\205\377\377\377\271\377\377\377" + "\332\377\377\377\377\377\377\377\373\377\377\377r\0\0\0\0\377\377\377\377" + "\377\377\377\377\377\377\377\33\377\377\377\362\377\377\377\377\377\377\377" + "\242\377\377\377E\377\377\377x\377\377\377\374\377\377\377\336\377\377\377" + "K\377\377\377\13\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" + "\377\216\377\377\377]\0\0\0\0\0\0\0\0\377\377\377\251\377\377\377\377\377" + "\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\312\377\377\377\377\377\377\377\356\377\377\377v\0\0\0\0\377\377\377\220" + "\377\377\377\374\377\377\377\363\377\377\377\33\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377\376\377" + "\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377j\377\377\377\374\377\377\377\367\377\377\377\260\377\377\377" + "\342\377\377\377\377\377\377\377\376\377\377\377\224\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\3775\377\377\377\347\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\343\377\377\377\374\377\377" + "\377\360\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\25\377\377\377\337\377\377\377\377\377\377\377\361\377\377\377\200" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377b\377\377\377\232\377\377\377\232\377\377\377\232\377\377\377" + "\232\377\377\377\232\377\377\377\232\377\377\377}\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377_\377\377\377" + "\345\377\377\377\377\377\377\377\361\377\377\3778\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\376\377" + "\377\377\344\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\377\377\377K\377\377\377\374\377\377\377\245\377\377\377l\377\377\377" + "\377\377\377\377\344\377\377\377v\377\377\377;\377\377\377\375\377\377\377" + "l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377;\377\377\377\373\377" + "\377\377\376\377\377\377\301\377\377\377\271\377\377\377\374\377\377\377" + "\376\377\377\377v\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\224\377\377\377\377\377\377\377\304\377\377\377e\377\377\377x\377\377" + "\377\300\377\377\377\376\377\377\377\367\377\377\377)\377\377\377\377\377" + "\377\377\377\377\377\377\13\377\377\377\361\377\377\377\367\377\377\377)" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\307\377\377\377\376\377\377\377i\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\343\377" + "\377\377|\377\377\377\202\377\377\377\211\377\377\377\202\377\377\377\13" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377" + "\355\377\377\377\373\377\377\377\300\377\377\377\276\377\377\377\276\377" + "\377\377\302\377\377\377G\0\0\0\0\377\377\377\377\377\377\377\377\377\377" + "\377U\377\377\377\374\377\377\377\352\377\377\377\13\0\0\0\0\377\377\377" + "\307\377\377\377\374\377\377\377\377\377\377\377\372\377\377\377)\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377" + "\377\240\377\377\377\200\377\377\377\210\377\377\377\202\377\377\377\371" + "\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377" + "\377\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" + "\377\377\377\377\377\377\377\377\377\377\377\311\377\377\377\343\377\377" + "\377\377\377\377\377\225\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\313\377\377\377\366\377\377\377]\377\377\377\375\377\377" + "\377\377\377\377\377\211\377\377\377\354\377\377\377\333\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377" + "\377V\377\377\377\252\377\377\377\377\377\377\377\244\377\377\377\354\377" + "\377\377\334\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377U\377\377" + "\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\307" + "\377\377\377\376\377\377\377\177\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\374\377\377\377\324\377\377\377)\0\0\0\0\377\377\377" + "\377\377\377\377\377\377\377\377U\377\377\377\374\377\377\377\327\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\307\377\377\377\376\377\377\377l\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377" + "\377\377\365\377\377\377\357\377\377\377\377\377\377\377\377\377\377\377" + "\224\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\210\377\377\377\335\377\377\377\377\377\377\377" + "\377\377\377\377\315\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377" + "\377\377\355\377\377\377\366\377\377\377)\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\254\377\377" + "\377c\377\377\377\377\377\377\377\273\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\377\377\377\13\377\377\377\361\377\377\377\340\377\377\377\277" + "\377\377\377\367\377\377\377\351\377\377\377\352\377\377\377\300\377\377" + "\377\375\377\377\377I\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\307\377\377\377\377\377\377\377\377\377\377\377\335\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377}\377\377\377\376\377\377\377\377\377\377\377\252\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\325\377\377\377\377\377\377\377\264\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\342\377\377\377\375\377\377\3778\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377I\377\377\377\340\377\377\377\240\0\0\0\0\0\0\0\0" + "\377\377\377}\377\377\377\341\377\377\377Z\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377Q\377\377\377\306\377\377\377" + "\366\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\332\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" + "\376\377\377\377b\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320\377\377\377\376" + "\377\377\377l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\317\377" + "\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\356\377\377\377" + "\372\377\377\377)\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" + "\333\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\351" + "\377\377\377\377\377\377\377\361\377\377\377\354\377\377\377\354\377\377" + "\377\354\377\377\377\376\377\377\377\376\377\377\377l\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377" + "\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\311\0\0\0\0\0\0\0\0" + "\377\377\377\335\377\377\377\376\377\377\377i\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377_\0\0\0\0" + "\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377)\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377" + "\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\377" + "\377\377\374\377\377\377\377\377\377\377\311\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\377" + "\377\377\313\377\377\377\371\377\377\377%\377\377\377\224\377\377\377\377" + "\377\377\377\252\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" + "\377\377\377\376\377\377\377_\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\355\377\377\377\366\377\377\377)\377\377\377\377\377\377\377\377\377\377" + "\377\13\377\377\377\356\377\377\377\372\377\377\377)\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\345\377\377\377\376\377\377\377i\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377b\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\321\377\377\377\376\377\377\377l\377\377\377\377" + "\377\377\377\377\377\377\377\13\377\377\377\356\377\377\377\372\377\377\377" + ")\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377" + "\377\377\377\377\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\333\377\377\377\377" + "\377\377\377\377\377\377\377\354\377\377\377\300\377\377\377\\\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377" + "\377i\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\355" + "\377\377\377\375\377\377\377M\377\377\377\13\377\377\377\355\377\377\377" + "\375\377\377\377=\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377U\377" + "\377\377\374\377\377\377\333\377\377\377\217\377\377\377\373\377\377\377" + "\361\377\377\377\312\377\377\377\241\377\377\377\377\377\377\377\215\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\253\377" + "\377\377\377\377\377\377\377\377\377\377\315\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\335\377\377\377" + "\376\377\377\377i\0\0\0\0\377\377\377\342\377\377\377\375\377\377\377Q\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\315\377\377\377\377\377\377\377\342\377\377\377\13\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377V\377\377\377\375\377" + "\377\377\377\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377c\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377l\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\360\377\377" + "\377\33\377\377\377\205\377\377\377\365\377\377\377\377\377\377\377\364\377" + "\377\377\\\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "|\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\307" + "\377\377\377\377\377\377\377\377\377\377\377\370\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\244\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\205" + "\377\377\377\376\377\377\377\336\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\377\377\377\302\377\377\377\377\377\377\377\242\377\377" + "\377\374\377\377\377\264\377\377\377\33\377\377\377\371\377\377\377\316\377" + "\377\377\377\377\377\377\377\377\377\377b\377\377\377\376\377\377\377\326" + "\377\377\377\25\377\377\377\362\377\377\377\377\377\377\377\304\377\377\377" + "\372\377\377\377\360\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\317" + "\377\377\377\376\377\377\377_\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377\361\377\377\377\334\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\377\377\377`\377\377\377\374\377\377\377\343\377" + "\377\377\313\377\377\377\377\377\377\377\215\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\306\377" + "\377\377\371\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377s\377\377\377\377\377\377\377\304\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\320\377" + "\377\377\375\377\377\377=\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\362" + "\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377l\377\377\377\373\377\377\377\376\377\377\377\214\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\204\377\377\377\377\377\377\377\333\0\0" + "\0\0\377\377\377\377\377\377\377\377\377\377\377\224\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377m\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377" + "\377\377\366\377\377\377\367\377\377\377)\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\317\377\377\377\376\377\377\377e\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\330\377\377\377\371\377\377\377)\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\365\377\377\377" + "\363\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\377\377\377\13\377\377\377\351\377\377\377\375\377\377\377=\0\0\0\0\0\0" + "\0\0\377\377\377}\377\377\377\374\377\377\377\366\377\377\377%\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377p\377" + "\377\377M\377\377\377!\377\377\377\373\377\377\377\333\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\234\377" + "\377\377\374\377\377\377\377\377\377\377\320\377\377\377%\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\320\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\337\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\271\377\377\377\377\377\377\377\377\377\377" + "\377\267\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\251\377\377\377V\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377K\377\377" + "\377\374\377\377\377\245\377\377\377|\377\377\377\377\377\377\377y\0\0\0" + "\0\377\377\377\247\377\377\377\376\377\377\377l\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\240\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\373\377\377\377\377\377\377\377\304\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" + "\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377" + "\376\377\377\377l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\334" + "\377\377\377\377\377\377\377\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" + "\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377K\377\377\377\374\377\377\377\327\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" + "\377\355\377\377\377\366\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\377\377\377\25\377\377\377\362\377" + "\377\377\375\377\377\377=\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" + "\377\371\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\313\377\377\377\376\377\377\377b\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377\355\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377" + "\377\377\257\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\224\377\377\377\377\377\377\377\331\0\0\0\0\377\377\377j\377\377\377\376" + "\377\377\377\366\377\377\377)\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\313\377\377\377\371\377\377\377\33\377\377\377\351\377\377\377" + "\371\377\377\377!\377\377\377\360\377\377\377\333\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\377" + "\377\377\33\377\377\377\365\377\377\377\365\377\377\377\361\377\377\377\333" + "\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377K\377\377\377\374\377" + "\377\377\364\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\340\377\377" + "\377\376\377\377\377l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\224\377\377\377\377\377\377\377\257\0\0\0\0\377\377\377\13\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377I\377\377\377" + "\373\377\377\377\363\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377\345\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\377\377\377\377\243\0\0\0\0\377\377\377" + "\330\377\377\377\377\377\377\377\257\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "l\377\377\377\373\377\377\377\375\377\377\377M\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366" + "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\313\377\377\377\376\377\377\377b\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\361\377\377\377\355\377\377\377\33\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\377\377\377!\377\377\377\372\377\377\377\337" + "\377\377\377\257\377\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\324\377\377\377\370\377\377\377" + "\360\377\377\377\323\377\377\377\255\377\377\377\375\377\377\377\333\377" + "\377\377\371\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\377\377\377l\377\377\377\376\377\377\377\337\377\377\377\326\377\377\377" + "\377\377\377\377\234\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\372\377\377" + "\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\377\377\377\232\377\377\377\377\377\377\377\346\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\232\377\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\215\377\377\377\376\377\377\377\376\377\377\377\313\377" + "\377\377\224\377\377\377\202\377\377\377\374\377\377\377\332\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377" + "\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377\376\377\377" + "\377i\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\314\377\377\377" + "\376\377\377\377b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\377\377\377\13\377\377\377\355\377\377\377\374\377" + "\377\377)\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0" + "\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\352\377" + "\377\377\377\377\377\377\321\377\377\377\321\377\377\377\316\377\377\377" + "\322\377\377\377\316\377\377\377\315\377\377\377G\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" + "\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\13\377\377\377\361\377\377\377\377\377\377\377\362\377\377" + "\377\366\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0" + "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" + "\377\377\377\377\370\377\377\377\366\377\377\377\376\377\377\377\214\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\361\377\377" + "\377\333\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\377\377\377" + "\223\377\377\377\377\377\377\377\252\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\355\377\377\377\366\377\377\377%\377\377\377\377\377" + "\377\377\377\377\377\377\13\377\377\377\355\377\377\377\374\377\377\377)" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\317\377\377\377\376\377\377\377l\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377" + "\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377\376\377\377" + "\377i\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\355\377" + "\377\377\374\377\377\377)\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377" + "\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" + "\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377u\377\377\377\302\377\377\377\357\377\377\377\377\377\377\377\377\377" + "\377\377\276\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\374\377\377" + "\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" + "\377\240\377\377\377\377\377\377\377\266\377\377\377s\377\377\377\377\377" + "\377\377\315\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" + "\25\377\377\377\361\377\377\377\361\377\377\377\320\377\377\377\344\377\377" + "\377\303\377\377\377\356\377\377\377\316\377\377\377\375\377\377\377M\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\275\377" + "\377\377\377\377\377\377\377\377\377\377\314\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377v\377\377\377\377" + "\377\377\377\321\377\377\377M\377\377\377\375\377\377\377\327\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\307\377\377\377\377\377\377\377\346\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377b\377\377\377" + "\237\377\377\377\374\377\377\377\336\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377\263\377\377\377f\377\377\377\13\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\371\371\377.\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377B\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\25\377\377\377\304\377\377\377\322\377\377\377S\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\214\377\377\377\374\377" + "\377\377\33\377\377\377\222\377\377\377\374\377\377\377%\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\247\377\377\377\377" + "\377\377\377\302\377\377\377\\\377\377\3772\377\377\377\264\377\377\377\377" + "\377\377\377\326\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\315\377\377\377\377\377\377\377\257\377\377\377;\377\377\377\375\377" + "\377\377b\377\377\377\13\377\377\377\360\377\377\377\337\377\377\377\377" + "\377\377\377\377\377\377\377\204\377\377\377\377\377\377\377\322\0\0\0\0" + "\377\377\377\33\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377" + "\217\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\247\377\377\377\377\377" + "\377\377\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\374\377\377" + "\377\326\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377\317\377\377\377\374\377\377\3778\377\377\377\13\377" + "\377\377\351\377\377\377\366\377\377\377\33\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377\374" + "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\347\377\377\377\367\377\377" + "\377\232\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377_\377" + "\377\377\355\377\377\377\367\377\377\377}\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\261\377\377\377\377\377\377\377\257\0\0" + "\0\0\0\0\0\0\377\377\377\204\377\377\377\377\377\377\377\322\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\213\377\377\377\376\377\377\377U\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\375\377\377" + "\377\373\377\377\377s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\214\377\377\377}\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377j\377\377\377\376\377\377\377\333\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377~\377\377\377\202\377\377\377\202\377\377" + "\377\201\377\377\377\231\377\377\377\377\377\377\377\343\377\377\377z\377" + "\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\205\377\377" + "\377j\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\376\377\377\377\343" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\255\377\377" + "\377\377\377\377\377\264\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\356\377" + "\377\377\372\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\327\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\356" + "\377\377\377\375\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\355\377" + "\377\377\367\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\377\377\3775\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\377\377" + "\377\377\257\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377_\377\377\377\355\377\377\377\367\377\377\377}\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\3775\377\377\377\347\377\377\377\367\377\377\377\232\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\3772\377\377\377\327\377\377\377\377\377\377\377\375\377\377\377" + "z\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\3775\377\377\377\362\377\377\377\377\377\377\377" + "\346\377\377\377V\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377S\377\377\377\320\377\377\377" + "\305\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\377\377\377K\377\377\377\374\377\377\377\252\377\377\377K\377\377\377\374" + "\377\377\377\376\377\377\377\363\377\377\377\377\377\377\377\377\377\377" + "\377l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\335\377\377\377" + "\376\377\377\377l\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\373\377\377\377" + "\363\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" + "\377\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\343\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\232\377\377\377\377\377\377\377\356\377\377\377)\0\0\0\0\0\0" + "\0\0\377\377\3775\377\377\377\260\377\377\377\13\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377U\0\0\0\0\0\0" + "\0\0\377\377\377\276\377\377\377\377\377\377\377\346\377\377\377\13\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" + "\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\312\377\377\377\377\377\377\377\321\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0" + "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\355\377\377\377\366\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377j\377\377\377\330\377\377\377%\0" + "\0\0\0\0\0\0\0\377\377\377\312\377\377\377\377\377\377\377\206\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377" + "\377\377\244\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377" + "\277\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" + "\377\355\377\377\377\366\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" + "\371\377\377\377%\377\377\377]\377\377\377f\377\377\377\13\377\377\377\361" + "\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\313\377\377\377\376\377\377\377i\0\0\0\0\377\377\377\232\377\377\377" + "\377\377\377\377\377\377\377\377\327\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\334\377\377\377\377\377\377\377\252\0\0\0\0\0\0" + "\0\0\377\377\377}\377\377\377\376\377\377\377\363\377\377\377%\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" + "\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\332\377\377\377\377\377\377\377\251\0\0" + "\0\0\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\355\377\377\377" + "\13\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" + "\377\377\377\252\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\375\377" + "\377\377Q\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\205" + "\377\377\377\304\377\377\377\13\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\362\377\377\377\375\377\377\377Q\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377" + "%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\312\377\377\377\377\377\377\377\264\0\0\0\0\0\0\0\0\377\377\377}\377" + "\377\377\376\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\330\377\377\377\376\377\377\377\372\377" + "\377\377\360\377\377\377\33\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\305\377\377\377\377\377\377\377\377\377\377\377\237" + "\377\377\377l\377\377\377\376\377\377\377\377\377\377\377\336\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\351\377\377" + "\377\376\377\377\377l\377\377\377K\377\377\377\374\377\377\377\372\377\377" + "\3772\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377;\377\377\377" + "\373\377\377\377\372\377\377\377=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" + "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377!\377\377" + "\377\372\377\377\377\347\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377" + "\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377" + "\377\377\376\377\377\377b\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\375\377" + "\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\224\377\377\377\377\377\377\377~\0\0\0\0\0\0\0\0\377\377\377U\377\377\377" + "\374\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\266\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\13\377\377\377e\0\0\0\0\377\377\377\377\377\377\377\377\377" + "\377\377\13\377\377\377\355\377\377\377\376\377\377\377v\0\0\0\0\0\0\0\0" + "\377\377\377s\377\377\377\376\377\377\377\332\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\317\377\377\377\377\377\377\377\251\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377j\377\377\377\375\377\377\377\326\377\377\377\302\377\377\377" + "\304\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0" + "\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355" + "\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\361\377\377\377=\377" + "\377\377V\377\377\377\374\377\377\377\375\377\377\377M\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361" + "\377\377\377\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\377\377\377" + "\313\377\377\377\371\377\377\377%\377\377\377\223\377\377\377\377\377\377" + "\377\252\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377" + "\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" + "\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\377\377\377\13" + "\377\377\377\355\377\377\377\376\377\377\377\215\0\0\0\0\0\0\0\0\377\377" + "\377V\377\377\377\374\377\377\377\367\377\377\377)\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377~\0\0\0\0\0\0" + "\0\0\377\377\377K\377\377\377\374\377\377\377\366\377\377\377)\377\377\377" + "\377\377\377\377\377\377\377\377\13\377\377\377\355\377\377\377\376\377\377" + "\377v\0\0\0\0\0\0\0\0\377\377\377s\377\377\377\375\377\377\377\332\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\3772\377\377\377n\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377`\377\377\377\373\377\377\377\366\377\377\377)\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\317\377\377" + "\377\376\377\377\377v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\314\377\377\377\376\377\377\377b\0\0\0\0" + "\0\0\0\0\377\377\377\254\377\377\377\377\377\377\377\332\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\366\377" + "\377\377\361\377\377\377\331\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\320\377\377\377\377" + "\377\377\377\377\377\377\377\273\377\377\377\205\377\377\377\377\377\377" + "\377\376\377\377\377\355\377\377\377\33\377\377\377\377\377\377\377\377\0" + "\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\336\377\377\377" + "\330\377\377\377\377\377\377\377\256\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\342\377\377\377\375\377" + "\377\377\326\377\377\377\376\377\377\377~\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\275\377\377\377\377\377\377" + "\377\345\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\323\377\377\377" + "\360\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377\33\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\0\377" + "\377\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\206\377\377\377\377\377\377" + "\377\377\377\377\377\260\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" + "\377\313\377\377\377\360\377\377\377\13\377\377\377\316\377\377\377\352\377" + "\377\377\13\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\205\377\377\377\365\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\356\377\377\3778\0\0\0\0\377\377\377\377\377" + "\377\377\377\377\377\377\224\377\377\377\377\377\377\377\311\0\0\0\0\377" + "\377\377K\377\377\377\374\377\377\377\316\377\377\377y\377\377\377\374\377" + "\377\377\273\377\377\377\377\377\377\377\377\377\377\377!\377\377\377\371" + "\377\377\377\377\377\377\377\315\377\377\377\242\377\377\377\360\377\377" + "\377\377\377\377\377\377\377\377\377\370\377\377\377\237\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377`\377\377\377\375\377\377\377\327\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\266\377\377\377\377\377\377\377\217\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\371\371\377.\377\377" + "\377M\0\0\0\0\0\0\0\0\371\371\377.\377\377\377M\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377|\377\377" + "\377s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\377\377\377\377\377\377" + "\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\232\377\377\377\377\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377!\377\377" + "\377\371\377\377\377\352\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\3778\377\377\377\372\377\377" + "\377\377\377\377\377\275\377\377\377\253\377\377\377\374\377\377\377\376" + "\377\377\377s\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "r\377\377\377\314\377\377\377\304\377\377\377\332\377\377\377\377\377\377" + "\377\321\377\377\377\307\377\377\377\271\377\377\377\13\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\263\377\377\377\377\377\377\377\377\377" + "\377\377\350\377\377\377\307\377\377\377\322\377\377\377\321\377\377\377" + "\310\377\377\377\33\377\377\377\377\377\377\377\377\377\377\3778\377\377" + "\377\373\377\377\377\377\377\377\377\325\377\377\377\242\377\377\377\275" + "\377\377\377\371\377\377\377\377\377\377\377\272\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377" + "\377\377\374\377\377\377\333\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\377\377\3778\377\377\377\373\377\377\377\377\377\377\377\321\377\377" + "\377\250\377\377\377\307\377\377\377\375\377\377\377\377\377\377\377\234" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\33\377\377\377" + "\362\377\377\377\377\377\377\377\313\377\377\377\214\377\377\377\345\377" + "\377\377\377\377\377\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\376\377\377\377\326\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\302\377\377\377\377\377\377\377\346\377\377\377\226\377\377\377\201" + "\377\377\377\320\377\377\377\377\377\377\377\347\377\377\377\13\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\266\377\377\377\377\377\377\377" + "\307\377\377\377\250\377\377\377\335\377\377\377\377\377\377\377\356\377" + "\377\377\33\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\326\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\343\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\207\377\377\377\374\377\377\377\266" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377V\377\377\377\375\377\377\377\247\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\306\377\377\377\377\377\377\377\376\377" + "\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377" + "\377\13\377\377\377\355\377\377\377\352\0\0\0\0\377\377\377s\377\377\377" + "\314\377\377\377\315\377\377\377v\377\377\377\245\377\377\377%\377\377\377" + "\377\377\377\377\377\377\377\377K\377\377\377\373\377\377\377\360\377\377" + "\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\335\377\377\377\376\377\377\377" + "~\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" + "\377\377\377\335\377\377\377\275\377\377\377\310\377\377\377\366\377\377" + "\377\377\377\377\377\346\377\377\377\33\377\377\377\377\377\377\377\377\0" + "\0\0\0\377\377\377\13\377\377\377\342\377\377\377\377\377\377\377\370\377" + "\377\377\300\377\377\377\276\377\377\377\371\377\377\377\377\377\377\377" + "\227\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\312\377\377\377" + "\377\377\377\377\325\377\377\377\303\377\377\377\361\377\377\377\377\377" + "\377\377\375\377\377\377f\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377K\377\377\377\374\377\377\377\362\377\377\377\316\377\377\377" + "\316\377\377\377\316\377\377\377\322\377\377\377\273\377\377\377\13\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377" + "\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\3778\377\377\377\371\377\377\377\377\377" + "\377\377\352\377\377\377\271\377\377\377\321\377\377\377\375\377\377\377" + "\372\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313" + "\377\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\355\377\377\377\366\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377u\377\377\377\325\377\377\377\316\377\377\377\371\377\377\377" + "\373\377\377\377\320\377\377\377\322\377\377\377\207\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\302\377\377\377\377\377\377\377" + "\365\377\377\377\266\377\377\377\324\377\377\377\377\377\377\377\375\377" + "\377\377=\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" + "\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\377\377\3778\377\377\377" + "\372\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\13\377\377\377\356\377\377\377\376\377\377\377\320\377\377\377" + "\316\377\377\377\316\377\377\377\316\377\377\377\322\377\377\377V\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\371\377\377" + "\377%\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\333\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" + "\376\377\377\377l\0\0\0\0\377\377\377\13\377\377\377\352\377\377\377\377" + "\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377j\377\377\377\375\377\377\377\377\377\377\377\321\377\377\377\302\377" + "\377\377\375\377\377\377\377\377\377\377\234\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377j\377\377\377\375\377\377\377\377\377\377\377\320" + "\377\377\377\307\377\377\377\375\377\377\377\377\377\377\377\216\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" + "\377\377\377\252\0\0\0\0\0\0\0\0\377\377\377\266\377\377\377\377\377\377" + "\377\336\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377" + "\351\377\377\377\377\377\377\377\370\377\377\377\306\377\377\377\264\377" + "\377\377\351\377\377\377\377\377\377\377\343\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377" + "\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377b\377\377\377\375\377\377\377\377\377\377\377\325" + "\377\377\377\307\377\377\377\374\377\377\377\377\377\377\377\227\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232" + "\377\377\377\377\377\377\377\377\377\377\377\304\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" + "\377\377\377\375\377\377\377_\377\377\377\33\377\377\377\365\377\377\377" + "\377\377\377\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\253\377\377\377\377\377\377\377\322\0\0\0\0\0\0\0\0\377\377\377" + "\275\377\377\377\377\377\377\377\315\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\366" + "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\334\377\377\377\377\377\377\377\372\377\377\377\310\377" + "\377\377\316\377\377\377\316\377\377\377\321\377\377\377\310\377\377\377" + "%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" + "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\317\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377" + "\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\307\377" + "\377\377\377\377\377\377\336\377\377\377\233\377\377\377\305\377\377\377" + "\376\377\377\377\377\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\376\377\377\377" + "\307\377\377\377\255\377\377\377\370\377\377\377\377\377\377\377\272\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377!\377\377\377\366" + "\377\377\377\377\377\377\377\346\377\377\377\271\377\377\377\270\377\377" + "\377\365\377\377\377\375\377\377\377M\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\255\377\377\377\377\377\377\377\373\377\377\377\257\377" + "\377\377\302\377\377\377\376\377\377\377\377\377\377\377\332\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377`\377\377\377\374\377\377" + "\377\377\377\377\377\332\377\377\377\233\377\377\377\260\377\377\377\367" + "\377\377\377\316\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377U\377\377\377\374\377\377\377\333\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\215\377" + "\377\377\377\377\377\377\342\377\377\377\242\377\377\377\237\377\377\377" + "\246\377\377\377\247\377\377\377X\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377\356\377\377\377\366\377\377\377)\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\356\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" + "\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377K\377\377\377\375\377\377\377\245\0\0\0\0\0\0\0\0\377" + "\377\377\233\377\377\377\377\377\377\377\356\377\377\377%\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" + "\377\377\376\377\377\377\302\377\377\377\262\377\377\377\322\377\377\377" + "\33\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\361\377\377" + "\377\333\0\0\0\0\377\377\377\320\377\377\377\371\377\377\377%\377\377\377" + "\223\377\377\377\377\377\377\377\252\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\356\377\377\377\366\377\377\377)\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\376\377" + "\377\377\274\377\377\377\255\377\377\377\370\377\377\377\377\377\377\377" + "\265\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377" + "\377\377\377\377\377\377\376\377\377\377\307\377\377\377\255\377\377\377" + "\370\377\377\377\377\377\377\377\272\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\255\377\377\377\377\377\377\377\373\377\377\377" + "\257\377\377\377\302\377\377\377\376\377\377\377\377\377\377\377\332\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\313\377" + "\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\341\377\377\377\377\377\377" + "\377\335\377\377\377\233\377\377\377\213\377\377\377\306\377\377\377\377" + "\377\377\377\352\377\377\377\13\377\377\377\377\377\377\377\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\241\377\377\377\377\377\377\377\365\377\377\377" + "\245\377\377\377\255\377\377\377\325\377\377\3772\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\275\377\377\377\377\377\377\377\361\377\377" + "\377\252\377\377\377\331\377\377\377\377\377\377\377\377\377\377\377\332" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\266\377\377\377\377\377\377\377\377\377\377\377\336\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\240\377\377" + "\377\377\377\377\377\377\377\377\377\207\377\377\377K\377\377\377\374\377" + "\377\377\377\377\377\377\315\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377U\377\377\377\374\377\377\377\372\377\377\3778\377\377\377" + "!\377\377\377\366\377\377\377\376\377\377\377\177\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\377\377" + "\377\377\377\377\377\377\352\377\377\377\13\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\267\377\377\377\377\377\377\377\377" + "\377\377\377\311\377\377\377\302\377\377\377\304\377\377\377\304\377\377" + "\377\271\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\13\377\377\377\361\377\377\377\327\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377b\377\377\377\374\377\377\377\377\377\377\377\225\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\316\377\377\377\333\0\0\0\0" + "\377\377\377\316\377\377\377\334\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377w\377\377\377\343\377" + "\377\377\375\377\377\377\201\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\377\377\377\13\377\377\377\244\377\377\377\13\0\0\0\0\0\0\0" + "\0\377\377\377\302\377\377\377\377\377\377\377\377\377\377\377\364\377\377" + "\377Z\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377~\377\377\377\370" + "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\275\377\377" + "\377\266\377\377\377\376\377\377\377\323\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\335\377\377\377\376\377\377\377~\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377" + "\377\373\377\377\377\363\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377I\377\377" + "\377\357\377\377\377\377\377\377\377\364\377\377\377)\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\376\377\377\377\377\377\377" + "\377\244\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377\232\377\377\377\377\377\377\377\251\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\377\377\377l\377\377\377\367\377\377\377\377\377\377\377\377\377\377\377" + "\376\377\377\377\223\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377" + ")\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\355\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\360\377\377\377\33\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377j\377\377\377\350\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\376\377\377\377\302\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377;\377\377\377\372\377\377\377\316\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377u\377\377\377\351\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\373\377\377\377\254\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377S\377\377\377" + "\354\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\325\377" + "\377\377\33\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\214\377\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" + "\377\315\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\342\377\377\3772\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\177\377\377\377\365\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\342\377\377\3772\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\376\377" + "\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\357\377\377" + "\377\377\377\377\377\364\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377M\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\377\377\377\377\375" + "\377\377\377\\\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" + "\0\0\0\377\377\377\255\377\377\377\377\377\377\377\234\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" + "\224\377\377\377\377\377\377\377\276\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\240\377\377\377\377\377\377\377\266\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\370\377\377\377\312\377\377\377%\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\316\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377" + "\377\377\255\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\305\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377" + "\377\377\330\377\377\377V\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377" + ")\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\351" + "\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\345" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\370\377\377" + "\377\241\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313" + "\377\377\377\375\377\377\377\\\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\355\377\377\377\355\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0" + "\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\336\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\316\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377\377\213\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377" + "\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\247\377" + "\377\377\377\377\377\377\326\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\13\377\377\377\351\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377_\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\366\377\377\377" + "%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\344\377\377\377\333\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\307\377\377\377\375\377\377" + "\377Q\0\0\0\0\0\0\0\0\377\377\377\204\377\377\377\377\377\377\377\327\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\206\377" + "\377\377\371\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377" + "\240\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\215\377\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" + "\206\377\377\377\370\377\377\377\377\377\377\377\377\377\377\377\376\377" + "\377\377\241\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\214\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\377\377\377" + "\33\377\377\377\356\377\377\377\376\377\377\377v\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\25\377\377\377\316\377\377\377\376\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\335\377\377\377)\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377" + "\377\377\351\377\377\377\364\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\233\377\377\377\375" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\276\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377;\377\377\377\372\377\377\377\376\377\377\377|\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377u\377\377\377\375\377" + "\377\377\355\377\377\377\33\0\0\0\0\377\377\377\320\377\377\377\377\377\377" + "\377\244\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\33\377\377\377" + "\366\377\377\377\372\377\377\377=\0\0\0\0\0\0\0\0\377\377\377\33\377\377" + "\377\362\377\377\377\376\377\377\377_\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\351\377\377\377\364\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" + "\13\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377l\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377" + "\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377" + "\377\377\377\377\377\377\277\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377\377" + "\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\3775\377\377\377" + "\347\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\303\377" + "\377\377\362\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\377\377\377\377\345\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\307\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\345\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377\377\260" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\310" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\326\377\377" + "\377\367\377\377\377\315\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377l\377\377\377\356\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\370\377\377\377\231\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\373\377\377" + "\377\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377I\377\377\377\373\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\216\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" + "\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\351\377\377" + "\377\355\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\13\377\377\377\351\377\377\377\355\377\377\377" + "\33\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377)\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377" + "\377\374\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\307\377\377" + "\377\377\377\377\377\304\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\223\377\377\377\375\377\377\377\377\377\377" + "\377\377\377\377\377\372\377\377\377M\377\377\377\377\377\377\377\377\377" + "\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\377\377\377\275\377\377" + "\377\371\377\377\377%\377\377\377\223\377\377\377\377\377\377\377\252\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377" + "\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\351\377\377\377\355" + "\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" + "\240\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\376\377" + "\377\377\275\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\224\377\377\377\377\377\377\377\352\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\307\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\377\377\377\310\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\337\377\377\377\377\377\377\377\332\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\307\377" + "\377\377\375\377\377\377_\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377c\377\377\377\330\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\354\377" + "\377\377Z\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\13\377\377\377\333\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\375\377\377\377_\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\33\377\377\377\350\377\377\377\377\377\377\377\377\377\377\377" + "\376\377\377\377\255\377\377\377\362\377\377\377\323\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\372" + "\377\377\377\376\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377b\377\377\377\374\377\377\377\372\377" + "\377\377I\377\377\377\13\377\377\377\355\377\377\377\377\377\377\377\243" + "\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\345\377" + "\377\377\376\377\377\377\214\0\0\0\0\0\0\0\0\377\377\377j\377\377\377\374" + "\377\377\377\363\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\335\377\377\377\377\377\377\377\236\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377" + "\377\355\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377)\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\360" + "\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371" + "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377" + "%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377S\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377Q\377\377\377n\377\377\377\13\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377" + "\377e\377\377\377\33\0\0\0\0\0\0\0\0\371\371\377.\377\377\3775\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\374\377\377\377\364\377\377" + "\3772\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377\343\377\377\377\377\377\377\377\215\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\371\377\377\377\334\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377X\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0" + "\0\0\0\377\377\377\341\377\377\377\375\377\377\377=\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377e\377\377\377l\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377E\377\377\377X\377\377\377S\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377@\377\377\377e\377\377\377c\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377S\377\377\377K\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377\377e\377\377\377n\377\377\377" + "8\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377_\377\377\377p\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377E\377\377\377X\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\371" + "\377\377\377\334\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377`\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\33\377\377\377\362\377\377\377" + "\376\377\377\377\255\377\377\3775\377\377\377V\377\377\377\322\377\377\377" + "\255\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377)\377\377\377X\377\377\377V\377\377\377\13\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377" + "m\377\377\377c\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\371\371\377.\377\377\377m\377\377\377c\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377\377c\377\377\377\13" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320" + "\377\377\377\377\377\377\377\333\377\377\377\33\377\377\377E\377\377\377" + "\13\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377e\377\377\377e\377\377" + "\3778\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "e\377\377\377n\377\377\3775\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377U\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\361\377\377\377\366\377\377" + "\377%\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\216\377\377\377\233\377\377\377\232\377\377\377\232" + "\377\377\377\232\377\377\377\232\377\377\377\232\377\377\377\237\377\377" + "\377=\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377n\377\377\3775\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377n\377\377\3778\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377@\377\377\377m\377\377\377c\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377@\377\377\377p\377" + "\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377Q\377\377\377p\377\377\377X\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\324\377\377\377\376\377\377\377" + "|\377\377\377S\377\377\377V\377\377\377K\377\377\377\263\377\377\377\377" + "\377\377\377\252\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\362\377\377\377\360\377\377\377" + "\33\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377" + "\377\377p\377\377\377c\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377\377f\377\377\377" + "\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\224\377\377\377\376\377\377\377U\377\377\377@\377\377\377e\377\377\377" + "8\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377@\377\377\377p\377\377\377I\377\377\377;\377\377\377" + "\374\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377e\377\377\377e\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377O\377\377" + "\377X\377\377\377U\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377j\377\377\377n\377\377\377\33\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377" + "\362\377\377\377\367\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\356\377\377\377%\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\335\377\377\377\372\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\267\377\377\377" + "\345\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\237\377\377\377\377\377\377\377\361\377\377" + "\3772\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" + "\331\377\377\377\377\377\377\377\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\3772\377\377\377\337\377\377\377\377\377\377\377\236\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377b\377" + "\377\377\376\377\377\377\330\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\3772\377\377\377\337\377\377\377\377\377\377\377\236\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\377\377\3775\377\377\377\344\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\270\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\362\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\210\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\377\377\377" + "\377\370\377\377\377\364\377\377\377\372\377\377\377\243\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\266\377\377\377\377\377\377\377\225\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\205\377\377\377\371\377\377\377\364" + "\377\377\377\364\377\377\377\377\377\377\377\260\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\377\377\377\13\377\377\377\370\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377m\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\345\377\377\377" + "\375\377\377\377f\0\0\0\0\0\0\0\0\377\377\3772\377\377\377\326\377\377\377" + "\377\377\377\377\245\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\234\377\377\377\205\377\377\377I\377\377\377\272\377\377\377\377" + "\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377i\377\377\377\203\377\377\377" + "\337\377\377\377\377\377\377\377\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\275\377\377\377\377\377\377\377" + "\377\377\377\377\373\377\377\377\243\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377" + "\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\177\377\377\377\372\377\377\377\376\377\377\377\377\377\377" + "\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\253\377\377" + "\377\340\377\377\377%\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\377\377\377\310\377\377\377\307\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377\351\377\377\377\377\377\377\377\276\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377u\377\377\377\325\377\377\377w\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\351\377\377\377\377\377\377\377\276\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377`\377\377\377\213\377\377\377\203\377\377" + "\3778\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\13\377\377\377\251\377\377\377\322\377\377\377\316" + "\377\377\377m\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377`\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\266" + "\377\377\377u\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377G\377\377\377\317\377\377\377w\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377i\377\377\377\266" + "\377\377\377\263\377\377\377\263\377\377\377\262\377\377\377_\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377`\377\377\377y\377\377\377y\377\377\377y" + "\377\377\377y\377\377\377y\377\377\377y\377\377\377x\377\377\377\33\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\237\377\377\377\377\377\377\377\377" + "\377\377\377\370\377\377\377\370\377\377\377\377\377\377\377\377\377\377" + "\377\325\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" + ";\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\376\377\377\377z\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\233\377\377\377\377\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\376\377\377\377\327\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\377\377\377\13\377\377\377\361\377\377\377\377" + "\377\377\377\377\377\377\377\325\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377v\377\377\377\246\377" + "\377\377\266\377\377\377u\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\372\377\377\377)\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "i\377\377\377\266\377\377\377\255\377\377\377\214\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377s\377\377\377|\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377s\377\377\377" + "|\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377_\377\377\377\266\377\377\377\321\377\377\377\316\377" + "\377\377\271\377\377\377q\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377`\377\377\377\245\377\377\377\267\377\377\377" + "\247\377\377\377=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377E\377\377\377\212\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\211\377\377\377=\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377v\377\377\377\232\377\377" + "\377q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377" + "\377\377\363\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377", +}; + diff --git a/minilibx_macos/font.xcf b/minilibx_macos/font.xcf new file mode 100644 index 0000000..b9c8c82 Binary files /dev/null and b/minilibx_macos/font.xcf differ diff --git a/minilibx/man/man1 b/minilibx_macos/man/man1 similarity index 100% rename from minilibx/man/man1 rename to minilibx_macos/man/man1 diff --git a/minilibx/man/man3/mlx.1 b/minilibx_macos/man/man3/mlx.1 similarity index 65% rename from minilibx/man/man3/mlx.1 rename to minilibx_macos/man/man3/mlx.1 index 9ad0ac1..cfdac3d 100644 --- a/minilibx/man/man3/mlx.1 +++ b/minilibx_macos/man/man3/mlx.1 @@ -1,6 +1,6 @@ .TH MiniLibX 3 "September 19, 2002" .SH NAME -MiniLibX - Simple X-Window Interface Library for students +MiniLibX - Simple Graphical Interface Library for students .SH SYNOPSYS #include @@ -12,11 +12,11 @@ MiniLibX - Simple X-Window Interface Library for students .SH DESCRIPTION MiniLibX is an easy way to create graphical software, -without any X-Window programming knowledge. It provides +without any X-Window/Cocoa programming knowledge. It provides simple window creation, a drawing tool, image and basic events management. -.SH X-WINDOW CONCEPT +.SH BSD/LINUX X-WINDOW CONCEPT X-Window is a network-oriented graphical system for Unix. It is based on two main parts: @@ -31,6 +31,18 @@ A network connection must be established between these two entities to send drawing orders (from the software to the X-Server), and keyboard/mouse events (from the X-Server to the software). +.SH MACOSX CONCEPT + +The MacOSX operating system handle graphical access to the screen (or "display"). +.br +On one side, your software wants to draw something on the screen and/or +get keyboard & mouse entries. +.br +On the other side, the underlying MacOSX graphical framework that handles +the screen, the windowing system, keyboard and mouse. +.br +A connection between these two entities must be established. + .SH INCLUDE FILE .B mlx.h should be included for a correct use of the MiniLibX API. @@ -41,7 +53,7 @@ It only contains function prototypes, no structure is needed. First of all, you need to initialize the connection between your software and the display. Once this connection is established, you'll be able to -use other MiniLibX functions to send the X-Server messages, +use other MiniLibX functions to send the graphical orders, like "I want to draw a yellow pixel in this window" or "did the user hit a key?". .P @@ -67,7 +79,7 @@ All other MiniLibX functions are described in the following man pages: .B mlx_loop : handle keyboard or mouse events -.SH LINKING MiniLibX +.SH LINKING MiniLibX on BSD/Linux and X-Window To use MiniLibX functions, you'll need to link your software with several libraries, including the MiniLibX library itself. To do this, simply add the following arguments at linking time: @@ -79,15 +91,25 @@ the .B -L flag. +.SH LINKING MiniLibX on MACOSX +To use MiniLibX functions, you'll need to link your software with the +MiniLibX library, and several system frameworks: + +.B -lmlx -framework OpenGL -framework AppKit + +You may also need to specify the path to the MiniLibX library, using +the +.B -L +flag. .SH RETURN VALUES If .B mlx_init() -fails to set up the connection to the X server, it will return NULL, otherwise +fails to set up the connection to the graphical system, it will return NULL, otherwise a non-null pointer is returned as a connection identifier. .SH SEE ALSO mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3) .SH AUTHOR -Copyright ol@ - 2002-2014 - Olivier Crouzet +Copyright ol@ - 2002-2015 - Olivier Crouzet diff --git a/minilibx/man/man3/mlx_loop.1 b/minilibx_macos/man/man3/mlx_loop.1 similarity index 86% rename from minilibx/man/man3/mlx_loop.1 rename to minilibx_macos/man/man3/mlx_loop.1 index 3397ce2..fa2b835 100644 --- a/minilibx/man/man3/mlx_loop.1 +++ b/minilibx_macos/man/man3/mlx_loop.1 @@ -43,9 +43,10 @@ MiniLibX - Handle events .I void *mlx_ptr, int (*funct_ptr)(), void *param ); -.SH X-WINDOW EVENTS +.SH EVENTS -The X-Window system is bi-directionnal. On one hand, the program sends orders to +Both X-Window and MacOSX graphical systems are bi-directionnal. +On one hand, the program sends orders to the screen to display pixels, images, and so on. On the other hand, it can get information from the keyboard and mouse associated to the screen. To do so, the program receives "events" from the keyboard or the @@ -114,7 +115,8 @@ is the address specified in the mlx_*_hook calls. This address is never used nor modified by the MiniLibX. On key and mouse events, additional information is passed: .I keycode -tells you which key is pressed (look for the X11 include file "keysymdef.h"), +tells you which key is pressed (X11 : look for the include file "keysymdef.h", +MacOS : create a small software and find out by yourself), ( .I x , @@ -124,12 +126,12 @@ tells you which key is pressed (look for the X11 include file "keysymdef.h"), tells you which mouse button was pressed. .SH GOING FURTHER WITH EVENTS -The MiniLibX provides a much generic access to all X-Window events. The +The MiniLibX provides a much generic access to all type of events. The .I mlx.h include define .B mlx_hook() in the same manner mlx_*_hook functions work. The event and mask values -will be taken from the X11 include file "X.h". +will be taken from the X11 include file "X.h" (even for MacOSX, for compatibility purposes) See source code of mlx_int_param_event.c to find out how the MiniLibX will call your own function for a specific event. @@ -138,4 +140,4 @@ call your own function for a specific event. mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3) .SH AUTHOR -Copyright ol@ - 2002-2014 - Olivier Crouzet +Copyright ol@ - 2002-2015 - Olivier Crouzet diff --git a/minilibx/man/man3/mlx_new_image.1 b/minilibx_macos/man/man3/mlx_new_image.1 similarity index 96% rename from minilibx/man/man3/mlx_new_image.1 rename to minilibx_macos/man/man3/mlx_new_image.1 index f2160a2..d46bf59 100644 --- a/minilibx/man/man3/mlx_new_image.1 +++ b/minilibx_macos/man/man3/mlx_new_image.1 @@ -141,7 +141,7 @@ one byte for each component (see .B mlx_pixel_put manual). This must be translated to fit the .I bits_per_pixel -requirement of the image, and make the color understandable to the X-Server. +requirement of the image, and make the color understandable to the graphical system. That is the purpose of the .B mlx_get_color_value () function. It takes a standard RGB @@ -155,7 +155,7 @@ least significant bits of this value can be stored in the image. Keep in mind that the least significant bits position depends on the local computer's endian. If the endian of the image (in fact the endian of -the X-Server's computer) differs from the local endian, then the value should +the X-Server's computer for remote X11 display) differs from the local endian, then the value should be transformed before being used. .SH XPM IMAGES @@ -189,4 +189,4 @@ as an image identifier. mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_loop(3) .SH AUTHOR -Copyright ol@ - 2002-2014 - Olivier Crouzet +Copyright ol@ - 2002-2015 - Olivier Crouzet diff --git a/minilibx/man/man3/mlx_new_window.1 b/minilibx_macos/man/man3/mlx_new_window.1 similarity index 96% rename from minilibx/man/man3/mlx_new_window.1 rename to minilibx_macos/man/man3/mlx_new_window.1 index 90f6d47..36176d7 100644 --- a/minilibx/man/man3/mlx_new_window.1 +++ b/minilibx_macos/man/man3/mlx_new_window.1 @@ -76,4 +76,4 @@ right now return nothing. mlx(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3) .SH AUTHOR -Copyright ol@ - 2002-2014 - Olivier Crouzet +Copyright ol@ - 2002-2015 - Olivier Crouzet diff --git a/minilibx/man/man3/mlx_pixel_put.1 b/minilibx_macos/man/man3/mlx_pixel_put.1 similarity index 97% rename from minilibx/man/man3/mlx_pixel_put.1 rename to minilibx_macos/man/man3/mlx_pixel_put.1 index f4d131e..caf89f2 100644 --- a/minilibx/man/man3/mlx_pixel_put.1 +++ b/minilibx_macos/man/man3/mlx_pixel_put.1 @@ -78,4 +78,4 @@ mlx(3), mlx_new_window(3), mlx_new_image(3), mlx_loop(3) .SH AUTHOR -Copyright ol@ - 2002-2014 - Olivier Crouzet +Copyright ol@ - 2002-2015 - Olivier Crouzet diff --git a/minilibx/mlx.h b/minilibx_macos/mlx.h similarity index 75% rename from minilibx/mlx.h rename to minilibx_macos/mlx.h index 25991a1..ce28644 100644 --- a/minilibx/mlx.h +++ b/minilibx_macos/mlx.h @@ -2,10 +2,10 @@ ** mlx.h for MinilibX in ** ** Made by Charlie Root -** Login +** Login ** ** Started on Mon Jul 31 16:37:50 2000 Charlie Root -** Last update Tue May 15 16:23:28 2007 Olivier Crouzet +** Last update Tue Oct 01 16:23:28 2014 Olivier Crouzet */ /* @@ -16,14 +16,29 @@ /* ** FR msg - FR msg - FR msg ** +** MacOSX +** La MinilibX utilise 2 frameworks Mac : OpenGL et AppKit +** qu'il faut ajouter a la compilation : +** -framework OpenGL -framework AppKit +** +** UNIX / Linux ** La MinilibX utilise 2 librairies supplementaires qu'il ** est necessaire de rajouter a la compilation : ** -lmlx -lXext -lX11 ** ** La MinilibX permet le chargement des images de type Xpm. ** Notez que cette implementation est incomplete. -** Merci de communiquer tout probleme de chargement d'image -** de ce type. +** +** Il y a des differences entre X11 et MacOS. +** les numeros des touches ne sont pas les memes, +** les numeros des boutons souris ne sont pas les memes. +** Egalement l'expose est gere differemment, et sous MacOS +** il est preferable d'entrer le plus tot possible dans mlx_loop, +** il est normal que les fenetres n'apparaissent pas avant mlx_loop +** (ou bien forcez avec mlx_do_sync mais c'est pas genial). +** Sous MacOS, l'octet Alpha est pris en compte dans toutes les +** images, et represente la transparence et non l'opacite comme +** c'est normalement le cas. */ @@ -63,14 +78,12 @@ int mlx_pixel_put(void *mlx_ptr, void *win_ptr, int x, int y, int color); void *mlx_new_image(void *mlx_ptr,int width,int height); /* ** return void *0 if failed -** obsolete : image2 data is stored using bit planes -** void *mlx_new_image2(void *mlx_ptr,int width,int height); */ char *mlx_get_data_addr(void *img_ptr, int *bits_per_pixel, int *size_line, int *endian); /* ** endian : 0 = sever X is little endian, 1 = big endian -** for mlx_new_image2, 2nd arg of mlx_get_data_addr is number_of_planes +** endian : useless on macos, client and graphical framework have the same endian */ int mlx_put_image_to_window(void *mlx_ptr, void *win_ptr, void *img_ptr, int x, int y); diff --git a/minilibx_macos/mlx_init_loop.m b/minilibx_macos/mlx_init_loop.m new file mode 100644 index 0000000..55c1cfd --- /dev/null +++ b/minilibx_macos/mlx_init_loop.m @@ -0,0 +1,184 @@ +// mlx_init_loop.m +// By Ol + +#import +#import +#import + +#include "mlx_int.h" +#include "mlx_new_window.h" + +#include "font.c" + + +void do_loop_hook2(CFRunLoopTimerRef observer, void * info) +{ + ((mlx_ptr_t *)info)->loop_hook(((mlx_ptr_t *)info)->loop_hook_data); +} + + +void do_loop_flush(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void * info) +{ + mlx_ptr_t *mlx_ptr; + mlx_win_list_t *win; + + mlx_ptr = (mlx_ptr_t *)info; + win = mlx_ptr->win_list; + while (win) + { + if (win->nb_flush > 0 && win->pixmgt) + { + [(id)win->winid selectGLContext]; + [(id)win->winid mlx_gl_draw]; + glFlush(); + win->nb_flush = 0; + } + win = win->next; + } +} + + + + +void *mlx_init() +{ + mlx_ptr_t *new_mlx; + int bidon; + int i; + + if ((new_mlx = malloc(sizeof(*new_mlx))) == NULL) + return ((void *)0); + new_mlx->win_list = NULL; + new_mlx->img_list = NULL; + new_mlx->loop_hook = NULL; + new_mlx->loop_hook_data = NULL; + new_mlx->main_loop_active = 0; + + new_mlx->appid = [NSApplication sharedApplication]; + + // super magic trick to detach app from terminal, get menubar & key input events + for (NSRunningApplication * app in [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.finder"]) + { + [app activateWithOptions:NSApplicationActivateIgnoringOtherApps]; + break; + } + usleep(100000); + ProcessSerialNumber psn = { 0, kCurrentProcess }; + (void) TransformProcessType(&psn, kProcessTransformToForegroundApplication); + usleep(100000); + [[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps]; + + // load font + new_mlx->font = mlx_new_image(new_mlx, (FONT_WIDTH+2)*95, FONT_HEIGHT); + i = 0; + while (i < 4*(FONT_WIDTH+2)*95*FONT_HEIGHT) + { + new_mlx->font->buffer[i+0] = font_atlas.pixel_data[i+2]; + new_mlx->font->buffer[i+1] = font_atlas.pixel_data[i+1]; + new_mlx->font->buffer[i+2] = font_atlas.pixel_data[i+0]; + ((unsigned char *)new_mlx->font->buffer)[i+3] = 0xFF-font_atlas.pixel_data[i+3]; + i += 4; + } + + new_mlx->font->vertexes[2] = FONT_WIDTH; + new_mlx->font->vertexes[4] = FONT_WIDTH; + new_mlx->font->vertexes[5] = -FONT_HEIGHT-1; + new_mlx->font->vertexes[7] = -FONT_HEIGHT-1; + + return ((void *)new_mlx); +} + + +void mlx_loop(mlx_ptr_t *mlx_ptr) +{ + CFRunLoopObserverRef observer; + CFRunLoopObserverContext ocontext = {.version = 0, .info = mlx_ptr, .retain = NULL, .release = NULL, .copyDescription = NULL}; + + mlx_ptr->main_loop_active = 1; + + observer = CFRunLoopObserverCreate(NULL, kCFRunLoopBeforeTimers, true, 0, do_loop_flush, &ocontext); + CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes); + + // [[[MlxLoopHookObj alloc] initWithPtr:mlx_ptr] performSelector:@selector(do_loop_hook) withObject:nil afterDelay:0.0]; + + [NSApp run]; +} + + +void mlx_pixel_put(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, int x, int y, int color) +{ + if (!win_ptr->pixmgt) + return ; + [(id)(win_ptr->winid) selectGLContext]; + [(id)(win_ptr->winid) pixelPutColor:color X:x Y:y]; + win_ptr->nb_flush ++; +} + + +void mlx_int_loop_once() +{ + NSEvent *event; + NSDate *thedate; + + thedate = [NSDate dateWithTimeIntervalSinceNow:0.1]; + while (42) + { + event = [NSApp nextEventMatchingMask:NSAnyEventMask + untilDate:thedate + inMode:NSDefaultRunLoopMode + dequeue:YES]; + if (event == nil) + { + [thedate release]; + return ; + } + [NSApp sendEvent:event]; + [NSApp updateWindows]; + } +} + + +int mlx_do_sync(mlx_ptr_t *mlx_ptr) +{ + mlx_win_list_t *win; + + win = mlx_ptr->win_list; + while (win) + { + if (win->pixmgt) + { + [(id)(win->winid) selectGLContext]; + [(id)(win->winid) mlx_gl_draw]; + glFlush(); + if (!mlx_ptr->main_loop_active) + mlx_int_loop_once(); + } + win = win->next; + } + return (0); +} + + +int mlx_loop_hook(mlx_ptr_t *mlx_ptr, void (*fct)(void *), void *param) +{ + CFRunLoopTimerContext tcontext = {0, mlx_ptr, NULL, NULL, NULL}; + CFRunLoopTimerRef timer; + + if (mlx_ptr->loop_hook != NULL) + { + CFRunLoopTimerInvalidate(mlx_ptr->loop_timer); + [(id)(mlx_ptr->loop_timer) release]; + } + + mlx_ptr->loop_hook = fct; + mlx_ptr->loop_hook_data = param; + + if (fct) + { + timer = CFRunLoopTimerCreate(kCFAllocatorDefault, 0.0, 0.0001, 0, 0, &do_loop_hook2, &tcontext); + mlx_ptr->loop_timer = timer; + CFRunLoopAddTimer(CFRunLoopGetMain(), timer, kCFRunLoopCommonModes); + } + + return (0); +} diff --git a/minilibx_macos/mlx_int.h b/minilibx_macos/mlx_int.h new file mode 100644 index 0000000..a93c1c9 --- /dev/null +++ b/minilibx_macos/mlx_int.h @@ -0,0 +1,102 @@ +// +// mlx_int.h for minilibx +// +// ol@staff.42.fr +// +// include opengl needed before mlx_int.h +// + + +#define MAX_EVENT 32 +#define MAX_PIXEL_NB 200000 +#define UNIQ_BPP 4 + +#define FONT_WIDTH 10 +#define FONT_HEIGHT 20 + + +typedef int (*func_t)(); + +/* structs */ + +typedef struct glsl_info_s +{ + GLuint pixel_vshader; + GLuint pixel_fshader; + GLuint pixel_program; + GLint loc_pixel_position; + GLint loc_pixel_texture; + GLint loc_pixel_winhalfsize; + + GLuint image_vshader; + GLuint image_fshader; + GLuint image_program; + GLint loc_image_position; + GLint loc_image_winhalfsize; + GLint loc_image_texture; + GLint loc_image_pos; + GLint loc_image_size; + + GLuint font_vshader; + GLuint font_fshader; + GLuint font_program; + GLint loc_font_position; + GLint loc_font_winhalfsize; + GLint loc_font_texture; + GLint loc_font_color; + GLint loc_font_posinwin; + GLint loc_font_posinatlas; + GLint loc_font_atlassize; +} glsl_info_t; + + +typedef struct mlx_img_list_s +{ + int width; + int height; + char *buffer; + GLfloat vertexes[8]; + struct mlx_img_list_s *next; +} mlx_img_list_t; + + +typedef struct mlx_img_ctx_s +{ + GLuint texture; + GLuint vbuffer; + mlx_img_list_t *img; + struct mlx_img_ctx_s *next; +} mlx_img_ctx_t; + +typedef struct mlx_win_list_s +{ + void *winid; + mlx_img_ctx_t *img_list; + int nb_flush; + int pixmgt; + struct mlx_win_list_s *next; +} mlx_win_list_t; + + +typedef struct mlx_ptr_s +{ + void *appid; + mlx_win_list_t *win_list; + mlx_img_list_t *img_list; + void (*loop_hook)(void *); + void *loop_hook_data; + void *loop_timer; + mlx_img_list_t *font; + int main_loop_active; +} mlx_ptr_t; + +// proto + +int mlx_shaders(glsl_info_t *glsl); +char **mlx_int_str_to_wordtab(char *str); +int mlx_int_str_str(char *str,char *find,int len); +int mlx_int_str_str_cote(char *str,char *find,int len); +int mlx_destroy_image(mlx_ptr_t *mlx_ptr, mlx_img_list_t *img_ptr); +void *mlx_new_image(); +void *mlx_xpm_to_image(mlx_ptr_t *xvar,char **xpm_data,int *width,int *height); +int mlx_do_sync(mlx_ptr_t *mlx_ptr); diff --git a/minilibx/mlx_int_str_to_wordtab.c b/minilibx_macos/mlx_int_str_to_wordtab.c similarity index 86% rename from minilibx/mlx_int_str_to_wordtab.c rename to minilibx_macos/mlx_int_str_to_wordtab.c index 7f92089..3b2ef2e 100644 --- a/minilibx/mlx_int_str_to_wordtab.c +++ b/minilibx_macos/mlx_int_str_to_wordtab.c @@ -1,16 +1,10 @@ -/* -** mlx_int_str_to_wordtab.c for MinilibX in -** -** Made by Charlie Root -** Login -** -** Started on Wed Sep 13 11:36:09 2000 Charlie Root -** Last update Fri Dec 14 11:02:09 2001 Charlie Root -*/ +// +// str 2 wordtab & co +// by ol -#include "mlx_int.h" - +#include +#include int mlx_int_str_str(char *str,char *find,int len) { diff --git a/minilibx_macos/mlx_new_image.m b/minilibx_macos/mlx_new_image.m new file mode 100644 index 0000000..e84dc36 --- /dev/null +++ b/minilibx_macos/mlx_new_image.m @@ -0,0 +1,190 @@ +// mlx_new_image +// +// by Ol +// + + +#import +#import + +#include "mlx_int.h" +#include "mlx_new_window.h" + + + +void *mlx_new_image(mlx_ptr_t *mlx_ptr, int width, int height) +{ + mlx_img_list_t *newimg; + + // if (mlx_ptr->win_list == NULL) + // return (NULL); // need at leat one window created to have openGL context and create texture + if ((newimg = malloc(sizeof(*newimg))) == NULL) + return ((void *)0); + newimg->next = mlx_ptr->img_list; + mlx_ptr->img_list = newimg; + newimg->width = width; + newimg->height = height; + newimg->vertexes[0] = 0.0; newimg->vertexes[1] = 0.0; + newimg->vertexes[2] = width; newimg->vertexes[3] = 0.0; + newimg->vertexes[4] = width; newimg->vertexes[5] = -height; + newimg->vertexes[6] = 0.0; newimg->vertexes[7] = -height; + newimg->buffer = malloc(UNIQ_BPP*width*height); + bzero(newimg->buffer, UNIQ_BPP*width*height); + + return (newimg); +} + +mlx_img_ctx_t *add_img_to_ctx(mlx_img_list_t *img, mlx_win_list_t *win) +{ + mlx_img_ctx_t *imgctx; + + imgctx = win->img_list; + while (imgctx) + { + if (imgctx->img == img) + return (imgctx); + imgctx = imgctx->next; + } + + imgctx = malloc(sizeof(*imgctx)); + imgctx->img = img; + imgctx->next = win->img_list; + win->img_list = imgctx; + + glGenTextures(1, &(imgctx->texture)); + glBindTexture(GL_TEXTURE_2D, imgctx->texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D( + GL_TEXTURE_2D, 0, /* target, level of detail */ + GL_RGBA8, /* internal format */ + img->width, img->height, 0, /* width, height, border */ + GL_BGRA, GL_UNSIGNED_BYTE, /* external format, type */ + img->buffer /* pixels */ + ); + + glGenBuffers(1, &(imgctx->vbuffer)); + glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(img->vertexes), img->vertexes, GL_DYNAMIC_DRAW); // 4 points buff + + return (imgctx); +} + + +void mlx_put_image_to_window(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, mlx_img_list_t *img_ptr, int x, int y) +{ + mlx_img_ctx_t *imgctx; + + if (!win_ptr->pixmgt) + return ; + + [(id)(win_ptr->winid) selectGLContext]; + imgctx = add_img_to_ctx(img_ptr, win_ptr); + + // update texture + glBindTexture(GL_TEXTURE_2D, imgctx->texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, img_ptr->width, img_ptr->height, 0, + GL_BGRA, GL_UNSIGNED_BYTE, img_ptr->buffer); + + [(id)(win_ptr->winid) mlx_gl_draw_img:img_ptr andCtx:imgctx andX:x andY:y]; + + win_ptr->nb_flush ++; +} + +// assume here 32bpp little endian + +char *mlx_get_data_addr(mlx_img_list_t *img_ptr, int *bits_per_pixel, int *size_line, int *endian) +{ + *bits_per_pixel = UNIQ_BPP*8; + *size_line = img_ptr->width*UNIQ_BPP; + *endian = 0; // little endian for now on mac-intel + return (img_ptr->buffer); +} + +unsigned int mlx_get_color_value(mlx_ptr_t *mlx_ptr, int color) +{ + return (color); +} + +int mlx_string_put(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, int x, int y, int color, unsigned char *string) +{ + mlx_img_ctx_t *imgctx; + int gX; + int gY; + + if (!win_ptr->pixmgt) + return(0); + + [(id)(win_ptr->winid) selectGLContext]; + + imgctx = add_img_to_ctx(mlx_ptr->font, win_ptr); + + while (*string) + { + if (*string >= 32 && *string <= 127) + { + gX = (FONT_WIDTH+2)*(*string-32); + gY = 0; + // printf("put char %c pos %d %d\n", *string, gX, gY); + [(id)(win_ptr->winid) mlx_gl_draw_font:mlx_ptr->font andCtx:imgctx andX:x andY:y andColor:color glyphX:gX glyphY:gY]; + x += FONT_WIDTH; + } + string ++; + } + + win_ptr->nb_flush ++; + + return (0); +} + +int mlx_destroy_image(mlx_ptr_t *mlx_ptr, mlx_img_list_t *img_todel) +{ + mlx_img_ctx_t ctx_first; + mlx_img_ctx_t *ctx; + mlx_img_ctx_t *ctx_to_del; + mlx_img_list_t img_first; + mlx_img_list_t *img; + mlx_win_list_t *win; + + img_first.next = mlx_ptr->img_list; + img = &img_first; + while (img && img->next) + { + if (img->next == img_todel) + img->next = img->next->next; + img = img->next; + } + mlx_ptr->img_list = img_first.next; + + + win = mlx_ptr->win_list; + while (win) + { + ctx_first.next = win->img_list; + ctx = &ctx_first; + while (ctx && ctx->next) + { + if (ctx->next->img == img_todel) + { + [(id)(win->winid) selectGLContext]; + glDeleteBuffers(1, &(ctx->next->vbuffer)); + glDeleteTextures(1, &(ctx->next->texture)); + ctx_to_del = ctx->next; + ctx->next = ctx->next->next; + free(ctx_to_del); + } + ctx = ctx->next; + } + win->img_list = ctx_first.next; + win = win->next; + } + + + free(img_todel->buffer); + free(img_todel); + + // printf("destroy image done.\n"); + return (0); +} diff --git a/minilibx_macos/mlx_new_window.h b/minilibx_macos/mlx_new_window.h new file mode 100644 index 0000000..f57324a --- /dev/null +++ b/minilibx_macos/mlx_new_window.h @@ -0,0 +1,56 @@ +// +// mlx_int.h for minilibx +// +// ol@staff.42.fr +// +// include opengl needed before mlx_int.h +// + +#import +#import "mlx_int.h" + +@interface NSWindowEvent : NSWindow +{ + func_t event_funct[MAX_EVENT]; + void *(event_param[MAX_EVENT]); + int keyrepeat; + int keyflag; + int size_x; + int size_y; +} +- (NSWindowEvent *) initWithContentRect:(NSRect)rect styleMask:(NSUInteger)winstyle backing:(NSBackingStoreType)bck defer:(BOOL) dfr; +- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param; +- (void) setKeyRepeat:(int)mode; +- (void) exposeNotification:(NSNotification *)note; +- (void) closeNotification:(NSNotification *)note; +@end + + +@interface MlxWin : NSOpenGLView +{ + NSWindowEvent *win; + NSOpenGLContext *ctx; + glsl_info_t glsl; + int openglwin; + + int size_x; + int size_y; + + int pixel_nb; + GLuint pixel_vbuffer; + GLuint pixel_texture; + unsigned int *pixtexbuff; +} + +- (id) initWithRect: (NSRect)rect andTitle: (NSString *)title pfaAttrs: (NSOpenGLPixelFormatAttribute *)attrs; +- (void) selectGLContext; +- (void) flushGLContext; +- (void) pixelPutColor: (int)color X:(int)x Y:(int)y; +- (void) mlx_gl_draw; +- (void) mlx_gl_draw_img:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y; +- (void) mlx_gl_draw_font:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y andColor:(int)color glyphX:(int)gx glyphY:(int)gy; +- (NSOpenGLContext *) ctx; +- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param; +- (void) setKeyRepeat:(int)mode; +- (void) ctxNeedsUpdate; +@end diff --git a/minilibx_macos/mlx_new_window.m b/minilibx_macos/mlx_new_window.m new file mode 100644 index 0000000..7a13ab6 --- /dev/null +++ b/minilibx_macos/mlx_new_window.m @@ -0,0 +1,760 @@ +// mlx_new_window.m + +#import +#import +#import + +#include + +#include "mlx_int.h" +#include "mlx_new_window.h" + + +NSOpenGLPixelFormatAttribute pfa_attrs[] = + { + NSOpenGLPFADepthSize, 32, + NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersionLegacy, + 0 + }; + +static const GLfloat pixel_vertexes[8] = + { + -1.0 , -1.0, + 1.0, -1.0, + 1.0, 1.0, + -1.0, 1.0 + }; + + + +int get_mouse_button(NSEventType eventtype) +{ + switch (eventtype) { + case NSLeftMouseDown: + case NSLeftMouseUp: + case NSLeftMouseDragged: + return 1; + case NSRightMouseDown: + case NSRightMouseUp: + case NSRightMouseDragged: + return 2; + case NSOtherMouseDown: + case NSOtherMouseUp: + case NSOtherMouseDragged: + return 3; + default: + return 0; + } +} + + +// classes for window & events + + + + +@implementation NSWindowEvent + +- (NSWindowEvent *) initWithContentRect:(NSRect)rect styleMask:(NSUInteger)winstyle backing:(NSBackingStoreType)bck defer:(BOOL) dfr +{ + int i; + + if ((self = [super initWithContentRect:rect + styleMask:winstyle + backing:bck + defer:dfr])) + { + i = MAX_EVENT; + while (i--) + { + event_funct[i] = NULL; + event_param[i] = NULL; + } + keyrepeat = 0; + keyflag = 0; + size_x = rect.size.width; + size_y = rect.size.height; + } + return (self); +} + + +- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param +{ + event_funct[event] = func; + event_param[event] = param; + if (event == 6) // motion notify + { + if (func == NULL) + [self setAcceptsMouseMovedEvents:NO]; + else + [self setAcceptsMouseMovedEvents:YES]; + } +} + + +- (void) setKeyRepeat:(int)mode +{ + keyrepeat = mode; +} + +- (BOOL) acceptsFirstResponder +{ + return (YES); +} + +- (void) flagsChanged:(NSEvent *)theEvent +{ + unsigned int flag; + int the_key; + unsigned int val; + + flag = [theEvent modifierFlags]; + // printf("Key flag changed: %x => %x\n", keyflag, flag); + // printf("**mlx flag low part : %d - %x\n", flag&0xFFFF, flag&0xFFFF); + + if (!(val = (keyflag|flag)&(~(keyflag&flag)))) + return ; // no change - can happen when loosing focus on special key pressed, then re-pressed later + the_key = 1; + while (((val >> (the_key-1)) & 0x01)==0) + the_key ++; + if (flag > keyflag && event_funct[2] != NULL) + event_funct[2](0xFF+the_key, event_param[2]); + if (flag < keyflag && event_funct[3] != NULL) + event_funct[3](0xFF+the_key, event_param[3]); + /* + if (event_funct[2] != NULL) + { + if (!(keyflag & NSAlphaShiftKeyMask) && (flag&NSAlphaShiftKeyMask)) event_funct[2](0xFF+1, event_param[2]); + if (!(keyflag & NSShiftKeyMask) && (flag&NSShiftKeyMask)) event_funct[2](0xFF+2, event_param[2]); + if (!(keyflag & NSControlKeyMask) && (flag&NSControlKeyMask)) event_funct[2](0xFF+3, event_param[2]); + if (!(keyflag & NSAlternateKeyMask) && (flag&NSAlternateKeyMask)) event_funct[2](0xFF+4, event_param[2]); + if (!(keyflag & NSCommandKeyMask) && (flag&NSCommandKeyMask)) event_funct[2](0xFF+5, event_param[2]); + if (!(keyflag & NSNumericPadKeyMask) && (flag&NSNumericPadKeyMask)) event_funct[2](0xFF+6, event_param[2]); + if (!(keyflag & NSHelpKeyMask) && (flag&NSHelpKeyMask)) event_funct[2](0xFF+7, event_param[2]); + if (!(keyflag & NSFunctionKeyMask) && (flag&NSFunctionKeyMask)) event_funct[2](0xFF+8, event_param[2]); + } + if (event_funct[3] != NULL) + { + if ((keyflag & NSShiftKeyMask) && !(flag&NSShiftKeyMask)) event_funct[3](NSShiftKeyMask, event_param[3]); + + if ((keyflag & NSAlphaShiftKeyMask) && !(flag&NSAlphaShiftKeyMask)) event_funct[3](0xFF+1, event_param[3]); + if ((keyflag & NSShiftKeyMask) && !(flag&NSShiftKeyMask)) event_funct[3](0xFF+2, event_param[3]); + if ((keyflag & NSControlKeyMask) && !(flag&NSControlKeyMask)) event_funct[3](0xFF+3, event_param[3]); + if ((keyflag & NSAlternateKeyMask) && !(flag&NSAlternateKeyMask)) event_funct[3](0xFF+4, event_param[3]); + if ((keyflag & NSCommandKeyMask) && !(flag&NSCommandKeyMask)) event_funct[3](0xFF+5, event_param[3]); + if ((keyflag & NSNumericPadKeyMask) && !(flag&NSNumericPadKeyMask)) event_funct[3](0xFF+6, event_param[3]); + if ((keyflag & NSHelpKeyMask) && !(flag&NSHelpKeyMask)) event_funct[3](0xFF+7, event_param[3]); + if ((keyflag & NSFunctionKeyMask) && !(flag&NSFunctionKeyMask)) event_funct[3](0xFF+8, event_param[3]); + } + */ + keyflag = flag; +} + +- (void) keyDown:(NSEvent *)theEvent +{ + if (keyrepeat==0 && [theEvent isARepeat]) + return ; + // printf("Key Down: %d\n", [theEvent keyCode]); + if (event_funct[2] != NULL) + event_funct[2]([theEvent keyCode], event_param[2]); + // else [super keyDown: theEvent]; +} + +- (void) keyUp:(NSEvent *)theEvent +{ + // printf("Key Up: %d\n", [theEvent keyCode]); + if (event_funct[3] != NULL) + event_funct[3]([theEvent keyCode], event_param[3]); + // else [super keyUp: theEvent]; + +} + +- (void) mouseDown:(NSEvent *)theEvent +{ + NSPoint thepoint; + int button; + + thepoint = [theEvent locationInWindow]; + button = get_mouse_button([theEvent type]); + // printf("Mouse pressed bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); + if (event_funct[4] != NULL) + event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); +} + +- (void) rightMouseDown:(NSEvent *)theEvent +{ + NSPoint thepoint; + int button; + + thepoint = [theEvent locationInWindow]; + button = get_mouse_button([theEvent type]); + // printf("Mouse pressed bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); + if (event_funct[4] != NULL) + event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); +} + +- (void) otherMouseDown:(NSEvent *)theEvent +{ + NSPoint thepoint; + int button; + + thepoint = [theEvent locationInWindow]; + button = get_mouse_button([theEvent type]); + // printf("Mouse pressed bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); + if (event_funct[4] != NULL) + event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); +} + +- (void) mouseUp:(NSEvent *)theEvent +{ + NSPoint thepoint; + int button; + + thepoint = [theEvent locationInWindow]; + button = get_mouse_button([theEvent type]); + // printf("Mouse release bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); + if (event_funct[5] != NULL) + event_funct[5](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[5]); +} + +- (void) rightMouseUp:(NSEvent *)theEvent +{ + NSPoint thepoint; + int button; + + thepoint = [theEvent locationInWindow]; + button = get_mouse_button([theEvent type]); + // printf("Mouse release bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); + if (event_funct[5] != NULL) + event_funct[5](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[5]); +} + +- (void) otherMouseUp:(NSEvent *)theEvent +{ + NSPoint thepoint; + int button; + + thepoint = [theEvent locationInWindow]; + button = get_mouse_button([theEvent type]); + // printf("Mouse release bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); + if (event_funct[5] != NULL) + event_funct[5](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[5]); +} + +- (void) mouseMoved:(NSEvent *)theEvent +{ + NSPoint thepoint; + + thepoint = [theEvent locationInWindow]; + // printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); + if (event_funct[6] != NULL) + event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); +} + + +- (void) mouseDragged:(NSEvent *)theEvent +{ + NSPoint thepoint; + + thepoint = [theEvent locationInWindow]; + // printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); + if (event_funct[6] != NULL) + event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); +} + + +- (void) rightMouseDragged:(NSEvent *)theEvent +{ + NSPoint thepoint; + + thepoint = [theEvent locationInWindow]; + // printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); + if (event_funct[6] != NULL) + event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); +} + + +- (void) otherMouseDragged:(NSEvent *)theEvent +{ + NSPoint thepoint; + + thepoint = [theEvent locationInWindow]; + // printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); + if (event_funct[6] != NULL) + event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); +} + + +- (void) scrollWheel:(NSEvent *)theEvent +{ + NSPoint thepoint; + int button; + float sens; + + if (event_funct[4] == NULL) + return ; + + button = 0; + thepoint = [theEvent locationInWindow]; + sens = [theEvent deltaY]; + if (sens > 0.2) + button = 4; + if (sens < -0.2) + button = 5; + sens = [theEvent deltaX]; + if (sens > 0.2) + button = 6; + if (sens < -0.2) + button = 7; + if (button != 0) + event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); +} + + +- (void) exposeNotification:(NSNotification *)note +{ + // printf("Expose...\n"); + if (event_funct[12] != NULL) + event_funct[12](event_param[12]); + // printf("Expose done.\n"); +} + +- (void) closeNotification:(NSNotification *)note +{ + if (event_funct[17] != NULL) + event_funct[17](event_param[17]); +} + +- (void) deminiaturizeNotification:(NSNotification *)note +{ + // if (event_funct[??] != NULL) + // event_funct[??](event_param[??]); + [self exposeNotification:note]; +} +@end + + +@implementation MlxWin + +- (id) initWithRect: (NSRect)rect andTitle: (NSString *)title pfaAttrs: (NSOpenGLPixelFormatAttribute *)attrs +{ + NSOpenGLPixelFormat* pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; + + if ((self = [super initWithFrame:rect pixelFormat:pixFmt]) != nil) + { + NSUInteger windowStyle = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask; + + win = [[NSWindowEvent alloc] initWithContentRect:rect + styleMask:windowStyle + backing:NSBackingStoreBuffered // NSBackingStoreNonretained + defer:NO]; + [win setContentView:self]; + [win setTitle:title]; + [win setKeyRepeat:1]; + [win makeKeyAndOrderFront:self]; + + // printf("init ctx: current %p ", [NSOpenGLContext currentContext]); + + // ctx = [[NSOpenGLContext alloc] initWithFormat:pixFmt shareContext:[NSOpenGLContext currentContext]]; //other_context]; + // [ctx setView:self]; + // [ctx makeCurrentContext]; + + [[self openGLContext] makeCurrentContext]; + [[self openGLContext] setView:self]; + [self prepareOpenGL]; + + [self setNextKeyView:self]; + + // [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(exposeNotification:) name:@"NSWindowDidExposeNotification" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(exposeNotification:) name:@"NSWindowDidBecomeKeyNotification" object:win]; + [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(deminiaturizeNotification:) name:@"NSWindowDidDeminiaturizeNotification" object:win]; + [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(closeNotification:) name:@"NSWindowWillCloseNotification" object:win]; + // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ctxNeedsUpdate:) + // name:NSViewGlobalFrameDidChangeNotification + // object:nil]; + + size_x = rect.size.width; + size_y = rect.size.height; + + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + glFlush(); + + //[win makeKeyAndOrderFront:nil]; + // BOOL r = [win isKeyWindow]; + // if (r==YES) printf("keywindow ok\n"); else printf("keywindow KO\n"); + + // Window controller subclass to set title + // NSWindowController* windowController = [[NSWindowController alloc] initWithWindow:win]; + // [windowController windowTitleForDocumentDisplayName:title]; + // [windowController showWindow:nil]; + // MlxWinController *mlxWinCont = [[MlxWinController alloc] initWin:win andTitle:title]; + + // after nswindowcontroller who will retake first responder + // BOOL r = [win makeFirstResponder:nil]; + // if (r==YES) printf("responder ok\n"); else printf("responder KO\n"); + + [pixFmt release]; + } + return (self); +} + +- (int) pixel_management +{ + bzero(&glsl, sizeof(glsl)); // so gldelete[shader/program] go silent on error. + + glDisable(GL_DEPTH_TEST); + glGenBuffers(1, &pixel_vbuffer); + glBindBuffer(GL_ARRAY_BUFFER, pixel_vbuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(pixel_vertexes), pixel_vertexes, GL_DYNAMIC_DRAW); // 4 points buff + // pixel_ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); + + glGenTextures(1, &pixel_texture); + glBindTexture(GL_TEXTURE_2D, pixel_texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + pixtexbuff = malloc(sizeof(unsigned int)*size_x*size_y); + pixel_nb = size_x*size_y; + while (pixel_nb--) pixtexbuff[pixel_nb] = 0xFF000000; + pixel_nb = 0; + glTexImage2D( + GL_TEXTURE_2D, 0, /* target, level of detail */ + GL_RGBA8, /* internal format */ + size_x, size_y, 0, /* width, height, border */ + GL_BGRA, GL_UNSIGNED_BYTE, /* external format, type */ + pixtexbuff /* pixels */ + ); + // printf("pix tex err? 0x%x\n", glGetError()); + + if (mlx_shaders(&glsl)) + return (0); + + glUseProgram(glsl.pixel_program); + glsl.loc_pixel_texture = glGetUniformLocation(glsl.pixel_program, "texture"); + //glsl.loc_pixel_winhalfsize = glGetUniformLocation(glsl.pixel_program, "winhalfsize"); + glsl.loc_pixel_position = glGetAttribLocation(glsl.pixel_program, "position"); + // printf("err? 0x%x\n", glGetError()); + + glUseProgram(glsl.image_program); + glsl.loc_image_texture = glGetUniformLocation(glsl.image_program, "texture"); + glsl.loc_image_pos = glGetUniformLocation(glsl.image_program, "imagepos"); + glsl.loc_image_size = glGetUniformLocation(glsl.image_program, "imagesize"); + glsl.loc_image_winhalfsize = glGetUniformLocation(glsl.image_program, "winhalfsize"); + glsl.loc_image_position = glGetAttribLocation(glsl.image_program, "position"); + // printf("err? 0x%x\n", glGetError()); + + glUseProgram(glsl.font_program); + glsl.loc_font_texture = glGetUniformLocation(glsl.font_program, "texture"); + glsl.loc_font_color = glGetUniformLocation(glsl.font_program, "color"); + glsl.loc_font_posinwin = glGetUniformLocation(glsl.font_program, "fontposinwin"); + glsl.loc_font_posinatlas = glGetUniformLocation(glsl.font_program, "fontposinatlas"); + glsl.loc_font_atlassize = glGetUniformLocation(glsl.font_program, "fontatlassize"); + glsl.loc_font_winhalfsize = glGetUniformLocation(glsl.font_program, "winhalfsize"); + glsl.loc_font_position = glGetAttribLocation(glsl.font_program, "position"); + // printf("err? 0x%x\n", glGetError()); + + glFlush(); + return (1); +} + +- (void) ctxNeedsUpdate +{ + // printf("Context update\n"); + [ctx update]; +} + +- (void) selectGLContext +{ + if ([NSOpenGLContext currentContext] != [self openGLContext]) + { + // printf("ctx: %p => %p\n", [NSOpenGLContext currentContext], [self openGLContext]); + [[self openGLContext] makeCurrentContext]; + } +} + +- (void) flushGLContext +{ + [[self openGLContext] flushBuffer]; +} + +- (NSOpenGLContext *) ctx +{ + return (ctx); +} + + +- (void) pixelPutColor: (int)color X:(int)x Y:(int)y +{ + pixel_nb ++; + + glBindTexture(GL_TEXTURE_2D, pixel_vbuffer); + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, 1, 1, GL_BGRA, GL_UNSIGNED_BYTE, (GLvoid *)(&color)); + + if (pixel_nb >= MAX_PIXEL_NB) + [self mlx_gl_draw]; +} + +- (void) destroyPixelManagement +{ + free(pixtexbuff); + [self selectGLContext]; + glDeleteBuffers(1, &pixel_vbuffer); + glDeleteTextures(1, &pixel_texture); + glDeleteProgram(glsl.pixel_program); + glDeleteProgram(glsl.image_program); + glDeleteShader(glsl.pixel_vshader); + glDeleteShader(glsl.pixel_fshader); + glDeleteShader(glsl.image_vshader); + glDeleteShader(glsl.image_fshader); +} + + +- (void) destroyMe +{ + [[NSNotificationCenter defaultCenter] removeObserver:win]; + [[NSNotificationCenter defaultCenter] removeObserver:self]; + // [ctx release]; + [win close]; + [self release]; +} + +- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param +{ + [win setEvent:event andFunc:func andParam:param]; +} + +- (void) setKeyRepeat:(int)mode +{ + [win setKeyRepeat:mode]; +} + +- (void) clearWin +{ + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); +} + +- (void) mlx_gl_draw_img:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y +{ + + if (pixel_nb >0) + [self mlx_gl_draw]; + + glUseProgram(glsl.image_program); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, imgctx->texture); + glUniform1i(glsl.loc_image_texture, 0); + + glUniform2f(glsl.loc_image_winhalfsize, size_x/2, size_y/2); + glUniform2f(glsl.loc_image_pos, x, size_y - y); + glUniform2f(glsl.loc_image_size, img->width, -img->height); + + glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(GLfloat), (void*)0); + glEnableVertexAttribArray(0); + + glEnable(GL_BLEND); + glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); // src alpha 0xFF : keep dst + glBlendEquation(GL_FUNC_ADD); + + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glDisableVertexAttribArray(0); + +} + + +- (void) mlx_gl_draw_font:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y andColor:(int)color glyphX:(int)gx glyphY:(int)gy +{ + GLfloat color_tab[4]; + + if (pixel_nb >0) + [self mlx_gl_draw]; + + color_tab[0] = ((float)((color&0xFF0000)>>16))/255.0; + color_tab[1] = ((float)((color&0xFF00)>>8))/255.0; + color_tab[2] = ((float)((color&0xFF)>>0))/255.0; + color_tab[3] = 1.0; + glUseProgram(glsl.font_program); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, imgctx->texture); + glUniform1i(glsl.loc_font_texture, 0); + glUniform4fv(glsl.loc_font_color, 1, color_tab); + + glUniform2f(glsl.loc_font_winhalfsize, size_x/2, size_y/2); + glUniform2f(glsl.loc_font_posinwin, x, size_y - 1 - y); + glUniform2f(glsl.loc_font_posinatlas, gx, gy); + glUniform2f(glsl.loc_font_atlassize, img->width, img->height); + + glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(GLfloat), (void*)0); + glEnableVertexAttribArray(0); + + glEnable(GL_BLEND); + glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); // src alpha 0xFF : keep dst + glBlendEquation(GL_FUNC_ADD); + + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glDisableVertexAttribArray(0); + +} + + +- (void) mlx_gl_draw +{ + if (pixel_nb <= 0) + return ; + + glUseProgram(glsl.pixel_program); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, pixel_vbuffer); + glUniform1i(glsl.loc_pixel_texture, 0); + + glBindBuffer(GL_ARRAY_BUFFER, pixel_vbuffer); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(GLfloat), (void*)0); + glEnableVertexAttribArray(0); + + glEnable(GL_BLEND); + glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); // src alpha 0xFF : keep dst + glBlendEquation(GL_FUNC_ADD); + + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glDisableVertexAttribArray(0); + + pixel_nb = size_x*size_y; + while (pixel_nb--) pixtexbuff[pixel_nb] = 0xFF000000; + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, size_x, size_y, 0, GL_BGRA, GL_UNSIGNED_BYTE, pixtexbuff); + pixel_nb = 0; + +} + +@end + + +// mlx API + + +void *mlx_new_window(mlx_ptr_t *mlx_ptr, int size_x, int size_y, char *title) +{ + mlx_win_list_t *newwin; + NSString *str; + + if ((newwin = malloc(sizeof(*newwin))) == NULL) + return ((void *)0); + newwin->img_list = NULL; + newwin->next = mlx_ptr->win_list; + newwin->nb_flush = 0; + newwin->pixmgt = 1; + mlx_ptr->win_list = newwin; + + NSRect windowRect = NSMakeRect(100, 100, size_x, size_y); + str = [NSString stringWithCString:title encoding:NSASCIIStringEncoding]; + newwin->winid = [[MlxWin alloc] initWithRect:windowRect andTitle:str pfaAttrs:pfa_attrs]; + if (newwin->winid) + if (![(id)(newwin->winid) pixel_management]) + { + [(id)(newwin->winid) destroyPixelManagement]; + [(id)(newwin->winid) destroyMe]; + } + return ((void *)newwin); +} + + +void mlx_clear_window(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr) +{ + [(id)(win_ptr->winid) selectGLContext]; + [(id)(win_ptr->winid) clearWin]; + win_ptr->nb_flush ++; +} + + +void mlx_expose_hook(mlx_win_list_t *win_ptr, int (*funct_ptr)(), void *param) +{ + [(id)(win_ptr->winid) setEvent:12 andFunc:funct_ptr andParam:param]; +} + +void mlx_key_hook(mlx_win_list_t *win_ptr, int (*funct_ptr)(), void *param) +{ + [(id)(win_ptr->winid) setEvent:3 andFunc:funct_ptr andParam:param]; +} + +void mlx_mouse_hook(mlx_win_list_t *win_ptr, int (*funct_ptr)(), void *param) +{ + [(id)(win_ptr->winid) setEvent:4 andFunc:funct_ptr andParam:param]; +} + +void mlx_hook(mlx_win_list_t *win_ptr, int x_event, int x_mask, int (*funct_ptr)(), void *param) +{ + [(id)(win_ptr->winid) setEvent:x_event andFunc:funct_ptr andParam:param]; +} + +int mlx_do_key_autorepeatoff(mlx_ptr_t *mlx_ptr) +{ + mlx_win_list_t *win; + + win = mlx_ptr->win_list; + while (win) + { + [(id)(win->winid) setKeyRepeat:0]; + win = win->next; + } + return (0); +} + +int mlx_do_key_autorepeaton(mlx_ptr_t *mlx_ptr) +{ + mlx_win_list_t *win; + + win = mlx_ptr->win_list; + while (win) + { + [(id)(win->winid) setKeyRepeat:1]; + win = win->next; + } + return (0); +} + + +int mlx_destroy_window(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_to_del) +{ + mlx_win_list_t first; + mlx_win_list_t *win; + mlx_img_ctx_t *ctx; + mlx_img_ctx_t *ctx2; + + first.next = mlx_ptr->win_list; + win = &first; + while (win && win->next) + { + if (win->next == win_to_del) + win->next = win->next->next; + win = win->next; + } + mlx_ptr->win_list = first.next; + + if (win_to_del->pixmgt) + { + [(id)(win_to_del->winid) selectGLContext]; + ctx = win_to_del->img_list; // should be null anyway if no pixel management + while (ctx) + { + glDeleteBuffers(1, &(ctx->vbuffer)); + glDeleteTextures(1, &(ctx->texture)); + ctx2 = ctx; + ctx = ctx->next; + free(ctx2); + } + [(id)(win_to_del->winid) destroyPixelManagement]; + } + [(id)(win_to_del->winid) destroyMe]; + free(win_to_del); + + // printf("destroy window done.\n"); + mlx_do_sync(mlx_ptr); + return (0); +} diff --git a/minilibx/mlx_rgb.c b/minilibx_macos/mlx_rgb.c similarity index 99% rename from minilibx/mlx_rgb.c rename to minilibx_macos/mlx_rgb.c index 0cfccf6..3f98717 100644 --- a/minilibx/mlx_rgb.c +++ b/minilibx_macos/mlx_rgb.c @@ -3,7 +3,6 @@ ** the XFree86 distribution. */ -#include "mlx_int.h" struct s_col_name mlx_col_name[] = { diff --git a/minilibx_macos/mlx_shaders.c b/minilibx_macos/mlx_shaders.c new file mode 100644 index 0000000..8a50e27 --- /dev/null +++ b/minilibx_macos/mlx_shaders.c @@ -0,0 +1,236 @@ +// mlx_shaders.c + +#include +#include +#include +#include +#include "mlx_int.h" + + +void display_log(GLuint object, void (*param_func)(), void (*getlog_func)()) +{ + GLint log_length; + char *log; + + param_func(object, GL_INFO_LOG_LENGTH, &log_length); + log = malloc(log_length); + getlog_func(object, log_length, NULL, log); + fprintf(stderr, "%s", log); + free(log); +} + + +int mlx_shaders_pixel(glsl_info_t *glsl) +{ + char *source; + int length; + GLint action_ok; + + glsl->pixel_vshader = glCreateShader(GL_VERTEX_SHADER); + source = strdup("#version 110 \n" + "attribute vec2 position;" + "varying vec2 texcoord;" + "void main()" + "{" + " gl_Position = vec4( position, 0.0, 1.0);" + " texcoord = vec2(position[0]+1.0, 1.0 - position[1]) / 2.0;" + "}"); + length = strlen(source); + glShaderSource(glsl->pixel_vshader, 1, (const GLchar**)&source, &length); + glCompileShader(glsl->pixel_vshader); + free(source); + + glGetShaderiv(glsl->pixel_vshader, GL_COMPILE_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to compile pixel vshader :\n"); + display_log(glsl->pixel_vshader, glGetShaderiv, glGetShaderInfoLog); + return (1); + } + + glsl->pixel_fshader = glCreateShader(GL_FRAGMENT_SHADER); + source = strdup("#version 110 \n" + "uniform sampler2D texture;" + "varying vec2 texcoord;" + "void main()" + "{" + " gl_FragColor = texture2D(texture, texcoord);" + "}"); + length = strlen(source); + glShaderSource(glsl->pixel_fshader, 1, (const GLchar**)&source, &length); + glCompileShader(glsl->pixel_fshader); + free(source); + + glGetShaderiv(glsl->pixel_fshader, GL_COMPILE_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to compile pixel fshader :\n"); + display_log(glsl->pixel_fshader, glGetShaderiv, glGetShaderInfoLog); + return (1); + } + + glsl->pixel_program = glCreateProgram(); + glAttachShader(glsl->pixel_program, glsl->pixel_vshader); + glAttachShader(glsl->pixel_program, glsl->pixel_fshader); + glLinkProgram(glsl->pixel_program); + + glGetProgramiv(glsl->pixel_program, GL_LINK_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to link pixel shader program:\n"); + display_log(glsl->pixel_program, glGetProgramiv, glGetProgramInfoLog); + return (1); + } + + glFlush(); + + return (0); +} + + +int mlx_shaders_image(glsl_info_t *glsl) +{ + char *source; + int length; + GLint action_ok; + + glsl->image_vshader = glCreateShader(GL_VERTEX_SHADER); + source = strdup("#version 110 \n" + "attribute vec2 position;" + "uniform vec2 winhalfsize;" + "uniform vec2 imagepos;" + "uniform vec2 imagesize;" + "varying vec2 texcoord;" + "void main()" + "{" + " texcoord = position / imagesize;" + " vec2 pos = position - winhalfsize + imagepos;" + " pos = pos / winhalfsize;" + " gl_Position = vec4( pos, 0.0, 1.0);" + "}"); + length = strlen(source); + glShaderSource(glsl->image_vshader, 1, (const GLchar**)&source, &length); + glCompileShader(glsl->image_vshader); + free(source); + + glGetShaderiv(glsl->image_vshader, GL_COMPILE_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to compile image vshader :\n"); + display_log(glsl->image_vshader, glGetShaderiv, glGetShaderInfoLog); + return (1); + } + + glsl->image_fshader = glCreateShader(GL_FRAGMENT_SHADER); + source = strdup("#version 110 \n" + "uniform sampler2D texture;" + "varying vec2 texcoord;" + "void main()" + "{" + " gl_FragColor = texture2D(texture, texcoord);" + "}"); + length = strlen(source); + glShaderSource(glsl->image_fshader, 1, (const GLchar**)&source, &length); + glCompileShader(glsl->image_fshader); + free(source); + + glGetShaderiv(glsl->image_fshader, GL_COMPILE_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to compile image fshader :\n"); + display_log(glsl->image_fshader, glGetShaderiv, glGetShaderInfoLog); + return (1); + } + + glsl->image_program = glCreateProgram(); + glAttachShader(glsl->image_program, glsl->image_vshader); + glAttachShader(glsl->image_program, glsl->image_fshader); + glLinkProgram(glsl->image_program); + + glGetProgramiv(glsl->image_program, GL_LINK_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to link image shader program:\n"); + display_log(glsl->image_program, glGetProgramiv, glGetProgramInfoLog); + return (1); + } + + glFlush(); + + return (0); +} + + + + +int mlx_shaders_font(glsl_info_t *glsl) +{ + char *source; + int length; + GLint action_ok; + + glsl->font_vshader = glCreateShader(GL_VERTEX_SHADER); + source = strdup("#version 110 \n" + "attribute vec2 position;" + "uniform vec2 winhalfsize;" + "uniform vec2 fontposinwin;" + "uniform vec2 fontposinatlas;" + "uniform vec2 fontatlassize;" + "varying vec2 texcoord;" + "void main()" + "{" + " texcoord = (position * vec2(1.0, -1.0) + fontposinatlas ) / fontatlassize;" + " vec2 pos = position - winhalfsize + fontposinwin;" + " pos = pos / winhalfsize;" + " gl_Position = vec4( pos, 0.0, 1.0);" + "}"); + length = strlen(source); + glShaderSource(glsl->font_vshader, 1, (const GLchar**)&source, &length); + glCompileShader(glsl->font_vshader); + free(source); + + glGetShaderiv(glsl->font_vshader, GL_COMPILE_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to compile font vshader :\n"); + display_log(glsl->font_vshader, glGetShaderiv, glGetShaderInfoLog); + return (1); + } + + glsl->font_fshader = glCreateShader(GL_FRAGMENT_SHADER); + source = strdup("#version 110 \n" + "uniform sampler2D texture;" + "uniform vec4 color;" + "varying vec2 texcoord;" + "void main()" + "{" + " gl_FragColor = color * texture2D(texture, texcoord);" + "}"); + length = strlen(source); + glShaderSource(glsl->font_fshader, 1, (const GLchar**)&source, &length); + glCompileShader(glsl->font_fshader); + free(source); + + glGetShaderiv(glsl->font_fshader, GL_COMPILE_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to compile font fshader :\n"); + display_log(glsl->font_fshader, glGetShaderiv, glGetShaderInfoLog); + return (1); + } + + glsl->font_program = glCreateProgram(); + glAttachShader(glsl->font_program, glsl->font_vshader); + glAttachShader(glsl->font_program, glsl->font_fshader); + glLinkProgram(glsl->font_program); + + glGetProgramiv(glsl->font_program, GL_LINK_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to link font shader program:\n"); + display_log(glsl->font_program, glGetProgramiv, glGetProgramInfoLog); + return (1); + } + + glFlush(); + + return (0); +} + + + +int mlx_shaders(glsl_info_t *glsl) +{ + return (mlx_shaders_pixel(glsl) + mlx_shaders_image(glsl) + mlx_shaders_font(glsl)); +} diff --git a/minilibx/mlx_xpm.c b/minilibx_macos/mlx_xpm.c similarity index 73% rename from minilibx/mlx_xpm.c rename to minilibx_macos/mlx_xpm.c index ac8928f..78d8c9b 100644 --- a/minilibx/mlx_xpm.c +++ b/minilibx_macos/mlx_xpm.c @@ -1,24 +1,36 @@ -/* -** xpm-read.c for MinilibX in -** -** Made by Charlie Root -** Login -** -** Started on Tue Dec 11 15:25:27 2001 olivier crouzet -** Last update Sat Oct 1 14:56:13 2005 Olivier Crouzet -*/ - +// mlx xpm +// by ol +#include +#include +#include +#include +#include +#include +#include #include "mlx_int.h" -extern struct s_col_name mlx_col_name[]; +typedef struct s_xpm_col +{ + int name; + int col; +} t_xpm_col; + + +struct s_col_name +{ + char *name; + int color; +}; + +//extern struct s_col_name mlx_col_name[]; +#include "mlx_rgb.c" #define RETURN { if (colors) free(colors); if (tab) free(tab); \ if (colors_direct) free(colors_direct); \ - if (img) {XDestroyImage(img->image); \ - XFreePixmap(xvar->display,img->pix);free(img);} \ - return ((void *)0);} + if (img) mlx_destroy_image(xvar, img); \ + return ((void *)0); } @@ -59,7 +71,7 @@ char *mlx_int_static_line(char **xpm_data,int *pos,int size) len = len2; } /* strcpy(copy,str); */ - strncpy(copy, str, len2+1); + strlcpy(copy, str, len2+1); return (copy); } @@ -97,8 +109,9 @@ int mlx_int_get_text_rgb(char *name, char *end) } -int mlx_int_xpm_set_pixel(t_img *img, char *data, int opp, int col, int x) +void mlx_int_xpm_set_pixel(mlx_img_list_t *img, char *data, int opp, int col, int x) { + /* int dec; dec = opp; @@ -110,10 +123,13 @@ int mlx_int_xpm_set_pixel(t_img *img, char *data, int opp, int col, int x) *(data+x*opp+opp-dec-1) = col&0xFF; col >>= 8; } + */ + // opp is 4, do it the simple way + *((unsigned int *)(data+4*x)) = col; } -void *mlx_int_parse_xpm(t_xvar *xvar,void *info,int info_size,char *(*f)()) +void *mlx_int_parse_xpm(mlx_ptr_t *xvar,void *info,int info_size,char *(*f)()) { int pos; char *line; @@ -130,14 +146,11 @@ void *mlx_int_parse_xpm(t_xvar *xvar,void *info,int info_size,char *(*f)()) int x; int i; int j; - t_img *img; + mlx_img_list_t *img; t_xpm_col *colors; int *colors_direct; int width; int height; - XImage *clip_img; - XGCValues xgcv; - Pixmap clip_pix; colors = 0; colors_direct = 0; @@ -176,35 +189,39 @@ void *mlx_int_parse_xpm(t_xvar *xvar,void *info,int info_size,char *(*f)()) if (!tab[j]) RETURN; - + + rgb_col = mlx_int_get_text_rgb(tab[j], tab[j+1]); + /* if ((rgb_col = mlx_int_get_text_rgb(tab[j], tab[j+1]))==-1) { - if (!(clip_data = malloc(4*width*height)) || /* ok, nice size .. */ + if (!(clip_data = malloc(4*width*height)) || // ok, nice size .. !(clip_img = XCreateImage(xvar->display, xvar->visual, 1, XYPixmap, 0, clip_data, width, height, 8, (width+7)/8)) ) RETURN; memset(clip_data, 0xFF, 4*width*height); } - + */ if (method) - colors_direct[mlx_int_get_col_name(line,cpp)] = - rgb_col>=0?mlx_get_color_value(xvar, rgb_col):rgb_col; + colors_direct[mlx_int_get_col_name(line,cpp)] = rgb_col; + // rgb_col>=0?mlx_get_color_value(xvar, rgb_col):rgb_col; else { colors[i].name = mlx_int_get_col_name(line,cpp); - colors[i].col = rgb_col>=0?mlx_get_color_value(xvar,rgb_col):rgb_col; + colors[i].col = rgb_col; // rgb_col>=0?mlx_get_color_value(xvar,rgb_col):rgb_col; } free(tab); + tab = 0; } if (!(img = mlx_new_image(xvar,width,height))) RETURN; - opp = img->bpp/8; + //opp = img->bpp/8; + opp = 4; i = height; - data = img->data; + data = img->buffer; while (i--) { if (!(line = f(info,&pos,info_size))) @@ -226,14 +243,18 @@ void *mlx_int_parse_xpm(t_xvar *xvar,void *info,int info_size,char *(*f)()) j = 0; } } + // if (col==-1) + // XPutPixel(clip_img, x, height-1-i, 0); + // else if (col==-1) - XPutPixel(clip_img, x, height-1-i, 0); - else - mlx_int_xpm_set_pixel(img, data, opp, col, x); + col = 0xFF000000; + mlx_int_xpm_set_pixel(img, data, opp, col, x); x ++; } - data += img->size_line; + // data += img->size_line; + data += img->width*4; } + /* if (clip_data) { if (!(clip_pix = XCreatePixmap(xvar->display, xvar->root, @@ -251,6 +272,7 @@ void *mlx_int_parse_xpm(t_xvar *xvar,void *info,int info_size,char *(*f)()) XSync(xvar->display, False); XDestroyImage(clip_img); } + */ if (colors) free(colors); if (colors_direct) @@ -259,7 +281,7 @@ void *mlx_int_parse_xpm(t_xvar *xvar,void *info,int info_size,char *(*f)()) } -int mlx_int_file_get_rid_comment(char *ptr, int size) +void mlx_int_file_get_rid_comment(char *ptr, int size) { int com_begin; int com_end; @@ -277,14 +299,13 @@ int mlx_int_file_get_rid_comment(char *ptr, int size) } -void *mlx_xpm_file_to_image(t_xvar *xvar,char *file,int *width,int *height) +void *mlx_xpm_file_to_image(mlx_ptr_t *xvar,char *file,int *width,int *height) { int fd; int size; char *ptr; - t_img *img; + mlx_img_list_t *img; - fd = -1; if ((fd = open(file,O_RDONLY))==-1 || (size = lseek(fd,0,SEEK_END))==-1 || (ptr = mmap(0,size,PROT_WRITE|PROT_READ,MAP_PRIVATE,fd,0))== (void *)MAP_FAILED) @@ -294,7 +315,7 @@ void *mlx_xpm_file_to_image(t_xvar *xvar,char *file,int *width,int *height) return ((void *)0); } mlx_int_file_get_rid_comment(ptr, size); - if (img = mlx_int_parse_xpm(xvar,ptr,size,mlx_int_get_line)) + if ((img = mlx_int_parse_xpm(xvar,ptr,size,mlx_int_get_line))) { *width = img->width; *height = img->height; @@ -304,11 +325,11 @@ void *mlx_xpm_file_to_image(t_xvar *xvar,char *file,int *width,int *height) return (img); } -void *mlx_xpm_to_image(t_xvar *xvar,char **xpm_data,int *width,int *height) +void *mlx_xpm_to_image(mlx_ptr_t *xvar,char **xpm_data,int *width,int *height) { - t_img *img; + mlx_img_list_t *img; - if (img = mlx_int_parse_xpm(xvar,xpm_data,0,mlx_int_static_line)) + if ((img = mlx_int_parse_xpm(xvar,xpm_data,0,mlx_int_static_line))) { *width = img->width; *height = img->height; diff --git a/src/hooks.c b/src/hooks.c index 6481fb0..e190098 100644 --- a/src/hooks.c +++ b/src/hooks.c @@ -6,7 +6,7 @@ /* By: gtertysh +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/16 18:59:03 by gtertysh #+# #+# */ -/* Updated: 2017/03/16 18:59:06 by gtertysh ### ########.fr */ +/* Updated: 2017/03/20 15:29:10 by gtertysh ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,7 +15,7 @@ int key_hook(int keycode, void *fdf) { ft_putnbr(keycode); - if (keycode == 65307) + if (keycode == 53) quit(fdf); // if (keycode == 89) // aclock_rot(fdf); diff --git a/src/main.c b/src/main.c index 3bccd14..91f683b 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: gtertysh +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/16 18:58:41 by gtertysh #+# #+# */ -/* Updated: 2017/03/16 18:58:44 by gtertysh ### ########.fr */ +/* Updated: 2017/03/20 15:33:20 by gtertysh ### ########.fr */ /* */ /* ************************************************************************** */ @@ -47,7 +47,7 @@ void recursive_circles(t_pnt pnt, float radius, t_fractol *fr) int tmp; drawcircle(pnt, radius, fr); pnt.color = color_lerp(pnt.color, color_lerp(pnt.color, color_init(0, 97, 255), 0.4), 0.3); - if (radius > 2) + if (radius > 3) { tmp = pnt.x; pnt.x = tmp + (int)radius / 2; @@ -70,8 +70,8 @@ int main(int argc, char **argv) srand(time(NULL)); fr = NULL; - argc = argc; - argv = argv; + argc = 0; + argv = 0; fr = fractol_init(); // while (pnt.y < fr->w_height) // {