From 3a1036ccdc9ee827ba71f9b32f189f3cf9ba922b Mon Sep 17 00:00:00 2001 From: Hugo LAMY Date: Fri, 25 Mar 2022 14:37:27 +0100 Subject: [PATCH] add recent minilibx linux as submodule --- .gitmodules | 3 + Makefile | 9 +- libs/minilibx-linux | 1 + libs/minilibx-linux-master/Makefile | 22 - libs/minilibx-linux-master/Makefile.gen | 48 - libs/minilibx-linux-master/Makefile.mk | 48 - libs/minilibx-linux-master/README.md | 43 - libs/minilibx-linux-master/configure | 95 - .../minilibx-linux-master/man/man1/mlx_loop.1 | 141 - .../man/man1/mlx_new_window.1 | 79 - .../man/man1/mlx_pixel_put.1 | 84 - libs/minilibx-linux-master/man/man3/mlx.1 | 93 - .../man/man3/mlx_new_image.1 | 192 - libs/minilibx-linux-master/mlx_clear_window.c | 21 - .../mlx_destroy_display.c | 18 - .../minilibx-linux-master/mlx_destroy_image.c | 31 - .../mlx_destroy_window.c | 38 - libs/minilibx-linux-master/mlx_expose_hook.c | 22 - libs/minilibx-linux-master/mlx_ext_randr.c | 104 - libs/minilibx-linux-master/mlx_flush_event.c | 25 - .../mlx_get_color_value.c | 33 - .../minilibx-linux-master/mlx_get_data_addr.c | 23 - libs/minilibx-linux-master/mlx_hook.c | 40 - libs/minilibx-linux-master/mlx_init.c | 97 - libs/minilibx-linux-master/mlx_int.h | 138 - .../mlx_int_anti_resize_win.c | 28 - .../mlx_int_do_nothing.c | 16 - .../mlx_int_get_visual.c | 39 - .../mlx_int_param_event.c | 100 - .../mlx_int_set_win_event_mask.c | 34 - .../mlx_int_wait_first_expose.c | 23 - libs/minilibx-linux-master/mlx_key_hook.c | 22 - libs/minilibx-linux-master/mlx_lib_xpm.c | 96 - libs/minilibx-linux-master/mlx_loop.c | 43 - libs/minilibx-linux-master/mlx_loop_hook.c | 21 - libs/minilibx-linux-master/mlx_mouse.c | 48 - libs/minilibx-linux-master/mlx_mouse_hook.c | 22 - libs/minilibx-linux-master/mlx_new_image.c | 155 - libs/minilibx-linux-master/mlx_new_window.c | 62 - libs/minilibx-linux-master/mlx_pixel_put.c | 26 - .../mlx_put_image_to_window.c | 37 - libs/minilibx-linux-master/mlx_screen_size.c | 13 - libs/minilibx-linux-master/mlx_set_font.c | 30 - libs/minilibx-linux-master/mlx_string_put.c | 26 - libs/minilibx-linux-master/mlx_xpm.c | 342 -- libs/minilibx-linux-master/rgb2c.pl | 38 - libs/minilibx-linux-master/test/Makefile.gen | 26 - libs/minilibx-linux-master/test/Makefile.mk | 24 - libs/minilibx-linux-master/test/main.c | 287 -- libs/minilibx-linux-master/test/mlx-test | Bin 77032 -> 0 bytes libs/minilibx-linux-master/test/new_win.c | 31 - libs/minilibx-linux-master/test/open.xpm | 1439 ------- libs/minilibx-linux-master/test/open24.xpm | 230 -- libs/minilibx-linux-master/test/open30.xpm | 1439 ------- libs/minilibx_mms_20200219/Makefile | 34 + libs/minilibx_mms_20200219/font.c | 3526 +++++++++++++++++ libs/minilibx_mms_20200219/interface.swift | 292 ++ .../man/man3/mlx.3} | 37 +- .../man/man3/mlx_loop.3} | 23 +- .../man/man3/mlx_new_image.3} | 36 +- .../man/man3/mlx_new_window.3} | 2 +- .../man/man3/mlx_pixel_put.3} | 10 +- libs/minilibx_mms_20200219/mlx.h | 157 + libs/minilibx_mms_20200219/mlx_image.swift | 48 + libs/minilibx_mms_20200219/mlx_init.swift | 100 + libs/minilibx_mms_20200219/mlx_png.c | 431 ++ .../mlx_rgb.c | 1 - libs/minilibx_mms_20200219/mlx_string_put.c | 72 + libs/minilibx_mms_20200219/mlx_window.swift | 541 +++ libs/minilibx_mms_20200219/mlx_xpm.c | 384 ++ libs/minilibx_mms_20200219_beta.tgz | Bin 48323 -> 0 bytes libs/minilibx_opengl.tgz | Bin 55462 -> 0 bytes libs/minilibx_opengl_20191021/._font.xcf | Bin 0 -> 176 bytes libs/minilibx_opengl_20191021/Makefile | 24 + libs/minilibx_opengl_20191021/font.c | 3525 ++++++++++++++++ libs/minilibx_opengl_20191021/font.xcf | Bin 0 -> 52570 bytes .../mlx.h | 46 +- libs/minilibx_opengl_20191021/mlx_init_loop.m | 192 + libs/minilibx_opengl_20191021/mlx_int.h | 102 + .../mlx_int_str_to_wordtab.c | 16 +- libs/minilibx_opengl_20191021/mlx_mouse.m | 52 + libs/minilibx_opengl_20191021/mlx_new_image.m | 198 + .../minilibx_opengl_20191021/mlx_new_window.h | 57 + .../minilibx_opengl_20191021/mlx_new_window.m | 766 ++++ libs/minilibx_opengl_20191021/mlx_opengl.h | 21 + libs/minilibx_opengl_20191021/mlx_opengl.m | 57 + libs/minilibx_opengl_20191021/mlx_png.c | 418 ++ libs/minilibx_opengl_20191021/mlx_png.h | 4 + libs/minilibx_opengl_20191021/mlx_rgb.c | 763 ++++ libs/minilibx_opengl_20191021/mlx_shaders.c | 240 ++ .../mlx_xpm.c} | 114 +- 91 files changed, 12193 insertions(+), 6241 deletions(-) create mode 160000 libs/minilibx-linux delete mode 100644 libs/minilibx-linux-master/Makefile delete mode 100644 libs/minilibx-linux-master/Makefile.gen delete mode 100644 libs/minilibx-linux-master/Makefile.mk delete mode 100644 libs/minilibx-linux-master/README.md delete mode 100755 libs/minilibx-linux-master/configure delete mode 100644 libs/minilibx-linux-master/man/man1/mlx_loop.1 delete mode 100644 libs/minilibx-linux-master/man/man1/mlx_new_window.1 delete mode 100644 libs/minilibx-linux-master/man/man1/mlx_pixel_put.1 delete mode 100644 libs/minilibx-linux-master/man/man3/mlx.1 delete mode 100644 libs/minilibx-linux-master/man/man3/mlx_new_image.1 delete mode 100644 libs/minilibx-linux-master/mlx_clear_window.c delete mode 100644 libs/minilibx-linux-master/mlx_destroy_display.c delete mode 100644 libs/minilibx-linux-master/mlx_destroy_image.c delete mode 100644 libs/minilibx-linux-master/mlx_destroy_window.c delete mode 100644 libs/minilibx-linux-master/mlx_expose_hook.c delete mode 100644 libs/minilibx-linux-master/mlx_ext_randr.c delete mode 100644 libs/minilibx-linux-master/mlx_flush_event.c delete mode 100644 libs/minilibx-linux-master/mlx_get_color_value.c delete mode 100644 libs/minilibx-linux-master/mlx_get_data_addr.c delete mode 100644 libs/minilibx-linux-master/mlx_hook.c delete mode 100644 libs/minilibx-linux-master/mlx_init.c delete mode 100644 libs/minilibx-linux-master/mlx_int.h delete mode 100644 libs/minilibx-linux-master/mlx_int_anti_resize_win.c delete mode 100644 libs/minilibx-linux-master/mlx_int_do_nothing.c delete mode 100644 libs/minilibx-linux-master/mlx_int_get_visual.c delete mode 100644 libs/minilibx-linux-master/mlx_int_param_event.c delete mode 100644 libs/minilibx-linux-master/mlx_int_set_win_event_mask.c delete mode 100644 libs/minilibx-linux-master/mlx_int_wait_first_expose.c delete mode 100644 libs/minilibx-linux-master/mlx_key_hook.c delete mode 100644 libs/minilibx-linux-master/mlx_lib_xpm.c delete mode 100644 libs/minilibx-linux-master/mlx_loop.c delete mode 100644 libs/minilibx-linux-master/mlx_loop_hook.c delete mode 100644 libs/minilibx-linux-master/mlx_mouse.c delete mode 100644 libs/minilibx-linux-master/mlx_mouse_hook.c delete mode 100644 libs/minilibx-linux-master/mlx_new_image.c delete mode 100644 libs/minilibx-linux-master/mlx_new_window.c delete mode 100644 libs/minilibx-linux-master/mlx_pixel_put.c delete mode 100644 libs/minilibx-linux-master/mlx_put_image_to_window.c delete mode 100644 libs/minilibx-linux-master/mlx_screen_size.c delete mode 100644 libs/minilibx-linux-master/mlx_set_font.c delete mode 100644 libs/minilibx-linux-master/mlx_string_put.c delete mode 100644 libs/minilibx-linux-master/mlx_xpm.c delete mode 100755 libs/minilibx-linux-master/rgb2c.pl delete mode 100644 libs/minilibx-linux-master/test/Makefile.gen delete mode 100644 libs/minilibx-linux-master/test/Makefile.mk delete mode 100644 libs/minilibx-linux-master/test/main.c delete mode 100755 libs/minilibx-linux-master/test/mlx-test delete mode 100644 libs/minilibx-linux-master/test/new_win.c delete mode 100644 libs/minilibx-linux-master/test/open.xpm delete mode 100644 libs/minilibx-linux-master/test/open24.xpm delete mode 100644 libs/minilibx-linux-master/test/open30.xpm create mode 100644 libs/minilibx_mms_20200219/Makefile create mode 100644 libs/minilibx_mms_20200219/font.c create mode 100644 libs/minilibx_mms_20200219/interface.swift rename libs/{minilibx-linux-master/man/man1/mlx.1 => minilibx_mms_20200219/man/man3/mlx.3} (63%) rename libs/{minilibx-linux-master/man/man3/mlx_loop.1 => minilibx_mms_20200219/man/man3/mlx_loop.3} (79%) rename libs/{minilibx-linux-master/man/man1/mlx_new_image.1 => minilibx_mms_20200219/man/man3/mlx_new_image.3} (85%) rename libs/{minilibx-linux-master/man/man3/mlx_new_window.1 => minilibx_mms_20200219/man/man3/mlx_new_window.3} (96%) rename libs/{minilibx-linux-master/man/man3/mlx_pixel_put.1 => minilibx_mms_20200219/man/man3/mlx_pixel_put.3} (82%) create mode 100644 libs/minilibx_mms_20200219/mlx.h create mode 100644 libs/minilibx_mms_20200219/mlx_image.swift create mode 100644 libs/minilibx_mms_20200219/mlx_init.swift create mode 100644 libs/minilibx_mms_20200219/mlx_png.c rename libs/{minilibx-linux-master => minilibx_mms_20200219}/mlx_rgb.c (99%) create mode 100644 libs/minilibx_mms_20200219/mlx_string_put.c create mode 100644 libs/minilibx_mms_20200219/mlx_window.swift create mode 100644 libs/minilibx_mms_20200219/mlx_xpm.c delete mode 100644 libs/minilibx_mms_20200219_beta.tgz delete mode 100644 libs/minilibx_opengl.tgz create mode 100644 libs/minilibx_opengl_20191021/._font.xcf create mode 100644 libs/minilibx_opengl_20191021/Makefile create mode 100644 libs/minilibx_opengl_20191021/font.c create mode 100644 libs/minilibx_opengl_20191021/font.xcf rename libs/{minilibx-linux-master => minilibx_opengl_20191021}/mlx.h (68%) create mode 100644 libs/minilibx_opengl_20191021/mlx_init_loop.m create mode 100644 libs/minilibx_opengl_20191021/mlx_int.h rename libs/{minilibx-linux-master => minilibx_opengl_20191021}/mlx_int_str_to_wordtab.c (86%) create mode 100644 libs/minilibx_opengl_20191021/mlx_mouse.m create mode 100644 libs/minilibx_opengl_20191021/mlx_new_image.m create mode 100644 libs/minilibx_opengl_20191021/mlx_new_window.h create mode 100644 libs/minilibx_opengl_20191021/mlx_new_window.m create mode 100644 libs/minilibx_opengl_20191021/mlx_opengl.h create mode 100644 libs/minilibx_opengl_20191021/mlx_opengl.m create mode 100644 libs/minilibx_opengl_20191021/mlx_png.c create mode 100644 libs/minilibx_opengl_20191021/mlx_png.h create mode 100644 libs/minilibx_opengl_20191021/mlx_rgb.c create mode 100644 libs/minilibx_opengl_20191021/mlx_shaders.c rename libs/{minilibx-linux-master/mlx_xpm.c.ok => minilibx_opengl_20191021/mlx_xpm.c} (70%) diff --git a/.gitmodules b/.gitmodules index 16b4032..2256a67 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "libs/libft"] path = libs/libft url = git@bitbucket.org:hugogogo/libft.git +[submodule "libs/minilibx-linux"] + path = libs/minilibx-linux + url = https://github.com/42Paris/minilibx-linux.git diff --git a/Makefile b/Makefile index ad1e59c..36ceb9c 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ NAME = cube3d VPATH = $(D_SRCS) EXT = c CC = gcc +OS = $(shell uname) # sources D_SRCS = srcs \ @@ -40,7 +41,11 @@ INCLUDES = -I$(D_HEADERS) -I$(D_LFT) -I$(D_LMLX) # libraries D_LIB = libs D_LFT = $(D_LIB)/libft -D_LMLX = $(D_LIB)/minilibx-linux-master +ifeq (${OS}, Linux) +D_LMLX = $(D_LIB)/minilibx-linux +else +D_LMLX = $(D_LIB)/minilibx-linux +endif # objects D_OBJS = builds @@ -72,6 +77,7 @@ $(OBJS): $(HEADERS:%=$(D_HEADERS)/%) $(NAME): $(OBJS) make -C $(D_LFT) + make -C $(D_LMLX) $(CC) $(OBJS) -o $@ $(LFLAGS) $(CFLAGS) leaks: $(NAME) @@ -82,6 +88,7 @@ clean: fclean: clean make fclean -C $(D_LFT) + make clean -C $(D_LMLX) rm -f $(NAME) re: fclean all diff --git a/libs/minilibx-linux b/libs/minilibx-linux new file mode 160000 index 0000000..7dc53a4 --- /dev/null +++ b/libs/minilibx-linux @@ -0,0 +1 @@ +Subproject commit 7dc53a411a7d4ae286c60c6229bd1e395b0efb82 diff --git a/libs/minilibx-linux-master/Makefile b/libs/minilibx-linux-master/Makefile deleted file mode 100644 index 5c418c5..0000000 --- a/libs/minilibx-linux-master/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 - -clean : - ./configure clean - -re : clean all diff --git a/libs/minilibx-linux-master/Makefile.gen b/libs/minilibx-linux-master/Makefile.gen deleted file mode 100644 index 5eded88..0000000 --- a/libs/minilibx-linux-master/Makefile.gen +++ /dev/null @@ -1,48 +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_set_font.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 mlx_mouse.c mlx_screen_size.c \ - mlx_destroy_display.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) libmlx_$(HT).a *~ core *.core diff --git a/libs/minilibx-linux-master/Makefile.mk b/libs/minilibx-linux-master/Makefile.mk deleted file mode 100644 index fd93700..0000000 --- a/libs/minilibx-linux-master/Makefile.mk +++ /dev/null @@ -1,48 +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_set_font.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 mlx_mouse.c mlx_screen_size.c \ - mlx_destroy_display.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) libmlx_$(HT).a *~ core *.core diff --git a/libs/minilibx-linux-master/README.md b/libs/minilibx-linux-master/README.md deleted file mode 100644 index 40cded8..0000000 --- a/libs/minilibx-linux-master/README.md +++ /dev/null @@ -1,43 +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 - - make - - X11 include files (package xorg) - - XShm extension must be present (package libxext-dev) - - Utility functions from BSD systems - development files (package libbsd-dev) - - **e.g. _sudo apt-get install gcc make xorg libxext-dev libbsd-dev_ (Debian/Ubuntu)** - -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/libs/minilibx-linux-master/configure b/libs/minilibx-linux-master/configure deleted file mode 100755 index 04fcdc4..0000000 --- a/libs/minilibx-linux-master/configure +++ /dev/null @@ -1,95 +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 \ - /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/libs/minilibx-linux-master/man/man1/mlx_loop.1 b/libs/minilibx-linux-master/man/man1/mlx_loop.1 deleted file mode 100644 index 3397ce2..0000000 --- a/libs/minilibx-linux-master/man/man1/mlx_loop.1 +++ /dev/null @@ -1,141 +0,0 @@ -.TH MiniLibX 3 "September 19, 2002" -.SH NAME -MiniLibX - Handle events -.SH SYNOPSYS - -.nf -.I int -.fi -.B mlx_loop -( -.I void *mlx_ptr -); - -.nf -.I int -.fi -.B mlx_key_hook -( -.I void *win_ptr, int (*funct_ptr)(), void *param -); - -.nf -.I int -.fi -.B mlx_mouse_hook -( -.I void *win_ptr, int (*funct_ptr)(), void *param -); - -.nf -.I int -.fi -.B mlx_expose_hook -( -.I void *win_ptr, int (*funct_ptr)(), void *param -); - -.nf -.I int -.fi -.B mlx_loop_hook -( -.I void *mlx_ptr, int (*funct_ptr)(), void *param -); - -.SH X-WINDOW EVENTS - -The X-Window system is 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 -mouse. - -.SH DESCRIPTION - -To receive events, you must use -.B mlx_loop -(). This function never returns. It is an infinite loop that waits for -an event, and then calls a user-defined function associated with this event. -A single parameter is needed, the connection identifier -.I mlx_ptr -(see the -.B mlx manual). - -You can assign different functions to the three following events: -.br -- A key is pressed -.br -- The mouse button is pressed -.br -- A part of the window should be re-drawn -(this is called an "expose" event, and it is your program's job to handle it). -.br - -Each window can define a different function for the same event. - -The three functions -.B mlx_key_hook -(), -.B mlx_mouse_hook -() and -.B mlx_expose_hook -() work exactly the same way. -.I funct_ptr -is a pointer to the function you want to be called -when an event occurs. This assignment is specific to the window defined by the -.I win_ptr -identifier. The -.I param -adress will be passed to the function everytime it is called, and should be -used to store the parameters it might need. - -The syntax for the -.B mlx_loop_hook -() function is identical to the previous ones, but the given function will be -called when no event occurs. - -When it catches an event, the MiniLibX calls the corresponding function -with fixed parameters: -.nf - - expose_hook(void *param); - key_hook(int keycode,void *param); - mouse_hook(int button,int x,int y,void *param); - loop_hook(void *param); - -.fi -These function names are arbitrary. They here are used to distinguish -parameters according to the event. These functions are NOT part of the -MiniLibX. - -.I param -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"), -( -.I x -, -.I y -) are the coordinates of the mouse click in the window, and -.I button -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 -.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". - -See source code of mlx_int_param_event.c to find out how the MiniLibX will -call your own function for a specific event. - -.SH SEE ALSO -mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3) - -.SH AUTHOR -Copyright ol@ - 2002-2014 - Olivier Crouzet diff --git a/libs/minilibx-linux-master/man/man1/mlx_new_window.1 b/libs/minilibx-linux-master/man/man1/mlx_new_window.1 deleted file mode 100644 index 90f6d47..0000000 --- a/libs/minilibx-linux-master/man/man1/mlx_new_window.1 +++ /dev/null @@ -1,79 +0,0 @@ -.TH MiniLibX 3 "September 19, 2002" -.SH NAME -MiniLibX - Managing windows -.SH SYNOPSYS - -.nf -.I void * -.fi -.B mlx_new_window -( -.I void *mlx_ptr, int size_x, int size_y, char *title -); - -.nf -.I int -.fi -.B mlx_clear_window -( -.I void *mlx_ptr, void *win_ptr -); - -.nf -.I int -.fi -.B mlx_destroy_window -( -.I void *mlx_ptr, void *win_ptr -); - - -.SH DESCRIPTION -The -.B mlx_new_window -() function creates a new window on the screen, using the -.I size_x -and -.I size_y -parameters to determine its size, and -.I title -as the text that should be displayed in the window's title bar. -The -.I mlx_ptr -parameter is the connection identifier returned by -.B mlx_init -() (see the -.B mlx -man page). -.B mlx_new_window -() returns a -.I void * -window identifier that can be used by other MiniLibX calls. -Note that the MiniLibX -can handle an arbitrary number of separate windows. - -.B mlx_clear_window -() and -.B mlx_destroy_window -() respectively clear (in black) and destroy the given window. They both have -the same parameters: -.I mlx_ptr -is the screen connection identifier, and -.I win_ptr -is a window identifier. - -.SH RETURN VALUES -If -.B mlx_new_window() -fails to create a new window (for wathever reason), it will return NULL, -otherwise a non-null pointer is returned as a window identifier. -.B mlx_clear_window -and -.B mlx_destroy_window -right now return nothing. - -.SH SEE ALSO -mlx(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3) - -.SH AUTHOR -Copyright ol@ - 2002-2014 - Olivier Crouzet diff --git a/libs/minilibx-linux-master/man/man1/mlx_pixel_put.1 b/libs/minilibx-linux-master/man/man1/mlx_pixel_put.1 deleted file mode 100644 index 258df58..0000000 --- a/libs/minilibx-linux-master/man/man1/mlx_pixel_put.1 +++ /dev/null @@ -1,84 +0,0 @@ -.TH MiniLibX 3 "September 19, 2002" -.SH NAME -MiniLibX - Drawing inside windows -.SH SYNOPSYS - -.nf -.I int -.fi -.B mlx_pixel_put -( -.I void *mlx_ptr, void *win_ptr, int x, int y, int color -); - -.nf -.I int -.fi -.B mlx_string_put -( -.I void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string -); - - -.SH DESCRIPTION -The -.B mlx_pixel_put -() function draws a defined pixel in the window -.I win_ptr -using the ( -.I x -, -.I y -) coordinates, and the specified -.I color -\&. The origin (0,0) is the upper left corner of the window, the x and y axis -respectively pointing right and down. The connection -identifier, -.I mlx_ptr -, is needed (see the -.B mlx -man page). - -Parameters for -.B mlx_string_put -() have the same meaning. Instead of a simple pixel, the specified -.I string -will be displayed at ( -.I x -, -.I y -). - -In both functions, it is impossible to display anything outside the -specified window, nor display in another window in front of the selected one. - -.SH COLOR MANAGEMENT -The -.I color -parameter has an integer type. The displayed color needs to be encoded -in this integer, following a defined scheme. All displayable colors -can be split in 3 basic colors: red, green and blue. Three associated -values, in the 0-255 range, represent how much of each color is mixed up -to create the original color. Theses three values must be set inside the -integer to display the right color. The three least significant bytes of -this integer are filled as shown in the picture below: - -.TS -allbox; -c s s s s -r c c c c. -Color Integer -Interpretation \[*a] R G B -Bit numbers 31..24 23..16 15..8 7..0 -.TE - -While filling the integer, make sure you avoid endian problems. Remember -that the "blue" byte should always be the least significant one. - - -.SH SEE ALSO -mlx(3), mlx_new_window(3), mlx_new_image(3), mlx_loop(3) - - -.SH AUTHOR -Copyright ol@ - 2002-2014 - Olivier Crouzet diff --git a/libs/minilibx-linux-master/man/man3/mlx.1 b/libs/minilibx-linux-master/man/man3/mlx.1 deleted file mode 100644 index 9ad0ac1..0000000 --- a/libs/minilibx-linux-master/man/man3/mlx.1 +++ /dev/null @@ -1,93 +0,0 @@ -.TH MiniLibX 3 "September 19, 2002" -.SH NAME -MiniLibX - Simple X-Window Interface Library for students -.SH SYNOPSYS -#include - -.nf -.I void * -.fi -.B mlx_init -(); - -.SH DESCRIPTION -MiniLibX is an easy way to create graphical software, -without any X-Window programming knowledge. It provides -simple window creation, a drawing tool, image and basic events -management. - -.SH X-WINDOW CONCEPT - -X-Window is a network-oriented graphical system for Unix. -It is based on two main parts: -.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 X-Server manages the screen, keyboard and mouse -(It is often refered to as a "display"). -.br -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 INCLUDE FILE -.B mlx.h -should be included for a correct use of the MiniLibX API. -It only contains function prototypes, no structure is needed. - -.SH LIBRARY FUNCTIONS -.P -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, -like "I want to draw a yellow pixel in this window" or "did the -user hit a key?". -.P -The -.B mlx_init -function will create this connection. No parameters are needed, ant it will -return a -.I "void *" -identifier, used for further calls to the library routines. -.P -All other MiniLibX functions are described in the following man pages: - -.TP 20 -.B mlx_new_window -: manage windows -.TP 20 -.B mlx_pixel_put -: draw inside window -.TP 20 -.B mlx_new_image -: manipulate images -.TP 20 -.B mlx_loop -: handle keyboard or mouse events - -.SH LINKING MiniLibX -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: - -.B -lmlx -lXext -lX11 - -You may also need to specify the path to these libraries, 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 -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 diff --git a/libs/minilibx-linux-master/man/man3/mlx_new_image.1 b/libs/minilibx-linux-master/man/man3/mlx_new_image.1 deleted file mode 100644 index f2160a2..0000000 --- a/libs/minilibx-linux-master/man/man3/mlx_new_image.1 +++ /dev/null @@ -1,192 +0,0 @@ -.TH MiniLibX 3 "September 19, 2002" -.SH NAME -MiniLibX - Manipulating images -.SH SYNOPSYS - -.nf -.I void * -.fi -.B mlx_new_image -( -.I void *mlx_ptr, int width, int height -); - -.nf -.I char * -.fi -.B mlx_get_data_addr -( -.I void *img_ptr, int *bits_per_pixel, int *size_line, int *endian -); - -.nf -.I int -.fi -.B mlx_put_image_to_window -( -.I void *mlx_ptr, void *win_ptr, void *img_ptr, int x, int y -); - -.nf -.I unsigned int -.fi -.B mlx_get_color_value -( -.I void *mlx_ptr, int color -); - -.nf -.I void * -.fi -.B mlx_xpm_to_image -( -.I void *mlx_ptr, char **xpm_data, int *width, int *height -); - -.nf -.I void * -.fi -.B mlx_xpm_file_to_image -( -.I void *mlx_ptr, char *filename, int *width, int *height -); - -.nf -.I int -.fi -.B mlx_destroy_image -( -.I void *mlx_ptr, void *img_ptr -); - - -.SH DESCRIPTION - -.B mlx_new_image -() creates a new image in memory. It returns a -.I void * -identifier needed to manipulate this image later. It only needs -the size of the image to be created, using the -.I width -and -.I height -parameters, and the -.I mlx_ptr -connection identifier (see the -.B mlx -manual). - -The user can draw inside the image (see below), and -can dump the image inside a specified window at any time to -display it on the screen. This is done using -.B mlx_put_image_to_window -(). Three identifiers are needed here, for the connection to the -display, the window to use, and the image (respectively -.I mlx_ptr -, -.I win_ptr -and -.I img_ptr -). The ( -.I x -, -.I y -) coordinates define where the image should be placed in the window. - -.B mlx_get_data_addr -() returns information about the created image, allowing a user -to modify it later. The -.I img_ptr -parameter specifies the image to use. The three next parameters should -be the addresses of three different valid integers. -.I bits_per_pixel -will be filled with the number of bits needed to represent a pixel color -(also called the depth of the image). -.I size_line -is the number of bytes used to store one line of the image in memory. -This information is needed to move from one line to another in the image. -.I endian -tells you wether the pixel color in the image needs to be stored in -little endian ( -.I endian -== 0), or big endian ( -.I endian -== 1). - -.B mlx_get_data_addr -returns a -.I char * -address that represents the begining of the memory area where the image -is stored. From this adress, the first -.I bits_per_pixel -bits represent the color of the first pixel in the first line of -the image. The second group of -.I bits_per_pixel -bits represent the second pixel of the first line, and so on. -Add -.I size_line -to the adress to get the begining of the second line. You can reach any -pixels of the image that way. - -.B mlx_destroy_image -destroys the given image ( -.I img_ptr -). - -.SH STORING COLOR INSIDE IMAGES - -Depending on the display, the number of bits used to store a pixel color -can change. The user usually represents a color in RGB mode, using -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. -That is the purpose of the -.B mlx_get_color_value -() function. It takes a standard RGB -.I color -parameter, and returns an -.I unsigned int -value. -The -.I bits_per_pixel -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 -be transformed before being used. - -.SH XPM IMAGES - -The -.B mlx_xpm_to_image -() and -.B mlx_xpm_file_to_image -() functions will create a new image the same way. -They will fill it using the specified -.I xpm_data -or -.I filename -, depending on which function is used. -Note that MiniLibX does not use the standard -Xpm library to deal with xpm images. You may not be able to -read all types of xpm images. It however handles transparency. - -.SH RETURN VALUES -The three functions that create images, -.B mlx_new_image() -, -.B mlx_xpm_to_image() -and -.B mlx_xpm_file_to_image() -, will return NULL if an error occurs. Otherwise they return a non-null pointer -as an image identifier. - - -.SH SEE ALSO -mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_loop(3) - -.SH AUTHOR -Copyright ol@ - 2002-2014 - Olivier Crouzet diff --git a/libs/minilibx-linux-master/mlx_clear_window.c b/libs/minilibx-linux-master/mlx_clear_window.c deleted file mode 100644 index f621090..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_destroy_display.c b/libs/minilibx-linux-master/mlx_destroy_display.c deleted file mode 100644 index d2970b8..0000000 --- a/libs/minilibx-linux-master/mlx_destroy_display.c +++ /dev/null @@ -1,18 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* mlx_destroy_display.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: mg +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2020/10/03 18:56:35 by mg #+# #+# */ -/* Updated: 2020/10/04 01:55:35 by mg ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "mlx_int.h" - -int mlx_destroy_display(t_xvar *xvar) -{ - XCloseDisplay(xvar->display); -} diff --git a/libs/minilibx-linux-master/mlx_destroy_image.c b/libs/minilibx-linux-master/mlx_destroy_image.c deleted file mode 100644 index afd4d1a..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_destroy_window.c b/libs/minilibx-linux-master/mlx_destroy_window.c deleted file mode 100644 index 464790c..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_expose_hook.c b/libs/minilibx-linux-master/mlx_expose_hook.c deleted file mode 100644 index b00b675..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_ext_randr.c b/libs/minilibx-linux-master/mlx_ext_randr.c deleted file mode 100644 index 34ddb91..0000000 --- a/libs/minilibx-linux-master/mlx_ext_randr.c +++ /dev/null @@ -1,104 +0,0 @@ - - - -#include "mlx_int.h" - -#include -#include - -/* global for independant extension */ - -RRMode saved_mode = 0; - - -int mlx_ext_fullscreen(t_xvar *xvar, t_win_list *win, int fullscreen) -{ - XWindowAttributes watt; - int i; - int j; - XRRScreenResources *res; - XRROutputInfo *o_info; - XRRCrtcInfo *crtc; - RRMode mode_candidate; - int idx_output; - int idx_candidate; - - if (!XGetWindowAttributes(xvar->display, win->window, &watt)) - return (0); - - res = XRRGetScreenResources(xvar->display, xvar->root); - o_info = NULL; - idx_output = -1; - i = res->noutput; - while (i--) - { - o_info = XRRGetOutputInfo(xvar->display, res, res->outputs[i]); - if (o_info->connection == RR_Connected) - { - idx_output = i; - i = 0; - } - else - XRRFreeOutputInfo(o_info); - } - if (!o_info) - { - XRRFreeScreenResources(res); - return (0); - } - - idx_candidate = -1; - i = o_info->nmode; - while (i--) - { - j = res->nmode; - while (j--) - if (res->modes[j].id == o_info->modes[i]) - if (res->modes[j].width >= watt.width && res->modes[j].height >= watt.height && - (idx_candidate == -1 || res->modes[idx_candidate].width > res->modes[j].width || - res->modes[idx_candidate].height > res->modes[j].height) ) - idx_candidate = i; - } - if (idx_candidate < 0) - { - XRRFreeOutputInfo(o_info); - XRRFreeScreenResources(res); - return (0); - } - if (!fullscreen && saved_mode == -1) - idx_candidate = 0; /* if no clue, uses first mode, usually part of npreferred */ - mode_candidate = o_info->modes[idx_candidate]; - if (!fullscreen) - mode_candidate = saved_mode; - - crtc = XRRGetCrtcInfo(xvar->display, res, o_info->crtc); - saved_mode = crtc->mode; - - i = XRRSetCrtcConfig(xvar->display, res, o_info->crtc, CurrentTime, 0, 0, mode_candidate, - crtc->rotation, &res->outputs[idx_output], 1); - if (fullscreen) - printf("found mode : %d x %d\n Status %d\n", res->modes[idx_candidate].width, res->modes[idx_candidate].height, i); - else - printf("back previous mode\n"); - - XMoveWindow(xvar->display, win->window, 0, 0); - XMapRaised(xvar->display, win->window); - - if (fullscreen) - { - // XGrabPointer(xvar->display, win->window, True, 0, GrabModeAsync, GrabModeAsync, win->window, 0L, CurrentTime); - XGrabKeyboard(xvar->display, win->window, False, GrabModeAsync, GrabModeAsync, CurrentTime); - } - else - { - XUngrabPointer(xvar->display, CurrentTime); - XUngrabKeyboard(xvar->display, CurrentTime); - } - - XSync(xvar->display, False); - sleep(1); - - XRRFreeCrtcInfo(crtc); - XRRFreeOutputInfo(o_info); - XRRFreeScreenResources(res); -} diff --git a/libs/minilibx-linux-master/mlx_flush_event.c b/libs/minilibx-linux-master/mlx_flush_event.c deleted file mode 100644 index 1e586ad..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_get_color_value.c b/libs/minilibx-linux-master/mlx_get_color_value.c deleted file mode 100644 index b620970..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_get_data_addr.c b/libs/minilibx-linux-master/mlx_get_data_addr.c deleted file mode 100644 index 45e7a85..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_hook.c b/libs/minilibx-linux-master/mlx_hook.c deleted file mode 100644 index 98e509a..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_init.c b/libs/minilibx-linux-master/mlx_init.c deleted file mode 100644 index 2ca8422..0000000 --- a/libs/minilibx-linux-master/mlx_init.c +++ /dev/null @@ -1,97 +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)))) - return ((void*)0); - if ((xvar->display = XOpenDisplay("")) == 0) - { - free(xvar); - 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; - xvar->wm_delete_window = XInternAtom (xvar->display, "WM_DELETE_WINDOW", False); - 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/libs/minilibx-linux-master/mlx_int.h b/libs/minilibx-linux-master/mlx_int.h deleted file mode 100644 index 58c22c7..0000000 --- a/libs/minilibx-linux-master/mlx_int.h +++ /dev/null @@ -1,138 +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 -*/ - -#ifndef MLX_INT_H - -# define MLX_INT_H - -# include -# 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]; - Atom wm_delete_window; -} t_xvar; - - -int mlx_int_do_nothing(); -int mlx_get_color_value(); -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(); -int mlx_int_get_visual(t_xvar *xvar); -int mlx_int_set_win_event_mask(t_xvar *xvar); -int mlx_int_str_str_cote(char *str,char *find,int len); -int mlx_int_str_str(char *str,char *find,int len); - - -#endif diff --git a/libs/minilibx-linux-master/mlx_int_anti_resize_win.c b/libs/minilibx-linux-master/mlx_int_anti_resize_win.c deleted file mode 100644 index 2f20b44..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_int_do_nothing.c b/libs/minilibx-linux-master/mlx_int_do_nothing.c deleted file mode 100644 index 49524e4..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_int_get_visual.c b/libs/minilibx-linux-master/mlx_int_get_visual.c deleted file mode 100644 index 440a7ca..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_int_param_event.c b/libs/minilibx-linux-master/mlx_int_param_event.c deleted file mode 100644 index 8756a22..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_int_set_win_event_mask.c b/libs/minilibx-linux-master/mlx_int_set_win_event_mask.c deleted file mode 100644 index 55650cd..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_int_wait_first_expose.c b/libs/minilibx-linux-master/mlx_int_wait_first_expose.c deleted file mode 100644 index 0d549ee..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_key_hook.c b/libs/minilibx-linux-master/mlx_key_hook.c deleted file mode 100644 index eea6484..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_lib_xpm.c b/libs/minilibx-linux-master/mlx_lib_xpm.c deleted file mode 100644 index b8cf184..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_loop.c b/libs/minilibx-linux-master/mlx_loop.c deleted file mode 100644 index c5f83be..0000000 --- a/libs/minilibx-linux-master/mlx_loop.c +++ /dev/null @@ -1,43 +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 (ev.type == ClientMessage && (Atom)ev.xclient.data.l[0] == xvar->wm_delete_window) - XDestroyWindow(xvar->display, win->window); - if (win->hooks[ev.type].hook) - mlx_int_param_event[ev.type](xvar, &ev, win); - } - } - XSync(xvar->display, False); - xvar->loop_hook(xvar->loop_param); - } -} diff --git a/libs/minilibx-linux-master/mlx_loop_hook.c b/libs/minilibx-linux-master/mlx_loop_hook.c deleted file mode 100644 index 1f8b9ed..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_mouse.c b/libs/minilibx-linux-master/mlx_mouse.c deleted file mode 100644 index ce0d4c9..0000000 --- a/libs/minilibx-linux-master/mlx_mouse.c +++ /dev/null @@ -1,48 +0,0 @@ -#include "mlx_int.h" - -int mlx_mouse_move(t_xvar *xvar, t_win_list *win, int x, int y) -{ - XWarpPointer(xvar->display, None, win->window, 0, 0, 0, 0, x, y); - return (0); -} - -int mlx_mouse_hide(t_xvar *xvar, t_win_list *win) -{ - static char data[1] = {0}; - Cursor cursor; - Pixmap blank; - XColor dummy; - - blank = XCreateBitmapFromData(xvar->display, win->window, data, 1, 1); - cursor = XCreatePixmapCursor(xvar->display, blank, blank, &dummy, &dummy, 0, 0); - XDefineCursor(xvar->display, win->window, cursor); - XFreePixmap(xvar->display, blank); - XFreeCursor(xvar->display, cursor); -} - -int mlx_mouse_show(t_xvar *xvar, t_win_list *win) -{ - XUndefineCursor(xvar->display, win->window); -} - -/* -** Queries the position of the mouse pointer relative to the origin of the -** specified window and saves it to the provided location. -** -** If the pointer is not on the same screen as the specified window, both -** win_x_return and win_y_return are set to zero and the function returns 0. -*/ - -int mlx_mouse_get_pos(t_xvar *xvar, t_win_list *win, \ - int *win_x_return, int *win_y_return) -{ - Window root_return; - Window child_return; - int root_x_return; - int root_y_return; - unsigned mask_return; - - return (XQueryPointer(xvar->display, win->window, \ - &root_return, &child_return, &root_x_return, &root_y_return, \ - win_x_return, win_y_return, &mask_return)); -} diff --git a/libs/minilibx-linux-master/mlx_mouse_hook.c b/libs/minilibx-linux-master/mlx_mouse_hook.c deleted file mode 100644 index cb567ab..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_new_image.c b/libs/minilibx-linux-master/mlx_new_image.c deleted file mode 100644 index 9967401..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_new_window.c b/libs/minilibx-linux-master/mlx_new_window.c deleted file mode 100644 index 3f05914..0000000 --- a/libs/minilibx-linux-master/mlx_new_window.c +++ /dev/null @@ -1,62 +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); - XSetWMProtocols(xvar->display, new_win->window, &(xvar->wm_delete_window), 1); - 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/libs/minilibx-linux-master/mlx_pixel_put.c b/libs/minilibx-linux-master/mlx_pixel_put.c deleted file mode 100644 index c411f36..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_put_image_to_window.c b/libs/minilibx-linux-master/mlx_put_image_to_window.c deleted file mode 100644 index 86ba3f4..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_screen_size.c b/libs/minilibx-linux-master/mlx_screen_size.c deleted file mode 100644 index 835730d..0000000 --- a/libs/minilibx-linux-master/mlx_screen_size.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "mlx_int.h" - -int mlx_get_screen_size(void *mlx_ptr, int *sizex, int *sizey) -{ - XWindowAttributes xwAttr; - Status ret; - t_xvar *xvar; - - xvar = mlx_ptr; - ret = XGetWindowAttributes(xvar->display, xvar->root, &xwAttr); - (*sizex) = xwAttr.width; - (*sizey) = xwAttr.height; -} diff --git a/libs/minilibx-linux-master/mlx_set_font.c b/libs/minilibx-linux-master/mlx_set_font.c deleted file mode 100644 index 111e3b8..0000000 --- a/libs/minilibx-linux-master/mlx_set_font.c +++ /dev/null @@ -1,30 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* mlx_set_font.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: amalliar +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2020/09/30 13:30:47 by amalliar #+# #+# */ -/* Updated: 2020/09/30 17:08:36 by amalliar ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "mlx_int.h" - -/* -** Allows to specify the font that will be used by mlx_string_put. -** -** Note: only fixed-width bitmap fonts are supported by Xlib, refer to xfontsel -** utility to get valid font names for this function. -*/ - -void mlx_set_font(t_xvar *xvar, t_win_list *win, char *name) -{ - static Font font = 0; - - if (font) - XUnloadFont(xvar->display, font); - font = XLoadFont(xvar->display, name); - XSetFont(xvar->display, win->gc, font); -} diff --git a/libs/minilibx-linux-master/mlx_string_put.c b/libs/minilibx-linux-master/mlx_string_put.c deleted file mode 100644 index 8492a09..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/mlx_xpm.c b/libs/minilibx-linux-master/mlx_xpm.c deleted file mode 100644 index 4a527f6..0000000 --- a/libs/minilibx-linux-master/mlx_xpm.c +++ /dev/null @@ -1,342 +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:56:13 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); -} - - -unsigned int strlcpy_is_not_posix(char *dest, char *src, unsigned int size) -{ - unsigned count; - unsigned i; - - count = 0; - while (src[count] != '\0') - ++count; - i = 0; - while (src[i] != '\0' && i < (size - 1)) - { - dest[i] = src[i]; - ++i; - } - dest[i] = '\0'; - return (count); -} - -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; - } - strlcpy_is_not_posix(copy, str, len2); - - 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, char *end) -{ - int i; - char buff[64]; - - if (*name == '#') - return (strtol(name+1,0,16)); - if (end) - { - snprintf(buff, 64, "%s %s", name, end); - name = buff; - } - 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; - unsigned int ucol; - - if (opp == 4 && img->image->byte_order) - ucol = col | 0x000000FF; - else if (opp == 4) - ucol = col | 0xFF000000; - else - ucol = col; - dec = opp; - while (dec--) - { - if (img->image->byte_order) - *(data+x*opp+dec) = ucol&0xFF; - else - *(data+x*opp+opp-dec-1) = ucol&0xFF; - ucol >>= 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], tab[j+1]))==-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/libs/minilibx-linux-master/rgb2c.pl b/libs/minilibx-linux-master/rgb2c.pl deleted file mode 100755 index 9ef39a0..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/test/Makefile.gen b/libs/minilibx-linux-master/test/Makefile.gen deleted file mode 100644 index 2fcca89..0000000 --- a/libs/minilibx-linux-master/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 -lbsd - -clean : - rm -f $(NAME) $(OBJ) *~ core *.core - - -re : clean all diff --git a/libs/minilibx-linux-master/test/Makefile.mk b/libs/minilibx-linux-master/test/Makefile.mk deleted file mode 100644 index ca55cd3..0000000 --- a/libs/minilibx-linux-master/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 -lbsd - -clean : - rm -f $(NAME) $(OBJ) *~ core *.core - - -re : clean all diff --git a/libs/minilibx-linux-master/test/main.c b/libs/minilibx-linux-master/test/main.c deleted file mode 100644 index 578eaae..0000000 --- a/libs/minilibx-linux-master/test/main.c +++ /dev/null @@ -1,287 +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 color_map_1(void *win,int w,int h); -int color_map_2(unsigned char *data,int bpp,int sl,int w,int h,int endian, int type); - -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/libs/minilibx-linux-master/test/mlx-test b/libs/minilibx-linux-master/test/mlx-test deleted file mode 100755 index b7c7fefdf7de1f2df575234b4bd5d12535770b7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77032 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 Tjh5`!_Y(V`G$GbnZWaFr9-6XO diff --git a/libs/minilibx-linux-master/test/new_win.c b/libs/minilibx-linux-master/test/new_win.c deleted file mode 100644 index 62bed4b..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/test/open.xpm b/libs/minilibx-linux-master/test/open.xpm deleted file mode 100644 index 87be371..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/test/open24.xpm b/libs/minilibx-linux-master/test/open24.xpm deleted file mode 100644 index f363254..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx-linux-master/test/open30.xpm b/libs/minilibx-linux-master/test/open30.xpm deleted file mode 100644 index 87be371..0000000 --- a/libs/minilibx-linux-master/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/libs/minilibx_mms_20200219/Makefile b/libs/minilibx_mms_20200219/Makefile new file mode 100644 index 0000000..39c36f4 --- /dev/null +++ b/libs/minilibx_mms_20200219/Makefile @@ -0,0 +1,34 @@ + + + +MODULE_SRC= mlx_image.swift mlx_window.swift mlx_init.swift +MODULE_OBJ=$(MODULE_SRC:.swift=.swiftmodule) + +SRC= interface.swift $(MODULE_SRC) +OBJ=$(SRC:.swift=.o) + +C_SRC= mlx_xpm.c mlx_png.c mlx_string_put.c +C_OBJ=$(C_SRC:.c=.o) +CFLAGS=-O3 + +NAME=libmlx.dylib + +INC=-I. +#OPTI=-Ounchecked + +all: $(NAME) + +$(NAME): $(MODULE_OBJ) $(OBJ) $(C_OBJ) + swiftc $(OPTI) $(INC) -o $(NAME) -emit-library $(OBJ) $(C_OBJ) -lz + + + +%.o: %.swift + swiftc $(OPTI) $(INC) -parse-as-library -c $< -o $@ + +%.swiftmodule: %.swift + swiftc $(OPTI) $(INC) -parse-as-library -c $< -o $@ -emit-module -module-name $(patsubst %.swift,%,$<) -module-link-name $(patsubst %.swift,%,$<) + +clean: + rm -f $(NAME) $(OBJ) $(MODULE_OBJ) $(C_OBJ) *.swiftdoc *~ + diff --git a/libs/minilibx_mms_20200219/font.c b/libs/minilibx_mms_20200219/font.c new file mode 100644 index 0000000..d4c48cc --- /dev/null +++ b/libs/minilibx_mms_20200219/font.c @@ -0,0 +1,3526 @@ +/* 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, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\214\377\377\377\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377I\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + ")\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\216\377\377\377\263\377\377\377\013\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377b\377\377\377V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\215\377\377\377\270\377\377" + "\377u\377\377\377\013\377\377\377\252\377\377\377\255\377\377\377\013\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\317\377\377\377\374\377\377" + "\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377e\377\377\377\065\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\234\377\377\377" + "\267\377\377\377B\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\343\377" + "\377\377\375\377\377\377M\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\013\377\377\377\355\377\377\377\367\377\377\377\070\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377j\377\377\377\373\377\377\377\243\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377b\377\377\377\237\377\377\377\233\377\377\377Z\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377b\377\377\377c\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377)\377\377\377e\377\377\377I\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377U\377\377" + "\377c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377b\377\377\377c\377\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377S\377\377\377c\377\377\377\065\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\213\377\377\377\363\377\377\377\364\377\377\377\364\377\377\377\372\377" + "\377\377\225\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "u\377\377\377\371\377\377\377\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\215\377\377" + "\377\372\377\377\377\364\377\377\377\364\377\377\377\363\377\377\377\224" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377U\377\377\377e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377\376\377\377\377" + "s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\214\377\377\377\372" + "\377\377\377\\\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\367\377\377" + "\377\315\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\065\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\214\377\377\377\372\377\377\377\\\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377s\377\377\377\366\377\377\377\342\377\377\377" + "%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377s\377\377\377\366\377\377\377\342\377\377\377%\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377" + "\372\377\377\377\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\306\377\377\377\374\377" + "\377\377\370\377\377\377\370\377\377\377\304\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377" + "\377\317\377\377\377\357\377\377\377\373\377\377\377\225\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\320" + "\377\377\377\374\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\215\377\377\377\372\377\377\377\363\377" + "\377\377\333\377\377\377m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\001\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\013\377\377\377\364\377\377\377\366\377\377\377%\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\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)\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\215\377\377\377\363\377\377\377%\377\377\377" + "\224\377\377\377\363\377\377\377%\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\062\377\377\377\336\377\377\377\375\377" + "\377\377x\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\262\377\377\377\372\377\377\377\370\377\377\377\246\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377=\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\377\377\377~\377\377\377\374\377\377\377\377\377\377" + "\377\376\377\377\377\224\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377V\377\377\377\375\377\377\377" + "\376\377\377\377l\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\325\377\377\377\377" + "\377\377\377\271\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\355\377\377\377\033\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377v\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377" + "\315\377\377\377\367\377\377\377\373\377\377\377\334\377\377\377B\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377`\377\377\377\300\377\377\377\342\377\377\377Z\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\224\377\377" + "\377\347\377\377\377\373\377\377\377\364\377\377\377\312\377\377\377)\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + "\226\377\377\377\346\377\377\377\370\377\377\377\360\377\377\377\327\377" + "\377\377b\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\214\377\377\377\343\377\377\377\273" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\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\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\215\377\377\377\346\377\377\377" + "\370\377\377\377\364\377\377\377\320\377\377\377O\000\000\000\000\377\377\377\377" + "\377\377\377\377\377\377\377\013\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\033\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\377\377\377\062\377\377\377\316\377\377\377\366\377\377\377\373\377\377" + "\377\344\377\377\377\200\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377u\377\377\377\342\377\377\377\370\377\377\377" + "\364\377\377\377\305\377\377\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377)\377\377\377\065\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\371\371\377.\377\377\377V\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\013\377\377\377\321\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\271\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377Q\377" + "\377\377\273\377\377\377\332\377\377\377\322\377\377\377\206\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\070\377\377\377\367\377\377\377\376\377\377\377s\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\377\377\377\013\377\377\377\304\377\377\377\375\377\377\377\377\377\377\377" + "\377\377\377\377\373\377\377\377\247\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\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\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\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\013\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\013\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\000\000\000\000\000\000\000\000\377\377\377\065\377\377\377\333\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\361\377\377\377\202\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\307\377\377\377" + "\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\352\377\377" + "\377\364\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\013\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" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377" + "\377\377\377\377\377\225\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\356\377" + "\377\377\376\377\377\377v\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\013\377\377\377\352\377\377\377\364\377\377\377%\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\307\377\377\377\377\377\377\377\243\000\000\000\000\000\000\000\000\377\377\377u\377\377" + "\377\375\377\377\377\321\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\307\377\377\377\377\377\377\377\251\000\000\000\000\000\000\000\000\377\377" + "\377\013\377\377\377\355\377\377\377\330\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\377\377\377\206\377\377\377\366\377\377\377\377\377" + "\377\377\377\377\377\377\373\377\377\377\246\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\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\377B\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377" + "\377\206\377\377\377\370\377\377\377\377\377\377\377\377\377\377\377\373" + "\377\377\377\240\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\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\033\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\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\377" + "V\000\000\000\000\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\000\000\000\000\377\377\377\307\377\377\377\376\377\377\377i\000\000" + "\000\000\000\000\000\000\377\377\377\013\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377\355\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377\013\377" + "\377\377\345\377\377\377\376\377\377\377~\000\000\000\000\000\000\000\000\377\377\377\070" + "\377\377\377\367\377\377\377\360\377\377\377\033\377\377\377\377\377\377\377" + "\377\377\377\377\206\377\377\377\377\377\377\377\332\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\266\377\377\377\377\377\377\377\234\377\377\377" + "\377\377\377\377\377\000\000\000\000\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\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\312\377\377\377\255" + "\377\377\377\266\377\377\377u\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377;\377\377\377\373\377\377\377\347\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377`\377\377\377\266\377\377\377\263\377\377\377\256\377\377\377\373\377" + "\377\377\254\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\371\377\377\377\376\377\377" + "\377_\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377b\377\377" + "\377\374\377\377\377\355\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\224\377\377\377\376\377\377\377l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377K\377\377\377\374\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\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\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\376\377" + "\377\377l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\215\377\377" + "\377\377\377\377\377\377\377\377\377l\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\215\377\377\377" + "\377\377\377\377\377\377\377\377l\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377K\377\377\377\375\377\377\377\254\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\247\377\377\377\343\377\377\377\340\377\377\377\377\377" + "\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377`\377\377\377\262\377\377\377=\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\342\377\377\377\377\377" + "\377\377\325\377\377\377\266\377\377\377u\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371" + "\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377`\377\377\377\263\377\377\377\307\377\377\377\376\377\377" + "\377\363\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\001\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\013\377\377\377\351\377\377\377\366\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\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%\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\313\377\377\377\355\000\000\000\000\377\377\377\320\377\377\377" + "\346\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\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\000\000\000\000\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\000\000\000\000\377\377\377}\377\377\377\377\377\377\377\323\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\354\377\377" + "\377\364\377\377\377\226\377\377\377\373\377\377\377\337\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\033\377\377\377\362\377\377\377\376\377\377\377l\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\232\377\377\377\377\377\377\377\336\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\302\377" + "\377\377\377\377\377\377\277\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377|\377\377" + "\377\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377_\377\377\377\232\377\377\377" + "\013\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377!\377\377\377\371\377\377\377\352\377\377\377\013\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\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\062\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377\313\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377" + "l\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\033\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\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" + "\\\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377U\377\377\377\374\377\377\377\377\377\377\377\333\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\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\033\377\377" + "\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377" + "\377\377\025\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\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\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%\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\374\377\377\377\254\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377V\377\377\377\375\377\377\377\241\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\070\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\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\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\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\232\377\377\377\377\377\377\377\377\377\377\377\277\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\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\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "K\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\033\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\013\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\000\000\000\000\377\377\377\033\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\033\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000" + "\000\000\377\377\377\013\377\377\377\356\377\377\377\366\377\377\377%\377\377" + "\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\013\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\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000" + "\000\000\000\000\377\377\377\335\377\377\377\377\377\377\377\315\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\356\377\377\377" + "\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\377\377\377\377\336" + "\000\000\000\000\000\000\000\000\377\377\377\275\377\377\377\377\377\377\377\330\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\312\377\377\377\377" + "\377\377\377\364\377\377\377%\000\000\000\000\377\377\377\013\377\377\377\361\377" + "\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "j\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\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\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\033\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\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\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\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\377" + "p\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\376" + "\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\356\377\377\377" + "\366\377\377\377%\377\377\377\377\377\377\377\377\377\377\377\033\377\377" + "\377\365\377\377\377\375\377\377\377\070\000\000\000\000\000\000\000\000\377\377\377\013\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\013\377\377\377\361\377\377\377\347\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\214\377\377\377\377\377\377\377\343\000\000\000\000" + "\000\000\000\000\377\377\377\261\377\377\377\377\377\377\377\272\000\000\000\000\377\377" + "\377\377\377\377\377\377\377\377\377\013\377\377\377\351\377\377\377\376\377" + "\377\377i\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\366\377\377\377\372" + "\377\377\377\070\377\377\377\377\377\377\377\377\000\000\000\000\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\033\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377\377" + "\377U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\377\377\377\320\377\377\377\376\377\377\377_\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\364\377\377\377\254\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\224\377\377\377\377\377\377\377\377\377\377\377\272\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\233\377\377\377" + "\371\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377" + "\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\374" + "\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377I\377\377\377" + "\373\377\377\377\356\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377S\377\377\377\314\377\377\377\271\377\377\377\013\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377S\377\377\377\314\377\377\377\271\377\377\377\013\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\375" + "\377\377\377\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\360" + "\377\377\377\334\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\247\377\377\377\377\377\377\377l\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377" + "\377\337\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377" + "\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\372\377\377\377)\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377" + "\000\377\377\377\003\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377" + "\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\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)\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\316\377\377\377\333\000\000\000\000\377\377" + "\377\316\377\377\377\333\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\070\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\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377\232\377\377\377\375\377\377\377" + "\062\377\377\377=\377\377\377\375\377\377\377\254\377\377\377!\377\377\377" + "\371\377\377\377\367\377\377\377\070\377\377\377\377\377\377\377\377\000\000\000" + "\000\377\377\377;\377\377\377\372\377\377\377\346\377\377\377\013\377\377\377" + "\371\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\375" + "\377\377\377\\\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\376\377" + "\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377!\377\377\377\372\377\377\377\375\377\377\377" + "\070\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\327\377\377\377\343\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\320\377\377\377\374\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377" + "\377\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\204\377\377\377\377\377\377\377\353\377\377\377\013\000\000\000" + "\000\377\377\377\320\377\377\377\377\377\377\377\260\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\205\377\377\377\322\377\377" + "\377\353\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\325\377\377\377\375\377\377\377" + "M\000\000\000\000\377\377\377\033\377\377\377\356\377\377\377\376\377\377\377l\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\215\377\377\377" + "\375\377\377\377Z\000\000\000\000\000\000\000\000\377\377\377\325\377\377\377\377\377\377" + "\377\257\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\025\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377" + "\326\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "K\377\377\377\374\377\377\377\330\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377!\377\377\377" + "\371\377\377\377\377\377\377\377\216\000\000\000\000\000\000\000\000\377\377\377\302\377" + "\377\377\224\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\302\377\377\377\377\377\377\377" + "\252\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377V\377\377" + "\377\375\377\377\377\333\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\377" + "\377\377\377\260\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\330\377\377\377\377\377\377\377\251\000\000\000\000\377\377\377\013\377\377\377" + "\336\377\377\377\377\377\377\377\227\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\250\377\377\377\276\377" + "\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\250\377\377\377\276\377\377\377\033" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\276\377\377\377\377\377\377\377\377" + "\377\377\377\225\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377I\377\377\377\373\377\377\377" + "\377\377\377\377\325\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377)\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\306\377\377\377\376\377\377\377l\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377\377\375\377" + "\377\377q\000\000\000\000\377\377\377\033\377\377\377\362\377\377\377\366\377\377" + "\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\334\377\377\377\377\377\377\377\376\377\377\377\360\377\377\377\033\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377" + "\377\377\377\377\377\243\000\000\000\000\000\000\000\000\377\377\377\223\377\377\377\377" + "\377\377\377\327\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377s\377\377\377\376\377\377\377\375\377\377\377_\000\000\000\000\000\000\000\000\377\377" + "\377z\377\377\377\257\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\313\377\377\377\376\377\377\377U\000\000\000\000\377\377\377\033\377\377" + "\377\353\377\377\377\377\377\377\377\333\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377\377\326\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377\033\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\377\377\377\247\377\377\377\377\377\377\377\364\377\377\377)\000\000\000\000\000" + "\000\000\000\377\377\377\246\377\377\377\213\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000" + "\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\355\377" + "\377\377\363\377\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\213" + "\377\377\377\377\377\377\377\252\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000\377\377" + "\377\270\377\377\377\377\377\377\377\355\377\377\377\033\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366" + "\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\307\377\377\377\377\377\377\377\375\377" + "\377\377\070\377\377\377\013\377\377\377\352\377\377\377\377\377\377\377\327" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\307\377\377" + "\377\377\377\377\377\377\377\377\377\251\000\000\000\000\377\377\377\013\377\377\377" + "\361\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\313\377\377\377\377\377\377\377\315\000\000\000\000\000\000\000\000\377\377\377" + "\253\377\377\377\377\377\377\377\346\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\243\000\000\000\000\000\000" + "\000\000\377\377\377\025\377\377\377\356\377\377\377\376\377\377\377l\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\377\377\377" + "\377\310\000\000\000\000\000\000\000\000\377\377\377\253\377\377\377\377\377\377\377\342" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377" + "\377\377\377\377\377\243\000\000\000\000\000\000\000\000\377\377\377!\377\377\377\371\377" + "\377\377\367\377\377\377)\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\232\377\377\377\377\377\377\377\315\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\302\377\377\377z\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\355\377\377\377\363\377\377\377\013\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313" + "\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377" + "\355\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\312\377\377\377\377\377\377\377\215\000\000\000\000\000\000\000\000\377\377" + "\377K\377\377\377\374\377\377\377\347\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377\247\377\377\377\377\377\377\377\206\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377K\377\377\377\374\377\377\377\333\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\342\377\377\377\376\377\377" + "\377v\377\377\377\033\377\377\377\366\377\377\377\367\377\377\377)\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\214\377\377\377\377" + "\377\377\377\316\000\000\000\000\000\000\000\000\377\377\377\232\377\377\377\377\377\377" + "\377\264\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\025\377\377\377\356\377\377\377\376\377\377\377" + "v\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\377" + "\377\377\377\277\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377" + "\364\377\377\377\254\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\335\377\377\377\370\377\377\377" + "\353\377\377\377\363\377\377\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377)\377\377\377" + "V\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377b\000\000\000\000\377\377\377" + "S\377\377\377\065\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377S\377\377\377I\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377S\377\377\377\065\377\377\377;\377\377\377\374\377\377" + "\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377)\377\377\377V\377\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377;\377" + "\377\377\374\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377" + "\377E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\224\377\377\377\376\377\377\377b\000\000\000\000\377\377\377E\377" + "\377\377S\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377K\377\377\377\375\377\377\377\252\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\333\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377)\377\377\377X\000\000\000\000\000\000\000\000\377\377\377V\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377E\377\377\377S\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377\377K\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377S\377\377\377\065\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377S\377\377\377\065\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377)\377\377\377U\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377\377U\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\313\377\377\377\376\377\377\377b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\333\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377\000\377\377\377\006\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\313\377\377" + "\377\376\377\377\377l\377\377\377\033\377\377\377\364\377\377\377\352\377" + "\377\377\013\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\062" + "\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\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377V\377\377\377\374\377\377\377\336\000\000\000\000\000\000" + "\000\000\377\377\377\065\377\377\377\261\377\377\377\013\000\000\000\000\377\377\377\377" + "\377\377\377\377\377\377\377\232\377\377\377\371\377\377\377\033\377\377\377" + ";\377\377\377\374\377\377\377\217\377\377\377\335\377\377\377\375\377\377" + "\377\\\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\033\377" + "\377\377\371\377\377\377\333\377\377\377e\377\377\377\374\377\377\377\326" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\364\377\377\377%\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377b\377\377\377\375\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\266\377\377\377\377\377\377\377\227\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\316\377\377\377\334\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377" + "\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\335\377\377\377\375\377\377\377=\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\306\377\377" + "\377\377\377\377\377\225\000\000\000\000\000\000\000\000\377\377\377`\377\377\377\375\377" + "\377\377\346\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\213\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\062\377\377\377" + "f\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\253\377\377\377\376\377\377\377i\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\231\377\377\377\377\377\377\377\257\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377" + "\377\377\377\377\377\377\356\377\377\377\374\377\377\377\332\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374" + "\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377" + "\377\326\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377b\377" + "\377\377\375\377\377\377\347\377\377\377\013\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377U\377\377\377\375\377\377\377\266\000\000\000\000\000\000" + "\000\000\377\377\377;\377\377\377\374\377\377\377\236\000\000\000\000\377\377\377\377" + "\377\377\377\377\377\377\377\025\377\377\377\361\377\377\377\367\377\377\377" + ")\000\000\000\000\000\000\000\000\377\377\377j\377\377\377\376\377\377\377\322\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\214\377" + "\377\377\377\377\377\377\377\377\377\377\260\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\214\377" + "\377\377\377\377\377\377\377\377\377\377\260\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377G\377\377" + "\377\350\377\377\377\377\377\377\377\367\377\377\377y\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\377\377\377S\377\377\377\351\377\377\377\377\377\377\377\365\377\377" + "\377n\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\345\377\377\377\376" + "\377\377\377_\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\273\377\377\377\377\377\377\377\234\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\232\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\377\377\377;\377\377\377\373\377\377\377\344\377\377\377\317\377" + "\377\377\376\377\377\377v\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000\000\000\000\000" + "\377\377\377X\377\377\377\375\377\377\377\327\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\300\377\377\377\377\377\377\377\277\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000" + "\377\377\377K\377\377\377\374\377\377\377\375\377\377\377Q\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377\377\332\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377)" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\342\377\377\377\377\377\377\377\225\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\313\377\377\377\376\377\377\377b\000\000\000\000\000\000\000\000\377\377\377" + "\013\377\377\377\355\377\377\377\366\377\377\377%\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377" + "\366\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377" + "\377\377\377\377\377\252\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\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\377Q\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377" + "\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\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\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\373" + "\377\377\377\371\377\377\377\366\377\377\377%\377\377\377\013\377\377\377" + "\361\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377" + "\033\377\377\377\362\377\377\377\375\377\377\377\\\000\000\000\000\000\000\000\000\377\377" + "\377\033\377\377\377\366\377\377\377\375\377\377\377Q\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\306\377\377\377\375\377\377\377\\\377\377" + "\377\377\377\377\377\377\377\377\377\033\377\377\377\362\377\377\377\375\377" + "\377\377Q\000\000\000\000\000\000\000\000\377\377\377!\377\377\377\371\377\377\377\375\377" + "\377\377M\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377" + "\377\377\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377\025\377\377\377\370\377" + "\377\377\364\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\232\377\377\377\377\377\377\377\304\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377)\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377" + "\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355" + "\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\204\377\377\377\377\377\377\377\311\000\000\000\000\000\000\000\000\377\377\377" + "\224\377\377\377\377\377\377\377\260\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377\222\377\377\377\377\377\377\377\252\000\000\000\000\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\000\000\000\000\000\000\000\000\377\377\377l\377\377" + "\377\376\377\377\377\333\377\377\377\243\377\377\377\377\377\377\377\244" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377" + "\377\377\345\377\377\377\375\377\377\377M\377\377\377\013\377\377\377\351" + "\377\377\377\372\377\377\377)\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\317\377\377\377\377\377" + "\377\377\277\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377" + "\377\025\377\377\377\362\377\377\377\363\377\377\377%\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\013\377\377\377\364\377\377\377\254\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377U\377\377\377" + "\374\377\377\377\316\377\377\377\247\377\377\377\377\377\377\377\206\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377\216\377\377\377\345\377\377\377\377\377\377\377\377\377\377\377" + "\376\377\377\377\275\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\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\013\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\272\377" + "\377\377\371\377\377\377\377\377\377\377\377\377\377\377\355\377\377\377" + "\200\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\377\377\377\065\377\377\377\327\377\377\377\377\377\377\377\377\377" + "\377\377\376\377\377\377\267\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\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\000\000\000\000\000\000\000\000\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\000\000" + "\000\000\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\377\062\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\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%\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377K\377\377\377\375\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377" + "S\377\377\377\354\377\377\377\363\377\377\377I\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\333" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377" + "\377\013\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\000\000\000\000\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\377\062\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\377\377\377u\377\377\377\351\377\377\377\377\377\377\377\377\377\377" + "\377\364\377\377\377\222\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\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\013\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\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" + "\000\000\000\000\000\000\000\000\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=\000\000\000\000\377\377\377" + "\377\377\377\377\377\377\377\377\013\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\000\000\000\000\377" + "\377\377\301\377\377\377\354\377\377\377\062\000\000\000\000\000\000\000\000\377\377\377I" + "\377\377\377\364\377\377\377\275\000\000\000\000\377\377\377\377\377\377\377\377" + "\377\377\377I\377\377\377\364\377\377\377\330\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\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\377\070\000\000\000\000\377\377\377" + "~\377\377\377\224\000\000\000\000\377\377\377\013\377\377\377\332\377\377\377\342" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\275\377\377\377\373" + "\377\377\377\255\000\000\000\000\000\000\000\000\377\377\377r\377\377\377\370\377\377\377" + "\315\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377I\377\377\377\364" + "\377\377\377\330\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\254\377\377" + "\377\367\377\377\377\\\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "K\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\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377" + "\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377" + "\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377" + "\000\377\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\372\377\377" + "\377)\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\377\377\377\306\377\377\377\375\377\377\377\070\377\377\377\013\377\377" + "\377\364\377\377\377\334\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\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\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\070\377\377\377\372\377\377" + "\377\376\377\377\377\307\377\377\377O\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\377\377\377\331\377\377\377\377\377\377\377\377\377\377\377\367\377\377" + "\377\070\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\323\377\377\377\374\377\377\377)\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\245\377\377\377\377\377\377\377\215\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377V\377\377\377\375\377\377\377\322\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377" + "\377\377\374\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\325\377\377\377\374\377\377\377\062\377\377" + "\377\215\377\377\377\241\377\377\377\013\377\377\377\361\377\377\377\367\377" + "\377\377)\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\307\377\377\377\376\377\377\377l\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\200" + "\377\377\377\363\377\377\377\376\377\377\377s\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\377\377\377\240\377\377\377\377\377\377\377" + "\363\377\377\377V\377\377\377\374\377\377\377\333\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\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=\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\314\377\377" + "\377\376\377\377\377l\377\377\377j\377\377\377\237\377\377\377\223\377\377" + "\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\342\377\377\377\376\377\377\377i\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\070\377\377\377" + "\372\377\377\377\376\377\377\377\237\000\000\000\000\377\377\377\254\377\377\377" + "\377\377\377\377\243\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377" + "\025\377\377\377\361\377\377\377\366\377\377\377\033\000\000\000\000\000\000\000\000\377\377" + "\377\033\377\377\377\366\377\377\377\355\377\377\377\033\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\232\377\377\377\377\377" + "\377\377\377\377\377\377\323\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\232\377\377\377\377\377" + "\377\377\377\377\377\377\323\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\374\377\377\377" + "\377\377\377\377\314\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\264\377\377\377\377\377\377\377\377\377\377\377\262" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\013\377\377\377\337\377\377\377\377\377\377\377\271\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\025\377\377\377" + "\361\377\377\377\352\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377U\377\377\377\237" + "\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\377\377\377\232\377\377\377\377\377\377\377\266\377\377\377\213\377" + "\377\377\377\377\377\377\304\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\265\377\377\377" + "E\377\377\377y\377\377\377\337\377\377\377\377\377\377\377\227\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377\013\377\377\377\352\377\377\377\375" + "\377\377\377Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377" + "i\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\324\377\377\377\376\377\377\377l\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377" + "\377\337\377\377\377Z\377\377\377p\377\377\377p\377\377\377f\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\355" + "\377\377\377\366\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377\065\377\377\377\371\377\377\377\367" + "\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\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\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377" + "\377\377\377\300\377\377\377\372\377\377\377\377\377\377\377\236\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377" + "\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\313\377\377\377\367\377\377\377\304\377\377\377\377" + "\377\377\377\251\377\377\377\013\377\377\377\361\377\377\377\333\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377U\377\377\377\374\377\377\377\343" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\314\377\377\377\376\377\377" + "\377i\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377" + "\377\377\377\377\243\000\000\000\000\000\000\000\000\000\000\000\000\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\317\377" + "\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\224\377\377\377\377\377\377\377\243\000\000\000\000\000\000\000\000\377\377\377`\377" + "\377\377\373\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377`\377\377\377\374\377\377\377\377\377\377\377\336\377" + "\377\377\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366" + "\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377" + "\377\013\377\377\377\355\377\377\377\366\377\377\377%\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\033\377\377\377\371\377\377\377\360\377\377" + "\377\033\000\000\000\000\377\377\377\320\377\377\377\376\377\377\377_\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377U\377\377\377\375\377\377\377\277" + "\377\377\377\033\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\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\324\377\377\377\377\377\377\377\377\377" + "\377\377\355\377\377\377\033\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\204\377\377\377\377\377\377\377\304\377\377" + "\377\204\377\377\377\377\377\377\377\260\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\214\377\377" + "\377\377\377\377\377\355\377\377\377\033\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377" + "\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\266\377\377\377\377\377\377\377\206" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\364\377\377\377\254\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377\266\377\377\377\377\377\377\377\207\377\377\377K\377\377\377\374" + "\377\377\377\327\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\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\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\013\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\033\377\377\377" + "\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\070\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\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\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\033\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\070\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" + "\000\000\000\000\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\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\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)\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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)\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377K\377\377\377\375\377\377\377\252\000\000\000\000\377\377\377" + "`\377\377\377\373\377\377\377\377\377\377\377\242\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377" + "\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377\013\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\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\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\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\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\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\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\000\000\000\000\377\377\377" + "u\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\000\000\000\000\377\377\377\377\377\377" + "\377\377\377\377\377\013\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\033\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313" + "\377\377\377\376\377\377\377l\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\374" + "\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\341\377\377\377\376\377\377\377v\000\000\000\000\000\000\000\000\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\013\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\000\000\000\000\377\377\377I\377\377\377\372\377" + "\377\377\376\377\377\377v\377\377\377\033\377\377\377\362\377\377\377\376" + "\377\377\377}\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\335\377\377\377\376\377\377\377v\000\000\000\000\000\000\000\000\377\377\377\033\377\377" + "\377\364\377\377\377\372\377\377\377\062\377\377\377\377\377\377\377\377\000" + "\000\000\000\377\377\377\065\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\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\320\377\377\377\355\377\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377" + "\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377" + "\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\000\000\000\000\377\377\377}\377\377\377\313\377\377\377\257\377\377\377\013\000" + "\000\000\000\377\377\377\223\377\377\377\252\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\316\377\377\377\352\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377z\377" + "\377\377\325\377\377\377\033\377\377\377\013\377\377\377\314\377\377\377\267" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377" + "\377!\377\377\377\373\377\377\377\211\377\377\377!\377\377\377\374\377\377" + "\377\200\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\377\377\377\205\377\377\377\370\377\377\377\377\377\377\377\377\377\377" + "\377\345\377\377\377\200\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\377\377\377\013\377\377\377\333\377\377\377\377\377\377\377\377\377\377\377" + "\321\000\000\000\000\377\377\377r\377\377\377z\377\377\377%\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\025\377\377\377\337\377\377\377\377\377" + "\377\377\375\377\377\377\070\000\000\000\000\377\377\377U\377\377\377\365\377\377" + "\377\256\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\255\377\377\377\275\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\314\377\377" + "\377\376\377\377\377b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\371" + "\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\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\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\261\377\377\377\377\377\377\377\215\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\377\377\377\025\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\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377j\377\377\377\375\377\377\377\361\377\377\377%\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\215\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "K\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\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\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\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377}\377\377\377\377\377\377\377\315\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\215\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\333\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377G\377\377\377\330\377\377\377\343\377" + "\377\377c\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377G\377\377\377\330\377\377\377\343\377\377\377" + "c\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377V\377\377\377\375\377\377\377\376\377\377\377\214\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "U\377\377\377\374\377\377\377\377\377\377\377m\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\330\377\377\377" + "\377\377\377\377\271\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377U\377\377\377\375\377\377\377\252\000\000\000\000\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\000\000\000\000\000\000\000\000\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%\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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)\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\313\377\377\377\376\377\377\377i\377\377\377\377\377\377" + "\377\377\000\000\000\000\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\375\377\377\377)\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\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\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377K\377" + "\377\377\374\377\377\377\333\000\000\000\000\000\000\000\000\377\377\377\247\377\377\377" + "\327\377\377\377\322\377\377\377\300\377\377\377\013\377\377\377\377\377\377" + "\377\377\000\000\000\000\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\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\332\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377" + "\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\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\000\000\000\000\377\377" + "\377\377\377\377\377\377\377\377\377K\377\377\377\374\377\377\377\327\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\312\377\377\377\377\377\377\377" + "\251\377\377\377\377\377\377\377\377\000\000\000\000\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\033\377\377\377\377\377\377\377\377" + "\377\377\377K\377\377\377\374\377\377\377\343\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\313\377\377\377\376\377\377\377i\377\377\377\377\377\377" + "\377\377\000\000\000\000\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" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377}\377" + "\377\377\365\377\377\377\377\377\377\377\377\377\377\377\364\377\377\377" + "\247\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313" + "\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377" + "\355\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\377\377\377\321\377\377\377\376\377\377\377i\377\377\377\033\377" + "\377\377\365\377\377\377\355\377\377\377\013\000\000\000\000\377\377\377\377\377\377" + "\377\377\377\377\377\070\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\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377l\377\377\377\377\377\377\377\377\377\377\377\226\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\344\377\377\377\376\377\377\377\372\377\377\377\367\377\377\377" + ")\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377!\377\377\377\371\377\377\377\376\377\377\377i\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377V\377\377" + "\377\375\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377" + "\364\377\377\377\254\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\033\377\377\377\364\377\377\377\363\377\377\377%" + "\000\000\000\000\377\377\377\335\377\377\377\375\377\377\377M\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\177\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\205\377\377\377\376\377\377\377\333\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377" + "\377\377\257\000\000\000\000\000\000\000\000\377\377\377;\377\377\377\373\377\377\377\372" + "\377\377\377\070\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\247\377" + "\377\377\377\377\377\377\345\377\377\377\033\000\000\000\000\000\000\000\000\377\377\377O" + "\377\377\377X\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377" + "\377\377\351\377\377\377\377\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377" + "b\377\377\377\375\377\377\377\332\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\306\377\377\377\377\377\377\377\252\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\344\377\377\377\372\377\377\377)\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377%\377\377\377\374\377\377" + "\377\326\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\232\377\377\377\377\377\377\377\264\000\000\000\000\000\000\000\000" + "\377\377\377\335\377\377\377\376\377\377\377Q\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\325\377" + "\377\377\013\000\000\000\000\377\377\377;\377\377\377\373\377\377\377\363\377\377" + "\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\354\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\354\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\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\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377\361\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\377\377\377\013\377\377\377\361\377\377\377\352\000\000\000\000\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\000\000\000\000\377\377\377\224" + "\377\377\377\377\377\377\377\325\377\377\377\013\000\000\000\000\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\013\377\377\377\351\377\377\377\377\377\377\377\243\000\000\000\000\000" + "\000\000\000\377\377\377r\377\377\377\375\377\377\377\363\377\377\377%\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377" + "\377\257\000\000\000\000\000\000\000\000\377\377\377;\377\377\377\373\377\377\377\372\377" + "\377\377\070\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\351" + "\377\377\377\377\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377b\377\377\377" + "\375\377\377\377\332\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\377\377\377\312\377\377\377\377\377\377\377\372\377\377\377f\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\224\377\377\377\377\377\377\377\333\377\377\377\013\000\000\000\000\000\000\000\000\377" + "\377\377S\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\306\377\377\377\376\377\377\377U\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377" + "\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\374\377" + "\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\204\377\377\377\377\377\377\377\322\000\000\000\000\000\000\000\000\377\377\377\241\377" + "\377\377\377\377\377\377\264\000\000\000\000\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\000\000\000\000\000\000\000\000\377\377\377u\377\377" + "\377\376\377\377\377\361\377\377\377\325\377\377\377\377\377\377\377\252" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377s\377" + "\377\377\377\377\377\377\333\000\000\000\000\000\000\000\000\377\377\377\215\377\377\377" + "\377\377\377\377\277\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\314\377\377\377\377\377\377\377" + "\333\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377E\377\377\377\217\377\377\377\373\377\377\377\343\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\313\377\377\377\376\377\377\377\247\377\377\377I\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\324\377\377\377\343\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\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\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\220" + "\377\377\377\341\377\377\377\377\377\377\377\377\377\377\377\233\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\013\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\013\377" + "\377\377\342\377\377\377\377\377\377\377\373\377\377\377\377\377\377\377" + "\265\000\000\000\000\377\377\377\266\377\377\377\377\377\377\377\215\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\013\377\377\377\360\377\377\377\333\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\261\377\377\377\377\377\377\377\377\377\377\377\332\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377\356\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\377\377\377\013\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\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377U\377\377\377\373\377\377\377\376\377\377\377s\000\000\000\000\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\205" + "\377\377\377\271\377\377\377\332\377\377\377\377\377\377\377\373\377\377" + "\377r\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\033\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\377K\377\377\377\013\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\377\377\377\216\377\377\377]\000\000\000\000\000\000\000\000\377" + "\377\377\251\377\377\377\377\377\377\377\333\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\312\377\377\377\377\377\377\377\356\377" + "\377\377v\000\000\000\000\377\377\377\220\377\377\377\374\377\377\377\363\377\377" + "\377\033\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\324\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\065\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\025\377\377\377\337\377\377\377\377" + "\377\377\377\361\377\377\377\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\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}\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377_\377\377\377\345\377\377\377\377\377\377\377\361\377" + "\377\377\070\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377V\377\377\377\376\377\377\377\344\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\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\377l\377\377\377\377\377\377\377\377\000\000\000" + "\000\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\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\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\013\377\377\377" + "\361\377\377\377\367\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377" + "\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\307\377\377\377" + "\376\377\377\377i\377\377\377\377\377\377\377\377\000\000\000\000\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\013\000\000\000\000\377\377\377\377\377\377\377\377\000" + "\000\000\000\377\377\377\013\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\000\000\000\000\377\377" + "\377\377\377\377\377\377\377\377\377U\377\377\377\374\377\377\377\352\377" + "\377\377\013\000\000\000\000\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\000\000\000\000\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\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377" + "\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224" + "\377\377\377\377\377\377\377\252\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\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\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377" + "\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377" + "\377\377\377U\377\377\377\374\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\307\377\377\377\376\377\377\377\177\377\377\377\377\377" + "\377\377\377\000\000\000\000\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" + ")\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377U\377\377\377\374\377" + "\377\377\327\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\307\377\377\377" + "\376\377\377\377l\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\210\377\377\377\335\377\377" + "\377\377\377\377\377\377\377\377\377\315\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377" + "\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377" + "\377\377\013\377\377\377\355\377\377\377\366\377\377\377)\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\215\377\377\377\377\377\377" + "\377\254\377\377\377c\377\377\377\377\377\377\377\273\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377\013\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\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\307\377\377\377\377\377\377\377\377\377" + "\377\377\335\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\376\377\377\377\377\377\377" + "\377\252\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\325\377\377\377\377\377\377\377\264\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\342\377\377\377\375\377\377\377\070\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\013\377\377\377\364\377\377\377\254\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377I\377\377\377\340\377\377\377\240" + "\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\341\377\377\377Z\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\224\377\377\377\376\377\377\377b\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\320" + "\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\317\377\377\377\376\377\377\377l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377" + "\356\377\377\377\372\377\377\377)\000\000\000\000\000\000\000\000\377\377\377K\377\377\377" + "\374\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377" + "\013\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\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377\377" + "\377\374\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\215\377\377\377\377\377\377\377\311" + "\000\000\000\000\000\000\000\000\377\377\377\335\377\377\377\376\377\377\377i\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\376\377" + "\377\377_\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366" + "\377\377\377)\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374" + "\377\377\377\333\377\377\377\374\377\377\377\377\377\377\377\311\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\013\377\377\377\361\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\361\377" + "\377\377\333\000\000\000\000\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" + "\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377_\000\000\000\000\000\000\000\000\377" + "\377\377\013\377\377\377\355\377\377\377\366\377\377\377)\377\377\377\377" + "\377\377\377\377\377\377\377\013\377\377\377\356\377\377\377\372\377\377\377" + ")\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\345\377\377\377\376\377\377\377i\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\376\377" + "\377\377b\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\321\377\377\377\376\377\377" + "\377l\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\356\377" + "\377\377\372\377\377\377)\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\374\377" + "\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377\313\377\377\377\377\377\377\377\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377" + "\377\333\377\377\377\377\377\377\377\377\377\377\377\354\377\377\377\300" + "\377\377\377\\\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313" + "\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\374" + "\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\013\377\377\377\355\377\377\377\375\377\377\377M\377\377\377\013\377\377" + "\377\355\377\377\377\375\377\377\377=\000\000\000\000\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\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\253\377\377\377\377\377\377\377\377\377\377\377\315\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377" + "\377\335\377\377\377\376\377\377\377i\000\000\000\000\377\377\377\342\377\377\377" + "\375\377\377\377Q\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\315\377\377\377\377\377\377\377\342\377\377" + "\377\013\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "V\377\377\377\375\377\377\377\377\377\377\377\377\377\377\377\252\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377c\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377l\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377" + "\377\377\360\377\377\377\033\377\377\377\205\377\377\377\365\377\377\377\377" + "\377\377\377\364\377\377\377\\\000\000\000\000\377\377\377\377\377\377\377\377\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377|\377\377\377\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\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\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\205\377\377\377\376\377\377\377\336\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\302\377\377\377\377\377" + "\377\377\242\377\377\377\374\377\377\377\264\377\377\377\033\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\025\377\377\377\362\377\377\377\377\377\377" + "\377\304\377\377\377\372\377\377\377\360\377\377\377\033\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\317\377\377\377\376\377\377\377_\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\013\377\377\377\361\377\377\377\334\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377`\377\377\377\374" + "\377\377\377\343\377\377\377\313\377\377\377\377\377\377\377\215\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\306\377\377\377\371\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377s\377\377\377\377\377\377\377\304" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\320\377\377\377\375\377\377\377=\000\000\000\000\000\000\000\000\377\377\377" + "\025\377\377\377\362\377\377\377\366\377\377\377%\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\376" + "\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377l\377\377\377\373\377\377\377\376\377\377" + "\377\214\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\204\377\377\377\377" + "\377\377\377\333\000\000\000\000\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\033\377\377\377\366\377\377\377\367\377\377\377)\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\317\377\377\377\376\377\377" + "\377e\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\330\377\377\377\371\377\377\377" + ")\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\033" + "\377\377\377\365\377\377\377\363\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\377\377\377\013\377\377\377\351\377\377\377\375" + "\377\377\377=\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\374\377\377\377\366" + "\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377U\377\377\377p\377\377\377M\377\377\377!\377\377\377\373\377\377" + "\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\234\377\377\377\374\377\377\377\377\377\377\377\320" + "\377\377\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\271\377\377\377" + "\377\377\377\377\377\377\377\377\267\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\251" + "\377\377\377V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\000\000\000\000\377\377\377\247\377\377\377\376\377\377\377l\377" + "\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\224\377\377\377\377\377\377\377\244\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\313\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\334\377\377\377\377\377\377\377\205\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377" + "\013\377\377\377\355\377\377\377\376\377\377\377i\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377\377\327\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377\033\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377" + "\377\025\377\377\377\362\377\377\377\375\377\377\377=\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\313\377\377\377\371\377\377\377%\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377b\000\000\000\000\000\000" + "\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377%\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377" + "\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\224\377\377\377\377\377\377\377\257\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\331\000\000\000\000" + "\377\377\377j\377\377\377\376\377\377\377\366\377\377\377)\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377" + "\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377\033\377" + "\377\377\351\377\377\377\371\377\377\377!\377\377\377\360\377\377\377\333" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377" + "\377\376\377\377\377i\377\377\377\033\377\377\377\365\377\377\377\365\377" + "\377\377\361\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\377" + "\377\377K\377\377\377\374\377\377\377\364\377\377\377%\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\340\377\377\377\376\377\377\377l\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\257\000\000\000\000" + "\377\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\377\377\377I\377\377\377\373\377\377\377\363\377\377\377%\000\000\000\000\000" + "\000\000\000\377\377\377\013\377\377\377\345\377\377\377\376\377\377\377i\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377" + "\377\243\000\000\000\000\377\377\377\330\377\377\377\377\377\377\377\257\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377l\377\377\377\373\377\377\377\375\377\377\377" + "M\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013" + "\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\376\377" + "\377\377b\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\355" + "\377\377\377\033\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + "!\377\377\377\372\377\377\377\337\377\377\377\257\377\377\377\376\377\377" + "\377l\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\000\000\000\000\377\377\377l\377\377\377\376\377\377\377" + "\337\377\377\377\326\377\377\377\377\377\377\377\234\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377\356\377\377\377\372\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\232\377\377\377\377\377" + "\377\377\346\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377" + "\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\232\377\377\377\377\377\377" + "\377\244\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\364\377\377\377\254\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\324\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\314\377\377\377\376\377\377\377b\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377" + "\377\377\355\377\377\377\374\377\377\377)\000\000\000\000\000\000\000\000\377\377\377K\377" + "\377\377\374\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\377" + "\377\377\013\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\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "K\377\377\377\374\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377" + "\377\377\377\377\362\377\377\377\366\377\377\377\377\377\377\377\326\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377" + "\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355" + "\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377" + "\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377\377%" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\333\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013" + "\377\377\377\361\377\377\377\333\000\000\000\000\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\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377" + "i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377" + "\377%\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\355\377" + "\377\377\374\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\317\377\377" + "\377\376\377\377\377l\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\324" + "\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\377\377\377" + "\013\377\377\377\355\377\377\377\374\377\377\377)\000\000\000\000\000\000\000\000\377\377" + "\377K\377\377\377\374\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377u\377\377\377\302\377\377\377\357\377\377\377" + "\377\377\377\377\377\377\377\377\276\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\376\377\377\377" + "i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377" + ";\377\377\377\374\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\240\377\377\377\377\377\377\377\266\377\377" + "\377s\377\377\377\377\377\377\377\315\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\377\377\377\025\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\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\275\377\377\377\377\377\377\377\377\377\377\377\314\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377v\377\377\377\377\377\377\377\321\377\377\377M\377\377\377\375\377" + "\377\377\327\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\307\377\377\377\377\377\377\377\346\377\377\377" + "\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\377\377\377b\377\377\377\237\377\377\377\374\377\377\377\336\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\313\377\377\377\376\377\377\377\263\377\377\377f\377\377\377" + "\013\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\371\371\377." + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377B\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\025\377\377\377\304\377\377" + "\377\322\377\377\377S\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + "\214\377\377\377\374\377\377\377\033\377\377\377\222\377\377\377\374\377\377" + "\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\247\377\377\377\377\377\377\377\302\377\377\377\\\377\377\377\062\377\377" + "\377\264\377\377\377\377\377\377\377\326\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\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\013\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\000\000\000\000\377\377\377\033\377\377\377\356\377\377\377\377\377" + "\377\377\377\377\377\377\217\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\247\377\377\377\377\377\377\377\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "V\377\377\377\374\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\317\377\377\377\374\377\377" + "\377\070\377\377\377\013\377\377\377\351\377\377\377\366\377\377\377\033\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\324\377\377\377\374\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\065\377\377\377" + "\347\377\377\377\367\377\377\377\232\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377_\377\377\377\355\377\377\377\367\377\377\377}\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\261\377\377" + "\377\377\377\377\377\257\000\000\000\000\000\000\000\000\377\377\377\204\377\377\377\377" + "\377\377\377\322\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\213\377\377\377\376\377\377\377U\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + "\224\377\377\377\375\377\377\377\373\377\377\377s\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\214\377\377" + "\377}\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377j\377\377\377\376\377\377\377\333" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\033\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\205\377\377\377j\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "}\377\377\377\376\377\377\377\343\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377\255\377\377\377\377\377\377\377\264\000\000\000\000\000\000\000\000" + "\377\377\377\025\377\377\377\356\377\377\377\372\377\377\377)\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\374" + "\377\377\377\327\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\377\377\377\013\377\377\377\356\377\377\377\375\377\377\377)\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\355\377\377\377\367\377\377\377)\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\065\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\313\377\377\377\377\377\377\377\257\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377_\377\377\377\355" + "\377\377\377\367\377\377\377}\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\065\377\377\377\347\377\377" + "\377\367\377\377\377\232\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\062\377\377\377\327\377" + "\377\377\377\377\377\377\375\377\377\377z\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\065\377" + "\377\377\362\377\377\377\377\377\377\377\346\377\377\377V\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377S\377\377\377\320\377\377\377\305\377\377\377%\000\000\000\000\000\000\000" + "\000\000\000\000\000\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\000\000\000\000\377\377\377\335\377\377\377\376\377\377\377l\000\000\000\000\000\000\000\000" + "\377\377\377;\377\377\377\373\377\377\377\363\377\377\377%\377\377\377\377" + "\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\243" + "\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\343\377\377\377\376\377\377\377" + "l\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\232\377\377\377\377" + "\377\377\377\356\377\377\377)\000\000\000\000\000\000\000\000\377\377\377\065\377\377\377" + "\260\377\377\377\013\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313" + "\377\377\377\376\377\377\377U\000\000\000\000\000\000\000\000\377\377\377\276\377\377\377" + "\377\377\377\377\346\377\377\377\013\377\377\377\377\377\377\377\377\000\000\000" + "\000\377\377\377K\377\377\377\374\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\312" + "\377\377\377\377\377\377\377\321\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313" + "\377\377\377\371\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\313\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013" + "\377\377\377\355\377\377\377\366\377\377\377%\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\355\377\377\377\366\377" + "\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\377\377\377j\377\377\377\330\377\377\377%\000\000\000\000\000\000\000\000\377\377\377" + "\312\377\377\377\377\377\377\377\206\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\244\000\000\000\000\000\000" + "\000\000\377\377\377\313\377\377\377\377\377\377\377\277\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366" + "\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\377\377" + "\377]\377\377\377f\377\377\377\013\377\377\377\361\377\377\377\333\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\376" + "\377\377\377i\000\000\000\000\377\377\377\232\377\377\377\377\377\377\377\377\377" + "\377\377\327\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\334\377\377\377\377\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377}\377\377" + "\377\376\377\377\377\363\377\377\377%\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\332\377\377\377\377\377\377\377\251\000\000\000\000\000\000\000\000\377\377\377" + "\214\377\377\377\377\377\377\377\355\377\377\377\013\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000" + "\377\377\377K\377\377\377\374\377\377\377\375\377\377\377Q\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\205\377\377\377\304\377\377" + "\377\013\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\362\377\377\377\375\377" + "\377\377Q\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\013\377\377\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\312\377\377\377" + "\377\377\377\377\264\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\376\377\377" + "\377\332\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\330\377\377\377\376\377\377\377\372\377\377\377\360\377\377" + "\377\033\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377\376\377\377\377" + "l\377\377\377K\377\377\377\374\377\377\377\372\377\377\377\062\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377\355\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377;\377\377\377\373\377\377\377\372" + "\377\377\377=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377" + "\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377!\377\377\377\372\377\377\377" + "\347\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\364\377\377\377\254\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\376\377\377" + "\377b\000\000\000\000\000\000\000\000\377\377\377b\377\377\377\375\377\377\377\332\000\000\000" + "\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377" + "\377\377\377~\000\000\000\000\000\000\000\000\377\377\377U\377\377\377\374\377\377\377\366" + "\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\266\377" + "\377\377\377\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377e\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377" + "\355\377\377\377\376\377\377\377v\000\000\000\000\000\000\000\000\377\377\377s\377\377\377" + "\376\377\377\377\332\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\317\377\377\377\377\377\377\377\251\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377K\377\377\377\374\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377j\377\377\377" + "\375\377\377\377\326\377\377\377\302\377\377\377\304\377\377\377\206\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013\377\377" + "\377\355\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366" + "\377\377\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377" + "\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "K\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\355\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013" + "\377\377\377\361\377\377\377\333\000\000\000\000\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\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377" + "i\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\366\377\377" + "\377%\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\355\377" + "\377\377\376\377\377\377\215\000\000\000\000\000\000\000\000\377\377\377V\377\377\377\374" + "\377\377\377\367\377\377\377)\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\224\377\377\377\377\377\377\377~\000\000\000\000\000\000\000\000\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\013\377\377\377\355\377\377\377\376\377\377\377v\000\000\000\000\000\000" + "\000\000\377\377\377s\377\377\377\375\377\377\377\332\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\376\377\377" + "\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\062\377\377\377n\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377`\377\377\377\373\377\377\377\366\377\377\377)\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\317\377\377\377\376\377\377" + "\377v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\314\377\377\377\376\377\377\377b\000\000\000\000\000\000\000\000\377\377" + "\377\254\377\377\377\377\377\377\377\332\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\366\377\377\377\361\377" + "\377\377\331\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\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\033\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377\224\377\377\377\377\377\377\377\336\377\377\377\330\377\377\377" + "\377\377\377\377\256\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\342\377\377\377\375\377\377\377\326\377" + "\377\377\376\377\377\377~\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\275\377\377\377\377\377\377\377\345\377\377" + "\377\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\323\377\377\377\360\377\377\377" + "\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\313\377\377\377\371\377\377\377\033\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\001\377\377\377\000\377\377\377\000\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\000\000\000\000\000\000\000\000\377\377\377\206\377\377\377\377\377\377\377\377\377\377" + "\377\260\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\313\377\377" + "\377\360\377\377\377\013\377\377\377\316\377\377\377\352\377\377\377\013\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\377\070\000\000\000\000\377\377\377\377\377\377\377\377" + "\377\377\377\224\377\377\377\377\377\377\377\311\000\000\000\000\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377`\377\377\377\375\377\377\377\327\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\266\377\377\377\377\377\377\377\217\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\371\371\377.\377\377\377M\000\000\000" + "\000\000\000\000\000\371\371\377.\377\377\377M\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377|\377\377\377s\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377" + "\343\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\232\377" + "\377\377\377\377\377\377\377\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377!\377\377\377\371" + "\377\377\377\352\377\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\070\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377r\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\013\377\377\377\377\377\377\377" + "\377\000\000\000\000\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\033\377\377\377\377\377\377\377\377\377\377\377\070\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\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377\377\377" + "\374\377\377\377\333\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377" + "\377\377\070\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\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\033\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377}\377\377\377\376\377\377\377\326\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\013\377\377\377\377\377" + "\377\377\377\000\000\000\000\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" + "\033\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\232\377\377\377\377\377\377\377\377\377\377\377\326\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\232\377\377\377\377\377\377\377\377\377\377\377\343\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\207\377\377\377\374\377\377\377\266\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\377\377\377V\377\377\377\375\377\377\377\247\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\306\377\377\377\377\377\377\377\376\377\377\377" + "l\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013" + "\377\377\377\355\377\377\377\352\000\000\000\000\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\033" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\335\377\377\377\376\377\377\377~\377" + "\377\377\377\377\377\377\377\000\000\000\000\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\033\377\377\377\377\377\377\377\377\000\000\000" + "\000\377\377\377\013\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\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\013\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\013\377\377\377\356\377\377\377\366" + "\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\070\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\000\000\000\000\377\377\377\313\377" + "\377\377\376\377\377\377l\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355" + "\377\377\377\366\377\377\377)\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\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=\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377" + "\377\377\377\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377\070\377\377\377\372" + "\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377\013\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\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377" + "%\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\333\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\376" + "\377\377\377l\000\000\000\000\377\377\377\013\377\377\377\352\377\377\377\377\377" + "\377\377\332\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "j\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\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377\377\252\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\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\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377" + "\377\377\252\000\000\000\000\000\000\000\000\377\377\377\266\377\377\377\377\377\377\377" + "\336\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\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\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\356\377\377\377" + "\366\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\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\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\232\377" + "\377\377\377\377\377\377\377\377\377\377\304\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377" + "\377\377\375\377\377\377_\377\377\377\033\377\377\377\365\377\377\377\377" + "\377\377\377\322\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\253\377\377\377\377\377\377\377\322\000\000\000\000\000\000\000\000\377\377\377\275" + "\377\377\377\377\377\377\377\315\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\356\377\377\377\366\377" + "\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\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\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377" + "\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\317" + "\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\364\377\377" + "\377\254\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\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\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000" + "\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\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377U\377\377\377\374\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377" + "\377\013\377\377\377\356\377\377\377\366\377\377\377)\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\356" + "\377\377\377\366\377\377\377)\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377" + "\377\366\377\377\377%\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377K\377\377\377\375\377\377\377\245\000\000\000\000\000\000\000\000\377\377" + "\377\233\377\377\377\377\377\377\377\356\377\377\377%\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377" + "\377\376\377\377\377\302\377\377\377\262\377\377\377\322\377\377\377\033\377" + "\377\377\377\377\377\377\377\377\377\377\013\377\377\377\361\377\377\377\333" + "\000\000\000\000\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\000\000\000\000\377" + "\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000\377\377\377\013" + "\377\377\377\356\377\377\377\366\377\377\377)\377\377\377\377\377\377\377" + "\377\000\000\000\000\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\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\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\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377" + "\376\377\377\377l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\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\013\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\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\377\062\377\377\377\377\377\377\377\377" + "\000\000\000\000\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\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\266" + "\377\377\377\377\377\377\377\377\377\377\377\336\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377" + "\377\377U\377\377\377\374\377\377\377\372\377\377\377\070\377\377\377!\377" + "\377\377\366\377\377\377\376\377\377\377\177\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\377\377\377" + "\377\377\377\377\377\352\377\377\377\013\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\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\033\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377\013\377\377\377\361\377\377\377\327\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377b\377\377\377\374\377\377\377\377\377\377\377\225\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\377\377\377\316\377\377\377\333\000\000\000\000\377" + "\377\377\316\377\377\377\334\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377w\377\377\377\343\377\377" + "\377\375\377\377\377\201\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\377\377\377\013\377\377\377\244\377\377\377\013\000\000\000\000\000\000\000\000\377" + "\377\377\302\377\377\377\377\377\377\377\377\377\377\377\364\377\377\377" + "Z\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\335\377\377\377\376\377\377\377~\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377\377\377" + "\373\377\377\377\363\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377I\377\377\377" + "\357\377\377\377\377\377\377\377\364\377\377\377)\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\376\377\377\377\377\377\377\377" + "\244\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\377\377\377\232\377\377\377\377\377\377\377\251\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377l\377\377\377\367\377\377\377\377\377\377\377\377\377\377\377\376" + "\377\377\377\223\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\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\013\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\033\377\377\377\377\377\377\377\377\000" + "\000\000\000\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\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377;\377" + "\377\377\372\377\377\377\316\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\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\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\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" + "\033\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\214\377\377\377\377\377\377\377\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\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\377\062\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\377\062\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\376\377\377\377\377" + "\377\377\377\244\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377I\377\377\377\357\377\377\377\377\377" + "\377\377\364\377\377\377)\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377" + "\377\377M\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\232\377\377\377\377\377\377\377\375\377\377\377\\\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "\255\377\377\377\377\377\377\377\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\224\377\377\377" + "\377\377\377\377\276\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\240\377" + "\377\377\377\377\377\377\266\377\377\377\377\377\377\377\377\000\000\000\000\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%\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\316\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\255\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377\366\377" + "\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\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\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\377\377\377\313\377\377\377\375\377" + "\377\377\\\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\355\377\377\377\355" + "\377\377\377\033\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\013\377\377\377\316\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\373\377\377\377\213\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\224\377\377\377\377\377\377" + "\377\252\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\247\377\377\377\377\377\377" + "\377\326\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\013\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" + "\000\000\000\000\377\377\377\313\377\377\377\366\377\377\377%\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\344\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\307\377\377\377\375\377\377\377Q\000\000\000\000\000\000\000\000" + "\377\377\377\204\377\377\377\377\377\377\377\327\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\206\377\377\377\371\377\377" + "\377\377\377\377\377\377\377\377\377\376\377\377\377\240\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\215\377\377\377\377" + "\377\377\377\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\206\377\377\377\370" + "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\241\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\214\377\377" + "\377\377\377\377\377\252\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\356\377" + "\377\377\376\377\377\377v\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377\025\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)\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377" + "\364\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\233\377\377\377\375\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\276\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377;\377\377\377\372\377" + "\377\377\376\377\377\377|\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377u\377\377\377\375\377\377\377\355\377\377\377" + "\033\000\000\000\000\377\377\377\320\377\377\377\377\377\377\377\244\000\000\000\000\377\377" + "\377\377\377\377\377\377\377\377\377\033\377\377\377\366\377\377\377\372\377" + "\377\377=\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\362\377\377\377\376" + "\377\377\377_\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\013\377\377\377\351\377\377\377\364\377\377\377%\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\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\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377\377" + "\377i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377}\377\377\377\377\377\377" + "\377\277\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\364\377\377\377\254\000\000\000\000\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\377\377\377\065\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\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\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\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\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + "l\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\370\377\377\377\231\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377;\377\377\377\373\377\377\377\322\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377" + "I\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\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000" + "\000\000\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377\355\377\377\377\033" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\013\377\377\377\351\377\377\377\355\377\377\377\033\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\013\377\377\377\355\377\377\377\366\377\377\377)\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377K\377\377\377\374\377\377\377" + "\252\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\307\377\377\377\377\377\377\377" + "\304\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\013\377\377" + "\377\361\377\377\377\333\000\000\000\000\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\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000" + "\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377\355\377\377\377\033\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\240\377\377\377" + "\374\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\275\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\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\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\307\377\377\377\375\377" + "\377\377_\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\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\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\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\000\000\000\000\377\377\377\033" + "\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\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377;\377\377\377\372\377\377\377" + "\376\377\377\377\206\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377b\377\377\377\374\377\377\377\372\377\377\377I\377" + "\377\377\013\377\377\377\355\377\377\377\377\377\377\377\243\000\000\000\000\377\377" + "\377\377\377\377\377\377\377\377\377\013\377\377\377\345\377\377\377\376\377" + "\377\377\214\000\000\000\000\000\000\000\000\377\377\377j\377\377\377\374\377\377\377\363" + "\377\377\377%\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\335\377\377\377\377\377\377\377\236\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\377\377\377\013\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\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\360\377\377\377\333" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\000\377\377\377\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377\377S\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\313\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377Q\377\377\377n\377\377\377\013\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377b\377\377\377e\377\377" + "\377\033\000\000\000\000\000\000\000\000\371\371\377.\377\377\377\065\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377V\377\377\377\374\377\377\377\364\377\377\377\062\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377" + "\013\377\377\377\343\377\377\377\377\377\377\377\215\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\033\377\377\377\371\377\377\377\334\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377\377X\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377" + "\377\377\341\377\377\377\375\377\377\377=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377e\377\377\377l\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377" + "\377\377X\377\377\377S\377\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377@\377\377\377e\377\377\377c\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\377\377\377S\377\377\377K\377\377\377I\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377)\377\377\377e\377\377\377n\377\377\377\070\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377_\377\377\377p\377\377\377I\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377E\377\377\377X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\033\377\377\377\371" + "\377\377\377\334\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377`\377\377\377I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377\033\377\377\377\362\377\377\377" + "\376\377\377\377\255\377\377\377\065\377\377\377V\377\377\377\322\377\377" + "\377\255\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377)\377\377\377X\377\377\377V\377\377\377\013\000" + "\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377" + "\377m\377\377\377c\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\371\371\377.\377\377\377m\377\377\377c\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377b\377\377\377c\377\377\377" + "\013\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\320" + "\377\377\377\377\377\377\377\333\377\377\377\033\377\377\377E\377\377\377" + "\013\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377e\377\377\377e\377\377" + "\377\070\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "e\377\377\377n\377\377\377\065\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377U\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\025\377\377\377\361\377\377\377\366\377" + "\377\377%\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\013\377\377\377\364\377\377\377\254\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377U\377\377\377n\377\377\377\065" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377E\377\377\377n\377\377\377\070\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377@\377\377\377m\377\377\377c\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377@\377\377" + "\377p\377\377\377I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377Q\377\377\377p\377\377" + "\377X\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\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\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\025\377\377\377\362\377\377\377\360\377" + "\377\377\033\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377)\377\377\377p\377\377\377c\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377b\377\377\377f\377" + "\377\377\013\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\377\377\377\224\377\377\377\376\377\377\377U\377\377\377@\377\377\377" + "e\377\377\377\070\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377@\377\377\377p\377\377\377I\377\377\377" + ";\377\377\377\374\377\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\013\377\377\377e\377\377\377e\377\377\377I\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377O\377\377\377X\377\377\377U\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377j\377\377\377n\377\377\377\033" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\033\377\377\377\362\377\377\377\367\377\377\377)\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\361\377\377\377\356" + "\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\371\377\377\377" + "%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\335\377\377\377\372\377\377\377)\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\267\377\377\377\345\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\237\377\377\377\377\377\377" + "\377\361\377\377\377\062\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\377\377\377\331\377\377\377\377\377\377\377\304\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\062\377\377\377\337\377\377\377\377\377\377\377\236" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\377\377\377b\377\377\377\376\377\377\377\330\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\062\377\377\377\337\377\377\377\377\377\377\377\236" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\065\377\377\377\344\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\270\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\065\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\232\377\377" + "\377\377\377\377\377\370\377\377\377\364\377\377\377\372\377\377\377\243" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\266\377\377\377\377\377\377\377\225\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\205\377\377\377\371" + "\377\377\377\364\377\377\377\364\377\377\377\377\377\377\377\260\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\377\377\377\013\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\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377" + "\345\377\377\377\375\377\377\377f\000\000\000\000\000\000\000\000\377\377\377\062\377\377" + "\377\326\377\377\377\377\377\377\377\245\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377\234\377\377\377\205\377\377\377I\377\377\377" + "\272\377\377\377\377\377\377\377\326\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\224\377\377\377\376\377\377\377i\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377K\377\377\377\374\377" + "\377\377\333\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377i\377\377" + "\377\203\377\377\377\337\377\377\377\377\377\377\377\260\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\275\377\377" + "\377\377\377\377\377\377\377\377\377\373\377\377\377\243\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313" + "\377\377\377\371\377\377\377%\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\377\377\377\177\377\377\377\372\377\377\377\376\377" + "\377\377\377\377\377\377\333\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\253\377\377\377\340\377\377\377%\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\377\377\377\310\377\377\377\307\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377\377\377\377\377" + "\276\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377u\377\377\377\325\377\377\377w\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377" + "\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\377\377\377\013\377\377\377\351\377\377\377\377\377\377\377\276" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377`\377\377\377\213\377" + "\377\377\203\377\377\377\070\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\251\377\377\377" + "\322\377\377\377\316\377\377\377m\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377`\377\377\377\263\377\377\377\263\377\377\377" + "\263\377\377\377\266\377\377\377u\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377G\377\377\377" + "\317\377\377\377w\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377" + "\377i\377\377\377\266\377\377\377\263\377\377\377\263\377\377\377\262\377" + "\377\377_\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\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\033\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\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\033\377\377\377\377\377\377\377\377\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\377\377\377\233\377\377\377\377\377\377\377l\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377V\377\377\377\376\377" + "\377\377\327\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\013\377\377\377\361" + "\377\377\377\377\377\377\377\377\377\377\377\325\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377v\377" + "\377\377\246\377\377\377\266\377\377\377u\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\313\377\377\377\372" + "\377\377\377)\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\377\377\377i\377\377\377\266\377\377\377\255\377\377\377\214\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377s\377\377\377|\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377s\377\377\377|\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\000\000\000\000\377\377\377_\377\377\377\266\377\377\377\321\377" + "\377\377\316\377\377\377\271\377\377\377q\000\000\000\000\000\000\000\000\377\377\377\377" + "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\377\377\377`\377\377\377\245\377\377\377" + "\267\377\377\377\247\377\377\377=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377" + "\377\377\000\000\000\000\377\377\377E\377\377\377\212\377\377\377%\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\013\377\377\377\211" + "\377\377\377=\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377" + "\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377v\377\377" + "\377\232\377\377\377q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\377\377\313\377\377\377\363\377\377\377\033\000\000\000\000\000\000\000\000\000\000\000\000\377\377" + "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\377\377\377\377\377\377\377\377", +}; + diff --git a/libs/minilibx_mms_20200219/interface.swift b/libs/minilibx_mms_20200219/interface.swift new file mode 100644 index 0000000..97d6b81 --- /dev/null +++ b/libs/minilibx_mms_20200219/interface.swift @@ -0,0 +1,292 @@ + +import Cocoa + +import mlx_window +import mlx_image +import mlx_init + + + +func _mlx_bridge(obj : T) -> UnsafeRawPointer { + return UnsafeRawPointer(Unmanaged.passUnretained(obj).toOpaque()) +} + +func _mlx_bridge_retained(obj : T) -> UnsafeRawPointer { + return UnsafeRawPointer(Unmanaged.passRetained(obj).toOpaque()) +} + +func _mlx_bridge(ptr : UnsafeRawPointer) -> T { + return Unmanaged.fromOpaque(ptr).takeUnretainedValue() +} + +func _mlx_bridge_transfer(ptr : UnsafeRawPointer) -> T { + return Unmanaged.fromOpaque(ptr).takeRetainedValue() +} + + +let MLX_SYNC_IMAGE_WRITABLE = Int32(1) +let MLX_SYNC_WIN_FLUSH_CMD = Int32(2) +let MLX_SYNC_WIN_CMD_COMPLETED = Int32(3) + + + +/// C decl + + +@_cdecl("mlx_init") +public func mlx_init_swift() -> UnsafeRawPointer +{ + let mm = MlxMain() + return (_mlx_bridge_retained(obj:mm)) +} + + +@_cdecl("mlx_loop") +public func mlx_loop_swift(_ mlxptr:UnsafeRawPointer) +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + mlx.inLoop = true + NSApp.run() +} + + +@_cdecl("mlx_new_window") +public func mlx_new_window_swift(_ mlxptr:UnsafeRawPointer, Width w:UInt32, Height h:UInt32, Title t:UnsafePointer) -> UnsafeRawPointer +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + let mw = MlxWin(device: mlx.device, width: Int(w), height: Int(h), title: String(cString: t)) + mw.setNotifs() + mw.initMetal() + mlx.addWinToList(mw) + return (_mlx_bridge_retained(obj:mw)) +} + + + +@_cdecl("mlx_key_hook") +public func mlx_key_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + win.addHook(index: 3, fct: fctptr, param: paramptr) + return (Int32(0)); +} + + +@_cdecl("mlx_mouse_hook") +public func mlx_mouse_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + win.addHook(index: 4, fct: fctptr, param: paramptr) + return (Int32(0)); +} + + +@_cdecl("mlx_hook") +public func mlx_hook_swift(_ winptr:UnsafeRawPointer, _ xevent:Int32, _ xmask:Int32, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + win.addHook(index: Int(xevent), fct: fctptr, param: paramptr) + return (Int32(0)); +} + + +@_cdecl("mlx_expose_hook") +public func mlx_expose_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + win.addHook(index: 12, fct: fctptr, param: paramptr) + return (Int32(0)); +} + +@_cdecl("mlx_loop_hook") +public func mlx_loop_hook_swift(_ mlxptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + mlx.addLoopHook(fctptr, paramptr) + return (Int32(0)); +} + + +@_cdecl("mlx_do_key_autorepeatoff") +public func mlx_do_key_autorepeatoff_swift(_ mlxptr:UnsafeRawPointer) +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + mlx.winList.forEach{ $0.setKeyRepeat(0) } +} + + +@_cdecl("mlx_do_key_autorepeaton") +public func mlx_do_key_autorepeatoon_swift(_ mlxptr:UnsafeRawPointer) +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + mlx.winList.forEach{ $0.setKeyRepeat(1) } +} + + +@_cdecl("mlx_clear_window") +public func mlx_clear_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer) +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + win.clearWin() +} + + +@_cdecl("mlx_pixel_put") +public func mlx_pixel_put_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ x:Int32, _ y:Int32, _ color:UInt32) +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + win.pixelPut(x, y, color) +} + + +@_cdecl("mlx_get_color_value") +public func mlx_get_color_value(_ mlxptr:UnsafeRawPointer, _ color:UInt32) -> UInt32 +{ + return color +} + + +@_cdecl("mlx_new_image") +public func mlx_new_image(_ mlxptr:UnsafeRawPointer, _ width:Int32, _ height:Int32) -> UnsafeRawPointer +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + let img = MlxImg(d:mlx.device, w:Int(width), h:Int(height)) + mlx.addImgToList(img) +/// print(CFGetRetainCount(img)) + return (_mlx_bridge_retained(obj:img)) + +} + +@_cdecl("mlx_get_data_addr") +public func mlx_get_data_addr_swift(_ imgptr:UnsafeRawPointer, _ bpp:UnsafeMutablePointer, _ sizeline:UnsafeMutablePointer, _ endian:UnsafeMutablePointer) -> UnsafeMutablePointer +{ + let img:MlxImg = _mlx_bridge(ptr:imgptr) + bpp.pointee = 32 + sizeline.pointee = Int32(img.texture_sizeline) + endian.pointee = Int32(0) + return img.texture_data +} + +@_cdecl("mlx_put_image_to_window") +public func mlx_put_image_to_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer, _ x:Int32, _ y:Int32) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + let img:MlxImg = _mlx_bridge(ptr:imgptr) + win.putImage(image:img, x:x, y:y) + return Int32(0) +} + +@_cdecl("mlx_put_image_to_window_scale") +public func mlx_put_image_to_window_scale_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer, _ sx:Int32, _ sy:Int32, _ sw:Int32, _ sh:Int32, _ dx:Int32, _ dy:Int32, _ dw:Int32, _ dh:Int32, _ color:UInt32) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + let img:MlxImg = _mlx_bridge(ptr:imgptr) + win.putImageScale(image:img, sx:sx, sy:sy, sw:sw, sh:sh, dx:dx, dy:dy, dw:dw, dh:dh, c:color) + return Int32(0) +} + +@_cdecl("mlx_do_sync") +public func mlx_do_sync_swift(_ mlxptr:UnsafeRawPointer) -> Int32 +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + mlx.winList.forEach { $0.flushImages() } + mlx.winList.forEach { $0.waitForGPU() } + return Int32(0) +} + +@_cdecl("mlx_sync") +public func mlx_sync_swift(_ what:Int32, _ param:UnsafeRawPointer) -> Int32 +{ + switch what + { + case MLX_SYNC_IMAGE_WRITABLE: + let img:MlxImg = _mlx_bridge(ptr:param); while img.onGPU > 0 {} + case MLX_SYNC_WIN_FLUSH_CMD: + let win:MlxWin = _mlx_bridge(ptr:param); win.flushImages() + case MLX_SYNC_WIN_CMD_COMPLETED: + let win:MlxWin = _mlx_bridge(ptr:param); win.flushImages(); win.waitForGPU() + default: + break + } + return Int32(0) +} + +@_cdecl("mlx_destroy_window") +public func mlx_destroy_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer) -> Int32 +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + /// bridge_transfer to get the retain, at end of this func should release the MlxWin object, because no ref anymore. + let win:MlxWin = _mlx_bridge_transfer(ptr:winptr) + win.delNotifs() + win.flushImages() + win.waitForGPU() + win.destroyWinE() + mlx.winList.removeAll(where: { $0 === win} ) + return Int32(0) +} + +@_cdecl("mlx_destroy_image") +public func mlx_destroy_image_swift(_ mlxptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer) -> Int32 +{ + let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + /// bridge_transfer to get the retain, at end of this func should release the MlxImg object, because no ref anymore. + let img:MlxImg = _mlx_bridge_transfer(ptr:imgptr) + mlx.winList.forEach { $0.flushImages() } + while img.onGPU > 0 {} + mlx.imgList.removeAll(where: { $0 === img} ) + return Int32(0) +} + + +@_cdecl("mlx_get_screen_size") +public func mlx_get_screen_size_swift(_ mlxptr:UnsafeRawPointer, _ sizex:UnsafeMutablePointer, _ sizey:UnsafeMutablePointer) -> Int32 +{ + /// let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) + sizex.pointee = Int32(NSScreen.main!.frame.size.width) + sizey.pointee = Int32(NSScreen.main!.frame.size.height) + return Int32(0) +} + + +@_cdecl("mlx_mouse_hide") +public func mlx_mouse_hide_swift() -> Int32 +{ + NSCursor.hide() + return Int32(0) +} + +@_cdecl("mlx_mouse_show") +public func mlx_mouse_show_swift() -> Int32 +{ + NSCursor.unhide() + return Int32(0) +} + + +@_cdecl("mlx_mouse_move") +public func mlx_mouse_move_swift(_ winptr:UnsafeRawPointer, _ x:Int32, _ y:Int32) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + let frame = win.getWinEFrame() +/// let sframe = win.getScreenFrame() + var pt = CGPoint() + pt.x = frame.origin.x + CGFloat(x) +/// pt.y = sframe.size.y - frame.size.y - frame.origin.y + 1 + y + pt.y = frame.origin.y + frame.size.height - 1.0 - CGFloat(y) + CGWarpMouseCursorPosition(pt) + CGAssociateMouseAndMouseCursorPosition(UInt32(1)) + return Int32(0); +} + + + +@_cdecl("mlx_mouse_get_pos") +public func mlx_mouse_get_pos_swift(_ winptr:UnsafeRawPointer, _ x:UnsafeMutablePointer, _ y:UnsafeMutablePointer) -> Int32 +{ + let win:MlxWin = _mlx_bridge(ptr:winptr) + let frame = win.getWinEFrame() + let point = win.getMouseLoc() + x.pointee = Int32(point.x) + y.pointee = Int32(frame.size.height - 1.0 - point.y) + return Int32(0) +} diff --git a/libs/minilibx-linux-master/man/man1/mlx.1 b/libs/minilibx_mms_20200219/man/man3/mlx.3 similarity index 63% rename from libs/minilibx-linux-master/man/man1/mlx.1 rename to libs/minilibx_mms_20200219/man/man3/mlx.3 index 9ad0ac1..4c7e29b 100644 --- a/libs/minilibx-linux-master/man/man1/mlx.1 +++ b/libs/minilibx_mms_20200219/man/man3/mlx.3 @@ -1,6 +1,6 @@ .TH MiniLibX 3 "September 19, 2002" .SH NAME -MiniLibX - Simple X-Window Interface Library for students +MiniLibX - Simple Window Interface Library for students .SH SYNOPSYS #include @@ -12,11 +12,12 @@ 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/X11 programming knowledge under Unix/Linux, nor +any AppKit programming knowledge under MacOS. It provides simple window creation, a drawing tool, image and basic events management. -.SH X-WINDOW CONCEPT +.SH Unix/Linux: X-WINDOW CONCEPT X-Window is a network-oriented graphical system for Unix. It is based on two main parts: @@ -30,6 +31,14 @@ On the other side, the X-Server manages the screen, keyboard and mouse 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). +.br +Nowadays, most of the time, both run on the same computer. + +.SH MacOS: WINDOW SERVER AND GPU + +Your software interacts directly with the Window server who handles the +cohabitation on the screen with other software and the event system, +and interacts with the GPU to handle all drawing stuff. .SH INCLUDE FILE .B mlx.h @@ -41,9 +50,9 @@ 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, -like "I want to draw a yellow pixel in this window" or "did the -user hit a key?". +use other MiniLibX functions to send and receive the messages from +the display, like "I want to draw a yellow pixel in this window" or +"did the user hit a key?". .P The .B mlx_init @@ -68,12 +77,20 @@ All other MiniLibX functions are described in the following man pages: : handle keyboard or mouse events .SH LINKING MiniLibX -To use MiniLibX functions, you'll need to link +To use MiniLibX functions, you may need to link your software with several libraries, including the MiniLibX library itself. -To do this, simply add the following arguments at linking time: +On Unix/Linux, simply add the following arguments at linking time: .B -lmlx -lXext -lX11 +On MacOS, the dynamic Metal library will find on its own the missing components: + +.B -lmlx + +and still on MacOS, the static OpenGL version will need: + +.B -lmlx -framework OpenGL -framework AppKit -lz + You may also need to specify the path to these libraries, using the .B -L @@ -83,11 +100,11 @@ 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 display, 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-2019 - Olivier Crouzet diff --git a/libs/minilibx-linux-master/man/man3/mlx_loop.1 b/libs/minilibx_mms_20200219/man/man3/mlx_loop.3 similarity index 79% rename from libs/minilibx-linux-master/man/man3/mlx_loop.1 rename to libs/minilibx_mms_20200219/man/man3/mlx_loop.3 index 3397ce2..ab3798c 100644 --- a/libs/minilibx-linux-master/man/man3/mlx_loop.1 +++ b/libs/minilibx_mms_20200219/man/man3/mlx_loop.3 @@ -43,9 +43,9 @@ 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 +The graphical system is 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 @@ -69,7 +69,8 @@ You can assign different functions to the three following events: - The mouse button is pressed .br - A part of the window should be re-drawn -(this is called an "expose" event, and it is your program's job to handle it). +(this is called an "expose" event, and it is your program's job to handle it in the +Unix/Linux X11 environment, but at the opposite it never happens on MacOS). .br Each window can define a different function for the same event. @@ -100,8 +101,8 @@ with fixed parameters: .nf expose_hook(void *param); - key_hook(int keycode,void *param); - mouse_hook(int button,int x,int y,void *param); + key_hook(int keycode, void *param); + mouse_hook(int button, int x, int y, void *param); loop_hook(void *param); .fi @@ -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 (with X11, look for the include file "keysymdef.h", +with MacOS, just try :) ), ( .I x , @@ -124,18 +126,19 @@ 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 other available 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". Some MacOS events are mapped +to these values, when it makes sense, and the mask is not used in MacOS. -See source code of mlx_int_param_event.c to find out how the MiniLibX will +See source code of the MiniLibX to find out how it will call your own function for a specific event. .SH SEE ALSO 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-2019 - Olivier Crouzet diff --git a/libs/minilibx-linux-master/man/man1/mlx_new_image.1 b/libs/minilibx_mms_20200219/man/man3/mlx_new_image.3 similarity index 85% rename from libs/minilibx-linux-master/man/man1/mlx_new_image.1 rename to libs/minilibx_mms_20200219/man/man3/mlx_new_image.3 index f2160a2..ecea0ee 100644 --- a/libs/minilibx-linux-master/man/man1/mlx_new_image.1 +++ b/libs/minilibx_mms_20200219/man/man3/mlx_new_image.3 @@ -51,6 +51,14 @@ MiniLibX - Manipulating images .I void *mlx_ptr, char *filename, int *width, int *height ); +.nf +.I void * +.fi +.B mlx_png_file_to_image +( +.I void *mlx_ptr, char *filename, int *width, int *height +); + .nf .I int .fi @@ -141,7 +149,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 display. That is the purpose of the .B mlx_get_color_value () function. It takes a standard RGB @@ -151,19 +159,23 @@ parameter, and returns an value. The .I bits_per_pixel -least significant bits of this value can be stored in the image. +least significant bits of this value can be stored in the image. You can +avoid using this function if there is no conversion needed (eg. in case of +24 bits depth, or 32 bits depth). 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 +computer's endian. If the endian of the image differs from the local endian +(which shoud only occurs in a X11 network environment), then the value should be transformed before being used. -.SH XPM IMAGES +.SH XPM AND PNG IMAGES The .B mlx_xpm_to_image -() and +() , .B mlx_xpm_file_to_image +() and +.B mlx_png_file_to_image () functions will create a new image the same way. They will fill it using the specified .I xpm_data @@ -171,16 +183,18 @@ or .I filename , depending on which function is used. Note that MiniLibX does not use the standard -Xpm library to deal with xpm images. You may not be able to -read all types of xpm images. It however handles transparency. +Xpm and png libraries to deal with xpm and png images. You may not be able to +read all types of xpm and png images. It however handles transparency. .SH RETURN VALUES -The three functions that create images, +The four functions that create images, .B mlx_new_image() , .B mlx_xpm_to_image() -and +, .B mlx_xpm_file_to_image() +and +.B mlx_png_file_to_image() , will return NULL if an error occurs. Otherwise they return a non-null pointer as an image identifier. @@ -189,4 +203,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-2019 - Olivier Crouzet diff --git a/libs/minilibx-linux-master/man/man3/mlx_new_window.1 b/libs/minilibx_mms_20200219/man/man3/mlx_new_window.3 similarity index 96% rename from libs/minilibx-linux-master/man/man3/mlx_new_window.1 rename to libs/minilibx_mms_20200219/man/man3/mlx_new_window.3 index 90f6d47..cdfc098 100644 --- a/libs/minilibx-linux-master/man/man3/mlx_new_window.1 +++ b/libs/minilibx_mms_20200219/man/man3/mlx_new_window.3 @@ -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-2019 - Olivier Crouzet diff --git a/libs/minilibx-linux-master/man/man3/mlx_pixel_put.1 b/libs/minilibx_mms_20200219/man/man3/mlx_pixel_put.3 similarity index 82% rename from libs/minilibx-linux-master/man/man3/mlx_pixel_put.1 rename to libs/minilibx_mms_20200219/man/man3/mlx_pixel_put.3 index f4d131e..52670a6 100644 --- a/libs/minilibx-linux-master/man/man3/mlx_pixel_put.1 +++ b/libs/minilibx_mms_20200219/man/man3/mlx_pixel_put.3 @@ -49,8 +49,9 @@ will be displayed at ( .I y ). -In both functions, it is impossible to display anything outside the -specified window, nor display in another window in front of the selected one. +Both functions will discard any display outside the window. This makes +.B mlx_pixel_put +slow. Consider using images instead. .SH COLOR MANAGEMENT The @@ -72,10 +73,13 @@ this integer are filled as shown in the picture below: While filling the integer, make sure you avoid endian problems. Remember that the "blue" byte should always be the least significant one. +Depending on hardware capabilities, the most significant bit can handle +transparency. Beware, at the opposite of the OpenGL classics, it does +not represent opacity. .SH SEE ALSO mlx(3), mlx_new_window(3), mlx_new_image(3), mlx_loop(3) .SH AUTHOR -Copyright ol@ - 2002-2014 - Olivier Crouzet +Copyright ol@ - 2002-2019 - Olivier Crouzet diff --git a/libs/minilibx_mms_20200219/mlx.h b/libs/minilibx_mms_20200219/mlx.h new file mode 100644 index 0000000..f24a7f7 --- /dev/null +++ b/libs/minilibx_mms_20200219/mlx.h @@ -0,0 +1,157 @@ +/* +** mlx.h for MinilibX in +** +** Made by Charlie Root +** Login +** +** Started on Mon Jul 31 16:37:50 2000 Charlie Root +** Last update Tue Oct 14 16:23:28 2019 Olivier Crouzet +*/ + +/* +** MinilibX - Please report bugs +*/ + + +/* +** +** This library is a simple framework to help 42 students +** create simple graphical apps. +** It only provides the minimum functions, it's students' job +** to create the missing pieces for their own project :) +** +** The MinilibX can load XPM and PNG images. +** Please note that both image loaders are incomplete, some +** image may not load. +** +** For historical reasons, the alpha byte represent transparency +** instead of opacity. +** Also, for compatibility reasons, prototypes may show inconsistant +** types. +** +** Only the dynamic library is available. It must be placed in an appropriate path. +** ./ is one of them. You can also use DYLD_LIBRARY_PATH +** +*/ + + +#ifndef MLX_H + +#define MLX_H + + +void *mlx_init(); +/* +** needed before everything else. +** return (void *)0 if failed +*/ + + +/* +** Basic actions +*/ + +void *mlx_new_window(void *mlx_ptr, int size_x, int size_y, char *title); +/* +** return void *0 if failed +*/ +int mlx_clear_window(void *mlx_ptr, void *win_ptr); +int mlx_pixel_put(void *mlx_ptr, void *win_ptr, int x, int y, int color); +/* +** origin for x & y is top left corner of the window +** y down is positive +** color is 0xAARRGGBB format +** x and y must fit into the size of the window, no control is done on the values +*/ + + +/* +** Image stuff +*/ + +void *mlx_new_image(void *mlx_ptr,int width,int height); +/* +** return void *0 if failed +*/ +char *mlx_get_data_addr(void *img_ptr, int *bits_per_pixel, + int *size_line, int *endian); +/* +** endian : 0 = graphical sever is little endian, 1 = big endian +** usefull in a network environment where graphical app show on a remote monitor that can have a different endian +*/ +int mlx_put_image_to_window(void *mlx_ptr, void *win_ptr, void *img_ptr, + int x, int y); +unsigned int mlx_get_color_value(void *mlx_ptr, int color); + + +/* +** dealing with Events +*/ + +int mlx_mouse_hook (void *win_ptr, int (*funct_ptr)(), void *param); +int mlx_key_hook (void *win_ptr, int (*funct_ptr)(), void *param); +int mlx_expose_hook (void *win_ptr, int (*funct_ptr)(), void *param); + +int mlx_loop_hook (void *mlx_ptr, int (*funct_ptr)(), void *param); +int mlx_loop (void *mlx_ptr); + + +/* +** hook funct are called as follow : +** +** expose_hook(void *param); +** key_hook(int keycode, void *param); +** mouse_hook(int button, int x,int y, void *param); +** loop_hook(void *param); +** +*/ + + +/* +** Usually asked... +** mlx_string_put display may vary in size between OS and between mlx implementations +*/ + +int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color, + char *string); +void *mlx_xpm_to_image(void *mlx_ptr, char **xpm_data, + int *width, int *height); +void *mlx_xpm_file_to_image(void *mlx_ptr, char *filename, + int *width, int *height); +void *mlx_png_file_to_image(void *mlx_ptr, char *file, int *width, int *height); + +int mlx_destroy_window(void *mlx_ptr, void *win_ptr); + +int mlx_destroy_image(void *mlx_ptr, void *img_ptr); + +/* +** generic hook system for all events, and minilibX functions that +** can be hooked. Some macro and defines from X11/X.h are needed here. +*/ + +int mlx_hook(void *win_ptr, int x_event, int x_mask, + int (*funct)(), void *param); + +int mlx_mouse_hide(); +int mlx_mouse_show(); +int mlx_mouse_move(void *win_ptr, int x, int y); +int mlx_mouse_get_pos(void *win_ptr, int *x, int *y); + +int mlx_do_key_autorepeatoff(void *mlx_ptr); +int mlx_do_key_autorepeaton(void *mlx_ptr); +int mlx_do_sync(void *mlx_ptr); + +#define MLX_SYNC_IMAGE_WRITABLE 1 +#define MLX_SYNC_WIN_FLUSH_CMD 2 +#define MLX_SYNC_WIN_CMD_COMPLETED 3 +int mlx_sync(int cmd, void *param); +/* +** image_writable can loop forever if no flush occurred. Flush is always done by mlx_loop. +** cmd_completed first flush then wait for completion. +** mlx_do_sync equals cmd_completed for all windows. +** cmd is one of the define, param will be img_ptr or win_ptr accordingly +*/ + +int mlx_get_screen_size(void *mlx_ptr, int *sizex, int *sizey); + +#endif /* MLX_H */ diff --git a/libs/minilibx_mms_20200219/mlx_image.swift b/libs/minilibx_mms_20200219/mlx_image.swift new file mode 100644 index 0000000..7c1fa9b --- /dev/null +++ b/libs/minilibx_mms_20200219/mlx_image.swift @@ -0,0 +1,48 @@ + + +import Metal + + +public class MlxImg +{ + public var texture: MTLTexture +/// var texture_buff: MTLBuffer + + public var texture_sizeline: Int + public var texture_data: UnsafeMutablePointer + public var texture_width: Int + public var texture_height: Int + + public var onGPU = 0 + + convenience public init(d device:MTLDevice, w width:Int, h height:Int) + { + self.init(d:device, w:width, h:height, t:0) + } + + public init(d device:MTLDevice, w width:Int, h height:Int, t target:Int) + { + texture_width = width + texture_height = height + texture_sizeline = width * 4 + texture_sizeline = 256 * (texture_sizeline / 256 + (texture_sizeline%256 >= 1 ? 1 : 0) ) + + let textureDesc = MTLTextureDescriptor() + textureDesc.width = texture_width + textureDesc.height = texture_height + textureDesc.usage = .shaderRead + if (target == 1) + { + textureDesc.usage = .renderTarget + textureDesc.storageMode = .private + } + textureDesc.pixelFormat = MTLPixelFormat.bgra8Unorm + let texture_buff = device.makeBuffer(length: texture_sizeline * height)! + texture = texture_buff.makeTexture(descriptor:textureDesc, offset:0, bytesPerRow:texture_sizeline)! + + let tmpptr = texture_buff.contents() + texture_data = tmpptr.assumingMemoryBound(to:UInt32.self) + } + + +} \ No newline at end of file diff --git a/libs/minilibx_mms_20200219/mlx_init.swift b/libs/minilibx_mms_20200219/mlx_init.swift new file mode 100644 index 0000000..de6edf2 --- /dev/null +++ b/libs/minilibx_mms_20200219/mlx_init.swift @@ -0,0 +1,100 @@ + +import Cocoa +import Metal +import mlx_window +import mlx_image + + +func _mlx_bridge(obj : T) -> UnsafeMutableRawPointer? { + return UnsafeMutableRawPointer(Unmanaged.passUnretained(obj).toOpaque()) +} + +func _mlx_bridge(ptr : UnsafeRawPointer) -> T { + return Unmanaged.fromOpaque(ptr).takeUnretainedValue() +} + + + +public class MlxMain { + + public var winList = [MlxWin]() + public var imgList = [MlxImg]() + var myMlxApp:NSApplication? + public var device:MTLDevice! + var loopHook:UnsafeMutableRawPointer? + var loopParam:UnsafeMutableRawPointer + var loopHookTimer:CFRunLoopTimer? + public var inLoop = false + + public init(_ flag:Int = 0) + { + /// make app with top menubar + myMlxApp = NSApplication.shared + if (flag == 1) + { + NSApp.setActivationPolicy(NSApplication.ActivationPolicy.prohibited) /// for non clickable win, no top menu + } + else + { + NSApp.setActivationPolicy(NSApplication.ActivationPolicy.regular) + } + + device = MTLCreateSystemDefaultDevice()! + loopParam = UnsafeMutableRawPointer(&inLoop) /// dummy addr init + + /// Add observer anyway to flush pixels every loop. If loop_hook exists, call it. + var ocontext = CFRunLoopObserverContext(version:0, info:_mlx_bridge(obj:self), retain:nil, release:nil, copyDescription:nil) + let observer = CFRunLoopObserverCreate(kCFAllocatorDefault, CFRunLoopActivity.beforeWaiting.rawValue, true, 0, createOCallback(), &ocontext) + CFRunLoopAddObserver(CFRunLoopGetMain(), observer, CFRunLoopMode.commonModes) + + } + + public func addWinToList(_ win:MlxWin) + { winList.append(win) } + public func addImgToList(_ img:MlxImg) + { imgList.append(img) } + + + func doCallLoopHook() + { +/// if (loopHook != nil) +/// { + _ = (unsafeBitCast(loopHook!,to:(@convention(c)(UnsafeRawPointer)->Void).self))(loopParam) +/// } + } + + func createOCallback() -> CFRunLoopObserverCallBack + { + return { (cfRunloopObserver, cfrunloopactivity, info) -> Void in + let mlx:MlxMain = _mlx_bridge(ptr:info!) + mlx.winList.forEach { $0.flushImages() } +/// mlx.doCallLoopHook() + } + } + + func createTCallback() -> CFRunLoopTimerCallBack + { + return { (cfRunloopTimer, info) -> Void in + let mlx:MlxMain = _mlx_bridge(ptr:info!) + mlx.doCallLoopHook() + } + } + + public func addLoopHook(_ f:UnsafeMutableRawPointer?, _ p:UnsafeMutableRawPointer) + { + var tcontext = CFRunLoopTimerContext(version:0, info:_mlx_bridge(obj:self), retain:nil, release:nil, copyDescription:nil) + if (loopHook != nil) + { + CFRunLoopTimerInvalidate(loopHookTimer) + } + + loopHook = f + loopParam = p + if (loopHook != nil) + { + loopHookTimer = CFRunLoopTimerCreate(kCFAllocatorDefault, 0.0, 0.0001, 0, 0, createTCallback(), &tcontext) + CFRunLoopAddTimer(CFRunLoopGetMain(), loopHookTimer, CFRunLoopMode.commonModes) + } + } + +} diff --git a/libs/minilibx_mms_20200219/mlx_png.c b/libs/minilibx_mms_20200219/mlx_png.c new file mode 100644 index 0000000..48e82de --- /dev/null +++ b/libs/minilibx_mms_20200219/mlx_png.c @@ -0,0 +1,431 @@ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "zlib.h" + +#include "mlx.h" + +#define UNIQ_BPP 4 + +#define PNG_MAGIC_SIZE 8 +unsigned char magic[PNG_MAGIC_SIZE] = {137, 80, 78, 71, 13, 10, 26, 10}; +#define PNG_HDR_SIZE 13 + +#define Z_CHUNK 32768 + +#define ERR_MAGIC_SIZE 1 +#define ERR_MAGIC_WRONG 2 +#define ERR_STRUCT_INCOMPLETE 3 +#define ERR_STRUCT_HDR 4 +#define ERR_STRUCT_END 5 +#define ERR_STRUCT_CRC 6 +#define ERR_STRUCT_INCIMPL 7 +#define ERR_STRUCT_DAT 8 +#define ERR_STRUCT_MISSCHK 9 +#define ERR_ZLIB 10 +#define ERR_DATA_MISMATCH 11 +#define ERR_DATA_FILTER 12 +#define ERR_MALLOC 13 +char *(mipng_err[]) = +{ + "No error", + "Not enough size for magic", + "Wrong magic", + "Incomplete chunk structure", + "Duplicate or incorrect header", + "Duplicate or incorrect end", + "Invalid CRC in chunk", + "Incorrect header or configuration not implemented", + "Non consecutive dat chunks", + "Missing header/dat/end chunk(s)", + "Zlib inflate error", + "Inflated data size mismatch", + "Unknown scanline filter", + "Can't malloc" +}; + +typedef struct png_info_s +{ + unsigned int width; + unsigned int height; + int depth; + int color; + int interlace; + int bpp; +} png_info_t; + + +int mipng_is_type(unsigned char *ptr, char *type) +{ + if (ptr[4] == type[0] && ptr[5] == type[1] && ptr[6] == type[2] && ptr[7] == type[3]) + return (1); + return (0); +} + + +unsigned char mipng_defilter_none(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]); } +unsigned char mipng_defilter_sub(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]+(unsigned int)a); } +unsigned char mipng_defilter_up(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]+(unsigned int)b); } +unsigned char mipng_defilter_average(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]+((unsigned int)a+(unsigned int)b)/2); } +unsigned char mipng_defilter_paeth(unsigned char *buff, int pos, int a, int b, int c) +{ + int p; + int result; + + p = a + b - c; + if (abs(b - c) <= abs(a - c) && abs(b - c) <= abs(a + b - c - c)) + result = a; + else + if (abs(a - c) <= abs(a + b - c - c)) + result = b; + else + result = c; + return (buff[pos]+result); +} + + + +unsigned char (*(mipng_defilter[]))(unsigned char *buff, int pos, int a, int b, int c) = +{ + mipng_defilter_none, + mipng_defilter_sub, + mipng_defilter_up, + mipng_defilter_average, + mipng_defilter_paeth +}; + +// only work for mlx mac or img 32bpp +int mipng_fill_img(void *img, unsigned char *buf, png_info_t *pi) +{ + unsigned int current_filter; + int ipos; + int bpos; + int ilen; + int iline; + int blen; + int bpp; + int endian; + unsigned char tmp; + unsigned char *ibuf; + + ibuf = (unsigned char *)mlx_get_data_addr(img, &bpp, &iline, &endian); + // iline = img->width * UNIQ_BPP; + // ilen = img->width * img->height * UNIQ_BPP; + ilen = iline*pi->height; + ipos = 0; + blen = pi->width * pi->height * pi->bpp + pi->height; // ??? why + pi->height ?? + bpos = 0; + while (ipos < ilen && bpos < blen) + { + if (ipos % iline == 0) + { + // printf("ipos %d iline %d pi->width %d bpos %d\n", ipos, iline, pi->width, bpos); + if ((current_filter = buf[bpos++]) > 4) + { + return (ERR_DATA_FILTER); + } + } + ibuf[ipos] = mipng_defilter[current_filter](buf, bpos, + ipos%iline>3?ibuf[ipos-UNIQ_BPP]:0, + (ipos>=iline)?ibuf[ipos-iline]:0, + (ipos>=iline && ipos%iline>3)?ibuf[ipos-iline-UNIQ_BPP]:0); + ipos ++; + bpos ++; + if (pi->depth == 16) + bpos ++; + if (ipos % 4 == 3 && pi->color == 2) // no alpha + ibuf[ipos++] = 0xFF; + if (ipos % iline == pi->width * 4) + ipos += iline-pi->width*4; + } + if (ipos != ilen || bpos != blen) + { + // printf("fill err ipos %d vs %d, bpos %d vs %d\n", ipos, ilen, bpos, blen); + return (ERR_DATA_MISMATCH); + } + ipos = 0; + while (ipos < ilen) + { + tmp = ibuf[ipos]; + ibuf[ipos] = ibuf[ipos+2]; + ibuf[ipos+2] = tmp; + ibuf[ipos+3] = 0xFF - ibuf[ipos+3]; + ipos += UNIQ_BPP; + } + return (0); +} + + +int mipng_data(void *img, unsigned char *dat, png_info_t *pi) +{ + unsigned int len; + int b_pos; + unsigned char *buffer; + int ret; + int z_ret; + unsigned z_have; + z_stream z_strm; + unsigned char z_out[Z_CHUNK]; + + b_pos = 0; + if (!(buffer = malloc((long long)pi->width*(long long)pi->height*(long long)pi->bpp + pi->height))) + return (ERR_MALLOC); + z_strm.zalloc = Z_NULL; + z_strm.zfree = Z_NULL; + z_strm.opaque = Z_NULL; + z_strm.avail_in = 0; + z_strm.next_in = Z_NULL; + z_ret = inflateInit(&z_strm); + if (z_ret != Z_OK) + { + free(buffer); + return (ERR_ZLIB); + } + + while (mipng_is_type(dat, "IDAT")) + { + len = *((unsigned int *)dat); + len = ntohl(len); + z_strm.avail_in = len; + z_strm.next_in = dat + 8; + z_strm.avail_out = 0; + while (z_strm.avail_out == 0) + { + z_strm.avail_out = Z_CHUNK; + z_strm.next_out = z_out; + z_ret = inflate(&z_strm, Z_NO_FLUSH); + // printf("inflate ret %d avail_out %d\n", z_ret, z_strm.avail_out); + if (z_ret != Z_OK && z_ret != Z_STREAM_END) + { + inflateEnd(&z_strm); + free(buffer); + return (ERR_ZLIB); + } + if (b_pos + Z_CHUNK - z_strm.avail_out > pi->width*pi->height*pi->bpp+pi->height) + { + inflateEnd(&z_strm); + free(buffer); + return (ERR_DATA_MISMATCH); + } + bcopy(z_out, buffer+b_pos, Z_CHUNK - z_strm.avail_out); + b_pos += Z_CHUNK - z_strm.avail_out; + } + dat += len + 4 + 4 + 4; + } + inflateEnd(&z_strm); + if (b_pos != pi->width*pi->height*pi->bpp+pi->height) + { + // printf("pb : bpos %d vs expected %d\n", b_pos, img->width*img->height*pi->bpp+img->height); + free(buffer); + return (ERR_DATA_MISMATCH); + } + ret = mipng_fill_img(img, buffer, pi); + free(buffer); + return (ret); +} + + + +int mipng_magic(unsigned char *ptr, int size) +{ + int i; + + if (size < PNG_MAGIC_SIZE) + return (ERR_MAGIC_SIZE); + i = 0; + while (i < PNG_MAGIC_SIZE) + if (*(ptr++) != magic[i++]) + return (ERR_MAGIC_WRONG); + return (0); +} + + +unsigned long crc_table[256] = { 0, 0x77073096, 0xee0e612c, 0x990951ba, 0x76dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0xedb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x9b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x1db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x6b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0xf00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x86d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x3b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x4db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0xd6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0xa00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x26d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x5005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0xcb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0xbdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; + +// From http://www.w3.org/TR/PNG/#D-CRCAppendix +int mipng_crc(unsigned char *ptr, int len) +{ + unsigned int file_crc; + unsigned long crc; + int i; + + file_crc = *((unsigned int *)(ptr+4+4+len)); + file_crc = ntohl(file_crc); + + crc = 0xffffffffL; + i = 0; + while (i < len+4) + crc = crc_table[(crc ^ ptr[(i++)+4]) & 0xff] ^ (crc >> 8); + crc ^= 0xffffffffL; + + if (file_crc != crc) + return (1); + return (0); +} + + +int mipng_structure(unsigned char *ptr, int size, unsigned char **hdr, unsigned char **dat) +{ + unsigned int len; + int dat_state; + int end; + + dat_state = 0; + *hdr = NULL; + *dat = NULL; + end = 0; + while (size) + { + if (size >= 4) // length present + { + len = *((unsigned int *)ptr); + len = ntohl(len); + if (size < 4 + 4 + 4 + len) + return (ERR_STRUCT_INCOMPLETE); + if (mipng_crc(ptr, len)) + return (ERR_STRUCT_CRC); + // printf("found chunk len %d type %c%c%c%c\n", len, *(ptr+4), *(ptr+5), *(ptr+6), *(ptr+7)); + if (mipng_is_type(ptr, "IHDR")) + { + if (*hdr || len != PNG_HDR_SIZE) + return (ERR_STRUCT_HDR); + *hdr = ptr; + } + if (mipng_is_type(ptr, "IEND")) + { + if (len != 0 || size != 4+4+4) + return (ERR_STRUCT_END); + end = 1; + } + if (mipng_is_type(ptr, "IDAT")) + { + if (dat_state == 0) + { + dat_state = 1; + *dat = ptr; + } + if (dat_state == 2) + return (ERR_STRUCT_DAT); + } + else + if (dat_state == 1) + dat_state = 2; + size -= 4+4+4+len; + ptr += 4+4+4+len; + } + else + return (ERR_STRUCT_INCOMPLETE); + } + if (*hdr == 0 || *dat == 0 || end == 0) + return (ERR_STRUCT_MISSCHK); + return (0); +} + + +int mipng_verif_hdr(unsigned char *hdr, png_info_t *pi) +{ + unsigned int compress; + unsigned int filter; + + hdr += 8; + pi->width = ntohl(*((unsigned long *)hdr)); + pi->height = ntohl(*((unsigned long *)(hdr+4))); + pi->depth = *(hdr+8); + pi->color = *(hdr+9); + compress = *(hdr+10); + filter = *(hdr+11); + pi->interlace = *(hdr+12); + if (pi->width <= 0 || pi->height <= 0 || (pi->depth != 8 && pi->depth != 16) + || (pi->color != 2 && pi->color != 6) || compress != 0 || filter != 0 || pi->interlace != 0) + return (ERR_STRUCT_INCIMPL); + pi->bpp = pi->depth / 8; + if (pi->color == 2) + pi->bpp *= 3; + if (pi->color == 6) + pi->bpp *= 4; + // printf("hdr info : %d x %d, depth %d, col type %d, comp %d, filter %d, interlace %d\nbpp is %d\n", + // pi->width, pi->height, pi->depth, pi->color, compress, filter, pi->interlace, pi->bpp); + return (0); +} + + +void *mlx_int_parse_png(void *xvar, unsigned char *fptr, int size, int *width, int *height) +{ + int err; + unsigned char *hdr; + unsigned char *dat; + png_info_t pi; + void *img; + + if ((err = mipng_magic(fptr, size))) + { + warnx("mlx PNG error : %s", mipng_err[err]); + return ((void *)0); + } + fptr += PNG_MAGIC_SIZE; + size -= PNG_MAGIC_SIZE; + if ((err = mipng_structure(fptr, size, &hdr, &dat))) + { + warnx("mlx PNG error : %s", mipng_err[err]); + return ((void *)0); + } + if ((err = mipng_verif_hdr(hdr, &pi))) + { + warnx("mlx PNG error : %s", mipng_err[err]); + return ((void *)0); + } + if (!(img = mlx_new_image(xvar, pi.width, pi.height))) + { + warnx("mlx PNG error : Can't create mlx image"); + return ((void *)0); + } + *width = pi.width; + *height = pi.height; + if ((err = mipng_data(img, dat, &pi))) + { + mlx_destroy_image(xvar, img); + warnx("mlx PNG error : %s", mipng_err[err]); + return ((void *)0); + } + return (img); +} + + + + +void *mlx_png_file_to_image(void *xvar, char *file, int *width, int *height) +{ + int fd; + int size; + unsigned char *ptr; + void *img; + + if ((fd = open(file, O_RDONLY)) == -1 || (size = lseek(fd, 0, SEEK_END)) == -1 || + (ptr = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0)) == (void *)MAP_FAILED) + { + if (fd >= 0) + close(fd); + warnx("Can't map png file '%s'", file); + return ((void *)0); + } + if (!(img = mlx_int_parse_png(xvar, ptr, size, width, height))) + { + *width = 0; + *height = 0; + } + munmap(ptr,size); + close(fd); + return (img); +} diff --git a/libs/minilibx-linux-master/mlx_rgb.c b/libs/minilibx_mms_20200219/mlx_rgb.c similarity index 99% rename from libs/minilibx-linux-master/mlx_rgb.c rename to libs/minilibx_mms_20200219/mlx_rgb.c index 0cfccf6..3f98717 100644 --- a/libs/minilibx-linux-master/mlx_rgb.c +++ b/libs/minilibx_mms_20200219/mlx_rgb.c @@ -3,7 +3,6 @@ ** the XFree86 distribution. */ -#include "mlx_int.h" struct s_col_name mlx_col_name[] = { diff --git a/libs/minilibx_mms_20200219/mlx_string_put.c b/libs/minilibx_mms_20200219/mlx_string_put.c new file mode 100644 index 0000000..435493c --- /dev/null +++ b/libs/minilibx_mms_20200219/mlx_string_put.c @@ -0,0 +1,72 @@ + +#include "mlx.h" + +#include "font.c" + +#define ATLAS_NB_CHAR 95 + +#define FONT_WIDTH ((font_atlas.width/(ATLAS_NB_CHAR))-2) + + +int mlx_put_image_to_window_scale(void *mlx_ptr, void *win_ptr, void *img_ptr, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, unsigned int color); + +void mlx_int_fill(unsigned char *data, int sl) +{ + int i, j; + j = 0; + while (j < font_atlas.height) + { + i = 0; + while (i < font_atlas.width) + { + data[j*sl+i*4] = font_atlas.pixel_data[j*font_atlas.width*font_atlas.bytes_per_pixel+i*4+2]; + data[j*sl+i*4+1] = font_atlas.pixel_data[j*font_atlas.width*font_atlas.bytes_per_pixel+i*4+1]; + data[j*sl+i*4+2] = font_atlas.pixel_data[j*font_atlas.width*font_atlas.bytes_per_pixel+i*4]; + data[j*sl+i*4+3] = 0xFF - font_atlas.pixel_data[j*font_atlas.width*font_atlas.bytes_per_pixel+i*4+3]; + i ++; + } + j ++; + } + +} + +int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string) +{ + static void *font = (void *)0; + static unsigned char *data = (void *)0; + static int size_line = 0; + int bpp; + int endian; + int pos; + int val; + int dest_w; + int dest_h; + + if (font == (void *)0) + { + font = mlx_new_image(mlx_ptr, font_atlas.width, font_atlas.height); + data = (unsigned char *)mlx_get_data_addr(font, &bpp, &size_line, &endian); + mlx_int_fill(data, size_line); + } + + color = (color&0xFFFFFF)|0xFF000000; + + // dest_w = (FONT_WIDTH*5)/7; /// ratio with X11 standard mlx_string_put + // dest_h = (font_atlas.height*5)/7; + dest_w = FONT_WIDTH; + dest_h = font_atlas.height; + y = y - (dest_h*3)/4; + + pos = 0; + while (*string) + { + if (*string >= 32 && *string <= 127) + val = *string - 32; + else + val = 31; + mlx_put_image_to_window_scale(mlx_ptr, win_ptr, font, val*(FONT_WIDTH+2), 0, FONT_WIDTH, font_atlas.height, x+pos*dest_w, y, dest_w, dest_h, color); + pos ++; + string ++; + } + return (0); +} diff --git a/libs/minilibx_mms_20200219/mlx_window.swift b/libs/minilibx_mms_20200219/mlx_window.swift new file mode 100644 index 0000000..0b578d8 --- /dev/null +++ b/libs/minilibx_mms_20200219/mlx_window.swift @@ -0,0 +1,541 @@ + +import Cocoa +import Metal +import MetalKit +import Darwin + +import mlx_image + + +class WinEvent: NSWindow +{ + var eventFuncts = [UnsafeMutableRawPointer?]() + var eventParams = [UnsafeMutableRawPointer]() + + var keyrepeat = 1 + var keyflag:UInt32 = 0 + + var size_y:Int + + init(frame rect:CGRect) + { + for _ in 0...31 + { + eventFuncts.append(Optional.none) + eventParams.append(UnsafeMutableRawPointer(&keyrepeat)) /// dummy address here, null not needed + } + + let wsm = NSWindow.StyleMask(rawValue: NSWindow.StyleMask.titled.rawValue|NSWindow.StyleMask.closable.rawValue|NSWindow.StyleMask.miniaturizable.rawValue) + let bck = NSWindow.BackingStoreType.buffered + size_y = Int(rect.size.height) + super.init(contentRect: rect, styleMask: wsm, backing: bck, defer: false) + } + + func setNotifs() + { + NotificationCenter.default.addObserver(self, selector: #selector(exposeNotification(_:)), name: NSWindow.didBecomeKeyNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(deminiaturizeNotification(_:)), name: NSWindow.didDeminiaturizeNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(closeNotification(_:)), name: NSWindow.willCloseNotification, 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]; +***/ + + } + + func delNotifs() + { + NotificationCenter.default.removeObserver(self, name: NSWindow.willCloseNotification, object: nil) + } + + public func setKeyRepeat(_ mode:Int) + { + keyrepeat = mode; + } + + + func addHook(index idx:Int, fct fptr:UnsafeMutableRawPointer?, param pptr:UnsafeMutableRawPointer) + { + eventFuncts[idx] = fptr; + eventParams[idx] = pptr; + if (idx == 6 || idx == 32) + { + if (fptr != nil) /// == nullptr) + { self.acceptsMouseMovedEvents = true } + else { self.acceptsMouseMovedEvents = false } + } + } + + + override func keyDown(with event: NSEvent) + { + /// print("got keydown with code: \(event.keyCode) ") + if (event.isARepeat && keyrepeat == 0) + { return } + if (eventFuncts[2] != nil) + { + _ = unsafeBitCast(eventFuncts[2],to:(@convention(c)(Int32, UnsafeRawPointer)->Int32).self)(Int32(event.keyCode), eventParams[2]) + } + } + + + override func keyUp(with event: NSEvent) + { + /// print("got keyup with code: \(event.keyCode) and calling key hook") + if (event.isARepeat && keyrepeat == 0) + { return } + if (eventFuncts[3] != nil) + { + _ = unsafeBitCast(eventFuncts[3],to:(@convention(c)(Int32, UnsafeRawPointer)->Int32).self)(Int32(event.keyCode), eventParams[3]) + } + } + + + func get_mouse_button(with ev:NSEvent) -> Int + { + switch (ev.type) { + case NSEvent.EventType.leftMouseDown, + NSEvent.EventType.leftMouseUp, + NSEvent.EventType.leftMouseDragged: + return 1; + case NSEvent.EventType.rightMouseDown, + NSEvent.EventType.rightMouseUp, + NSEvent.EventType.rightMouseDragged: + return 2; + case NSEvent.EventType.otherMouseDown, + NSEvent.EventType.otherMouseUp, + NSEvent.EventType.otherMouseDragged: + return 3; + default: + return 0; + } + } + + + + func mouse(with event: NSEvent, index idx:Int, type t:Int) + { + var thepoint:NSPoint + var button:Int + + thepoint = event.locationInWindow + button = get_mouse_button(with:event) + /// button = event.buttonNumber + /// print(" mouse down button \(event.buttonNumber) at location \(thepoint.x) x \(thepoint.y)") + if (eventFuncts[idx] != nil) + { + if (t == 0) + { _ = unsafeBitCast(eventFuncts[idx],to:(@convention(c)(Int32, Int32, Int32, UnsafeRawPointer)->Int32).self)(Int32(button), Int32(thepoint.x), Int32(size_y-1-Int(thepoint.y)), eventParams[idx]) } + if (t == 1) + { _ = unsafeBitCast(eventFuncts[idx],to:(@convention(c)(Int32, Int32, UnsafeRawPointer)->Int32).self)(Int32(thepoint.x), Int32(size_y-1-Int(thepoint.y)), eventParams[idx]) } + } + } + + override func mouseDown(with event: NSEvent) { mouse(with:event, index:4, type:0) } + override func rightMouseDown(with event: NSEvent) { mouse(with:event, index:4, type:0) } + override func otherMouseDown(with event: NSEvent) { mouse(with:event, index:4, type:0) } + + override func mouseUp(with event: NSEvent) { mouse(with:event, index:5, type:0) } + override func rightMouseUp(with event: NSEvent) { mouse(with:event, index:5, type:0) } + override func otherMouseUp(with event: NSEvent) { mouse(with:event, index:5, type:0) } + + override func mouseMoved(with event: NSEvent) { mouse(with:event, index:6, type:1) } + override func mouseDragged(with event: NSEvent) { mouse(with:event, index:6, type:1) } + override func rightMouseDragged(with event: NSEvent) { mouse(with:event, index:6, type:1) } + override func otherMouseDragged(with event: NSEvent) { mouse(with:event, index:6, type:1) } + + + override func scrollWheel(with event: NSEvent) + { + var thepoint:NSPoint + var button = 0; + + thepoint = event.locationInWindow + if (event.deltaY > 0.2) { button = 4; } + if (event.deltaY < -0.2) { button = 5; } + if (event.deltaX > 0.2) { button = 6; } + if (event.deltaX < -0.2) { button = 7; } + if (button != 0 && eventFuncts[4] != nil) + { + _ = unsafeBitCast(eventFuncts[4],to:(@convention(c)(Int32, Int32, Int32, UnsafeRawPointer)->Int32).self)(Int32(button), Int32(thepoint.x), Int32(thepoint.y), eventParams[4]) + } + } + + + override func flagsChanged(with event: NSEvent) + { + var flag:UInt32 + var the_key:Int32 + var val:UInt32 + + flag = UInt32(event.modifierFlags.rawValue) + val = (keyflag|flag)&(~(keyflag&flag)) + if (val == 0) + { 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 += 1 } + if (flag > keyflag && eventFuncts[2] != nil) + { _ = unsafeBitCast(eventFuncts[2],to:(@convention(c)(Int32, UnsafeRawPointer)->Int32).self)(0xFF+the_key, eventParams[2]) } + if (flag < keyflag && eventFuncts[3] != nil) + { _ = unsafeBitCast(eventFuncts[3],to:(@convention(c)(Int32, UnsafeRawPointer)->Int32).self)(0xFF+the_key, eventParams[3]) } + keyflag = flag + } + + + @objc func exposeNotification(_ notification:Notification) + { + if (eventFuncts[12] != nil) + { + _ = unsafeBitCast(eventFuncts[12],to:(@convention(c)(UnsafeRawPointer)->Int32).self)(eventParams[12]) + } + } + + @objc func closeNotification(_ notification:Notification) + { + if (eventFuncts[17] != nil) + { + _ = unsafeBitCast(eventFuncts[17],to:(@convention(c)(UnsafeRawPointer)->Int32).self)(eventParams[17]) + } + } + + @objc func deminiaturizeNotification(_ notification:Notification) + { + exposeNotification(notification) + } + +} + + + + + +struct textureList +{ + var uniformBuffer: MTLBuffer! + var uniform_data:UnsafeMutablePointer + unowned var image:MlxImg +} + + +public class MlxWin +{ + let vrect: CGRect + var winE: WinEvent + var mlayer: CAMetalLayer + + unowned var device: MTLDevice + var commandQueue: MTLCommandQueue! + var pipelineState: MTLRenderPipelineState! + var vertexBuffer: MTLBuffer! + + var texture_list: Array = Array() + var texture_list_count = 0 + + var pixel_image:MlxImg + var pixel_count:Int + + var drawable_image: MlxImg + var uniq_renderPassDescriptor: MTLRenderPassDescriptor + var mtl_origin_null : MTLOrigin + var mtl_size_all : MTLSize + var doClear = false + var GPUbatch = 0 + + + public init(device d:MTLDevice, width w:Int, height h:Int, title t:String) + { + vrect = CGRect(x: 100, y: 100, width: w, height: h) + winE = WinEvent(frame: vrect) + + device = d + mlayer = CAMetalLayer() + mlayer.device = device + mlayer.pixelFormat = .bgra8Unorm + mlayer.framebufferOnly = true + mlayer.contentsScale = 1.0 /// winE.screen!.backingScaleFactor + mlayer.frame = vrect + winE.contentView! = NSView(frame: vrect) + winE.contentView!.wantsLayer = true + winE.contentView!.layer = mlayer + winE.title = t + winE.isReleasedWhenClosed = false + winE.makeKeyAndOrderFront(nil) + + + /// drawable_image = MlxImg(d: device, w:Int(CGFloat(vrect.size.width)*winE.screen!.backingScaleFactor), h:Int(CGFloat(vrect.size.height)*winE.screen!.backingScaleFactor), t:1) + drawable_image = MlxImg(d: device, w:Int(vrect.size.width), h:Int(vrect.size.height), t:1) + pixel_image = MlxImg(d: device, w:Int(vrect.size.width), h:Int(vrect.size.height)) + for i in 0...(pixel_image.texture_height*pixel_image.texture_sizeline/4-1) + { pixel_image.texture_data[i] = UInt32(0xFF000000) } + pixel_count = 0 + + mtl_origin_null = MTLOriginMake(0,0,0) + mtl_size_all = MTLSizeMake(drawable_image.texture.width, drawable_image.texture.height, 1) + + uniq_renderPassDescriptor = MTLRenderPassDescriptor() + uniq_renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColor(red: 0.0, green: 0.0, blue: 0.0, alpha:0.0) + uniq_renderPassDescriptor.colorAttachments[0].texture = drawable_image.texture + uniq_renderPassDescriptor.colorAttachments[0].storeAction = .store + uniq_renderPassDescriptor.colorAttachments[0].loadAction = .load + } + + +/// winEvent calls + public func getWinEFrame() -> NSRect { return winE.frame } + public func getScreenFrame() -> NSRect { return winE.screen!.frame } + public func getMouseLoc() -> NSPoint { return winE.mouseLocationOutsideOfEventStream } + public func addHook(index idx:Int, fct fptr:UnsafeMutableRawPointer, param pptr:UnsafeMutableRawPointer) + { winE.addHook(index: idx, fct: fptr, param: pptr) } + public func setKeyRepeat(_ mode:Int) { winE.setKeyRepeat(mode) } + public func destroyWinE() { winE.close() } + public func setNotifs() { winE.setNotifs() } + public func delNotifs() { winE.delNotifs() } + + + public func initMetal() + { + commandQueue = device.makeCommandQueue()! + + /// vertex buffer & shaders stay the always the same. + let lib = try! device.makeLibrary(source: shaders, options: nil) + let vertexFunction = lib.makeFunction(name: "basic_vertex_function") + let fragmentFunction = lib.makeFunction(name: "basic_fragment_function") + let pipelineDesc = MTLRenderPipelineDescriptor() + pipelineDesc.colorAttachments[0].pixelFormat = .bgra8Unorm + pipelineDesc.colorAttachments[0].isBlendingEnabled = true + pipelineDesc.colorAttachments[0].rgbBlendOperation = .add + pipelineDesc.colorAttachments[0].alphaBlendOperation = .add + pipelineDesc.colorAttachments[0].sourceRGBBlendFactor = .oneMinusSourceAlpha + pipelineDesc.colorAttachments[0].sourceAlphaBlendFactor = .oneMinusSourceAlpha + pipelineDesc.colorAttachments[0].destinationRGBBlendFactor = .sourceAlpha + pipelineDesc.colorAttachments[0].destinationAlphaBlendFactor = .sourceAlpha + pipelineDesc.vertexFunction = vertexFunction + pipelineDesc.fragmentFunction = fragmentFunction + pipelineState = try! device.makeRenderPipelineState(descriptor: pipelineDesc) + + let vertexData: [Float] = [ + -1.0, -1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, + -1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, + 1.0, -1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, + 1.0, -1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, + -1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, + 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0 ] + var dataSize = vertexData.count * MemoryLayout.size(ofValue: vertexData[0]) + vertexBuffer = device.makeBuffer(bytes: vertexData, length: dataSize, options: []) + + let uniformData: [Float] = [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Float(vrect.size.width), Float(vrect.size.height), 0.0, 0.0, 0.0, 0.0, + 1.0, 1.0, 1.0, 1.0 ] + dataSize = uniformData.count * MemoryLayout.size(ofValue: uniformData[0]) + for _ in 0...255 + { + let uniformBuffer = device.makeBuffer(bytes: uniformData, length: dataSize, options: [])! + let uniform_data = (uniformBuffer.contents()).assumingMemoryBound(to:Float.self) + texture_list.append(textureList(uniformBuffer:uniformBuffer, uniform_data:uniform_data, image:pixel_image)) + } + + self.clearWin(); + } + + + public func clearWin() + { + /// discard previous put_images, doClear become first operation in next render pass. + var i = 0 + while i < texture_list_count + { + texture_list[i].image.onGPU -= 1 + i += 1 + } + texture_list_count = 0 + doClear = true + /// next flush images should call draw(), even if there is no image to put + } + + func flushPixels() + { + if (pixel_count > 0) + { + pixel_count = 0 + self.putImage(image:pixel_image, x:0, y:0) + } + } + + public func flushImages() + { + flushPixels() + if (texture_list_count > 0 || doClear) + { + self.draw() + } + } + + public func waitForGPU() + { + while (GPUbatch > 0) { } + } + + + public func pixelPut(_ x:Int32, _ y:Int32, _ color:UInt32) + { + if (pixel_count == 0) + { + while (pixel_image.onGPU > 0) + { + if (GPUbatch > 0) { waitForGPU() } + else { flushImages() } + } + for i in 0...pixel_image.texture_height*pixel_image.texture_sizeline/4-1 + { pixel_image.texture_data[i] = UInt32(0xFF000000) } + } + let t = (x&(Int32(vrect.size.width-1)-x))&(y&(Int32(vrect.size.height-1)-y)) + if t >= 0 + { + pixel_image.texture_data[Int(y)*pixel_image.texture_sizeline/4+Int(x)] = color + pixel_count += 1 + } + } + + public func putImage(image img:MlxImg, x posx:Int32, y posy:Int32) + { + flushPixels() + putImageScale(image:img, sx:0, sy:0, sw:Int32(img.texture_width), sh:Int32(img.texture_height), + dx:posx, dy:posy, dw:Int32(img.texture_width), dh:Int32(img.texture_height), + c:UInt32(0xFFFFFFFF)) + } + + public func putImageScale(image img:MlxImg, sx src_x:Int32, sy src_y:Int32, sw src_w:Int32, sh src_h:Int32, dx dest_x:Int32, dy dest_y:Int32, dw dest_w:Int32, dh dest_h:Int32, c color:UInt32) + { + flushPixels() + if (texture_list_count == 0) /// means I just draw + { + waitForGPU() /// to be able to write again in uniforms + } + texture_list[texture_list_count].uniform_data[0] = Float(img.texture_width) + texture_list[texture_list_count].uniform_data[1] = Float(img.texture_height) + texture_list[texture_list_count].uniform_data[2] = Float(src_x) + texture_list[texture_list_count].uniform_data[3] = Float(src_y) + texture_list[texture_list_count].uniform_data[4] = Float(src_w) + texture_list[texture_list_count].uniform_data[5] = Float(src_h) + + texture_list[texture_list_count].uniform_data[8] = Float(dest_x) + texture_list[texture_list_count].uniform_data[9] = Float(dest_y) + texture_list[texture_list_count].uniform_data[10] = Float(dest_w) + texture_list[texture_list_count].uniform_data[11] = Float(dest_h) + + texture_list[texture_list_count].uniform_data[12] = Float((color>>16)&0xFF)/255.0; + texture_list[texture_list_count].uniform_data[13] = Float((color>>8)&0xFF)/255.0; + texture_list[texture_list_count].uniform_data[14] = Float((color>>0)&0xFF)/255.0; + texture_list[texture_list_count].uniform_data[15] = Float((color>>24)&0xFF)/255.0; + + texture_list[texture_list_count].image = img + img.onGPU += 1 + + texture_list_count += 1 + if (texture_list_count == 255) /// keep 1 slot for put_pixels image + { + flushImages() + } + } + + + func draw() + { + var commandBuffer = commandQueue.makeCommandBuffer()! + +/// clear if asked + if (doClear) + { + uniq_renderPassDescriptor.colorAttachments[0].loadAction = .clear + let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: uniq_renderPassDescriptor)! + commandEncoder.endEncoding() + uniq_renderPassDescriptor.colorAttachments[0].loadAction = .load + doClear = false + } + +/// then draw the images if any. + var i = 0 + while i < texture_list_count + { + let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: uniq_renderPassDescriptor)! + commandEncoder.setRenderPipelineState(pipelineState) + commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0) + commandEncoder.setVertexBuffer(texture_list[i].uniformBuffer, offset: 0, index: 1) + commandEncoder.setFragmentTexture(texture_list[i].image.texture, index: 0) + commandEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 6, instanceCount:2) + commandEncoder.endEncoding() + ({ j in + commandBuffer.addCompletedHandler { cb in self.texture_list[j].image.onGPU -= 1 } + })(i) + i += 1 + } + texture_list_count = 0 + commandBuffer.addCompletedHandler { cb in self.GPUbatch -= 1 } + commandBuffer.commit() + GPUbatch += 1 + +/// finally copy to MTLdrawable to present, using a new commandqueue + commandBuffer = commandQueue.makeCommandBuffer()! + let curdraw = mlayer.nextDrawable()! + + let commandBEncoder = commandBuffer.makeBlitCommandEncoder()! + commandBEncoder.copy(from:drawable_image.texture, sourceSlice:0, sourceLevel:0, sourceOrigin: mtl_origin_null, sourceSize: mtl_size_all, to:curdraw.texture, destinationSlice:0, destinationLevel:0, destinationOrigin: mtl_origin_null) + commandBEncoder.endEncoding() + + commandBuffer.addCompletedHandler { cb in self.GPUbatch -= 1 } + commandBuffer.present(curdraw) + commandBuffer.commit() + GPUbatch += 1 + } + + +} + + + + +let shaders = """ +#include +using namespace metal; + +struct VertexIn { + float4 position; + float4 UV; +}; +struct VertexOut { + float4 position [[ position ]]; + float4 color; + float2 UV; +}; +struct uniforms { + packed_float2 origin_size; + packed_float2 origin_pos; + packed_float2 origin_sub; + packed_float2 dest_size; + packed_float2 dest_pos; + packed_float2 dest_sub; + packed_float4 color; +}; +vertex VertexOut basic_vertex_function(const device VertexIn *vertices [[ buffer(0) ]], constant uniforms& uni [[ buffer(1) ]], +uint vertexID [[ vertex_id ]]) +{ + VertexOut vOut; + float4 start = float4((2.0*uni.dest_pos.x)/(uni.dest_size.x-1.0) - 1.0, 1.0 - (2.0*uni.dest_pos.y)/(uni.dest_size.y-1.0) - (uni.dest_sub.y*2.0)/uni.dest_size.y, 0.0, 0.0); + /* vOut.position = (start + (vertices[vertexID].position + 1.0) * float4(uni.dest_sub, 0.0, 0.0))/float4(uni.dest_size, 1.0, 1.0); */ + + vOut.position = float4(start.x+((vertices[vertexID].position.x + 1.0)*uni.dest_sub.x)/(uni.dest_size.x), + start.y+((vertices[vertexID].position.y + 1.0)*uni.dest_sub.y)/(uni.dest_size.y), 0.0, 1.0); + + vOut.UV = (uni.origin_pos + float2(vertices[vertexID].UV.x, vertices[vertexID].UV.y)*(uni.origin_sub-1.0))/(uni.origin_size-1.0); + vOut.color = uni.color; + return vOut; +} +fragment float4 basic_fragment_function(VertexOut vIn [[ stage_in ]], texture2d texture [[ texture(0) ]]) +{ + constexpr sampler textureSampler(address::clamp_to_edge); + return vIn.color*texture.sample(textureSampler, vIn.UV); +} +""" + diff --git a/libs/minilibx_mms_20200219/mlx_xpm.c b/libs/minilibx_mms_20200219/mlx_xpm.c new file mode 100644 index 0000000..25fdafe --- /dev/null +++ b/libs/minilibx_mms_20200219/mlx_xpm.c @@ -0,0 +1,384 @@ +// mlx xpm +// by ol + +#include +#include +#include +#include +#include +#include + +#include "mlx.h" + +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) mlx_destroy_image(xvar, img); \ + return ((void *)0); } + + + + +// +// str 2 wordtab & co + +int mlx_int_str_str(char *str,char *find,int len) +{ + int len_f; + int pos; + char *s; + char *f; + + len_f = strlen(find); + if (len_f>len) + return (-1); + pos = 0; + while (*(str+len_f-1)) + { + s = str; + f = find; + while (*(f++) == *(s++)) + if (!*f) + return (pos); + str ++; + pos ++; + } + return (-1); +} + + + +int mlx_int_str_str_cote(char *str,char *find,int len) +{ + int len_f; + int pos; + char *s; + char *f; + int cote; + + len_f = strlen(find); + if (len_f>len) + return (-1); + cote = 0; + pos = 0; + while (*(str+len_f-1)) + { + if (*str=='"') + cote = 1-cote; + if (!cote) + { + s = str; + f = find; + while (*(f++) == *(s++)) + if (!*f) + return (pos); + } + str ++; + pos ++; + } + return (-1); +} + + +char **mlx_int_str_to_wordtab(char *str) +{ + char **tab; + int pos; + int nb_word; + int len; + + len = strlen(str); + nb_word = 0; + pos = 0; + while (poslen) + { + 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, char *end) +{ + int i; + char buff[64]; + + if (*name == '#') + return (strtol(name+1,0,16)); + if (end) + { + snprintf(buff, 64, "%s %s", name, end); + name = buff; + } + 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); +} + + +void mlx_int_xpm_set_pixel(char *data, int opp, int col, int x) +{ + *((unsigned int *)(data+4*x)) = col; +} + + +void *mlx_int_parse_xpm(void *xvar,void *info,int info_size,char *(*f)(), int *width, int *height) +{ + int pos; + char *line; + char **tab; + char *data; + char *clip_data; + int nc; + int opp; + int sl; + int endian; + int cpp; + int col; + int rgb_col; + int col_name; + int method; + int x; + int i; + int j; + void *img; + t_xpm_col *colors; + int *colors_direct; + + 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; + + rgb_col = mlx_int_get_text_rgb(tab[j], tab[j+1]); + if (method) + colors_direct[mlx_int_get_col_name(line,cpp)] = rgb_col; + else + { + colors[i].name = mlx_int_get_col_name(line,cpp); + colors[i].col = rgb_col; + } + free(tab); + tab = 0; + } + + if (!(img = mlx_new_image(xvar,*width,*height))) + RETURN; + data = mlx_get_data_addr(img, &opp, &sl, &endian); + opp = 4; + + i = *height; + while (i--) + { + if (!(line = f(info,&pos,info_size))) + RETURN; + x = 0; + while (x<*width) + { + col = 0; + col_name = mlx_int_get_col_name(line+cpp*x,cpp); + if (method) + col = colors_direct[col_name]; + else + { + j = nc; + while (j--) + if (colors[j].name==col_name) + { + col = colors[j].col; + j = 0; + } + } + if (col==-1) + col = 0xFF000000; + mlx_int_xpm_set_pixel(data, opp, col, x); + x ++; + } + data += sl; //img->width*4; + } + if (colors) + free(colors); + if (colors_direct) + free(colors_direct); + return (img); +} + + +void 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(void *xvar,char *file,int *width,int *height) +{ + int fd; + int size; + char *ptr; + void *img; + + 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); + img = mlx_int_parse_xpm(xvar,ptr,size,mlx_int_get_line, width, height); + munmap(ptr,size); + close(fd); + return (img); +} + +void *mlx_xpm_to_image(void *xvar,char **xpm_data,int *width,int *height) +{ + return (mlx_int_parse_xpm(xvar,xpm_data,0,mlx_int_static_line, width, height)); +} diff --git a/libs/minilibx_mms_20200219_beta.tgz b/libs/minilibx_mms_20200219_beta.tgz deleted file mode 100644 index 950a43a1391954dbc213b05c5fc6cea07807f69b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48323 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 diff --git a/libs/minilibx_opengl.tgz b/libs/minilibx_opengl.tgz deleted file mode 100644 index 72a387c1b6e07dc307af5145e53af7bb0a263d61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55462 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

Zw2wSLR^r(jSuy6*ORW39!jXGm>gDw|@8 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 D!(@7p diff --git a/libs/minilibx_opengl_20191021/._font.xcf b/libs/minilibx_opengl_20191021/._font.xcf new file mode 100644 index 0000000000000000000000000000000000000000..d31c1a31fd9509320e730f0533c48112879b888d GIT binary patch literal 176 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUBqY_#1$j2;dkJ5(HHS(y;)D1)zKw z#Rz090AirHRC0c?0AKnQ ArvLx| literal 0 HcmV?d00001 diff --git a/libs/minilibx_opengl_20191021/Makefile b/libs/minilibx_opengl_20191021/Makefile new file mode 100644 index 0000000..2e44836 --- /dev/null +++ b/libs/minilibx_opengl_20191021/Makefile @@ -0,0 +1,24 @@ +# +# + +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 +SRC+= mlx_png.c mlx_mouse.m +OBJ1=$(SRC:.c=.o) +OBJ=$(OBJ1:.m=.o) +CFLAGS+=-O2 + +# add to match string put with X11 in size and position +CFLAGS+= -DSTRINGPUTX11 + +all: $(NOM) + +$(NOM): $(OBJ) + ar -r $(NOM) $(OBJ) + ranlib $(NOM) + +clean: + rm -f $(NOM) $(OBJ) *~ + rm -f mlx_app + +re: clean all diff --git a/libs/minilibx_opengl_20191021/font.c b/libs/minilibx_opengl_20191021/font.c new file mode 100644 index 0000000..656d248 --- /dev/null +++ b/libs/minilibx_opengl_20191021/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/libs/minilibx_opengl_20191021/font.xcf b/libs/minilibx_opengl_20191021/font.xcf new file mode 100644 index 0000000000000000000000000000000000000000..b9c8c82dec50244b31f1ae2b6f84be1668688d7b GIT binary patch literal 52570 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 D(ji>k literal 0 HcmV?d00001 diff --git a/libs/minilibx-linux-master/mlx.h b/libs/minilibx_opengl_20191021/mlx.h similarity index 68% rename from libs/minilibx-linux-master/mlx.h rename to libs/minilibx_opengl_20191021/mlx.h index 74c0aff..e75b4af 100644 --- a/libs/minilibx-linux-master/mlx.h +++ b/libs/minilibx_opengl_20191021/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,18 +78,16 @@ 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); -int mlx_get_color_value(void *mlx_ptr, int color); +unsigned int mlx_get_color_value(void *mlx_ptr, int color); /* @@ -106,17 +119,16 @@ int mlx_loop (void *mlx_ptr); int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string); -void mlx_set_font(void *mlx_ptr, void *win_ptr, char *name); void *mlx_xpm_to_image(void *mlx_ptr, char **xpm_data, int *width, int *height); void *mlx_xpm_file_to_image(void *mlx_ptr, char *filename, int *width, int *height); +void *mlx_png_file_to_image(void *mlx_ptr, char *file, int *width, int *height); + int mlx_destroy_window(void *mlx_ptr, void *win_ptr); int mlx_destroy_image(void *mlx_ptr, void *img_ptr); -int mlx_destroy_dispaly(void *mlx_ptr); - /* ** generic hook system for all events, and minilibX functions that ** can be hooked. Some macro and defines from X11/X.h are needed here. @@ -125,15 +137,13 @@ int mlx_destroy_dispaly(void *mlx_ptr); int mlx_hook(void *win_ptr, int x_event, int x_mask, int (*funct)(), void *param); +int mlx_mouse_hide(); +int mlx_mouse_show(); +int mlx_mouse_move(void *win_ptr, int x, int y); +int mlx_mouse_get_pos(void *win_ptr, int *x, int *y); + int mlx_do_key_autorepeatoff(void *mlx_ptr); int mlx_do_key_autorepeaton(void *mlx_ptr); int mlx_do_sync(void *mlx_ptr); -int mlx_mouse_get_pos(void *mlx_ptr, void *win_ptr, int *x, int *y); -int mlx_mouse_move(void *mlx_ptr, void *win_ptr, int x, int y); -int mlx_mouse_hide(void *mlx_ptr, void *win_ptr); -int mlx_mouse_show(void *mlx_ptr, void *win_ptr); - -int mlx_get_screen_size(void *mlx_ptr, int *sizex, int *sizey); - #endif /* MLX_H */ diff --git a/libs/minilibx_opengl_20191021/mlx_init_loop.m b/libs/minilibx_opengl_20191021/mlx_init_loop.m new file mode 100644 index 0000000..0377771 --- /dev/null +++ b/libs/minilibx_opengl_20191021/mlx_init_loop.m @@ -0,0 +1,192 @@ +// 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; + } + + +#ifdef STRINGPUTX11 + new_mlx->font->vertexes[2] = FONT_WIDTH/1.4; + new_mlx->font->vertexes[4] = FONT_WIDTH/1.4; + new_mlx->font->vertexes[5] = (-FONT_HEIGHT-1)/1.4; + new_mlx->font->vertexes[7] = (-FONT_HEIGHT-1)/1.4; +#else + 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; +#endif + + 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:NSEventMaskAny + 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/libs/minilibx_opengl_20191021/mlx_int.h b/libs/minilibx_opengl_20191021/mlx_int.h new file mode 100644 index 0000000..a93c1c9 --- /dev/null +++ b/libs/minilibx_opengl_20191021/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/libs/minilibx-linux-master/mlx_int_str_to_wordtab.c b/libs/minilibx_opengl_20191021/mlx_int_str_to_wordtab.c similarity index 86% rename from libs/minilibx-linux-master/mlx_int_str_to_wordtab.c rename to libs/minilibx_opengl_20191021/mlx_int_str_to_wordtab.c index 7f92089..3b2ef2e 100644 --- a/libs/minilibx-linux-master/mlx_int_str_to_wordtab.c +++ b/libs/minilibx_opengl_20191021/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/libs/minilibx_opengl_20191021/mlx_mouse.m b/libs/minilibx_opengl_20191021/mlx_mouse.m new file mode 100644 index 0000000..94ce0a9 --- /dev/null +++ b/libs/minilibx_opengl_20191021/mlx_mouse.m @@ -0,0 +1,52 @@ +#include + +#import +#import + +#include "mlx_int.h" +#include "mlx_new_window.h" + +int mlx_mouse_hide() +{ + // CGDisplayHideCursor(kCGDirectMainDisplay); + [NSCursor hide]; + return (0); +} + +int mlx_mouse_show() +{ + // CGDisplayShowCursor(kCGDirectMainDisplay); + [NSCursor unhide]; + return (0); +} + +int mlx_mouse_move(mlx_win_list_t *win, int x, int y) +{ + CGPoint point; + NSRect pos; + id thewin; + + thewin = [(id)(win->winid) win]; + pos = [thewin frame]; + // printf("got win pos %f %f\n", pos.origin.x, pos.origin.y); + point.x = pos.origin.x + x; + point.y = NSHeight([[thewin screen] frame]) - NSHeight([(id)(win->winid) frame]) - pos.origin.y + 1 + y; + CGWarpMouseCursorPosition(point); + CGAssociateMouseAndMouseCursorPosition(true); + return (0); +} + + +int mlx_mouse_get_pos(mlx_win_list_t *win, int *x, int *y) +{ + CGPoint point; + id thewin; + NSRect pos; + + thewin = [(id)(win->winid) win]; + pos = [(id)(win->winid) frame]; + point = [thewin mouseLocationOutsideOfEventStream]; + *x = point.x; + *y = NSHeight(pos) - 1 - point.y; + return (0); +} diff --git a/libs/minilibx_opengl_20191021/mlx_new_image.m b/libs/minilibx_opengl_20191021/mlx_new_image.m new file mode 100644 index 0000000..46e1df1 --- /dev/null +++ b/libs/minilibx_opengl_20191021/mlx_new_image.m @@ -0,0 +1,198 @@ +// 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); + +#ifdef STRINGPUTX11 + y -= (FONT_HEIGHT * 2)/3; +#endif + + [(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]; +#ifdef STRINGPUTX11 + x += FONT_WIDTH/1.4; +#else + x += FONT_WIDTH; +#endif + } + 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/libs/minilibx_opengl_20191021/mlx_new_window.h b/libs/minilibx_opengl_20191021/mlx_new_window.h new file mode 100644 index 0000000..d173e61 --- /dev/null +++ b/libs/minilibx_opengl_20191021/mlx_new_window.h @@ -0,0 +1,57 @@ +// +// 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; +- (NSWindowEvent *) win; +- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param; +- (void) setKeyRepeat:(int)mode; +- (void) ctxNeedsUpdate; +@end diff --git a/libs/minilibx_opengl_20191021/mlx_new_window.m b/libs/minilibx_opengl_20191021/mlx_new_window.m new file mode 100644 index 0000000..6d4fea4 --- /dev/null +++ b/libs/minilibx_opengl_20191021/mlx_new_window.m @@ -0,0 +1,766 @@ +// mlx_new_window.m + +#import +#import +#import + +#include +#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 NSEventTypeLeftMouseDown: + case NSEventTypeLeftMouseUp: + case NSEventTypeLeftMouseDragged: + return 1; + case NSEventTypeRightMouseDown: + case NSEventTypeRightMouseUp: + case NSEventTypeRightMouseDragged: + return 2; + case NSEventTypeOtherMouseDown: + case NSEventTypeOtherMouseUp: + case NSEventTypeOtherMouseDragged: + 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 || event == 32) // motion notify && high precision 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 = NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable; + + 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); +} + +- (NSWindowEvent *) win +{ + return (win); +} + + +- (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/libs/minilibx_opengl_20191021/mlx_opengl.h b/libs/minilibx_opengl_20191021/mlx_opengl.h new file mode 100644 index 0000000..bb39267 --- /dev/null +++ b/libs/minilibx_opengl_20191021/mlx_opengl.h @@ -0,0 +1,21 @@ +/* +** +** mlx_opengl.h +** +** public include, use it after mlx.h +** designed only for minilibx_macos +** +*/ + +void *mlx_new_opengl_window(void *mlx_ptr, int size_x, int size_y, char *title); + +/* create an opengl window. put_image & pixel_put & string_put do not work there. */ + +int mlx_opengl_swap_buffers(void *win_ptr); + +/* the created window is double buffered. Use this funct to swap buffers */ +/* this funct will call glFlush(). Don't call it. */ + +int mlx_opengl_window_set_context(void *win_ptr); + +/* in case multiple opengl windows are present, change opengl active context */ diff --git a/libs/minilibx_opengl_20191021/mlx_opengl.m b/libs/minilibx_opengl_20191021/mlx_opengl.m new file mode 100644 index 0000000..554d79b --- /dev/null +++ b/libs/minilibx_opengl_20191021/mlx_opengl.m @@ -0,0 +1,57 @@ +// mlx_opengl.m + +#import +#import +#import + +#include + +#include "mlx_int.h" +#include "mlx_new_window.h" + + + + + +NSOpenGLPixelFormatAttribute pfa_attrs_opengl[] = + { + NSOpenGLPFADepthSize, 32, + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core, + 0 + }; + + + +void *mlx_new_opengl_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 = 0; + 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_opengl]; + + return ((void *)newwin); +} + + +int mlx_opengl_swap_buffers(mlx_win_list_t *win_ptr) +{ + [(id)(win_ptr->winid) flushGLContext]; + return (0); +} + +int mlx_opengl_window_set_context(mlx_win_list_t *win_ptr) +{ + [(id)(win_ptr->winid) selectGLContext]; + return (0); +} diff --git a/libs/minilibx_opengl_20191021/mlx_png.c b/libs/minilibx_opengl_20191021/mlx_png.c new file mode 100644 index 0000000..ca8024d --- /dev/null +++ b/libs/minilibx_opengl_20191021/mlx_png.c @@ -0,0 +1,418 @@ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "zlib.h" + +#include +#include "mlx_int.h" + + +#define PNG_MAGIC_SIZE 8 +unsigned char magic[PNG_MAGIC_SIZE] = {137, 80, 78, 71, 13, 10, 26, 10}; +#define PNG_HDR_SIZE 13 + +#define Z_CHUNK 32768 + +#define ERR_MAGIC_SIZE 1 +#define ERR_MAGIC_WRONG 2 +#define ERR_STRUCT_INCOMPLETE 3 +#define ERR_STRUCT_HDR 4 +#define ERR_STRUCT_END 5 +#define ERR_STRUCT_CRC 6 +#define ERR_STRUCT_INCIMPL 7 +#define ERR_STRUCT_DAT 8 +#define ERR_STRUCT_MISSCHK 9 +#define ERR_ZLIB 10 +#define ERR_DATA_MISMATCH 11 +#define ERR_DATA_FILTER 12 +char *(mipng_err[]) = +{ + "No error", + "Not enough size for magic", + "Wrong magic", + "Incomplete chunk structure", + "Duplicate or incorrect header", + "Duplicate or incorrect end", + "Invalid CRC in chunk", + "Incorrect header or configuration not implemented", + "Non consecutive dat chunks", + "Missing header/dat/end chunk(s)", + "Zlib inflate error", + "Inflated data size mismatch", + "Unknown scanline filter" +}; + +typedef struct png_info_s +{ + unsigned int width; + unsigned int height; + int depth; + int color; + int interlace; + int bpp; +} png_info_t; + + +int mipng_is_type(unsigned char *ptr, char *type) +{ + if (ptr[4] == type[0] && ptr[5] == type[1] && ptr[6] == type[2] && ptr[7] == type[3]) + return (1); + return (0); +} + + +unsigned char mipng_defilter_none(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]); } +unsigned char mipng_defilter_sub(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]+(unsigned int)a); } +unsigned char mipng_defilter_up(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]+(unsigned int)b); } +unsigned char mipng_defilter_average(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]+((unsigned int)a+(unsigned int)b)/2); } +unsigned char mipng_defilter_paeth(unsigned char *buff, int pos, int a, int b, int c) +{ + int p; + int result; + + p = a + b - c; + if (abs(b - c) <= abs(a - c) && abs(b - c) <= abs(a + b - c - c)) + result = a; + else + if (abs(a - c) <= abs(a + b - c - c)) + result = b; + else + result = c; + return (buff[pos]+result); +} + + + +unsigned char (*(mipng_defilter[]))(unsigned char *buff, int pos, int a, int b, int c) = +{ + mipng_defilter_none, + mipng_defilter_sub, + mipng_defilter_up, + mipng_defilter_average, + mipng_defilter_paeth +}; + +// only work for mlx mac or img 32bpp +int mipng_fill_img(mlx_img_list_t *img, unsigned char *buf, png_info_t *pi) +{ + unsigned int current_filter; + int ipos; + int bpos; + int ilen; + int iline; + int blen; + unsigned char tmp; + unsigned char *ibuf; + + ibuf = (unsigned char *)img->buffer; + iline = img->width * UNIQ_BPP; + ilen = img->width * img->height * UNIQ_BPP; + blen = img->width * img->height * pi->bpp + img->height; + ipos = 0; + bpos = 0; + while (ipos < ilen && bpos < blen) + { + if ((ipos % iline) == 0) + { + if ((current_filter = buf[bpos++]) > 4) + return (ERR_DATA_FILTER); + } + ibuf[ipos] = mipng_defilter[current_filter](buf, bpos, + ipos%iline>3?ibuf[ipos-UNIQ_BPP]:0, + (ipos>=iline)?ibuf[ipos-iline]:0, + (ipos>=iline && ipos%iline>3)?ibuf[ipos-iline-UNIQ_BPP]:0); + ipos ++; + bpos ++; + if (pi->depth == 16) + bpos ++; + if (ipos % 4 == 3 && pi->color == 2) // no alpha + img->buffer[ipos++] = 0xFF; + } + if (ipos != ilen || bpos != blen) + { + // printf("fill err ipos %d vs %d, bpos %d vs %d\n", ipos, ilen, bpos, blen); + return (ERR_DATA_MISMATCH); + } + ipos = 0; + while (ipos < ilen) + { + tmp = ibuf[ipos]; + ibuf[ipos] = ibuf[ipos+2]; + ibuf[ipos+2] = tmp; + ibuf[ipos+3] = 0xFF - ibuf[ipos+3]; + ipos += UNIQ_BPP; + } + return (0); +} + + +int mipng_data(mlx_img_list_t *img, unsigned char *dat, png_info_t *pi) +{ + unsigned int len; + int b_pos; + unsigned char *buffer; + int ret; + int z_ret; + unsigned z_have; + z_stream z_strm; + unsigned char z_out[Z_CHUNK]; + + b_pos = 0; + if (!(buffer = malloc((long long)img->width*(long long)img->height*(long long)pi->bpp + img->height))) + err(1, "Can't malloc"); + z_strm.zalloc = Z_NULL; + z_strm.zfree = Z_NULL; + z_strm.opaque = Z_NULL; + z_strm.avail_in = 0; + z_strm.next_in = Z_NULL; + z_ret = inflateInit(&z_strm); + if (z_ret != Z_OK) + return (ERR_ZLIB); + + while (mipng_is_type(dat, "IDAT")) + { + len = *((unsigned int *)dat); + len = ntohl(len); + z_strm.avail_in = len; + z_strm.next_in = dat + 8; + z_strm.avail_out = 0; + while (z_strm.avail_out == 0) + { + z_strm.avail_out = Z_CHUNK; + z_strm.next_out = z_out; + z_ret = inflate(&z_strm, Z_NO_FLUSH); + // printf("inflate ret %d avail_out %d\n", z_ret, z_strm.avail_out); + if (z_ret != Z_OK && z_ret != Z_STREAM_END) + { + inflateEnd(&z_strm); + return (ERR_ZLIB); + } + if (b_pos + Z_CHUNK - z_strm.avail_out > img->width*img->height*pi->bpp+img->height) + { + inflateEnd(&z_strm); + return (ERR_DATA_MISMATCH); + } + bcopy(z_out, buffer+b_pos, Z_CHUNK - z_strm.avail_out); + b_pos += Z_CHUNK - z_strm.avail_out; + } + dat += len + 4 + 4 + 4; + } + inflateEnd(&z_strm); + if (b_pos != img->width*img->height*pi->bpp+img->height) + { + // printf("pb : bpos %d vs expected %d\n", b_pos, img->width*img->height*pi->bpp+img->height); + return (ERR_DATA_MISMATCH); + } + if ((ret = mipng_fill_img(img, buffer, pi))) + return (ret); + return (0); +} + + + +int mipng_magic(unsigned char *ptr, int size) +{ + int i; + + if (size < PNG_MAGIC_SIZE) + return (ERR_MAGIC_SIZE); + i = 0; + while (i < PNG_MAGIC_SIZE) + if (*(ptr++) != magic[i++]) + return (ERR_MAGIC_WRONG); + return (0); +} + + +unsigned long crc_table[256] = { 0, 0x77073096, 0xee0e612c, 0x990951ba, 0x76dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0xedb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x9b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x1db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x6b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0xf00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x86d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x3b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x4db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0xd6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0xa00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x26d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x5005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0xcb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0xbdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; + +// From http://www.w3.org/TR/PNG/#D-CRCAppendix +int mipng_crc(unsigned char *ptr, int len) +{ + unsigned int file_crc; + unsigned long crc; + int i; + + file_crc = *((unsigned int *)(ptr+4+4+len)); + file_crc = ntohl(file_crc); + + crc = 0xffffffffL; + i = 0; + while (i < len+4) + crc = crc_table[(crc ^ ptr[(i++)+4]) & 0xff] ^ (crc >> 8); + crc ^= 0xffffffffL; + + if (file_crc != crc) + return (1); + return (0); +} + + +int mipng_structure(unsigned char *ptr, int size, unsigned char **hdr, unsigned char **dat) +{ + unsigned int len; + int dat_state; + int end; + + dat_state = 0; + *hdr = NULL; + *dat = NULL; + end = 0; + while (size) + { + if (size >= 4) // length present + { + len = *((unsigned int *)ptr); + len = ntohl(len); + if (size < 4 + 4 + 4 + len) + return (ERR_STRUCT_INCOMPLETE); + if (mipng_crc(ptr, len)) + return (ERR_STRUCT_CRC); + // printf("found chunk len %d type %c%c%c%c\n", len, *(ptr+4), *(ptr+5), *(ptr+6), *(ptr+7)); + if (mipng_is_type(ptr, "IHDR")) + { + if (*hdr || len != PNG_HDR_SIZE) + return (ERR_STRUCT_HDR); + *hdr = ptr; + } + if (mipng_is_type(ptr, "IEND")) + { + if (len != 0 || size != 4+4+4) + return (ERR_STRUCT_END); + end = 1; + } + if (mipng_is_type(ptr, "IDAT")) + { + if (dat_state == 0) + { + dat_state = 1; + *dat = ptr; + } + if (dat_state == 2) + return (ERR_STRUCT_DAT); + } + else + if (dat_state == 1) + dat_state = 2; + size -= 4+4+4+len; + ptr += 4+4+4+len; + } + else + return (ERR_STRUCT_INCOMPLETE); + } + if (*hdr == 0 || *dat == 0 || end == 0) + return (ERR_STRUCT_MISSCHK); + return (0); +} + + +int mipng_verif_hdr(unsigned char *hdr, png_info_t *pi) +{ + unsigned int compress; + unsigned int filter; + + hdr += 8; + pi->width = ntohl(*((unsigned long *)hdr)); + pi->height = ntohl(*((unsigned long *)(hdr+4))); + pi->depth = *(hdr+8); + pi->color = *(hdr+9); + compress = *(hdr+10); + filter = *(hdr+11); + pi->interlace = *(hdr+12); + if (pi->width <= 0 || pi->height <= 0 || (pi->depth != 8 && pi->depth != 16) + || (pi->color != 2 && pi->color != 6) || compress != 0 || filter != 0 || pi->interlace != 0) + return (ERR_STRUCT_INCIMPL); + pi->bpp = pi->depth / 8; + if (pi->color == 2) + pi->bpp *= 3; + if (pi->color == 6) + pi->bpp *= 4; + // printf("hdr info : %d x %d, depth %d, col type %d, comp %d, filter %d, interlace %d\nbpp is %d\n", + // pi->width, pi->height, pi->depth, pi->color, compress, filter, pi->interlace, pi->bpp); + return (0); +} + + +mlx_img_list_t *mlx_int_parse_png(mlx_ptr_t *xvar, unsigned char *fptr, int size) +{ + int err; + unsigned char *hdr; + unsigned char *dat; + png_info_t pi; + mlx_img_list_t *img; + + if ((err = mipng_magic(fptr, size))) + { + warnx("mlx PNG error : %s", mipng_err[err]); + return ((mlx_img_list_t *)0); + } + fptr += PNG_MAGIC_SIZE; + size -= PNG_MAGIC_SIZE; + if ((err = mipng_structure(fptr, size, &hdr, &dat))) + { + warnx("mlx PNG error : %s", mipng_err[err]); + return ((mlx_img_list_t *)0); + } + if ((err = mipng_verif_hdr(hdr, &pi))) + { + warnx("mlx PNG error : %s", mipng_err[err]); + return ((mlx_img_list_t *)0); + } + if (!(img = mlx_new_image(xvar, pi.width, pi.height))) + { + warnx("mlx PNG error : Can't create mlx image"); + return ((mlx_img_list_t *)0); + } + if ((err = mipng_data(img, dat, &pi))) + { + mlx_destroy_image(xvar, img); + warnx("mlx PNG error : %s", mipng_err[err]); + return ((mlx_img_list_t *)0); + } + return (img); +} + + + + +void *mlx_png_file_to_image(mlx_ptr_t *xvar, char *file, int *width, int *height) +{ + int fd; + int size; + unsigned char *ptr; + mlx_img_list_t *img; + + if ((fd = open(file, O_RDONLY)) == -1 || (size = lseek(fd, 0, SEEK_END)) == -1 || + (ptr = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0)) == (void *)MAP_FAILED) + { + if (fd >= 0) + close(fd); + warnx("Can't map png file '%s'", file); + return ((void *)0); + } + if ((img = mlx_int_parse_png(xvar, ptr, size))) + { + *width = img->width; + *height = img->height; + } + else + { + *width = 0; + *height = 0; + } + munmap(ptr,size); + close(fd); + return (img); +} diff --git a/libs/minilibx_opengl_20191021/mlx_png.h b/libs/minilibx_opengl_20191021/mlx_png.h new file mode 100644 index 0000000..83ef145 --- /dev/null +++ b/libs/minilibx_opengl_20191021/mlx_png.h @@ -0,0 +1,4 @@ + + + +void *mlx_png_file_to_image(void *xvar, char *file, int *width, int *height); diff --git a/libs/minilibx_opengl_20191021/mlx_rgb.c b/libs/minilibx_opengl_20191021/mlx_rgb.c new file mode 100644 index 0000000..3f98717 --- /dev/null +++ b/libs/minilibx_opengl_20191021/mlx_rgb.c @@ -0,0 +1,763 @@ +/* +** This is a generated file with rgb2c.pl and rgb.txt from +** the XFree86 distribution. +*/ + + +struct s_col_name mlx_col_name[] = +{ + { "snow" , 0xfffafa }, + { "ghost white" , 0xf8f8ff }, + { "ghostwhite" , 0xf8f8ff }, + { "white smoke" , 0xf5f5f5 }, + { "whitesmoke" , 0xf5f5f5 }, + { "gainsboro" , 0xdcdcdc }, + { "floral white" , 0xfffaf0 }, + { "floralwhite" , 0xfffaf0 }, + { "old lace" , 0xfdf5e6 }, + { "oldlace" , 0xfdf5e6 }, + { "linen" , 0xfaf0e6 }, + { "antique white" , 0xfaebd7 }, + { "antiquewhite" , 0xfaebd7 }, + { "papaya whip" , 0xffefd5 }, + { "papayawhip" , 0xffefd5 }, + { "blanched almond" , 0xffebcd }, + { "blanchedalmond" , 0xffebcd }, + { "bisque" , 0xffe4c4 }, + { "peach puff" , 0xffdab9 }, + { "peachpuff" , 0xffdab9 }, + { "navajo white" , 0xffdead }, + { "navajowhite" , 0xffdead }, + { "moccasin" , 0xffe4b5 }, + { "cornsilk" , 0xfff8dc }, + { "ivory" , 0xfffff0 }, + { "lemon chiffon" , 0xfffacd }, + { "lemonchiffon" , 0xfffacd }, + { "seashell" , 0xfff5ee }, + { "honeydew" , 0xf0fff0 }, + { "mint cream" , 0xf5fffa }, + { "mintcream" , 0xf5fffa }, + { "azure" , 0xf0ffff }, + { "alice blue" , 0xf0f8ff }, + { "aliceblue" , 0xf0f8ff }, + { "lavender" , 0xe6e6fa }, + { "lavender blush" , 0xfff0f5 }, + { "lavenderblush" , 0xfff0f5 }, + { "misty rose" , 0xffe4e1 }, + { "mistyrose" , 0xffe4e1 }, + { "white" , 0xffffff }, + { "black" , 0x0 }, + { "dark slate" , 0x2f4f4f }, + { "darkslategray" , 0x2f4f4f }, + { "dark slate" , 0x2f4f4f }, + { "darkslategrey" , 0x2f4f4f }, + { "dim gray" , 0x696969 }, + { "dimgray" , 0x696969 }, + { "dim grey" , 0x696969 }, + { "dimgrey" , 0x696969 }, + { "slate gray" , 0x708090 }, + { "slategray" , 0x708090 }, + { "slate grey" , 0x708090 }, + { "slategrey" , 0x708090 }, + { "light slate" , 0x778899 }, + { "lightslategray" , 0x778899 }, + { "light slate" , 0x778899 }, + { "lightslategrey" , 0x778899 }, + { "gray" , 0xbebebe }, + { "grey" , 0xbebebe }, + { "light grey" , 0xd3d3d3 }, + { "lightgrey" , 0xd3d3d3 }, + { "light gray" , 0xd3d3d3 }, + { "lightgray" , 0xd3d3d3 }, + { "midnight blue" , 0x191970 }, + { "midnightblue" , 0x191970 }, + { "navy" , 0x80 }, + { "navy blue" , 0x80 }, + { "navyblue" , 0x80 }, + { "cornflower blue" , 0x6495ed }, + { "cornflowerblue" , 0x6495ed }, + { "dark slate" , 0x483d8b }, + { "darkslateblue" , 0x483d8b }, + { "slate blue" , 0x6a5acd }, + { "slateblue" , 0x6a5acd }, + { "medium slate" , 0x7b68ee }, + { "mediumslateblue" , 0x7b68ee }, + { "light slate" , 0x8470ff }, + { "lightslateblue" , 0x8470ff }, + { "medium blue" , 0xcd }, + { "mediumblue" , 0xcd }, + { "royal blue" , 0x4169e1 }, + { "royalblue" , 0x4169e1 }, + { "blue" , 0xff }, + { "dodger blue" , 0x1e90ff }, + { "dodgerblue" , 0x1e90ff }, + { "deep sky" , 0xbfff }, + { "deepskyblue" , 0xbfff }, + { "sky blue" , 0x87ceeb }, + { "skyblue" , 0x87ceeb }, + { "light sky" , 0x87cefa }, + { "lightskyblue" , 0x87cefa }, + { "steel blue" , 0x4682b4 }, + { "steelblue" , 0x4682b4 }, + { "light steel" , 0xb0c4de }, + { "lightsteelblue" , 0xb0c4de }, + { "light blue" , 0xadd8e6 }, + { "lightblue" , 0xadd8e6 }, + { "powder blue" , 0xb0e0e6 }, + { "powderblue" , 0xb0e0e6 }, + { "pale turquoise" , 0xafeeee }, + { "paleturquoise" , 0xafeeee }, + { "dark turquoise" , 0xced1 }, + { "darkturquoise" , 0xced1 }, + { "medium turquoise" , 0x48d1cc }, + { "mediumturquoise" , 0x48d1cc }, + { "turquoise" , 0x40e0d0 }, + { "cyan" , 0xffff }, + { "light cyan" , 0xe0ffff }, + { "lightcyan" , 0xe0ffff }, + { "cadet blue" , 0x5f9ea0 }, + { "cadetblue" , 0x5f9ea0 }, + { "medium aquamarine" , 0x66cdaa }, + { "mediumaquamarine" , 0x66cdaa }, + { "aquamarine" , 0x7fffd4 }, + { "dark green" , 0x6400 }, + { "darkgreen" , 0x6400 }, + { "dark olive" , 0x556b2f }, + { "darkolivegreen" , 0x556b2f }, + { "dark sea" , 0x8fbc8f }, + { "darkseagreen" , 0x8fbc8f }, + { "sea green" , 0x2e8b57 }, + { "seagreen" , 0x2e8b57 }, + { "medium sea" , 0x3cb371 }, + { "mediumseagreen" , 0x3cb371 }, + { "light sea" , 0x20b2aa }, + { "lightseagreen" , 0x20b2aa }, + { "pale green" , 0x98fb98 }, + { "palegreen" , 0x98fb98 }, + { "spring green" , 0xff7f }, + { "springgreen" , 0xff7f }, + { "lawn green" , 0x7cfc00 }, + { "lawngreen" , 0x7cfc00 }, + { "green" , 0xff00 }, + { "chartreuse" , 0x7fff00 }, + { "medium spring" , 0xfa9a }, + { "mediumspringgreen" , 0xfa9a }, + { "green yellow" , 0xadff2f }, + { "greenyellow" , 0xadff2f }, + { "lime green" , 0x32cd32 }, + { "limegreen" , 0x32cd32 }, + { "yellow green" , 0x9acd32 }, + { "yellowgreen" , 0x9acd32 }, + { "forest green" , 0x228b22 }, + { "forestgreen" , 0x228b22 }, + { "olive drab" , 0x6b8e23 }, + { "olivedrab" , 0x6b8e23 }, + { "dark khaki" , 0xbdb76b }, + { "darkkhaki" , 0xbdb76b }, + { "khaki" , 0xf0e68c }, + { "pale goldenrod" , 0xeee8aa }, + { "palegoldenrod" , 0xeee8aa }, + { "light goldenrod" , 0xfafad2 }, + { "lightgoldenrodyellow" , 0xfafad2 }, + { "light yellow" , 0xffffe0 }, + { "lightyellow" , 0xffffe0 }, + { "yellow" , 0xffff00 }, + { "gold" , 0xffd700 }, + { "light goldenrod" , 0xeedd82 }, + { "lightgoldenrod" , 0xeedd82 }, + { "goldenrod" , 0xdaa520 }, + { "dark goldenrod" , 0xb8860b }, + { "darkgoldenrod" , 0xb8860b }, + { "rosy brown" , 0xbc8f8f }, + { "rosybrown" , 0xbc8f8f }, + { "indian red" , 0xcd5c5c }, + { "indianred" , 0xcd5c5c }, + { "saddle brown" , 0x8b4513 }, + { "saddlebrown" , 0x8b4513 }, + { "sienna" , 0xa0522d }, + { "peru" , 0xcd853f }, + { "burlywood" , 0xdeb887 }, + { "beige" , 0xf5f5dc }, + { "wheat" , 0xf5deb3 }, + { "sandy brown" , 0xf4a460 }, + { "sandybrown" , 0xf4a460 }, + { "tan" , 0xd2b48c }, + { "chocolate" , 0xd2691e }, + { "firebrick" , 0xb22222 }, + { "brown" , 0xa52a2a }, + { "dark salmon" , 0xe9967a }, + { "darksalmon" , 0xe9967a }, + { "salmon" , 0xfa8072 }, + { "light salmon" , 0xffa07a }, + { "lightsalmon" , 0xffa07a }, + { "orange" , 0xffa500 }, + { "dark orange" , 0xff8c00 }, + { "darkorange" , 0xff8c00 }, + { "coral" , 0xff7f50 }, + { "light coral" , 0xf08080 }, + { "lightcoral" , 0xf08080 }, + { "tomato" , 0xff6347 }, + { "orange red" , 0xff4500 }, + { "orangered" , 0xff4500 }, + { "red" , 0xff0000 }, + { "hot pink" , 0xff69b4 }, + { "hotpink" , 0xff69b4 }, + { "deep pink" , 0xff1493 }, + { "deeppink" , 0xff1493 }, + { "pink" , 0xffc0cb }, + { "light pink" , 0xffb6c1 }, + { "lightpink" , 0xffb6c1 }, + { "pale violet" , 0xdb7093 }, + { "palevioletred" , 0xdb7093 }, + { "maroon" , 0xb03060 }, + { "medium violet" , 0xc71585 }, + { "mediumvioletred" , 0xc71585 }, + { "violet red" , 0xd02090 }, + { "violetred" , 0xd02090 }, + { "magenta" , 0xff00ff }, + { "violet" , 0xee82ee }, + { "plum" , 0xdda0dd }, + { "orchid" , 0xda70d6 }, + { "medium orchid" , 0xba55d3 }, + { "mediumorchid" , 0xba55d3 }, + { "dark orchid" , 0x9932cc }, + { "darkorchid" , 0x9932cc }, + { "dark violet" , 0x9400d3 }, + { "darkviolet" , 0x9400d3 }, + { "blue violet" , 0x8a2be2 }, + { "blueviolet" , 0x8a2be2 }, + { "purple" , 0xa020f0 }, + { "medium purple" , 0x9370db }, + { "mediumpurple" , 0x9370db }, + { "thistle" , 0xd8bfd8 }, + { "snow1" , 0xfffafa }, + { "snow2" , 0xeee9e9 }, + { "snow3" , 0xcdc9c9 }, + { "snow4" , 0x8b8989 }, + { "seashell1" , 0xfff5ee }, + { "seashell2" , 0xeee5de }, + { "seashell3" , 0xcdc5bf }, + { "seashell4" , 0x8b8682 }, + { "antiquewhite1" , 0xffefdb }, + { "antiquewhite2" , 0xeedfcc }, + { "antiquewhite3" , 0xcdc0b0 }, + { "antiquewhite4" , 0x8b8378 }, + { "bisque1" , 0xffe4c4 }, + { "bisque2" , 0xeed5b7 }, + { "bisque3" , 0xcdb79e }, + { "bisque4" , 0x8b7d6b }, + { "peachpuff1" , 0xffdab9 }, + { "peachpuff2" , 0xeecbad }, + { "peachpuff3" , 0xcdaf95 }, + { "peachpuff4" , 0x8b7765 }, + { "navajowhite1" , 0xffdead }, + { "navajowhite2" , 0xeecfa1 }, + { "navajowhite3" , 0xcdb38b }, + { "navajowhite4" , 0x8b795e }, + { "lemonchiffon1" , 0xfffacd }, + { "lemonchiffon2" , 0xeee9bf }, + { "lemonchiffon3" , 0xcdc9a5 }, + { "lemonchiffon4" , 0x8b8970 }, + { "cornsilk1" , 0xfff8dc }, + { "cornsilk2" , 0xeee8cd }, + { "cornsilk3" , 0xcdc8b1 }, + { "cornsilk4" , 0x8b8878 }, + { "ivory1" , 0xfffff0 }, + { "ivory2" , 0xeeeee0 }, + { "ivory3" , 0xcdcdc1 }, + { "ivory4" , 0x8b8b83 }, + { "honeydew1" , 0xf0fff0 }, + { "honeydew2" , 0xe0eee0 }, + { "honeydew3" , 0xc1cdc1 }, + { "honeydew4" , 0x838b83 }, + { "lavenderblush1" , 0xfff0f5 }, + { "lavenderblush2" , 0xeee0e5 }, + { "lavenderblush3" , 0xcdc1c5 }, + { "lavenderblush4" , 0x8b8386 }, + { "mistyrose1" , 0xffe4e1 }, + { "mistyrose2" , 0xeed5d2 }, + { "mistyrose3" , 0xcdb7b5 }, + { "mistyrose4" , 0x8b7d7b }, + { "azure1" , 0xf0ffff }, + { "azure2" , 0xe0eeee }, + { "azure3" , 0xc1cdcd }, + { "azure4" , 0x838b8b }, + { "slateblue1" , 0x836fff }, + { "slateblue2" , 0x7a67ee }, + { "slateblue3" , 0x6959cd }, + { "slateblue4" , 0x473c8b }, + { "royalblue1" , 0x4876ff }, + { "royalblue2" , 0x436eee }, + { "royalblue3" , 0x3a5fcd }, + { "royalblue4" , 0x27408b }, + { "blue1" , 0xff }, + { "blue2" , 0xee }, + { "blue3" , 0xcd }, + { "blue4" , 0x8b }, + { "dodgerblue1" , 0x1e90ff }, + { "dodgerblue2" , 0x1c86ee }, + { "dodgerblue3" , 0x1874cd }, + { "dodgerblue4" , 0x104e8b }, + { "steelblue1" , 0x63b8ff }, + { "steelblue2" , 0x5cacee }, + { "steelblue3" , 0x4f94cd }, + { "steelblue4" , 0x36648b }, + { "deepskyblue1" , 0xbfff }, + { "deepskyblue2" , 0xb2ee }, + { "deepskyblue3" , 0x9acd }, + { "deepskyblue4" , 0x688b }, + { "skyblue1" , 0x87ceff }, + { "skyblue2" , 0x7ec0ee }, + { "skyblue3" , 0x6ca6cd }, + { "skyblue4" , 0x4a708b }, + { "lightskyblue1" , 0xb0e2ff }, + { "lightskyblue2" , 0xa4d3ee }, + { "lightskyblue3" , 0x8db6cd }, + { "lightskyblue4" , 0x607b8b }, + { "slategray1" , 0xc6e2ff }, + { "slategray2" , 0xb9d3ee }, + { "slategray3" , 0x9fb6cd }, + { "slategray4" , 0x6c7b8b }, + { "lightsteelblue1" , 0xcae1ff }, + { "lightsteelblue2" , 0xbcd2ee }, + { "lightsteelblue3" , 0xa2b5cd }, + { "lightsteelblue4" , 0x6e7b8b }, + { "lightblue1" , 0xbfefff }, + { "lightblue2" , 0xb2dfee }, + { "lightblue3" , 0x9ac0cd }, + { "lightblue4" , 0x68838b }, + { "lightcyan1" , 0xe0ffff }, + { "lightcyan2" , 0xd1eeee }, + { "lightcyan3" , 0xb4cdcd }, + { "lightcyan4" , 0x7a8b8b }, + { "paleturquoise1" , 0xbbffff }, + { "paleturquoise2" , 0xaeeeee }, + { "paleturquoise3" , 0x96cdcd }, + { "paleturquoise4" , 0x668b8b }, + { "cadetblue1" , 0x98f5ff }, + { "cadetblue2" , 0x8ee5ee }, + { "cadetblue3" , 0x7ac5cd }, + { "cadetblue4" , 0x53868b }, + { "turquoise1" , 0xf5ff }, + { "turquoise2" , 0xe5ee }, + { "turquoise3" , 0xc5cd }, + { "turquoise4" , 0x868b }, + { "cyan1" , 0xffff }, + { "cyan2" , 0xeeee }, + { "cyan3" , 0xcdcd }, + { "cyan4" , 0x8b8b }, + { "darkslategray1" , 0x97ffff }, + { "darkslategray2" , 0x8deeee }, + { "darkslategray3" , 0x79cdcd }, + { "darkslategray4" , 0x528b8b }, + { "aquamarine1" , 0x7fffd4 }, + { "aquamarine2" , 0x76eec6 }, + { "aquamarine3" , 0x66cdaa }, + { "aquamarine4" , 0x458b74 }, + { "darkseagreen1" , 0xc1ffc1 }, + { "darkseagreen2" , 0xb4eeb4 }, + { "darkseagreen3" , 0x9bcd9b }, + { "darkseagreen4" , 0x698b69 }, + { "seagreen1" , 0x54ff9f }, + { "seagreen2" , 0x4eee94 }, + { "seagreen3" , 0x43cd80 }, + { "seagreen4" , 0x2e8b57 }, + { "palegreen1" , 0x9aff9a }, + { "palegreen2" , 0x90ee90 }, + { "palegreen3" , 0x7ccd7c }, + { "palegreen4" , 0x548b54 }, + { "springgreen1" , 0xff7f }, + { "springgreen2" , 0xee76 }, + { "springgreen3" , 0xcd66 }, + { "springgreen4" , 0x8b45 }, + { "green1" , 0xff00 }, + { "green2" , 0xee00 }, + { "green3" , 0xcd00 }, + { "green4" , 0x8b00 }, + { "chartreuse1" , 0x7fff00 }, + { "chartreuse2" , 0x76ee00 }, + { "chartreuse3" , 0x66cd00 }, + { "chartreuse4" , 0x458b00 }, + { "olivedrab1" , 0xc0ff3e }, + { "olivedrab2" , 0xb3ee3a }, + { "olivedrab3" , 0x9acd32 }, + { "olivedrab4" , 0x698b22 }, + { "darkolivegreen1" , 0xcaff70 }, + { "darkolivegreen2" , 0xbcee68 }, + { "darkolivegreen3" , 0xa2cd5a }, + { "darkolivegreen4" , 0x6e8b3d }, + { "khaki1" , 0xfff68f }, + { "khaki2" , 0xeee685 }, + { "khaki3" , 0xcdc673 }, + { "khaki4" , 0x8b864e }, + { "lightgoldenrod1" , 0xffec8b }, + { "lightgoldenrod2" , 0xeedc82 }, + { "lightgoldenrod3" , 0xcdbe70 }, + { "lightgoldenrod4" , 0x8b814c }, + { "lightyellow1" , 0xffffe0 }, + { "lightyellow2" , 0xeeeed1 }, + { "lightyellow3" , 0xcdcdb4 }, + { "lightyellow4" , 0x8b8b7a }, + { "yellow1" , 0xffff00 }, + { "yellow2" , 0xeeee00 }, + { "yellow3" , 0xcdcd00 }, + { "yellow4" , 0x8b8b00 }, + { "gold1" , 0xffd700 }, + { "gold2" , 0xeec900 }, + { "gold3" , 0xcdad00 }, + { "gold4" , 0x8b7500 }, + { "goldenrod1" , 0xffc125 }, + { "goldenrod2" , 0xeeb422 }, + { "goldenrod3" , 0xcd9b1d }, + { "goldenrod4" , 0x8b6914 }, + { "darkgoldenrod1" , 0xffb90f }, + { "darkgoldenrod2" , 0xeead0e }, + { "darkgoldenrod3" , 0xcd950c }, + { "darkgoldenrod4" , 0x8b6508 }, + { "rosybrown1" , 0xffc1c1 }, + { "rosybrown2" , 0xeeb4b4 }, + { "rosybrown3" , 0xcd9b9b }, + { "rosybrown4" , 0x8b6969 }, + { "indianred1" , 0xff6a6a }, + { "indianred2" , 0xee6363 }, + { "indianred3" , 0xcd5555 }, + { "indianred4" , 0x8b3a3a }, + { "sienna1" , 0xff8247 }, + { "sienna2" , 0xee7942 }, + { "sienna3" , 0xcd6839 }, + { "sienna4" , 0x8b4726 }, + { "burlywood1" , 0xffd39b }, + { "burlywood2" , 0xeec591 }, + { "burlywood3" , 0xcdaa7d }, + { "burlywood4" , 0x8b7355 }, + { "wheat1" , 0xffe7ba }, + { "wheat2" , 0xeed8ae }, + { "wheat3" , 0xcdba96 }, + { "wheat4" , 0x8b7e66 }, + { "tan1" , 0xffa54f }, + { "tan2" , 0xee9a49 }, + { "tan3" , 0xcd853f }, + { "tan4" , 0x8b5a2b }, + { "chocolate1" , 0xff7f24 }, + { "chocolate2" , 0xee7621 }, + { "chocolate3" , 0xcd661d }, + { "chocolate4" , 0x8b4513 }, + { "firebrick1" , 0xff3030 }, + { "firebrick2" , 0xee2c2c }, + { "firebrick3" , 0xcd2626 }, + { "firebrick4" , 0x8b1a1a }, + { "brown1" , 0xff4040 }, + { "brown2" , 0xee3b3b }, + { "brown3" , 0xcd3333 }, + { "brown4" , 0x8b2323 }, + { "salmon1" , 0xff8c69 }, + { "salmon2" , 0xee8262 }, + { "salmon3" , 0xcd7054 }, + { "salmon4" , 0x8b4c39 }, + { "lightsalmon1" , 0xffa07a }, + { "lightsalmon2" , 0xee9572 }, + { "lightsalmon3" , 0xcd8162 }, + { "lightsalmon4" , 0x8b5742 }, + { "orange1" , 0xffa500 }, + { "orange2" , 0xee9a00 }, + { "orange3" , 0xcd8500 }, + { "orange4" , 0x8b5a00 }, + { "darkorange1" , 0xff7f00 }, + { "darkorange2" , 0xee7600 }, + { "darkorange3" , 0xcd6600 }, + { "darkorange4" , 0x8b4500 }, + { "coral1" , 0xff7256 }, + { "coral2" , 0xee6a50 }, + { "coral3" , 0xcd5b45 }, + { "coral4" , 0x8b3e2f }, + { "tomato1" , 0xff6347 }, + { "tomato2" , 0xee5c42 }, + { "tomato3" , 0xcd4f39 }, + { "tomato4" , 0x8b3626 }, + { "orangered1" , 0xff4500 }, + { "orangered2" , 0xee4000 }, + { "orangered3" , 0xcd3700 }, + { "orangered4" , 0x8b2500 }, + { "red1" , 0xff0000 }, + { "red2" , 0xee0000 }, + { "red3" , 0xcd0000 }, + { "red4" , 0x8b0000 }, + { "deeppink1" , 0xff1493 }, + { "deeppink2" , 0xee1289 }, + { "deeppink3" , 0xcd1076 }, + { "deeppink4" , 0x8b0a50 }, + { "hotpink1" , 0xff6eb4 }, + { "hotpink2" , 0xee6aa7 }, + { "hotpink3" , 0xcd6090 }, + { "hotpink4" , 0x8b3a62 }, + { "pink1" , 0xffb5c5 }, + { "pink2" , 0xeea9b8 }, + { "pink3" , 0xcd919e }, + { "pink4" , 0x8b636c }, + { "lightpink1" , 0xffaeb9 }, + { "lightpink2" , 0xeea2ad }, + { "lightpink3" , 0xcd8c95 }, + { "lightpink4" , 0x8b5f65 }, + { "palevioletred1" , 0xff82ab }, + { "palevioletred2" , 0xee799f }, + { "palevioletred3" , 0xcd6889 }, + { "palevioletred4" , 0x8b475d }, + { "maroon1" , 0xff34b3 }, + { "maroon2" , 0xee30a7 }, + { "maroon3" , 0xcd2990 }, + { "maroon4" , 0x8b1c62 }, + { "violetred1" , 0xff3e96 }, + { "violetred2" , 0xee3a8c }, + { "violetred3" , 0xcd3278 }, + { "violetred4" , 0x8b2252 }, + { "magenta1" , 0xff00ff }, + { "magenta2" , 0xee00ee }, + { "magenta3" , 0xcd00cd }, + { "magenta4" , 0x8b008b }, + { "orchid1" , 0xff83fa }, + { "orchid2" , 0xee7ae9 }, + { "orchid3" , 0xcd69c9 }, + { "orchid4" , 0x8b4789 }, + { "plum1" , 0xffbbff }, + { "plum2" , 0xeeaeee }, + { "plum3" , 0xcd96cd }, + { "plum4" , 0x8b668b }, + { "mediumorchid1" , 0xe066ff }, + { "mediumorchid2" , 0xd15fee }, + { "mediumorchid3" , 0xb452cd }, + { "mediumorchid4" , 0x7a378b }, + { "darkorchid1" , 0xbf3eff }, + { "darkorchid2" , 0xb23aee }, + { "darkorchid3" , 0x9a32cd }, + { "darkorchid4" , 0x68228b }, + { "purple1" , 0x9b30ff }, + { "purple2" , 0x912cee }, + { "purple3" , 0x7d26cd }, + { "purple4" , 0x551a8b }, + { "mediumpurple1" , 0xab82ff }, + { "mediumpurple2" , 0x9f79ee }, + { "mediumpurple3" , 0x8968cd }, + { "mediumpurple4" , 0x5d478b }, + { "thistle1" , 0xffe1ff }, + { "thistle2" , 0xeed2ee }, + { "thistle3" , 0xcdb5cd }, + { "thistle4" , 0x8b7b8b }, + { "gray0" , 0x0 }, + { "grey0" , 0x0 }, + { "gray1" , 0x30303 }, + { "grey1" , 0x30303 }, + { "gray2" , 0x50505 }, + { "grey2" , 0x50505 }, + { "gray3" , 0x80808 }, + { "grey3" , 0x80808 }, + { "gray4" , 0xa0a0a }, + { "grey4" , 0xa0a0a }, + { "gray5" , 0xd0d0d }, + { "grey5" , 0xd0d0d }, + { "gray6" , 0xf0f0f }, + { "grey6" , 0xf0f0f }, + { "gray7" , 0x121212 }, + { "grey7" , 0x121212 }, + { "gray8" , 0x141414 }, + { "grey8" , 0x141414 }, + { "gray9" , 0x171717 }, + { "grey9" , 0x171717 }, + { "gray10" , 0x1a1a1a }, + { "grey10" , 0x1a1a1a }, + { "gray11" , 0x1c1c1c }, + { "grey11" , 0x1c1c1c }, + { "gray12" , 0x1f1f1f }, + { "grey12" , 0x1f1f1f }, + { "gray13" , 0x212121 }, + { "grey13" , 0x212121 }, + { "gray14" , 0x242424 }, + { "grey14" , 0x242424 }, + { "gray15" , 0x262626 }, + { "grey15" , 0x262626 }, + { "gray16" , 0x292929 }, + { "grey16" , 0x292929 }, + { "gray17" , 0x2b2b2b }, + { "grey17" , 0x2b2b2b }, + { "gray18" , 0x2e2e2e }, + { "grey18" , 0x2e2e2e }, + { "gray19" , 0x303030 }, + { "grey19" , 0x303030 }, + { "gray20" , 0x333333 }, + { "grey20" , 0x333333 }, + { "gray21" , 0x363636 }, + { "grey21" , 0x363636 }, + { "gray22" , 0x383838 }, + { "grey22" , 0x383838 }, + { "gray23" , 0x3b3b3b }, + { "grey23" , 0x3b3b3b }, + { "gray24" , 0x3d3d3d }, + { "grey24" , 0x3d3d3d }, + { "gray25" , 0x404040 }, + { "grey25" , 0x404040 }, + { "gray26" , 0x424242 }, + { "grey26" , 0x424242 }, + { "gray27" , 0x454545 }, + { "grey27" , 0x454545 }, + { "gray28" , 0x474747 }, + { "grey28" , 0x474747 }, + { "gray29" , 0x4a4a4a }, + { "grey29" , 0x4a4a4a }, + { "gray30" , 0x4d4d4d }, + { "grey30" , 0x4d4d4d }, + { "gray31" , 0x4f4f4f }, + { "grey31" , 0x4f4f4f }, + { "gray32" , 0x525252 }, + { "grey32" , 0x525252 }, + { "gray33" , 0x545454 }, + { "grey33" , 0x545454 }, + { "gray34" , 0x575757 }, + { "grey34" , 0x575757 }, + { "gray35" , 0x595959 }, + { "grey35" , 0x595959 }, + { "gray36" , 0x5c5c5c }, + { "grey36" , 0x5c5c5c }, + { "gray37" , 0x5e5e5e }, + { "grey37" , 0x5e5e5e }, + { "gray38" , 0x616161 }, + { "grey38" , 0x616161 }, + { "gray39" , 0x636363 }, + { "grey39" , 0x636363 }, + { "gray40" , 0x666666 }, + { "grey40" , 0x666666 }, + { "gray41" , 0x696969 }, + { "grey41" , 0x696969 }, + { "gray42" , 0x6b6b6b }, + { "grey42" , 0x6b6b6b }, + { "gray43" , 0x6e6e6e }, + { "grey43" , 0x6e6e6e }, + { "gray44" , 0x707070 }, + { "grey44" , 0x707070 }, + { "gray45" , 0x737373 }, + { "grey45" , 0x737373 }, + { "gray46" , 0x757575 }, + { "grey46" , 0x757575 }, + { "gray47" , 0x787878 }, + { "grey47" , 0x787878 }, + { "gray48" , 0x7a7a7a }, + { "grey48" , 0x7a7a7a }, + { "gray49" , 0x7d7d7d }, + { "grey49" , 0x7d7d7d }, + { "gray50" , 0x7f7f7f }, + { "grey50" , 0x7f7f7f }, + { "gray51" , 0x828282 }, + { "grey51" , 0x828282 }, + { "gray52" , 0x858585 }, + { "grey52" , 0x858585 }, + { "gray53" , 0x878787 }, + { "grey53" , 0x878787 }, + { "gray54" , 0x8a8a8a }, + { "grey54" , 0x8a8a8a }, + { "gray55" , 0x8c8c8c }, + { "grey55" , 0x8c8c8c }, + { "gray56" , 0x8f8f8f }, + { "grey56" , 0x8f8f8f }, + { "gray57" , 0x919191 }, + { "grey57" , 0x919191 }, + { "gray58" , 0x949494 }, + { "grey58" , 0x949494 }, + { "gray59" , 0x969696 }, + { "grey59" , 0x969696 }, + { "gray60" , 0x999999 }, + { "grey60" , 0x999999 }, + { "gray61" , 0x9c9c9c }, + { "grey61" , 0x9c9c9c }, + { "gray62" , 0x9e9e9e }, + { "grey62" , 0x9e9e9e }, + { "gray63" , 0xa1a1a1 }, + { "grey63" , 0xa1a1a1 }, + { "gray64" , 0xa3a3a3 }, + { "grey64" , 0xa3a3a3 }, + { "gray65" , 0xa6a6a6 }, + { "grey65" , 0xa6a6a6 }, + { "gray66" , 0xa8a8a8 }, + { "grey66" , 0xa8a8a8 }, + { "gray67" , 0xababab }, + { "grey67" , 0xababab }, + { "gray68" , 0xadadad }, + { "grey68" , 0xadadad }, + { "gray69" , 0xb0b0b0 }, + { "grey69" , 0xb0b0b0 }, + { "gray70" , 0xb3b3b3 }, + { "grey70" , 0xb3b3b3 }, + { "gray71" , 0xb5b5b5 }, + { "grey71" , 0xb5b5b5 }, + { "gray72" , 0xb8b8b8 }, + { "grey72" , 0xb8b8b8 }, + { "gray73" , 0xbababa }, + { "grey73" , 0xbababa }, + { "gray74" , 0xbdbdbd }, + { "grey74" , 0xbdbdbd }, + { "gray75" , 0xbfbfbf }, + { "grey75" , 0xbfbfbf }, + { "gray76" , 0xc2c2c2 }, + { "grey76" , 0xc2c2c2 }, + { "gray77" , 0xc4c4c4 }, + { "grey77" , 0xc4c4c4 }, + { "gray78" , 0xc7c7c7 }, + { "grey78" , 0xc7c7c7 }, + { "gray79" , 0xc9c9c9 }, + { "grey79" , 0xc9c9c9 }, + { "gray80" , 0xcccccc }, + { "grey80" , 0xcccccc }, + { "gray81" , 0xcfcfcf }, + { "grey81" , 0xcfcfcf }, + { "gray82" , 0xd1d1d1 }, + { "grey82" , 0xd1d1d1 }, + { "gray83" , 0xd4d4d4 }, + { "grey83" , 0xd4d4d4 }, + { "gray84" , 0xd6d6d6 }, + { "grey84" , 0xd6d6d6 }, + { "gray85" , 0xd9d9d9 }, + { "grey85" , 0xd9d9d9 }, + { "gray86" , 0xdbdbdb }, + { "grey86" , 0xdbdbdb }, + { "gray87" , 0xdedede }, + { "grey87" , 0xdedede }, + { "gray88" , 0xe0e0e0 }, + { "grey88" , 0xe0e0e0 }, + { "gray89" , 0xe3e3e3 }, + { "grey89" , 0xe3e3e3 }, + { "gray90" , 0xe5e5e5 }, + { "grey90" , 0xe5e5e5 }, + { "gray91" , 0xe8e8e8 }, + { "grey91" , 0xe8e8e8 }, + { "gray92" , 0xebebeb }, + { "grey92" , 0xebebeb }, + { "gray93" , 0xededed }, + { "grey93" , 0xededed }, + { "gray94" , 0xf0f0f0 }, + { "grey94" , 0xf0f0f0 }, + { "gray95" , 0xf2f2f2 }, + { "grey95" , 0xf2f2f2 }, + { "gray96" , 0xf5f5f5 }, + { "grey96" , 0xf5f5f5 }, + { "gray97" , 0xf7f7f7 }, + { "grey97" , 0xf7f7f7 }, + { "gray98" , 0xfafafa }, + { "grey98" , 0xfafafa }, + { "gray99" , 0xfcfcfc }, + { "grey99" , 0xfcfcfc }, + { "gray100" , 0xffffff }, + { "grey100" , 0xffffff }, + { "dark grey" , 0xa9a9a9 }, + { "darkgrey" , 0xa9a9a9 }, + { "dark gray" , 0xa9a9a9 }, + { "darkgray" , 0xa9a9a9 }, + { "dark blue" , 0x8b }, + { "darkblue" , 0x8b }, + { "dark cyan" , 0x8b8b }, + { "darkcyan" , 0x8b8b }, + { "dark magenta" , 0x8b008b }, + { "darkmagenta" , 0x8b008b }, + { "dark red" , 0x8b0000 }, + { "darkred" , 0x8b0000 }, + { "light green" , 0x90ee90 }, + { "lightgreen" , 0x90ee90 }, + { "none", -1 }, + { 0, 0 } +}; diff --git a/libs/minilibx_opengl_20191021/mlx_shaders.c b/libs/minilibx_opengl_20191021/mlx_shaders.c new file mode 100644 index 0000000..4a58955 --- /dev/null +++ b/libs/minilibx_opengl_20191021/mlx_shaders.c @@ -0,0 +1,240 @@ +// 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()" + "{" +#ifdef STRINGPUTX11 + " texcoord = (position * vec2(1.4, -1.4) + fontposinatlas ) / fontatlassize;" +#else + " texcoord = (position * vec2(1.0, -1.0) + fontposinatlas ) / fontatlassize;" +#endif + " 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/libs/minilibx-linux-master/mlx_xpm.c.ok b/libs/minilibx_opengl_20191021/mlx_xpm.c similarity index 70% rename from libs/minilibx-linux-master/mlx_xpm.c.ok rename to libs/minilibx_opengl_20191021/mlx_xpm.c index 225ea3c..78d8c9b 100644 --- a/libs/minilibx-linux-master/mlx_xpm.c.ok +++ b/libs/minilibx_opengl_20191021/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:40:55 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); } @@ -74,12 +86,18 @@ int mlx_int_get_col_name(char *str,int size) return (result); } -int mlx_int_get_text_rgb(char *name) +int mlx_int_get_text_rgb(char *name, char *end) { int i; + char buff[64]; if (*name == '#') return (strtol(name+1,0,16)); + if (end) + { + snprintf(buff, 64, "%s %s", name, end); + name = buff; + } i = 0; while (mlx_col_name[i].name) { @@ -91,8 +109,9 @@ int mlx_int_get_text_rgb(char *name) } -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; @@ -104,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; @@ -124,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; @@ -167,37 +186,42 @@ void *mlx_int_parse_xpm(t_xvar *xvar,void *info,int info_size,char *(*f)()) 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) + + 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; - else + 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))) @@ -219,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, @@ -244,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) @@ -252,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; @@ -270,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) @@ -287,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; @@ -297,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;